Madármegfigyelés - C++
2010-11-24T21:42:44+01:00
2010-11-26T01:02:47+01:00
2022-06-30T12:48:06+02:00
  • Szia, asszem progalapon valami hasonlót kértek:

    /*Az ország N helységében végeztünk madármegfigyeléseket. Mindegyikben megadtuk, hogy milyen fajú madárból hányat láttunk. A madárfajok száma összesen M. Készíts programot, amely megadja azokat a helyeket, ahol csupán egyféle madarat láttak!*/ #include <fstream> #include <iostream> using namespace std; void csakEgyes(int tomb[], int& hszam, int& mszam) { int fajSzam; for (int i=0; i<hszam;++i) { fajSzam=0; int j=1; while(fajSzam<2 && j<=mszam) { if(tomb[i*mszam + j]>0) ++fajSzam; ++j; } if (fajSzam==1) cout<<"Pontosan egy madarat lattunk az "<<i+1<<". helysegben"<<endl; } } void filebol(){ string fname; cout<<"Kerem az input file nevet: "; cin>>fname; ifstream f(fname.c_str()); int mszam, hszam; f>>mszam; f>>hszam; int madartomb[hszam * mszam] ; for (int i=1; i<=hszam;++i) { for(int j=1; j<=mszam;++j) { f>>madartomb[i*mszam + j]; } } csakEgyes(madartomb,hszam,mszam); } void kezzel(){ int mszam, hszam; cout<<endl<<"Kerem a madarfajok szamat: "; cin>>mszam; cout<<endl<<"Kerem a helysegek szamat: "; cin>>hszam; int madartomb[hszam * mszam] ; for (int i=0; i<hszam;++i) { for(int j=1; j<=mszam;++j) { cout<<endl<<"Kerem, hogy az "<<i+1<<". helysegen hany "<<j<<". fajta madar volt: "; cin>>madartomb[i*mszam + j]; } } csakEgyes(madartomb,hszam,mszam); } int main() { cout<<" Kerem valassza ki az adatbevitel tipusat"<<endl; int val; cout<<"1) Filebol"<<endl; cout<<"2) Kezzel"<<endl; cout<<"Valasztasom(1/2): "; cin>>val; switch (val) { case 1 : filebol();break; case 2: kezzel();break;} return 0; }

    nem szép így progamozni, de itt így tanítják eleinte :D ha valami nem oks akkor szólj a filevól ovlasást nem teszteltem. A hibakezelés a te dolgod :D
    Mutasd a teljes hozzászólást!
  • 1. Elnézést kérek mindenkitől!

    2. Most kezdtem az ELTE-n és nem megy olyan könnyen a Delphi-ről C++-ra való átállás .

    3. Megpróbáltam én is megoldani a feladatot, de nem hiszem, hogy jó lett, ezért abba is hagytam (úgyhogy nem lusta voltam megcsinálni). Megkérdeztem csoporttársamat, hogy tud-e segíteni, azt mondta, hogy igen, aztán meg mégsem .

    Mellékelem az én próbálkozásomat és a mintát, hogy hogyan kellene kinéznie. Így érthetőbb a probléma. Minta My_code

    Üdv. mzzoli5!
    Mutasd a teljes hozzászólást!
  • Ez így gyorsabb, hogy jobb-e az más kérdés, attól függ hol.
    Jelen esetben nem, mert -mint írtad is nem tudhattad- a követelmény, hogy külön legyen. a feladat máskülönben 1. féléves, így class, verem, lista stb javaslatot nem tennék, ha ennek elkészítése is nehézségekbe (a nem akarás is az) ütközött.

    "Egyébként a kérdező úgy alakítja, ahogy akarja. Példa előtte."
    Teljesen egyetértek, csak megjegyeztem, hogy ez is elkélne. Hát ha elfelejtődne megemlítve lenni.
    Mutasd a teljes hozzászólást!
  • Csak be kell rakni egy classba. A main meg mehet a konstruktorba.
    Mutasd a teljes hozzászólást!
  • Ez a program jobb, mintha átírnám úgy, ahogy mondod.
    Miért szerveznék több ciklust, ha ennyi is elég? Egy nagy méretű inputnál nem mind1. Azt hogy mit követelnek tőle, nem tudhatom.
    Egyébként a kérdező úgy alakítja, ahogy akarja. Példa előtte.

    A tömb paraméterként való átadását esetleg érdemes lenne megcsinálni.
    Mutasd a teljes hozzászólást!
  • int tomb[telepulesekSz][madarfajtakSz]; ne legyen globális. Függvények paraméterében menjen be. Váljon külön az, hogy számítod ki az eredményt és a kiíratás. Így első nekifutásnak ez volna a gond neki, ha ezt beadná.
    Mutasd a teljes hozzászólást!
  • Nem értem mivel van gond.


    #include <iostream> #include <fstream> using namespace std; const int telepulesekSz = 10,madarfajtakSz=10; int tomb[telepulesekSz][madarfajtakSz]; void beolvasStdIn() { for(int i = 0; i < telepulesekSz; ++i) for(int j = 0; j < madarfajtakSz; ++j) { cout << "A(z) " << i << ". telepules " << j << ". madarfajanak szama"; cin >> tomb[i][j]; } } //¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ void beolvFajlbol(string fajlNev) { fstream f(fajlNev.c_str(),ios::in); if(!f.is_open()) { cerr << "A fajl emgnyitasa sikertelen!"; exit(1); } for(int i = 0; i < telepulesekSz; ++i) for(int j = 0; j < madarfajtakSz; ++j) { f >> tomb[i][j]; } } //¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ void telepulesekStdOut() { int seged; for(int i = 0; i < telepulesekSz; ++i) { seged=0; for(int j = 0; j < madarfajtakSz; ++j) if(tomb[i][j]!=0) ++seged; if(seged==1) cout << "Az " << i << ". telepulesen csak egy fele madarat lattak"; } } //¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ void telepulesekFajlba(string fajlNev) { fstream f(fajlNev.c_str(),ios::out); if(!f.is_open()) { cerr << "Fajl megnyitas rossz"; exit(1); } int seged; for(int i = 0; i < telepulesekSz; ++i) { seged=0; for(int j = 0; j < madarfajtakSz; ++j) if(tomb[i][j]!=0) ++seged; if(seged==1) f << "Az " << i << ". telepulesen csak egy fele madarat lattak"; } } //¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ int main() { //¤¤¤Fajlbol, Fajlba¤¤¤ beolvFajlbol("inFajlNeve.txt"); telepulesekFajlba("outFajlNeve.txt"); //¤¤¤StdIn, StdOut¤¤¤ beolvasStdIn(); telepulesekStdOut(); }

    Remélem minden okés. Nem fordítottam.
    Mutasd a teljes hozzászólást!
  • Nem. Másik Zoltán
    Mutasd a teljes hozzászólást!
  • Bodor Zoltán?
    Mutasd a teljes hozzászólást!
  • Köszönöm a gyors választ!

    Csak pont a lényeget felejtettem el leírni.
    Függvény vagy eljárás használatával kell megoldani a feladatot (és igazából ez a része nem nagyon megy még )

    /valami ilyesmi kellene, hogy lenne egy beolvasó, egy kiíró és egy kiválasztó függvény vagy eljárás/
    /Jah, és fájlból is kell tudni beolvasni, fájlba is kell tudni kiírni/
    Mutasd a teljes hozzászólást!
  • int tomb[telepulesekSz][madarfajtakSz]; //Nullazd a tomb ertekeit, mert szemet van benne for(int i = 0; i < telepulesekSz; ++i) for(int j = 0; j < madarfajtakSz; ++j) beolv(tomb[i][j]);//beolvassuk az i. telepules j. madarfajanak szamat int seged; for(int i = 0; i < telepulesekSz; ++i) { seged=0; for(int j = 0; j < madarfajtakSz; ++j) if(tomb[i][j]!=0) ++seged; if(seged==1) cout << "Az " << i << ". telepulesen csak egy fele madarat lattak(" << j << "fajtaju volt)"; }

    Esetleges szintaktikai hibákat már gondolom ki tudod javítani. Nem fordítottam le.
    Optimalizálhatod esetleg. 3 év Delphi után nem lesz gond

    Ha fájlból olvasod az adatokat, vagy fájlba írod a megfelelő településeket, akkor megoldhatod egy egymásba ágyazott ciklussal is.
    Mutasd a teljes hozzászólást!
  • Sorban beolvasod az adatokat, és ahol csak 1 db van, azt kiíratod.
    Mutasd a teljes hozzászólást!
  • Hi everybody!

    Sorry a könnyű feladatért, de mégis megkérdezem, hátha tud nekem valaki segíteni. Gondolom, hogy ezt a feladatot egyszerűen meg lehet oldani (vagyis a kódolást), de nem tudom, hogy hogyan kéne.
    3 éve programozok Delphi-ben és most kénytelen vagyok ezt a feladatot C++-ban megoldani (amiből még nagyon kezdő vagyok). (És a legrosszabb a dologban, hogy egyetemista vagyok és programozást tanulok, de nem tudom megoldani ezt a feladatot, és ez nem túl jó!).

    Szóval kérném minden kedves ember segítségét , akár az algoritmussal, akár a forráskóddal vagy bármi mással.

    /3 napom van hogy megoldjam ezt a feladatot /.

    Feladat:
    Az ország N helységében végeztünk madármegfigyeléseket. Mindegyikben megadtuk, hogy milyen fajú madárból hányat láttunk. A madárfajok száma összesen M. Készíts programot, amely megadja azokat a helyeket, ahol csupán egyféle madarat láttak!

    Előre is köszönöm a válaszokat!
    Mutasd a teljes hozzászólást!
abcd