Jag gav upp på programmering 2 som var baserad på C++ och jag kunde inte räkna ut hur man skulle skriva en kod som skulle räkna namn och siffror från en fil

Permalänk
Inaktiv

Jag gav upp på programmering 2 som var baserad på C++ och jag kunde inte räkna ut hur man skulle skriva en kod som skulle räkna namn och siffror från en fil

Jag blev lite fundersam, jag började med programmering 2 och insåg ganska direkt att ribban hade höjts rejält sen Programmering 1 som jag då gjorde på en annan skola fast i Python. Jag har aldrig programmerat i C++ innan fastnade på en uppgift där jag hade namn och ålder på personer i en fil och jag skulle skriva en kod som gick in i filen och fick ut medelåldern.

Då tänkte jag att jag måste använda strcmp eller något för att den ska räkna antal strings och även åldrar, men det gick åt skogen och jag var tvungen att ge upp eftersom när jag kollade på nästa uppgifter så var de mycket svårare. Nu är min fråga, skulle ni vilja ge ett tips eller något annat som gör att man skulle kunnat lösa den uppgiften, jag vill bara veta hur man skulle kunnat lösa den.

Jag förstår ju att uppställningen ska vara så här: https://www.matteboken.se/lektioner/skolar-7/statistik/medelv...

Men när jag försökte räkna hur många namn och siffror med loopar då gick det åt skogen.

FILEN

Gördis, 44

Johan, 25

Sven, 15

Maria, 55

Sara, 20

Permalänk
Medlem

Namnen kan du ignorera om du bara ska ha ut medelåldern, så lösningen är bara att summera åldrarna i en variabel och använda en annan variabel för att hålla koll på antalet personer. Medelåldern är sen summan / antalet åldrar. Så det är egentligen mest en enkel övning i att läsa in data från fil.

strcmp är för övrigt en C-funktion. Den går att använda i C++ också, men då är man troligtvis lite ute och cyklar eftersom C++ har riktiga strängar som man bör använda istället. Men i just det här fallet finns inget behov av att jämföra strängar ändå.

Permalänk
Medlem

Jag hade gjort något i stil med:

(pseudokod) ålder = 0 rader = 0 filen rad för rad { splittadRad = rad.split(", "); ålder += string to int( splittadRad[1] ); rader += 1; } medelålder = ålder/rader

Några termer att googla:
c++ ifstream
c++ string split
c++ string to int

Visa signatur

13600KF, RTX 4070 FE, B760I, 32GB DDR4, NR200P

Permalänk
Medlem
Skrivet av lambdan:

Jag hade gjort något i stil med:

(pseudokod) ålder = 0 rader = 0 filen rad för rad { splittadRad = rad.split(", "); ålder += string to int( splittadRad[1] ); rader += 1; } medelålder = ålder/rader

Några termer att googla:
c++ ifstream
c++ string split
c++ string to int

Man behöver inte splitta strängar eller konvertera till int i det här fallet, det fixar >>-operator åt en. D.v.s.:

std::ifstream file("persons.txt"); std::string name; int age; file >> name >> age;

(man får då med , i namnet i det här fallet, men det spelar ingen roll om man bara vill åt åldern).

Permalänk
Medlem

Din fil är i ett typiskt CSV-format (Comma-separated values). Vet du detta så kan du enkelt söka fram en lösning: C++ CSV reader.
Detta ger ett par lösningar som t.ex. innehåller std::getline(), där du med hjälp av tredje parametern kan separera dina värden på ett kommatecken.
https://en.wikipedia.org/wiki/Comma-separated_values
https://stackoverflow.com/questions/12234678/using-getline-wi...
https://stackoverflow.com/questions/16446665/c-read-from-csv-...
https://cplusplus.com/reference/string/string/getline/

ifstream file("filens_sökväg\\fil.txt"); while (getline(file, name, ',')) { cout << "Namn: " << name << " " ; getline(file, age, ',') ; cout << "Ålder: " << age<< " " ; }

Med detta kan du då såklart addera åldern på alla rader och sedan räkna ut medelvärdet på detta.

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB

Permalänk
Medlem
Skrivet av perost:

Man behöver inte splitta strängar eller konvertera till int i det här fallet, det fixar >>-operator åt en. D.v.s.:

std::ifstream file("persons.txt"); std::string name; int age; file >> name >> age;

(man får då med , i namnet i det här fallet, men det spelar ingen roll om man bara vill åt åldern).

Aha då är det garanterat det sättet skolan vill att man ska göra det på

Visa signatur

13600KF, RTX 4070 FE, B760I, 32GB DDR4, NR200P

Permalänk
Inaktiv
Skrivet av lambdan:

Aha då är det garanterat det sättet skolan vill att man ska göra det på

Om man tar ditt exempel här. Själv hade jag skippat std och använd using namespace std. I alla fall ifstream är ju den som öppnar filen. string name, int age, sen file >> name >> age; där hänger jag inte med, menas det då att den tar alla åldrar och namn och ger resultat om hur många namn och åldrar det är?

std::ifstream file("persons.txt");
std::string name;
int age;
file >> name >> age;

Permalänk

Ge inte upp C++. Det må vara ett av de svåraste språken, men C++ uppfanns för att hantera avancerade realtidsystem t.ex. grafikkort för snabba 3D visualiseringar.

Kämpa på!

P.S
Om du vill hålla på med C++, men du vill ha den enklare "versionen" av C++ så rekommenderar jag QT. Med QT så behöver man inte tänka så mycket i C++. Ramverket sköter det svåra.