Jak poprawnie zapisać funkcje która zwraca 3 wartości do funkcji main()

0

Czesc mam pytanie, cwicze pisanie wlasnych funkcji.
do tego momentu zapisalem cos takiego.


#include <iostream>
#include <cmath>

using namespace std;
float wczytywanie(float, float, float);

int main()
{
	float a, b, c;
	wczytywanie(a, b, c);

	system("pause");
	return 0;
}
float wczytywanie(float a, float b, float c)
{
	float e, f, g;

	cout << "Podaj wspolczynniki rownania, a = ";
	cin >> e;
	cout << "b = ";
	cin >> f;
	cout << "c = ";
	cin >> g;
	return e, f, g;

}

i teraz moje pytanie, chcialbym napisac funkcje wczytywanie ktora wywolywana bylaby w funkcji int main() i zapisalaby te zmienne w funkcji main();
Jednak nie do konca mi to wychodzi.
Jakies dodbre rady jak rozwiazac ten problem ?

6

Przekazywanie parametru przez wartość i referencję

Przy czym:

  1. std::tuple wydaje się odpowiedzią na pytanie jako takie
  2. to jest poniekąd problem XY, bo w tym przypadku lepiej by było zwrócić strukturę zawierającą nazwane dane.
0

Dziekuje za szybka odpowiedz !!
Przeczytalem artykul ktory mi wyslales, zdecydowalem sie na referencje i tak rozwiazalem swoj problem.
Czy jest to prawidlowy zapis czy w pozniejszym kodzie moge natrafic na jakies problemy.

/*
Wczytać współczynniki rzeczywiste a, b, c równania ax2+bx+c=0. Wydrukować wszystkie rozwiązania tego równania, 
przy założeniu, że a nie jest równe zeru (nie trzeba tego sprawdzać).
*/

#include <iostream>
#include <cmath>

using namespace std;
float wczytywanie(float&, float&, float&);
void wyniki(float, float, float);

int main()
{
	float a, b, c;
	wczytywanie(a, b, c);
	wyniki(a, b, c);

	system("pause");
	return 0;
}
float wczytywanie(float& a, float& b, float& c)
{
	cout << "Podaj wspolczynniki rownania, a = ";
	cin >> a;
	cout << "b = ";
	cin >> b;
	cout << "c = ";
	cin >> c;
	return a, b, c;
}
void wyniki(float a, float b, float c)
{
	cout << "Twoja a =" << a << endl;
	cout << "Twoja b =" << b << endl;
	cout << "Twoja c =" << c << endl;
}

0

ok, skonczylem z tym zadaniem.
Rozwiazalem go tak:

/*
Wczytać współczynniki rzeczywiste a, b, c równania ax2+bx+c=0. Wydrukować wszystkie rozwiązania tego równania, 
przy założeniu, że a nie jest równe zeru (nie trzeba tego sprawdzać).
*/

#include <iostream>
#include <cmath>

using namespace std;

float wczytywanie(float&, float&, float&);
float rownanie_delta(float, float, float);
void wynik(float, float, float, float);


int main()
{
	float a, b, c, delta;
	wczytywanie(a, b, c);
	delta = rownanie_delta(a, b, c);
	wynik(delta,a,b,c);

	system("pause");
	return 0;
}
float wczytywanie(float& a, float& b, float& c)
{
	cout << "Podaj wspolczynniki rownania, a = ";
	cin >> a;
	cout << "b = ";
	cin >> b;
	cout << "c = ";
	cin >> c;
	return a, b, c;
}
float rownanie_delta(float a, float b, float c)
{
	float wynik;
	wynik = b * b - 4 * a * c;
	return wynik;
}
void wynik(float delta, float a, float b, float c)
{
	if (delta <0)
	{
		cout << "Delta = " << delta << endl;
		cout << "Rownanie nie ma rozwiazan" << endl;
	}
	else if (delta == 0)
	{
		float x;
		x = -b / (2 * a);
		cout << "Delta = " << delta << endl;
		cout << "rownanie ma jedno rozwiazanie czyli x = " << x << endl;
 	}
	else
	{
		float x1, x2;
		x1 = (-b - sqrt(delta)) / (2 * a);
		x2 = (-b + sqrt(delta)) / (2 * a);
		cout << "Delta = " << delta << endl;
		cout << "Rownianie ma dwa rozwiazania, x1 = " << x1 << " i x2 =" << x2 << endl;		
	}
}

Jestem swiadom ze mozna by to wszystko zapisac w funkcji main() oszczedzajac kilkanacie linijek kodu, ale to dla cwiczenia.
Chetnie jednak p[oslucham rad od Was co mozna by poprawic
pozdrawiam

0

Można użyć structured bindings (C++17), tak aby cały proces wczytywania zmiennych jeszcze bardziej uprościć.

#include <iostream>
#include <tuple>

using namespace std;

template<class T>
T get( istream& is )
{
    T result;
    is >> result;
    return result;
}

template<class T>
auto getValues()
{
    T a1 = get<T>(cin);
    T a2 = get<T>(cin);
    T a3 = get<T>(cin);
    return make_tuple(a1,a2,a3);
}

int main()
{
    auto [a1,a2,a3] = getValues<float>();
    cout << a1 << " " << a2 << " " << a3 << endl ;

    return 0;
}

lub też używając do tego celu kontenera vector

#include <iostream>
#include <vector>

using namespace std;

template<class T>
T get( istream& is )
{
    T result;
    is >> result;
    return result;
}

template<class T, int quantity>
auto getValues()
{
    vector<T> values(quantity);

    for( auto& value : values )
    {
        value = get<T>(cin);
    }

    return values;
}

int main()
{
    auto values = getValues<float,4>();
    for( const auto& value : values )
    {
      cout << value << " ";
    }

    return 0;
}
2

Nie no, chłopak się dopiero uczy pisać funkcje a Ty mu z szablonami wyskakujesz...
BTW skoro quantity jest znane w czasie kompilacji to dlaczego vector<T> a nie array<T>?

0
float wczytywanie(float& a, float& b, float& c)
{
	/* ... */
	return a, b, c;
}

Co chcesz osiągnąć przez taki zapis? Czy na pewno wiesz jak używać operatora przecinkowego?

0

Poczekajmy do C++23, to będzie można pisać coś w stylu:

#include <iostream>
#include <coroutine>

std::generator<int> f() {
    co_yield 1;
    co_yield 2;
    co_yield 3;
}

int main() {
    auto g = f();  
    while (g.move_next()) {
        std::cout << g.current_value() << std::endl;
    }
}

xD

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