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( &ltime );
         cout << ctime( &ltime ) ;
    	 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.


Anmelden zum Antworten