Nesprávný výsledek kvadratické rovnice – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Nesprávný výsledek kvadratické rovnice – C / C++ – Fórum – Programujte.comNesprávný výsledek kvadratické rovnice – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Jakub
~ Anonymní uživatel
865 příspěvků
8. 5. 2012   #1
-
0
-

 Dobrý den,mohli by jste mi prosím poradit kde je chyba v níže uvedeném kódu? Pracuje správně,ale výpočet je nesprávný děkuji.


#include <stdio.h>
#include <MATH.H>
#include <conio.h> 



int main(void)
{
float a, b, c, x1, x2, d, i, r, n;


	printf("Zadej 3 cleny kvadraticke rovnice a,b,c\n");
	while(scanf("%lf %lf %lf",&a, &b, &c)==0)
		{
	printf("Toto neni cislo...");
	fflush(stdin);
		}
	d=(b*b-(4*a*c));
	int A = (1*(d>0)) + (2*(d==0)) + (3*(d<0));
	switch(A)
	{
	case 1 : 
	x1=(-b+sqrt(d))/2*a;
	x2=(-b-sqrt(d))/2*a;
	printf("Koren x1 je: %f. Koren x2 je: %f",x1,x2);
	break;
	case 2 :
	x1=(-b)/(2*a);
	x2=x1;
	printf("Koren x1 je: %f. Koren x2 je: %f",x1,x2);
	break;
	case 3 :
	d=fabs (d);
	x1=(-b+sqrt(d))/2*a;
	x2=(-b-sqrt(d))/2*a;
	r=sqrt(d);
	n=-(sqrt(d));
	printf("Koren x1 je: %lf+%lf*i. Koren x2 je: %lf+%lf*i",x1,x2,r,n);
	break;
	}
	return(0);
	
	
}
Nahlásit jako SPAM
IP: 91.187.35.–
Reklama
Reklama
jano
~ Anonymní uživatel
53 příspěvků
8. 5. 2012   #2
-
0
-
x1=(-b+sqrt(d))/2*a je zle na konci ma byt .../(2*a)

a to v kazdom pripade mozno tam je viac chyb ale toto mi udrelo do oci :)

Nahlásit jako SPAM
IP: 85.135.184.–
Jakub
~ Anonymní uživatel
865 příspěvků
8. 5. 2012   #3
-
0
-

#2 jano
ty jo díky moc kamaráde :) taková hrubka

Nahlásit jako SPAM
IP: 91.187.35.–
Jakub
~ Anonymní uživatel
865 příspěvků
8. 5. 2012   #4
-
0
-

float a, b, c, x1, x2, d, i, r, n;
další chyba má tam být double a ne float :)

Nahlásit jako SPAM
IP: 91.187.35.–
yaqwsx+9
Posthunter
8. 5. 2012   #5
-
0
-

#4 Jakub
Vyloženě špatně to není. Float je také číslo s plovoucí desetinnou čárkou. Jen má menší přesnost.

Nahlásit jako SPAM
IP: 85.160.36.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
Jakub
~ Anonymní uživatel
865 příspěvků
8. 5. 2012   #6
-
0
-

Aha, taky dobré vědět nevím, kde může být daná chyba, mám pocit ze je možná i někde problém ve switchi,protože jestli se mi to nezdá, tak ten program vynechává některou z case.

Nahlásit jako SPAM
IP: 91.187.35.–
bob
~ Anonymní uživatel
46 příspěvků
9. 5. 2012   #7
-
0
-

co ma proboha delat tenhle radek?

int A = (1*(d>0)) + (2*(d==0)) + (3*(d<0));

to sem teda nevidel 

Nahlásit jako SPAM
IP: 95.82.154.–
ingiraxo+15
Grafoman
9. 5. 2012   #8
-
+1
-
Zajímavé

#7 bob
Na tohle jsem taky koukal 

On využívá toho, že podmínka nebo resp. true/false je 1 a 0, čili kdyz d>0 a vrátí true, tak A = 1, protože ostatní budou 0 díky podmínce

