Program v C - kvadratická rovnice

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
Velous
Příspěvky: 99
Registrován: 12 bře 2010, 00:00

Program v C - kvadratická rovnice

#1 Příspěvek od Velous »

Zdravím, mám za úkol napsat program, který bude po zadání čísel "a, b, c" počítat kořeny kvadratické rovnice. Pokud nezadám číslo "a", tak program vypíše: Rovnice je lineární, ale já potřebuji, aby mi ji vypočítal. Poté musím program ošetřit proti tomu, aby když uživatel zadá místo čísel např. písmeno, slovo, tak aby vypsal: Zdejte pouze čísla. Ale netuším jak to udělat. Prosím o pomoc. Děkuji.


Můj kód:

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main(void)
{
int xlin, r, i, a, b, c, D;
double x1, x2;




c

scanf("%d", &c);

return 0;
}
Naposledy upravil(a) Velous dne 05 pro 2012, 19:21, celkem upraveno 2 x.
Uživatelský avatar
mtajovsky
Příspěvky: 3728
Registrován: 19 zář 2007, 00:00
Bydliště: Praha

#2 Příspěvek od mtajovsky »

Funkce scanf() vrací počet úspěšně zkonvertovaných polí. Takže musí vrátit 1, jinak je to chyba. Jako znak typu bych použil e, f nebo g namísto d, aby to umělo desetinná čísla.

Dále bych projel celé nasnímané pole,a znak po znaku paranoidně kontroloval, jestli je v povolené množině, tj. +, -, desetinná tečka a cifra. Cifra se pozná podle binární hodnoty znaku v rozmezí 0x30 - 0x39. Dál je možno uplatňovat dodatečná pravidla - desetiná tečka smí být jen jednou, po ní už jen cifry a tak dále.

Nerozumím tomuto:

if (a == 0)
{
printf("\n Rovnice je linearni \n");
xlin = ((b + c) == 0);
}

To do xlin vloží buď 0 nebo jako výsledek nesrovnání nebo nenulu (závisí na implementaci překladače).

1) Nemůžete předpokládat, že true se bude konvertovat do (int)1.

2) Pokud bude například b = 2, c = -4, tak xlin má být 2, ale u vás bude výsledek 0.
Uživatelský avatar
Bernard
Příspěvky: 3654
Registrován: 27 kvě 2005, 00:00

#3 Příspěvek od Bernard »

Také případ D<0 si zaslouží zvláštní pozornost. Vypočítat (sqrt(-D))/2a a do výstupu k tomu výsledku ještě přilepit imaginární jednotku i.
Uživatelský avatar
Velous
Příspěvky: 99
Registrován: 12 bře 2010, 00:00

#4 Příspěvek od Velous »

mtajovsky píše:To do xlin vloží buď 0 nebo jako výsledek nesrovnání nebo nenulu (závisí na implementaci překladače).

1) Nemůžete předpokládat, že true se bude konvertovat do (int)1.

2) Pokud bude například b = 2, c = -4, tak xlin má být 2, ale u vás bude výsledek 0.


A když tam dám:
if (a == 0)
{
printf("\n Rovnice je linearni \n");
xlin = b/c;
}
???


Jak mám přilepit k výsledku imaginární jednotku i? Jinak v C jsem naprostý začátečník.
Uživatelský avatar
mtajovsky
Příspěvky: 3728
Registrován: 19 zář 2007, 00:00
Bydliště: Praha

#5 Příspěvek od mtajovsky »

Tak snad -c/b je OK :)

Imaginární jednotku přilepíte do výstupu stejně jako na papíře. Vypočtete reálnou rex a imaginární imx složku a pak:

printf("%f+%fi\n", rex, imx);
printf("%f-%fi\n", rex, imx);
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“