Brauche Hilfe bis nächsten Donnerstag (24.04.2008)
-
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?