Program liczący średnią, odchylenie i zliczający elementy z przedziału

Odpowiedz Nowy wątek
2018-03-19 20:12
0

Witam, mam problem z programem który ma wyznaczać wartość średnią elementów tablicy, po pierwsze losowa tablica z każdym uruchomieniem programu jest taka sama. Dodatkowo średnia wartość elementów(suma ai przez n) wychodzi mi bardzo duża, mimo że elementy tablicy maksymalnie wynoszą 10. Przez to nie działa mi też odchylenie(powinno być równe pierwiastek od suma(ai-średnia)^2/n ) no i nie wiem jak zrobić zliczanie i zapisanie do nowej tablicy wartości od średnia-odchylenie do średnia+odchylenie

Oto kod który udało mi się skleić na tą chwile

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <cmath>

using namespace std;

int * tab;

int* createTable(int wartosc);
double srednia(int *tab, int wartosc);
double odchylenie(int *tab, int wartosc, double srednia);
double zlicz(int *tab, int wartosc, double srednia, double odchylenie);
void showTable(int *tab, int wartosc);

int* createTable(int wartosc){
     tab = new int[wartosc];
    for(int i = 0; i < wartosc; i++){
        tab[i] = rand() % 10;
    }
    return tab;
}

double srednia(int *tab, int wartosc){
    int suma;
    double srednia;
    for(int i = 0; i < wartosc; i++){
        suma += tab[i];
    }
    srednia = suma / wartosc;
    return srednia;
}

double odchylenie(int *tab, int wartosc, double srednia){
    double odchylenie;
    int suma;
    for(int i = 0; i < wartosc; i++){
        suma += *(tab + i);
    }
    odchylenie = double(sqrt(pow(double(suma-srednia), 2)/wartosc));
}

double zlicz(int *tab, int wartosc, double srednia, double odchylenie){
    double zlicz;
}

void showTable(int *tab, int wartosc){
    cout << "Elementy tablicy" << endl;
    for(int i = 0; i < wartosc; i++){
        cout << tab[i] << " ";
    }
    cout << endl;
}

int main(){
    int wartosc;
    cout << "Podaj wielkosc tablicy: ";
    cin >> wartosc;

    if(wartosc <= 0) {
    cout << "Wielkosc tablicy nie moze byc mniejsza od 0" << endl;
        return 0;
    }

    tab  = createTable(wartosc);

    double sr = srednia(tab, wartosc);
    double od = odchylenie(tab, wartosc, sr);

    int wybor;

    cout << "Wybierz co chcesz zrobic" << endl;
    cout << "1. Pokaz elementy tablicy" << endl;
    cout << "2. Srednia wartosc elementow tablicy" << endl;
    cout << "3. Wartosc odchylenia standardowego dla elementow tablicy" << endl;
    cout << endl <<  "Wybor: ";
     cin >> wybor;

    switch(wybor){
        case 1: {
            showTable(tab, wartosc);
            break;
        }

        case 2: {
            cout << "Srednia wartosc" << endl;
            cout << sr << endl;
            break;
        }
        case 3:{
            cout << "Odchylenie wartosc" << endl;
            cout << od << endl;
            break;
        }
        default:{
            cout << "Nieprawidlowa wartosc";
            break;
        }
    }
    delete [] tab;
    tab = NULL;

    return 0;
}

Proszę o pomoc ponieważ nie wiem już co robić, nie wiem czemu ta tablica i średnia nie działają tak jak powinny.

edytowany 1x, ostatnio: furious programming, 2018-03-19 21:50

Pozostało 580 znaków

2018-03-19 20:21
1

W średniej zamień "int suma" na "double suma"
albo

srednia = (double)suma / wartosc;
edytowany 1x, ostatnio: WeiXiao, 2018-03-19 20:22

Pozostało 580 znaków

2018-03-19 20:24
0

Zamiana pomogła, liczy średnią poprawnie ale dalej za każdym razem tworzy mi taką samą tablice

Pozostało 580 znaków

2018-03-19 20:26
0
Macjeg napisał(a):

Zamiana pomogła, liczy średnią poprawnie ale dalej za każdym razem tworzy mi taką samą tablice

a teraz?

#include <random>

int* createTable(int wartosc)
{
    std::random_device rd;
    std::mt19937 mt(rd());
    std::uniform_real_distribution<double> dist(1.0, 10.0);

    tab = new int[wartosc];
    for(int i = 0; i < wartosc; i++)
    {
        tab[i] =  dist(mt);
    }
    return tab;
}
edytowany 1x, ostatnio: WeiXiao, 2018-03-19 20:26

Pozostało 580 znaków

