AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Polynom von 2tem Grad

Ein Thema von diavy · begonnen am 17. Jun 2012 · letzter Beitrag vom 18. Jun 2012
Antwort Antwort
diavy

Registriert seit: 11. Apr 2012
54 Beiträge
 
#1

Polynom von 2tem Grad

  Alt 17. Jun 2012, 16:43
Hallo zusammen.

Meine Aufgabe lautete es, mit einem Programm die Anzahl der Lösungen für f(x)=ax^2+bx+c=0 und deren Zeichen zu rechnen, ohne die Lösungen zu rechnen.

Das Programm läuft, aber die Lösungen sind nicht richtig, ich habe es gerade mit a=2,b=4 und c=1 versucht, es hat mir angezeigt 1 Lösung wäre positiv, die andere negativ, obwohol beide negativ sein müssten.

Was ist bloß schief gelaufen?

Delphi-Quellcode:
program exercice2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
a,b,c,delta:integer;

procedure error();
begin
writeln('This aint 2nd degre');
end;

procedure howmany(x:integer);
begin
writeln('There are ',x,' solutions for f(x)=0');
end;

procedure signforone(x,y:integer);
begin
if (((-y)/(2*x)) >= 0) then writeln('the solution is positive')
else writeln('the solution is negative');
end;

procedure signfortwoadd(x,y,z:integer); {Z=DELTA, NOT C!!!}
var aux:boolean;
begin
if x>0 then begin
                if y<0 then aux:=true
                else begin
                        if (abs(y) > sqrt(z)) then aux:=true
                        else aux:=false;
                        end;
                end;
if x<0 then begin
                if y<0 then aux:=false
                else begin
                        if (abs(y) > sqrt(z)) then aux:=false
                        else aux:=true;
                        end;
                end;
if aux=true then writeln('The first one is positive');
if aux=false then writeln('The first one is negative');
end;

procedure signfortwosubs(x,y,z:integer);
var aux:boolean;
begin
if x>0 then begin
                if y>0 then aux:=false
                else begin
                        if (abs(y) > sqrt(z)) then aux:=true
                        else aux:=false;
                        end;
                end;
if x<0 then begin
                if y<0 then aux:=true
                else begin
                        if (abs(y) > sqrt(z)) then aux:=true
                        else aux:=false;
                        end;
                end;
if aux=true then writeln('The second one is positive');
if aux=false then writeln('The second one is negative');
end;



  { TODO -oUser -cConsole Main : Insert code here }
begin
readln(a,b,c);
if a=0 then error()
else begin
        delta:=(b*b)-4*a*c;
        if delta<0 then howmany(0);
        if delta=0 then begin
                        howmany(1);
                        signforone(a,b);
                        end;
        if delta>0 then begin
                        howmany(2);
                        signfortwoadd(a,b,delta);
                        signfortwosubs(a,b,delta);
                        end;
        end;
readln;
end.
Danke im Voraus!
  Mit Zitat antworten Zitat
haui95

Registriert seit: 1. Feb 2012
Ort: Niedersachsen
29 Beiträge
 
Delphi 7 Personal
 
#2

AW: Polynom von 2tem Grad

  Alt 17. Jun 2012, 17:23
Hey,

Delphi-Quellcode:
begin
 readln(a,b,c);
if a=0 then error()
else begin
         Delta := sqrt((b*b)-4*a*c); <-- Wurzel der Diskriminante ziehen ?!
         if delta<0 then howmany(0);
         if delta=0 then begin
                         howmany(1);
                         signforone(a,b);
                         end;
         if delta>0 then begin
                         howmany(2);
                         signfortwoadd(a,b,delta);
                         signfortwosubs(a,b,delta);
                         end;
         end;
 readln;
end.
MfG

Hauke
Hauke

Geändert von haui95 (17. Jun 2012 um 17:35 Uhr)
  Mit Zitat antworten Zitat
diavy

Registriert seit: 11. Apr 2012
54 Beiträge
 
#3

AW: Polynom von 2tem Grad

  Alt 17. Jun 2012, 17:51
Ich habe in "if (abs(y) > sqrt(z)) then aux:=true" etc immer die Wurzel genommen, sollte also auf das gleiche rauskommen oder etwa nicht?
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Polynom von 2tem Grad

  Alt 17. Jun 2012, 18:23
Zunächst mal: Sorry, aber durch deinen Code blicke ich nicht durch, da du keine klaren Bezeichner verwendest. Bitte nutze aussagekräftige Variablennamen und nicht x,y,z,a,b usw. Du hast ja anscheinend schon selbst gemerkt, dass das zu Unklarheiten führt, wie man an deinem Kommentar „{Z=DELTA, NOT C!!!}“ sieht. Dann nenn die Variable doch einfach Delta! (wobei ich mir jetzt ehrlich gesagt unter Delta auch nichts vorstellen kann). Aber immerhin sind deine Funktionsnamen englisch, dafür schon mal ein Lob

