Probleme mit if - else



  • Hallo liebe Forumsmitglieder 🙂

    Ich soll ein Programm schreiben, dass Quadratische Gleichungen in der Form Ax2+Bx+C=0 berechnet mit einer Fallunterscheidung. Ich habe das nun mit if else versucht

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    double a,b,c,d,D,X1,X2,Loesung;
    
    int main()
    {
        printf("Diese Programm berechnet quadratische Gleichungen\n");
        printf("in der Form Ax2 + Bx + C = 0\n");
        printf("\n");
        printf("Bitte geben Sie A ein ");
        scanf("%1f",&a);
        printf("Bitte geben Sie B ein ");
        scanf("%1f",&b);
        printf("Bitte geben Sie C ein ");
        scanf("%1f",&c);
    
        double d=(b*b)-4*a*c;
        double D=(-b)/(2*a);
        double X1=(-b+sqrt(D))/(2*a);
        double X2=(-b-sqrt(D))/(2*a);
    
        if (d<0) printf("Es gibt keine Loesungen!");
    
        else {
    
            if (d==0) {printf("Die Gleichung hat eine Loesung!\n");
              Loesung=D; printf("Loesung fuer X = %11.3f\n",D);}
    
        else {
    
            printf("Es gibt 2 Loesungen");
                X1;
                X2;
                printf("X1 = %e\n",X1);
                printf("X2 = %e\n",X2);}
    
        }
    
        return 0;
    
    }
    

    Aber ich checks wirklich nicht wo der Fehler ist und warum es mir meine Anfangsbedingung d<0 nicht nehmen will. Es springt gleich weiter zu D und berechnet dann weiter.

    Vielen Dank, ich hoffe ich bin hier richtig. 😕 😕



  • Du verwendest den falschen formatspecifier für double.
    Zeile 21 gibt division by zero.
    Zeile 36 und 37: statement with no effect.
    Wieso beschränkst du auf %1f? Was ist wenn a,b,c größer sind?
    Anmerkung: ein switch wäre viel übersichtlicher als dein if-else Konstrukt und gönn' den '}' eine extra Zeile.



  • Warum globale Variablen?

    Warum definierst du die Hälfte davon nochmal neu?

    Was passiert in den Zeilen 22 u. 23, wenn D negativ ist?



  • Bitmapper schrieb:

    Anmerkung: ein switch wäre viel übersichtlicher als dein if-else Konstrukt und gönn' den '}' eine extra Zeile.

    Wie willste das denn (sinnvoll) switch() en?
    Nene, if-else ist hier schon OK.

    @zodiamc
    Natürlich geht er gleich "zu D" (Zeile 21) weiter, du hast zwischen Zeile 20 und 21 ja auch kein if (d < 0) stehen. 😕


  • Mod

    hustbaer schrieb:

    Bitmapper schrieb:

    Anmerkung: ein switch wäre viel übersichtlicher als dein if-else Konstrukt und gönn' den '}' eine extra Zeile.

    Wie willste das denn (sinnvoll) switch() en?

    switch ((0<d) - (d<0))
    

    Da weiß sofort jeder, was gemeint ist 🤡



  • Auch wenn Deins viel eleganter ist, wäre vielleicht

    switch ((d>=0)+(d>=1))
    

    anfängerfreundlicher oder sogar

    switch (d>=1:2?(d>=0?1:0))
    

    , weil diese beiden Versionen so leicht auf noch mehr Fälle erweiterbar sind.
    🤡

    edit: 🤡 eingefügt



  • Danke an alle! 👍 👍

    Ich hab versucht mir eine Lösung zusammenzuflicken, weil ich nicht wusste, wie ich das machen soll. Dann hab ich jetzt einfach alles verworfen und es so gemacht, wie ich es bei den "leichteren" Aufgaben vorher gemacht hatte oder hätte. Nun, folgendes ist rausgekommen und ich hab sogar gute Werte 😮

    Wäre jemand so nett drüberzuschauen? Ob das an sich so in Ordnung ist?

    Ich mach das so in "Einzelschritten", weil ich nicht weiß(?) bzw. noch nicht fit genug bin, dass das alles "an einem Strang" ist. Ist meine 2. Praktikumsaufgabe für die Uni... nunja, mal schauen.

    Was müsste ich den eingeben, damit die Lösung nur auf 3 Nachkommastellen berechnet wird?

    Und ja das mit der Switch habe ich gelesen, verstehe es aber im Moment noch nicht. Ich glaube die nächste Praktikumsaufgabe wird mit einer Switch sein. Falls jemand - zufällig - Zeit hat, könnte dieser jemand mir ja schon Mal helfen und die switch in diese Aufgabe einbauen 😃 ansonsten hilft wohl nur Übung & Theorie.

    int main()
    {
    
        float Diskriminante;
        float X1;
        float X2;
        float X3;
        float a;
        float b;
        float c;
    
        printf("Diese Programm berechnet quadratische Gleichungen\n");
        printf("in der Form Ax2 + Bx + C = 0\n");
        printf("\n");
        printf("Bitte geben Sie A ein ");
        scanf("%f",&a);
        printf("Bitte geben Sie B ein ");
        scanf("%f",&b);
        printf("Bitte geben Sie C ein ");
        scanf("%f",&c);
    
        Diskriminante=b*b-4*a*c;
    
        if (Diskriminante<0)
    
            printf("Es gibt keine reellen Loesungen\n");
    
            else { if (Diskriminante==0)
    
                {printf("Es gibt eine Loesung\n");
    
                        X3=(-b)/(2*a); printf("X3 = %1f\n",X3); }
    
                           else {printf("Es gibt zwei Loesungen\n");
    
                                X1=(- b + sqrt((b*b) - 4*a*c)) / (2*a);
                                X2=(- b - sqrt((b*b) - 4*a*c)) / (2*a);
    
                                    printf("X1 = %e\n",X1);
                                    printf("X2 = %e\n",X2);
    
        }
    }
    
    return 0;
    


  • Hi,

    vergiss das mit dem Switch 😉

    Die Beiträge von SeppJ und volkard sollen wohl eher ironisch gemeint sein. Ist nur schwer zu erkennen in einem Forum 😕
    Wenn dann halt nur am 🤡

    BTW ... dein Einrückungsstil ist echt grausam! Dann würde ich ja fast lieber gar nichts einrücken, statt "wahllos" immer ein TAB nach rechts zu springen, ohne je
    wieder nach links einzurücken. Da wirst du ja nach spätestens 100 Zeilen Quellcode einen 3. oder gar 4. Monitor benötigen, um den Quellcode noch lesen zu können (ohne zu scrollen).



  • switch (d == 0)
        {
            case 1:
                printf("Die Gleichung hat eine Loesung!\n");
                Loesung=D;
                printf("Loesung fuer X = %11.3f\n",D);
                break;
    
            default:
                switch ((int) ((1 / d) +1))
                {
                    case 0:
                        printf("Es gibt keine Loesung!\n");
                        break;
                    case 1:
                        printf("Es gibt 2 Loesungen!\n");
                        printf("X1 = %e\n",X1);
                        printf("X2 = %e\n",X2);
                        break;
                }
        }
    

    Seht ihr ist doch ganz einfach 🤡


  • Mod

    Bitmapper schrieb:

    ...

    Das erinnert mich an den Thread neulich, bei dem der Threadersteller kein if verwenden durfte und volkard ihm dann vorschlug, die Einschränkung mittels while zu umschiffen.



  • SeppJ schrieb:

    Bitmapper schrieb:

    ...

    Das erinnert mich an den Thread neulich, bei dem der Threadersteller kein if verwenden durfte und volkard ihm dann vorschlug, die Einschränkung mittels while zu umschiffen.

    Brrr.
    Dann noch lieber &&


Anmelden zum Antworten