Ergebnis 1 bis 6 von 6
  1. #1
    Anfänger
    Registriert seit
    09.07.2007
    Beiträge
    23

    Standard Nullstellen berechnen

    Hallo,
    ich bin Neuling in C++ und lerne es gerade mit Hilfe eines Buches.
    Nun hab ich mich mal an die Aufgabe gewagt und versucht eine Konsolenanwendung zu schreiben die anhand der p-q Formel Nullstellen ausrechnet.
    Ist das alles soweit richtig?
    Für die Variablen sind mir keine anderen Begriffe eingefallen
    -p/2 +- √(p/2)^2-q

    -p/2 ist abschnitt 1
    - √(p/2)^2 ist abschnitt 2
    - √(p/2)^2-q ist abschnitt 3

    Habe schon versucht die ganze rechenoperation in einem Schritt zu machen aber da kam etwas ganz anderes raus

    Code:
    #include <iostream.h>
    #include <cmath>
    double main()
    {
         double p, q, x1, x2,abschnitt1,pdurch2,Hochzahl,abschnitt2,abschnitt3,AB1;
             
            cout << "Gib p ein\t";
            cin >> p;
            cout << "Gib q ein\t";
            cin >> q;
         
         abschnitt1 = -(p/2);
         pdurch2    = (p/2);
         Hochzahl   = pow(pdurch2,2);
         AB1        = Hochzahl-q;
         abschnitt2 = sqrt(AB1);
    
         abschnitt3 = abschnitt2 - q;
    
                x1    = abschnitt1-abschnitt3;
                x2    = abschnitt1+abschnitt3;
        cout << "x1="<< x1 <<"\t und\t x2 "<< x2 <<"\n";
            
            return 0;
    }
    Geändert von _SlayeR_ (10.02.2010 um 23:07 Uhr)

  2. #2
    W32.Lovgate
    Registriert seit
    09.12.2007
    Beiträge
    352

    Standard

    soweit ich die übersicht behalte gerade sollte es formelmäig gut aussehen.
    Du solltest aber noch eine Überprüfung machen, ob AB1 < 0 ist, weil wenn dem der Fall ist, sollte die Wurzel dir eigenartige Ergebnisse auswerfen (falls C++ mit I umgehen kann) oder eine Exception werfen.
    Des weiteren wäre der Zustand für dein Programm von nutzen, da wenn AB1 < 0 ist, keine Nullstelle vorhanden ist.

    Ansonsten könntest du auch an Variablen sparren .
    Ich würde maximal AB1 als einzle Variable (neben p/q) nutzen, um den <0 Fall abzufangen, falls du nicht weißt wie du mit Exceptions umgehen sollst.

    mfg

  3. #3

    Registriert seit
    17.06.2009
    Beiträge
    559

    Standard

    Code:
    double main() [...]
    Steht das so in deinem Buch?
    Wenn du dich halbwegs an den Standard halten möchtest, nimm hier immer int als Rückgabewert.

  4. #4
    Anfänger
    Registriert seit
    09.07.2007
    Beiträge
    23

    Standard

    Danke für die Antworten.

    @LuLu-x .. ja ich hätte wirklich an Variablen sparen können

    Habe gestern auch noch verrsucht
    if ( AB1 < 0 )
    {
    cout <<"Keine Nullstelle..\n";
    }

    hat nicht funktioniert aber liegt wohl daran dass ich double genommen habe werde ich mir aber nachher nochmal anschauen oder?

    @inout
    Werde ich beachten danke

    mfG

  5. #5
    Anfänger Avatar von j0kR
    Registriert seit
    01.04.2009
    Beiträge
    27

    Standard

    abschnitt1 = -(p/2);
    pdurch2 = (p/2);
    Hochzahl = pow(pdurch2,2);
    AB1 = Hochzahl-q;
    abschnitt2 = sqrt(AB1);

    abschnitt3 = abschnitt2 - q;
    Warum einen Abschnitt 3 definiert? Du rechnest nachdem du die Wurzel gezogen hast nochmal minus q - das ergibt keinen Sinn.
    Abschnitt3 löschen und

    x1 = abschnitt1-abschnitt3;
    x2 = abschnitt1+abschnitt3;
    und hier Abschnitt3 durch Abschnitt2 ersetzen oder einfach so:

    #include <iostream.h>
    #include <cmath>
    int main()
    {
    double p, q, x1, x2, d;

    cout << "Gib p ein\t";
    cin >> p;
    cout << "Gib q ein\t";
    cin >> q;

    d = p*p/4-q;
    if(d<0)
    {
    cout << "Keine Nullstelle, da die Dertiminante kleiner als 0 ist!";
    }
    else
    {
    x1 = p/2 + sqrt(d);
    x2 = p/2 - sqrt(d);
    }
    cout << "x1="<< x1 <<"\t und\t x2 "<< x2 <<"\n";

    return 0;
    }

  6. #6
    Der mit Anatidaephobie Avatar von blackberry
    Registriert seit
    11.07.2008
    Beiträge
    2.350

    Standard

    @_SlayeR_

    Ich habe deinen Code nochmal als Basis benutzt, Fehler korrigiert, die Berechnung um die Überprüfung der Diskriminante erweitert und die Berechnung an sich je auf eine Zeile gebracht, sowie die Usereingaben auf Fehler überprüft.

    Außerdem würde ich dir empfehlen bei so einfachen Sachen wie "x hoch 2" die pow()-Funktion weg zu lassen und einfach x*x zu schreiben, weil das einfach schneller ist (ich weiß das macht bei heutigen CPUs fast gar keinen Unterschied, aber bei Projekten, die viele Berechnungen durchführen ist es praktisch, wenn man von Anfang an optimierten Code schreibt).

    Und noch eins: NIE IM LEBEN IOSTREAM.H BENUTZEN! Sollte dieses überhaupt noch existieren, ist das aus Kompatibilitätsgründen der Fall. iostream.h ist veraltet und durch iostream ersetzt.

    P.S.: deine Art Code einzurücken verursacht bei mir Augenkrebs :S


    PDFTT cr3w a.E. — ReiDC0Re, lindor, Sera, berry
    please do feed the trolls crew and elk
    Ehrenwerte Mitglieder im Ruhestand: OpCodez, SFX.
    "Was sich blackberry gerade denkt" — Vorsicht! Frei laufender Wahnsinn!
    Zitat von fuckinghot19: "PS: Blackberry ist auf FH der Trollkönig ^^."
    An dieser Stelle danke ich all meinen Fans und Hatern gleichermaßen ^.^

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •