Ein einfacher Taschenrechner in C



  • DirkB schrieb:

    &internium
    Was ist an scanf ("%s", zeichen); besser als an gets(zeichen) ?
    Nichts!
    Denn die Länge wird auch nicht überprüft.

    Ja du hast recht, ich habe es halt nur einheitlicher gemacht und es funktioniert so erstmal.



  • @dirkb
    für getchar braucht er kein array, da reicht ein zeichen.

    und so wie er das zu lösen versucht, funkioniert das nicht, da man mit dem == keine strings vergleichen kann.



  • p.s: natürlich kann er das zeichen auch mit scanf einlesen, dann braucht er halt "strcmp()" zum vergleichen.



  • DirkB schrieb:

    Was macht char zeichen[1]; ?

    Man muss immer ein Zeichen mehr beim char deklarieren, als man hat. Bei unserem Beispiel also für ein Zeichen: char zeichen[2]; ??

    DirkB schrieb:

    Was ist '+'?

    Wird diese Plus Zeichen als zwei Zeichen erkannt?

    DirkB schrieb:

    Was kann das mit der Fehlermeldung [Warning] comparison between pointer and integer bei if (zeichen == '+') zu tun haben ?

    Frei übersetzt heißt das ja: Vergleich zwischen Zeiger und ganze Zahl. Wie soll man denn durch diese Warnung auf den Fehler kommen, dass bei zeichen die [2] fehlt?

    DirkB schrieb:

    ^ ist etwas ganz anderes. ^ ist das binäre Exclusiv-Oder und demnach auch nur auf Ganzzahl möglich.

    Ok. Kann man das denn überhaupt ohne die pow-Funktion nicht machen? Gibt es eine Formel für Potenzierung, wie z.B beim Rest, wo man auch statt Modulo nur mit der Division klar kommt.??



  • verbesserung schrieb:

    @dirkb
    für getchar braucht er kein array, da reicht ein zeichen.

    und so wie er das zu lösen versucht, funkioniert das nicht, da man mit dem == keine strings vergleichen kann.

    [Loriot] Ach. [/Loriot]

    Du hast doch geschriebn: "char zeichen[1];" ist dasselbe wie "char zeichen;"
    Aber genau der Unterschied dazwischen macht die Probleme.



  • DirkB schrieb:

    verbesserung schrieb:

    @dirkb
    für getchar braucht er kein array, da reicht ein zeichen.

    und so wie er das zu lösen versucht, funkioniert das nicht, da man mit dem == keine strings vergleichen kann.

    [Loriot] Ach. [/Loriot]

    Du hast doch geschriebn: "char zeichen[1];" ist dasselbe wie "char zeichen;"
    Aber genau der Unterschied dazwischen macht die Probleme.

    da hast du micht wohl erwischt...

    warum benutzt ihr kein getchar, dann müsste es funktionieren.



  • meinungsadler schrieb:

    DirkB schrieb:

    Was macht char zeichen[1]; ?

    Man muss immer ein Zeichen mehr beim char deklarieren, als man hat. Bei unserem Beispiel also für ein Zeichen: char zeichen[2]; ??

    zeichen[1] ist ein Array mit einem Element. Das ist ziemlich Schwachsinnig. Bei deinen floats hast du das ja auch nicht gemacht.
    Arrays werden in C anders behandelt als einfache Typen.

    meinungsadler schrieb:

    DirkB schrieb:

    Was ist '+'?

    Wird diese Plus Zeichen als zwei Zeichen erkannt?

    Das ist ein Zeichen (Erkennbar an den einfachen Hochkommas) und damit ein Integer-Typ.

    meinungsadler schrieb:

    DirkB schrieb:

    Was kann das mit der Fehlermeldung [Warning] comparison between pointer and integer bei if (zeichen == '+') zu tun haben ?

    Frei übersetzt heißt das ja: Vergleich zwischen Zeiger und ganze Zahl. Wie soll man denn durch diese Warnung auf den Fehler kommen, dass bei zeichen die [2] fehlt?

    Das ist die falsche Schlussfolgerung.
    Entweder du nimmst bei Zeichen kein Array oder du vergleichst ein Element von dem Array. Z.B. zeichen[0] mit '+'

    meinungsadler schrieb:

    DirkB schrieb:

    ^ ist etwas ganz anderes. ^ ist das binäre Exclusiv-Oder und demnach auch nur auf Ganzzahl möglich.

    Ok. Kann man das denn überhaupt ohne die pow-Funktion nicht machen? Gibt es eine Formel für Potenzierung, wie z.B beim Rest, wo man auch statt Modulo nur mit der Division klar kommt.??

    Die pow-Funktion ist für die Potenzierung da. Da gibt es keine Kurzschreibweise.
    Wenn du das selber machen willst, mach eine Schleife und rechne darin mit *.
    Wird aber schwierig bei einem Fließkomme-exponenten.



  • @vergesserung:

    Es funktioniert doch, nicht auf Sicherheit gemünzt, aber das juckt einen Anfänger eh erstmal nicht, da es ums Grundverständnis geht und er einfach mal probieren will.

    So kann man den Nachwuchs auch zu PHP treiben^^



  • vergesserung schrieb:

    warum benutzt ihr kein getchar, dann müsste es funktionieren.

    Sooo einfach ist das auch wieder nicht. Das getchar würde erstmal das '\n' vom scanf einlesen.Ein scanf(%c, ) übrigens auch.

    Da muss man erstmal dein Eingabepuffer leeren.
    Wie man das machen kann steht: http://www.c-plusplus.net/forum/p1146014#1146014



  • ok damit hier für den fragenden keine falschen schlüsse oder so entstehen:
    "char zeichen;" und "char zeichen[1];" ist wirklich NICHT dasselbe.

    sorry!
    fehler meinerseits!



  • @meinungsadler
    Probier mal

    int main(){ 
    
           int zeichen; // ja, ein int
           float gleitkommazahl1, gleitkommazahl2;
    
           do {
             scanf (" %f %c %f", &gleitkommazahl1, &zeichen, &gleitkommazahl2);
    
              Deine if else if Kette hier   
              ....
    
          } while (zeichen != '#')
    
          return 0;
    }
    


  • DirkB schrieb:

    Die pow-Funktion ist für die Potenzierung da. Da gibt es keine Kurzschreibweise.
    Wenn du das selber machen willst, mach eine Schleife und rechne darin mit *.
    Wird aber schwierig bei einem Fließkomme-exponenten.

    Ich habe mal "versucht", so eine Schleife zu konstruieren, aber als Ausgabe erhalte ich leider z. B. für 3 hoch 3 eine riesen Zahl -.-

    Quellcode:

    #include <stdio.h> 
    
    main(){ 
    float erg;
    double basis = 3; 
    int exponent = 3; 
    int i = 0; 
    for (i = 0; i < exponent; i++) { 
        erg = erg * basis; 
        } 
        printf("Ergebnis = %f\n", erg);        
           system("PAUSE");         
    }
    


  • DirkB schrieb:

    @meinungsadler
    Probier mal

    int main(){ 
    
           int zeichen; // ja, ein int
           float gleitkommazahl1, gleitkommazahl2;
           
           do {
             scanf (" %f %c %f", &gleitkommazahl1, &zeichen, &gleitkommazahl2);
    
              Deine if else if Kette hier   
              ....
    
          } while (zeichen != '#')
          
          return 0;
    }
    

    So vllt?:

    int main(){ 
    
           int zeichen; // ja, ein int 
           float gleitkommazahl1, gleitkommazahl2; 
    
           do { 
             scanf (" %f %c %f", &gleitkommazahl1, &zeichen, &gleitkommazahl2); 
    
           if (zeichen == '+') { 
                  printf("\n\t%f\n", gleitkommazahl1 + gleitkommazahl2); 
           } 
           else if (zeichen == '-') { 
                  printf("\n\t%f\n", gleitkommazahl1 - gleitkommazahl2); 
           } 
           else if (zeichen == '*') { 
                  printf("\n\t%f\n", gleitkommazahl1 * gleitkommazahl2); 
           } 
           else if (zeichen == '/') { 
                  printf("\n\t%f\n", gleitkommazahl1 / gleitkommazahl2); 
           } 
    //     else if (zeichen == '^') { 
    //              printf("\n\t%f\n", gleitkommazahl1 ^ gleitkommazahl2); 
    //     } 
           else 
                  printf("\n\t Unbekannter Operator\n");  
          } while (zeichen != '#') ;       
           system("PAUSE");
    }
    

    Keine Fehlermeldung. Aber dafür egal welche Gleichung ich eingebe, gibt er immer und immerwieder "Unbekannter Operator aus...



  • meinungsadler schrieb:

    Keine Fehlermeldung. Aber dafür egal welche Gleichung ich eingebe, gibt er immer und immerwieder "Unbekannter Operator aus...

    Wie gibst du es denn ein?
    Jedesmal mit Entertaste oder in einer Zeile?

    Mach doch mal nach dem scanf ein:

    printf("Sie haben <%f|%c|%f> eingegeben\n", gleitkommazahl1, zeichen, gleitkommazahl2);
    

    Und nimm ruhig den C/C++ Button für den Code. Dann wirds farbig und bunt 🙂



  • DirkB schrieb:

    meinungsadler schrieb:

    Keine Fehlermeldung. Aber dafür egal welche Gleichung ich eingebe, gibt er immer und immerwieder "Unbekannter Operator aus...

    Wie gibst du es denn ein?
    Jedesmal mit Entertaste oder in einer Zeile?

    Mach doch mal nach dem scanf ein:

    printf("Sie haben <%f|%c|%f> eingegeben\n", gleitkommazahl1, zeichen, gleitkommazahl2);
    

    Und nimm ruhig den C/C++ Button für den Code. Dann wirds farbig und bunt 🙂

    Die Ausgabe sieht bei mir so aus:

    http://s1.directupload.net/images/120617/gkzbqb29.png

    Leider weiß ich noch nicht, wie man hier Bilder hochladen kann 🙂



  • meinungsadler schrieb:

    Die Ausgabe sieht bei mir so aus:

    http://s1.directupload.net/images/120617/gkzbqb29.png

    Leider weiß ich noch nicht, wie man hier Bilder hochladen kann 🙂

    Bilder hochladen geht nicht.
    Ein Copy & Paste und als Code markiert tut es auch.

    Gibt es auch keine Warnungen?
    Schreib mal vor dem do

    zeichen = '*'; 
    gleitkommazahl1 = 3;
    gleitkommazahl2 = 4;
    

    und drück nur die Enter-Taste bei der Eingabe (ohne Werte).

    Welchen Compiler/IDE nimmst du?



  • DirkB schrieb:

    meinungsadler schrieb:

    Die Ausgabe sieht bei mir so aus:

    http://s1.directupload.net/images/120617/gkzbqb29.png

    Leider weiß ich noch nicht, wie man hier Bilder hochladen kann 🙂

    Bilder hochladen geht nicht.
    Ein Copy & Paste und als Code markiert tut es auch.

    Gibt es auch keine Warnungen?
    Schreib mal vor dem do

    zeichen = '*'; 
    gleitkommazahl1 = 3;
    gleitkommazahl2 = 4;
    

    und drück nur die Enter-Taste bei der Eingabe (ohne Werte).

    Welchen Compiler/IDE nimmst du?

    Dann klappt es komischerweise.. Ich benutze Dev C++..



  • meinungsadler schrieb:

    DirkB schrieb:

    Welchen Compiler/IDE nimmst du?

    Ich benutze Dev C++..

    Welche Version?



  • DirkB schrieb:

    meinungsadler schrieb:

    DirkB schrieb:

    Welchen Compiler/IDE nimmst du?

    Ich benutze Dev C++..

    Welche Version?

    4.9.9.2.

    Es gibt aber schon 5.2.0.2

    Soll ich unbedingt aktualisieren? Das muss doch bei diesen billigen Programmen nicht sein. ??



  • Dev C++ ist extrem veraltet. Ich nehme für schnell mal ausprobieren Codeblocks, in dem dein von mir modifizierter Code auch funktioniert. Ich verstehe gar nicht warum der bei dir nicht geht? Ich habe mich so eng an deine Code gehalten wie es ging, damit du nicht ein komplett anderes Programm bekommst, denn davon hast du gar nix.

    Taschenrechner Übungen gibt es mit Sicherheit wie Sand am Meer und bestimmt auch welche die nur sichere validierte Eingaben nutzen. Aber all dies nutzt dir in der Stufe, in der du gerade bist, nicht wirklich viel.


Anmelden zum Antworten