c++实验报告.docx
《c++实验报告.docx》由会员分享,可在线阅读,更多相关《c++实验报告.docx(13页珍藏版)》请在冰点文库上搜索。
c++实验报告
实验七项目名称:
多态
实验目的:
C++中运算符重载的基本操作
操作题一:
1.完成对分数的+,-,*,/进行重载为类的友元函数,提示如下:
a)请将已有程序1.cpp补充完整;
b)仔细阅读程序中注释语句。
思考题:
分析voidoptim()成员函数的功能?
2.请在实验报告中记下在VC6.0中调试程序过程中的系统错误,以及解决办法。
ps:
完成实验报告七,将思考题答案写在实验报告中!
题目
#include
#include
#include
usingnamespacestd;
classfraction
{
public:
fraction(intx=0,inty=1);
voidprint();//以“/”的分数形式输出
//定义重载运算符的友元函数
private:
intnumerator,denominator;//numerator为分子,denominator为分母
voidoptim();//详细分析该函数功能
};
voidfraction:
:
optim()//请解释出现的if-else对照的实际情况及do-while循环的作用
{
intgcd,min,max;
if(denominator==0)
{
cout<<"Azerodenominatorisinvalid"<exit
(1);
}
gcd=(abs(numerator)>abs(denominator)?
abs(denominator):
abs(numerator));
if(gcd==0)return;//注意:
return语句的特殊用法
if(abs(numerator)>abs(denominator))
{
max=numerator;
min=denominator;
}
else
{
min=numerator;
max=denominator;
}
do
{
gcd=max%min;
max=min;
min=gcd;
}while(gcd!
=0);
numerator/=max;
denominator/=max;
if(denominator<0)
{
numerator=-numerator;
denominator=-denominator;
}
}
fraction:
:
fraction(intx,inty)
{//将构造函数补充完整
}
voidfraction:
:
print()
{//将该函数补充完整
}
//四个运算符重载函数具体实现
intmain()//1.记下调试过程中出现的系统错误及解决办法;2.调试通过后将运行结果记在实验报告八中
{
cout<<"输入测试数据:
"<fractionr1(2,8),r2(23,45),r3,r4(-63,789),r5(3),r6(56,-894),r7(0,3),r8(-12,-48);
cout<<"原始数据:
r1(2,8)"<cout<<"处理后数据r1=";
r1.print();
cout<<"原始数据:
r2(23,45)"<cout<<"处理后数据r2=";
r2.print();
cout<<"原始数据:
r3"<cout<<"处理后数据r3=";
r3.print();
cout<<"原始数据:
r4(-63,789)"<cout<<"处理后数据r4=";
r4.print();
cout<<"原始数据:
r5(3)"<cout<<"处理后数据r5=";
r5.print();
cout<<"原始数据:
r6(56,-894)"<cout<<"处理后数据r6=";
r6.print();
cout<<"原始数据:
r7(0,3)"<cout<<"处理后数据r7=";
r7.print();
cout<<"原始数据:
r8(-12,-48)"<cout<<"处理后数据r8=";
r8.print();
cout<<"下一组运算结果:
"<r3=r1+r2;
cout<<"r1+r2=";
r3.print();
r3=r1-r2;
cout<<"r1-r2=";
r3.print();
r3=r1*r2;
cout<<"r1*r2=";
r3.print();
r3=r1/r2;
cout<<"r1/r2=";
r3.print();
return0;
}
答案
#include
#include
#include
//usingnamespacestd;
classfraction
{
public:
fraction(intx=0,inty=1);
voidprint();//以“/”的分数形式输出
//定义重载运算符的友元函数
friendfractionoperator+(fractionf1,fractionf2);
friendfractionoperator-(fractionf1,fractionf2);
friendfractionoperator*(fractionf1,fractionf2);
friendfractionoperator/(fractionf1,fractionf2);
private:
intnumerator,denominator;//numerator为分子,denominator为分母
voidoptim();//详细分析该函数功能
};
voidfraction:
:
optim()//请解释出现的if-else对照的实际情况及do-while循环的作用
{
intgcd,min,max;
if(denominator==0)
{
cout<<"Azerodenominatorisinvalid"<exit
(1);
}
gcd=(abs(numerator)>abs(denominator)?
abs(denominator):
abs(numerator));
if(gcd==0)return;//注意:
return语句的特殊用法
if(abs(numerator)>abs(denominator))
{
max=numerator;
min=denominator;
}
else
{
min=numerator;
max=denominator;
}
do
{
gcd=max%min;
max=min;//最大公约数
min=gcd;
}while(gcd!
=0);//最大公倍数numerator*denominator/max;
numerator/=max;//numerator=numerator/max;
denominator/=max;//denominator=denominator/max;
//变成最简分数
if(denominator<0)
{
numerator=-numerator;
denominator=-denominator;
}
}
fraction:
:
fraction(intx,inty)
{//将构造函数补充完整
numerator=x;
denominator=y;
}
voidfraction:
:
print()
{//将该函数补充完整
optim();
cout<}
//四个运算符重载函数具体实现
fractionoperator+(fractionf1,fractionf2)
{
fractionf;
f.numerator=f1.numerator*f2.denominator+f1.denominator*f2.numerator;
f.denominator=f1.denominator*f2.denominator;
returnf;
}
fractionoperator-(fractionf1,fractionf2)
{
fractionf;
f.numerator=f1.numerator*f2.denominator-f1.denominator*f2.numerator;
f.denominator=f1.denominator*f2.denominator;
returnf;
}
fractionoperator*(fractionf1,fractionf2)
{
fractionf3;
f3.numerator=f1.numerator*f2.numerator;
f3.denominator=f1.denominator*f2.denominator;
returnf3;
}
fractionoperator/(fractionf1,fractionf2)
{
fractionf4;
f4.numerator=f1.numerator*f2.denominator;
f4.denominator=f1.denominator*f2.numerator;
returnf4;
}
intmain()//1.记下调试过程中出现的系统错误及解决办法;2.调试通过后将运行结果记在实验报告八中
{
cout<<"输入测试数据:
"<fractionr1(2,8),r2(23,45),r3,r4(-63,789),r5(3),r6(56,-894),r7(0,3),r8(-12,-48);
cout<<"原始数据:
r1(2,8)"<cout<<"处理后数据r1=";
r1.print();
cout<<"原始数据:
r2(23,45)"<cout<<"处理后数据r2=";
r2.print();
cout<<"原始数据:
r3"<cout<<"处理后数据r3=";
r3.print();
cout<<"原始数据:
r4(-63,789)"<cout<<"处理后数据r4=";
r4.print();
cout<<"原始数据:
r5(3)"<cout<<"处理后数据r5=";
r5.print();
cout<<"原始数据:
r6(56,-894)"<cout<<"处理后数据r6=";
r6.print();
cout<<"原始数据:
r7(0,3)"<cout<<"处理后数据r7=";
r7.print();
cout<<"原始数据:
r8(-12,-48)"<cout<<"处理后数据r8=";
r8.print();
cout<<"下一组运算结果:
"<r3=r1+r2;
cout<<"r1+r2=";
r3.print();
r3=r1-r2;
cout<<"r1-r2=";
r3.print();
r3=r1*r2;
cout<<"r1*r2=";
r3.print();
r3=r1/r2;
cout<<"r1/r2=";
r3.print();
return0;
}
思考
#include
#include
#include
usingnamespacestd;
classfraction
{
public:
fraction(intx=0,inty=1);
voidprint();//以“/”的分数形式输出
private:
intnumerator,denominator;//numerator为分子,denominator为分母
voidoptim();//详细分析该函数功能
};
voidfraction:
:
optim()//请解释出现的if-else对照的实际情况及do-while循环的作用
{
intgcd,min,max;
if(denominator==0)
{
cout<<"Azerodenominatorisinvalid"<exit
(1);
}
gcd=(abs(numerator)>abs(denominator)?
abs(denominator):
abs(numerator));
if(gcd==0)return;//注意:
return语句的特殊用法
if(abs(numerator)>abs(denominator))
{
max=numerator;
min=denominator;//ifelse语句是找出分子,分母较大
}
else
{
min=numerator;
max=denominator;
}
do//dowhile语句是辗转相减法。
{
gcd=max%min;
max=min;
min=gcd;
}while(gcd!
=0);
numerator/=max;
denominator/=max;//这二步,分子分母同时除以最大公约数max;
if(denominator<0)
{
numerator=-numerator;//感觉这个根本没有什么用,分子,分母同时变号,值也不变,我去掉了,也没有出现错误。
denominator=-denominator;
}
}
fraction:
:
fraction(intx,inty)
{//将构造函数补充完整
numerator=x;
denominator=y;
}
voidfraction:
:
print()
{//将该函数补充完整
optim();
cout<}
intmain()
{
cout<<"输入测试数据:
"<fractionr1(2,8),r2(23,45),r3,r4(-9,6),r5(100,-50),r6(-50,-100);
cout<<"原始数据:
r1(2,8)"<cout<<"处理后数据r1=";
r1.print();
cout<<"原始数据:
r2(23,45)"<cout<<"处理后数据r2=";
r2.print();
cout<<"原始数据:
r3"<cout<<"处理后数据r3=";
r3.print();
cout<<"原始数据:
r4(-9,6)"<cout<<"处理后数据r4=";
r4.print();
cout<<"原始数据:
r5(100,-50)"<cout<<"处理后数据r5=";
r5.print();
cout<<"原始数据:
r5(-50,-100)"<cout<<"处理后数据r5=";
r6.print();
return0;
}