Programm mit Taschenrechner
-
Was haltet ihr von diesem Programm:
Main.cpp
#include "myheader.h" int hausaufgabe() { cout << "Bitte geben sie zwei Zahlen ein!" << endl; cout << "Zahl 1= "; cin >> zahl1; cout << "\nZahl 2= "; cin >> zahl2; a = zahl1/2; b = -a; c = pow(a,2); d = c-zahl2; e = sqrt(d); ergebnis_ha = b + e; cout << "Das Ergebnis ist: " << ergebnis_ha; wait(); return 0; } int speichern() { fstream datei; datei.open("test.txt", ios::out); datei << "Test!!!\nDas ist kein Easteregg!!! \nSondern eine Test Datei!!!" << endl; datei.close(); return 0; } int rechnomathelp() { cls(); cout << "Rechnomat Hilfe\n\n\n\n\n\n\n"; cout << "Operanden:\n\n"; cout << "Addieren (+) (1+1)\n"; cout << "Subthahieren (-) (2-1)\n"; cout << "Multiplitzieren (*) (2*2)\n"; cout << "Dividieren (/) (3/2)\n"; cout << "Quadratwurzel errechnen (~) (34569~)\n"; cout << "'Modulo (%) (50%4)'\n"; cout << "Hochrechnen (#) (2#8)\n\n\n\n"; cout << "Bitte dr" << ue <<"cken sie eine belibige Taste zum Fortfahren\n"; wait(); return 0; } int version() { cout << "Version 0.4.1\n"; cout << "Weiter mit beliebiger Taste\n"; wait(); return 0; } int adminmode() { cls(); cout << "Admin Modus\n\n\n\n\n\n\n"; cout << "Was m" << oe << "chten sie hier machen?\n\n"; cout << "<1> Rechnomat Hilfe aufrufen\n"; cout << "<2> Test datei speichern\n"; cout << "<3> Uhrzeit anzeigen\n"; cout << "<4> Hausaufgabe\n"; cout << "<5> CPU Angaben\n"; cout << "<6> Warten\n"; cout << "<7> <Platzhalter>\n"; cout << "<8> <Platzhalten>\n"; cout << "<9> Zur"<< ue << "ck \n\n"; cin >> adminauswahl; switch(adminauswahl) { case 1: rechnomathelp(); break; case 2: speichern(); break; case 3: uhrzeit(); break; case 4: hausaufgabe(); break; case 5: cout << "Ihr Computer hat "; printf ("%f MHZ\n", CPUClock()); cout << "Weiter mit beliebiger Taste\n"; wait(); break; case 6: Sleep (5000); return 0; break; case 7: return 0; case 8: return 0; case 9: return 0; break; } cls(); adminmode(); return 0; } int pseudo() { int seed1 = time(NULL); CPUClock(); cls(); cout << "Zufallsgenerator\n\n\n\n\n\n\n"; int seed = time(NULL); srand(seed); int min, max; cout << "Bitte geben sie die kleinste und danach die groe" << ss << "te m" << oe << "gliche Zufallszahl ein\n" << endl; cin >> min >> max; cls(); cout << "Zufallsgenerator\n\n\n\n\n\n\n"; cout << "Wie viele Zufahlszahlen m" << oe << "chten sie erstellen?\n"; cin >> pseodowahl; int seed0 = time(NULL); int range = max - min + 1; while (pseodowahl == 12993) { cout << "Seed= " << seed << "\nSeed0= " << seed0 << endl; wait(); return 0; } for (int i = 0; i < pseodowahl; i++) { int ausgabe = rand()*seed; int seed2 = time(NULL); ausgabe = (ausgabe * seed2 + pseodo % ausgabe * ausgabe + cpuleistung / seed0) % range + min; ausgabe = (ausgabe * ausgabe) * (seed % seed1) % range + min; cout << ausgabe << " "; pseodo = ausgabe; } cout << endl; cout << "Bitte druecken sie irgendeine Taste um ins Men" << ue << " zurueck zu gelangen" << endl; wait(); return 0; } int copyright() { cls(); cout << "Anmerkungen\n\n\n\n\n\n\n"; cout << "Diese Software ist Open Source.\n"; cout << "Wenn sie sich den Quelltext ansehen m" << oe << "chten, melden sie sich bei mir.\n"; cout << "E-mail: 'je2r67emx@jere78228mxmo4ses.de' (Ohne '' und Zahlen).\n\n"; cout << "Bitte dr" << ue << "cken sie irgendeine Taste um zum Men" << ue << " zurueck zu gelangen\n\n"; wait(); return 0; } int rechnomat() { bool do_exit( false ); do { con.clear( ); con.setCurPos( 0, 0 ); cout << "Willkomen bei Rechnomat\n\n\n\n\n\n\n"; cout << "Dein Term: \n"; cout << "Ergebnis: \n\n"; con.setCurPos( 10, 7 ); flush_stdin( ); string calculation; getline( cin, calculation ); con.setCurPos( 0, 10 ); cout << "Dr" << ue << "cken sie 'x' zum beenden: " << std::flush; stringstream ss( calculation ); stringstream::char_type op; float operand[ ] = { 0.f, 0.f }; bool input_is_valid ( false ); if( ss >> operand[ 0 ] ) { ss >> op; if( ( op == '+' ) || ( op == '-' ) || ( op == '*' ) || ( op == '/' ) || (op == '#') || (op == '~') ) { if( ss >> operand[ 1 ] ) { input_is_valid = true; } } } float result( 0.f ); con.setCurPos( 10, 8 ); if( input_is_valid ) { switch( op ) { case '+': result = operand[ 0 ] + operand[ 1 ]; break; case '-': result = operand[ 0 ] - operand[ 1 ]; break; case '*': result = operand[ 0 ] * operand[ 1 ]; break; case '/': result = operand[ 0 ] / operand[ 1 ]; break; case '#': result=pow(operand[ 0 ],operand[ 1 ]); break; case '~': result=sqrt(operand[ 0 ]); break; } cout << result << flush; } else { cout << "Ung" << ue << "ltige Eingabe!" << flush; } flush_stdin( ); do_exit = tolower( cin.get( ) ) == 'x'; } while( !do_exit ); return 0; } int main() { cout << "Willkommen!!!\n\n\n\n\n\n\n"; cout << "Was m" << oe << "chten sie hier machen?\n\n"; cout << "<1> Rechnen\n"; cout << "<2> Zufahlszahlen generieren\n"; cout << "<3> Anmerkungen lesen\n"; cout << "<4> Version\n"; cout << "<5> Beenden\n\n"; cin >> auswahl; switch(auswahl) { case 1: rechnomat(); break; case 2: pseudo(); break; case 3: copyright(); break; case 4: version(); break; case 5: exit(0); break; case 12993: adminmode(); break; } cls(); main(); }
myheader.h
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <conio.h> #include <time.h> #include <cmath> #include <fstream> #include <windows.h> #include <cctype> #include <sstream> #include "ic.hpp" /* Funktionen: cpuleistung = Cpuleistung in MHZ. ( CPUClock() ) wait = Verbesserter 'getch()' Befehl cls() = Verbesserter 'system("CLS")' Befehl */ const unsigned char AE = static_cast<unsigned char>(142); const unsigned char ae = static_cast<unsigned char>(132); const unsigned char OE = static_cast<unsigned char>(153); const unsigned char oe = static_cast<unsigned char>(148); const unsigned char UE = static_cast<unsigned char>(154); const unsigned char ue = static_cast<unsigned char>(129); const unsigned char ss = static_cast<unsigned char>(225); using namespace std; int auswahl,auswahl2; int adminauswahl; int test; int pseudotest; int zahl1,zahl2; long double a,b,c,d,e; int ergebnis_ha; long double cpuleistung2; int cpuleistung; int pseodo; int pseodowahl; void wait () { FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE)); getch(); } double CPUClock (void) { int DelayTime = 500; DWORD TimerHi, TimerLo; int PriorityClass, Priority; PriorityClass = GetPriorityClass(GetCurrentProcess()); Priority = GetThreadPriority(GetCurrentThread()); SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS); SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL); Sleep(10); __asm { rdtsc mov TimerLo, eax mov TimerHi, edx } Sleep (DelayTime); __asm { rdtsc sub eax, TimerLo sbb edx, TimerHi mov TimerLo, eax mov TimerHi, edx } SetThreadPriority(GetCurrentThread(), Priority); SetPriorityClass(GetCurrentProcess(), PriorityClass); cpuleistung2 = floor(TimerLo / (1000.0 * DelayTime)); cpuleistung = cpuleistung2; return (double)TimerLo / (1000.0 * DelayTime); } int uhrzeit() { time_t ltime; time( <ime ); cout << ctime( <ime ) ; cout << "Weiter mit belibiger Taste" << endl; wait(); return 0; } void flush_stdin( ) { std::cin.ignore( std::cin.rdbuf( )->in_avail( ), '\n' ); std::cin.clear( ); } void cls (void) { HANDLE hStdOut; hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); COORD corddest; DWORD lpNumberOfCharsWritten; DWORD lpNumberOfAttrsWritten; corddest.X = 0; corddest.Y = 0; FillConsoleOutputCharacter ( hStdOut,' ',80*25,corddest,&lpNumberOfCharsWritten); FillConsoleOutputAttribute (hStdOut,FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE,80*25,corddest,&lpNumberOfAttrsWritten); SetConsoleCursorPosition (hStdOut,corddest); }
Kritik oder Anregungen erwünscht.
Bitte, falls ihr es besser könnt, verbessert dieses Programm!!!
Danke im voraus,
Jermuk
-
int main() { ... cout << "<5> Beenden\n\n"; cin >> auswahl; switch(auswahl) { ... } system("CLS"); main(); // <--- :open_mouth: }
Warum hast Du in der main () nicht auch ein do/while-Konstrukt wie in rechnomat () ???
-
merker schrieb:
int main() { ... cout << "<5> Beenden\n\n"; cin >> auswahl; switch(auswahl) { ... } system("CLS"); main(); // <--- :open_mouth: }
Warum hast Du in der main () nicht auch ein do/while-Konstrukt wie in rechnomat () ???
Wie füge ich denn das ein???
Ist dieses Do-while schneller???
Danke im voraus,
Gruß Jermuk
-
Schneller nicht, aber
ISO/IEC 14882:2003 schrieb:
3.6.1 Main function [basic.start.main]
[...]
3 The function main shall not be used (3.2) within a program.Jermuk schrieb:
Bitte, falls ihr es besser könnt, verbessert dieses Programm!!!
Wohl kaum ...
Jermuk schrieb:
Kritik oder Anregungen
... hingegen gerne:
Wilkommen bei Rechnomat!!! Bitte geben sie ihren Term ein und bestätigen mit <Enter>: 1 * 1 Das Ergebnis von: 110.000000 1.000000 Ist gleich: 1.000000
noch besser:
Wilkommen bei Rechnomat!!! Bitte geben sie ihren Term ein und bestätigen mit <Enter>: 1+2+3 Das Ergebnis von: 212.000000 + 3.000000 Ist gleich: 215.000000
Wirklich wichtig:
Diese Software ist Open Source. Wenn sie sich den Quelltext ansehen möchten, melden sie sich bei mir. ???
greetz, Swordfish
-
Swordfish schrieb:
Bitte geben sie ihren Term ein und bestätigen mit <Enter>:
1+2+3
Das Ergebnis von: 212.000000 + 3.000000
Ist gleich: 215.000000[/code]Wie kann man denn das verbessern? *Peinlich sei*
-
zu Deinem Code:
int rechnomat( void ) // Warum hat diese Funktion einen Ryckgabetyp? void ist überflüssig. { char /* rechnung[ 64 ], */ _operator; // in C++ benutzt man für Zeichenketten: std::string rechnung; float erster_wert, zweiter_wert, resultat; int mult /*, cnt */; // <- siehe strlen( ) unten. do { system( "cls" ); // sehr unschön. ImprovedConsole vielleicht? cout << "Wilkommen bei Rechnomat!!!\n\n\n\n"; cout << "Bitte geben sie ihren Term ein und best"<< ae <<"tigen mit <Enter>:\n\n"; fflush( stdin ); // Eingabestreams fflushen gibt undefiniertes Verhalten, gets( rechnung ); // gets( ) gefährlich (Buffer Overflows) und ist außerdem C. cnt = ( int ) strlen( rechnung ) - 1; // strlen( ) gibt einen size_t zurück und keinen int. mult = 1; zweiter_wert = 0; // für soetwas gibt's for-Schleifen... while( rechnung[ cnt ] >= '0' && rechnung[ cnt ] <= '9' ) { zweiter_wert += ( rechnung[ cnt ] & 0x0f )* mult; // die Notwendigkeit des & Operators mult *= 10; // offenbart sich mir nicht. cnt--; } _operator = rechnung[ cnt ]; // und was ist, wenn rechnung[ cnt ] weder '#', '+', '-', '/', '*' noch '~' ist? cnt--; mult=1; erster_wert=0; while(cnt>=0){ erster_wert+=(rechnung[cnt]&0x0f)*mult; mult*=10; cnt--; } switch(_operator){ /* ... */ } // schöner Mix aus C und C++: printf("\nDas Ergebnis von: %f %c %f\nIst gleich: %f\n\n\n\n\n",erster_wert,_operator,zweiter_wert,resultat); cout << "Dr" << ue << "cken sie q um zum Men" << ue << " zur" << ue << "ck zu gelangen.\n"; cout << "Wenn sie Weitermachen m" << oe << "chten dr" << ue << "cken bitte Enter.\n\n"; } while(getchar()!='q'); return 0; }
Jermuk schrieb:
Wie kann man denn das verbessern? *Peinlich sei*
So zum Beispiel:
#include <cctype> // std::tolower( ) #include <string> // std::string #include <sstream> // std::stringstream #include <iostream> #include <ic.hpp> // ImprovedConsole void flush_stdin( ) { std::cin.ignore( std::cin.rdbuf( )->in_avail( ), '\n' ); std::cin.clear( ); } int main( ) { ic::con.setWndSize( 60, 12 ); ic::con.setTitle( "The Calculator with a CLUE" ); bool do_exit( false ); do { ic::con.clear( ); ic::con.setCurPos( 0, 0 ); std::cout << "Welcome to the Calculator with a CLUE\n\n"; std::cout << "your calculation:\n"; std::cout << " result:\n\n"; std::cout << "Use the form [num][op][num]\n\n"; std::cout << "Where [num] is any decimal number\n"; std::cout << " and [op] one of +, -, * and /\n" << std::endl; ic::con.setCurPos( 18, 2 ); flush_stdin( ); std::string calculation; std::getline( std::cin, calculation ); ic::con.setCurPos( 0, 10 ); std::cout << "Enter 'x' to exit the application: " << std::flush; std::stringstream ss( calculation ); std::stringstream::char_type op; float operand[ ] = { 0.f, 0.f }; bool input_is_valid ( false ); if( ss >> operand[ 0 ] ) { ss >> op; if( ( op == '+' ) || ( op == '-' ) || ( op == '*' ) || ( op == '/' ) ) { if( ss >> operand[ 1 ] ) { input_is_valid = true; } } } float result( 0.f ); ic::con.setCurPos( 18, 3 ); if( input_is_valid ) { switch( op ) { case '+': result = operand[ 0 ] + operand[ 1 ]; break; case '-': result = operand[ 0 ] - operand[ 1 ]; break; case '*': result = operand[ 0 ] * operand[ 1 ]; break; case '/': result = operand[ 0 ] / operand[ 1 ]; break; } std::cout << result << std::flush; } else { std::cout << "Invalid input!" << std::flush; } flush_stdin( ); do_exit = std::tolower( std::cin.get( ) ) == 'x'; } while( !do_exit ); }
greetz, Swordfish
PS: Die ImprovedConsole gibt's auf http://ic.c-plusplus.net
-
5+5+5=10
ähh, da stimmt was nicht in diesem Programm.
Naja, besser als dass voriege.
Gruß Jermuk.
EDIT: Mein Programm ist jetzt ein bisschen neuer!!!
-
Jermuk schrieb:
ähh, da stimmt was nicht in diesem Programm.
Übungsaufgabe für Dich
greetz, Swordfish
-
Könntest du mir einen Tipp geben?
Wäre dir sehr dankbar!!!
Gruß Jermuk
-
*Push*
So langweilig mein Programm?
Ich hab es jetzt überarbeitet.
Frage: Ich hab immer noch nicht dass mit Do while verstanden.
Wo soll ich anfangen und wo soll ich sie Beenden?
Danke im Voraus,
Gruß Jermuk.