Programm Vorstellung



  • Hi,

    ich bin erst seit kurzem dabei. Habe diesen kleinen Taschenrechner geschrieben, wollte mal fragen, was ihr Experten davon haltet. Hab ich das recht gut gelöst, oder verstoße ich total gegen irgenwelche Regeln?

    Hier mal der kurze Code mit sehr viel Kommentar

    [cpp]
    #include <iostream>
    using namespace std;
    typedef signed short int usi;
    
    //Es wird ein Ergebnis berechnet und zurück an ergebnis geleifert,
    //anhand von Variable operand wird entschieden wie gerechnet wird
    usi berechnen(usi zahl1, char operand,usi zahl2) {
    	switch(operand) {
    		case '+': return(zahl1+zahl2);
    			break;
    		case '-': return(zahl1-zahl2);
    			break;
    		case '*': return(zahl1*zahl2);
    			break;
    	}
            return 0;
    }
    
    int main() {
    	usi zahl1, zahl2;	//Variablen für 2 Zahlen
    	char operand;		//Variable die den Operand erhält
    	usi ergebnis;		//Variable über die Funktion berechnen aufgerufen wird und die das Ergebnis zurückliefert
    
    	cin >> zahl1 >> operand >> zahl2;	//Zahlen und Operand wird eingelesen
    	ergebnis = berechnen(zahl1,operand,zahl2);	//Variable Ergbnis bekommt Funktion berechnen 
    												//zugewiesen,die übergibt die Parameter an berechnen
    												//nun wird berechnen() aufgerufen
    	//Hier wird das berechnete Ergebnis ausgegeben
    	cout <<"\nErgebnis: " << ergebnis << "\n";
    
    	//User wird gefragt was er als nächstes tun möchte
    	cout << "\nWeiter [w] oder Rechner beenden [e]?  ";
    
    	char weiter;	//Variable die über Fortgang entscheidet
    	cin >> weiter;
    	cout << "\n";	//weiter erhält Wert
    
    	//weiter wird getestet und die passende Funktion wird ausgeführt
    	if(weiter == 'w') {	
    		main();
    	}
    	else if(weiter == 'e') {
    		system(0);
    	}
            return 0;
    }
    [/cpp]
    

    Danke für eure Kritik oder Lob :)!



  • Hi timkon,

    Also mir fallen spontan 2 Dinge auf:
    1.:

    typedef signed short int usi;
    

    Das soll ja der Ergebnistyp deiner Berechnungen sein...ich würd dir schlich (signed) long vorschlagen...da long größere Zahlen speichern kann als int

    int ist übrigens automatisch signed 😉

    2.:

    system(0);
    

    ist nicht C++ Standard...bzw Plattform abhängig...würde dir einen Blick in die FAQ empfehlen 👍 (-> cin.get())

    Sonst ist das Programm ja schon map TOP 👍 ...allerdings fehlen da ja noch weitere Std-Rechenarten 😃 klaro^^

    PS: Vllt präsentierst du dein Programm ein bisschen...alá:

    Geben Sie eine Rechenoperation ein:
    

    oder so was 🙄

    Zu guter letzt vllt. noch n kleiner Tipp: Ich weiß nicht, ob dir das gefällt, aber vllt. könntest du bei der Namensgebung deiner Variablen die ungarische Notation mit einbeziehen; Damit fällt es dir vllt später leichter die Variablentypen zu unterscheiden 😉

    Edit: schöner formatiert 🤡


  • Mod

    also wie du darauf kommst, einem short den namen usi zu geben, ist für mich nicht ersichtlich 😉 warum überhaupt dieser kleine typ statt normalem int?

    das break nach einem return ist toter code und überflüssig.

    if(weiter == 'w') {   
            main();
        }
        else if(weiter == 'e') {
            system(0);
        }
    

    main ist eine spezielle funktion und darf als solche nicht aufgerufen werden. das ist trivial zu beheben: bennen die funktion um (z.b. my_main) und ruf in main my_main auf. ob ein rekursiver aufruf hier sinnvoll, halte ich allerdings für zweifelhaft.
    system(0) ist auch recht sinnlos.
    wenn die antwort nicht w lautet, beendet sich das programm ohnehin.



  • Danke für deine Tipps,

    das es automatisch signed ist weiß ich, schreib es lieber dazu. Mit long hast du recht, hätte ich auch vorher drauf kommen können, hab in etwas kleineren Dimensionen gedacht.

    Das mit der ungarischen Notation werd ich mit mal genauer angucken.

    Gruß!


  • Mod

    CodeFinder schrieb:

    Zu guter letzt vllt. noch n kleiner Tipp: Ich weiß nicht, ob dir das gefällt, aber vllt. könntest du bei der Namensgebung deiner Variablen die ungarische Notation mit einbeziehen;

    das muss nun wirklich nicht sein. die namenswahl jetzt ist durchaus gut (sehen wir mal von usi ab :p ).

    Damit fällt es dir vllt später leichter die Variablentypen zu unterscheiden

    sehr vielleicht. und da wir in diesem forum sachlich bleiben wollen, ist es eher unklug, den hinweis auf ungarische notation hier anzubringen 😉



  • Was passiert denn wenn du hier:

    cin >> zahl1 >> operand >> zahl2;
    

    sowas eingibst 😃 😃

    AA ++ BB
    


  • was habt ihr denn gegen usi? 😃 ist doch ganz einfach. usi = unsigned short int.

    Das breake; habe ich entfernt und mit main() hab ich auch geändert.

    Mit dem system(0) werd ich auch nochmal ändern.

    Sonst noch was? 😡 😃

    Achja, mir ist da grad nochwas eingefallen.

    1. Wie lautet denn die Formel um % berechnen zu können, hatte die mal im Kopf 😞
    2. Bei der Frage, was der User tun möchte muss er seine Eingabe ja mit Enter bestätigen, gibt es irgendwas, was dieses Enter überflüssig macht? Also ich geb w ein, dann geht es weiter und wenn ich eine beliebige andere Taste drücke schließt sich das Programm.

    Danke!



  • camper schrieb:

    das muss nun wirklich nicht sein. die namenswahl jetzt ist durchaus gut

    Du solltest meinen Post mal genauer lesen...ich habe nirgends wo erwähnt, dass seine Namensgebung schlecht wäre, oder daran irg.etwas aus zusetzen ist...

    Es war nur ein Tipp...weils dann noch deutlicher wird...und diesen Tipp muss er ja auch nicht befolgen... ⚠



  • typedef signed short int usi;
    

    timkon schrieb:

    ist doch ganz einfach. usi = unsigned short int.

    😕



  • Also mit % Rechnen und / hab ich richtig hinbekommen, verwende jetzt allerdings anstatt int immer float.

    Tja, wenn Buchstaben anstatt Zahlen eingegeben werden, müsste man das irgendwie Abfangen, eine Fehlermeldung erscheinem lasse, die darauf Hinweist, dass man Zahlen eingeben muss. Weiß nur noch nicht wie :)!

    Ich würde diese Abfrage, was der User tun möchte gerne weg lassen. Wenn ESC nach einer gerechneten Aufgabe eingegeben wird soll sich die Konsole schließen.

    Dann noch was, ist es auch möglich, dass man die Länge einer Zeile in der Konsole verändern kann? Standard ist glaub ich 80 Zeichen oder?

    Wie könnte ich das realisieren?

    Danke!



  • timkon schrieb:

    Also mit % Rechnen und / hab ich richtig hinbekommen, verwende jetzt allerdings anstatt int immer float.

    Ich würde diese Abfrage, was der User tun möchte gerne weg lassen. Wenn ESC nach einer gerechneten Aufgabe eingegeben wird soll sich die Konsole schließen.

    Wo ist das Problem ?

    timkon schrieb:

    Dann noch was, ist es auch möglich, dass man die Länge einer Zeile in der Konsole verändern kann? stan**** ist glaub ich 80 Zeichen oder?

    Hm also mit C++ geht das nicht...könntest aber mal Google: site:msdn.microsoft.com SetWindowPos außer WinAPI probieren...vllt. bekommste das Fenster damit größer 😃



  • das Problem ist, wenn ich die Abfrage rausnehme, läuft alles supi, aber wenn ich dann ESC drücke passiert nichts.

    Das Programm wartet dann ja auf die Eingabe der 3 Parameter, wenn ich nun ESC (Escape) drücke soll aber ende sein!



  • timkon schrieb:

    Tja, wenn Buchstaben anstatt Zahlen eingegeben werden, müsste man das irgendwie Abfangen, eine Fehlermeldung erscheinem lasse, die darauf Hinweist, dass man Zahlen eingeben muss. Weiß nur noch nicht wie :)!

    http://www.parashift.com/c++-faq-lite/input-output.html#faq-15.3

    mfg.



  • Danke, werd ich mal versuchen einzubauen.


Anmelden zum Antworten