![]() |
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:
Danke im Voraus!
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. |
AW: Polynom von 2tem Grad
Hey,
Delphi-Quellcode:
MfG
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. Hauke |
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?
|
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 = 0Folgendes ist ja denke ich klar: 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:
Das musst du jetzt nur noch in Code überführen, was eine leichte Übung sein sollte.
-p/2>0 -p/2<0
sqrt(D)>p/2 + + sqrt(D)<p/2 + - |
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:
MfG
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. Hauke |
AW: Polynom von 2tem Grad
Erstmal Danke für die Antworten! :)
Zitat:
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);"). |
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. |
AW: Polynom von 2tem Grad
Vielen Dank! Ist somit geklärt! :)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz