Mi a hiba az algoritmusban? (C nyelvű, de C++-ban megírva sem jó)
A kód lefordítódik, de amikor futtatom olyan tüneteket mutat, mintha végtelen ciklusba került volna. Csak villog a kurzor. A kód:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int *kitalal(){
int V[4],i,j;
srand(time(NULL));
V[0]=rand()%6+1;
i=1;
while(i<=3){
V[i]=rand()%6+1;
j=1;
while((j<=i)&(V[i]!=V[j])){
j++;
}
if(j<=i)
V[i]=rand()%6+1;
else
i++;
}
return V;
}
És hogy tudnám működésre bírni? A static-os megoldást azt ugyan megtaláltam, de hogy oldható meg, hogy a ciklusmag lefusson?
Úgy akartam megoldani, hogy 4 véletlen számot generáljon, de úgy, hogy ne lehessen ismétlődés. Én nem vettem észre, hogy mitől marad mindig egy. Csak akkor nem növelem az i-t a külső ciklusban, ha a belső ciklus lefut, és nem áll meg azért, mert talál olyan elemet, ami egyenlő V[i]-vel. A j-t azért indexelem minden cilusban, mert minden egyes V[i]-re végigfuttatom a ciklust. Számomra ez így logikus.
V[i]=rand()%6+1; generál egy számot
j=1; j értéke 1 és i értéke meg a ciklus elején 1-re lett állítva így az is 1
while((j<=i)&(V[i]!=V[j])) ide logikai és kéne nem bitenkénti, de ha azt írtál volna sem lenne jó mert j<=i - igaz, V[i]!=V[j] meg mindig hamis mert v[1]==v[1].
if(j<=i) meg azért igaz mert 1 kisebb vagy egyenlő mint 1.
------------
De ha nem hinnéd el akkor ez meggyőz:
int *kitalal(){
int V[4],i,j;
srand(time(NULL));
V[0]=rand()%6+1;
i=1;
while(i<=3){
V[i]=rand()%6+1;
j=1;
printf("i=%d j=%d;",i,j);
while((j<=i)&(V[i]!=V[j])){
printf("Ez sose fut le.;");
j++;
}
if(j<=i){
V[i]=rand()%6+1;
printf("j<=i feltetel igaz mert %d<=%d;",i,j);
}else{
printf("Ez szinten sose fut le.;");
i++;
}
printf("\n");
}
return V;
}
------------
Az az srand(time(NULL)) meg ne legyen már függvényen belül. Próbáld ki: generálj 10 random-ot de minden generálás előtt hívd meg a srand(time(NULL))-ot és nézd meg nennyire különbözik a 10 szám! Maradjunk annyiba hogy összesen 1x hívjuk meg egyszeri futtatással.
Egyszerűen annyi hibát vétettél ebbe a pár sorba!
Gondold át még egyszer mert így nagyon nem jó!
Ezt a sort elrontottam:
printf("j<=i feltetel igaz mert %d<=%d;",i,j);
A helyes:
printf("j<=i feltetel igaz mert %d<=%d;",j,i);
de futás közben nincs különbség a 2 között ...
Rájöttem már magamtól is nap közben. Ha j<=i-ig megy a belső ciklus, akkor önmagával is összehasonlítja, ami ugyebár nem túl jó, mert önmagával biztosan egyenlő.
Köszönöm a válaszokat, megoldódott!
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!