Brauche Hilfe bis nächsten Donnerstag (24.04.2008)
-
Hallo,
habe bis nächste Woche Donnerstag die Aufgabe bekommen, ein Programm zu schreiben, welches abfragt, wie viele Minuten man im Monat vertelefoniert & wie viele SMS man verschickt. Danach soll man aus 5 Anbietern wählen. Nach der Auswahl soll angzeigt werden, die Kosten im Monat & die Kosten im Jahr. Jeweils für einen 24 & einen 12 Monatsvertrag. (Bei 12 Monate einen Zuschlag von 15%) Das ist Pflicht. Es können auch, wie man beim testen des Programm sieht "Zusatzfeatures" eingebaut werden. Bis jetzt habe ich mein Bestes gegeben aber leider habe ich ständig irgendwelche Rechenfehler oder irgendwelche falschen Klammern, welche ich leider nicht im Quellcode finde.
Hier mal der Quellcode:
#include <iostream>
using namespace std;int main()
{
double Minuten;
double SMS;
int number;
bool exit= false;
for(;; )
{
cout << "Hallo,\ndieses Programm soll dazu dienen, Ihnen zu helfen den fuerr Sie richigen\nHandytarif zu finden."<<endl;
cout << "________________________________________________________________________________"<<endl;
cout << "Bitte geben Sie Ihre monantliche Gespraechsdauer in Minuten an: ";
cin >>Minuten;
cout << "Bitte geben Sie Ihr monatliches SMS-Aufkommen an: ";
cin >>SMS;
cout << "\nBitte waehlen Sie einen der 5 folgenden Anbieter durch Eingabe der\ndazugehoerigen Ziffer!" <<endl;
cout << "\n(1) Vodafone\n(2) Base\n(3) T-Mobile\n(4) O2\n(5) Arcor\n ";
cin >> number;
switch (number)
{
case 5: cout <<"Ihre Auswahl:\n\nArcor\n\tmonatliche Grundgebuehr:\t15 Euro\t\n\tMinutenpreis:\t\t\t0,18 Euro\t"<<Minuten*0.18<<" Euro\n\tPreis pro SMS:\t\t\t0,09 Euro\t"<<SMS*0.09<<" Euro\n\n\n\t\t\t\t\t12 Monate\t24 Monate\n\n\tKosten im Monat:\t\t"<<
15+(Minuten*0.18)+(SMS*0.09)<<" Euro\t"<<(15+(Minuten*0.18)+(SMS*0.09))*1.15<<" Euro\n\tKosten im Jahr:\t\t\t"<<(15+(Minuten*0.18)+(SMS*0.09))*12<<" Euro\t"<<((15+(Minuten*0.18)+(SMS*0.09))*1.15)*12<<" Euro"<<endl;
break;case 4: cout <<"Ihre Auswahl:\n\nO2\n\tmonatliche Grundgebuehr:\t0 Euro\t\n\tMinutenpreis:\t\t\t0,25 Euro\t"<<Minuten*0.25<<" Euro\n\tPreis pro SMS:\t\t\t0,19 Euro\t"<<SMS*0.19<<" Euro\n\n\n\t\t\t\t\t12 Monate\t24 Monate\n\n\tKosten im Monat:\t\t"<<
0+(Minuten*0.25)+(SMS*0.19)<<" Euro\t"<<(0+(Minuten*0.25)+(SMS*0.19))*1.15<<" Euro\n\tKosten im Jahr:\t\t\t"<<(0+(Minuten*0.25)+(SMS*0.19))*12<<" Euro\t"<<((0+(Minuten*0.25)+(SMS*0.19))*1.15)*12<<" Euro"<<endl;
break;case 3: cout <<"Ihre Auswahl:\n\nT-Mobile\n\tmonatliche Grundgebuehr:\t19.95 Euro\t\n\tMinutenpreis:\t\t\t0.40 Euro\t"<<Minuten*0.40<<" Euro\n\tPreis pro SMS:\t\t\t0.16 Euro\t"<<SMS*0.16<<" Euro\n\n\n\t\t\t\t\t24 Monate\t12 Monate\n\n\tKosten im Monat:\t\t"<<
(19.95+((Minuten*0.40)+(SMS*0.16)))<<" Euro\t"<<(19.95+((Minuten*0.40)+(SMS*0.16))*1.15)<<" Euro\n\tKosten im Jahr:\t\t\t"<<((19.95+((Minuten*0.40)+(SMS*0.16))*12))<<" Euro\t"<<(((19.95+(Minuten*0.40)+(SMS*0.16))*1.15)*12)<<" Euro"<<endl;
break;case 2: cout <<"Ihre Auswahl:\n\nBase\n\tmonatliche Grundgebuehr:\t20 Euro\t\n\tMinutenpreis:\t\t\t0,18 Euro\t"<<Minuten*0.18<<" Euro\n\tPreis pro SMS:\t\t\t0,09 Euro\t"<<SMS*0.09<<" Euro\n\n\n\t\t\t\t\t12 Monate\t24 Monate\n\n\tKosten im Monat:\t\t"<<
20+(Minuten*0.18)+(SMS*0.09)<<" Euro\t"<<(20+(Minuten*0.18)+(SMS*0.09))*1.15<<" Euro\n\tKosten im Jahr:\t\t\t"<<(20+(Minuten*0.18)+(SMS*0.09))*12<<" Euro\t"<<((20+(Minuten*0.18)+(SMS*0.09))*1.15)*12<<" Euro"<<endl;
break;case 1: cout <<"Ihre Auswahl:\n\nVodafone\n\tmonatliche Grundgebuehr:\t4,95 Euro\t\n\tMinutenpreis:\t\t\t0,39 Euro\t"<<Minuten*0.39<<" Euro\n\tPreis pro SMS:\t\t\t0,15 Euro\t"<<SMS*0.15<<" Euro\n\n\n\t\t\t\t\t12 Monate\t24 Monate\n\n\tKosten im Monat:\t\t"<<
(4.95+(Minuten*0.39)+(SMS*0.15))<<" Euro\t"<<(4.95+((Minuten*0.39)+(SMS*0.15))*1.15)<<" Euro\n\tKosten im Jahr:\t\t\t"<<(4.95+((Minuten*0.39)+(SMS*0.15))*12)<<" Euro\t"<<((4.95+((Minuten*0.39)+(SMS*0.15))*1.15)*12)<<" Euro"<<endl;
break;case 9: exit=true;
break;
}
cout << "________________________________________________________________________________"<<endl; //Trennlinie
}
cout << "\n\n";
return 0;
}Wenn mir da jemand weiterhelfen könnte, wäre ich ziemlich dankbar, denn es geht um eine gute Note in der Schule

