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

Lekcja 19 - Przekazywanie tablic jednowymiarowych do funkcji - działa tylko na dużych wartościach

Ostatnio zmodyfikowano 2013-07-18 19:14
Autor Wiadomość
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:
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int ile() //zbiera info ile liczb wylosowac
{
    int a;
    cin >> a;
    return a;
}
void losowanie( int skladnik[], int ilosc, int min, int max ) //losuje
{
    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 ) //wypisuje
{
    int licznik_pisania = 0;
    do
    {
        cout << skladnik[ licznik_pisania ] << ", ";
        licznik_pisania++;
    }
    while( licznik_pisania < ilosc );
   
}
void srednia( int skladnik[], int ilosc ) //liczy sume i srednia
{
    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; //dlaczego nie daje to liczby rzeczywistej?
    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 );
   
   
}
P-88209
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.
P-88211
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++?
P-88212
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...
P-88213
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?
P-88215
Savail
» 2013-07-18 19:07:45
Nie, to jest tylko definicja. Zmienna dostaje jakąś śmieciową wartość, która pewnie psuje ci wyniki.
P-88216
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 :/
P-88217
Savail
» 2013-07-18 19:12:41
C/C++
void srednia( int skladnik[], int ilosc ) //liczy sume i srednia
{
    int suma = 0;
    int licznik_sumy; // nie przydzielasz tu wartości 0 przynajmniej w kodzie który wkleiłeś :d
    ...
}
P-88218
« 1 » 2
  Strona 1 z 2 Następna strona