MeM Temat założony przez niniejszego użytkownika |
Funkcja for z dwoma zmiennymi [i]. » 2014-07-07 15:47:42 Witajcie. Od niedawna uczę się programować w C++ korzystając z tutoriali Mirosława Zelenta. Jako zadanie domowe trzeba było stworzyć program w którym: - Podajemy 5 liczb - Wyliczamy średnią - Podajemy, która liczba jest najbliżej średniej. Stworzyłem coś takiego: #include <iostream> #include <cstdlib>
using namespace std;
float liczba[ 4 ], l[ 4 ]; float srednia, r, wynik;
int main() { cout << "Podaj 5 liczb: " << endl; cin >> liczba[ 0 ] >> liczba[ 1 ] >> liczba[ 2 ] >> liczba[ 3 ] >> liczba[ 4 ]; srednia =( liczba[ 0 ] + liczba[ 1 ] + liczba[ 2 ] + liczba[ 3 ] + liczba[ 4 ] ) / 5; cout << "Srednia to: " << srednia << endl; for( int i = 0; i < 5; i++ ) { l[ i ] = liczba[ i ] - srednia; } for( int i = 0; i < 5; i++ ) { if( l[ i ] < 0 ) l[ i ] =- l[ i ]; } wynik = liczba[ 0 ]; r = l[ 0 ]; if( r > l[ 1 ] ) r = l[ 1 ]; wynik = liczba[ 1 ]; if( r > l[ 2 ] ) r = l[ 2 ]; wynik = liczba[ 2 ]; if( r > l[ 3 ] ) r = l[ 3 ]; wynik = liczba[ 3 ]; if( r > l[ 4 ] ); wynik = liczba[ 4 ]; cout << "Liczba najbliższa sredniej to: " << wynik; return 0; } Niestety, problem polega na tym, że nie mam pojęcia dlaczego, jako wynik wychodzi l[ 0 ] (różnica pomiedzy pierwsza liczba a srednia), a nie liczba poprawna czy nawet pierwsza podana liczba. Nie przerabiałem jeszcze wartości bezwzględnych toteż chciałem: - od każdej liczby odjąć średnią - w przypadku ujemnej wartości zmienić znak na przeciwny - porównać ze sobą różnice - ta która będzie najmniejsza, będzie miała liczbę najbliższą średniej. Gdzie popełniłem błąd? |
|
Monika90 |
» 2014-07-07 16:00:57 Przede wszystkim twoje tablice są za małe, masz 5 liczb, a w tablicy int liczba[4] mieszczą się 4. |
|
pekfos |
» 2014-07-07 17:26:25 wynik = liczba[ 0 ]; r = l[ 0 ];
if( r > l[ 1 ] ) r = l[ 1 ];
wynik = liczba[ 1 ]; if( r > l[ 2 ] ) r = l[ 2 ];
wynik = liczba[ 2 ]; if( r > l[ 3 ] ) r = l[ 3 ];
wynik = liczba[ 3 ]; if( r > l[ 4 ] );
wynik = liczba[ 4 ];
|
Gdzie sens? |
|
MeM Temat założony przez niniejszego użytkownika |
» 2014-07-07 22:23:53 wynik - czyli to co chcemy osiagnac r - jest to "różnica między średnią dla poszczególnych liczb" jeżeli różnica jest najmniejsza, wtedy jest najbliższa zeru (bo dla każdej <0 stworzyłem ifa który zamienia liczbe ujemna na dodatnia) i jeżeli różnica jest najmniejsza, wtedy odpowiada ona określonej liczbie, dla i=0 mamy liczba[ 0 ] i l[ 0 ] Monika w tablicy int liczba[4] sie mieszczą liczby od 0 do mniejszych od 5 czyli 0, 1 ,2 ,3 ,4 co daje łącznie 5 liczb |
|
pekfos |
» 2014-07-07 22:28:06 wynik - czyli to co chcemy osiagnac r - jest to "różnica między średnią dla poszczególnych liczb" jeżeli różnica jest najmniejsza, wtedy jest najbliższa zeru (bo dla każdej <0 stworzyłem ifa który zamienia liczbe ujemna na dodatnia) i jeżeli różnica jest najmniejsza, wtedy odpowiada ona określonej liczbie, dla i=0 mamy |
Tyle to sam bym się domyślił. I nie pytałbym o sens kodu, który sens ma. Przypatrz się wcięciom w sformatowanym przez forum kodzie.. ;) |
|
Glazus |
» 2014-07-07 22:32:41 w tablicy int liczba[4] sie mieszczą liczby od 0 do mniejszych od 5 czyli 0, 1 ,2 ,3 ,4 co daje łącznie 5 liczb |
Nie. Liczba w [] wskazuje Ci ile elementów mieści się w tablicy. wynik - czyli to co chcemy osiagnac |
Ale zdajesz sobie sprawę, że w cytowanym przez pekfosa fragmencie kodu zmieniasz wartość zmiennej wynik pięć razy? |
|
MeM Temat założony przez niniejszego użytkownika |
» 2014-07-07 23:40:37 Glazus i Pekfos A nie jest tak, że dla każdej liczba [0] jest przypisana konkretna liczba (ktora jest zczytywana z cin) i w następstwie dla każdego l[4] jest przypisana kolejna oparta na tablicy z liczba[4]? Jakbym zamienił tablice na zmienne a,b,c,d,e i analogicznie zamienil tablice l[4] to zadziałałby program, czy mam błąd logiczny? Da się jakoś usprawnić nie zmieniając przesadnie kodu? Druga sprawa - wynik zmieniam maksymalnie 5 razy, w przypadku gdy ostatnia liczba jest najbliżej średniej. Jest to problemem? Sugerowałem się na poleceniu z wyszukiwaniem maksymalnej liczby poprzez: int x, y, z, m; cin >> x >> y >> z;
m = x; if( y > m ) m = y;
if( z > m ) m = z;
|
|
Glazus |
» 2014-07-07 23:58:14 Druga sprawa - wynik zmieniam maksymalnie 5 razy |
Nie. Ty zawsze zmieniasz pięć razy. A nie jest tak, że dla każdej liczba [0] jest przypisana konkretna liczba (ktora jest zczytywana z cin) i w następstwie dla każdego l[4] jest przypisana kolejna oparta na tablicy z liczba[4]? Jakbym zamienił tablice na zmienne a,b,c,d,e i analogicznie zamienil tablice l[4] to zadziałałby program, czy mam błąd logiczny? Da się jakoś usprawnić nie zmieniając przesadnie kodu? |
Nie wiem o co chodzi, ale mam nadzieję, że napisanie tego wprost Cię jakoś oświeci. int liczba[ 4 ];
liczba[ 0 ], liczba[ 1 ], liczba[ 2 ], liczba[ 3 ]
liczba[ 4 ] |
|
« 1 » 2 |