Nur ganze Zahlen (integer-Werte) erlauben



  • Er macht bei mir nen Fehler wenn ich da dann z.B 1.2 eintippe



  • Wenn jemand es ausprobieren will hier ist das Prog
    http://www.simpleupload.net/download/532527/Taschenrechner2.cpp.html



  • Seprim schrieb:

    Und was bedeutet Cast?

    float f;
    // initialisieren
    if(f == static_cast<int>(f))
    {
      // keine Nachkommastellen
    }
    else
    {
      // sonst schon
    }
    


  • Seprim schrieb:

    Er macht bei mir nen Fehler wenn ich da dann z.B 1.2 eintippe

    Dann hast du Probleme mit formatiertem Einlesen.
    Ein Cast ist eine Konvertierung von Typen. Beispiel:

    double a = 1.2;
    int b = static_cast<int>(a);  //hier wird wegen static_cast das Format geändert und gerundet, sodass dann 1 in b steht
    

    Nun hast du noch zwei Möglichkeiten.
    1. Du nimmst fmod(double a, double b) und dein Modulo funktioniert auch mit double-Werten. (abgesehen davon, dass sowohl fmod() als auch % bei negativen Zahlen nicht korrekt arbeiten, wenn du willst, kann ich dir eine Alternative posten)
    2. Du liest ein double ein und prüfst dann, ob die zahl ganzzahlig ist oder nicht. Wenn sie Nachkommastellen hat, gibst du einen Fehler aus und wenn sie ganzzahlig ist, castest du sie zu einem int, bevor du Modulo ausführst.



  • Seprim schrieb:

    Wenn jemand es ausprobieren will hier ist das Prog
    http://www.simpleupload.net/download/532527/Taschenrechner2.cpp.html

    Ist das dein Ernst? Code bitte nach codepad.org oder pastebin.de. Sonst hilft dir niemand...
    Der Fehler, den er macht, könntest du auch hier in cpp-Tags posten. Die Meinung deines Compilers über deinen Code ist immer wichtig, man sollte die nie zurückhalten.



  • sry hab ich nicht gewusst



  • und das mit dem fmod() funktioniert irgendwie nicht, hatte es implementiert und dann gibt Visual Studio beim complilieren einen fehler aus:
    "error C2668: 'fmod': Mehrdeutiger Aufruf einer überladenen Funktion"



  • Seprim schrieb:

    und das mit dem fmod() funktioniert irgendwie nicht, hatte es implementiert und dann gibt Visual Studio beim complilieren einen fehler aus:
    "error C2668: 'fmod': Mehrdeutiger Aufruf einer überladenen Funktion"

    Bitte poste mal deinen Aufrufcode. Ich vermute ja aufgrund der Fehlermeldung, dass du fmod mit zwei verschiedenen Parameter-Typen aufrufst, z.B. double und int.
    Aber du kannst auch mal selbst überlegen, was das bedeuten könnte.



  • Habs jetzt anders gelöst
    hier der komplette Code
    http://codepad.org/kan7whKP



  • 1. Im ersten Default springst du aus der Funktion, und im zweiten Default gibst du etwas aus, das wird aber nie ausgeführt werden.
    2. in done solltest du true reinschreiben, wenn es fertig ist.
    3. Du brauchst weder modu3 noch modu4 und musst bei der Zuweisung auch nicht nach double casten.
    4. Du solltest mod1 und mod2 auch in main() deklarieren
    5. Da lässt sich bestimmt noch was in Funktionen auslagern
    6. Was soll das hier? ' ' << "=" << ' ' lässt sich genausogut als " = " schreiben.

    usw.



  • aber wenn ich es nicht so mache kann man ja auch doublezahlen eintippen und dann stürtzt ja das prog ab
    wenn mir jemand eine andere lösung parat hat her damit, mir fällt nix anderes ein



  • Seprim schrieb:

    aber wenn ich es nicht so mache kann man ja auch doublezahlen eintippen und dann stürtzt ja das prog ab

    1. Was heißt "wenn du das so machst"
    2. Ich habe bereits gesagt, dass du auch double-Modulo per fmod() machen kannst. Wo liegt hierbei das Problem?

    #include <iostream>
    #include <cmath>
    #include <string>
    using namespace std;
    
    void EnterTwoNumbers(double *first, double *second, string first_str, string second_str)
    {
    	cout << "Bitte jetzt den " << first_str << " eingeben:";
    	cin >> *first;
    	cout << "\n";
    	cout << "Bitte jetzt den " << second_str << " eingeben:";
    	cin >> *second;
    	cout << "\n";
    }
    
    int main()
    {
    	double zahl1, zahl2, ergebnis; 
    	char zeichen1;
    
    	cout << "Dies ist ein Taschenrechner\n";
    	cout << "Ihre Auswahlmoeglichkeiten:\n";
    	cout << "Addition +, Subtraktion -, Multiplikation *\n";
    	cout << "Divison /, Modulooperation %\n";
    
    	//Gewuenschte Rechenart auswaehlen
    	cout << "Geben sie jetzt das Rechenzeichen ein :"; 
    	cin  >> zeichen1;
    
    	switch(zeichen1)
    	{                        
    	case '+':
    		EnterTwoNumbers(&zahl1, &zahl2, "ersten Summanden", "zweiten Summanden");
    		ergebnis = zahl1 + zahl2;
    		break;  
    	case '-':
    		EnterTwoNumbers(&zahl1, &zahl2, "Minuend", "Subtrahend");
    		ergebnis = zahl1 - zahl2;
    		break;  
    	case '*':
    		EnterTwoNumbers(&zahl1, &zahl2, "ersten Faktor", "zweiten Faktor");
    		ergebnis = zahl1 * zahl2;
    		break;  
    	case '/':
    		EnterTwoNumbers(&zahl1, &zahl2, "Dividend", "Divisor");
    		ergebnis = zahl1 / zahl2;
    		break;  
    	case '%':
    		EnterTwoNumbers(&zahl1, &zahl2, "ersten Modulooperanden", "zweiten Modulooperanden");
    		ergebnis = fmod(zahl1 , zahl2);
    		break;
    
    	//Fehlerausgabe und Programm beenden, falls falsches Rechenzeichen eingegeben wurde
            default: 
    		cout << "Noch zu bloed ein RECHENZEICHEN einzutippen\n";
    		return 1;
    	}
    
    	cout << zahl1 << ' ' << zeichen1 << ' ' << zahl2 << " = " << ergebnis << endl;
    
    	// Beenden
    	cout << "Zum Abschliessen bitte Taste druecken" << endl;
    
    	//HIER SOLLTE MAN VORHER DEN EINGABEPUFFER FLUSHEN!
    	getchar();
    	return 0;
    }
    


  • 1. Wir dürfen nur die normale <iostream> benutzen, also die <cmath> leider nicht
    2. Diesen Opperator fmod() haben wir nicht gelernt, also dürfen wir ihn auch nicht benutzen
    Unser Prof ist ein wenig komliziert
    Und irgendwie wird dein Prog nicht kompiliert
    er gibt mir nen Fehler in der ersten void



  • 1. Welchen Fehler? Bei mir funktioniert es.
    EDIT: du musst <string> includen

    Du kannst auch statt fmod folgendes benutzen:

    int abrunden(double in)   //nicht wie (int)number, (int)number konvertiert -4.67 zu -4 und abrunden() zu -5
    {
        int converted = (int)in;
        return ((in < converted) ? converted-1 : converted);
    }
    
    double modulo(double a, double b)        //richtiges Modulo, nicht Divisionsrest wie fmod(), fmod() verwendet (int) statt abrunden(), siehe oben
    {
        return a - (b * abrunden(a / b));
    }
    


  • Jetzt funktioniert es
    in dem prog, was soll den da das getchar() sein



  • Seprim schrieb:

    Jetzt funktioniert es
    in dem prog, was soll den da das getchar() sein

    getchar() holt das nächste Zeichen aus dem Eingabepuffer. Ist dein Eingabepuffer leer(Normalzustand), wartet es, bis du ein Zeichen eingibst. Wenn durch irgendwelches formatiertes Einlesen dein Eingabepuffer nicht leer ist (z.B. wegen formatiertem Einlesen), solltest du ihn vorher leeren, dazu steht aber genug in der FAQ.



  • Seprim schrieb:

    Jetzt funktioniert es
    in dem prog, was soll den da das getchar() sein

    Wartet auf die Eingabe eines Zeichens...

    Du kannst aber auch anderes schreiben z.B.

    aus conio.h getch()
    oder system("pause")
    oder aus iostream cin.get()
    oder...

    macht jeder wie er möchte 😉

    Edit:
    @ wxSkip Du bist wohl Speedy Gonzales 😮
    🙄


Anmelden zum Antworten