MfG Sibbi
Ach ja.. Kosten im Quelltext sind nicht real, aber vom Lehrer vorgegeben.
-
1. cpp-tags benutzen
2. Entweder du gibst an, was du bezahlen willst, oder
3. du schreibst wobei du genau Probleme hast.Sonst hilft dir hier keiner
Liebe Grüße, Maxi
-
Erst einmal danke für deine Antwort

Habe Probleme mit case 1 & mit case 5 .. Bekomme dort teilweise falsche Ergebnisse raus, aber weiss nicht warum.
-
Schau mal genau hin, worauf du die 15% aufschlägst und wann (12 oder 24 monate) ... und ob du auch immer die grundgebühr mal zwölf nimmst...
btw... saumäßiger programmierstil

-
Dieser Thread wurde von Moderator/in Korbinian aus dem Forum Projekte in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
lagalopex schrieb:
Schau mal genau hin, worauf du die 15% aufschlägst und wann (12 oder 24 monate) ... und ob du auch immer die grundgebühr mal zwölf nimmst...
btw... saumäßiger programmierstil

hmm.. weiss gerade nicht genau was du meinst, sorry.
und warum saumäßiger programmstil?

-
Geheimtipp: Verwende einen Debugger.
-
Achtung schrieb:
Geheimtipp: Verwende einen Debugger.
und wie mache ich das ? müsst verstehen - bin anfänger
-
ich überarbeitet dir das gerade mal etwas. warte noch nen bischen
-
Hier mal nen grundgerüst, was du benutzen kannst. Ist übersichtlicher als deins und viel leichter zu warten. Bei der softwareprogrammierung kommt es immer darauf an wie leicht man eine software warten kann. nur mal so als tip. das was du hattest war ziemlich unübersichtlich
#ifdef HAVE_CONFIG_H #include <config.h> #endif #include <iostream> #include <cstdlib> using namespace std; double minuten; double sms; double smspreis; double grundpreis; double minutenpreis; double ksmsmonat; double kminutenmonat; double kostenmonat12; double kostenmonat24; double kostenjahr12; double kostenjahr24; int number; int main(int argc, char *argv[]) { cout << "Bitte geben Sie Ihre monantliche Gespraechsdauer in Minuten an: "; cin >> minuten; cout << "Bitte geben Sie ihre Anzahl an SMS an: "; cin >> sms; cout << "Bitte wählen Sie ihren Anbeiter! 1=Vodafone, 2=Base, 3=T-Mobile, 4=O2, 5=Arcor "; cin >> number; switch(number) { case 1: minutenpreis=0.39; smspreis=0.15; grundpreis =4.95; break; case 2: minutenpreis=0.18; smspreis=0.09; grundpreis =20; break; case 3: minutenpreis=0.40; smspreis=0.16; grundpreis =19,95; break; case 4: minutenpreis=0.25; smspreis=0.19; grundpreis =0; break; case 5: minutenpreis=0.18; smspreis=0.09; grundpreis =15; break; } kminutenmonat = minutenpreis*minuten; ksmsmonat = smspreis*sms; kostenmonat12 = (grundpreis+kminutenmonat+ksmsmonat)*1.15; kostenmonat24 = grundpreis+kminutenmonat+ksmsmonat; kostenjahr12 = kostenmonat12*12; kostenjahr24= kostenmonat24*12; cout << "Grundgebühr: " << grundpreis << endl; cout << "Kosten der Minuten im Monat: " << kminutenmonat << endl; cout << "Kosten der SMS im Monat: " << ksmsmonat << endl; cout << "Kosten im Monat (12 Monate Vertrag): " << kostenmonat12 << endl; cout << "Kosten im Monat (24 Monate Vertrag): " << kostenmonat24 << endl; cout << "Kosten im Jahr (12 Monate Vertrag): " << kostenjahr12 << endl; cout << "Kosten im Jahr (24 Monate Vertrag): " << kostenjahr24 << endl; return EXIT_SUCCESS; }
-
naja... wenn du ihm schon tipps gibst und dann son programm als beispiel
die liste an globalen variablen ist 25% so lang wie der restliche code, sie sind nicht zusätzlich geflaggt über g_ oder ähnliches was fast in jedem buch empfohlen wird bei globalen variablen nach einer 20 seitigen erklärung die dir sagt dass du globale variablen garnicht verwenden willst
"int number" ist auch nicht gerade ein sprechender variablenname, natürlich ist int eine number, das weiss ich auch so wenn ich weiss es ist ein int, nen variablenname soll mir sofort sagen was diese variable ist und "int number" oder "float floatingPointNumber" tut das nicht
oben dieses HAVE_CONFIG abfragen, ich nehme mal an das h file macht sowas wie #define HAVE_CONFIG und das soll mehrfach inkludierung vermeiden, aber das ist das erste mal dass ich sowas so gemacht sehe, ich würde eher bei dem üblichen #ifndef ... am anfang und #endif am ende vom h file bleiben
case 1, 2, 3 sind magic numbers, magic numbers sind böse und durch #defines oder globale const variablen zu ersetzen, bei den providern überhaupt nen enum weil das nicht zusammenhanglos ist irgendwas sondern eben ne aufzählung
methoden verwenden und keine codewurst
-
das das schön ist hab ich nicht behauptet. der wollte nur was lauffähiges haben. und das läuft, aber schön ist es nicht
-
zerberos schrieb:
das das schön ist hab ich nicht behauptet. der wollte nur was lauffähiges haben. und das läuft, aber schön ist es nicht
äh..
zerberos schrieb:
Ist übersichtlicher als deins und viel leichter zu warten.
ahja. trotzdem schlecht und nicht viel besser zu warten.
ich habs mal leicht überarbeitet.#include <iostream> #include <cstdlib> using namespace std; struct ProviderInfo { const char* name; double minutenpreis; double smspreis; double grundpreis; }; enum Provider { VODAFONE, BASE, TMOBILE, O2, ARCOR, NUM_PROVIDERS }; void printInfo(const ProviderInfo& provider, int minuten, int sms) { double kminutenmonat = provider.minutenpreis*minuten; double ksmsmonat = provider.smspreis*sms; double kostenmonat12 = (provider.grundpreis+kminutenmonat+ksmsmonat)*1.15; double kostenmonat24 = provider.grundpreis+kminutenmonat+ksmsmonat; double kostenjahr12 = kostenmonat12*12; double kostenjahr24= kostenmonat24*12; cout << "Grundgebühr: " << provider.grundpreis << endl; cout << "Kosten der Minuten im Monat: " << kminutenmonat << endl; cout << "Kosten der SMS im Monat: " << ksmsmonat << endl; cout << "Kosten im Monat (12 Monate Vertrag): " << kostenmonat12 << endl; cout << "Kosten im Monat (24 Monate Vertrag): " << kostenmonat24 << endl; cout << "Kosten im Jahr (12 Monate Vertrag): " << kostenjahr12 << endl; cout << "Kosten im Jahr (24 Monate Vertrag): " << kostenjahr24 << endl; } int main(int argc, char *argv[]) { const ProviderInfo provider[NUM_PROVIDERS] = { // name, minutenpreis, smspreis, grundpreis { "Vodafone", 0.39, 0.15, 4.95 }, { "Base", 0.18, 0.09, 20.00 }, { "T-Mobile", 0.40, 0.16, 19.95 }, { "O2", 0.25, 0.19, 0.00 }, { "Arcor", 0.18, 0.09, 15.00 } }; std::size_t auswahl = 0; while(auswahl <= NUM_PROVIDERS) // bis gültige eingabe erfolgt ist { cout << "Bitte wählen Sie ihren Anbeiter! "; for(int i=0; i < NUM_PROVIDERS; ++i) cout << i+1 << " = " << provider[i].name << ", "; cout << "0 = Ende" << endl; cin >> auswahl; } if(auswahl > 0) { int minuten; cout << "Bitte geben Sie Ihre monatliche Gesprächsdauer in Minuten an: "; cin >> minuten; // TODO: auf gültige minutenzahl prüfen int sms; cout << "Bitte geben Sie ihre Anzahl an SMS an: "; cin >> sms; // TODO: auf gültige sms-zahl prüfen --auswahl; // eingabe war 1 bis n, wir brauchen 0 bis n-1 printInfo(provider[auswahl], minuten, sms); } return EXIT_SUCCESS; }
-
kopfkratzer schrieb:
while(auswahl <= NUM_PROVIDERS) // bis gültige eingabe erfolgt istsollte
while(auswahl > NUM_PROVIDERS) // bis gültige eingabe erfolgt istlauten, sorry.
-
nochmal richtig:
#include <iostream> #include <cstdlib> using namespace std; struct ProviderInfo { char* name; double minutenpreis; double smspreis; double grundpreis; }; enum Provider { VODAFONE, BASE, TMOBILE, O2, ARCOR, NUM_PROVIDERS }; void printInfo(const ProviderInfo& provider, int minuten, int sms) { double kminutenmonat = provider.minutenpreis*minuten; double ksmsmonat = provider.smspreis*sms; double kostenmonat12 = (provider.grundpreis+kminutenmonat+ksmsmonat)*1.15; double kostenmonat24 = provider.grundpreis+kminutenmonat+ksmsmonat; double kostenjahr12 = kostenmonat12*12; double kostenjahr24= kostenmonat24*12; cout << "Grundgebühr: " << provider.grundpreis << endl; cout << "Kosten der Minuten im Monat: " << kminutenmonat << endl; cout << "Kosten der SMS im Monat: " << ksmsmonat << endl; cout << "Kosten im Monat (12 Monate Vertrag): " << kostenmonat12 << endl; cout << "Kosten im Monat (24 Monate Vertrag): " << kostenmonat24 << endl; cout << "Kosten im Jahr (12 Monate Vertrag): " << kostenjahr12 << endl; cout << "Kosten im Jahr (24 Monate Vertrag): " << kostenjahr24 << endl; } int main(int argc, char *argv[]) { const ProviderInfo provider[NUM_PROVIDERS] = { // name, minutenpreis, smspreis, grundpreis { "Vodafone", 0.39, 0.15, 4.95 }, { "Base", 0.18, 0.09, 20.00 }, { "T-Mobile", 0.40, 0.16, 19.95 }, { "O2", 0.25, 0.19, 0.00 }, { "Arcor", 0.18, 0.09, 15.00 } }; std::size_t auswahl = 0; do { cout << "Bitte wählen Sie ihren Anbeiter! "; for(int i=0; i < NUM_PROVIDERS; ++i) cout << i+1 << " = " << provider[i].name << ", "; cout << "0 = Ende" << endl; cin >> auswahl; } while(auswahl > NUM_PROVIDERS) // bis gültige eingabe erfolgt ist if(auswahl > 0) { int minuten; cout << "Bitte geben Sie Ihre monatliche Gesprächsdauer in Minuten an: "; cin >> minuten; // TODO: auf gültige minutenzahl prüfen int sms; cout << "Bitte geben Sie ihre Anzahl an SMS an: "; cin >> sms; // TODO: auf gültige sms-zahl prüfen --auswahl; // eingabe war 1 bis n, wir brauchen 0 bis n-1 printInfo(provider[auswahl], minuten, sms); } return EXIT_SUCCESS; }ist übrigens nicht getestet, sollte aber laufen. zumindest leicht zum laufen zu bringen.
-
Ich fand die erste Lösung (vielleicht bis auf die magischen Konstanten, die man mit nem enum verbessern sollte) angemessen für diese Problemstellung.
Den kompletten Verzicht auf globale Variablen sehe ich hier nicht als sinnvoll an. Genauso ist die vollständige Auslagerung der Daten aus dem Code sicher für größere Projekte sinnvoll. Für diese kleine Aufgabe schafft es aber nur übermäßige Komplexität.
-
big-S schrieb:
Achtung schrieb:
Geheimtipp: Verwende einen Debugger.
und wie mache ich das ? müsst verstehen - bin anfänger
http://www.c-plusplus.net/forum/viewtopic-var-t-is-120832.html (geht in anderen Programmen/Versionen fast gleich)
In der zweiten Version können die ENUMs weg und wenn std::vector verwendet wird, auch das NUM_PROVIERS. Und die mischung aus std::size vs. cout sollte auch weg.
-
@Jester: muss schön sein, wenn man moderator ist. dann kann man geschriebenes einfach wieder löschen, so als wäre es nie passiert und muss sich keiner kritik stellen.
-
Achtung schrieb:
In der zweiten Version können die ENUMs weg und wenn std::vector verwendet wird, auch das NUM_PROVIERS.
stimmt.
Und die mischung aus std::size vs. cout sollte auch weg.
wieso?
-
Und die mischung aus std::size vs. cout sollte auch weg.
wieso?[/quote]entweder alles mit std:: oder garnix
-
kopfkratzer schrieb:
@Jester: muss schön sein, wenn man moderator ist. dann kann man geschriebenes einfach wieder löschen, so als wäre es nie passiert und muss sich keiner kritik stellen.
ja, darüber diskutieren ich auch gerade mit vinzenz, ich hab's nämlich nicht entfernt...
ich stehe dazu und es war auch nicht böse gemeint, das hätte ich mal besser durch einen smiley kenntlich gemacht. deine lösung ist natürlich gut und richtig. ich wollte lediglich zum ausdruck bringen, dass diese auslagerung der daten hier mehr komplexität als nötig schafft.
wenn du darüber hinaus klärungsbedarf sieht, dann schick mir doch bitte eine email.