Änfängerprogramm: gut oder schlecht???
-
s. schrieb:
LOL. der string schleife ist voll lustig.
Also,ich hab schon bedeutend schlechtere Anfängercodes gesehen.
Für nen absoluten Anfänger finde ich es eigentlich ganz ok.
@Mr.Pink:
Wenn du es verbessern möchtest dann überprüf nach den Eingaben über cin den Zustand von cin.Bei einem Fehlerzustand setzt du den Status zurück und löschst die fehlerhaften Daten aus dem Stream.
Momentan muss der User korrekte Daten eingeben.
Probier mal ,z.B. bei der Eingabe der ersten Zahl, nen Buchstaben anstelle einer Zahl einzugeben.Dann siehst du wofür das gut ist
.MfG Spacelord
-
Hallo,
für nen Anfänger sieht das schon ganz gut aus. Ich sehe ein int main (anstatt void), ich sehe aktuelle Header und ich sehe sauber formatierten Code. Aber mittels string auf Terminierung der Schleife zu prüfen, ist nicht so cool. Außerdem brauchst du für den Operator auch nur ein char. Mein Vorschlag:
#include <iostream> #include <string> using namespace std; int main() { char schleife; do { float z1=0, z2=0; cout<<"\n********NEUE RECHNUNG********\n\n"; cout<<"Erste Zahl: "; cin>>z1; char op; do { cout<<"Operator: "; cin>>op; cout<<"Naechste Zahl: "; cin>>z2; switch (op) { case '+': z1 += z2; break; case '-': z1 -= z2; break; case '*': z1 *= z2; break; case '/': z1 /= z2; break; default: cerr<<"Falscher Operator\n"; } }while (op != '='); cout<<"Ergebnis: "<<z1<<'\n'; cout<<"Noch eine Rechnung(j/n)?"; cin >> schleife; } while (schleife == 'j'); return 0; }Der operator und die schleifenbedingung für's weitermachen sind jetzt chars, denn der operator z.b. wird bei deinem Programm nie mehr als ein Zeichen brauchen, ein string ist hier fehl am Platz. Die ifs habe ich durch ein switch ersetzt. Die while Schleifen wurden zu do - while Schleifen und ich habe die Variablen so spät wie möglich deklariert.
Das Einbauen der Fehlerbehandlung überlasse ich dir

MfG
GPC
-
cool, danke
das mit dem switch case kannste ich gar nicht, aber habs glaub ich verstanden. praktisch ist da ja dasdefault: cerr<<"Falscher Operator\n";
ebenso war mir die do-whiles-schleife nicht bekannt, warum muss denn am anfang schleife="n" gesetzt werden? genau das entfällt doch durch den gebrauch dieser schleife.
aber vielen dank erst mal

-
Mr. Pink schrieb:
ebenso war mir die do-whiles-schleife nicht bekannt, warum muss denn am anfang schleife="n" gesetzt werden?
Muss nicht, wäre auch nicht nötig gewesen, aber man gewöhnt sich an, einer Variable nen Startwert mitzugeben. Hier ist es egal.
genau das entfällt doch durch den gebrauch dieser schleife.

richtig, ich editer's mal weg...
MfG
GPC
-
Da kann ich mich meinen Vorrednern nur anschliessen, da hat man schon Schlechteres gesehen. 3 Tipps möchte ich dir trotzdem noch geben.
Verwende Leerzeichen! Jemand der sowas hier liest
while (op!="=")ist erstmal wie vor den Kopf gestossen. Bei folgendem
while (op != "=")wird einem schon eher klar, was zusammengehört und erhöht die Lesbarkeit. Gleiches gilt für die include's, cout's, cin's, etc.
Schau dir mal die Assignment Operatoren an. In C++ schreibt man statt
z1 = z1 + z2;besser
z1 += z2;Bei trivialen Typen (wie in deinem Fall) ist das noch nicht so entscheidend, bei nicht-trivialen aber schon.
Für deinen Fall ist die Lösung von GPC sicherlich einfacher. Es kann aber durchaus sein, dass du dennoch mal ein switch für Strings brauchst und dies über if's simulieren musst. Dann mach die einzelnen Zweige besser exklusiv, also
if (op == "+") z1 += z2; else if (op == "-") z1 -= z2; else if (op == "*") z1 *= z2; else if (op == "/") z1 /= z2;Das reduziert die Vergleiche auf ein Minimum und mehr ist auch nicht nötig, da die Argumente sich sowieso gegenseitig ausschliessen.
-
danke, für die antworten, werd mich dann mal wieder ans proggen machen.
habe denk ich einige praktische feinheiten gelernt, mal sehen, ob ich die auch gut in spätere programme einbauen kann...
Edit: Wofür steht genau das "cerr" bei
default: cerr<<"Falscher Operator\n";habs wohl dochnicht ganz verstanden

-
das ist ein ausgabestream, ähnlich dem "cout".
-
gibts da noch nen unterschied oder ist es praktisch egal was ich nehme?
könnt ich dann auch einfachdefault: cout<<"Falscher Operator\n";schreiben?!
-
Mr. Pink schrieb:
gibts da noch nen unterschied oder ist es praktisch egal was ich nehme?
könnt ich dann auch einfachdefault: cout<<"Falscher Operator\n";schreiben?!
cerr ist die Standardfehlerausgabe, d.h. dieser Stream ist ungepuffert und zweitens könnte man ihn umleiten (kann man cout ja auch), in eine log-Datei z.B., die die Fehler auflistet. Aber normalerweise gibt er dir das auf der Konsole aus und gut ist

MfG
GPC
-
cerr und cout können unabhängig voneinander umgeleitet werden (auch wenn defaultmäßig beide auf den Bildschirm schreiben) - cout ist die reguläre Ausgabe des Programms, cerr ist für Fehlermeldungen.
(PS: In die obige switch()-Anweisung solltest du noch ein "case '=':break;" einbauen, sonst spuckt dir das Programm für's = auch ein "falscher Operator" entgegen)