/*创建一个工程:里面包括一个主函数,两个头文件如下*/
//主函数
- #include "utility.h"
- #include "fraction.h"
- int main()
- {
- try
- {
- Fraction result;
- Fraction cur;
- char select;
- cout<<"输入一个分数:";
- cin>>result;
- do
- {
- cout<<"当前结果:"<<result<<endl;
- do
- {
- cout<<"请选择[加、减、乘、除、等于、清零和退出(+、-、*、/、=、C、X)]:";
- select=GetChar();
- while (cin.get()!='/n');
- select=toupper(select);
- }while (select!='+'&&select!='-'&&select!='*'&&select!='/'&&
- select!='='&&select!='C'&&select!='X');
- switch(select)
- {
- case '+':
- cout<<"输入一个分数:";
- cin>>cur;
- result=result+cur;
- break;
- case '-':
- cout<<"输入一个分数:";
- cin>>cur;
- result=result-cur;
- break;
- case '*':
- cout<<"输入一个分数:";
- cin>>cur;
- result=result*cur;
- break;
- case '/':
- cout<<"输入一个分数:";
- cin>>cur;
- result=result/cur;
- break;
- case '=':
- break;
- case 'C':
- result=0;
- break;
- }
- }while (select!='X');
- }
- catch (Error err)
- {
- err.Show();
- }
- return 0;
- }
//头文件utility.h
- #include <iostream>
- #ifndef _ _UTILITY_H_ _
- #define _ _UTILITY_H_ _
- #include <time.h>
- using namespace std;
- bool UserSaysYes();
- template <class ElemType>
- void Swap(ElemType &e1,ElemType &e2);
- template<class ElemType>
- void Display(ElemType elem[],int n);
- class Timer;
- class Error;
- class Rand;
- char GetChar(istream &in=cin)
- {
- char ch;
- while ((ch=in.peek())!=EOF
- &&((ch=in.get())==' '
- ||ch=='/t'));
- return ch;
- }
- bool UserSaysYes()
- {
- char ch;
- bool initialResponse=true;
- do
- {
- if(initialResponse)
- cout<<"(y,n)?";
- else
- cout<<"用y或n回答:";
- while((ch=GetChar())=='/n');
- initialResponse=false;
- }while (ch!='y'&&ch!='Y'&&ch!='n'&&ch!='N');
- while (GetChar() !='/n');
- if (ch=='y'||ch=='Y')
- return true;
- else
- return false;
- }
- template <class ElemType>
- void Swap(ElemType &e1,ElemType &e2)
- {
- ElemType temp;
- temp=e1;e1=e2;e2=temp;
- }
- template<class ElemType>
- void Show(ElemType elem[],int n)
- {
- for(int i=0;i<n;i++)
- {
- cout<<elem[i]<<" ";
- }
- cout<<endl;
- }
- //计时器类Timer
- class Timer
- {
- private:
- clock_t startTime;
- public:
- Timer(){startTime=clock();}
- double ElapsedTime() const
- {
- clock_t endTime=clock();
- return (double)(endTime-startTime)/(double)CLK_TCK;
- }
- void Reset(){startTime=clock();}
- };
- #define MAX_ERROR_MESSAGE_LEN 100
- class Error
- {
- private:
- char message [MAX_ERROR_MESSAGE_LEN];
- public:
- Error(char mes[]="一般性异常!"){strcpy(message,mes);}
- void Show() const {cout<<message<<endl;}
- };
- //随机数类Rand
- class Rand
- {
- public:
- static void SetRandSeed() {srand((unsigned)time(NULL));}//设置当前时间为随机数种子
- static int GetRand(int n){return rand()%n;}
- static int GetRand(){return rand();}
- };
- #endif
//头文件faction.h
- #include <iostream>
- #include <cmath>
- //#ifndef _ _FRACTION_H_ _
- #define _ _FRACTION_H_ _
- using namespace std;
- class Fraction
- {
- private:
- int nume;
- int deno;
- int Gcf(int m,int n);
- public:
- Fraction(int n=1,int d=1);
- virtual ~Fraction(){}
- void Reduction();
- int GetNume() const{return nume;}
- int GetDeno() const{return deno;}
- void SetNume(int n);
- void SetDeno(int d);
- Fraction operator+ (const Fraction &a) const;
- Fraction operator- (const Fraction &a) const;
- Fraction operator* (const Fraction &a) const;
- Fraction operator/ (const Fraction &a) const;
- };
- ostream &operator<<(ostream &out,const Fraction &a);
- istream &operator>>(ostream &in,const Fraction &a);
- int Fraction::Gcf(int m,int n)
- {
- if(n==0) return m;
- else return Gcf(n,m%n);
- }
- void Fraction::Reduction()
- {
- if(deno<0) {nume=-nume;deno=-deno;}
- int f=Gcf(abs(nume),deno);
- nume=nume/f;
- deno=deno/f;
- }
- Fraction::Fraction(int n,int d):nume(n),deno(d)
- {
- if(deno==0) throw Error("分母为0");
- deno=d;
- Reduction();
- }
- void Fraction::SetNume(int n)
- {
- nume=n;
- Reduction();
- }
- void Fraction::SetDeno(int d)
- {
- if(d==0) throw Error("分母为0");
- deno=d;
- Reduction();
- }
- Fraction Fraction::operator+(const Fraction &a) const
- {
- Fraction result;
- result.nume=this->nume*a.deno+this->deno*a.nume;
- result.deno=this->deno*a.deno;
- result.Reduction();
- return result;
- }
- Fraction Fraction::operator- (const Fraction &a) const
- {
- Fraction result;
- result.nume=this->nume*a.deno-this->deno*a.nume;
- result.deno=this->deno*a.deno;
- result.Reduction();
- return result;
- }
- Fraction Fraction::operator* (const Fraction &a) const
- {
- Fraction result;
- result.nume=this->nume*a.nume;
- result.deno=this->deno*a.deno;
- result.Reduction();
- return result;
- }
- Fraction Fraction::operator/ (const Fraction &a) const
- {
- if(a.nume==0)throw Error("除数为0!");
- Fraction result;
- result.nume=this->nume*a.deno;
- result.deno=this->deno*a.nume;
- result.Reduction();
- return result;
- }
- ostream &operator<<(ostream &out,const Fraction &a)
- {
- out<<a.GetNume()<<"/"<<a.GetDeno();
- return out;
- }
- istream &operator>>(istream &in,Fraction &a)
- {
- char ch;
- int m,n;
- ch=GetChar(in);
- if(ch!='+'&&ch!='-'&&!isdigit(ch))
- throw Error("非法字符");
- else
- {
- in.putback(ch);
- in>>m;
- ch=GetChar(in);
- if(ch!='/') throw Error("非法字符");
- ch=GetChar(in);
- if(ch!='+'&&ch!='-'&&!isdigit(ch))
- throw Error("非法字符");
- in.putback(ch);
- in>>n;
- if(n==0) throw Error("分母为0");
- }
- while(in.get()!='/n');
- a.SetNume(m);
- a.SetDeno(n);
- a.Reduction();
- return in;
- }
- //#endif