grzesiekz Temat założony przez niniejszego użytkownika |
Błędne sumowanie? » 2008-10-11 21:11:32 Witajcie. Muszę policzyć średnią ocen z wylosowanych ocen (ilość podaje użytkownik) i wszystko byłoby OK, bo zadania jest śmiesznie łatwe, gdyby nie fakt, że otrzymuję błędne wyniki o.O Nie wytykajcie mi, że można było coś tam zrobić łatwiej itp., bo muszę kierować się zasadami narzuconymi mi przez polecenie nauczyciela. Doskonale wiem, że bardzo dużo zapisów można zrobić krócej, jednak rozwinę je znacznie, aby łatwiej było mi zademonstrować, w czym tkwi problem. Oto fragment: void licz_srednia( int g[], int z ) { int ocena, suma; float srednia; for( int h = 0; h < z; h++ ) { ocena = g[ h ]; cout << ocena << endl; suma += ocena; cout << suma << endl; } srednia = suma / z; } Te wypisywania ciągłe i bardzo duża ilość zmiennych, jak już napisałem, jest stworzona tylko i wyłącznie w celu ułatwienia wskazania problemu, poza tym jest też wynikiem moich eksperymentów (metoda prób i błędów, już nie chciało mi się modyfikować przy wklejaniu). funkcja licz_srednia pobiera mi tablicę z ocenami wylosowanymi wcześniej i ilość tych ocen. Problem pojawia się w miejscu, gdy trzeba zsumować oceny. Rzecz w tym, że zmienna "suma" na początku nie jest równa zmiennej "ocena", a potem nawet już nie są dodawane kolejne wartości, tylko ciągle zostaje ta pierwsza. Dla przykładu: Wylosowane liczby to: 2 3 1 1 3. "Ocena" przybiera wartość kolejnej liczby w tablicy, lecz "suma" już nie przybiera wartości "ocena". W tym przypadku "suma" po pierwszym wykonaniu pętli miała wartość 20088810197. Po każdej następnej pętli wartość ta nie ulegała zmianie. W przypadku wstawienia "suma=suma+ocena" efekt jest identyczny. Co jest nie w porządku? Btw. jak tu wstawić kod w jakąś "ramkę"? o.O |
|
DejaVu |
» 2008-10-11 21:34:48 Przeczytaj pkt 4.2 lekcji: http://kursy.ddt.pl/?LessonId=4. W tym krótkim akapicie jest odpowiedź na Twój problem. Jeśli po przeczytaniu nie znajdziesz odpowiedzi - podam Ci ją. Ramkę się wstawia tagiem: [code src="C++"]//... [/code] |
|
lynx |
» 2008-10-11 21:38:02 Błąd to int suma;. W c/c++ przy deklaracji zmiennej w 'środku' programu nie są one wypełniane zerem, tylko byle jakim śmieciem. Więc zamień tą linijkę na int suma = 0 czy tam int suma = ocena;. Tak samo zrób z definicjami reszty zmiennych.
/edit: Chyba się wygadałem. ;P |
|
grzesiekz Temat założony przez niniejszego użytkownika |
Ojojoj... » 2008-10-11 22:30:51 Wiecie co? Próbowałem już przypisania początkowych wartości dla zmiennej którejś 0, bo wiedziałem, że nie jest ona temu równa na początku, ale prawdopodobnie nie zrobiłem tego dla jeszcze innej, ważnej (już nie pamiętam, dla której zrobiłem, dla której nie) i przez to znowu nie działało ;/ A byłem tak blisko rozwikłania problemu samemu :P No ale dobra, teraz już zmieniłem wszystkie na 0 i działa :D Tylko miałem następny problem. Nie wiedziałem do tej pory, że jeśli z dzielenia liczb całkowitych wychodzi ułamek, to te liczby całkowite też muszą być zadeklarowane jako float (np. srednia jest floatem i jest równa a/b, przy czym a i b są int'ami, to srednia też będzie int'owa, dopiero, gdy a i b są float'ami, to srednia będzie float'owa, rotfl). Przy okazji jeszcze to: Miałem funkcję srednia(), w której się losowały liczby, a one zapisały się do tablicy. W tej funkcji wywołałem drugą funkcję zwaną licz_srednia(), do której wysłałem tablicę i ilość ocen (zrobiłem to, bo musiałem trzymać się treści zadania), w której obliczona została średnia ocen. Czy jest jakiś sposób, żeby średnią ocen wrócić do funkcji srednia()? Skomplikowane? :P
/edit: Doczytałem kurs i zwracam średnią do funkcji srednia() za pomocą return(srednia); w licz_srednia(...), ale jest jeszcze jeden kłopot. Zwrócona wartość jest konwertowana z float na int, w wyniku czego wynik nadal jest niesatysfakcjonujący :P |
|
DejaVu |
» 2008-10-11 23:29:07 A czemu suma jest intem? /edit: Zwracanie wartości przez funkcję: float licz_srednia( int g[], int z ) { return srednia; }
Użycie: float wynik; float wynik = licz_srednia( );
|
|
grzesiekz Temat założony przez niniejszego użytkownika |
Nic » 2008-10-12 16:25:13 Nie no, "suma" zamieniłem na float (w związku z tym, co napisałem wyżej). No nieważne, bo problem już nie w tym tkwi. Próbowałem w podobny sposób do tego, który teraz podałeś. W miejsce, gdzie powinna być liczba, wpisałem po prostu "licz_srednia(parametry)", czyli bez użycia zmiennej "wynik". Nie zadziałał ani mój, ani Twój sposób ;/ Dev-C++ 4.9.9.2 informuje: "in function 'int licz_srednia(int*,int)': [Warning] converting to 'int' from 'float', w wyniku czego zwrócona średnia wyrażana jest jako liczba całkowita. Nie mam pojęcia, co może być tego przyczyną. |
|
DejaVu |
» 2008-10-12 16:31:35 Twój kompilator: in function 'int licz_srednia(int*,int) Czyli Twój kod to: int licz_srednia( int g[], int z ) Mój kod: float licz_srednia( int g[], int z ) Kompilator - ciąg dalszy: [Warning] converting to 'int' from 'float' Kompilator zwrócił prawidłowy komunikat (warning), który informuje Ciebie, że zapisuje wynik zmiennoprzecinkowy do zmiennej całkowitej, co z założenia jest błędem logicznym programisty. Zmiana typów danych musi następować świadomie poprzez rzutowanie, aby warningów nie było - wtedy kompilator wie, że Twój kod nie jest efektem błędów tylko logicznego działania. Ty natomiast chcesz mieć liczby rzeczywiste, więc funkcja powinna zwracać liczby rzeczywiste, a nie całkowite, prawda? |
|
grzesiekz Temat założony przez niniejszego użytkownika |
Aaa właśnie » 2008-10-13 16:17:32 No i sam do tego doszedłem, siedząc na stołówce :D Dzięki za szybkie odpowiedzi :) Pozdro. |
|
« 1 » |