Nur ganze Zahlen (integer-Werte) erlauben



  • Hi Leute
    Wir haben in der Schule eine Aufgabe bekommen und einen kleinen Teil davon bekomm ich einfach nicht gelöst.
    Wir sollen einen Taschnerechner programmieren mit + , - , * , / und %.
    Die Grundrechenarten funktionieren schon, die Modulorechnung eigendlich auch. Habe jetzt nur das Problem, dass ich bei dieser Rechenart ja nur integer-Werte eingeben darf.
    Knn man das irgendwie proggen das wenn man da ne double, char, etc eingibt das Programm einen Fehler ausspuckt.
    Wenn ja Wie
    Ich sitze jetzt schon seit fast ner woche an dem Prog und hab immer noch keine Lösung dafür.
    THX im Voraus
    LG Seprim


  • Mod

    1. Es gibt durchaus auch Fließkommamodulo
    2. Ganze Fließkommazahlen zeichnen sich (neben vielen anderen Sachen) dadurch aus, dass sie gleich ihrem Cast zu einem Integer sind sind.
    3. Du kannst doch auch einfach eine Ganzzahl anstatt einer Fließkommazahl einlesen.



  • so sieht meine Deff aus
    int mod1 = 0;
    aber in der Eingabe kann ich da ja auch ne double Zahl eintippen, die er dann aber übernimmt und das Programm abstürzt
    LG Seprim



  • Nein. Da wird einfach der vordere Teil eingelesen und der Rest geht verloren.



  • SeppJ schrieb:

    2. Ganze Fließkommazahlen zeichnen sich (neben vielen anderen Sachen) dadurch aus, dass sie gleich ihrem Cast zu einem Integer sind sind.

    Und was bedeutet Cast
    Ich bin noch ein Newbie in der Programmierung, habs erst seit 5 Wochen



  • 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


Log in to reply