I am making a previous program into a template to calculate all 11 options. (int, double, long double, char, etc) I believe I have the right idea, but the syntax is way off. Could you please provide some insight as to how to at least set one function up, or something that I could use to finish setting up the rest. I can provide the previous program if if would help.
Thanks in advance!
Thanks in advance!
Code:
#include <iostream>
#include <cstdlib>
#include <iostream>
#ifndef _TSTATS_H
#define _TSTATS_H
template <typename T>
class TStats;
template <typename T>
void ReadData(TStats<T>&);
template <typename T>
void DisplayData(const TStats<T>&, std::ostream& os, char ofc = ' ');
const size_t max = 100; //Array max
template <typename T>
class TStats
{
public:
TStats () ;
~TStats () ;
TStats (TStats<T>&) ;
T& operator = (T&) ;
T Mean () const ;
T Median () ;
void Sort () ;
size_t Size () const ;
private:
size_t size_;
T * data_;
bool sorted_;
static void Swap (TStats<T>& x, TStats<T>& y);
};
template <typename T>
TStats<T>::TStats(const TStats<T>& s){;}
template <typename T>
void ReadData(TStats<T>& s)
{
std::cout <<"Enter up to 100 integers seperated by spaces." << std::endl;
std::cout << "Enter x and press enter to quit: ";
int numbers[max]; //Intitializes array for integer entry to hold up to 100 integers
size_t size = 0;
while((std::cin >> numbers[size]) && (size < max)) //Allows for entry of all numbers at one
size++;
(s.SetData(numbers, size));
}
template <typename T>
void DisplayData(TStats<T> const& s, std::ostream& os, char ofc)
{
int data [s.Size()];
s.RetrieveData(data);
for(size_t i = 0; i < s.Size(); ++i)
{
os << data[i] << ofc; //Displays each element of array seperated by a space
}
std::cout << std::endl;
}
template <typename T>
TStats<T>::TStats(): size_(0), data_(0), sorted_(0)
{
data_ = new int[max];
}
template <typename T>
TStats<T>::~TStats()
{
delete [] data_; //destructor
}
template <typename T>
TStats<T>::TStats(const TStats<T>& a)
{
data_ = new int [size_];
for (size_t i = 0; i < size_; ++i)
data_[i] = a.data_[i];
}
template <typename T>
TStats&<T> TStats::operator = (const TStats<T>& s)
{
delete [] data_; //deallocate data_
size_ = s.size_;
data_ = new int [size_];
for (size_t i = 0; i < size_; ++i)
data_[i] = s.data_[i];
return *this; //copies entered array into data_
}
template <typename T>
double TStats<T>::Mean() const
{
float sum = 0;
for (size_t j = 0; j < size_; ++j)
{
sum += data_[j]; //Loops through each element in array and sums them up
}
if (size_ == 0) //checks for division by zero
{
std::cout << "Cannot divide by zero!" << std::endl;
return 0;
}
float mean = sum/size_; //calulates mean
return mean;
}
template <typename T>
double TStats<T>::Median()
{
if (sorted_ != 1) Sort();
if(size_ % 2 == 1)
return data_[(size_ - 1) / 2];
else
return (data_[size_ / 2 - 1] + data_[size_ / 2]) / 2.0;
}
template <typename T>
void TStats<T>::Sort()
{
for (size_t t = 0; t < size_; ++t) //This block compares two elements at a time to see which one is less than the other
{
int r = t;
int h = 0;
for (h = t; h < (int)size_; ++h)
{
if (data_[h] < data_[r])
{
r = h;
}
}
Swap(data_[r],data_[t]);
}
sorted_ = 1;
}
template <typename T>
size_t TStats<T>::Size() const
{
return size_; //size of array
}
template <typename T>
void TStats<T>::SetData(const TStats<T>* data, size_t size)
{
size_ = size;
data_ = new int [size_];
for (size_t j = 0; j < size_; ++j)
{
data_[j] = data[j]; // loops through data elements and stores them to data_ elements
}
sorted_ = 0; //array not sorted
}
template <typename T>
void TStats<T>::RetrieveData ( TStats<T> * data) const
{
for (size_t j = 0; j < size_; ++j)
{
data[j] = data_[j];
}
}
template <typename T>
void TStats<T>::Swap(TStats<T>& x, TStats<T>& y)
{
int temp = x; //This block swaps the elements into ascending order
x = y;
y = temp;
}
#endif
Comment