## [Begineer] Template Issue!

Greeting CodeGuru World.
I am C++ beginner programmer. I just learned most of the fundamentals of C++. This is my neither any college project nor any home assignment. This is what i decided to work out on what i have learned from c++ fundamentals book. The Chapter which i was most influenced by "Template" because it is widely used in STL. So, in this project i decided to implement template on fraction class. But, i got a bit confusion about "Class Template". Here i will post my entire source code of my personal small project of "Four Function Calculator"[Took 20-25 min to write source code]
I decided to put template on class fraction because user may enter floating point or Integers. So, i decided to work on class fraction which will operate on both variable types.

Code:
```/*A project on building four function calculator which operate on three types of number
i.e. long integers, decimal/floating numbers & fractional numbers */

#include <iostream>
#include <stdlib.h>
using namespace std;

class numbers
{
private:
long fNumb;
char oper;
long sNumb;
long result;
public:
numbers() : fNumb(0),sNumb(0) {}
numbers(long f, long s) : fNumb(f),sNumb(s) {}
void get_numb();
void numb_display()const;
};

class decimal
{
private:
double fNumb;
char oper;
double sNumb;
double result;
public:
decimal(): fNumb(0.0),sNumb(0.0){}
decimal(double f, double s) : fNumb(f),sNumb(s) {}
void get_decimal();
void dec_display()const;
};

template<class type>
class fraction
{
private:
type numenator;
char c;
type dinominator;
public:
fraction():numenator(1),dinominator(1){}
fraction(type n, type d) : numenator(n),dinominator(d){}
void get_frac();
void frac_display()const;
void low_term();
fraction operator +(fraction&);
fraction operator -(fraction&);
fraction operator *(fraction&);
fraction operator /(fraction&);
};

//-----------------------------------------------------------------------------
void numbers::get_numb()
{
while(true)
{
cout << "\nEnter 1st Number: ";
cin >> fNumb;
if(cin.good())
{
cin.ignore(10,'\n');
break;
}
cin.clear();
cout << "Incorrect Input, Try Again!";
cin.ignore(10,'\n');
}
while(true)
{
cout << "\nEnter 2nd Number: ";
cin >> sNumb;
if(cin.good())
{
cin.ignore(10,'\n');
break;
}
cin.clear();
cout << "Incorrect Input, Try Again!";
cin.ignore(10,'\n');
}
<< "\nEnter '-' for subtraction:"
<< "\nEnter '*' for multiplication:"
<< "\nEnter '/' for division:";
cin >> oper;
switch(oper)
{
case '+' : result = fNumb+sNumb; break;
case '-' : result = fNumb-sNumb; break;
case '*' : result = fNumb*sNumb; break;
case '/' : result = fNumb/sNumb; break;
}
}

void numbers::numb_display()const
{cout << result;}

//-----------------------------------------------------------------------------
void decimal::get_decimal()
{
while(true)
{
cout << "\nEnter 1st Decimal Number: ";
cin >> fNumb;
if(cin.good())
{
cin.ignore(10,'\n');
break;
}
cin.clear();
cout << "Incorrect Input, Try Again!";
cin.ignore(10,'\n');
}
while(true)
{
cout << "\nEnter 2nd Decimal Number: ";
cin >> sNumb;
if(cin.good())
{
cin.ignore(10,'\n');
break;
}
cin.clear();
cout << "Incorrect Input, Try Again!";
cin.ignore(10,'\n');
}
<< "\nEnter '-' for subtraction:"
<< "\nEnter '*' for multiplication:"
<< "\nEnter '/' for division:";
cin >> oper;
switch(oper)
{
case '+' : result = fNumb+sNumb; break;
case '-' : result = fNumb-sNumb; break;
case '*' : result = fNumb*sNumb; break;
case '/' : result = fNumb/sNumb; break;
}
}

void decimal::dec_display()const
{cout << result;}

//-----------------------------------------------------------------------------

void fraction::get_frac()
{
cout << "Enter fraction in (N/D) format: ";
cin >> numenator >> c >> dinominator;
}

void fraction::frac_display()const
{cout << numenator << c << dinominator;}

fraction fraction :: operator +(fraction& f1)
{
type nu, di;
nu = numenator+f1.numenator;
di = dinominator + f1.dinominator;
return fraction(nu, di);
}
fraction fraction :: operator -(fraction& f1)
{
type nu, di;
nu = numenator-f1.numenator;
di = dinominator - f1.dinominator;
return fraction(nu, di);
}
fraction fraction :: operator *(fraction& f1)
{
type nu, di;
nu = numenator*f1.numenator;
di = dinominator * f1.dinominator;
return fraction(nu, di);
}
fraction fraction :: operator /(fraction& f1)
{
type nu, di;
nu = numenator*f1.dinominator;
di = dinominator * f1.numenator;
return fraction(nu, di);
}

void fraction::low_term()
{
type tnum, tden, temp, gcd;
tnum = labs(numenator);
tden = labs(dinominator);
if(tden==0 )
{
cout << "Illegal fraction: division by 0"; exit(1);
}
else if( tnum==0 )
{
numenator=0; dinominator = 1; return;
}

while(tnum != 0)
{
if(tnum < tden)
{
temp=tnum; tnum=tden; tden=temp;
}
tnum = tnum - tden;
}
gcd = tden;
numenator = numenator/ gcd;
dinominator = dinominator / gcd;
}

int main()
{
char choice, ch, oper;
numbers n1;
decimal d1;
fraction f1,f2, result;
do
{
<<"**Choose Operation type**"
<<"\nPress'n' for calculating long numbers:"
<<"\nPress'd' for calculating decimal numbers:"
<<"\nPress'f' for calculating fractional numbers:"
<<"\nPress'x' for exit::";
cin >> choice;
switch(choice)
{
case 'n' : n1.get_numb();n1.numb_display(); break;
case 'd' : d1.get_decimal(); d1.dec_display(); break;
case 'f' : f1.get_frac(); f2.get_frac();
<< "\nEnter '-' for subtraction:"
<< "\nEnter '*' for multiplication:"
<< "\nEnter '/' for division:";
cin >> oper;
switch(oper)
{
case '+' : result = f1+f2; break;
case '-' : result = f1-f2; break;
case '*' : result = f1*f2; break;
case '/' : result = f1/f2; break;
}
result.low_term();
result.frac_display();
case 'x' : exit(1);
default : cout <<"\nUnknown KeY!";
}
cout <<"\nDo another calculation? (y/n)"; cin >> ch;
}while(ch!='n');
return 0;
}```
I already mentioned, I am just a beginner programmer. I haven't post any comment of each line because there is no any complex method used. I guess it might be a one of the simplest program of C++. I guess i messed a bit in class fraction because my compiler signal most of the error from there.

Awaiting any suggestion:
Regards
Basanta