C++课程
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
报告
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
目:分数计算器
学号:
姓名:
班级:指导教师:
提交日期:2011-9-15
1、 程序功能简介
分数计算及测试程序,具有对输入的运算进行“+-*/”的功能。
需要其他题目请联系QQ2496031764
2、 课程设计要求
1、 将主程序设计成一个分数计算器。
2、 可完成“+-*/’等基本运算。
3、 可将分数化为十进制小数和带分数。
4、 可执行“+-*/”(含括号)四则运算。
3、 设计思路
利用程序进行加法 减法 乘法 除法四种基本运算,并约分。主要用到的算法:最小公倍数,最大公约数,交换。加法的原理:结果的分子 是两个数的分子分母交换相乘相加的和,结果的分母是 两分母的最小公倍数。减法的原理与加法类似。乘法的原理:分母相乘,分子相乘。除法的原理:第二个分数上下交换后,使用乘法原理。约分的原理:分子分母分别除以分子分母的最大公约数得到的数组合成新的分子分母。
4、 关键源代码注解
/*#ifndef _TGR_FRACTIONS_H
#define _TGR_FRACTIONS_H*/
#include
#include
#include
#include
//#include
#include
class fraction //分数类定义
{
public:
fraction();
//constructors
fraction(int initn, int initd);
//accessors
int numerator() const; //取分子,const成员函数,不能修改数据成员
int denominator() const; //取分母
double decimal() const; //将分数转换为对应的小数
fraction absval() const; //分数的绝对值
//modifiers
void setnum(int newnum); //设置分子
void setden(int newden); //设置分母
void simplify(); //约分
void recip(); //分子分母转置
const fraction & operator+= (int rhs);
private:
int n;
int d;
};
//free (nonmember) functions
//miscellany
void simple(); //"简单计算"函数
void turn(); //"转换"函数
void test(); //测试函数
void complex(); //"混合运算"函数
void exam(); //"随机测
试题
中考模拟试题doc幼小衔接 数学试题 下载云南高中历年会考数学试题下载N4真题下载党史题库下载
"函数
int GCF(int x, int y); //求x,y的最大公因子
//addition operators
fraction operator+ (const fraction &lhs, const fraction &rhs);
fraction operator+ (const fraction &lhs, int rhs);
//subtraction operators
fraction operator- (const fraction &lhs, const fraction &rhs);
fraction operator- (const fraction &lhs, int rhs);
//multiplication operators
fraction operator* (const fraction &lhs, const fraction &rhs);
fraction operator* (const fraction &lhs, int rhs);
//division operators
fraction operator/ (const fraction &lhs, const fraction &rhs);
fraction operator/ (const fraction &lhs, int rhs);
//power operator
fraction operator^ (const fraction &base, int exp); //^(幂)运算符重载
//comparison operators
bool operator== (const fraction &lhs, const fraction &rhs);
bool operator!= (const fraction &lhs, const fraction &rhs);
bool operator>= (const fraction &lhs, const fraction &rhs);
bool operator<= (const fraction &lhs, const fraction &rhs);
bool operator> (const fraction &lhs, const fraction &rhs);
bool operator< (const fraction &lhs, const fraction &rhs);
bool operator== (const fraction &lhs, int rhs);
bool operator!= (const fraction &lhs, int rhs);
bool operator>= (const fraction &lhs, int rhs);
bool operator<= (const fraction &lhs, int rhs);
bool operator> (const fraction &lhs, int rhs);
bool operator< (const fraction &lhs, int rhs);
// I/O operators/functions
ostream & operator<< (ostream &os, const fraction &f); // 输出运算符重载
istream & operator>> (istream &is, fraction &f); // 输入运算符重载
void PrintAsMixed(ostream &os, const fraction &f); // 输出带分数
/*#endif*/
/* fraction.cpp
Fractions class - implementation file--分数类执行文件开始*/
//#include "fraction.h"
fraction::fraction() : n(0), d(1) {} ; //
缺省构造函数(=0/1)
fraction::fraction(int initn, int initd) : n(initn), d(initd) {};
int fraction::numerator() const //
取分子
{return n;}
int fraction::denominator() const //
取分母
{
return d;
}
double fraction::decimal() const //分数转换小数
{
return double(n) / double(d);
}
fraction fraction::absval() const //取分数绝对值
{
fraction returnValue(abs(n), abs(d)); //通过构造函数取分母分子绝对值
return returnValue;
}
void fraction::setnum(int newnum) //设置分子的值
{
n = newnum;
}
void fraction::setden(int newden) //设置分母的值
{
if(newden != 0) //分母非零时设置
d = newden;
else //若分母为零,显示错误信息并退出
{
cout << "错误:除数为零!!!\n"
<< "按任意键终止!";
getch();
abort(); //退出
}
}
void fraction::simplify() //分数约分
{
int r = GCF(n, d);
n /= r;
d /= r;
}
void fraction::recip() //分子分母交换
{
int temp = n;
n = d;
d = temp;
}
const fraction & fraction::operator+= (int rhs) //重载"+="
{
fraction newrhs(rhs, 1); //将作为参数的整数RHS转换为分数类的对象
return (*this+newrhs); //
}
int GCF(int x, int y) //
辗转相除求x,y的最大公约数
{
int r = x%y;
if(r==0)
return y;
else
return GCF(y, r);
}
fraction operator+ (const fraction &lhs, const fraction &rhs) //重载"+",完成两分数相加情况
{
fraction sum; //定义分数类对象,通过两参数对象对其赋值
int newnum = (lhs.numerator() * rhs.denominator())
+(rhs.numerator() * lhs.denominator());//得到相加后的分子
int newden = (lhs.denominator() * rhs.denominator()); //得到相加后的分母
sum.setnum(newnum); //设置分子
sum.setden(newden); //设置分母
sum.simplify(); //分数约分
return sum;
}
fraction operator+ (const fraction &lhs, int rhs) //重载"+"分数与整数相加
{
fraction newrhs(rhs, 1); //将RHS转换为分数类对象
return lhs + newrhs;
}
fraction operator- (const fraction &lhs, const fraction &rhs)//重载"-"完成两分数相减
{
fraction newrhs = rhs;
newrhs.setnum(-rhs.numerator()); //设置分母为其相反数
return lhs + newrhs; //利用"+"的重载
}
fraction operator- (const fraction &lhs, int rhs) //重载"-"完成分数与整数的相减
{
fraction newrhs(rhs, -1);
return lhs + newrhs; //利用"+"的重载
}
fraction operator* (const fraction &lhs, const fraction &rhs) //重载"*"完成两分数相乘
{
fraction product;
int newnum = lhs.numerator() * rhs.numerator(); //分子相乘
int newden = lhs.denominator() * rhs.denominator(); //分母相乘
product.setnum(newnum); //设置分子
product.setden(newden); //设置分母
product.simplify(); //分数约分
return product;
}
fraction operator* (const fraction &lhs, int rhs) //重载"*"完成分数与整数的相乘
{
fraction prod(lhs.numerator() * rhs, lhs.denominator()); //通过构造函数完成赋值
prod.simplify(); //分数约分
return prod;
}
fraction operator/ (const fraction &lhs, const fraction &rhs) //重载"/"完成两分数相除
{
if(rhs == 0) //若分母为零,显示错误信息并退出
{
cout << "Error: Division by zero attempted!\n"
<< "Press any key to terminate";
getch();
abort(); //退出
}
fraction newrhs = rhs;
newrhs.recip(); //将作分母的分数倒置
return lhs * newrhs; //利用分数乘法
}
fraction operator/ (const fraction &lhs, int rhs) //重载"/"完成分数与整数的相除
{
if(rhs == 0) //若分母为零,显示错误信息并退出
{
cout << "错误:除数为零!!!\n"
<< "按任意键终止!";
getch();
abort();
}
fraction quot(lhs.numerator(), lhs.denominator() * rhs); //通过构造函数完成赋值
quot.simplify(); //分数约分
return quot;
}
fraction operator^ (const fraction &base, int exp)
{
fraction returnValue;
returnValue.setnum(pow(base.numerator(), exp)); //通过函数完成
returnValue.setden(pow(base.denominator(), exp)); //分子分母幂乘
return returnValue;
}
bool operator== (const fraction &lhs, const fraction &rhs) //重载"=="判断两分数是否相等
{
return lhs.decimal() == rhs.decimal();
}
bool operator!= (const fraction &lhs, const fraction &rhs) //重载"!="判断两分数是否不等
{
return lhs.decimal() != rhs.decimal();
}
bool operator>= (const fraction &lhs, const fraction &rhs) //重载">="判断前分数是否大于等//于后分数
{
return lhs.decimal() >= rhs.decimal();
}
bool operator<= (const fraction &lhs, const fraction &rhs) //重载"<="判断前分数是否小于等//于后分数
{
return lhs.decimal() <= rhs.decimal();
}
bool operator> (const fraction &lhs, const fraction &rhs) //重载">"判断前分数是否大于//后分数
{
return lhs.decimal() > rhs.decimal();
}
bool operator< (const fraction &lhs, const fraction &rhs) //重载"<"判断前分数是否小于//后分数
{
return lhs.decimal() < rhs.decimal();
}
bool operator== (const fraction &lhs, int rhs) //重载"=="判断分数与整数是否相等
{
return lhs.decimal() == rhs;
}
bool operator!= (const fraction &lhs, int rhs) //重载"!="判断分数与整数是否不等
{
return lhs.decimal() != rhs;
}
bool operator>= (const fraction &lhs, int rhs) //重载">="前分数是否大于等于整数
{
return lhs.decimal() >= rhs;
}
bool operator<= (const fraction &lhs, int rhs) //重载"<="前分数是否小于等于整数
{
return lhs.decimal() <= rhs;
}
bool operator> (const fraction &lhs, int rhs) //重载">"前分数是否大于整数
{
return lhs.decimal() > rhs;
}
bool operator< (const fraction &lhs, int rhs) //重载"<"前分数是否小于整数
{
return lhs.decimal() == rhs;
}
ostream & operator<< (ostream &os, const fraction &f) //重载输出运算符
{
fraction temp = f.absval();
int numer = f.numerator();
int denom = f.denominator();
if((!((numer > 0 && denom > 0)
|| (numer < 0 && denom < 0)))
&& f != 0)
os << '-'; //分子分母不同号就输出"-"
if(temp.numerator() == 0 || temp.denominator() == 1)
os << temp.numerator(); // 分子为0或分母为1时就输出分子
else
os << temp.numerator() << '/' << temp.denominator();//其他情况输出此分数
return os; //
}
istream & operator>> (istream &is, fraction &f) //
is:输入流,f:待输入的分数
{
int newnum, newden;
char slash = ' ';
do
{
is >> newnum >> slash >> newden; //
} while(slash != '/');
f.setnum(newnum);
f.setden(newden);
return is; //
}
//
将分数f按整数,真分数格式输出到流os
void PrintAsMixed(ostream &os, const fraction &f)
{
int wholePart = f.numerator() / f.denominator();//wholepart获得整数部分
fraction fracPart = f - wholePart; //fracpart获得真分数部分
cout <<"带分数为:";
if(wholePart != 0)
cout << wholePart << " "; //输出整数部分
if(fracPart != 0)
cout << fracPart; //输出真分数部分
}
//准备工作结束,下面开始主函数。
void main(){
int choice;
char CLS;
cout<<"是否清屏?(Y/N)\n";
cin>>CLS;
if(CLS=='Y'||CLS=='y')system("cls");
//getch();
cout<<" 欢迎使用分数计算器!\n";
cout<<" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n";
cout<<" @@ @@\n";
cout<<" @@ <1>简单计算 @@\n";
cout<<" @@ @@\n";
cout<<" @@ <2>分数化为十进制小数和带分数 @@\n";
cout<<" @@ @@\n";
cout<<" @@ <3>分数测试 @@\n";
cout<<" @@ @@\n";
cout<<" @@ <4>分数混合运算 @@\n";
cout<<" @@ @@\n";
cout<<" @@ <5>随机测试题 @@\n";
cout<<" @@ @@\n";
cout<<" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n";
cout<<"请选择:\n"; //选择功能
cin>>choice;
if(choice>6||choice<1)
{cout<<"输入无效,请重新选择:\n";
main(); //回到主菜单
}
else{
switch(choice){ //进入函数
case 1: simple();break;
case 2: turn();break;
case 3: test();break;
case 4: complex();break;
case 5: exam();break;
}
//main();
}
}
//----------------------------------------------------------------
void simple(){ //"简单计算"函数
fraction f1;
fraction f2;
fraction sum;
char fuhao,yn;
int f3,kind;
choose:
cout<<" <1>分数与分数\n";
cout<<" <2>分数与整数\n";
cout<<" <3>返回\n";
cout<<"请选择:\n";
cin>>kind;
if(kind==1) //分数之间计算
{
cout<<"请输入第一个分数:"; //输入数据
cin>>f1;
cout<<"\n请输入第二个分数:";
cin>>f2;
cout<<"\n请输入运算符:";
cin>>fuhao;
f1.simplify(); //分数约分
f2.simplify();
switch(fuhao){ //进入计算
case '+':cout<<"\nsum="<>f1;
cout<<"\n请输入一个整数:";
cin>>f3;
cout<<"\n请输入运算符:";
cin>>fuhao;
f1.simplify();
switch(fuhao){ //进入计算
case '+':cout<<"\nsum="<>yn;
if(yn=='Y'||yn=='y')simple();
else main(); //返回菜单
}
//------------------------------------------------------------
void turn(){ //"转换"函数
fraction f1;
fraction Result;
char yn;
cout<<"请输入一个分数:\n";
cin>>f1;
cout<<"对应小数为:"<1) //输出带分数
PrintAsMixed(cout,f1);
else cout<<"此分数为真分数!"<>yn;
if(yn=='Y'||yn=='y')turn();
else main();
}
//-----------------------------------------------------------------
void test(){ //测试函数
char yn;
fraction f1;
fraction f2; //定义两个分数f1,f2
int i;
// clrscr(); //利用>>重载输入f1,f2
cout << "第一个分数:\n";
cin >> f1;
cout << "\n第二个分数:\n";
cin >> f2;
cout << "\n输入一个整数:\n";
cin >> i;
f1.simplify();
f2.simplify();
cout<<"对两分数进行+,-,*,/运算\n";
fraction sum = f1 + f2;
fraction diff = f1 - f2;
fraction prod = f1 * f2;
fraction quot;
if(f2 != 0)
quot = f1 / f2;
cout<<"输出小数运算结果\n";
cout << f1 << " 十进制为: " << f1.decimal() << '\n';
cout << f2 << " 十进制为: " << f2.decimal() << "\n\n";
cout<<"利用<<重载输出运算结果\n";
cout << f1 << " + " << f2 << " = " << sum << " (" << sum.decimal() << ")\n";
cout << f1 << " - " << f2 << " = " << diff << " (" << diff.decimal() << ")\n";
cout << f1 << " * " << f2 << " = " << prod << " (" << prod.decimal() << ")\n";
cout << f1 << " / " << f2 << " = ";
if(f2 != 0)
cout << quot << " (" << quot.decimal() << ")\n\n";
else
cout << "无意义!!!\n\n";
cout<<"进行分数(f1)和整数(i)的四则运算并输出结果\n";
cout << f1 << " + " << i << " = " << f1 + i << "\n";
cout << f1 << " - " << i << " = " << f1 - i << "\n";
cout << f1 << " * " << i << " = " << f1 * i << "\n";
cout << f1 << " / " << i << " = ";
if(i != 0)
cout << f1 / i << "\n\n";
else
cout << "无意义!!!\n\n";
cout << "Boolean operator tests (1 = true, 0 = false)\n";
cout << f1 << " == " << f2 << ": " << (f1 == f2) << '\n';
cout << f1 << " != " << f2 << ": " << (f1 != f2) << '\n';
cout << f1 << " >= " << f2 << ": " << (f1 >= f2) << '\n';
cout << f1 << " <= " << f2 << ": " << (f1 <= f2) << '\n';
cout << f1 << " > " << f2 << ": " << (f1 > f2) << '\n';
cout << f1 << " < " << f2 << ": " << (f1 < f2) << "\n\n";
double dec1 = f1.decimal();
double dec2 = f2.decimal();
if(dec1 > 1 && (int(dec1) != dec1))
{
cout << f1 << " 代分数为: ";
PrintAsMixed(cout, f1);
cout << '\n';
}
if(dec2 > 1 && (int(dec2) != dec2))
{
cout << f2 << " 代分数为: ";
PrintAsMixed(cout, f2);
}
cout<<"分数测试完毕!\n";
getch();
//return 0;
cout<>yn;
if(yn=='Y'||yn=='y')test();
else main();
}
//-------------------------------------------------------
void complex(){ //"混合运算"函数
fraction f1;
fraction f2;
fraction sum;
char op1,op,yn;
//sum.fraction();f2.fraction();
op1=' ';
cout<<"请输入分数四则运算的计算式,以'#'结束:\n";
cin>>f1>>op;
while(op!='#'){
cin>>f2;
switch(op)
{
case '+':
case '-':
switch(op1)
{
case ' ':sum=f1;break;
case '+':sum=sum+f1;break;
case '-':sum=sum-f1;break;
}
op1=op;f1=f2;break;
case '*':f1=f1*f2;break;
case '/':if(f2!=0){f1=f1/f2;break;}
else{cout<<"除数为零!\n";
goto end;
}
default:cout<<"\n";
goto end;
}
cin>>op;
}
switch(op1){
case ' ':sum=f1;break;
case '+':sum=sum+f1;break;
case '-':sum=sum-f1;break;
}
cout<<"="<>yn;
if(yn=='Y'||yn=='y') complex();
else
{
getch();
main();
}
}
//-----------------------------------------------------
void exam(){
fraction f1,f2,answer,ANSWER;
int i,opp,a1,a2,b1,b2,sum=0;
char yn;
cout<<"计算机开始出题:\n";
getch();
for(i=1;i<=10;i++){
cout<<"第"<>ANSWER;
if(ANSWER==answer){
cout<<"正确,得十分!继续加油!!\n";
sum+=10;}
else cout<<" 错误,扣十分!再来一次?\n\n\n";
}
cout<<"测试结果:答对"<>yn;
if(yn=='Y'||yn=='y') exam();
else
{
getch();
main();
}
}
5、 运行结果
用3/4 与5/8相加做例子。
6、 心得体会
通过这次短学期的C++程序设计的学习,我对C++的理解和操作都有了比较大的进步。C++是一门很有实用价值的科目,它是所有程序设计语言中最有活力和应用最广泛的一种。它对我们的逻辑思维有很高的要求,很好的训练了我们的思维能力。这次的设计作业对我们来说也是一次自我的检验和挑战。在此之前我们从来没有自己动手做过一个这么大的完整的程序,所以在这次的作业过程中我们遇到了很多的困难。但是正是这些困难让我们更加了解了C++的程序设计的精华,让我们对C++有了更正确的认识。编程中遇到许多的困难,我虚心的向软件学院的朋友学习,在他们的帮助下学到了许多东西。以前以为只要自己想好算法后其他就不难了,但真正自己编的时候才知道,原来编程要求这么高,要有很好的逻辑思维,要会设计,画图等等。有些东西书本上很难学到,只有自己上机实践了才知道怎样做,所以要多上机积累
经验
班主任工作经验交流宣传工作经验交流材料优秀班主任经验交流小学课改经验典型材料房地产总经理管理经验
,才能真正学会编程。
PAGE
2