Kezdőoldal » Számítástechnika » Programozás » C++ feladat, miért nem működik...

C++ feladat, miért nem működik a programom nagy számú bemeneteknél?

Figyelt kérdés

Itt a feladathoz a leírás:

data.hu/get/11622821/feladat_8.pdf

illetve két mintabemenet:

data.hu/get/11622824/minta_5.zip


És Itt a kódom:


#include <iostream>


using namespace std;


int main()

{


int uzlet = 0;

int gyarto = 0;

int fajta = 0;


cerr << "Add meg a boltot gyartot fajtákat:" <<endl;

cin >> uzlet >> gyarto >> fajta;


int matrix[gyarto][fajta];


cerr << "Add meg a mátrix adatait:" << endl;


for(int i=1;i<gyarto+1;i++){

for(int j=1;j<fajta+1;j++){

matrix[i][j] = -1;

}

}


int posx = 0,posy = 0,ar=0;


for(int i=0;i<uzlet;i++){

cin >> posx >> posy >> ar;

matrix[posx][posy] = ar;


}


long int olcsobb = 100000;

int sor,oszlop;


for(int i=1;i<gyarto+1;i++){

for(int j=1;j<fajta+1;j++){

if(olcsobb>matrix[i][j] && matrix[i][j]!=-1){

olcsobb = matrix[i][j];

sor = i;

oszlop = j;

}

}


}


int db = 0;

int maxik = 0;

int db2 = 0;

int tobb[db2];

int index;


for(int i=1;i<gyarto+1;i++){

for(int j=1;j<fajta+1;j++){

if(matrix[i][j]!=-1){

db++;

}

}

if(db>maxik){

maxik = db;

index = i;

}

db = 0;

}



cout << sor << " " << oszlop << endl;

cout << index << endl;

cout << " " << endl;

cout << " " << endl;

cout << " " << endl;



return 0;

}


Na, most ha az első mintabemenettel próbálom, akkor működik, illetve ha feltöltöm bíróba, akkor 3 fajta bemenetnél helyes a megoldás, de utána meg rossz. De ugyan ez a gond a zip-ben lévő 2. mintabemenetnél, ott már megint rossz lesz a végeredmény. Mi a csuda lehet a probléma, ha kis számokkal működik, de nagyokkal már nem? (Ma 9ig kellene a megoldás, tudom, nemsok esély van rá, hogy valaki megválaszolja, de hátha :D )



2019. jan. 9. 02:34
 1/5 anonim ***** válasza:
100%

for(int i=1;i<gyarto+1;i++){


for(int j=1;j<fajta+1;j++){


Itt túlcímzel a tömbön, másrészt 0-tól kéne indulni. int i = 0; i < gyarto; i++

vagy a mátrixot írd át 1-el nagyobb méretre.

2019. jan. 9. 04:12
Hasznos számodra ez a válasz?
 2/5 anonim ***** válasza:
100%

Amúgy a debbugolás sokat segít.

Abból könnyen kiderítheted, hogy mi a baj.

Visual studioban,codeblock illetve az eclipse-nél van debuggolás lehetőség.

2019. jan. 9. 06:05
Hasznos számodra ez a válasz?
 3/5 anonim ***** válasza:

Csak egy kérdés: kis számúra működik? Merthogy ahogy a kollega mondja kiindexelsz a tömbből.

Kiíráshoz meg használd inkább a cout-ot, hiszen nem hibát írsz ki.

2019. jan. 9. 13:35
Hasznos számodra ez a válasz?
 4/5 A kérdező kommentje:

#1-es, nagyon szépen köszönöm, hogy hajnal 4 után foglalkoztál a problémámmal, ezzel most életet mentettél! Tudom, nagyon balga dolog, de ezt szerintem soha nem vettem volna észre valamiért.. :D Hálás köszönetem! És a töbieknek is! :)


#3-as, igen, az a legrosszabb az egészben, hogy itt(c++-ban) nem dob hibát, hanem lefut, és kis mennyiségű adatoknál helyes lesz a kimenet, így kb. csak sötétben tapogatózás az egész. De viszont pl. Javánál ott le sem fordul, egyből hibát dob ha pl. túlcsordulok.

2019. jan. 9. 22:48
 5/5 anonim ***** válasza:

"#3-as, igen, az a legrosszabb az egészben, hogy itt(c++-ban) nem dob hibát, hanem lefut, és kis mennyiségű adatoknál helyes lesz a kimenet, így kb. csak sötétben tapogatózás az egész."

Igazából csak nagyobb valószínűséggel lesz helyes kimenet kis mennyiségű adat esetében. Több minden függvénye. Adott kód és fordító és rendszer esetén lehet hogy mindig helyes lesz az adott kimenet a túlindexelés ellenére, de ha e 3 közül bármelyik is másik már nem biztos, hogy továbbra is helyes marad a kimenet.

A tömbök reprezentálása sima pointer aritmetikán alapszik. (A c++ -ban persze vannak másfajta tömbök is persze, de ez a standard, a klasszikus.) Még az a legfincsibb az egészbe, hogy előfordulhat a túlindexelés hatására tök más memóriaterületek felülírása. Más tömböket vagy változókat is átírhat.

Vagyis a c++ nem memóriabiztos, a java viszont az. A c++ -nak előnye ebben a futási idő növekedése, mivel az folyamatos tömbindex ellenőrzést igényel java esetében.


"De viszont pl. Javánál ott le sem fordul, egyből hibát dob ha pl. túlcsordulok."


Ez se feltétlen igaz, a triviális esetekben igaz amit gyorsan kiszűr a statikus kódelemző. Vannak esetek melyekben futtatni kéne a kódelemzőnek hogy rájöjjön, de lehet eleve erre lehetetlen helyzet hogy megtalálja (már a jól ismert a megállási probléma is elég jó példa rá.)

Évek óta nem használom a c++ -t, de egyébként a c++ fordító több mindent tud mint ami a default + még felokosítható különböző fejlesztői eszközökkel. Viszont sokkal bonyolultabb maga a c++ mint a c vagy a java. Noha kétségtelenül a legtöbb esetben c++ -ban valamit implementálni könnyebb mint c-ben. Eredeti cél szerint minden ami c az egyben c++ is, ez kezdetben így is volt, majdnem minden esetben igaz ez továbbra is. A c++ amiket támogat paradigmákat ebből következően az egész működési mechanizmusa sokkal összetettebb bonyolultabb, ebből következő bonyodalmak is lehetnek, meg könnyebbségek is persze.

Nem triviális, de lehet a c++ - ban is memóriabiztos kódot írni, vagyis lehet pl nem túlindexhelhető tömböt (akár implementálni is lehet saját tömb adatszerkezetet és "belesimul" a kódba mintha sima klasszikus tömb lenne). Lehet java szerű garbage collection-t használni benne. Aztán persze lehet keverni is a kettőt hogy az memóriabiztos benne ez meg nem, aztán már ember legyen a talpán eligazodni rajta, de ez már a c++ haladó szint inkább.

2019. jan. 10. 14:14
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!