c++ Taschenrechner



  • Hallo ich bin hier neu in der Community und habe einen Taschenrechner programmiert. Da ich noch nicht so viel erfahrung mit C++ habe wollt ich mal Verbesserungsvorschläge von euch hören wenn ihr welche habt.

    PS: Ich hab nur Just4Fun die Uhrzeit mitanzeigen lassen.

    Rechner.cpp

    #include <iostream>
    #include <time.h>
    #include "Date.h"
    
    using namespace std;
    
    int main() {
    	double zahl1, zahl2, ergebnis;
    	char rechenzeichen;
    	int choice;
    A:
    	system("Color A");
    	cout << "Uhrzeit: " << Date::get_time(0) << "\n" << endl;
    	cout << "Addition [+]\n"; cout << "Subtraktion [-]\n"; cout << "Mutliplikation [*]\n"; cout << "Division [/]\n" << endl;
    	cout << "Rechnung: ";
    	cin >> zahl1 >> rechenzeichen >> zahl2;
    	
    	switch (rechenzeichen) {
    		case '+': ergebnis = zahl1 + zahl2; break;
    		case '-': ergebnis = zahl1 - zahl2; break;
    		case '/': ergebnis = zahl1 / zahl2; break;
    		case '*': ergebnis = zahl1 * zahl2; break;
    		default: system("CLS"); cout << "unbekanntes Rechenzeichen..." << endl; goto A;
    	}
    
    	system("CLS");
    
    	cout << zahl1 << " " << rechenzeichen << " " << zahl2 << " = " << ergebnis << endl;
    	B:
    	cout << "\nWeiter rechnen [1]" << endl;
    	cout << "Beenden [2]" << endl;
    
    	cin >> choice;
    	
    	system("CLS");
    	cout << zahl1 << " " << rechenzeichen << " " << zahl2 << " = " << ergebnis << "\n" << endl;
    
    	switch (choice) {
    	case 1: goto A;
    	case 2: return 0;
    	default: cout << "Du hast nicht 1 oder 2 gewählt...." << endl; goto B;
    	}
    }
    

    Date.cpp

    #include "Date.h"
    
    time_t Date::timestamp;
    tm* Date::now;
    stringstream Date::converter;
    
    string Date::get_time(int flag = 0)
    {
    	string sztime = "";
    
    	fillTime();
    
    	if (now->tm_hour < 10) sztime += '0';
    	sztime += IntToStr(now->tm_hour) + ':';
    	if (now->tm_min < 10) sztime += '0';
    	sztime += IntToStr(now->tm_min);
    	if (flag == 1)
    	{
    		sztime += ':';
    		if (now->tm_sec < 10) sztime += '0';
    		sztime += IntToStr(now->tm_sec);
    	}
    	return sztime;
    }
    
    string Date::get_date()
    {
    	string date;
    
    	fillTime();
    
    	date = IntToStr(now->tm_mday) + '.';
    	date += IntToStr(now->tm_mon) + '.';
    	date += IntToStr(now->tm_year + 1900);
    
    	return date;
    }
    
    void Date::fillTime()
    {
    	timestamp = time(0);
    	now = localtime(&timestamp);
    }
    
    string Date::IntToStr(int i)
    {
    	string tmp;
    	converter.clear();
    	converter << i;
    	converter >> tmp;
    	return tmp;
    }
    

    Date.h

    #pragma once
    #ifndef _DATE_H_
    #define _DATE_H_
    
    #include <iostream>
    #include <ctime>
    #include <string>
    #include <sstream>
    
    using namespace std;
    
    class Date
    {
    private:
    	static time_t timestamp;
    	static tm* now;
    	static stringstream converter;
    
    public:
    	static string get_time(int flag);
    	static string get_date();
    	static void fillTime();
    	static string IntToStr(int i);
    };
    
    #endif
    


  • Wofür die Klasse wenn alles darin static ist? C++ ist nicht Java.

    @unkn0wn sagte in c++ Taschenrechner:

    goto A;
    

    Schleifen sind was tolles.

    @unkn0wn sagte in c++ Taschenrechner:

    string Date::IntToStr(int i)
    {
    	string tmp;
    	converter.clear();
    	converter << i;
    	converter >> tmp;
    	return tmp;
    }
    

    wtf?

    http://www.cplusplus.com/reference/string/to_string/

    ... und dann ist converter auch noch ein statischer stringstream. i think i spider. Wo hast du so einen blödsinn her?



  • @Swordfish sagte in c++ Taschenrechner:

    ja schleifen bin ich nicht so der profi deswegen habe ich einfach goto gemacht

    und das mit dem date hab ich nicht gemacht habs nur bissl umgeschrieben

    bin halt noch nicht so weit bei C++ xD 🙂


  • Mod

    @unkn0wn sagte in c++ Taschenrechner:

    @Swordfish sagte in c++ Taschenrechner:

    ja schleifen bin ich nicht so der profi deswegen habe ich einfach goto gemacht

    und das mit dem date hab ich nicht gemacht habs nur bissl umgeschrieben

    bin halt noch nicht so weit bei C++ xD 🙂

    Da solltest du doppelt hinterfragen, was du da lernst. goto ist nicht "Anfänger", sondern "schlechter Lehrer". Normalerweise solltest du goto als Anfänger überhaupt gar nicht zu Gesicht bekommen, außer bestenfalls als abschließende Fußnote: "goto gibt's auch noch, aber setzt das bloß nie ein!".

    Ein schlechter Lehrer ist in allen Fachgebieten das schlimmste für einen Anfänger, denn was man falsch lernt, wird man nicht so leicht wieder los. Daher solltest du unbedingt die Kompetenz deiner Lehrer ständig hinterfragen. Hier findest du eine Liste gute Bücher, die dir garantiert nicht am Anfang mit goto kommen:
    https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list/388282#388282



  • @SeppJ ich habe keinen lehrer ich habe ein Buch von Thomas Theis und das goto habe ich in verschiedenen foren gesehen



  • @unkn0wn hör auf @SeppJ .Gewöhn dir den Mist mit goto garnicht erst an. Du wirst es in fast keinem C++ von anderen sehen und wirst selbst Probleme haben größere Projekte damit zu schreiben, weil es sehr unübersichtlich wird. Goto ist zwar ein Bestandteil der Sprache, aber nicht alles was inbegriffen ist, ist auch gut. Das wirst du noch öfter merken. Es genügt wenn du mal gesehen hast was es macht, aber nutzen solltest du es nicht.



  • @unkn0wn

    Thomas Theis: Einstieg in alles

    Das Buch gehört in die Papiertonne.


  • Mod

    @manni66 sagte in c++ Taschenrechner:

    Thomas Theis: Einstieg in alles

    Dies ist einer der besten Indikatoren, dass ein Buch nichts taugt. Wenn ein Autor Lehrbücher zu 10 verschiedenen Themen hat, dann heißt das, er ist in keinem davon Experte, sondern Experte im Lehrbücherschreiben. Man hat also 10 Lehrbücher, die richtig gut geschrieben sind, von einem Autor, der nicht weiß, wovon er spricht.



  • wie soll ich dann das programm ohne goto machen? bin halt mit schleifen noch net so gut



  • Dann lerne, wie man diese anwendet: C++-Programmierung/ Einführung in C++/ Schleifen



  • @unkn0wn sagte in c++ Taschenrechner:

    wie soll ich dann das programm ohne goto machen? bin halt mit schleifen noch net so gut

    Bei den goto ist meist auch eine Bedingung dabei.
    Deine hast du schlecht in dem switch versteckt.

    Springst du nach oben, nimmst du eine do-while-Schleife.
    Springst du nach unten, eine while-Schleife.



  • Ich habe jz mal den rechner komplett neugeschrieben

    Freue mich auf verbesserungsvorschläge 🙂

    #include <iostream>
    
    using namespace std;
    
    double zahl1, zahl2, ergebnis;
    char quit, rechenzeichen;
    char user_input;
    
    int main()
    {
    
    	ergebnis = 0;
    
    	system("Color A");
    
    	do
    	{
    		cout << "Letzte Rechnung: " << zahl1 << " " << rechenzeichen << " " << zahl2 << " " << " = " << ergebnis << endl;
    		
    		cout << "Rechnung: ";
    		cin >> zahl1 >> rechenzeichen >> zahl2;
    
    		switch (rechenzeichen) {
    		case '+': ergebnis = zahl1 + zahl2; break;
    		case '-': ergebnis = zahl1 - zahl2; break;
    		case '*': ergebnis = zahl1 * zahl2; break;
    		case '/': ergebnis = zahl1 / zahl2; break;
    		default: cout << "Junge gib ein richtiges Rechenzeichen an!" << endl;
    		}
    
    		cout << zahl1 << " " << rechenzeichen << " " << zahl2 << " = " << ergebnis << endl;
    		cout << "Geben sie irgendeine Taste ein um weiterzurechnen und: 'Q' zum beenden!" << endl;
    		cin >> user_input;
    
    		system("CLS");
    
    		if (user_input == 'q' || user_input == 'Q')
    		{
    			break;
    		}
    
    	} while (1);
    
    	return 0;
    
    }
    


  • ich hab das char quit mittlerweile auch entfernt xD



  • Keine globalen Variablen!

    Warum eine Endlosschleife?

    Die Bedingung für den Abbruch hast du doch (fast) in dem if

    Die case -Zeilen solltest du noch etwas einrücken (das default auch)



  • @unkn0wn Was bekommst Du denn für eine Ausgabe gleich nachdem Du das Programm startest und warum?



  • Versuch es doch in eine Funktion zu packen ein anstelle des break und das dann Ich eine schleife zu packen dann wäre dein Rechner nur eine Funktion



  • @Swordfish Ne die ausgabe ist standard 0 weil noch nichts gerechnet wurde aber wenn du was gerechnet hast und ne neue rechnung machst wird da halt noch die letzte rechnung angezeigt



  • @Abe meinst du nur das switch ?



  • Ich meine die ganze do schleife dann Kannste das wiederum in der Main in eine schleife packen wo du es in einen switch block packst

    int main ()
    {
    while (1)
    {
    cout << "hier stehen die Auswahl Möglichkeiten/n";
    Int auswahl;
    cin>>Auswahl;
    switch(auswahl)
         case 1: rechner();break;
        .......
        case irgendwas: return 0;
    
    
    
    }
    }
    


  • @unkn0wn sagte in c++ Taschenrechner:

    Ne die ausgabe ist standard 0 weil noch nichts gerechnet wurde

    Das kommt halt durch das system("CLS")
    Sowas machen alle Anfänger.
    Das hat aber mit der Funktion des Programms nichts zu tun - ist nervig - und überflüssig.



  • @DirkB Ich habe das gemacht damit man seine rechnungen davor sieht ist mir eigtl egal wenn da nur 0 steht. Und ich bin halt noch Anfänger 🙂


Anmelden zum Antworten