Anglická verze
logolink

< Zpět na seznam lekcí

Algoritmus řešení kvadratické rovnice y = ax2 + bx + c

AlgortimyObsah lekce:

  • Použité knihovny a proměnné
  • Zadání parametrů
  • Vylepšení zadání parametrů pomocí try-except
  • Seznam typů rovnic, které mohou vzniknout
  • Závěr programu
  • Celý zdrojový kód k programu

Použité knihovny a proměnné

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).

Zadání parametrů

Na začátku programu postupně necháme od uživatele načíst parametry a, b, c:

Zadání parametrů
write('a=');
readln(a);

Analogické načtení se opakuje i s parametry b a c.

Vylepšení zadání parametrů pomocí try-except

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.

Seznam typů rovnic, které mohou vzniknout

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.

rovniceabc
1000
200-1/1
30-1/1-1/0/1
4-1/100
5-1/101
6-1/10-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.

Závěr programu

Následuje jen ukončení programu.
writeln;
writeln('Po stisknuti klavesy ENTER bude program ukoncen');
readln;

Celý zdrojový kód k programu

Celý zdrojový kód programu je přiložen zde:
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.

Otázky

  1. K čemu slouží blok try-except?
  2. Najdete v programu logickou chybu, kterou lze vylepšit?

Úkol k programu

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á.

webdesign, xhtml, css, php - Mgr. Michal Mikláš