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

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.

1

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

srednia = (double)suma / wartosc;
0

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

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;
}
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)) ===|
0

Tak, dodałem #include <random>

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);
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
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;
}
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>
0

odpowiada No such file or directory

1

Dlaczego dołączasz pierdyliard nagłówków języka C?

0

Na kompilerze online mam

source_file.cpp(42) : error C4716: 'odchylenie': must return a value
source_file.cpp(46) : error C4716: 'zlicz': must return a value
source_file.cpp(39) : warning C4700: uninitialized local variable 'suma' used
1

Ok, "srać dobre praktyki"

Spróbuj z tym

#include <cstdlib>
#include <ctime>

int* createTable(int wartosc)
{
    srand( time( NULL ) );

    tab = new int[wartosc];
    for(int i = 0; i < wartosc; i++)
    {
        tab[i] =  ( rand() % 10 ) + 0; // (liczby od 0 do 9 (włącznie))
    }
    return tab;
}

Dodatkowo

double suma;

zamień na

double suma = 0;

a funkcje zlicz i odchylenie muszą coś zwracać, bo ustawiłeś, że mają typ "double".

0

jak na razie na jednym z kompilerów online działa mi poprawnie ten poprzedni kod, jedynie dodałem returny w tych dwóch funkcjach, zaraz spróbuję z tym co napisałeś

Na kompilerze onlinegdb wszystko działa, no moim codeblocks jest

D:\Programy\CodeBlocks\MinGW\lib\gcc\mingw32\5.1.0\include\c++\bits\c++0x_warning.h|32|error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support is currently experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.|
0

Podane opcje na pewno są do ustawienia w programie, jeśli nie przeszkadza Ci, że jest to experimental.

0

Fajny kompilator dla którego C++11 w 2018 jest eksperymentalnym ficzerem.

0

Okej, myślę że po prostu na tą chwile będę kończył program w kompilatorze online.
Czy mogę jeszcze liczyć na pomoc z tym jak utworzyć nową tablice i zapisać w niej elementy od średnia-odchylenia do średnia + odchylenie?

0

Daj jeszcze kod, który aktualnie używasz, bo już nie jestem pewien (albo linka do compiltora - zazwyczaj masz tam przycisk save czy coś)

Czy mogę jeszcze liczyć na pomoc z tym jak utworzyć nową tablice i zapisać w niej elementy od średnia-odchylenia do średnia + odchylenie?

Jak chcesz, to możesz użyć vector dla wygody:

// Example program
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
    int tablica[10] = { 1,2,3,4,5,6,7,8,9,10};
    double srednia = 5.0; // przykładowo
    double odchylenie = 2.5; // przykładowo
    vector<int> temp;
    
    for (int element : tablica)
    {
        if (element >= srednia-odchylenie && element <= srednia+odchylenie)
        {
            temp.push_back(element);
        }
    }
    
    // zeby wyswietlic mozesz zrobic tak
    for (int element : temp)
    {
        cout << element << endl;
    }
}

wynik:

3
4
5
6
7
0
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <cmath>
#include <random>
using namespace std;

int * tab;

#include <cstdlib>
#include <ctime>

int* createTable(int wartosc)
{
    srand( time( NULL ) );

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

double srednia(int *tab, int wartosc){
    double suma=0;
    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=0;
    for(int i = 0; i < wartosc; i++){
        suma += *(tab + i);
    }
    odchylenie = (sqrt((pow((suma-srednia), 2))/wartosc));
    return odchylenie;
}

double zlicz(int *tab, int wartosc, double srednia, double odchylenie){
    double zlicz;
    double srednia;
    double odchylenie;
    
    return 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: {
            showTable(tab, wartosc);
            cout << endl;
            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;
}

Aktualnie próbuję w funkcji zlicz zrobić zliczenie i zapisanie tych elementów z przedziału (średnia-odchylanie, średnia+odchylenie) w nowej tablicy(b)
oraz umieszczenie elementów z pierwszej tablicy(a) w kolejnej tablicy(c) tak aby mniejsze od średniej były po lewej stronie, a równe i większe po prawej.

0

https://wandbox.org/permlink/HGZxMo4HINiEAiPK

template<class T>
constexpr double avrg(T b, T e) {
    return std::accumulate(b, e, 0.0) / std::distance(b, e);
}

template<class T>
constexpr double stddev2(T b, T e) {
    auto a = avrg(b, e);
    return std::accumulate(b, e, 0.0, 
                           [a](auto sum, auto x){
                               return sum + (x - a)*(x - a);
                           })
        / (std::distance(b, e) - 1);
}

template<class T>
constexpr double stddev(T b, T e) {
    return std::sqrt(stddev2(b, e));
}
0
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <cmath>
#include <random>
using namespace std;

int * tab;

#include <cstdlib>
#include <ctime>

int* createTable(int wartosc)
{
    srand( time( NULL ) );

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

double srednia(int *tab, int wartosc){
    double suma=0;
    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=0;
    for(int i = 0; i < wartosc; i++){
        suma += pow((*(tab + i)-srednia),2);
    }
    odchylenie = (sqrt(suma/wartosc));
    return odchylenie;
}

int* create_tab2(int *tab, int wartosc, double srednia, double odchylenie) {
	int licznik=0;
	int j=0;
	for(int i=0; i<wartosc; i++)
		if(*(tab + i) > srednia - odchylenie && *(tab + i) < srednia + odchylenie)
		{
			licznik++;
		}
		int *tab_2 = new int[licznik];
	for(int i=0; i<wartosc; i++)
	{
		if(*(tab + i) > srednia - odchylenie && *(tab + i) < srednia + odchylenie) //sprawdzenie czy wartości tablicy mieszczą się w przedziale
		{
			*(tab_2 + j) = *(tab + i);
			j++;
		}
	}
	return tab_2;
}

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;
    int wybor=0;
    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);
    tab_2 = create_tab2(tab, wartosc, sr, od);


    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 << "4. Tablica elementow z przedzialu (sr-od; sr+od)" << endl;
    cout << endl <<  "Wybor: ";
    cin >> wybor;

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

        case 2: {
            showTable(tab, wartosc);
            cout << endl;
            cout << "Srednia wartosc" << endl;
            cout << sr << endl;
             break;
        }
        case 3: {
            showTable(tab, wartosc);
            cout << endl << "Srednia wartosc: "<<sr<<endl<<"Odchylenie standardowe: "<<od<<endl;
            break;
        }
        case 4: {
            showTable(tab, wartosc);
            cout << endl << "Srednia: "<<sr<<endl<<"Odchylenie: "<<od<<endl;
            cout << tab_2;
            break;
        }


        default:{
            cout << "Nieprawidlowa wartosc";
            break;
        }
    }
    delete [] tab;
    tab = NULL;

    return 0;
}

wywala mi już jedynie błąd że tab_2 was not declared in this scope,
chodzi o linie

tab_2 = create_tab2(tab, wartosc, sr, od);

jak dodać int przed tab_2 to otrzymuje error invalid convertion from 'int*' to int

Jak to naprawic? Bo już wszystko powinno być okej :/

0

Ten problem rozwiązany, dodałem int * tab_2; na początku, teraz tylko muszę poprawić wyświetlanie tej tab_2 bo nie działa prawidłowo

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