Also wir haben in der Schule immer mit der PQ-Formel gerechnet und nicht mit der ABC-Formel. Die PQ-Formel erhält man einfach, indem man durch a dividiert. Damit wird die Rechnung übersichtlicher:
x^2 + p*x + q = 0

x1 = -p/2 + sqrt((p/2)^2 - q) = -p/2 + sqrt(D);
x2 = -p/2 - sqrt((p/2)^2 - q) = -p/2 - sqrt(D);

mit D = (p/2)^2 - q
Folgendes ist ja denke ich klar:

Wenn D<0, gibt es keine Lösung.
Wenn D=0, gibt es eine Lösung.
Wenn D>0, gibt es mehrere Lösungen.
Und jetzt kannst du dir z.B. eine Tabelle machen, wann x1 und x2 positiv oder negativ sind. Hier mal exemplarisch für x1:
Code:
               -p/2>0       -p/2<0
sqrt(D)>p/2       +            +
sqrt(D)<p/2       +            -
Das musst du jetzt nur noch in Code überführen, was eine leichte Übung sein sollte.
  Mit Zitat antworten Zitat
haui95

Registriert seit: 1. Feb 2012
Ort: Niedersachsen
29 Beiträge
 
Delphi 7 Personal
 
#5

AW: Polynom von 2tem Grad

  Alt 17. Jun 2012, 18:37
Hier einmal ein Beispielcode, wie man es machen kann, es geht wahrscheinlich auch noch etwas eleganter, z.B. mit der P-Q-Formel, ähnelt aber der a-b-c-Formel, naja
Ich hoffe es hilft dir weiter ! Wie NamenLozer schon gesagt hat, hättest du deinen Quelltext ein bisschen besser formatieren können, da ich zum Beispiel kaum etwas unter deinen Variablennamen verstehen konnte, nur so als kleiner Ratschlag

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  a, b, c, disk, x1, x2: Real;
begin
  disk := 0;
  readln(a, b, c);

  if (a = 0) then
    writeln('´Not solvable !')
  else
    begin
      disk := (b*b) - 4*a*c;
      if disk < 0 then
        writeln('There are 0 solutions for f(x) = 0 !')
      else
        begin
          disk := sqrt(disk);
          x1 := (-b + disk) / (2 * a);
          x2 := (-b - disk) / (2 * a);
          if (disk = 0) then
            begin
              writeln('There is 1 solution for f(x)=0 !');
              if (x1 >= 0) or (x2 >= 0) then
                writeln('The solution is positive !')
              else
                if (x1 < 0) or (x2 < 0) then
                  writeln('The solution is negative !');
            end
          else
            if (disk > 0) then
              begin
                writeln('There are 2 solutions for f(x)=0 !');
                if (x1 < 0) and (x2 >= 0) then
                  begin
                    writeln('The first solution is negative !');
                    writeln('The second solution is positive !');
                  end
                else
                  if (x1 >= 0) and (x2 < 0) then
                    begin
                      writeln('The first solution is positive !');
                      writeln('The second solution is negative !');
                    end
                else
                  if (x1 >= 0) and (x2 >= 0) then
                    writeln('Both solutions are positive !')
                else
                  if (x1 < 0) and (x2 < 0) then
                    writeln('Both solutions are negative !');
            end;
        end;
    end;
    readln;
end.
MfG

Hauke
Hauke

Geändert von haui95 (17. Jun 2012 um 18:47 Uhr)
  Mit Zitat antworten Zitat
diavy

Registriert seit: 11. Apr 2012
54 Beiträge
 
#6

AW: Polynom von 2tem Grad

  Alt 17. Jun 2012, 19:29
Erstmal Danke für die Antworten!

Zitat:
Und jetzt kannst du dir z.B. eine Tabelle machen, wann x1 und x2 positiv oder negativ sind.
Das musst du jetzt nur noch in Code überführen, was eine leichte Übung sein sollte.
Genau so bin ich eigentlich vorgegangen und trotzdem scheint es nicht zu klappen. :/

Hauke es ist ech nett dass du dir so viel Mühe gemacht hast den Code zu schreiben aber leider kann ich es nicht auf deine Weise lösen, da ich die Lösungen nicht rechnen darf, was bei dir leider der Fall ist("x1 := (-b + disk) / (2 * a);
x2 := (-b - disk) / (2 * a);").
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Polynom von 2tem Grad

  Alt 18. Jun 2012, 01:07
Bei deinem Beispiel prüft signfortwosubs if 2 > 0 then if 4 > 0 then aux:=false und somit wird The second one is negative ausgegeben.

Edit:
Bei signfortwoadd greift die Bedingung if (abs(y) > sqrt(z)) und somit wird The first one is positive ausgegeben.

Geändert von Bjoerk (18. Jun 2012 um 01:14 Uhr) Grund: Edit:
  Mit Zitat antworten Zitat
diavy

Registriert seit: 11. Apr 2012
54 Beiträge
 
#8

AW: Polynom von 2tem Grad

  Alt 18. Jun 2012, 23:19
Vielen Dank! Ist somit geklärt!
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf