Hogyan tudom az egyik adat alapján kiválasztani a másik adatot? (c++) Bővebben lent.
Nemrég kezdtem el tanulni C++-t, és itt nagyon elakadtam. Röviden vázolom: van egy txt fájl, ami tartalmaz 5 különböző adatot, valahogy így:
20 15 Vezetéknév Keresztnév Lakhely
és ugy ez így megy sok sok soron keresztül, nyilván minden adat más.
Ki akarom íratni annak az embernek a vezeték és keresztnevét, akinek a 15-ös szám helyén a legnagyobb van az összes közül. Addig jutottam, hogy ki tudom keresni a legnagyobb számot.
int hatodik_feladat(){
cout<<"\nHatodik feladat:"<<endl;
int kor;
int szav;
string veznev;
string kernev;
string lakhely;
int szavaz[40];
int x=0;
int maxvalue=0;
ifstream lista("szavazatok.txt");
for(x=0;x<=40;x++){
lista>>kor>>szav>>veznev>>kernev>>lakhely;
szavaz[x]=szav;
if (szavaz[x]>=maxvalue){
maxvalue=szavaz[x];
}
}
cout<<maxvalue;
}
A maximumkiválasztáskor ne (csak) a max értéket tárold el, hanem mondjuk annak helyét is a fájlban (pl. sorszám).
Egy következő ciklussal mássz el addig a sorig a fájlban, és írd ki az adatait.
Itt ne maxvalue-t tárolj hanem maxindex-et:
if (szavaz[x]>=maxvalue){
maxvalue=szavaz[x];
}
helyett
if (szavaz[x]>=szavaz[maxindex]){
maxindex=x;
}
és a végén a szavaz[maxindex]-ben lesz a legnagyobb szám és ezzel az indexel a többi adatot is ki tudod olvasni.
Figyelj arra hogy a tömböd 40 elemű és te 0-tól 40-ig akarsz beolvasni 41 elemet. Ebből hiba lesz.
Jó gyakorlat ha szétbontod amúgy a programodat pl. így:
//adatstruktúra a beolvasott személyeknek
struct Persons {
int kor, szavazat;
string veznev,kernev,lakhely;
};
//fajl beolvasasa fajlnevből egy Persons struktúrába
//A true-t ad vissza helyes bolvasás esetén, false-t ha nem lehet megnyitni a fájlt
bool beolvas(char* fajlnev, Persons* p) {
ifstream lista(fajlnev);
if(!list.is_open()) return false;
for(x=0;x<40;x++)
lista>>p[x].kor>>p[x].szav>>p[x].veznev>>p[x].kernev>>p[x].lakhely;
return true;
}
//Vissza adja a legtöbb szavazatot kapó személyt
Persons getMaxSzavazat(Persons* p) {
Persons nyertes = p[0];
for(int i=1;i<40;i++){
if(nyertes.szav<p[i].szav)
nyertes=p[i];
}
return nyertes;
}
//A fő függvényed
void hatodik_feladat() {
Persons szavazatok[40]
if(!beolvas("szavazatok.txt", szavazatok)) {
cout<<"Nem sikerült beolvasni a fájlt!!"<<endl;
exit(1);
}
Persons nyertes = getMaxSzavazat(szavazatok);
cout<<"A legtöbb szavazatot kapta: "<<nyertes.veznev<<" "<<nyertes.kernev<<endl;
}
(lehetnek benne elírások, nem teszteltem, csak demonstráció)
Ezután jöhet a következő lépés: tömb használata helyett collections vagy dinamikus memóriakezelés. Nem adod meg hogy 40 sor van a fájlban, egyszerűen addig olvasod a fájlt amíg vannak benne elemek és ezt mindig hozzáadod a dinamikus tömbödhöz vagy listádhoz. (lásd stl vector, list)
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!