C++ Hjälp med menystyrt program

Permalänk

C++ Hjälp med menystyrt program

Tjenare Sweclockers!
Behöver hjälp med en uppgift från skolan och vänder mig till er experter.
Uppgiften lyder såhär:

Vi ska bygga ett menystyrt program som ska fungera som en inloggningslista vid löpträning. Man ska kunna föra in värden i programmet, där man skriver in sträckan (i km) och tiden ( i min).
Programmet ska sedan räkna ut hastigheten (km/min) vid senaste löpningen, hastigheten i medeltal vid alla löpningar och hastigheten vid bästa tiden ska skrivas ut till skärmen.
Val görs i menyn här nedan, upprepade val ska kunna göras:

Meny
1. Mata in ny löpning
2. Ändra sista löpningen
3. Visa löpningar
0. Sluta

Välj genom att mata in siffra:

Så här långt har jag hittills kommit:

#include <iostream> #include <iomanip> #include <fstream> #include <conio+.h> #include <vector> using namespace std; #include "svtecken.h" class Motionslista { public: Motionslista() : antal(0) {} ~Motionslista() {} void meny(); void mata_in(); void skriv_alla(); void andra(); double medel_tid(); double basta_tiden(); double sista_tiden(); void skriv_fil(); void hamta_fil(); private: int antal; vector <double> kilometer; vector <int> minuter; double kilometer_in; int minuter_in; }; void Motionslista::meny() { clrscr(); setcolor(YELLOW); cout << "\n Meny"; cout << "\n\n1. Mata in ny löpning:"; cout << "\n\n2. Ändra sista löpningen:"; cout << "\n\n3. Visa löpningar:"; cout << "\n\n0. Sluta"; cout << "\n\n\nVälj genom att mata in siffra: "; char val='\0'; while (val<'0'||val>'3') val=getch(); switch (val) { case '1': mata_in(); meny();break; case '2': andra(); meny(); break; case '3': skriv_alla(); meny(); } } void Motionslista::mata_in() { clrscr(); setcolor(LIGHTCYAN); cout << "\nMata in ny löpning i km (avbryt - tryck retur): "; cin >> kilometer_in; antal++; cout << "\nMata in tiden i min: "; cin >> minuter_in; kilometer.push_back(kilometer_in); minuter.push_back(minuter_in); } void Motionslista::andra() { kilometer.erase(kilometer.end()-1); minuter.erase(minuter.end()-1); antal--; mata_in(); meny(); } void Motionslista::skriv_alla() { clrscr(); setcolor(LIGHTGREEN); cout << endl; int i; for (i=0; i<antal; i++) cout << kilometer[i] << " " << minuter[i] << endl; cout << "\n\nTryck tangent "; getch(); } double Motionslista::medel_tid() { double meddela; double total=0; for (int i=1; i<antal; i++) total=total+kilometer[i]; meddela = (double)total/(minuter[antal-1]-minuter[0]); return meddela; } void Motionslista::skriv_fil() { ofstream fout("C:\\Users\\MartiiN\\Documents\\Visual Studio 2008\\Projects\\lopning\\lopning\\motionslista.txt"); for (int i=0; i<antal; i++) { fout << kilometer[i] << endl << minuter[i] << endl; } fout.close(); } void Motionslista::hamta_fil() { ifstream fin("motionslista.txt"); fin >> kilometer_in; while (!fin.eof()) { antal++; fin >> minuter_in; kilometer.push_back(kilometer_in); minuter.push_back(minuter_in); fin >> kilometer_in; } } int main() { teckenbyt(); Motionslista* motionslista = new Motionslista; ifstream fin("C:\\Users\\MartiiN\\Documents\\Visual Studio 2008\\Projects\\lopning\\lopning\\motionslista.txt"); if (fin) motionslista->hamta_fil(); motionslista->meny(); cout<<"Medelhastighet= " << setiosflags(ios::fixed)<<setprecision(3) << motionslista->medel_tid() << endl; motionslista->skriv_fil(); cout << "\n\n\n"; getch(); return 0; }

Som ni kan se, saknas både double basta_tiden(); och double sista_tiden(); under public:.
Min fråga till er är hur man ska lösa detta för att få dem med i programmet så att dem också funkar?

MVH
Martin

Visa signatur

Phenom II X3 720 2.8 Ghz | Gigabyte MA770-UD3 | Corsair 8500C5 2x2Gb | XXX HD4870 512mb | Corsair VX 450W | OS Win 7 RC x64

Permalänk
Medlem

Gör om meny funktionen till en bool och få den att returna true så länge du vill att programmet ska fortsättas att köra, och returna false då programmet ska stängas (då användaren väljer "sluta").

bool go = true;
while(go)
{
go = motionslista->meny();
}
i main-funktionen.

Du har en minnesläcka atm btw, glöm inte att delete'a din motionslista.

Hastigheten vid senaste löpning:
return kilometer[antal-1] / minuter[antal-1]

overall medelhastighet:
int km = 0;
int min = 0;
for(int i = 0; i < antal; i++)
{
km += kilometer[i];
min += minuter[i];
}
return km / Min;

Hastigheten vid bästa tiden förstår jag inte riktigt. Vill du få tag på högsta KM/M värdet:
int kmPerM = 0
for(int i = 0; i < antal; i++)
{
double km = kilometer[i];
int min = minuter[i];
if(km / min > kmPerM)
kmPerM = km / min;
}
return kmPerM;

Permalänk

Aha okey, men saken är att vi måste använda meny funktionen som en void :/
Japp, bästa tiden menar jag km/min
Tack!

Visa signatur

Phenom II X3 720 2.8 Ghz | Gigabyte MA770-UD3 | Corsair 8500C5 2x2Gb | XXX HD4870 512mb | Corsair VX 450W | OS Win 7 RC x64

Permalänk
Medlem
Skrivet av martinio92:

Aha okey, men saken är att vi måste använda meny funktionen som en void :/
Japp, bästa tiden menar jag km/min
Tack!

Varför måste den vara void? Får du ändra parameterna då? Du kan skicka in go i så fall som call-by-reference och ändra dens värde i så fall.