2018-03-19 20:35
0
|error: 'random_device' is not a member of 'std'|
|error: 'mt19937' is not a member of 'std'|
|error: 'uniform_real_distribution' is not a member of 'std'|
|error: expected primary-expression before 'double'|
|error: 'mt' was not declared in this scope|
|error: 'dist' was not declared in this scope|
|In function 'double odchylenie(int*, int, double)':|
|warning: no return statement in function returning non-void [-Wreturn-type]|
|In function 'double zlicz(int*, int, double, double)':|
|warning: unused variable 'zlicz' [-Wunused-variable]|
|warning: no return statement in function returning non-void [-Wreturn-type]|
||=== Build failed: 7 error(s), 3 warning(s) (0 minute(s), 0 second(s)) ===|
edytowany 1x, ostatnio: furious programming, 2018-03-19 21:51
dodałeś #include <random>? - WeiXiao 2018-03-19 20:37

Pozostało 580 znaków

2018-03-19 20:43
0

Tak, dodałem #include <random>

a jaki masz kompilator? Możliwe, że potrzebuje informacji, by używać c++11.... - kaczus 2018-03-20 09:45

Pozostało 580 znaków

2018-03-19 20:45
0

A spróbuj zamienić

std::random_device rd;
std::mt19937 mt(rd());
std::uniform_real_distribution<double> dist(1.0, 10.0);

na

random_device rd;
mt19937 mt(rd());
uniform_real_distribution<double> dist(1.0, 10.0);
edytowany 1x, ostatnio: WeiXiao, 2018-03-19 20:45

Pozostało 580 znaków

2018-03-19 20:47
0

teraz jest

error: 'random_device' was not declared in this scope
|error: 'mt19937' was not declared in this scope
|error: 'uniform_real_distribution' was not declared in this scope
edytowany 1x, ostatnio: furious programming, 2018-03-19 21:51
Wrzuć cały kod który aktualnie masz, będzie prościej :P - WeiXiao 2018-03-19 20:48

Pozostało 580 znaków

2018-03-19 20:50
0
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <cmath>
#include <random>
using namespace std;

int * tab;

int* createTable(int wartosc)
{
    random_device rd;
    mt19937 mt(rd());
    uniform_real_distribution<double> dist(1.0, 10.0);

    tab = new int[wartosc];
    for(int i = 0; i < wartosc; i++)
    {
        tab[i] =  dist(mt);
    }
    return tab;
}

double srednia(int *tab, int wartosc){
    double suma;
    double srednia;
    for(int i = 0; i < wartosc; i++){
        suma += tab[i];
    }
    srednia = suma / wartosc;
    return srednia;
}

double odchylenie(int *tab, int wartosc, double srednia){
    double odchylenie;
    double suma;
    for(int i = 0; i < wartosc; i++){
        suma += *(tab + i);
    }
    odchylenie = (sqrt((pow((suma-srednia), 2))/wartosc));
}

double zlicz(int *tab, int wartosc, double srednia, double odchylenie){
    double zlicz;
}

void showTable(int *tab, int wartosc){
    cout << "Elementy tablicy" << endl;
    for(int i = 0; i < wartosc; i++){
        cout << tab[i] << " ";
    }
    cout << endl;
}

int main(){
    int wartosc;
    cout << "Podaj wielkosc tablicy: ";
    cin >> wartosc;

    if(wartosc <= 0) {
    cout << "Wielkosc tablicy nie moze byc mniejsza od 0" << endl;
        return 0;
    }

    tab  = createTable(wartosc);

    double sr = srednia(tab, wartosc);
    double od = odchylenie(tab, wartosc, sr);

    int wybor;

    cout << "Wybierz co chcesz zrobic" << endl;
    cout << "1. Pokaz elementy tablicy" << endl;
    cout << "2. Srednia wartosc elementow tablicy" << endl;
    cout << "3. Wartosc odchylenia standardowego dla elementow tablicy" << endl;
    cout << endl <<  "Wybor: ";
     cin >> wybor;

    switch(wybor){
        case 1: {
            showTable(tab, wartosc);
            break;
        }

        case 2: {
            cout << "Srednia wartosc" << endl;
            cout << sr << endl;
            break;
        }
        case 3:{
            cout << "Odchylenie wartosc" << endl;
            cout << od << endl;
            break;
        }
        default:{
            cout << "Nieprawidlowa wartosc";
            break;
        }
    }
    delete [] tab;
    tab = NULL;

    return 0;
}
edytowany 1x, ostatnio: furious programming, 2018-03-19 21:51

Pozostało 580 znaków

2018-03-19 20:57
1

Huh, na kompilatorach online śmiga... http://rextester.com/WZH71746 (na dole masz wypisaną tablicę, średnią itd...)

A jak zamienisz

#include <random>

na

#include <random.h>

lub

#include <random.hpp>
edytowany 1x, ostatnio: WeiXiao, 2018-03-19 21:02

Pozostało 580 znaków

2018-03-19 21:02
0

odpowiada No such file or directory

edytowany 1x, ostatnio: furious programming, 2018-03-19 21:51

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0