Brauche Hilfe bis nächsten Donnerstag (24.04.2008)
-
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.
-
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.
Nur zu deiner information. Das war ich nicht er. Ich hab deinen Post gelöscht und das worüber du dich dann aufgeregt hast rauseditiert.
Danach hat er bloß irgendwas zusätzlich geändert.
BR Vinzenz
-
ok, dann sorry an jester. es sah halt so aus...
Achtung schrieb:
entweder alles mit std:: oder garnix
ah, jetzt. stimmt natürlich. ist gewohnheitssache, normalerweise verzichte ich auf using.
-
Also Overengineered ist die Lösung sicher nicht. (D)Evil hätte sicher wieder was mit Templates usw. gemacht

-
das der provider enum unnötig ist finde ich nicht, vllt wird er in der lösung gerade nicht verwendet aber wenn man das programm ein bisschen weiterführen würde, erweist er sich bestimmt früher oder später als nützlich
-
Und da sieht mans mal wieder: Die dicksten Programmierer schreiben die duennsten Programme!
-
Vevusio schrieb:
das der provider enum unnötig ist finde ich nicht, vllt wird er in der lösung gerade nicht verwendet aber wenn man das programm ein bisschen weiterführen würde, erweist er sich bestimmt früher oder später als nützlich
Wenn man was "richtiges" machen will, würde man ne Datenbank nehmen und dann hat jeder Provider ne ID. Für was sollen bei solchen Daten enums gut sein?
-
lol... meinst du die frage jetzt ernst?
wir haben den enum Providers
um generell wenn man einem provider identifizieren will es über den enum zu machen und nicht über integer oder sonst etwas nichts sagendes
zB.
- auf das array über providers[Providers::Inode] zugreifen zu können (wenn man auf einen konkreten provider zugreifen möchte aus irgend einem grund und nicht über das gesamte ding iterieren)
- funktionen der art schreiben zu können
const char *GetProviderName(Providers aProvider);statt
//anfälliger für falsche eingaben const char *GetProviderName(int providerNumber);selbst wenn ich eine datenbank an das programm anhängen wollte, hat das absolut nichts mit dem enum zu tun
beziehungsweise könnte man den enum auch dann hand in hand mit der datenbank zusammen benutzen
result = ExecuteQuery("select provider.name from provider where provider.providerId = %d", (int)Providers::Inode);"Für was sollen bei solchen Daten enums gut sein?"
enums sind aufzählungstypen, wir haben eine aufzählung an providern also verwenden wir einen aufzählungstyp dafür - einfacher könnte es ja nicht sein?