Obsah lekce:
Musíme přidat odkaz na hlavičkový soubor math.h, 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 float, 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:
printf("a = ");
scanf("%f", &a);
Analogické načtení se opakuje i s parametry b a c.
Dosavadní postup lze vylepšit přidáním ověření, zda byly vstupní parametry úspěšně načteny. Funkce je jednoduchá. Budeme kontrolovat výsledek, který nám vrací funkce scanf. V případě, že je vše v pořádku, je výsledkem této funkce počet načtených hodnot. V případě, že načítáme pouze jednu hodnotu, měla by funkce vrátit hodnotu 1. Výsledek si uložíme do proměnné a následně podmínkou zjistíme, zda se proměnná rovná požadované hodnotě. V případě, že ne, tak zobrazíme informaci o chybě.
stav = scanf("%d", &a);
if (stav != 1)
{
printf("Nebyl zadan platny argument, bude pouzita hodnota a = 0\n");
a = 0;
}
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 neexistuje rovnice ve tvaru y=ax^2+bx+c, která by se takto nedala vyřešit.
printf("\n");
printf("Po stisknuti klavesy ENTER bude program ukoncen");
getchar();
#include "stdafx.h"
#include <math.h>
int _tmain(int argc, _TCHAR* argv[])
{
int a, b, c;
int diskriminant;
int stav;
float x1, x2;
printf("Vita Vas program na vypocet korenu kvadraticke rovnice ax^2 + bx + c = 0\n");
printf("\n");
printf("Zadavejte postupne jednotlive parametry ...\n");
printf("a = ");
stav = scanf("%d", &a);
if (stav != 1)
{
printf("Nebyl zadan platny argument, bude pouzita hodnota a = 0\n");
a = 0;
}
printf("b = ");
stav = scanf("%d", &b);
if (stav != 1)
{
printf("Nebyl zadan platny argument, bude pouzita hodnota b = 0\n");
b = 0;
}
printf("c = ");
stav = scanf("%d", &c);
if (stav != 1)
{
printf("Nebyl zadan platny argument, bude pouzita hodnota c = 0\n");
c = 0;
}
if ((a == 0) && (b == 0) && (c == 0))
{
printf("Byly zadany parametry pro rovnici 0=0\n");
printf("X nalezi do mnoziny realnych cisel\n");
}
else if ((a == 0)&& (b == 0))
{
printf("Byly zadany parametry pro rovnici 0=%d\n", c);
printf("Rovnice nema reseni pro realna cisla\n");
}
else if ((a != 0)&& (b != 0))
{
printf("Byly zadany parametry pro linearni rovnici 0= %dx + %d\n", b, c);
printf("X = %.2f\n", -(float)c/b);
}
else if ((a != 0)&& (b == 0) && (c == 0))
{
printf("Byly zadany parametry pro kvadratickou rovnici 0=%dx^2\n", a);
printf("X1,2 = 0\n");
}
else if ((a != 0) && (b == 0) && (c > 0))
{
printf("Byly zadany parametry pro kvadratickou rovnici 0= %dx^2+%d\n", a, c);
printf("Rovnice nema reseni pro realna cisla");
}
else if ((a != 0) && (b == 0) && (c < 0))
{
printf("Byly zadany parametry pro kvadratickou rovnici 0= %dx^2-%d\n",a,-c);
x1 = sqrt(-(float)c/a);
x2 = -x1;
printf("X1 = %.2f\n", x1);
printf("X2 = %.2f\n", x2);
}
else if ((a != 0) && (b != 0))
{
printf("Byly zadany parametry pro kvadratickou rovnici 0= %dx^2+%dx+%d\n", a, b, c);
diskriminant = b*b-4*a*c;
if (diskriminant>=0)
{
x1 = (-b+sqrt((float)diskriminant))/(2*a);
x2 = (-b-sqrt((float)diskriminant))/(2*a);
printf("X1= %.2f\n", x1);
printf("X2= %.2f\n", x2);
}
else
{
printf("Rovnice nema reseni pro realna cisla\n");
}
}
printf("\n");
printf("Po stisknuti klavesy ENTER bude program ukoncen");
fflush(stdin);
getchar();
return 0;
}
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á.