Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Polynom von 2tem Grad (https://www.delphipraxis.net/168903-polynom-von-2tem-grad.html)

diavy 17. Jun 2012 15:43

Polynom von 2tem Grad
 
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!

haui95 17. Jun 2012 16:23

AW: Polynom von 2tem Grad
 
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

diavy 17. Jun 2012 16:51

AW: Polynom von 2tem Grad
 
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?

Namenloser 17. Jun 2012 17:23

AW: Polynom von 2tem Grad
 
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.

haui95 17. Jun 2012 17:37

AW: Polynom von 2tem Grad
 
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 :D
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 :D

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

diavy 17. Jun 2012 18:29

AW: Polynom von 2tem Grad
 
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);").

Bjoerk 18. Jun 2012 00:07

AW: Polynom von 2tem Grad
 
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.

diavy 18. Jun 2012 22:19

AW: Polynom von 2tem Grad
 
Vielen Dank! Ist somit geklärt! :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz