Ein einfacher Taschenrechner in C



  • 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.



  • Habe ich ganz übersehen 🙄

    meinungsadler schrieb:

    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");         
    }
    

    Der Compiler muss hier eine Warnung in Zeile 9 ausgeben.
    Wenn nicht, stell dein Warnlevel härter ein.

    Schreib mal direkt vo die for-Schleife nochmal: printf("erg = %f\n", erg);
    Ein C-Compiler versucht immer das Programm trotz aller Widrigkeit zu übersetzen.
    Dabei bemerkt er auch mögliche Fehler vom Programmierer, die er als Warnungen ausgibt.
    Darum beachte die Warnungen und behebe den Grund dafür.



  • DirkB schrieb:

    @meinungsadler
    Probier mal

    int main(){ 
    
           int zeichen; // ja, ein int
    

    Das ist falsch, weil bei

    DirkB schrieb:

    scanf (" %f %c %f", &gleitkommazahl1, &zeichen, &gleitkommazahl2);
    

    %c einen Zeiger auf char verlangt und keinen auf int.



  • internium schrieb:

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

    Naivling.

    internium schrieb:

    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.

    Noch viel größerer Naivling.

    internium schrieb:

    So kann man den Nachwuchs auch zu PHP treiben^^

    Gute Idee. Gehe dahin und betreibe dort dein Noobunwesen und lasse hier die Leute mit Ahnung Anfängern etwas erklären.

    internium schrieb:

    Dev C++ ist extrem veraltet. Ich nehme für schnell mal ausprobieren Codeblocks, in dem dein von mir modifizierter Code auch funktioniert.

    Für die Aufdeckung deiner Fehler und für die überwiegende Mehrzahl des hier relevanten C-Codes reicht ein simpler standardkonformer Compiler egal wie alt aus.

    internium schrieb:

    Ich verstehe gar nicht warum der bei dir nicht geht?

    Weil du keine Ahnung hast, dir der Überblick und die Erfahrung fehlt um Fragern hier ihr Thema richtig zu erläutern, du bist selbst ein Anfänger, der Hilfe braucht, wie an deinen Äußerungen+Code unschwer zu erkennen ist.



  • Ja ich würde mich auch eher noch als fortgeschrittener Anfänger bezeichnen, aber den Stuss den du hier schreibst ist auch nicht von schlechten Eltern^^

    Was war denn bitteschön so falsch an meiner Hilfe, mal von der Sicherheit abgesehen?

    In keinem Lehrbuch wirst du in den Anfängerbeispielen gleich die ganzen Sicherheitsaspekten drin haben, weder in C, C++, Java noch PHP. Was redest du eigentlich hier für einen Müll dies bezüglich zusammen? Noch nie ein Buch gelesen?

    Du bringst hier nicht EIN Argument, sondern machst nur die Anfänger fertig. Man, zum Glück bist du kein Dozent und ich hoffe du schreibst nie ein Buch für Anfänger...so schlecht wie du muss man erst mal die Leute an Hand nehmen, das ist auch eine Kunst...welche auch immer.


Anmelden zum Antworten