rechenprogramm



  • moin moin, kann mir einer verraten wieso bei folgendem programm ein fehler von meinem compiler verursacht wird ?

    //Wird benötigt für die Standartfunktionen
    #include <stdio.h>
    
    //Wird benötigt für system(pause)
    #include <stdlib.h>
    
    float zahl1, zahl2, ergebnis;
    
    int main(void)
    {
    //Eingabe
    printf("Rechenprogramm\n==============\n\nGeben sie zwei Zahlen durch Komma getrennt ein:");
    scanf("%f, %f", &zahl1, &zahl2);
    
    //Verarbeitung
    
    printf("Wieviel ist %.2f + %.2f?", zahl1, zahl2);
    scanf("%f", ergebnis);
    
        if(zahl1 + zahl2 ==0){
            printf("falsch, richtig wäre %.2f +%.2f = %.2f",zahl1,zahl2, zahl1 + zahl2);
        }
        else{
            printf("Richtig!!");
        }
    
    system("PAUSE");
    return 0;
    }
    

  • Mod

    Nicht, wenn du uns nicht verrätst, welcher Fehler. Ich bekomme nämlich nur Warnungen von meinem Compiler.



  • also mein compiler spielt das programm ab, dann gebe ich 2 zahlen getrennt mit einem komma ein und dannach steht da "aufgabe2.exe" hat einen fehler verurssacht und muss geschlossen werden, wäre schön wenn ich rausbekomme was für ein fehler 😃 ...



  • scanf() erwartet eine Adresse als Parameter:

    //scanf("%f", ergebnis);
    scanf("%f", &ergebnis);
    

  • Mod

    Guck dir mal an, was das Wort Compiler bedeutet. Durch deine falsche Verwendung des Wortes bei der Fragestellung hast du mögliche Helfer eher verwirrt. Und auch sonst ist dies sehr wichtig zu wissen.



  • Zeile 18: vor das "ergebnis" musst du ein "&" schreiben und ich würde noch abfragen ob "(zahl1 + zahl2) == ergebnis" ist und nicht ==0



  • hey danke für die antworten, das problem liegt dank euch nicht mehr vor.

    eine kurze frage, was ist denn ein compiler, damit ich die vokabel das nächste mal richtig verwende ...

    danke





  • Ein C Programmierer, der nicht weiß, was ein Compiler ist. Mal was Neues.
    Noch zum Thema Vokabeln: Standard schreibt man Standard und nicht wie du.



  • Wutz schrieb:

    Standard schreibt man Standard und nicht wie du.

    Das kommt drauf an, was gemeint ist ...



  • zum thema c programmierer ... ich muss leider c lernen, da die grundlagen zu meinem studium gehören. ich habe respekt vor den menschen die diese sprache beherschen und auch gerne programmieren, ich hingegen gestalte meine freizeit lieber anders und muss mich notgedrungen damit beschäftigen, daher verzeiht meine stellenweise "dummen" fragen 😉 ...



  • //Wird benötigt für die Standardfunktionen
    #include <stdio.h>
    
    //Wird benötigt für system(pause)
    #include <stdlib.h>
    
    float zahl1, zahl2, ergebnis;
    
    int main(void)
    {
    //Eingabe
    printf("Rechenprogramm\n==============\n\nGeben sie zwei Zahlen durch Komma getrennt ein:");
    scanf("%f, %f", &zahl1, &zahl2);
    
    //Verarbeitung
    
    printf("\nWieviel ist %.2f + %.2f?", zahl1, zahl2);
    scanf("%f", &ergebnis);
    
        if(zahl1 + zahl2 ==ergebnis){
            printf("           Richtig!!\n\n");
        }
        else{
            printf("           falsch, richtig waere %.2f + %.2f = %.2f\n\n",zahl1,zahl2,zahl1 + zahl2);
        }
    
    printf("Wieviel ist %.2f - %.2f?", zahl1, zahl2);
    scanf("%f", &ergebnis);
    
        if(zahl1 - zahl2 ==ergebnis){
            printf("           Richtig!!\n\n");
        }
        else{
            printf("           falsch, richtig waere %.2f - %.2f = %.2f\n\n",zahl1,zahl2,zahl1 - zahl2);
        }
    
    printf("Wieviel ist %.2f * %.2f?", zahl1, zahl2);
    scanf("%f", &ergebnis);
    
        if(zahl1 - zahl2 ==ergebnis){
            printf("           Richtig!!\n\n");
        }
        else{
            printf("           falsch, richtig waere %.2f * %.2f = %.2f\n\n",zahl1,zahl2,zahl1 * zahl2);
        }
    
    printf("Wieviel ist %.2f / %.2f?", zahl1, zahl2);
    scanf("%f", &ergebnis);
    
        if(zahl1 - zahl2 ==ergebnis){
            printf("           Richtig!!\n\n");
        }
        else{
            printf("           falsch, richtig waere %.2f / %.2f = %.2f\n\n",zahl1,zahl2,zahl1 / zahl2);
        }
    
    system("PAUSE");
    return 0;
    }
    

    Moin Moin,

    habe heute mein Programm ein wenig weitergeschrieben und nun noch ein kleines Problem. In Zeile 44, beim addieren, wird immer "falsch" ausgespuckt wenn ich nur "6" eingebe, wie kann ich dort ein richtiges ergebnis erziehlen?

    danke euch 🙂


  • Mod

    Guck dir deine if-Abfrage nochmal ganz genau an.

    Auch sollte man erwähnen, dass exakte Vergleiche (==) bei Fließkommazahlen keine so gute Idee sind.



  • danke habe den fehler gefunden, was genau meinst du mit dem (==) ? bzw wieso ist es keine gute idee ??


  • Mod

    Rammsteiner schrieb:

    danke habe den fehler gefunden, was genau meinst du mit dem (==) ? bzw wieso ist es keine gute idee ??

    Na, direkt vergleichen mittels a == b so wie du das machst, wobei a oder b das Ergebnis einer Berechnung sind.

    Probier beispielsweise mal 0.1 und 0.1 als Werte aus und versuch damit mal dein Rechenprogramm.



  • ok, funktioniert nicht, wieder was gelernt, aber wieso funktioniert das so nicht?


  • Mod

    Zur Erklärung eine Analogie:
    Nimm die letzte Frage wo das Ergebnis von / abgefragt wird. Denk mal im Zehnersystem (also so wie du das immer tust). Nun frage ich dich nach dem Ergebnis von 1 / 3. Wie lautet deine Antwort?
    Wie du merkst, kannst du keine korrekte Antwort geben, da 1/3 im Dezimalsystem nicht mit endlich vielen Stellen dargestellt werden kann. Das beste was du machen kannst ist etwas wie "ungefähr 0.33333333333333333333333"

    Der Computer hat ein ähnliches Problem. Er rechnet zwar im Dualsystem, aber das ändert bloß, welche Zahlen exakt dargestellt werden können und welche nicht. 1/10, welches im Dezimalsystem 0.1 ist, ist so eine Zahl die im Dualsystem nicht exakt dargestellt werden kann. Der Computer kann mit dieser Zahl nicht exakt rechnen. Ebenso trifft es natürlich andere Zahlen die öfters in Rechnungen auftauchen wie Eulers e oder Pi.

    Das bedeutet, dass sehr viele Rechnungen nicht exakt sind, sondern kleine Rundungsfehler haben. Und deswegen ist es keine gute Idee, bei Fließkommazahlen exakte Gleichheit zu testen. Denn auch wenn mathematisch auf beiden Seiten des Vergleichs exakt das selbe stehen müsste, machen die kleinen Fehler dies kaputt. Die übliche Lösung ist, dass man nur guckt, ob zwei Zahlen sich höchstens um einen sehr sehr kleinen Wert unterscheiden. Und wenn sie dies tun, akzeptiert man dies als Gleichheit.



  • danke für die Gute erklärung.

    ich habe da gleich noch eine frage. Ich möchte nun, dass am anfang gefragt wird, ob man rechnen möchte (j / n ).

    Dafür habe ich mir nun folgendes gedacht:

    #include <stdio.h>
    
    int j=1;
    int n=2;
    int auswahl;
    
    int main (void)
    {
    //Eingabe
    printf("Wollen sie rechnen? \(j/n\) ");
    scanf("%i", &auswahl);
    
    switch(auswahl)
    
    {case 1:
    
    //hier steht nun das Rechenprogramm
    
    }
    
    {case 2:
    printf("ich bin noch nicht programmiert worden!!");
    break;
    }
    default:
    printf("Ihre Eingabe war ungültig!");
    
    }
    

    Das problemw as ich hie rhabe, ich glaube bei case 1 usw muss ein int stehen, bzw eine zahl, kein buchstabe, wie kann man dieses problem umgehen? habe eventuell überlegt es am anfang des programms über die zuweisung der int variablen zu lösen und dann zu sagen ich schreibe bei j = 1 rein und bei n = 2.

    Ich hoffe ich verwende die Fachsprache hier korrekt.

    dankeschön.

    danke 🙂



  • Mit getchar kannst du einzelne Buchstaben eingeben und prüfen. Hier auch noch ein Beispiel: http://www.cplusplus.com/reference/clibrary/cstdio/getchar/



  • dankeschön


Log in to reply