Ale osobně jsem takovýhle řešení ještě neviděl, ale dal bych +1 za kreativitu =D

Nahlásit jako SPAM
IP: 195.113.126.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
bob
~ Anonymní uživatel
46 příspěvků
9. 5. 2012   #9
-
0
-

A co kdyz vyjde treba d = 0,3 ?

To pak jako bude 1 * 0,3 = 0.3 => Prevedeno se ztratou desetinne casti na int A = 0 ???

Zadny switch pro 0 tam nevidim.

Nahlásit jako SPAM
IP: 213.226.230.–
liborb
~ Redaktor
+18
Guru
9. 5. 2012   #10
-
0
-

Pro D > 0 bude A = 1, pro D == 0 bude A = 2 a pro D < 0 bude A = 3.

Nahlásit jako SPAM
IP: 78.80.52.–
ingiraxo+15
Grafoman
9. 5. 2012   #11
-
0
-

#9 bob
ale on nenásobí nic s 0.3 :)

Pokud má:

int A = (1*(d>0)) + (2*(d==0)) + (3*(d<0));

a pak.. d = 0.3; tak...

0.3>0 = true = 1 =1*1 = 1 => A = 1 :) ostatní co se provede je bezcenný, protože podmínky selžou a 2*0 nebo 3*0 = 0 a 1+0+0 = nečekaně 1 :)

Nahlásit jako SPAM
IP: 46.183.64.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
bob
~ Anonymní uživatel
46 příspěvků
9. 5. 2012   #12
-
0
-

Uz je mi to jasny, musel sem to dat do VS, protoze tenhle zpusob podminky/nepodminky jsem teda nikdy nevidel. 

Nahlásit jako SPAM
IP: 95.82.154.–
ingiraxo+15
Grafoman
9. 5. 2012   #13
-
0
-

#12 bob
jj, ale správně by to ale měl napsat jako: 

int A = d > 0 ? 1 : !d ? 2 : d < 0 ? 3 : 0;
Nahlásit jako SPAM
IP: 46.183.64.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
liborb
~ Redaktor
+18
Guru
10. 5. 2012   #14
-
0
-

Jen tak mimochodem ... výpočet hodnoty A je samoúčelné, zbytečné, zhoršuje čitelnost kódu a taky prodlužuje jeho vykonání, takže oba zápisy jsou stejně dobře. Proč nejít tou nejjednodušší cestou (a vyhnout se switch):


if (d > 0) {
	x1=(-b+sqrt(d))/2*a;
	x2=(-b-sqrt(d))/2*a;
	printf("Koren x1 je: %f. Koren x2 je: %f",x1,x2);
}
else if (d == 0) {
	x1=(-b)/(2*a);
	x2=x1;
	printf("Koren x1 je: %f. Koren x2 je: %f",x1,x2);
}
else {
	d=fabs (d);
	x1=(-b+sqrt(d))/2*a;
	x2=(-b-sqrt(d))/2*a;
	r=sqrt(d);
	n=-(sqrt(d));
	printf("Koren x1 je: %lf+%lf*i. Koren x2 je: %lf+%lf*i",x1,x2,r,n);
}

Kdyby na tu proměnnou A měl navázané třeba texty v poli apod., tak bych to bral, ale jinak ....

Nahlásit jako SPAM
IP: 78.80.52.–
bob
~ Anonymní uživatel
46 příspěvků
10. 5. 2012   #15
-
0
-

Ta silenost fflush(stdin) by tam taky nemela byt. Ze to funguje je tim, ze MS nedodrzuje standardy u C kompilatoru (viz letity problem s nemoznosti deklarace promennych kdekoliv uvnitr kodu).

Jinak GCC by vyhodilo chybu. Je to bezny jev, zacatecnici si tim ulehcuji praci.

http://faq.cprogramming.com/…smartfaq.cgi?…

Nahlásit jako SPAM
IP: 95.82.154.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 67 hostů

Podobná vlákna

Kvadratické rovnice — založil Adéla Mostranová

Nesprávný vstup — založil rozicky

Špatný výsledek — založil Bryant

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý