Taschenrechner



  • Hallo Leute,
    ich programmiere gerade einen Taschenrechner, der mehrere Berechnungen durchführen kann. Leider ist er noch nicht ganz vollständig (macht aber nichts). Ich wollte eigentlich nur die "goto-Befehle" etwas üben. Der (lange) Quellcode ist vielleich etwas verwirrend und manchmal etwas umständlich geschrieben, aber das Programm funktioniert im Großen und Ganzen so, wie ich es mir vorgestellt habe...

    Könnt ihr mein Programm vielleich mal testen (Quellcode kopieren) und mir sagen,
    -was ihr daran gut findet und was nicht
    -welche Verbesserungsvorschläge ihr habt
    -ob es ein guter Programmierstiel ist
    -ob es Fehlerquellen gibt

    Das wärvielleicht nett und hilfreich.

    /********************* PROGRAMM ZUR MATHEMATIK******************************/
    
    #include <iostream>
    #include <iomanip>
    #include <cmath>
    #include <string>
    #include <cctype>
    using namespace std;
    
    int main()
    {
    	bool ok = true;
    	int ziffer,ziffer_2;
    	double a,b,ergebnis,kreis,radius,laenge,breite,a_rechteck,erg,seite_a,hoehe_hc,seite_c,a_dreieck;
    	double u_kreis,basis,wurzelzahl,ergebnis_1,potenz,ergebnis_2,ergebnis_3;
    	char buchstabe,gross,hilfe,hilfe_2;
    	const double pi = 3.14;
    
    	cout << "\t*******************************************************" <<endl;
    	cout << "\t************** DER GROSSE TASCHENRECHNER **************" <<endl;
    	cout << "\t*******************************************************\n\n" <<endl;
    oben:	
    	cout << "Moechten Sie die \"PROGRAMMHILFE\" ansehen\? " <<endl;
    	cout << "<J> = Ja\n<N> = Nein " <<endl;
    	cin >>hilfe;
    	hilfe_2 = toupper(hilfe);
    	if(hilfe_2 == 'J')
    		goto programmhilfe;
    	else if(hilfe_2 == 'N')
    		goto anfang;//weiter
    	else
    		cout << "Das war nicht der entsprechende Buchstabe.\n " <<endl;
    		goto oben;
    
    anfang:
    
    	while(true && ok )
    	{
    
    	cout << "------------------------------------------------------------------------------ " <<endl;
    	cout << "AUSWAHLMOEGLICHKEITEN: " <<endl;
    	cout << "------------------------------------------------------------------------------ " <<endl;
    	cout << "<1> TASCHENRECHNER\n<2> FLAECHENINHALT\n<3> UMFANG  "<<endl;
    	cout << "<4> WURZEL\n<5> POTENZ\n<6> FORMELSAMMLUNG\n<7> PROGRAMMHILFE\n<8> BEENDEN\n "<<endl;
    	cout << "Ziffer: ";
    	cin  >> ziffer;
    	cout << "------------------------------------------------------------------------------ " <<endl;
    
    	switch(ziffer)
    	{
    /****************************************************************************************************/
    	case 1:
    /***************************************************************************************************/
    			cout << "\n\n*******************************************************************************" <<endl;
    			cout << "******************************** TASCHENRECHNER *******************************" <<endl;
    			cout << "*******************************************************************************\n" <<endl;
    			cout << "2 Zahlen eingeben: \n" <<endl;
    			cout << "Zahl 1: ";
    			cin >>a;
    			cout << "Zahl 2: ";
    			cin >>b;
    
    			cout << "\nOPERATOREN: <1> = PLUS (+) "<< endl;
    			cout << "\t    <2> = MINUS (-)"<< endl;
    			cout << "\t    <3> = MAL (*) " << endl;
    			cout << "\t    <4> = GETEILT (/)\n" <<endl;
    			cout << "Ziffer: ";
    			cin >>ziffer_2;
    			cout << "------------------------------------------------------------------------------ " <<endl;
    
    			switch(ziffer_2)
    			{
    			case 1:
    					ergebnis = a + b;
    					cout << "ERGEBNIS: " <<ergebnis  <<endl;
    					cout << "------------------------------------------------------------------------------ \n" <<endl;
    					break;
    			case 2:
    					ergebnis = a - b;
    					cout << "ERGEBNIS: " <<ergebnis  <<endl;
    					cout << "------------------------------------------------------------------------------ \n" <<endl;
    					break;
    
    			case 3:
    					ergebnis = a * b;
    					cout << "ERGEBNIS: " <<ergebnis  <<endl;
    					cout << "------------------------------------------------------------------------------ \n" <<endl;
    					break;
    
    			case 4: 
    					ergebnis = a / b;
    					cout << "ERGEBNIS: " <<ergebnis  <<endl;
    					cout << "------------------------------------------------------------------------------ \n" <<endl;
    					break;
    			default:
    					cout << "Das war keine der entsprechenden Ziffern. \n" <<endl;
    
    			}
    				if(true)
    				goto anfang;
    
    /***************************************************************************************************/
    	case 2:
    /***************************************************************************************************/
    			cout << "FLAECHENINHALT VON: " <<endl;
    			cout << "------------------------------------------------------------------------------" <<endl;
    			cout << "<A> KREIS\n<B> RECHTECK\n<C> QUADRAT\n<D> DREIECK \n" <<endl;
    			cout << "Buchstabe: " ;
    			cin >>buchstabe;
    			gross = toupper(buchstabe);
    
    			switch(gross)
    			{
    			case 'A':
    					cout << "\n" <<endl;
    					cout << "\n*******************************************************************************" <<endl;
    					cout << "*************************** FLAECHENINHALT VON KREIS **************************" <<endl;
    					cout << "*******************************************************************************\n" <<endl;
    					cout << "Radius eingeben: " ;
    					cin >>radius;
    					cout << "PI: 3,14\n" <<endl;
    					kreis = radius * radius * pi;
    					cout << "-------------------------------------------------------------------------------" <<endl;
    					cout << "ERGEBNIS: " <<kreis <<endl;
    					cout << "-------------------------------------------------------------------------------\n" <<endl;
    					break;
    
    			case 'B':
    					cout << "\n" <<endl;
    					cout << "\n*******************************************************************************" <<endl;
    					cout << "************************** FLAECHENINHALT VON RECHTECK ************************" <<endl;
    					cout << "*******************************************************************************\n" <<endl;
    					cout << "Breite: ";
    					cin >>breite;
    					cout << "Laenge: ";
    					cin >>laenge;
    					a_rechteck = laenge * breite;
    					cout << "-------------------------------------------------------------------------------" <<endl;
    					cout << "ERGEBNIS: " <<a_rechteck <<endl;
    					cout << "-------------------------------------------------------------------------------\n" <<endl;
    					break;
    
    			case 'C':
    					cout << "\n" <<endl;
    					cout << "\n*******************************************************************************" <<endl;
    					cout << "*************************** FLAECHENINHALT VON QUADRAT ************************" <<endl;
    					cout << "*******************************************************************************\n" <<endl;
    					cout << "Seite a: ";
    					cin >>seite_a;
    					erg = seite_a * seite_a;
    					cout << "-------------------------------------------------------------------------------" <<endl;
    					cout << "ERGEBNIS: " <<erg <<endl;
    					cout << "-------------------------------------------------------------------------------\n" <<endl;
    					break;
    
    			case 'D':
    					cout << "\n" <<endl;
    					cout << "\n*******************************************************************************" <<endl;
    					cout << "*************************** FLAECHENINHALT VON DREIECK ************************" <<endl;
    					cout << "*******************************************************************************\n" <<endl;
    					cout << "Seite c: ";
    					cin >>seite_c;
    					cout << "Hoehe hc: ";
    					cin >>hoehe_hc;
    					a_dreieck = (seite_c * hoehe_hc) / 2;
    					cout << "------------------------------------------------------------------------------" <<endl;
    					cout << "ERGEBNIS: " <<a_dreieck <<endl;
    					cout << "------------------------------------------------------------------------------\n" <<endl;
    					break;
    			}
    			goto anfang;
    
    /***************************************************************************************************/
    	case 3:
    /***************************************************************************************************/
    			cout << "UMFANG VON: " <<endl;
    			cout << "-------------------------------------------------------------------------------" <<endl;
    			cout << "<A> KREIS\n<B> RECHTECK\\QUADRAT\n" <<endl;
    			cout << "Buchstabe: " ;
    			cin >>buchstabe;
    			gross = toupper(buchstabe);
    
    			switch(gross)
    			{
    			case 'A':
    					cout << "\n\n" <<endl;
    					cout << "*******************************************************************************" <<endl;
    					cout << "******************************** UMFANG VON KREIS *****************************" <<endl;
    					cout << "*******************************************************************************\n" <<endl;
    					cout << "Radius eingeben: " ;
    					cin >>radius;
    					cout << "PI: 3,14\n" <<endl;
    					u_kreis = (radius + radius) * pi;
    					cout << "-------------------------------------------------------------------------------" <<endl;
    					cout << "ERGEBNIS: " <<u_kreis <<endl;
    					cout << "-------------------------------------------------------------------------------\n" <<endl;
    					break;
    
    			case 'B':
    					cout << "\n\n" <<endl;
    					cout << "*******************************************************************************" <<endl;
    					cout << "************************** UMFANG VON RECHTECK\\QUADRAT ***********************" <<endl;
    					cout << "*******************************************************************************\n" <<endl;
    					cout << "Länge engeben: ";
    					cin >>laenge;
    					cout << "Breite eingeben: ";
    					cin >>breite;
    					ergebnis_3 = laenge * breite;
    					cout << "-------------------------------------------------------------------------------" <<endl;
    					cout << "ERGEBNIS: " <<ergebnis_3 <<endl;
    					cout << "-------------------------------------------------------------------------------\n" <<endl;
    					break;
    
    			}
    			goto anfang;
    
    /***************************************************************************************************/
    	case 4:
    /***************************************************************************************************/
    			cout << "\n\n*******************************************************************************" <<endl;
    			cout << "******************************* WURZELBERECHNUNG ******************************" <<endl;
    			cout << "*******************************************************************************\n" <<endl;		
    			cout << "Zahl eingeben: ";
    			cin >>wurzelzahl;
    			ergebnis_1 = sqrt(wurzelzahl);
    			cout << "-------------------------------------------------------------------------------" <<endl;
    			cout << "ERGEBNIS: " <<ergebnis_1 <<endl;
    			cout << "-------------------------------------------------------------------------------\n" <<endl;
    			break;
    
    			goto anfang;
    
    /***************************************************************************************************/
    	case 5:
    /***************************************************************************************************/
    			cout << "\n\n*******************************************************************************" <<endl;
    			cout << "******************************* POTENZBERECHNUNG ******************************" <<endl;
    			cout << "*******************************************************************************\n" <<endl;	
    			cout << "Basis: ";
    			cin >>basis;
    			cout << "Potenz: ";
    			cin>> potenz;
    			ergebnis_2 = pow(basis, potenz);
    			cout << "-------------------------------------------------------------------------------" <<endl;
    			cout << "ERGEBNIS: " <<ergebnis_2 <<endl;
    			cout << "-------------------------------------------------------------------------------\n" <<endl;
    			break;
    
    			goto anfang;
    
    /***************************************************************************************************/
    	case 6:
    /***************************************************************************************************/
    			cout << "\n\n*******************************************************************************" <<endl;
    			cout << "******************************** FORMELSAMMLUNG *******************************" <<endl;
    			cout << "*******************************************************************************\n" <<endl;	
    
    			//EVENTUELLE FORMELN ZUR ÜBERSICHT...
    			break;
    
    			goto anfang;
    /***************************************************************************************************/
    	case 7:			
    /**************************************************************************************************/						
    programmhilfe:
    			cout << "\n" <<endl;
    			cout << "\n*******************************************************************************" <<endl;
    			cout << "******************************** PROGRAMMHILFE ********************************" <<endl;
    			cout << "*******************************************************************************\n" <<endl;	
    			cout << "Das hier ist ein Programm, mit dem sie eine Vielzahl an mathematischen " <<endl;
    			cout << "Berechnungen durchfueren koennen. Unter dem Begriff \"Auswahlmoeglichkeiten\"   " <<endl;
    			cout << "stehen Ihnen mehrere Kategorien zur verfuegung. Haben Sie sich fuer eines ent-" <<endl;
    			cout << "schieden, so druecken Sie bitte die entsprechende Ziffer, die links neben  " <<endl;
    			cout << "dem Namen der Kategorie in Klammern steht. Manche Kategorien enthalten  " <<endl;
    			cout << "Unterprogramme, bei denen sie den entsprechenden Buchstaben (gross/klein) " <<endl;
    			cout << "druecken muessen. \n" <<endl;
    oben_2:
    			cout << "Programmhilfe verlassen\?" <<endl;
    			cout << "<J> = Ja\n<N> = Nein\n" <<endl;
    			cin >>hilfe;
    			hilfe_2 = toupper(hilfe);
    			if(hilfe_2 == 'J')
    				goto anfang;
    			else if(hilfe_2 == 'N')
    				goto programmhilfe;
    			else
    				cout << "Das war nicht der entsprechende Buchstabe.\n " <<endl;
    				goto oben_2;
    
    /***************************************************************************************************/
    	case 8:			
    /**************************************************************************************************/						
    			ok = false;
    			goto anfang;
    
    }
    }
    }
    

    Ich hoffe, euch gefällts...
    Bis bald, euer zocker001 😉



  • Also, nicht gut finde ich Deine Verwendung von goto. Du solltest lieber Funktionen aus Deinen goto-Blöcken machen, das macht die Sache deutlich übersichtlicher. Und auch die goto-labels sind nicht besonders geschickt benannt... oben_2 spricht jetzt nicht gerade eine deutliche Sprache.

    MfG Jester



  • Danke für den Tipp...
    aber ich habe Funktionen noch nie selber geschrieben, außer

    int main()
    

    Da ich C++ nach den Kapiteln eines Buches lerne, wurden diese leider noch nicht angesprochen, bzw ich habe das Kapitel noch nicht gelese.

    Ciao...zocker001 🙂



  • zocker001 schrieb:

    Ich wollte eigentlich nur die "goto-Befehle" etwas üben.

    omg. Schließe deine Übungen mit der folgenden Regel ab:
    Vermeide goto!

    Dein Stil gefällt mir überhaupt nicht, da du:

    - gleichartigen Code ständig wiederholst
    - goto benutzt (siehe oben)
    - keine Fehlerbehandlung machst (Division durch 0)
    - Variablen benutzt, wo keine notwendig sind



  • Warum soll ich goto-Befehle vermeiden???
    Für mich waren sie eine eine Hilfe...

    Es ist doch egel, ob ich Variable überschreibe oder nicht, schlieslich sollen ja nur die Werte verwendet werden, die bei der Berechnung wichtig sind, oder?

    Nenn mir doch mal ein paar Beispiele. Mit "Divison durch 0" kann ich nicht viel anfangen.

    Kannst du wenigstens etwas (psitives :D) über die Funktionalität des Programms sagen. Hast dus ausprobiert???

    Danke für deine Antworten. Ich hab das nicht böse gemeint, schlieslich habe ich ja danach gefragt!

    Ciao..zocker001 😉



  • Eine Divison durch null ist z.b.: 1/0=?

    Das Ergebnis einer Division durch null ist in der mathematik nicht definiert! 😉



  • Oh, stimmt, du hast ja recht... 🤡

    Aber wie behebe ich die Fehler???? Etwa mit

    cin.clear()
    

    oder was 😕 😕 😕

    Danke...
    zocker001 😉

    PS: Hats den wenigstens jemand getestet...



  • Du könnest bei der Berechnung überprüfen ob der Divisor null ist und wenn ja könnest du einfach neue Eingaben anfordern.

    if(b==0){
    
    cout<<"Divisor ist null";
    //goto eingabenanforderung
    
    }
    


  • Mir gefällt dein Stil auch nicht. Drei Gründe:
    - goto-Anweisungen machen das Programm unverständlich
    - nicht eindeutige Bezeichnung von goto-Labels
    - keine Funktionen (ausser main())

    Funktionen sind im Grunde ganz einfach. Hier ist einmal ein primitives Beispiel:

    #include <iostream>
    using namespace std;
    
    int helloworld(); //Deklaration der Funktion helloworld() mit dem Rückgabetyp int
    
    int main()
    {
    
       helloworld(); //Ausführen der Funktion helloworld()
    
    }
    
    int helloworld()
    {
       cout << "Hello World!\n";
    }
    

    Ich hoffe, das hilft dir etwas.



  • Wieso wird mein Code nicht rightig angezeigt? Bin ich etwa zu blöd dazu?



  • #include <iostream>
    using namespace std;
    
    int helloworld(); //Deklaration der Funktion helloworld() mit dem Rückgabetyp int
    
    int main()
    {
    helloworld(); //Ausführen der Funktion helloworld()
    }
    
    int helloworld()
    {
    cout << "Hello World!\n";
    }
    

    hmm ich würde entweder meine " int funk()" was zurückgeben lassen , oder in diesem Fall "void hellworld(){...}" benutzen.
    zu deiner frage:
    nimm mal die c/c++ tags und nicht die code tags 🙂



  • Sorry, ich hab was vergessen. Hier ist der korrigierte code

    #include <iostream>
    using namespace std;
    
    int helloworld(); //Deklaration der Funktion helloworld() mit dem Rückgabetyp int
    
    int main()
    {
        helloworld(); //Ausführen der Funktion helloworld()
        return 0;
    }
    
    int helloworld()
    {
        cout << "Hello World!\n";
        return 0;
    }
    


  • [cpp] funktioniert auch nicht.



  • Ja gut, ich habs ja verstanden, dass ihr gegen die goto-Befehle seid (bei den nächsten Quellcodes, die ich hier im Forum verwende, vermeide ich sie).
    Für den Programmierer (also ich) sind sie doch nicht unverständlich (meine Meinung).

    So ungefähr habe ich schon von dem Aufbau der Funktionen gehört, aber ich warte lieber bis zu dem entsprechenden Kapitel in meinem Buch.
    Aber trotzdem vielen Dank...

    mfg
    zocker001 😉

    PS: Bitte, bitte, bitte, testet doch bitte das Programmm 😡
    Ich möchte eure Meinung dazu hören...



  • zocker001 schrieb:

    Da ich C++ nach den Kapiteln eines Buches lerne, wurden diese leider noch nicht angesprochen, bzw ich habe das Kapitel noch nicht gelese.

    Ciao...zocker001 🙂

    hallo,

    also ich habe den code mal ausprobiert, läßt sich kompilieren und läuft auch alles, soweit mich meine kopfrechenfähigkeiten nicht betrügen. soweit also mal ein LOB 😉
    allerdings, was ich mich frage, nach was für einem buch lernst du denn c++ bzw von wann ist das buch?? goto war doch schon zu zeiten der prozeduralen programmierung stark verpöhnt, aber das dann in zeiten der oop zu lehren...
    das nächste, schreibe mal ans ende deines quelltextes ein

    return 0;
    

    dies ist zwar nicht zwingend notwendig, aber guter stil. und da man bei guten betriebssystemen den exitstatus eines programms aufrufen kann auch ganz sinnvoll.
    ansonsten macht das programm das was es soll, und das ist, jedenfalls nach meinung meines c-dozenten, das wichtigste! meine pascal und c++ - dozenten sehen das ganze zwar ganz anders, aber am anfang ist es doch wichtiger erstmal die werkzeuge kennen zu lernen als auf guten stil zu achten. aber vergiss bitte so schnell wie möglich, daß es soetwas wie goto überhaupt gibt 😉
    wenn du noch keine funktionen schreiben kannst ist das auch kein problem, man kann auch vollkommen ohne sie auskommen, sie erhöhen aber die wartbarkeit erheblich und sie sind eigentlich gar nicht kompliziert. wie int main(), nur, daß in den klammern noch parameter stehen und anstelle von int jeder beliebige datentyp stehen kann und anstelle von main dein selbst gewählter funktionsname (welcher meistens das größte problem darstellt). auf die frage, was ihr größter fehler gewesen sei, sagten die erfinder von c und linux, daß sie die funktion strcpy() (stringcopy) nicht strcp() oder strcopy() genannt haben... 😉

    also, mach weiter so und lass dich nicht entmutigen wenn manche leute, zwar mit gutem grund, deinen stil kritisieren. das kommt schon fast von alleine wenn du ein bissl drauf achtest, die werkzeuge zu beherschen ist schwieriger und wichtiger als der stil!

    grüße,

    Sternenstaub



  • Warum bei "2113114847" der Code nicht angezeigt wird, ist mir ein Rätsel...
    Sehr komisch, den ich mach das selbe wie du und bei mir klappts...

    mfg
    zocker001 😉



  • An Sternenstaub:

    Danke, dass dir mein Programm gefallen hat. 🙂
    Du hast ja vollkommen recht. Ich sollte mich eher auf das Lernen von C++ konzentrieren, als jetzt schon am Programmierstil zu feilen.

    Das Buch, das ich besitze heißt: "C++ lernen und professionell anwenden"
    Meiner Meinung nach bis jetzt ein sehr gutes Buch. Das Erscheinungsjahr dürfte soweit ich weiß bei 2002 liegen. Die goto-Befehle wurden zwar nur kurz erläutert, aber ich fand sie irgendwie (auch jetzt noch :D)hilfreich, auch wenn das andere nich so sehen (den Grund dafür weiß ich bis heute noch nicht...ist aber auch egal). Es wurden auch Makros zur Änderung der Farben angesprochen, die bei mir allerdings nicht funktionierten. Andere Leute haben mir bei den Makros auch geraten, die Finger davon zu lassen.

    Nochmals danke....
    grüße von zocker001
    Ciao... 🙂 🙂 🙂

    Übrigens: Wenn ich bei den Funktionen angelangt bin, werde ich mit Sicherheit wieder ein paar Beiträge schreiben...bestimmt 😉



  • Das mit den farben: Sicherlich ansi-escape-sequenzen, und du hast winXP?
    Warum goto net so toll ist, merkst du spätestens dann, wenn Funktionen behandelt werden...
    Achja:@2113114847:
    Hast du vielleicht bb-code deaktiviert? (Bei optionen)



  • Ne, hab Windows 98.



  • Zu 2113114847:

    Wenn du dir nicht Sicher bist, ob dein Code richtig angezeigt wird, verwende doch mal die Vorschau-Funktion.

    grüße von
    zocker001 🙂


Anmelden zum Antworten