高级语言程序设计(C++II)练习题

更新时间:2023-05-14 13:29:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

C++辅导资料

《C++Ⅱ》试卷 (№ A03Ⅱa)

计算机学院《C++Ⅱ》试卷

========================

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

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

3. 试题总分100分。所有作答必须按题号对应填写在答卷上,否则无效。

4. 考试结束,试卷、答卷和草稿纸必须完整无损地一起递交。

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

1.仔细、完整地阅读程序,对应题号填写注释。注释的内容包括两部分:1.本行的语句是

什么;2.简述其功能或特点。例如,注释可以这样写:“友员函数;重载加法运算符(+)。” (每小题1分,共10 分)

#include<iostream.h>

#include<math.h>

#include<iomanip.h>

class Rational

{ private:

int numerator,denominator; //(例)数据成员;表示一个有理数的分子、分母。 int maxcommonFactor(int,int);

void simplify( );

void DtoF(double,int&,int&);

public:

Rational(int n,int d=1);

Rational(double x=0);

~Rational();

void plus(const Rational&); Rational operator + (const Rational&); //(例)公有成员函数;重载加法运算符(+)。 void showFraction( );

operator double( );

friend ostream &operator<<

(ostream &output, Rational &t);

};

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

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

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)

第 1 页 共 6 页

C++辅导资料

《C++Ⅱ》试卷 (№ A03Ⅱa)

{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。"<<endl;

numerator=0; denominator=1;}

;}

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<<abs(numerator)<<"/"<<abs(denominator);

else cout<<"-"<<abs(numerator)<<"/"<<abs(denominator);}

Rational::operator double()

{return ostream &operator <<(ostream &output, Rational &t)

{output<<t.numerator<<'/'<<t.denominator; return output;}

void main()

{ Rational a; cout<<double(a); cout<<endl;

Rational b(2,0); b.showFraction(); cout<<endl;

Rational c(3,4); c.showFraction(); cout<<endl;

Rational d(1.2); d.showFraction(); cout<<endl;

a=b+c; cout<<double(a); cout<<endl;

}

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

分)

·写出上述程序的运行结果。

·在上述程序中,使用成员函数重载加法运算符(+)。现假设要改用友员函数重载加法运算符(+),下面给出了函数体,请写出相应的函数原型(

声明)和函数头。

函数原型 第 2 页 共 6 页

C++辅导资料

《C++Ⅱ》试卷 (№ A03Ⅱa)

