[Tablica] Obliczanie średniej dynamicznie alokowanej tablicy

0

Witam,
Jestem zupełnym nowicjuszem jeżeli chodzi o programowanie w C++, oraz programowanie ogólnie.
Moim celem jest stworzenie tablicy dynamicznie alokowanej i obliczenie średniej jej elementów przy pomocy funkcji, problemy pojawiają się kiedy chcę wykonać tę drugą czynność.

Wprowadziłem małą poprawkę, ale nie moge przekonwertować *double do double.

Oto mój kod:

 
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

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

int main()
{

    int n;
    srand( time( NULL ) );

    cout << "Podaj ilosc elementow tablicy." << endl;
    cin >> n;

    double* p = new double[n];

    cout << "Dla Twojej tablicy wylosowano nastepujace wartosci z zakresu od zera do stu:" << endl;
    for (int i=0;i<n;i++)
    {
        p[i]=rand()%100;
        if (i==(n-1))
            cout << p[i] << endl;
        else
            cout << p[i] << ", ";
    }

    cout << srednia(n,p) << endl;

Prosił bym dodatkowo o link do jakiegoś artykułu przejrzyście opisującego wyjątki w C++, szukałem w google, ale wszystko jest napisane w tak chaotyczny sposób, że ciężko coś zrozumieć.

2

masz wszystko dobrze tylko jeden błąd:

for (int i; i < n; i++) 

musisz inicjalizować i

for (int i = 0; i < n; i++) 

Opisuj lepiej opisuj problemy bo w sumie nie wiadomo co Ci się nie udaje z tą funkcją i gdzie nie możesz przekonwertować.

double *ptr;
double d = *ptr; 

EDIT
Jednak nie masz tylko jednego błędu. Zamiast

double srednia(int n, double *tab[]) 

powinno być

 double srednia(int n, double tab[]) 

albo

 double srednia(int n, double *tab) 

W pierwszym przypadku przekazywałeś tablice wskaźników na double, a wydaje mi się, że miałeś zamiar przekazać tablicę double'ów tak?

1

Jeszcze coś...

 
double srednia(int n, double *tab) // <-- zapis tablicowy jest wskaźnikiem na jej pierwszy element, więc albo *tab  albo tab[] 
{
//zmienna pz nie jest potrzebna
    double sr = 0;
    for (int i=0; i < n; i++)
    {
        sr+=tab[i];
    }
    return double(sr/n);
}
4

Masz wyciek pamięci. Zamiast samodzielnie używać new i delete, lepiej użyj std::vector: http://en.cppreference.com/w/cpp/container/vector

0

Dziękuję, już wprowadzam poprawki i zobaczę efekty.

Wszystko działa, teraz pozostało mi tylko wprowadzić obsługę wyjątków.

2
#include <iostream>
#include <random>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
	default_random_engine generator;
	int size;
	double min, max;
	
	cin >> size >> min >> max;
	
	uniform_real_distribution<double> distribution(min, max);
	vector<double> numbers(size, 0);
	
	for(auto & number : numbers)
		number = distribution(generator);
	
	cout << "Average: " << accumulate(begin(numbers), end(numbers), 0.0) / numbers.size() << endl;
	
	cout << "Numbers generated: ";
	for(auto number : numbers) cout << number << " ";
	return 0;
}

http://ideone.com/umOgcC
Example in: 6 1.5 9.5
Example out:

Average: 5.42283
Numbers generated: 2.5523 5.1692 3.25167 6.93092 8.97754 5.65533 

btw, for_each() fajnie wygląda, dopóki nie trzeba przekazać całego osprzętu do losowania

0

spartanPAGE dziękuję, wygląda to zdumiewająco, ale jak na mój poziom jest jeszcze nazbyt skomplikowane, krok po kroczku chcę wszystko pojąć, a nie rzucac się od razu na głęboką wodę ;p

Chciałbym obsłużyć wyjątki, jak to zrobić?

0
Roberro napisał(a)

Chciałbym obsłużyć wyjątki, jak to zrobić?

Jakie wyjątki?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.