Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Błędne sumowanie?

Ostatnio zmodyfikowano 2008-10-13 16:17
Autor Wiadomość
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:


C/C++
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
P-1947
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]
P-1948
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
P-1949
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
P-1950
DejaVu
» 2008-10-11 23:29:07
A czemu suma jest intem?

/edit:
Zwracanie wartości przez funkcję:
C/C++
float licz_srednia( int g[], int z )
{
    //...
    return srednia;
}

Użycie:
C/C++
float wynik;
float wynik = licz_srednia( /* tu parametry */ );
P-1951
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ą.
P-1952
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?


P-1953
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.
P-1988
« 1 »
  Strona 1 z 1