Równanie kwadratowe C++ (referencja, wskaźnik)

0

Witam.
Mam za zadanie napisać funkcję rozwiązującą równanie kwadratowe. Nie byłoby w tym nic trudnego ale...
Funkcja otrzymuje jako argumenty trzy współczynniki równania kwadratowego oraz referencje do zmiennych.
Czytalem dużo o referencjach ale kompletnie nie wiem jak napisać taka funkcję wykorzystującą referencje. Proszę o pomoc!

Interesuje mnie również taka sama funkcja ale zamiast referencji są wskaźniki.

1
Itar9 napisał(a)

Witam.
Mam za zadanie napisać funkcję rozwiązującą równanie kwadratowe. Nie byłoby w tym nic trudnego ale...
Funkcja otrzymuje jako argumenty trzy współczynniki równania kwadratowego oraz referencje do zmiennych.
Czytalem dużo o referencjach ale kompletnie nie wiem jak napisać taka funkcję wykorzystującą referencje. Proszę o pomoc!

Interesuje mnie również taka sama funkcja ale zamiast referencji są wskaźniki.

"...oraz referencje do zmiennych", tzn. do tych trzech współczynników? Możesz przesłać te 3 zmienne przez referencje albo w funkcji głównej (czy gdzie tam pobierasz te dane) stworzyć referencje do pobranych danych i je przesłać do funkcji.
czyli

 
int x;
cin>>x;
int &refX = x

i już masz utworzoną referencję do zmiennej x i możesz ją przesłać do funkcji liczącej równanie kwadratowe, albo po prostu przesłać x przez referencje

double RownanieKwadratowe(int &x //jakiskod) 

Interesuje mnie również taka sama funkcja ale zamiast referencji są wskaźniki.

w argumencie funkcji dajesz wskaźniki zamiast referencji.

0

Własnie nie wiem czy do współczynników, nie rozumiem troche polecenia tego zadania...

1

Do równania kwadratowego wchodzą dwie zmienne i trzy współczynniki
Funkcja powinna wyglądać tak:

void RównanieKwadratowe(double A, double B, double C, double& x, double& y)
{
     y = A * x * x + B * x + C;
}
0
MJay napisał(a)

Do równania kwadratowego wchodzą dwie zmienne i trzy współczynniki
Funkcja powinna wyglądać tak:

void RównanieKwadratowe(double A, double B, double C, double& x, double& y)
{
     y = A * x * x + B * x + C;
}

Za y podstawiam 0? A co z x?
Nie rozumiem... Najlepiej gdybym zobaczył caly kod i go sobie na spokojnie przeanalizował;)

0

Trochę bez sensu, jedyną wartością jaką można "zwrócić" przez referencję jest wartość funkcji (czyli y), inne nie mają większego sensu.

1
#include <iostream>
using namespace std;

double& RownanieKwadratowe(double A, double B, double C, double& x, double& y)
{
     return (y = A * x * x + B * x + C); // zwracamy referencję do wartości y
}

void RownanieKwadratowe(double A, double B, double C, double* x, double* y)
{
     *y = A * *x * *x + B * *x + C;
}

int main()
{
	double x = 5, y;

	RownanieKwadratowe(1, 2, 3, x, y);
	cout << y << endl;

	RownanieKwadratowe(1, 2, 3, x, y) = 3; // to jest poprawne, gdyż zwracamy referencję do obiektu y
	cout << y << endl;

	RownanieKwadratowe(1, 2, 3, &x, &y);
	cout << y << endl;

	return 0;
}

Edit: wersja ze wskaźnikami.

0

Tak wygląda kompletne polecenie:
Napisz dwie wersje funkcji rozwiązującej równanie kwadratowe.
Funkcje otrzymują jako argumenty trzy współczynniki wielomianu kwadratowego oraz w pierwszej wersji:
referencje do zmiennych typu double, a w drugiej: wskaźniki do tych zmiennych.

0

No to teraz to ma sens, ona ma rozwiązywać, czyli zwróci dwa pierwiastki. W sumie napisałeś to już w pierwszym poście. :-P

0

Funkcje powinny jeszcze zwracać jakąś informację o ilości pierwiastków.

1

O masakra, rozwiązać równanie kwadratowe, a nie wyliczyć y z wielomianu. Najmocniej przepraszam.

int RownanieKwadratowe(double A, double B, double C, double& x1, double& x2)
{
     double delta = sqrt(B * B - 4 * A * C);
     if(delta > 0)
     {
          x1 = (-B - delta) / (2 * A);
          x2 = (-B + delta) / (2 * A);
          return 2;
     }
     else if(delta == 0)
     {
          x1 = x2 = (-B) / (2 * A);
          return 1;
     }
     else
          return 0;
}

int RownanieKwadratowe(double A, double B, double C, double* x1, double* x2)
{
     double delta = sqrt(B * B - 4 * A * C);
     if(delta > 0)
     {
          *x1 = (-B - delta) / (2 * A);
          *x2 = (-B + delta) / (2 * A);
          return 2;
     }
     else if(delta == 0)
     {
          *x1 = *x2 = (-B) / (2 * A);
          return 1;
     }
     else
          return 0;
}
0

Musisz podać x1 i x2 jako parametry funkcji. Nie można tu wprowadzić parametrów domyślnych i wywołać funkcję tak jak napisałeś w przykładzie, gdyż pierwiastki muszą pobierać adres istniejących obiektów

int main()
{
     int x1, x2;
     int a = 1, b = 2, c = 3;
     RownanieKwadratowe(a, b, c, x1, x2); // rekurencyjna wersja
     RownanieKwadratowe(a, b, c, &x1, &x2); // wersja wskaźnikowa
}
0
MJay napisał(a)

Musisz podać x1 i x2 jako parametry funkcji. Nie można tu wprowadzić parametrów domyślnych i wywołać funkcję tak jak napisałeś w przykładzie, gdyż pierwiastki muszą pobierać adres istniejących obiektów

int main()
{
     int x1, x2;
     int a = 1, b = 2, c = 3;
     RownanieKwadratowe(a, b, c, x1, x2); // rekurencyjna wersja
     RownanieKwadratowe(a, b, c, &x1, &x2); // wersja wskaźnikowa
}

Właśnie tak próbowałem robić, z referencja sie udało a przy wskaźnikach zwraca chyba adres zamiast wartości (lekko zmodyfikowałem program tak aby wypisywał wyniki x1 i x2), dodałem coś takiego na koniec każdej funkcji, w to liczba rozwiązań.

cout<<"Rozwiazania: "<<x1<<" oraz "<<x2<<endl;
cout<<"Liczba rozwiazan: ";
return w;
0

To nie dodawaj tego w funkcji, tylko poza nią.

0

Dzięki, teraz już wszystko działa tak jak powinno.

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