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ů
  • Seznam typů rovnic, které mohou vzniknout
  • Závěr programu
  • Celý zdrojový kód k programu
  • Úkol k programu
  • Otázky

Použité knihovny a proměnné

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

Zadání parametrů

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

Zadání parametrů
printf("a = ");
scanf("%f", &a);

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

Vylepšení zadání parametrů

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

Ošetření vstupní hodnoty
    stav = scanf("%d", &a);
	if (stav != 1)
	{
		printf("Nebyl zadan platny argument, bude pouzita hodnota a = 0\n");
		a = 0;
	}

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 neexistuje 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.
printf("\n");
printf("Po stisknuti klavesy ENTER bude program ukoncen");
getchar();

Celý zdrojový kód k programu

Celý zdrojový kód programu je přiložen zde zde:
#include "stdafx.h"
#include &lt;math.h&gt;

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;
}

Domácí úkol

  1. K čemu slouží návratová hodnota funkce scanf?
  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áš