wieso funktioniert meine if verzweigung nicht?
-
Leute ich bins wieder mal! Habe ein kleines Problem:
Ich will so ein kleines Tool bauen wo man EURO IN CHF und umgekehrt rechnen kann. Aber bei meiner if verzweigung kann ich die Eingabe nicht vergleichen mit der Bedingung. Kann mir jemand helfen, oder einen Tipp geben was der Fehler ist?Hier mein ganzer Quellcode:
//eurokonverter copyright by skater #include <iostream> #include <string> #include <cstdio> using namespace std; int main() { double CHF, EUR, CHFL, EURL; string eingabe; cout << "´\aHallo und willkommen bei meinem Eurorechner!"<< endl; cout << "Bitte geben Sie an ob sie CHF oder EUR umrechnen wollen: "<< endl; cin>> eingabe; :rolling_eyes: if (eingabe = CHF) :rolling_eyes: {cout<< "Wieviel CHF haben Sie ?"<< endl; cin>>CHF; CHFL= CHF * 0.6481; printf(" %f sFr. entsprechen %f Euros \n", CHF, CHFL); } else {cout << "Wieviel Euro haben Sie?"<< endl; cin>> EUR; EURL= EUR * 1.5429; printf (" %f Euros entsprechen %f sFr. \n", EUR, EURL); } cout<< endl; cout <<"\a Programm wird beendet!Windows wird heruntergefahren!;-)"<< endl; cin.sync(); cin.clear(); cin.get(); return 0; }
bitte nicht auslachen, bin ein Newbie, aber jeder fängt mal klein an oder?
Das Problem habe ich in zwei smileys dazwischen gestellt. Der Compiler alarmiert eine Fehlermeldung wegen dem Gleichheitszeichen.Danke für euren Rat schon im voraus
Skater
-
Hmm,
if (eingabe == "CHF")
würde hier besser passen
PS: Aber warum mixt du cout/printf in deinem Programm?
Hups, da waren ja immer noch Fehler drin
-
Du musst einen Vergleich machen und das ist == während = nur ein Zuweisungsoperator ist, vielleicht liegt es daran
-
Es sollte wohl
if (eingabe == "CHF") { ... }
heißen, da es wenig Sinn macht, einen string mit dem Wert einer uninitialisierten double Variable zu vergleichen
gruß,
walker
-
hi, zuallererstens mal
Was ist BBCode?
Damit machst du dein Programm schon um einiges leserlicher//eurokonverter copyright by skater #include <iostream> #include <string> #include <cstdio> using namespace std; int main() { cout << "\aHallo und willkommen bei meinem Eurorechner!\n" "Bitte geben Sie an ob sie CHF oder EUR umrechnen wollen:\n"; string eingabe; //in c++ ist es üblich, die variable so spät als möglich zu definieren cin >> eingabe; if (eingabe = "CHF") { //siehe obige postings cout<< "Wieviel CHF haben Sie?\n"; //endl ist oft genug überflüssig double CHF; cin>>CHF; cout << CHF << " sFr. entsprechen " << CHF * 0.6481 << " Euro\n"; } else { cout << "Wieviel Euro haben Sie?\n"; //schon wieder ein endl double EUR; cin>>EUR; cout << EUR << " Euros entsprechen " << EUR * 1.5429 << " sFr.\n"; } //warum nicht endl werd ich dir noch erklären cout <<"\n\a Programm wird beendet!Windows wird heruntergefahren!;-)\n"; cin.clear(); cin.sync(); //wenn's nicht immer klappt: cin.ignore(cin.rdbuf()->in_avail()); cin.get(); return 0; }
endl mach nicht nur eine neue Zeile, sondern "flusht" gleichzeitig auch den Stream: Der Inhalt wird sofort ausgegeben
Bei der Arbeit mit Dateien ist das oft ziemlich unangenehm, und bei cout wird automatisch jedesmal geflusht, bevor eine neue cin Eingabe abgefragt wird.cout << endl; //hat denselben effekt wie cout << '\n' << flush;
und das ist oft overhead.
mach dir lieber zb in der ersten zeile einconst char nl = '\n';
und verwende das dann anstelle von endl, bzw.
cout << "Blablabla" << endl; //mach zu cout << "Blablabla\n";
Außerdem definiert man in C++ Variablen erst bei ihrer Verwendung, was - wenn man sich es früh genug angewöhnt - oft (nicht unbedingt bei int, double etc) ein großer geschwindigkeitsvorteil ist.
außerdem erkennt man so, dass man manche variablen gar nicht benötigt
-
Ich danke euch leute dass ihr mir geholfen habt!
Kann ich mich auf eure Hilfe in der Zukunft auch noch verlassen? Ich meine wenn ich ein Problem habe oder so?
Nochmals dankeschön
skater151
-
Hallo
Alles sehr schön erklärt davie!
Aber das mit dem "flushen" habe ich nicht ganz kopiert.
Kann mir jemand etwas genauer erklären was das heisst?
Danke schön
-
wenn du in einen stream etwas schreibst:
ofstream file("ausgabe.txt"); file << "Blub"; sleep (100000); //Programmablauf stoppen
schau mal, ob ausgabe.txt die 4 Buchstaben "Blub" enthält.
Höchstwahrscheinlich nicht.
Das liegt daran, dass << "Blub" den String "Blub" nicht direkt in die datei, sondern in den Buffer von file schreibt. und damit der seinen inhalt in die datei schreibt, muss der stream "geflusht" werden:ofstream file("ausgabe.txt"); fiel << "Blub" << flush; sleep (100000);
jetzt steht in der datei auf alle fällte "Blub".
cin und cout sind allerdings so miteinander verbunden, dass cout jedesmal geflusht wird, wenn eine neue eingabe erwartet wird.
also ist ein endl (also ein '\n' << flush) einfach nur zuviel des guten.
und - wie gesagt - kann es dann zu problemen bei dateien kommen:
die buffer gibt es ja nur deshalb, weil es viel zu lange dauern würde, wenn nach jedem "<<" sofort in die datei geschrieben werden würde: das programm müsste auf die festplatte warten.es gibt allerdings einen ausgabestrom, cerr, der ungepuffert ist. hier sind endl und flush total nutzlos.
ein vierter standard ausgabestream - clog - schreibt in das selbe ausgabemedium wie cerr, nur eben gepuffert. (cerr schreibt normalerweise dorthin, wo cout auch hinschreibt, aber das kann man umleiten)ein stream wird außerdem bei jedem destruktoraufruf geflusht:
{ //scope öffnen ofstream of("file"); of << "Ausgabe\n"; } //scope schließen: destruktor wird aufgerufen
hier wäre ein of << "Ausgabe\n" << endl; ein unnötiger overhead.
Mir ist schon klar, das bei solchen trivialen beispielen der geschwindigkeitsverlust minimal ist, aber später wird man eben mit immer komplexeren aufgaben zurechtkommen müssen, und sich wundern, warum das programm so eine schlechte laufzeit hat.
eins noch: wenn zuviel im buffer steht, wird er automatisch geleert (geflusht)
-
Allgemein ist eine Ausgabe gepuffert. D.h. das erst eine gewisse Anzahl Zeichen gesammelt wird, bis diese tatsächlich ausgegeben wird. Will man das der Ausgabepuffer ausgegeben wird obwohl er noch nicht voll ist, führt man einen flush aus.
Code-Hacker
-
Jetzt habe ich das verstanden .
Danke schön.