Kezdőoldal » Számítástechnika » Programozás » Mi a hiba ebbe a programba? (C)

Mi a hiba ebbe a programba? (C)

Figyelt kérdés

Kezdő programozóként megpróbáltam megoldani az n királynő probléma feladatot, de sajnos a program futtatás után nem ír ki semmit és nem sikerül megtalálnom a hibát.


int main(){

int n; scanf("%d",&n);

int *x = (int*)malloc(n*sizeof(int)); if (x == 0){return 1;}


kiralyno(x,n,0);


free(x);

return 0;

}


void kiralyno (int *x, int n, int k)

{

int i;

for (i = 0; i < n; ++i)

{

x[k] = i;

if (megfelel(x,k))

{

if (k < n)

{

kiralyno(x,n,k+1);

}

else

{

kiir(x,n);

}

}

}

}


void kiir (int *x, int n)

{

int i;

for (i = 0; i < n; ++i)

{

printf("%d ",x[i]);

}

printf("\n");

}


bool megfelel (int *x, int k)

{

int i;

for (i = 0; i < k; ++i)

{

if ((x[i] == x[k]) || (k - i) == abs (x[k] - x[i]))

{

return false;

}

}

return true;


}



2018. márc. 5. 19:18
 1/6 tabaki ***** válasza:
Érdekes, nekem el se jut a futtatásig, egy halom warninggal és errorral leáll a fordítás.
2018. márc. 5. 20:28
Hasznos számodra ez a válasz?
 2/6 tabaki ***** válasza:
100%
Mellesleg nem ártott volna kommentezni, én (igaz, hogy teljesen dilettánsként) egyáltalán nem látom át a logikáját.
2018. márc. 5. 21:56
Hasznos számodra ez a válasz?
 3/6 anonim ***** válasza:
Nincs is benne logika.
2018. márc. 5. 22:23
Hasznos számodra ez a válasz?
 4/6 anonim ***** válasza:

Én első körben (debug classic) telepakolnám kiíratásokkal, hogy most itt jár, ez a feltétel igaz/hamis lett, változó értékek, stb.


Én sem értem, de ránézésre a megfelel() függvény folyton hamisat ad vissza. (Ez csak tipp, de ezek mind kiszűrhetők a megfelelő debug módszerrel.)

2018. márc. 6. 16:50
Hasznos számodra ez a válasz?
 5/6 anonim ***** válasza:

Ugyanaz, csak kicsit talán átláthatóbb módon (?)


int main(){

__int n; scanf("%d",&n);

__int *x = (int*)malloc(n*sizeof(int)); if (x == 0){return 1;}

__kiralyno(x,n,0);

__free(x);

__return 0;

}


void kiralyno (int *x, int n, int k) {

__int i;

__for (i = 0; i < n; ++i) {

____x[k] = i;

____if (megfelel(x,k)) {

______if (k < n)

________kiralyno(x,n,k+1);

______else

________kiir(x,n);

____}

__}

}


void kiir (int *x, int n) {

int i;

__for (i = 0; i < n; ++i)

____printf("%d ",x[i]);

__printf("\n");

}


bool megfelel (int *x, int k)

{

__int i;

__for (i = 0; i < k; ++i)

____if ((x[i] == x[k]) || (k - i) == abs (x[k] - x[i]))

______return false;

__return true;

}

2018. márc. 6. 16:54
Hasznos számodra ez a válasz?
 6/6 tabaki ***** válasza:

#5:

„Köszönöm, doktor úr, az új szemüveggel már sokkal tisztábban látom a szemem előtt ugráló fekete pontokat!”


Inkább Kérdező nyilatkozhatna meg végre, hogy mi akar ez lenni. A fejlécfájlok csatolását, a függvények deklarálását vagy átrendezését bizonyára csak az én vaskalapos fordítóm várja el, úgyhogy ezentúl nem célozgatok rá, meg azután könnyen pótolható is. Be kell vallanom azonban, hogy továbbra sem tudom követni, hogy mi történik. Találtam viszont egy kétséges részt a kiralyno() függvényben:


            if (megfelel(x,k))

                  {

                  if (k < n)

                        {

                        kiralyno(x,n,k+1);

                        }

                  else

                        {

                        kiir(x,n);

                        }

                  }


Gyanúm, hogy k maximumához (vagyis n-1-hez) érkezve már nincs értelme az értékét megnövelve újra meghívni a kiralyno() függvényt, hanem akkor már ki kell íratni az... izé, akármit. Ennek megfelelően a vizsgálat határértékét lejjebb kéne szállítani:


            if (megfelel(x, k)){

                  if (k < n - 1) kiralyno(x, n, k + 1);

                  else kiir(x, n);

                  }


Mondom, ez csak egy kósza sejtelem, mert az egészből egy kukkot sem értek -- annyi erénye van, hogy legalább eljut a kiírásig.

2018. márc. 8. 11:33
Hasznos számodra ez a válasz?

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!