Taschenrechner -> Erstprojekt probleme :)
-
besten dank, funktioniert
Hm, wieso ist system("") übel?
Gibt es andere Wege um das fenster zu "clearn"?
-
Hm, wieso ist system("") übel?
Gibt es andere Wege um das fenster zu "clearn"?system() ist stark Betriebssystem abhängig und gilt als schlechter Programmierstil. Recht viele andere Möglichkeiten gibt es aber auch nicht. Du kannst es höchstens so versuchen:
#include <conio.h> #include <iostream> int main() { cout<<"Bla und blubb"<<endl; clrscr(); cout<<"gelöscht"<<endl; return 0; }
Hm, noch was: Ich finde return main(); nicht sehr schön. Lager lieber alles in eine Funktion aus, z.B. int rechner(void);
-
Flyde schrieb:
Die Variablen sind short, weil das die Aufgabe eines Tutorials war.
Sonst hätte ich double genommen, korrigiert mich wenn ich das nicht tun sollte.
Doch, du kannst ruhig double nehmen, da sonst bei der Division nur eine Ganzzahldivision durchgeührt wird, und dies wahrscheinlich nicht beabsichtigt ist.
Flyde schrieb:
Mein Fehler liegt im unteren teil bei den funktionen (was eigentlich klar ist).
Ich sehe in deinem Programm keine von dir definierte Funktion außer main!?
kynarion schrieb:
Füg vor cin.get()
cin.clear( ); // Fehlerflags löschen, damit das nächste cin wieder ausgeführt wird cin.ignore( ); // Tastatureingabepuffer löschen
ein.
Wenn schon:
cin.clear( ); cin.ignore( cin.rdbuf( )->in_avail( ) ); cin.get( )
kynarion schrieb:
system( ) ist übel.
Kannst du nicht pauschal behaupten, denn es gibt durchaus die Möglichkeit, system( ) sinnvoll einzusetzen.
kynarion schrieb:
system( ) ist stark Betriebssystemabhängig und gilt als schlechter Programmierstil.
Nein, system( ) ist nicht Betriebssystemabhängig, sondern Teil der ISO/IEC 14882:1998:
ISO/IEC 14882:1998 schrieb:
18.7 Other runtime support
1 Headers <cstdarg> (variable arguments), <csetjmp> (nonlocal jumps>, <ctime> (system clock clock(), time()), <csignal> (signal handling), an cstdlib> (runtime environment getenv, system()).
Der Parameter für system( ) ist allenfalls Platformabhängig.
kynarion schrieb:
Recht viele andere Möglichkeiten [außer system( "cls" )] gibt es aber auch nicht. Du kannst es höchstens so versuchen:
#include <conio.h> #include <iostream> int main() { cout << "Bla und blubb" << endl; clrscr( ); cout << "gelöscht" << endl; return 0; }
Dein Beispiel lässt sich erstens wegen einer fehlerhaften Benutzung von C++ nicht compilieren ( entweder es fehlt ein using namespace std; oder ein std:: jeweils vor cout und endl, zweitens (bei mir) wegen der nicht vorhandenen Funktion clrscr( ). Ich weiß, <conio.h> enthält bei Borland-Compilern auch eine clrscr( ), worauf du dich jedoch nicht verlassen kannst. Du betreibst also "Verschlimmbesserung" da Compilerabhängigkeit mit Sicherheit schlimmer ist, als Betriebssystemabhängigkeit.
Da gibt's durchaus noch andere Möglichkeiten, zB:
#include <windows.h> void clrscr( ) { void *con_out = GetStdHandle( STD_OUTPUT_HANDLE ); CONSOLE_SCREEN_BUFFER_INFO csbi; GetConsoleScreenBufferInfo( con_out, &csbi ); COORD pos; memset( &pos, 0, sizeof( COORD ) ); unsigned long chars_written; FillConsoleOutputCharacter( con_out, ' ', csbi.dwSize.X * csbi.dwSize.Y, pos, &chars_written ); SetConsoleCursorPosition( con_out, pos ); }
kynarion schrieb:
[...] Ich finde return main(); nicht sehr schön.
Was, nicht schön!? Ich persönlich find's grauenhaft, wie übrigens der C++ Standard auch:
*)
ISO/IEC 14882:1998 schrieb:
3.6 Start and termination
3.6.1 Main function
[...]
3 The function main shall not be used (3.2) within a program. [...]
Ich hab' mal über dein Program drübergewurschtelt:
#include <iostream> #include <windows.h> using namespace std; void clrscr( ); int main() { short zahl1, zahl2, erg, /* fehlt: */ auswahl, /* neu: */ nochmal; // Da ein Aufruf von main( ) aus dem Programm heraus nicht zu empehlen ist, // verwenden wir eine do ... while( ) Schleife: do { clrscr( ); cout << "Rechner" << endl << endl; cout << "Beschreibung: Sie geben die zwei Zahlen ein" << endl; cout << "und anschliessend waehlen sie den" << endl; cout << "Operator aus." << endl << endl; // Fehlerprüfung kann nie schaden: do { if( cin.fail( ) ) { cout << "Bitte geben Sie eine Zahl ein!" << endl << endl; cin.clear( ); cin.ignore( cin.rdbuf( )->in_avail( ) ); } cout << "Gebe die erste Zahl ein:" << endl; cin >> zahl1; cout << endl; } while( cin.fail( ) ); // Fehlerprüfung kann nie schaden: do { if( cin.fail( ) ) { cout << "Bitte geben Sie eine Zahl ein!" << endl << endl; cin.clear( ); cin.ignore( cin.rdbuf( )->in_avail( ) ); } cout << "Gebe die zweite Zahl ein:" << endl; cin >> zahl2; cout << endl; } while( cin.fail( ) ); cout << "Wähle nun den Operator:" << endl << endl; cout << "1: Addieren" << endl; cout << "2: Substrahieren" << endl; cout << "3: Multiplizieren" << endl; cout << "4: Dividieren." << endl << endl; // Fehlerprüfung kann nie schaden: do { if( cin.fail( ) ) { cout << "Gueltige werte: 1, 2, 3 oder 4!" << endl; cin.clear( ); cin.ignore( cin.rdbuf( )->in_avail( ) ); } cout << "Auswahl: "; cin >> auswahl; cout << endl; if( auswahl < 1 || auswahl > 4 ) { cout << "Gueltige werte: 1, 2, 3 oder 4!" << endl; } } while( cin.fail( ) ||auswahl < 1 || auswahl > 4 ); // Funtkion // ^ !? switch( auswahl ) { case 1: erg = zahl1 + zahl2; break; case 2: erg = zahl1 - zahl2; break; case 3: erg = zahl1 * zahl2; break; case 4: erg = zahl1 / zahl2; break; /* Wird nun bei der Eingabe von auswahl berücksichtigt: default: cout<< "Ihre eingaben waren nicht gültig." ; cin.get( ); system( "cls" ); return main(); *) */ } /* Ist Schwachfug, da erg nie explizit auf 0 (null) gesetzt wird: if( erg ) { */ cout << "Ergebnis: " << erg << endl << endl; cout << "Noch eine Berechnung durchführen? ( 1 = ja, 0 = nein )" << endl; /* } */ // Fehlerprüfung kann nie schaden: do { if( cin.fail( ) ) { cout << "Gueltige werte: 1 oder 0!" << endl; cin.clear( ); cin.ignore( cin.rdbuf( )->in_avail( ) ); } cout << endl << "Auswahl:" << endl; cin >> nochmal; cout << endl; if( nochmal != 1 && nochmal != 0 ) { cout << "Gueltige werte: 1 oder 0!" << endl; } } while( cin.fail( ) || ( nochmal != 1 && nochmal != 0 ) ); } while( nochmal ); } void clrscr( ) { void *con_out = GetStdHandle( STD_OUTPUT_HANDLE ); CONSOLE_SCREEN_BUFFER_INFO csbi; GetConsoleScreenBufferInfo( con_out, &csbi ); COORD pos; memset( &pos, 0, sizeof( COORD ) ); unsigned long chars_written; FillConsoleOutputCharacter( con_out, ' ', csbi.dwSize.X * csbi.dwSize.Y, pos, &chars_written ); SetConsoleCursorPosition( con_out, pos ); }
Greetz, Swordfish
-
Der Unwissende bittet den Großmeister vielmals um Verzeihung, erlaubt sich aber dennoch zu kritisieren:
Der Parameter für system( ) ist allenfalls Platformabhängig.
Aha. Und was heißt das am Ende für die ganze Funktion? Letztendlich das selbe. Aber lassen wir das, ich will mich nicht streiten.
Was, nicht schön!? Ich persönlich find's grauenhaft, wie übrigens der C++ Standard auch:
Gut, ich hab mich halt vorsichtig ausgedrückt (im Gegensatz zu Dir).
cin.clear( ); cin.ignore( cin.rdbuf( )->in_avail( ) ); cin.get( )
Eine Erklärung wäre nicht schlecht, besonders wenn man es
mit jemanden zu tun hat, der die ganze Funktion noch nicht gekannt hat.std::cin.ignore(); //löscht ein Zeichen. (Meist das ENTER aus der vorherigen Eingabe.) std::cin.ignore(99); //löscht 99 Zeichen. std::cin.ignore(10, '\n'); //löscht 10 Zeichen oder, falls es zuerst kommt, bis zu einem Newline-Zeichen.
Zu den speziellen Parametern:
http://www.c-plusplus.net/forum/viewtopic-var-p-is-797103.htmlUnd wenn wir schon am erklären sind, was ist an Deiner Bildschirmlöschvariante besser als an system("CLS")? Da ist doch auch das Plattformübergreifende am Code futsch.
Ansonsten gestehe ich alle von Dir genannten Fehler meinerseits ein.
Grüße,
kynarion
-
wtf!
ich hätte nicht gedacht das ich leute so zum disktuieren bringe mit einem simplen RECHNER *g*auswahl hatte ich geamcht.. aber ich hab beim posten an was anderes gedacht, das ich scho weggemacht hatte, sry mein fehler ^^ fehlt nur beim post.
Deine neue Version ist für mich noch nich ganz einleuchtend, da ich sachen wie cin.fail() z.b. nicht kenne, werde es aber mal durcharbeiten.
Ps: Danke für die Hilfe
-
Deine neue Version ist für mich noch nich ganz einleuchtend, da ich sachen wie cin.fail() z.b. nicht kenne, werde es aber mal durcharbeiten.
Tja, das sind die Swordfish-Lösungen. Die sind perfekt, da kann man nichts sagen. Aber für Anfänger evt. etwas verwirrend.
Hier mal ein Link für das cin-Zeugs (google):
http://www.cpp-tutor.de/cpp/le04/le04_02.htm
-
aja, das tut kenn ich schon aber das mit den ganzen bool etc. war da ein wenig komisch erklärtr für mich ^^ aber nun dürft ich das nochma durchnehmen können,
hab mir heut auch erstma 2 bücher bei amazon bestellt, irgendwann sollt ich genug stuff für habentrozdem danke
-
kynarion schrieb:
Der Unwissende bittet den Großmeister vielmals um Verzeihung [...]
angenommen, aaaber...
kynarion schrieb:
Swordfish schrieb:
Der Parameter für system( ) ist allenfalls Platformabhängig.
Aha. Und was heißt das am Ende für die ganze Funktion? Letztendlich das selbe. Aber lassen wir das, ich will mich nicht streiten.
Einverstanden.
kynarion schrieb:
Swordfish schrieb:
cin.clear( ); cin.ignore( cin.rdbuf( )->in_avail( ) ); cin.get( )
Eine Erklärung wäre nicht schlecht, besonders wenn man es
mit jemanden zu tun hat, der die ganze Funktion noch nicht gekannt hat.Nun gut, ich hätte es ihm zugetraut, in einer C++-Referenz nachzusehen.
kynarion schrieb:
Und wenn wir schon am erklären sind, was ist an Deiner Bildschirmlöschvariante besser als an system("CLS")? Da ist doch auch das Plattformübergreifende am Code futsch.
Sobald du beginnst, am Bildschirm herumzulöschen ist die Platformunabhängigkeit in jedem Fall weg. Ich erinnere dich kurz:
Du hast vorgeschlagen, einsystem( "cls" );
mit
kynarion schrieb:
#include <conio.h> #include <iostream> int main() { cout << "Bla und blubb" << endl; clrscr( ); cout << "gelöscht" << endl; }
zu ersetzen.
Damit ist dein Programm nicht nur Platformabhängig, sondern sogar Compilerabhängig (nämlich von Borland), was meines Erachtens schlimmer ist, als ein system( )-Aufruf.kynarion schrieb:
Ansonsten gestehe ich alle von Dir genannten Fehler meinerseits ein.
ach komm, nicht Schmollen...
kynarion schrieb:
Tja, das sind die Swordfish-Lösungen. Die sind perfekt, da kann man nichts sagen.
Leider nicht.
Flyde schrieb:
Ich hätte nicht gedacht das ich leute so zum disktuieren bringe mit einem simplen RECHNER *g*
Kein Problem ist simpel genug, um nicht darüber streiten - ähm nein - diskutieren zu können
Greetz, Swordfish
-
Ich würde die compileranhängigkeit von Borland einfach durch das äußerst schöne Framework Improved Console umgehen, dort gibt es ebenfalls ein clrscr(); und damit wärst du dann zumindest nicht mehr compilerabhängig, aber auf jedenfall noch auf Windows beschränkt, denn da muss ich Swordfish rechtgeben, das Löschen des Bildschirms ist immer von der Plattform abhängig.
-
Genau desswegen hab' ich eine clrscr() in meinem vorletzten Post implementiert, um nicht die IC mitschleppen zu müssen.
Greetz, Swordfish