tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
8
ZUGRIFFE
251
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Go-Autoit Go-Autoit ist offline Rookie
    Registriert seit
    Nov 2010
    Beiträge
    8
    Hallo Forum,

    ich habe ein Problem bei der Berechnung folgender Formel (Anhang).
    Name:  pq.jpg
Hits: 7
Größe:  5,6 KB

    Bei diesem kleinen Programm soll der Wert für P und Q vom User eingegeben werden.
    Für P soll -5 eingegeben werden und für Q 3.

    Also
    P = -5
    Q = 3

    Leider komme ich mit meiner Berechnung nicht auf die "Musterlösung".

    Musterlösung
    x1 = 4.30
    x2 = 0.70


    Habe ich einen Fehler innerhalb meiner Berechnung, oder nutze ich den Befehl Sqrt flasch?

    Ich würde mich über eure Hilfe sehr freuen.
    Danke.

    Hier Mein Code:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    
    #include <stdio.h>
    #include <math.h>
     
    int main()
    {
        int p, q;
        double x1, x2;
                                
        double s;               //Zwischenvar für qurzel
        double wurzel;          //Var für Sqrt
        double sqrt(double wurzel);
        //double sqrt(double);
     
        printf("Bitte geben Sie P ein : ");
     
        scanf("%d",&p); 
     
        printf("Bitte geben Sie Q ein : ");
     
        scanf("%d",&q); 
     
     
        //Rechnung
        
        s = ( -p ^ 2 / 4 )  - q;
     
        wurzel = sqrt(s);
        
     
     
        x1 = -0.5 * p + wurzel;
        
        x2  = -0.5 * p - wurzel;
        
     
     
     
        //ausgabe
     
        printf("x1 = %.2f \n ", x1);
        printf("x2 = %.2f", x2);
     
        //x^2 + p + x + q = 0
     
        return 0;
     
    }
    Geändert von Go-Autoit (04.11.11 um 12:59 Uhr) Grund: Rechtschreibung
     
    Go-Autoit

    Mehr Tutorials!

  2. #2
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Hi

    vllt. gibts noch Fehler, aber einen hätt ich schon:
    Code cpp:
    1
    
    s = ( -p ^ 2 / 4 )  - q;
    ^ ist nicht das math. Potenzieren. (Außerdem gehört das - bei -p weg)
    Weils nur Quadrat ist:
    Code cpp:
    1
    
    s = ( p * p / 4 )  - q;
    Für höhere Potenzen kann man pow nehmen.

    Gruß
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  3. #3
    Go-Autoit Go-Autoit ist offline Rookie
    Registriert seit
    Nov 2010
    Beiträge
    8
    Super Danke .
    Das hätte ich nicht so schnell entdeckt.

    Nun komme ich auf folgende Werte.
    X1= 4.23
    X2 = 0.77

    Leider unterscheidt sich meine Lösung mit der Musterlösung.
    Musterlösung
    x1 = 4.30
    x2 = 0.70

    Kann es sein, dass ich noch einen Fehler im Code habe, oder etwas nicht beachtet hab?

    Grüße
     
    Go-Autoit

    Mehr Tutorials!

  4. #4
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Hab den Code mal etwas aufgeräumt und Casts eingefügt, geht:
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    
    #include <stdio.h>
    #include <math.h>
     
    int main()
    {
        int p, q;
        double a, b;
     
        printf("Bitte geben Sie P ein : ");
        scanf("%d", &p); 
        printf("Bitte geben Sie Q ein : ");
        scanf("%d", &q); 
     
        //Rechnung
     
        a = -0.5 * (double)p;
     
        b = sqrt(((double)p * (double)p / 4.0 ) - (double)q);
     
        //ausgabe
     
        printf("x1 = %.2f\n ", a + b);
        printf("x2 = %.2f\n", a - b);
     
        return 0;
    }

    Gruß
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  5. #5
    Go-Autoit Go-Autoit ist offline Rookie
    Registriert seit
    Nov 2010
    Beiträge
    8
    Ich danke dir .

    Kannst du mir erklären was dies bewrikt?

    a = -0.5 * >>> (double)p <<<<;

    Hätte man nicht einfach p schreiben können?
     
    Go-Autoit

    Mehr Tutorials!

  6. #6
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Wenn man Kommatypen mit Nichtkommatypen verrechnet ist nicht immer ganz eindeutig,
    was der Compiler macht. (In dem Fall eigentlich schon, aber um sicher zu gehen...)

    Der Normalfall wäre (ohne (double)): Es wird intern aus p ein double gemacht
    und dann dieses double mit dem double -0.5 multipliziert.
    Das Extrembeispiel, wie es nicht sein sollte:
    Weil p ja ein int ist, wird aus -0.5 ein int gemacht (=0) und dann 0 mit p multipliziert.

    Die Zeile hätte ziemlich sicher ohne (double) auch funktioniert,
    aber so kann man dem Compiler jedenfalls sagen, was wohin umzuformen ist.
    Besser mehr casten als zu wenig.

    Das Problem vorher war wahrscheinlich das
    p * p / 4
    in der Wurzel.
    Das sind alles int, also war das Ergebnis auch ein int.
    Das bei der Division eventuell Kommastellen anfallen, ist dem Computer egal.
    Deshalb einfach alle drei Teile in double umformen:
    (double)p * (double)p / 4.0

    Gruß
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  7. #7
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.
    Zitat Zitat von Go-Autoit Beitrag anzeigen
    Kannst du mir erklären was dies bewrikt?

    a = -0.5 * >>> (double)p <<<<;
    Das nennt man Cast und es bewirkt, das der Wert der int-Variablen p in einen double Wert "umgewandelt" wird.
    Zitat Zitat von Go-Autoit Beitrag anzeigen
    Hätte man nicht einfach p schreiben können?
    Ja, hätte man. Aber nur weil der andere Operand (das Literal -0.5) ein double ist und somit die automatische Typ-Beförderung (von int zu double) durchgeführt wird.

    \edit: zu langsam....

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  8. #8
    Go-Autoit Go-Autoit ist offline Rookie
    Registriert seit
    Nov 2010
    Beiträge
    8
    Ich danke dir. Hatte grade im Handbuch nachgeschlagen und nun erklärt sich auch mit deinem Post die Datenypumwandlung.

    Danke dir.

    Thread kann geschlossen werden.
    Problem gelöst.

    Problemlösung:
    Keine Datentypumwandlung und Computer hat mit falschen Zahlen gerechnet.
    Weitere Infos
     
    Go-Autoit

    Mehr Tutorials!

  9. #9
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Schließen bzw. als "Erledigt" markieren kannst du selber (und außer Moderatoren nur du):
    Ein Klick auf den blau-weißen Haken unten neben "Auf Thema Antworten"
    oder das "Nein" bei Erledigt oben.
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

Ähnliche Themen

  1. Probleme bei der FLoat-Berechnung
    Von Lautsprecher im Forum C/C++
    Antworten: 2
    Letzter Beitrag: 20.01.10, 17:03
  2. Antworten: 2
    Letzter Beitrag: 28.12.09, 13:51
  3. Formel zur Berechnung einer gewissen Dauer
    Von Thopeto im Forum Coders Talk
    Antworten: 6
    Letzter Beitrag: 30.04.09, 16:51
  4. Antworten: 8
    Letzter Beitrag: 21.04.09, 19:19
  5. probleme mit formel
    Von X2k im Forum Visual Basic 6.0
    Antworten: 8
    Letzter Beitrag: 23.12.04, 20:12