Kezdőoldal » Számítástechnika » Programozás » Mi a hiba az algoritmusban?...

Mi a hiba az algoritmusban? (C nyelvű, de C++-ban megírva sem jó)

Figyelt kérdés

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;

}



2012. dec. 18. 21:28
 1/8 anonim ***** válasza:
Hol a main? Így le sem fordulhat.
2012. dec. 18. 21:37
Hasznos számodra ez a válasz?
 2/8 A kérdező kommentje:
Ez csak a generáló függvény. Bátorkodtam csak ezt beírni, mert ezzel van baja.
2012. dec. 18. 21:39
 3/8 anonim ***** válasza:
Az i és j mindig 1 marad. while((j<=i)&(V[i]!=V[j])) ciklusmagja sose fut le, így if(j<=i) feltétel mindig igaz lesz és lokális tömb kezdőcímével meg öreg hiba visszatérni, hisz a fgv lefutása után a lokális változók megszűnnek létezni, gyakorlatilag csak megszűnhetnek utána (bármikor) ,és erre ne alapozzunk. Akkor már legalább static-ként deklaráld hogy biztosan megmaradjon.
2012. dec. 18. 22:12
Hasznos számodra ez a válasz?
 4/8 A kérdező kommentje:

É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.

2012. dec. 18. 22:24
 5/8 anonim ***** válasza:

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ó!

2012. dec. 18. 23:07
Hasznos számodra ez a válasz?
 6/8 anonim ***** válasza:

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 ...

2012. dec. 19. 13:11
Hasznos számodra ez a válasz?
 7/8 anonim ***** válasza:
Sikerült megoldani?
2012. dec. 19. 13:11
Hasznos számodra ez a válasz?
 8/8 A kérdező kommentje:

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!

2012. dec. 19. 14:50

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!