Miért nem működik a program az adott szakasznál tovább? A fordítóval van a hiba, vagy a kóddal?
#include <iostream>
#include <cmath>
using namespace std;
int mozgas_elore(int pozicio, int jobb_also_sarok);
int mozgas_hatra(int pozicio, int jobb_also_sarok);
int mozgas_jobbra(int pozicio);
int mozgas_balra(int pozicio);
int kijutas_tesztelese(int pozicio, int kijutas);
int main() {
char valasz;
int negyzet;
cout<<"Add meg, hogy hany negyzetbol all a labirintus!"<<endl;
cin>>negyzet;
int j[negyzet], b[negyzet], e[negyzet], h[negyzet];
/////////////////////////////////////BEKERES////////////////////////////////////////////////
for(int i=0; i<negyzet; i++){
cout<<"\n\n"<<i+1<<". negyzet"<<endl;
cout<<"Baloldalt van szabad ut?(I/N)"<<endl;
cin>>valasz;
switch(valasz){
case'I':
b[i]=1;
break;
case'N':
b[i]=0;
break;
default:
cout<<"Ez a valasz nem-nek szamit!"<<endl;
b[i]=0;
}
cout<<"\nJobboldalt van szabad ut?(I/N)"<<endl;
cin>>valasz;
switch(valasz){
case'I':
j[i]=1;
break;
case'N':
j[i]=0;
break;
default:
cout<<"Ez a valasz nem-nek szamit!"<<endl;
j[i]=0;
}
cout<<"\nElol van szabad ut?(I/N)"<<endl;
cin>>valasz;
switch(valasz){
case'I':
e[i]=1;
break;
case'N':
e[i]=0;
break;
default:
cout<<"Ez a valasz nem-nek szamit!"<<endl;
e[i]=0;
}
cout<<"\nHatul van szabad ut?(I/N)"<<endl;
cin>>valasz;
switch(valasz){
case'I':
h[i]=1;
break;
case'N':
h[i]=0;
break;
default:
cout<<"Ez a valasz nem-nek szamit!"<<endl;
h[i]=0;
}
}
//eddig ment//
int pozicio, kijutas, jobb_also_sarok;
cout<<"\nAdd meg a jobb also sarok sorszamat!"<<endl;
cin>>jobb_also_sarok;
cout<<"\nAdd meg a poziciodat!"<<endl;
cin>>pozicio;
cout<<"\nAdd meg a celmezo sorszamat!"<<endl;
cin>>kijutas;
/////////////////////////////////////KIJUTAS/////////////////////////////////////////////
while(pozicio!=kijutas){
if(e[pozicio]==1){
mozgas_elore(pozicio, jobb_also_sarok);
kijutas_tesztelese(pozicio, kijutas);
}
if(j[pozicio]==1){
mozgas_jobbra(pozicio);
kijutas_tesztelese(pozicio, kijutas);
}
if(h[pozicio]==1){
mozgas_hatra(pozicio, jobb_also_sarok);
kijutas_tesztelese(pozicio, kijutas);
}
if(b[pozicio]==1){
mozgas_balra(pozicio);
kijutas_tesztelese(pozicio, kijutas);
}
}
return 0;
}
int kijutas_tesztelese(int pozicio, int kijutas){
if(pozicio==kijutas){
cout<<"Kijutottam!"<<endl;
return 0;
}
}
int mozgas_elore(int pozicio, int jobb_also_sarok){
cout<<"elore"<<endl;
pozicio+=jobb_also_sarok;
return 0;
}
int mozgas_hatra(int pozicio, int jobb_also_sarok){
cout<<"hatra"<<endl;
pozicio-=jobb_also_sarok;
return 0;
}
int mozgas_jobbra(int pozicio){
cout<<"jobbra"<<endl;
pozicio+=1;
return 0;
}
int mozgas_balra(int pozicio){
cout<<"balra"<<endl;
pozicio-=1;
return 0;
}
Hát bocs, lehet, hogy te képes vagy futtatáskor bepötyögni a labirintus adatait kockánként négy értékkel, de ez felér egy apróbb harakirivel. Hódolat a nem mindennapi lelkierődnek... énbelém nem szorult elég kurázsi ennek a használhatatlanságra kihegyezett programnak a teszteléséhez. Azon kívül, amit a fordító is közöl (a kijutas_tesztelese nem állít be visszatérési értéket, ha a pozició és a kijutas változók értéke neadj'isten nem azonos), egyelőre nincs tippem.
Amúgy nem egészen értem, hogy az unalomig ismétlődő adatbekéréseket miért nem egyetlen rövid függvény intézi, és miért értékel a nagy „I” betűn kívül minden választ nemnek, ahelyett, hogy a valódi válaszokat kisbetűvel is elfogadná, a többit pedig figyelmen kívül hagyná. Az meg végképpen nem világos, hogy a mozgatások minek adnak vissza értéket, amikor az egyrészt mindig 0, másrészt azt se használod semmire.
Híjnye, azért ez még keményebb, mint amit tegnap éjjel félálomban megláttam benne. Jól értem, hogy egy kétdimenziós tábla adatait négy egydimenziós tömbbe olvasod be, és a program aszerint határozza meg a tábla méreteit, hogy hányadik bejegyzés a jobb alsó sarok? Ez mire is jó pontosan: Ha például a leírótömböt sikerült a kézi bevitel embertelen munkája során hibátlanul feltöltened, még mindig akadjon egy lehetőséged elbarmolni az egészet, ha a jobb alsó sarok nem jelenthet egy faltól-falig kitöltött táblát? De tételezzük fel, hogy nagyon-nagyon vigyázol, hogy a bevitt cellaértékek és a sarok összhangban legyenek. Mondjuk, van 25 (*4) bejegyzésed, ahol a jobb alsó sarok a huszonötödik (mellesleg, ha nem akarsz fölösleges elemeket is tárolni a többen, a jobb alsó sarok mindig az utolsó). Ha az egysoros vagy -oszlopos tábla lehetőségét (a programmal ellentétben) elvetem, tiszta sor, a tábla 5×5 cella méretű, mert a 25 csak ennek a két egészértéknek a szorzatából állhat elő. Mit jelent viszont a 20 cella és huszadikként feltüntetett alsó sarok? 5×4-es vagy 4×5-ös táblát? Hát a 24 és huszonnegyedik? 2×12, 12×2, 3×8, 8×3, 4×6, 6×4? Mindezek persze költői kérdések, mert az előre- és hátra mozgató rutinokból kiderül, hogy egyáltalán nem a jobb alsó sarokról volna szó, hanem a tábla egy sorának hosszáról. A jobb alsó sarok sorszámának használata már csak azért sem lenne értelmes, mert úgy bármely előre/hátra lépés azonnal a kínos iparkodással hibátlanul bevitt tömbök határain kívülre lódítaná a vizsgálódást, az ismeretlen memóriatartalom mocsárvidékére. A program kvázi tesztelhetetlensége nemigen teszi lehetővé a biztos ítéletet, de nekem ezenkívül úgy tűnik: Ha egy cellából (és befelé) két ellenkező irányba is vezet szabad út, akkor a „KIJUTAS” kommenttel jelzett while-blokk szépen visszatér a kiindulópontjára, tehát végtelen ciklust eredményez. Ez azt sugallja, hogy a terjengősen megírt, rendkívül kényelmetlenül használható program ab ovo működésképtelen -- tehát még az is elképzelhető, hogy esetleg nem a fordító a hibás.
A fenti locsogásomtól függetlenül nem ártana, ha megpróbálnád legalább valami rajzocskán bemutatni, hogy voltaképpen mit képzeltél el. Nem mondhatnám, hogy a programod magáért beszél, és a cél ismeretében nagyobb esély volna az igazítgatására.
Itt vagyok megint :D. Most már majdnem jó a dolog. Az alábbi 3x3as labirintus van megadva neki:
a kód:
#include <iostream>
using namespace std;
int main() {
int palya[4][9]={
{0, 1, 0, 1, 0, 0, 1, 1, 1},//eloll
{0, 0, 1, 1, 1, 1, 0, 0, 1},//jobboldal
{1, 1, 1, 0, 1, 0, 1, 0, 0},//hatul
{1, 0, 0, 1, 1, 1, 1, 0, 0}//baloldal
};
int pozicio, cel, volt[9], ahhol_volt[9], i=0, j=1;
cout<<"Add meg a helyzetedet!"<<endl;
cin>>pozicio;
cout<<"Add meg a celt!"<< endl;
cin>>cel;
if(pozicio==cel){
cout<<"Kijutottam!"<<endl;
}
volt[pozicio]=1;
ahhol_volt[0]=pozicio;
while(pozicio!=cel){
i++;
if(palya[0][pozicio]==0 && volt[pozicio+3]!=1){//elol
pozicio+=3;
cout<<"ELORE"<<endl;
}else if(palya[1][pozicio]==0 && volt[pozicio+1]!=1){//jobbrol
pozicio+=1;
cout<<"JOBBRA"<<endl;
}else if(palya[2][pozicio]==0 && volt[pozicio-3]!=1){//hatul
pozicio-=3;
cout<<"HATRA"<<endl;
}else if(palya[3][pozicio]==0 && volt[pozicio-1]!=1){//balrol
pozicio-=1;
cout<<"BALRA"<<endl;
}
if(pozicio==cel){
cout<<"Kijutottam!"<<endl;
if((palya[0][pozicio]!=0 || volt[pozicio+3]==1)
&&(palya[1][pozicio]!=0 || volt[pozicio+1]==1)
&&(palya[2][pozicio]!=0 || volt[pozicio-3]==1)
&&(palya[3][pozicio]!=0 || volt[pozicio-1]==1)){
pozicio=ahhol_volt[j-1];
j--;
}else{
j=i;
}
volt[pozicio]=1;
ahhol_volt[i]=pozicio;
}
}
return 0;
}
Azt sejtem, hogy hol a hiba, de azt nem, hogy mi az. Annál a résznél lehet, amikor a visszaugrás történik, amikor visszalép oda, ahol volt.
Valaki tudna segíteni? Azt megköszönném.
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!