Obsah lekce:
Musíme přidat odkaz na knihovnu Math, protože budeme potřebovat odmocňovat výsledek pomocí funkce sqrt, která je v této knihovně obsažena. Jako proměnné použijeme celá čísla a, b, c - parametry, celé číslo diskriminant (nemůže vyjít desetinný, protože parametry jsou definovány jako celá čísla) a nakonec kořeny kvadratické rovnice x1 a x2, které jsou definovány jako extended, protože vznikají odmocněním (může být desetinné číslo).
Na začátku programu postupně necháme od uživatele načíst parametry a, b, c:
write('a=');
readln(a);
Analogické načtení se opakuje i s parametry b a c.
Dosavadní postup lze vylepšit přidáním ověření (pomocí odchytávání výjimek). Funkce je jednoduchá a sice do bloku try se napíší řádky kódu, u kterých je možné, že dojde k situaci, kdy aplikace nebude schopna pokračovat v chodu (zde by to byl případ, kdyby nebyl zadán platný argument pro a,b nebo c. Při použití bloku try aplikace v takovém okamžiku nespadne, ale automaticky přejde do následujícího bloku except, který se provede jen tehdy, kdy byla aplikace donucena blok try přerušit (například právě v případě, že uživatel zadá do paramentru místo čísla znak). Pomocí except mu je vypsána hláška o dalším postupu aplikace.
A nyní již 'jen' následuje ověřování podmínek na typ rovnice a počítání výsledků. Dle zadaných parametrů může vyjít 7 typů rovnic, které jsou vyřešeny. Jejich seznam je uveden v následující tabulce. Číslo 1 znamená kladná hodnota, číslo 0 nulová hodnota a číslo -1 znamená záporná hodnota.
rovnice | a | b | c |
1 | 0 | 0 | 0 |
2 | 0 | 0 | -1/1 |
3 | 0 | -1/1 | -1/0/1 |
4 | -1/1 | 0 | 0 |
5 | -1/1 | 0 | 1 |
6 | -1/1 | 0 | -1 |
7 | -1/1 | -1/0/1 | -1/1 |
Program vždy vypíše jaké byly zadány parametry, popřípadě, o jakou rovnici se jedná a pokud rovnici nelze vyřešit z důvodu odmocňování záporného čísla, tak vypíše, že pro reálná čísla neexistuje řešení. Tento postup vypadá složitě, ale neměla by existovat jednoduchá rovnice ve tvaru y=ax^2+bx+c, která by se takto nedala vyřešit.
writeln;
writeln('Po stisknuti klavesy ENTER bude program ukoncen');
readln;
program kvadraticka_rovnice;
{$APPTYPE CONSOLE}
uses
SysUtils,
Math;
var a,b,c:integer;
diskriminant:integer;
x1,x2:extended;
begin
{ TODO -oUser -cConsole Main : Insert code here }
writeln('Vita Vas program na vypocet korenu kvadraticke rovnice y = ax^2 + bx + c');
writeln;
writeln('Zadavejte postupne jednotlive parametry...');
try
write('a=');
readln(a);
except
writeln('Nebyl zadan platny argument, bude pouzita hodnota a=0');
a:=0;
end;
try
write('b=');
readln(b);
except
writeln('Nebyl zadan platny argument, bude pouzita hodnota b=0');
b:=0;
end;
try
write('c=');
readln(c);
except
writeln('Nebyl zadan platny argument, bude pouzita hodnota c=0');
c:=0;
end;
if (a=0)AND(b=0)AND(c=0) then
begin
writeln('Byly zadany parametry pro rovnici 0=0');
writeln('X nalezi do mnoziny realnych cisel');
end
else if (a=0)AND(b=0) then
begin
writeln('Byly zadany parametry pro rovnici 0=', c);
writeln('Rovnice nema reseni pro realna cisla');
end
else if (a=0)AND(b<>0) then
begin
writeln('Byly zadany parametry pro linearni rovnici 0=', b, 'x+', c);
writeln('X = ', -c/b:0:2);
end
else if (a<>0)AND(b=0)AND(c=0) then
begin
writeln('Byly zadany parametry pro kvadratickou rovnici 0=', a, 'x^2');
writeln('X1,2 = 0');
end
else if (a<>0)AND(b=0)AND(c>0) then
begin
writeln('Byly zadany parametry pro kvadratickou rovnici 0=', a, 'x^2+', c);
writeln('Rovnice nema reseni pro realna cisla');
end
else if (a<>0)AND(b=0)AND(c<0) then
begin
writeln('Byly zadany parametry pro kvadratickou rovnici 0=', a, 'x^2-', -c);
x1:=sqrt(-c/a);
x2:=-x1;
writeln('X1=', x1:0:2);
writeln('X2=', x2:0:2);
end
else if (a<>0)AND(b<>0) then
begin
writeln('Byly zadany parametry pro kvadratickou rovnici 0=', a, 'x^2+', b, 'x+', c)
diskriminant:=b*b-4*a*c;
if (diskriminant>=0) then
begin
x1:=(-b+sqrt(diskriminant))/(2*a);
x2:=(-b-sqrt(diskriminant))/(2*a);
writeln('X1=', x1:0:2);
writeln('X2=', x2:0:2);
end
else
writeln('Rovnice nema reseni pro realna cisla');
end;
writeln;
writeln('Po stisknuti klavesy ENTER bude program ukoncen');
readln;
end.
Vylepšete program, aby bylo možno zadávat desetinná čísla jako hodnoty parametrů a aby byl program schopen s nimi počítat bez převádění na celá.