Wskaźniki, funkcje

0

Witam jest początkującym, mam problem z poniższym kodem, nie wiem dokładnie na czym polega błąd. Szukałem na forum podpowiedzi ale niestety nie udało mi się znaleźć odpowiedzi na mój problem. Teoretycznym zadaniem "programu" jest wskazanie trzech największych liczb podawanych przez użytkownika. Za wskazanie błędów będę wdzięczny.


using namespace std;

float uaktualnianianie_najwiekszej(float* max1, float* max2, float* max3, float* liczba);
float wyswietl_wynik(float* max1, float* max2, float* max3);




int main()
{
	setlocale(LC_ALL, "pl_PL");

	float max1 = -1, max2 = -1, max3 = -1;
	float liczba = 0;

	do
	{
		cout << "Podaj liczbe dodatnią:\n";

		cin >> liczba;

		uaktualnianianie_najwiekszej(&max1, &max2, &max3, &liczba);
	}

	while (liczba >= 0);

	wyswietl_wynik(&max1, &max2, &max3);


	return 0;

}

float uaktualnianianie_najwiekszej(float* max1, float* max2, float* max3, float* liczba)
{

	if (liczba >= 0)
	{
		if (max1 >= 0)
		{
			max3 = max2;
			max2 = max1;
			max1 = liczba;
		}
		else
			if (max2 >= 0)
			{
				max2 = max1;
				max1 = liczba;
			}
			else
				if (max3 >= 0)
				{
					max3 = liczba;
				}
	}


	return *max1, * max2, * max3, * liczba;

}

float wyswietl_wynik(float* max1, float* max2, float* max3)
{


	if (max1 >= 0)
		cout << "Najwieksza liczba :" << (float*)max1 << endl;
	{
		if (max2 >= 0)
		{
			cout << "Druga najwieksza liczba :" << (float*)max2 << endl;
		}
		if (max3 >= 0)
		{
			cout << "Trzecia najwieksza liczba :" << (float*)max3 << endl;
		}

	}

	return *max1, * max2, * max3;


}
0

Poczytaj o dereferencji wskaźników. Musisz wszędzie dodawać te gwiazdki jeżeli chcesz się dostać do wartości.

1

Błąd 1.
Próbujesz zwracać przy użyciu return 3 albo 4 wartości, podczas gdy funkcja może zawsze zwrócić tylko jedną wartość (albo referencję).

Błąd 2.
Próbujesz zwracać przy użyciu return, to czego nie musisz wcale zwracać, bo zwracasz i tak przez referencję. Zadeklaruj te funkcje jako void.

Błąd 3.
if w linii 62 obejmuje tylko następną linijkę, a to co jest między liniami 64 a 74 wykona się niezależnie od warunku z linii 62. To w sumie i tak nie ma znaczenia ze względu na warunki zadania, ale sugeruje, że nie wiesz za bardzo co robisz.

Błąd 4.
Twój algorytm uaktualniania nie działa. Nie wyjdzie nawet poza stan początkowy, bo na początku wszystkie liczby równają się -1, zatem liczba nie zostanie przypisana żadnej zmiennej. Ponadto, nie sprawdzasz, czy nowa liczba jest większa niż wartości maxN, tylko czy maxN > 0, co jest bez sensu. Przemyśl jeszcze raz sam algorytm.

0

Zrób 3-elementową tablicę

float uaktualnianianie_najwiekszej(float max[4],float value)
{
    max[3]=value;
    for(int i=2;(i>=0)&&(max[i]<max[i+1]);--i) swap(max[i],max[i+1]);
}
int main()
{
    float max[4];
    for(float value;(cout<<"Podaj liczbe dodatnią: ")&&(cin>>value)&&(value>=0);) uaktualnianianie_najwiekszej(max,value);
    for(int i=0;(i<3)&&(max[i]>=0);++i) cout<<max[i]<<' ';
    return 0;
}
0
#include <iostream>
using namespace std;
float uaktualnianianie_najwiekszej(float* max1, float* max2, float* max3, float* liczba);
void wyswietl_wynik(float* max1, float* max2, float* max3);


int main()
{
	setlocale(LC_ALL, "pl_PL");

	float max1 = -1, max2 = -1, max3 = -1;
	float liczba = 0;

	do
	{
		cout << "Podaj liczbe dodatnią: " << endl;

		cin >> liczba;

		uaktualnianianie_najwiekszej(&max1, &max2, &max3, &liczba);
	}

	while (liczba >= 0);

	wyswietl_wynik(&max1, &max2, &max3);


	return 0;

}

float uaktualnianianie_najwiekszej(float* max1, float* max2, float* max3, float* liczba)
{

	if (*liczba >= 0)
	{
		if (*liczba >= *max1)
		{
			*max3 = *max2;
			*max2 = *max1;
			*max1 = *liczba;
		}
		else
			if (*liczba >= *max2)
			{
				*max2 = *max1;
				*max1 = *liczba;
			}
			else
				if (*liczba >= *max3)
				{
					*max3 = *liczba;
				}
	}
	
	return *liczba;

}

void wyswietl_wynik(float* max1, float* max2, float* max3)
{
	cout << "Największa liczba to:" << *max1 << endl;
	cout << "Druga największa liczba to:" << *max2 << endl;
	cout << "Trzecia największa liczba to:" << *max3 << endl;
}

Poprawiłem to w ten sposób, kompiluje sie, ale nie zwraca poprawnych wartości , podając po kolei np. 8,3,6 zwraca że max1=6, max2=8, a max3=3.

0

Użycie wskaźników w tym przypadku, to jak użycie śmigła samolotu do zamieszenia herbaty.
Jeżeli faktycznie zadanie polega na

Teoretycznym zadaniem "programu" jest wskazanie trzech największych liczb podawanych przez użytkownika

to cały problem można zredukować do użycia posortowanego kontenera std::set


    std::set<float,std::greater<float>> numbers;
    float liczba {0};

    do
    {
        std::cout << "Podaj liczbe dodatnia: " << endl;
        std::cin >> liczba;
        numbers.insert(liczba);
        if( numbers.size()>3 ) numbers.erase( --numbers.end() );
    }
    while( liczba >= 0 );

    for( const auto& number : numbers ) std::cout << number << " ";

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