Funkcja kwadratowa, miejsca zerowe

0

mam problem z obliczaniem miejsc zerowych
nie wiem dlaczego ale wyprowadza zle wyniki

#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <cmath>

using namespace std;

void main()
{
	float fA;
	cout << "Podaj wspolczynnik a: ";
	cin >> fA;

	float fB;
	cout << "Podaj wspolczynnik b: ";
	cin >> fB;

	float fC;
	cout << "Podaj wspolczynnik c: ";
	cin >> fC;

	double delta;
	delta = fB * fB - 4 * fA * fC;
	double p_delta = sqrt(delta);


	if (fA == 0)
	{
		if (fB == 0.0)
		{
			if (fC == 0.0)
				cout << "Rownanie spelnia kazda liczba rzeczywista."
				<< endl;
			else
				cout << "Rownanie nie posiada rozwiazan." << endl;
		}
		else
			cout << "x = " << -fC / fB << endl;
	}
	else if (delta > 0)
	{
		cout << "delta = " << delta << endl;
		cout << "x1 = " << (-fB - p_delta) / 2 * fA << endl << "x2 = " << (-fB + p_delta) / 2 * fA;
	}
	else if (delta == 0)
	{
		cout << "delta = " << delta << endl;
		cout << "x = " << -fB / 2 * fA;
	}
	else cout << "brak rozwiazan";

	_getch();
}

z gory dziekuje za odp!!!

1

Co to znaczy złe wyniki? Jakie są dane wejściowe, jakie oczekiwane wyjściowe, jakie rzeczywiste wyjściowe?

Poza tym liczb zmiennoprzecinkowych się nie porównuje za pomocą ==. Polecam lekturę: http://edu.i-lo.tarnow.pl/inf/utils/001_2008/0119.php

0

I zajrzyj do podręcznika z wzorami na pierwiastki równania.

0

powiedzmy ze dla fA = 3; fB = 33; fC =4;
x1= 0
x2= 0
a powinno byc:
x1= -10.88
x2= -0.13

0
bogdans napisał(a):

I zajrzyj do podręcznika z wzorami na pierwiastki równania.

co mi to da? przeciez znam wzory

0

Z kodu wynika, że nie znasz, bo stosujesz błędne.

0
bogdans napisał(a):

Z kodu wynika, że nie znasz, bo stosujesz błędne.

to powiedz co robie zle...
jesli masz mi tylko tyle pisac albo udowodnic ze umiesz wiecej ode mnie to wcale nie pisz

1

Brakuje nawiasów: / 2 * fA -> / (2 * fA).

0

Wszędzie przy takich:

-fB / 2 * fA

zła kolejność obliczeń, bo brakuje nawiasów.

0

jesli jest tak

cout << "x1 = " << (-fB - p_delta) / (2 * fA) << endl << "x2 = " << (-fB + p_delta) / (2 * fA);

to wyswietla -1.#INF

1

To zmień kompilator, ja mam poprawne wyniki, zajrzyj też tu: http://ideone.com/xFITx3

0
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <cmath>

using namespace std;

void main()
{
	float fA;
	cout << "Podaj wspolczynnik a: ";
	cin >> fA;

	float fB;
	cout << "Podaj wspolczynnik b: ";
	cin >> fB;

	float fC;
	cout << "Podaj wspolczynnik c: ";
	cin >> fC;

	double delta;
	delta = fB * fB - 4 * fA * fC;
	double p_delta = sqrt(delta);


	if (fA == 0)
	{
		if (fB == 0)
		{
			if (fC == 0)
				cout << "Rownanie spelnia kazda liczba rzeczywista."
				<< endl;
			else
				cout << "Rownanie nie posiada rozwiazan." << endl;
		}
		else
			cout << "x = " << -fC / fB << endl;
	}
	else if (delta > 0)
	{
		cout << "delta = " << delta << endl;
		cout << "x1 = " << (-fB - p_delta) / (2 * fA) << endl << "x2 = " << (-fB + p_delta) / (2 * fA);
	}
	else if (delta == 0)
	{
		cout << "delta = " << delta << endl;
		cout << "x = " << -fB / 2 * fA;
	}
	else cout << "brak rozwiazan";

	_getch();
}

rzeczywiscie dziala ale jesli jest == a nie = ktos wytlumaczy dlaczego tak sie dzieje? (sprawdzalem na dwoch kompilatorach (code::blocks visual studio) i problem jest taki sam)

0

? jakie == jakie =

przeciez ten kod powyzej z tym z pierwszego postu nic nie zmienia jezeli chodzi o =

= -> przypisanie
== -> porownanie

0

wlasnie zmienia i nie wiem dlaczego :/

1

Kod z pierwszego postu (który ponoć nie działa) różni się od ostatniego kodu tylko dopisanymi nawiasami i postacią porównań gdy fA jest zerem, było if(fB ==0.0), jest if(fB == 0). Coś kręcisz.

0

jesli jest jeden znak rownosci to w jednym i w drugim kompilatorze wynik x1 i x2 jest -1inf jesli sa dwa znaki rownosci to wynik jest prawidlowy (WTF!?) dlaczego tak sie dzieje skoro ta instrukcja nawet nie jest uzywana w obliczaniu miejsc zerowych?

0

w ktorym miejscu chodzi Ci o ten jeden znak rownosci?

bo tak jak pisalem ja i tak jak pisal bogdans. PIERWSZY kod ktory wrzuciles nie rozni sie znakami rownosci od tego co wrzucilas jako OSTATNIE

doprecyzuj dokladnie pytanie.

0
if (fA = 0)
	{
		if (fB = 0)
		{
			if (fC = 0) 

x1 x2 = -1inf

if (fA == 0)
	{
		if (fB == 0)
		{
			if (fC == 0) 

x1 x2 wyniki sa prawidlowe

1

przypisujesz do zmiennej fA wartosc zero i sprawdzasz w ifie czy wartosc jest prawdziwa

Nie jest bo masz tam zero (jezelibylo by cokolwiek innego od zera wtedy bylby warunek spelniony)
idzie do nastepnego ifa
patrzy a tam delta jest wieksza od 0 (bo zostala wyliczona wczesniej)

wiec masz dzialanie

cout << "x1 = " << (-fB - p_delta) / (2 * fA) << endl << "x2 = " << (-fB + p_delta) / (2 * fA);

gdzie fA jest = 0
2*0 = 0
dzielenie przez zero == INF

0

oczywiscie masz racje ale nie wazne co podstawie pod fA </code> to jesli instrukacja wyglada tak <code class="cpp"> if (fA = 0)</code> a nie tak <code class="cpp"> if (fA == 0)
wynik jest bledny
chyba ze program z gory zaklada ze mozemy podstawic pod fA 0
wiec wypisuje glupoty
generalnie problem jest rozwiazany ale jestem uparty i chce wiedziec dlaczego tak sie dzieje zeby nie popelnic tego samego bledu w przyszlosci :P

1

o czym Ty piszesz ;o

Wez czytaj moj post dopoki nie zrozumiesz

podajesz wspolczynnik fA na JAKIS (np 10) i na podstawie tego wyliczasz delte a POZNIEJ zmieniasz go na ZERO i probujesz DZIELIC PRZEZ ZERO

0

faktycznie teraz zrozumialem :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1