Funkcja kwadratowa, miejsca zerowe

Funkcja kwadratowa, miejsca zerowe
SweetlyDeer
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
0

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

Kopiuj
#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!!!

twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
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

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
0

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

SweetlyDeer
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
0

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

SweetlyDeer
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
0
bogdans napisał(a):

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

co mi to da? przeciez znam wzory

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
0

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

SweetlyDeer
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
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

lukasz1235
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1105
1

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

twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
0

Wszędzie przy takich:

Kopiuj
-fB / 2 * fA

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

SweetlyDeer
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
0

jesli jest tak

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

to wyswietla -1.#INF

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
1

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

SweetlyDeer
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
0
Kopiuj
#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)

fasadin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4883
0

? jakie == jakie =

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

= -> przypisanie
== -> porownanie

SweetlyDeer
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
0

wlasnie zmienia i nie wiem dlaczego :/

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
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.

SweetlyDeer
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
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?

fasadin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4883
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.

SweetlyDeer
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
0
Kopiuj
if (fA = 0)
	{
		if (fB = 0)
		{
			if (fC = 0) 

x1 x2 = -1inf

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

x1 x2 wyniki sa prawidlowe

fasadin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4883
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

Kopiuj
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

SweetlyDeer
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
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

fasadin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4883
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

SweetlyDeer
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
0

faktycznie teraz zrozumialem :D

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.