Taschenrechner der anderen Art



  • Hallo zusammen!

    Ich bin noch recht neu im Gebiet C++... Hab mir vor ein Paar Tagen einen Taschenrechner programmiert (Übung), der so zu sagen durch Addieren multipliziert, d.h. er multipliziert nicht direkt, sondern addiert beide Zahlen so, dass man das richtige Ergebnis rausbekommt, als hätte man multipliziert. Klingt komliziert, ist aber recht einfach...

    Jetzt hab ich aber ein Problem. Ich möchte das gleich machen, nur beim Dividieren und Substrahieren. Hat jemand ein Vorschlag, wie das (Quelltext) vlt. aussehen könnte?

    Für Addition und Multiplikation sieht der Quelltext so aus:

    #include <stdio.h>
    
    void eingabe (int &x, int &y)
    {
    	printf("Erste Zahl eingeben:");
    	scanf("%i",&x);
    	printf("Zweite Zahl eingeben:");
    	scanf("%i",&y);
    }
    
    int multiplikation (int &x, int &y)
    {int ergeb; int i;
    
    ergeb=0;
    for(i=0; i<x; i++);
    	{
    	 ergeb=ergeb+y;
    	}
    	return ergeb;
    }
    
    void ausgabe (int &x, int &y, int &ergeb)
    {
    	printf("%i * %i = %i",x,y,ergeb);
    }
    
    void main()
    {int x,y,ergeb;
    
    if(x<0)
    {
    
    eingabe(x,y);
    ergeb=multiplikation(x,y);
    ausgabe(x,y,ergeb);
    }
    

    Für eure Vorschläge würde ich euch sehr dankbar sein! 😉



  • natco schrieb:

    Hallo zusammen!

    Ich bin noch recht neu im Gebiet C++... Hab mir vor ein Paar Tagen einen Taschenrechner programmiert (Übung), der so zu sagen durch Addieren multipliziert, d.h. er multipliziert nicht direkt, sondern addiert beide Zahlen so, dass man das richtige Ergebnis rausbekommt, als hätte man multipliziert. Klingt komliziert, ist aber recht einfach...

    Jetzt hab ich aber ein Problem. Ich möchte das gleich machen, nur beim Dividieren und Substrahieren. Hat jemand ein Vorschlag, wie das (Quelltext) vlt. aussehen könnte?

    Für Addition und Multiplikation sieht der Quelltext so aus:

    Für eure Vorschläge würde ich euch sehr dankbar sein! 😉

    Lass mich raten, Du bist Schüler und die Übung ist für die Schule?
    Wo wäre der Sinn Deiner Übung, wenn wir Dir den Sourcecode in die Hand drücken würden? 🙂

    Verstehst Du den geposteten Sourcecode?
    Wenn ja, brauchst Du doch nun nur wieder vom Zähler den Nenner abzuziehen, solange der Zähler größer als der Nenner ist. Du zählst wie oft Du abziehen kannst und hast das Divisionsergebnis.

    Wenn nicht, so stelle doch einfach die Fragen, die Dir zum Verständnis des Codes helfen.



  • Richtig geraten. 😛 Es liegt am Lehrer für diese Unklarheiten... Ich würde sogar mehr Verstehen, wenn ich den fertigen Code vor mir hätte... :>

    Nicht, desto trotz, so richtig?:

    #include <stdio.h>
    
    void eingabe (int &x, int &y)
    {
        printf("Erste Zahl eingeben:");
        scanf("%i",&x);
        printf("Zweite Zahl eingeben:");
        scanf("%i",&y);
    }
    
    int division (int &x, int &y)
    {int ergeb; int i;
    
    ergeb=0;
    for(i=0; i<x; i--);
        {
         ergeb=ergeb-y;
        }
        return ergeb;
    }
    
    void ausgabe (int &x, int &y, int &ergeb)
    {
        printf("%i / %i = %i",x,y,ergeb);
    }
    
    void main()
    {int x,y,ergeb;
    
    if(x<0)
    {
    
    eingabe(x,y);
    ergeb=division(x,y);
    ausgabe(x,y,ergeb);
    }
    


  • natco schrieb:

    Richtig geraten. 😛 Es liegt am Lehrer für diese Unklarheiten... Ich würde sogar mehr Verstehen, wenn ich den fertigen Code vor mir hätte... :>

    Irgendwann hat es nichts mehr mit raten zu; die Lehrer sind immer schuld; netter Versuch ;->

    natco schrieb:

    Nicht, desto trotz, so richtig?:

    #include <stdio.h>
    int division (int &x, int &y)
    {int ergeb; int i;
    
    ergeb=0;
    for(i=0; i<x; i--);
        {
         ergeb=ergeb-y;
        }
        return ergeb;
    }
    

    Versuch die Funktion mal auf Deutsch zu sagen und nimm ein kleines Beispiel hinzu, wie 9 : 4.
    Dann hast Du den Aufruf division( 9, 4 ). Was passiert mit den einzelnen Variablen, wenn Du den Code Schritt für Schritt durchgehst?



  • Wurde euch obiger Code als C oder C++ Code verkauft? Für mich ist das alles C, also schonmal falsches Forum. Weiß grad nicht wie das in C aussieht, aber eigentlich ist void main nicht erlaubt und müsste int main sein und bei C, muss man noch am Ende von main "return 0;" schreiben:

    int main() {
     // Code
     return 0;
    }
    

    Dann noch zu folgendem in der Funktion main:

    int x,y,ergeb;
    
    if(x<0)
    

    Was soll das bewirken? x ist nicht initialisiert und scheint auch vor der if-Abfrage nicht initialisiert zu werden. Also ist diese Abfrage hinfällig. Ob der if-Zweig betreten wird oder nicht, ist Zufall. Ok, man müsste Wissen wo der if-Zweig da schließt, mit der öffnenden Klammer von main und dem o.g. if-Zweig sehe ich 2 öffnende, aber nur eine schließende Klammer am Ende.

    Hast du schonmal Division auf einem Blatt Papier mit Subtraktion realisiert? Wenn nicht, solltest du das tun. Das Ergebnis der Division (Quotient) ist doch, wie oft der Divisor in den Dividenden passt. Probier das mal mit mehreren ganzzahlig teilbaren Zahlen auf Papier aus. Ich glaube die meisten, könnten dir ohne weiteres eine Schleife schreiben die das erledigt, aber das sollte nicht der Sinn sein. 😉

    Greetz



  • Naja, in C gibts denke ich auch keine Referenzen, oder?
    "scanf" ist natürlich schon etwas "hardcore" für C++, aber der Code ist denke ich eindeutig C++ und nicht C.

    @natco:
    Sinn dieser Übung ist es vielleicht nicht nur Code verstehen zu können, sondern auch Code schreiben zu können.
    Und um Code schreiben zu können musst du erstmal wissen was er Schritt für Schritt tun soll.



  • hustbaer schrieb:

    Naja, in C gibts denke ich auch keine Referenzen, oder?

    Ok, die Referenzen in Parameterübergabe habe ich nicht gleich gesehen. Aber ich sehe, außer bei "eingabe", nicht wirklich den Sinn an der Übergabe per Referenz (und wenn schon Referenz die nicht modifiziert wird, dann wenigstens mit const).
    Und wenn schon C++, dann kann man auch den Zähler von i in for anlegen und nicht vorher wie in C am Anfang eines Blocks deklarieren und dann in for erst initialisieren.

    Greetz



  • Stimmt schon, is voll mit "C-ismen", aber naja. Schlechter C++ Code halt 🙂



  • BTW: sollt ihr eigentlich mit Restwerten oder mit Kommazahlen arbeiten?



  • z.B. 4:2=2 also keine Komazahlen...

    Habe mir auch schon ein Strukturdiagramm gezeichnet, aber komme trotzdem nicht weiter, wie ich das prog. soll... Ich brauche das ganze bis Donnerstag, ohweija 😕

    Drückt mir die Daumen... 😞



  • Interessanter wäre wohl noch die Frage ob auch negative Zahlen erlaubt sein sollen. Dann würde die Berechnung der Multiplikation dort oben so auch nur für positive Zahlen funktionieren.

    Wo ist das Problem? Vergiss das Struktogramm, wenn du nicht mal weißt, wie die ganzzahlige Division funktioniert bringt dir das ganze Struktogramm nichts. Du musst erstmal verstehen was das Ergebnis einer Division ist, aber das hab ich dir eigentlich bereits gesagt.
    In der Grundschule hat man für sowas auch kleine Papierklötze bekommen. Bei 9/3 hat man dann einen 9-Klötze großen Streifen dahergenommen und gezählt wie viele 3-klötzige Streifen auf den Streifen mit den 9 Klötzen passen. Schwupps, hatte man das Ergebnis der Division.
    Also was musst du machen um das Ergebnis zu kriegen? Richtig, zählen wie oft die 3 in die 9 passt. Das in einer Schleife zu realisieren sollte jetzt ja wohl kein Problem mehr sein. Ansonsten würde ich mir Gedanken über Mathenachhilfe machen und mir ein gutes Buch über C oder C++, oder was auch immer der Lehrer meint euch da beizubringen, kaufen.

    Greetz



  • Hmm,

    ich weiß einfach nicht was ich hier ändern soll:

    int division (int &x, int &y) 
    {int ergeb; int i; 
    
    ergeb=0; 
    for(i=0; i<x; i++); 
        { 
         ergeb=ergeb-y; 
        } 
        return ergeb; 
    }
    

    Oder wie ich diese Schleife machen soll...



  • Hallo natco,

    einen Hinweis zur Übersichtlichkeit. Wenn Du einer Variable ein Ergebniss zuweist, dass aus einer Berechnung mit der Variablen entsteht kannst Du Kurzschreibweisen verwenden.

    Für

    ergeb = ergeb - y;
    

    kannst Du z. B.

    ergeb -= y;
    

    schreiben. Das gleiche gilt für die anderen drei Grundrechenarten.

    ergeb += y; // ist das gleiche wie ergeb = ergeb + y;
    ergeb -= y; // ist das gleiche wie ergeb = ergeb - y;
    ergeb *= y; // ist das gleiche wie ergeb = ergeb * y;
    ergeb /= y; // ist das gleiche wie ergeb = ergeb / y;
    

    Zu Deinem Problem möchte ich nur darauf Hinweisen, dass in Deiner jetzigen for-Schleife das Abbruchkriterium (i<x) nicht stimmt und Du darüber hinaus den Falschen Wert mit der return-Anweisung zurück gibst.

    Hoffe das hilft Dir auf den Richtigen Weg.

    Viele Grüße
    Knecht



  • Hab das jetzt so gemacht: 😃

    #include <stdio.h>
    
    void eingabe (int &x, int &y)
    {
    	printf("Erste Zahl eingeben:");
    	scanf("%i",&x);
    	printf("Zweite Zahl eingeben:");
    	scanf("%i",&y);
    }
    
    int division (int &x, int &y)
    {int ergeb; int i;
    
    ergeb=0;
    for(i=0; i<x; i++);
    	if(x>y);
    	{
    	 ergeb=x-y;
    	}
    	return ergeb=x/y;
    }
    
    void ausgabe (int &x, int &y, int &ergeb)
    {
    	printf("%i / %i = %i",x,y,ergeb);
    }
    
    void main()
    {int x,y,ergeb;
    
    eingabe(x,y);
    ergeb=division(x,y);
    ausgabe(x,y,ergeb);
    }
    

    Dabei wird aber das Substrahieren so zu sagen überbrückt :P. Naja, besser als gar nichts :>



  • Wenn du die Division wirklich auf die Subtraktion zurückführen willst, ist deine Berechnungsschleife Humbug. Das geht etwa so:

    int division(int x,int y)
    {
      int i;
      for(i=0;x>y;++i) x-=y;
      return i;
    }
    


  • Hab jetzt versucht mir rest zu arbeiten, follgendes ist rausgekommen, aber funzt irgendwie net:

    Könnt Ihr mir sagen warum?

    #include <stdio.h>
    
    void eingabe (int &x, int &y)
    {
    	printf("Erste Zahl eingeben:");
    	scanf("%i",&x);
    	printf("Zweite Zahl eingeben:");
    	scanf("%i",&y);
    }
    
    int division (int &x, int &y)
    {int ergeb; int rest;
    
    rest=x;
    ergeb=0;
    
    while (y <= rest);
    	{
    	rest=rest-y;
    	ergeb=ergeb+1;
    	}
    	return ergeb;
    }
    
    void ausgabe (int &x, int &y, int &ergeb)
    {
    	printf("%i / %i = %i",x,y,ergeb);
    }
    
    void main()
    {int x,y,ergeb;
    
    eingabe(x,y);
    ergeb=division(x,y);
    ausgabe(x,y,ergeb);
    }
    


  • Du berechnest zwar den Divisionsrest, aber du gibst ihn nicht zurück, ergo erfährt das Hauptprogramm auch nichts davon.



  • ich weiss nicht warum das noch keinen aufgefallen ist - das ; bei dem while am ende find ich merkwuerdig {o;

    while (y <= rest);
    {
        rest-=y;
        ergeb+=1;
    }
    


  • CStoll schrieb:

    Wenn du die Division wirklich auf die Subtraktion zurückführen willst, ist deine Berechnungsschleife Humbug. Das geht etwa so:

    int division(int x,int y)
    {
      int i;
      for(i=0;x>y;++i) x-=y;
      return i;
    }
    

    ... hat das x > y didaktische Gründe oder war das ganze nur eine grobe "Skizze"? 😕 😕



  • hä schrieb:

    ... hat das x > y didaktische Gründe

    Entweder das - oder ich hab' mich einfach verschrieben.
    (wohl eher ersteres :D)


Anmelden zum Antworten