华南理工大学高级语言程序设计(C++-II)试卷及答案

华南理工大学计算机学院

高级语言程序设计(C++ II)试卷

学生证号:____________________ 姓名: ____________________

【注意事项】 1. 严格遵守考场纪律,考试时间120分钟。

2. 试卷共6页。答卷上必须填写参考人所属的学院名称、专业及本人姓名。

3. 试题总分100分。所有作答必须按题号对应填写在答卷上,否则无效。 4. 考试结束,试卷、答卷和草稿纸必须完整无损地一起递交。

一、给出一个有理数类,实现有理数的加法运算。请按后列要求作答。

1.仔细、完整地阅读程序,对应题号填写注释。注释的内容包括两部分: 1.本行的语句是什么;2.简述其功能或特点。例如,注释可以这样写:“友员函数;重载加法运算符(+)。”

(每小题1分,共10 分) #include #include #include class Rational { private:

int numerator,denominator; //(例)数据成员;表示一个有理数的分子、分母。 int maxcommonFactor(int,int); //(1) void simplify( ); //(2) void DtoF(double,int&,int&); //(3) public:

Rational(int n,int d=1); //(4) Rational(double x=0); //(5) ~Rational(); //(6) void plus(const Rational&); //(7) Rational operator + (const Rational&); //(例)公有成员函数;重载加法运算符(+)。 void showFraction( ); //(8) operator double( ); //(9) friend ostream &operator<< //(10) (ostream &output, Rational &t); };

2. 对应题号把函数的定义补充完整。(每小题3分,共9 分)

第 1 页 共 8 页

int Rational::maxcommonFactor(int a,int b)

{if(a%b==0)return b; return (11) ;} void Rational::simplify( )

{int temp=maxcommonFactor(abs(numerator),abs(denominator)); if(temp==1)return; numerator/=temp;denominator/=temp; return;} void Rational::DtoF(double x,int & n,int & d)

{double s=fabs(x); d=1; while((s*d-int(s*d))>1e-15)d*=10;n=int(x*d);} Rational::Rational(int n,int d)

{if(d==0) {cout<<\错误! 分母不能为0。有理数将置为0。\

numerator=0; denominator=1;}

else { (12) ; ;} simplify(); }

Rational::Rational(double x)

{DtoF(x,numerator,denominator);simplify();} Rational::~Rational( ){ }

void Rational::plus(const Rational& addend)

{numerator=addend.numerator*denominator+addend.denominator*numerator; denominator*=addend.denominator; simplify();}

Rational Rational::operator + (const Rational& t) {Rational temp(0,1);

temp.numerator=numerator*t.denominator+denominator*t.numerator; temp.denominator=denominator*t.denominator; temp.simplify(); return temp;} void Rational::showFraction( )

{if(numerator<0 && denominator<0 || numerator>=0 && denominator>0) cout<

{output<

{ Rational a; cout<

3. 根据题目要求,按对应题号作答。(每小题3分,共21分)

第 2 页 共 8 页

·写出上述程序的运行结果。 (14) ·在上述程序中,使用成员函数重载加法运算符(+)。现假设要改用友员函数重载加法运算符(+),下面给出了函数体,请写出相应的函数原型(声明)和函数头。 函数原型 (15) 函数头 (16) 函数体 {Rational temp(0,1);

temp.numerator=t1.numerator*t2.denominator+t1.denominator*t2.numerator; temp.denominator=t1.denominator*t2.denominator; temp.simplify(); return temp; }

·在上述程序中,构造函数出现重载,我们按其定义的先后分别称为构造函数1和构造函数2。注意到main函数中依次定义了对象a,b,c,d。请你分别写出这四个对象的初始化各自调用的是哪一个构造函数。

对象a初始化: (17.a) ; 对象b初始化: (17.b) ; 对象c初始化: (17.c) ; 对象d初始化: (17.d) ;

·在上述程序中,请你补充一个复制构造函数的定义,要求用内联函数实现。 (18) 复制构造函数和重载赋值运算符函数虽然都是实现数据成员的复制,但执行时机不同。复制构造函数通常用于(19.a) 和传递对象参数,当函数返回类类型时,也要通过复制构造函数建立临时对象;重载赋值运算符函数用于(19.b) 。 ·假设在上述程序的基础上,于main函数末尾处添加一行:

for(int i=0;i<=1;i++)c.plus(c+d); cout<

二、给出一些类的定义,按要求作答。

1. (每小题3分,共18分)

//类A

#include class A

{ private: double x; public:

A(double px=1):x(px){ }

double getx( ) const {return x;}

void show( ){cout<<\} ;

//类B私有继承类A,类B的定义及main函数如下: class B: private A { private: double x; public :

第 3 页 共 8 页

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4