函数体 {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初始化

对象b初始化

对象

c初始化 对象d初始化

·在上述程序中,请你补充一个复制构造函数的定义,要求用内联函数实现。

复制构造函数和重载赋值运算符函数虽然都是实现数据成员的复制,但执行时机不同。当函数返回类类型时,

也要通过复

·假设在上述程序的基础上,于main函数末尾处添加一行:

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

写出这段语句的运行结果。

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

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

//类A

#include<iostream.h>

class A

{ private: double x;

public:

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

double getx( ) const {return x;}

void show( ){cout<<"x="<<x<<endl;}

} ;

//类B私有继承类A,类B的定义及main函数如下:

class B: private A

{ private: double x;

public :

B(double px=2): x(px){ } //类B构造函数定义

void show( ){cout<<getx( )<<endl;}

} ;

void main( ) { A a; a.show( ); B b(3); b.show( ); }

第 3 页 共 6 页

C++辅导资料

《C++Ⅱ》试卷 (№ A03Ⅱa)

·执行上述程序,运行结果为:

·若把类B构造函数定义改为 B(double px=2):A(px){ } ,则程序运行结果为:

· 改写上述程序中的类B构造函数定义 B(double px=2): x(px){ }。要求不使用“初始化式”,但函数的功能不变,且内联函数的形式也不变。按要求,类B构造函数定义可以改写成:

·有时需要复制A类对象的数据去创建B类对象,请用内联函数的形式写出类B的重载构造函数:

·假设在上述main函数的末尾添加一句:cout<<b.getx( )<<endl; 因getx( )私有,不可访问。请你在类B的定义中作一声明,保持getx( )仍为公有,使添加的语句可以运行。该声明为:

·在类B公有段增加一个内联函数fetch的定义,其功能是返回B类对象数据x的平方值。

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

下列程序中,类B1,B2虚继承类A,类C多继承B1,B2。按题目要求作答。注意A为虚基类,建立间接派生类对象时,只有一个a对象的数据成员版本。

#include<iostream.h>

class A //长度x,y

{ public:

double x,y;

A(double px=1,double py=1):x(px),y(py){ }

virtual ~A( ){ }

void show( ){cout<<"[A ]=>"<<x<<","<<y<<endl;}

} ;

class B1: virtual public A //矩形面积

{ public :

B1(double px=2, double py=2):A(px,py){ }

void show(){cout<<"[B1]=>"<<x*y<<endl;}

} ;

class B2: virtual public A //梯形面积

{ public:

double z;

B2(double px=3, double py=3, double pz=3):A(px,py),z(pz){}

void show(){cout<<"[B2]=>"<<0.5*(x+y)*z<<endl;}

} ;

第 4 页 共 6 页

C++辅导资料

《C++Ⅱ》试卷 (№ A03Ⅱa)

class C: public B1, public B2 //体积

{ public:

double h;

C(double px=4,double py=4,double pz=4,double ph=4):B2(px,py,pz),h(ph){}

void show(){cout<<"[C ]=>"<<x<<","<<y<<"/"<<x*y*h<<"/"<<0.5*(x+y)*z*h<<endl;} } ;

void main()

{ A a; B1 b1; B2 b2; C c;

A* p=&a; p->show( );

p=&b1; p->show( );

p=&b2; p->show( );

p=&c; p->show( );

}

·写出上述程序的运行结果。

·在类A的show函数之前加上关键字virtual,再写出上述程序的运行结果。

·在(28)题基础上,于原main 函数的末尾添加 ((B2)c).show( ); 结果将多显示一行:

·把类A的show函数改写成纯虚函数。

·若类A的show函数改写成纯虚函数,原来的main函数不能正常运行,为什么?请简单说明理由。

·类A的show函数改写成纯虚函数后,请你对原来的main函数作简单的删改,使其可以输出派生类的数据。

三、给出一些关于使用模板的程序段,按要求作答。

1.下列程序用函数模板实现两个数据的交换,请把有关的语句填充完整。

(每小题3分,共9分)

#include<iostream.h>

void main()

{ int j=1,k=3;

cout<<"int 数据类型:\n"<<j<<","<<k<<"=>"; swap(j,k); cout<<j<<","<<k<<endl; double x=1.23,y=9.87;

cout<<"double数据类型: \n"<<x<<","<<y<<"=>"; swap(x,y); cout<<x<<","<<y<<endl;

第 5 页 共 6 页

C++辅导资料

《C++Ⅱ》试卷 (№ A03Ⅱa)

char p='A',q='B';

cout<<"char 数据类型:\n"<<p<<","<<q<<"=>"; swap(p,q); cout<<p<<","<<q<<endl ; }

2.下列程序使用了向量vector和算法sort实现数组的排序,请把有关的语句填充完整。 (每小题3分,共9分)

#include<iostream>

#include<vector>

#include<algorithm>

const int size=10;

void display(vector<int>V,int n)

bool down(int x,int y)

void main( )

{ int a[size]={10,3,17,6,15,8,13,34,25,2};

vector<int>V(a,a+size); // 用数组对模板向量赋初值

cout<<"输出原始数组: \n";

display(V,size);

sort(V.begin( ),V.end( )); // 对向量按升序排序

cout<<"输出升序排列后的数组: \n" ;

display(V,size);

sort(V.begin( ),V.end( ),down); // 对向量按降序排序

cout<<"输出降序排列后的数组: \n" ;

display(V,size);

}

四、给出一个输入输出流操作的程序段,请把有关的语句填充完整。 (每小题3分,共6分)

#include <iostream.h>

#include <fstream.h>

#include <stdlib.h>

void main( )

{ ofstream outstuf ; // 建立输出文件流对象

if(!outstuf){cerr<<"error!"<<endl;abort( );} // 调用重载算符函数测试流

outstuf<<"This is a file of example.\n"; // 写入一行内容

;

}

第 6 页 共 6 页

本文来源:https://www.bwwdw.com/article/xf6e.html

Top