Statistike

Napisati klasu stats koja računa osnovne statistike nad skupom brojeva. Implementirati sledeće metode:

template <typename T>
class stats {
public:
    stats();
    void add(const T &value);
    size_t get_count() const;
    double get_mean() const;
};

Dodatno: Implementirati metodu get_variance() koja računa varijansu skupa brojeva, i metodu reset() koja resetuje statistike. Pored toga, implementirati dodatne statistike po želji (npr. standardna devijacija, minimum, maksimum, medijana, itd.).

Test

#include <iostream>
#include <vector>
#include <stdexcept>

namespace matf {

    // Ovde ide vasa implementacija

} // namespace matf

int main(void)
{
	std::vector<int> data = { 1, 2, 3, 4, 5 };

	matf::stats<int> int_stats;

	for (const auto &val : data) {
		int_stats.add(val);
		if (int_stats.get_count() < 2) {
			std::cout << "Added: " << val 
					  << ", Count: " << int_stats.get_count() 
					  << ", Mean: " << int_stats.get_mean() 
					  << ", Variance: N/A" 
					  << std::endl;
			continue;
		}
		std::cout << "Added: " << val 
				  << ", Count: " << int_stats.get_count() 
				  << ", Mean: " << int_stats.get_mean() 
				  << ", Variance: " << int_stats.get_variance() 
				  << std::endl;
	}

	std::cout << "------------------" << std::endl;

	std::vector<double> data_double = { 1.5, 2.5, 3.5, 4.5, 5.5 };

	matf::stats<double> double_stats;

	for (const auto &val : data_double) {
		double_stats.add(val);
		if (double_stats.get_count() < 2) {
			std::cout << "Added: " << val 
					  << ", Count: " << double_stats.get_count() 
					  << ", Mean: " << double_stats.get_mean() 
					  << ", Variance: N/A" 
					  << std::endl;
			continue;
		}
		std::cout << "Added: " << val 
				  << ", Count: " << double_stats.get_count() 
				  << ", Mean: " << double_stats.get_mean() 
				  << ", Variance: " << double_stats.get_variance() 
				  << std::endl;
	}

	return 0;
}

Rešenje

main.cpp

#include <iostream>
#include <vector>
#include <stdexcept>

namespace matf {

	template <typename T>
	class stats
	{
	public:
		stats() : count(0), sum(0) {}

		void add(const T &value) 
		{
			count++;
			sum += value;
		}

		size_t get_count() const
		{
			return count;
		}

		double get_mean() const 
		{
			if (count == 0)
			{
				throw std::runtime_error("No elements to calculate mean");
			}
			return static_cast<double>(sum) / count;
		}

		void reset()
		{
			count = 0;
			sum = 0;
		}

	private:
		size_t 	count;
		T 		sum;
	};
}

int main(void)
{
	std::vector<int> data = { 1, 2, 3, 4, 5 };

	matf::stats<int> int_stats;

	for (const auto &val : data) {
		int_stats.add(val);
		std::cout << "Added: " << val 
				  << ", Count: " << int_stats.get_count() 
				  << ", Mean: " << int_stats.get_mean() 
				  << std::endl;
	}

	std::cout << "------------------" << std::endl;

	std::vector<double> data_double = { 1.5, 2.5, 3.5, 4.5, 5.5 };

	matf::stats<double> double_stats;

	for (const auto &val : data_double) {
		double_stats.add(val);
		if (double_stats.get_count() < 2) {
			std::cout << "Added: " << val 
					  << ", Count: " << double_stats.get_count() 
					  << ", Mean: " << double_stats.get_mean() 
					  << std::endl;
			continue;
		}
		std::cout << "Added: " << val 
				  << ", Count: " << double_stats.get_count() 
				  << ", Mean: " << double_stats.get_mean() 
				  << std::endl;
	}

	return 0;
}