jvb Temat założony przez niniejszego użytkownika |
Lekcja 19 - Przekazywanie tablic jednowymiarowych do funkcji - działa tylko na dużych wartościach » 2013-07-18 18:36:34 Niestety znów mam problem. Aby upewnić się, że wszystko rozumiem postanowiłem dołożyć do tego zadania opcję by deklarować za każdym razem z ilu liczb się chce losować. I mam dwa problemy: - program działa dobrze, ale tylko jak zadeklaruje się większą liczbę liczb do losowania. Przy mniejszych (do kilkunastu) zwraca dziwne wartości - średnia jest zwracana jako liczba całkowita. Dlaczego nie rzeczywista? Oto kod: #include <iostream> #include <cstdlib> #include <ctime> using namespace std;
int ile() { int a; cin >> a; return a; } void losowanie( int skladnik[], int ilosc, int min, int max ) { int licznik_losowania = 0; int mozliwosci = max - min + 1; do { skladnik[ licznik_losowania ] =( rand() % mozliwosci ) + min; licznik_losowania++; } while( licznik_losowania < ilosc ); } void pisanie( int skladnik[], int ilosc ) { int licznik_pisania = 0; do { cout << skladnik[ licznik_pisania ] << ", "; licznik_pisania++; } while( licznik_pisania < ilosc ); } void srednia( int skladnik[], int ilosc ) { int suma = 0; int licznik_sumy; do { suma += skladnik[ licznik_sumy ]; licznik_sumy++; } while( licznik_sumy < ilosc ); cout << endl; cout << suma; float srednia = suma / ilosc; cout << endl; cout << srednia; } main() { srand( time( NULL ) ); int a = ile(); int skladnik[ a ]; losowanie( skladnik, a, 4, 10 ); pisanie( skladnik, a ); srednia( skladnik, a ); } |
|
Monika90 |
» 2013-07-18 18:48:47 float srednia = suma / ilosc; //dlaczego nie daje to liczby rzeczywistej? |
Ponieważ suma i ilosc są typu int, int dzielone przez int to jest int, musisz rzutować na double przed dzieleniem. |
|
Savail |
» 2013-07-18 18:49:01 1. Nie inicjalizujesz zmiennej licznik_sumy w funkcji srednia. 2. Operator dzielenia 2 zmiennych typu int zwróci także int więc jeśli chcesz uzyskać typ rzeczywsity to zastosuj rzutowanie np. na float: float srednia =( float ) suma /( float ) ilosc; PS. Czy brak typu funkcji main i tworzenie tablicy nie używając stałej zmiennej jest cechą nowego standardu c++? |
|
Monika90 |
» 2013-07-18 18:53:52 Brak typu funkcji main jest błędem w każdej wersji standardu, a rozmiar tablicy określony za pomocą zmiennej będzie wprowadzony w przyszłym standardzie (C++14), jeżeli nie wydarzy się nic nieoczekiwanego... |
|
jvb Temat założony przez niniejszego użytkownika |
» 2013-07-18 18:59:56 Dzielenie działa, dziękuję. Cały czas jednak zwraca dziwne wyniki.
@Savail: zapis "int licznik_sumy" nie jest inicjalizowaniem licznika sumy? |
|
Savail |
» 2013-07-18 19:07:45 Nie, to jest tylko definicja. Zmienna dostaje jakąś śmieciową wartość, która pewnie psuje ci wyniki. |
|
jvb Temat założony przez niniejszego użytkownika |
» 2013-07-18 19:09:47 Przecież daję jej wartość 0, nie jest to wystarczające? Jeżeli nie to poproszę o poprawny zapis bo to oznacza, że czegoś naprawdę mocno nie rozumiem :/
|
|
Savail |
» 2013-07-18 19:12:41 void srednia( int skladnik[], int ilosc ) { int suma = 0; int licznik_sumy; ... } |
|
« 1 » 2 |