Piszę program w Code::Blocks 13.12, który na podstawie podanych 5 liczb wyznacza taką, która znajduje się najbliżej średniej. Za metodę przyjąłem odejmowanie w przypadku liczby większej od średniej lub dodawanie w przypadku liczby mniejszej od średniej wartości 0.001, co umieściłem w pętli while, przy okazji inkrementując wartość powtórzeń (w programie jako zmienna "kroki"). Nie rozumiem dlaczego dla liczb oddalonych tak samo od średniej przyjmuje inne wartości powtórzeń pętli np dla średniej 15, wartość kroków dla liczby 5 to 9998, dla 10 4998, dla 20 5002, a dla 25 10005. Skąd takie dziwne wartości i jak mogę naprawić ten błąd?
ps. Program nie bierze jeszcze pod uwagę występowania 2 liczb tak samo oddalonych od średniej, lecz to nie jest teraz problemem. Tak samo nie interesuje mnie póki co inne, nawet bardziej wydajne rozwiązanie problemu, a jedynie przyczyna wystąpienia takiej anomalii.
#include <iostream>
using namespace std;
float liczba[ 5 ], suma = 0, srednia;
int kroki[ 5 ];
int main()
{
cout << "Program sluzy do wyznaczania liczby, ktora jest nablizsza sredniej z 5 podanych." << endl;
cout << "Liczby, z ktorych sie ja wyznacza moga miec 2 miejsca po przecinku,"
<< endl << "za ktory sluzy kropka." << endl << endl;
for( int i = 0; i < 5; i++ )
{
cout << "Podaj " << i + 1 << " liczbe : ";
cin >> liczba[ i ];
}
for( int i = 0; i < 5; i++ )
{
suma += liczba[ i ];
}
cout << "Suma: " << suma << endl;
srednia =( suma / 5 );
cout << "Srednia: " << srednia << endl;
for( int i = 0; i < 5; i++ )
{
kroki[ i ] = 0;
if( liczba[ i ] < srednia )
{
while( liczba[ i ] < srednia )
{
liczba[ i ] += 0.001;
kroki[ i ] ++;
}
}
else if( liczba[ i ] > srednia )
{
while( liczba[ i ] > srednia )
{
liczba[ i ] -= 0.001;
kroki[ i ] ++;
}
}
else
{
kroki[ i ] = 0;
}
cout << "Dla liczby " << i + 1 << " liczba krokow wynosi: " << kroki[ i ] << endl;
}
return 0;
}