Mini-Taschenrechner

Ev385

Grünschnabel
Hallo zusammen,

ich möchte einen Taschenrechner programmieren, der nur die Grundrechenarten beherrscht.

Hier ist mein Code


C:
 [/
#include <stdio.h>


int main()
{
 int zahl1;
 int zahl2;
 char operrator ;
 int summe, differenz, produkt, quotient;

 printf("Zahl 1: ");     //Eingabe der ersten Zahl
 scanf("%d",& zahl1);

 printf("Operrator wählen: ");      // Auswahl des Operrators
 scanf("%d",& operrator);
 getchar();
                                              
 printf("Zahl 2: "); // Eingabe der Zweiten Zahl
 scanf("%d",& zahl2);

 if(operrator = '+'){                    /** Je nach dem welcher Opperator gewählt wurde, soll das
                                                   Programm die bestimmte If- Verzweigung ausführen (Aus meiner Sicht)
    summe = zahl1 + zahl2;          Aber das Programm führt alle aus. Das stört mich xD.***/
    printf("%d ",summe);     
  
  
 }
 if(operrator = '-'){
  
    differenz = zahl1 - zahl2;
    printf("%d ",differenz);

 }
 if(operrator = '*'){
  
    produkt = zahl1 * zahl2;
    printf("%d ",produkt);
  
    
 }
 if(operrator = '/'){
  
    quotient = zahl1 / zahl2;
    printf("%d ",quotient);
  
  
 }


  


 return 0;
}
  ]



Das Program zeigt keine Fehler, aber er führt alle If-Verzweigungen aus. Das heisst wenn ich z.b für den Opperator das '+' auswähle, dann subtrahiert multipliziert und dividiert er auch :/ . Das möchte ich nicht.
Was soll ich ändern, damit das nicht mehr der Fall ist?.

Danke im Vorraus :D
 

sheel

I love Asm
Hi

Code:
if(operrator = '+')
Ein einzelnes = ist eine Zuweisung von einem neuen Wert, Vergleichen sind zwei (also ==).

In jedem deiner if's weist du der Variable also einen anderen Operator zu. Dass das in einem if passiert stört nicht; auch wenn das am Anfang vielleicht seltsam ist ist es erlaubt. Die eigentliche Bedingung für das if ist in dem Fall, ob der neue Wert 0 ist ist oder nicht. Der Code oben ist damit also gleichbedeutend zu zB.
Code:
operrator = '+';
if(operrator != 0)

Btw., Operator schreibt man mit nur einem r nach dem e
 

cwriter

Erfahrenes Mitglied
Hi

Dein Problem ist ein Klassisches:
Du schreibst
C:
if(operator = '+')
{
//code
}
.
Aber = bedeutet setzen, nicht prüfen (in der Mathematik ist "=" ":=").
Du willst "==" benutzen.
Warum wird nun immer alles ausgeführt?
Nun: var = Value wird immer selbst wieder zu val evaluiert.
Dein Code ist also eigentlich:
C:
operator = '+';
if(operator)
{

}
Da alle Zeichen ungleich 0 sind (ausser das Steuerzeichen 0 selbst), wird der if-Block immer ausgeführt. Damit das deutlich wird: '0' ≠ 0. '0' wird zum ASCII-Wert 48 umgewandelt.

Dann generell: Du solltest auf Division durch 0 prüfen, keinen Abstand zwischen & und Variable machen (ist in C++ verwirrend), und das getchar() ist überflüssig.


Gruss
cwriter

/EDIT: @sheel: Sind wir schon synchronisiert? :O
Nicht nur fast gleichzeitig, sondern auch fast dieselbe Antwort?
 

Ev385

Grünschnabel
Hi,

es müsste also eigentlich funktionieren, wenn ich statt ' = ' ein '==' schreibe nh. :D.
Hat es erstmal leider nicht. Dann habe ich im Netz bisschen geguckt.
Das Problem bei mir war im Code in Zeile 16 beim scanf().
Da musste ein %s und kein %d xD. Dann hat es geklappt.
 

sheel

I love Asm
Das haben wir beide wohl übersehen, aber: Nein!
%s ist genau so falsch wie %d.

Für ein einzelnes char, wie bei dir, ist %c nötig.

Falls kein Fehler merkbar war, ist das nur Glück gewesen. Kann passieren, muss aber nicht.
C++ ist da relativ oft so: Bei bestimmten falschen Sachen kann man sich nicht darauf verlassen, dass man Fehlermeldungen bekommt oder so, sondern es kann einfach irgendwas passieren. Variablen, die sich selbst ohne Grund ändern, Codezeilen die ausgelassen werden, usw. ... und ab und zu auch kein merkbares Problem oder einfach eine Fehlermeldung. Auf einem anderen Computer, oder morgen bei dir, könnte das wieder anders ausschauen.
 

Ev385

Grünschnabel
Wenn ich das mit %c, mache wird komischerweise die Eingabe für das Zeichen übersprungen bzw. nicht gemacht, bis ich ein getchar() einfüge. Danach funktionieren alle Eingaben wieder. Aber am Ende wird dann kein Ergebnis ausgespuckt. Es passiert einfach nix :/. Mit %s fallen alle diese Probleme weg und ich brauch nicht mal das getchar().
 

sheel

I love Asm
C++ ?, ich schreibe in C.
Sorry, mein Fehler.
Für C gilt das aber auch.

Oder meinste den compiler? (DEV C++).
Nur zur Info, das ist kein Compiler, sondern nur ein Schreibprogramm

Und zm Überspringen ... genau, du verwendest ja scanf, das solche Macken eben hat...
%s ist trotzdem falsch. Wenns dich nicht stört, evt. irgendwann deswegen unerwartete Probleme zu bekommen...

Anders könnte man es so machen (auch gleich mit einer Überprüfung, ob überhaupt eine Zahl eingegeben wurde (falls nicht muss man wieder eingeben)):
C:
char line[1024]; /*nur einmal am Anfang*/

do {
    printf("Zahl 1: ");
    fgets(line, 1024, stdin);
 } while(sscanf(line, "%d", %zahl1) != 1);
while(strlen(line) > 0 && line[strlen(line) - 1] != '\n')
{
    fgets(line, 1024, stdin);
}
Das eben für jede Eingabe (außer der ersten Zeile, die nur einmal). %d beim Operator eben mit %c austauschen. Und sscanf hat wirklich zwei s.