在线留言 注册 登录
热门搜索:形考答案免费答案奥鹏答案

福建师范大学《C++语言程序设计》期末复习题

Time2024-02-04Hits浏览量: 162
添加QQ : 103092222或微信: xyzlfx100获取更多答案

练习题2019.6

一、单项选择题

1. 关于预处理命令#include<iostream>作用的描述中,错误的是(   )。

A. 命令提供C++程序的结构框架

B. 程序编译时先处理#include等预处理命令

C. 文件iostream向程序提供输入和输出所需的信息

D. 将文件”iostream”的内容代替该命令包含到程序中

2、 语句using namespace std;的作用是(   )。

A. 使用标准库std        B. 使用命名空间std   

C. 使用工作空间std      D. 使用内存空间std

3. (   )不是C++语言的基本数据类型。

A.  double    B.  unsigned    C.  bool     D.  int *

4、. 若有定义int a=123,b=8;,执行语句a%=b+2; 之后,变量a的值为(   )。

A.  1       B. 2         C. 3          D. 5

5、已知int i, x, y;在下列选项中错误的是(   )。 

A.  if ( x && y ) i ++;        B.  if ( x == y) i --;

C.  if ( xy ) i --;             D.  if ( x + y ) i++;

6、 char ch;

cin>>ch;

ch=(ch>=’A’&&ch<=’Z’)?:(ch+32),ch;

若以上程序输入了字符’B’,则变量ch的内容是(    )。 

A.  ‘B’     B.  ‘b’      C.  ‘Z’      D.  ‘z’

7、i=2,执行下列语句后的值为(   )。 

switch ( i )

{  case 1: i++;

case 2: i- -; 

case 3: ++i; break;

case 4: - -i;

default : i++;  } 

A.  1        B.  2         C.  3         D.  4 

8、已知int m=10;下列表示引用的方法中,(   )是正确的。 

A.  int &x=m;       B.  int &y=10;    

C.  int &z;          D.  float &t=&m;

9、执行语句:

int a = 10, b;

int & pa = a , & pb =b;后,下列正确的语句是(    )。

  A. &pb = a;   B. pb = pa;   C. &pb = &pa;   D. *pb = *pa;

10、执行语句

int a = 10,b=20;

const int *pa = &a; 后,执行下列哪条语句会发生错误(   )。

A. *pa = *pa+b;   B. a=a+b;    C. a = *pa+b;   D. pa = &b;

11、以下为死循环的程序段是(   )。 

A.  for ( int x = 0;x < 3;  ) { x++;  } 

B.  int k = 0; 

      do { ++k;  } while ( k>=0 );

C.  int a=5; while ( a ) { a- -;  } 

D.  int i=3;  for ( ;i ; i-- ) ;

12、系统在调用重载函数时,根据一些条件选择调用哪个重载函数,下列选项中不能做为依据的是(   )。 

A. 函数类型         B. 参数类型    

C. 参数个数         D. 参数类型或参数个数

13、函数原型声明:void testDP(int a,int b=7,char c=’*’);,下列函数调用中不合法的是(    )。 

A.  testDP(5);            B.  testDP(5,8 );   

C.  testDP(5,’#’);         D.  testDP(5,8,’a’);

14、若用数组名作为调用函数的实参,则传递给形参的是(    )。

A.  数组存储区首地址         C.  数组的第一个元素值

B.  数组中全部元素的值       D.  数组元素的个数

15、执行语句

int a[2][10] ,(*p)[10] = a;

a[1][1] =8;下列语句要与本赋值语句功能相同,其中错误语句是(   )。

A. *(a[1]+1)=8;    B. *(*(p+1)+1)=8;  C. p[1][1] =8;     D. * p[1][1] =8;

16、有函数声明 int fun1(int); ,定义指向该函数的指针,下面选项正确的是(   )。

A.  int * pf = &fun1;          B.  int * pf (int) = &fun1;   

C.  int( * pf) (int) = fun1();     D.  int (* pf) (int) = fun1; 

17、有如下语句:

int fun4 (int);

int (* pf) (int) = fun4; 下面选项正确的是(   )。

A.  int a = 15; int n = fun4 (&a); 

B.  int a = 15; cout<<pf (a*3.14);

C.  cout<<(* pf) (256);       D.  cout<<*pf (256);

18、在类的外部,可以被访问的成员是(  )属性的类成员。 

A. 所有      B. private或protected

C. public      D. public 或 private 

19、类中可以被对象无限制使用的成员是(    )。 

A. public 成员          B. private成员

C .protected 成员        D .public与private 成员 

20、关于类和对象不正确的说法是(   )。 

A. 类是一种类型,它封装了数据和操作  B. 对象是类的实例

C. 一个类只能定义一个对象    D. 一个对象必属于某个类 

21、已知类Xcls,语句Xcls array[3]定义对象数组时,调用了(   )次构造函数。 

A . 0       B. 1       C. 2        D. 3 

22、运算符delete用于删除一个动态对象时,以下正确的是(   )。

A.先调用构造函数,再释放对象占用的内存      

B.先释放对象占用的内存,再调用构造函数

C.先调用析构函数,再释放对象占用的内存

D. 先释放对象占用的内存,再调用析构函数

23、以下常成员的说法,不正确的是(   )。 

A.常数据成员定义与常变量定义相同,但必须在类中      

B.常数据成员要在定义时直接初始化

C.常数据成员只能用构造函数的参数初始化表来初始化

D. 常数据成员初始化后不能更新

24、void Time:: fun (int){…;}是Time类的成员函数,定义一个指向该成员函数的指针,下面选项正确的是(    )。 

A. void (Time:: * pf) (int) =& Time:: fun;            

B. void Time:: * pf (int) = &Time:: fun;

C. void (Time:: * pf) (int) = &fun;     

D. void (* pf )(int) =&Time:: fun;    

25、下面对构造函数的不正确描述是(    )。 

A. 用户未定义构造函数时系统可以提供默认构造函数。 

B. 构造函数可以有参数,所以也可以有返回值

C. 构造函数可以重载。 

D. 构造函数可以设置默认参数。 

26、下面对析构函数的不正确描述是(    )。 

A. 析构函数只能有一个。 

B. 与构造函数一样,析构函数可以有参数。

C. 析构函数功能是用于释放对象前做清理扫尾工作。 

D. 析构函数没有函数类型。

27、已知类myclass,则该类的拷贝构造函数声明语句是(    )。 

A. myclass(myclass x);        B. myclass&(myclass x);    

C. myclass(myclass &x);       D. myclass(myclass *x); 

28、Complex是复数类,语句Complex(2.8 , 12.5);的功能是(   )。

A. 定义名字是Complex的对象   

B. 调用析构函数进行初始化     

C. 定义一个无名对象             

D.  二个数据转为复数后求和   

29、以下关于友元函数的描述中,错误的是(   )。 

A. 友元函数可以访问类的私有数据成员      

B. 一个类的友元类的成员函数,都是这个类的友元函数

C. 友元函数有助于数据共享和提高程序的效率

D. A类是B类的友元类,B类是C类的友元类,所以A类也是C类的友元类

30、类模板的使用,实际上是将类模板实例化为一个(   )。 

A. 类    B.对象    C.函数     D. 数据 

31、在公有派生类的成员函数不能直接访问基类中继承来的某个成员,则该成员一定是基类中的(   )。

  A. 私有成员    B. 公有成员  C. 保护成员    D. 保护成员或私有成员

32、 在公有继承的情况下,基类的公有或保护成员在派生类中的访问权限( )。

  A. 受限制    B. 受保护    C. 保持不变    D. 不受保护

33、如果从原有类定义新类可以实现的是( )。

  A. 信息隐藏   B. 数据封装   C. 数据抽象    D. 继承机制

34、 C++类体系中,不能被派生类继承的有( )。

A. 常成员函数     B. 构造函数   

C. 虚函数         D. 静态成员函数

35、下面不能重载的运算符是(    )。 

A.  &&    B.  []    C. ::   D. new 

36、在复数类Complex中声明重载“+”运算符函数,用于二复数对象的求和运算,下面正确的声明是(   )。

A.  Complex operator+( Complex &c2);   

B.  double operator+( double &c2);    

C.  Complex double+( Complex c2);      

D.  operator double ( Complex &c2);   

37、以下基类中的成员函数表示纯虚函数的是()

A. void tt(int)=0           B. virtual void tt(int){} 

C. virtual void tt(int)       D. virtual void tt( )=0  

38、所谓多态性是指 ()

A. 不同的对象调用不同名称的函数    

B. 不同的对象调用相同名称的函数

C. 一个对象调用不同名称的函数       

D. 一个对象调用不同名称的对象

39、类B是类A的公有派生类,类A和类B中都定义了虚函数func(),p是一个指向类A对象的指针 ,则p->A::func()将( )。

A. 既调用类A中函数,也调用类B中的函数         

B. 根据p所指对象类型确定调用类A中或类B中的函数func()  

C. 调用类B中的函数func()      

D. 调用类A中的函数func()

二、填空题

1.请写出“A小于B或小于C”的表达式为 (     )。

2、设"int a=3,b=4,c=5;",表达式"(a+b)>c&&b==c"的值是(     )。

3、判断变量char a中是大写字母字时,转为小写的语句是:(   )。

4、为变量int d赋一个-20≤d≤+20之间的随机整数的语句是:(   )。

5.在C++中,函数的参数有两种传递方式,它们是值传递和 (    )。

6、已有函数声明int fun(float,char);,把它声明成内置(内联)函数的语句是:(    )。

7、在 C++中定义重载函数时,应至少使重载函数的参数个数或参数类型 (   )。

8、举出C++中两种用户自定义的数据类型:(   )。

9.面向对象的程序设计有四大特征,它们是(  ) 。

10、用户声明类时,未定义任何构造函数,系统会自动产生一个(    )。

11. 用类定义一个新对象时,系统总是要匹配一个合适的(    )并调用它去初始化对象,若没有合适的,应用程序会产生一个编译错误。

12、用户声明的类中不可缺少的成员函数是(   )和(  )。

13 若用户在类声明中已定义了构造函数,系统(    )自动产生一个默认构造函数。

14、构造函数与析构函数在定义形式上,它们的区别包括构造函数名与类名相同,而析构函数名是在类名前加一个~、(   )。

15.静态数据成员只能在(    )进行初始化,未初始化的静态数据成员,系统会自动赋予初值0;静态数据成员不属于(  ),而属于(    )。

16、类的常数据成员只能通过(   )进行初始化。

17.声明成员函数void get_time()为常成员函数的声明语句是:(    ),常成员函数只能引用而不能能修改本类中的数据成员。

18、单目运算符作为类成员函数重载时,形参个数为(   )个。

19、在C++类中,const关键字可以修饰对象和成员函数,const对象不能(    ),const成员函数不能(    )。

20、 基类的公有成员在派生类中的访问权限由(    )决定。

21、 C++中有两种继承:单继承和(   )。虚基类的作用是(   )。

22、一个抽象类的派生类可以实例化的必要条件是所有的(  )。

 

三、程序分析题

1、给出下面程序输出结果,程序的功能是?

#include < iostream >

using namespace std;

int main ( )

{   const int n=10;

    int  i,f[n]={12,-61,125,33,268,-107,29,0,41,-80};

    int max=f[0],min=f[0];

       for (i=0; i<n; i++)

       {   if(f[i] > max)   max = f[i];

              if(f[i] < min)   min = f[i];

        }

       cout<<"max="<<max<<",min="<<min<<endl;

    return 0;

}

 

2、给出下面程序输出结果。

#include <iostream>

using namespace std;

class Base 

{ public: 

     Base(int s=0) : y(s){  cout<<"Base("<<y<<”)”<<endl; } 

     ~Base() {cout<<"~Base()"<<endl;} 

     void print() {cout <<y<< ",";} 

protected: 

int y; 

}; 

class Derived: public Base 

{ public: 

     Derived (int a, int b): Base(a) { z=b; 

 cout<<"Derived("<< y <<","<<z <<”)”<<endl;  } 

     ~Derived( ) {cout<<"~Derived()"<<endl;} 

      void print() { Base:: print(); 

          cout<< z <<endl;  } 

private: 

     int z;

}; 

int  main( ) 

{  Derived d(10,20); 

   d.print(); 

   return 0;

 

3.给出下面程序输出结果。

#include < iostream >

using namespace std;

int main()

{     int a[5][5];

       int i,j;

       for(i=0;i<5;i++)

       {     a[i][0]=1;

              a[i][i]=1;

       }

       for(i=2;i<5;i++)

              for(j=1;j<i;j++)          

                     a[i][j]=a[i-1][j]+a[i-1][j-1];

 

       for(i=0;i<5;i++)

       {     for(j=0;j<=i;j++)

                     cout<<a[i][j]<<'\t';

              cout<<endl;

       }

       return 0;

}

 

4、给出下面程序输出结果。

#include<iostream>

using namespace std;

class A

{public:

       virtual void print(){ cout<< "A 打印程序..."<< endl; }  };

class B: public A

{ public:

       void show(){ cout<< "B 打印程序..."<< endl; }  };

class C: public B

{ public:

       void print(){ cout<<"C 打印程序..."<<endl; }  };

int main( )

{      A a, *p1, *p2, *p3;

B b;  C c;

p1=&a;  p2=&b;  p3=&c;

       p1-> print();

       p2-> print();

       p3-> print();

       b. show();

       return 0 ;

}

 

5、程序运行到断点所在行,写出程序的显示结果。

#include <iostream>

using namespace std;

class Cardgame

{   private:

        int players;

        static int total;

    public:

        Cardgame(int p);

        ~Cardgame(void);

};

Cardgame::Cardgame(int p)

{   players = p;

    total += p;

cout<<"  "<<p<<" 人加入游戏。现在共有 ";

cout<< total <<" 人参加。"<< endl;

}

 

Cardgame::~Cardgame(void)

{   total -= players;

    cout <<"  "<< players << " 人退出游戏。现在共有";

cout << total << " 人参加。" << endl;

 }

 

int Cardgame::total = 0;

int main()

{   Cardgame *bridge = new Cardgame(4);

    Cardgame *blackjack = new Cardgame(8);

    delete blackjack;

       Cardgame *poker = new Cardgame(5);

    return 0;   //断点所在行

}

 

五、程序设计

1.编程求矩阵a[10][10]两条对角线上的元素之和并输出结果。

2、定义一能用于返回三个参数中的最大值的函数模板getmax(),三个参数是同类型的,模板可适用于整形、单精、双精和字符参数。

3、定义能用于返回有n个元素数组中的最大值的函数模板getmax(Type x[],int n),模板中type可适用于整形数组、单精数组、双精数组和字符数组参数。

4、定义能用于返回三个参数的中间值的函数模板getmidd(),三个参数是同类型的,模板可适用于整形、单精、双精和字符参数。

5.利用函数模板设计,求一维数组a[]中元素和的函数,并检验之。

6、如下数组类模板:

template<typename T, int SIZE>

class array

{private:

       T arr[SIZE];

    int len; 

public:

       array( );

       array( T b[] );

       T& operator[]( int i ) { return arr[i];}

       T get_elem( int i ) const { return arr[i]; }

       void set_elem( int i,const T& value ) {  arr[i]=value;  }

};

请在类模板外定义有参构造函数模板array( T b[] ),用SIZE初始化数组长度len,用数组b[]元素初始化成员arr[]的元素。

7、设计一函数,能对有n个元素的整形数组a[]进行排序。

8、设计程序,把输入的一个华氏温度变换成摄氏温度输出,程序能在提示下重复运行,输出的温度只保留二位小数(要求用流控制符)。

9、程序设计,键盘输入a,程序求数a的平方根,用迭代式, ,结果输出显示。迭代进行到fabs(xn+1-xn)<10-5为止。

10、矩阵类Matrix 中定义了3×3整型数组int element[3][3]作为矩阵,重载运算符“<<”,用于输出Matrix类的对象。

class Matrix

{  public:

Matrix ( );

Matrix (int m[3][3]);

private:

int element[3][3];

};

11.设计一个点类Point,再设计一个矩形类,矩形类使用Point类的两个坐标点作为矩形的对角顶点。并可以输出4个坐标值和面积。使用测试程序验证程序。

12.声明复数的类Complex,使用成员函数add()实现复数加法。

class Complex

{     private:

              double real, image;

       public :

              Complex();

              Complex(double a,double b);

              void setRI(double a, double b) ;

double getReal() ;

double getImage();

void print();

Complex add(Complex);

};

13、复数类声明如下,请为复数类添加友元函数,将运算符“+”和“<<”重载为适用于复数对象加法和复数对象输出。

class Complex

{ public:

Complex( ){real=0;imag=0;}

Complex(double r,double i){real=r;imag=i;}

 

void display( );

 private:

double real;

double imag;

};

14、Solve类声明如下所示,功能是用于求方程a3x3+a2x2+a1x+a0=0的根,方程各系数ai可由构造函数或成员函数seta()设置,成员函数void half(float,float)使用二分法求方程在(x1,x2)之间根。成员函数void iteration(float)使用牛顿迭代法求方程在x0附近的根。

牛顿迭代法: 迭代式xn+1=xn-fn/fn’,其中fn=a3x3+a2x2+a1x+a0,f’是f在xn处的导数,迭代进行到|(xn+1-xn)}<10-5(或|f|<10-5)为止。

 

二分法:f(x)=a3x3+a2x2+a1x+a0,左界点x1,右界点x2,求f1(x1)和f2(x2),⑴若f1和f2同号(f1*f2>0),则无解;⑵否则,计算x1和x2的中点x0(=(x1+x2)/2),并求f0(x0);①若中点与左界点的f异号(f1*f0<0),则把中点当成右界点(x2=x0,f2=f0);②否则,把中点当成左界点(x1=x0,f1=f0);③判断当| f |<10-5为止,否则循环回⑵处继续计算。

请以类外定义方式:

①编写无参构造函数,功能:初始化各系数ai为1

②编写有参构造函数,功能:按参数初始化各系数ai

class Solve

{public:

       Solve();

       Solve(float aa3,float aa2=0,float aa1=0,float aa0=0);

       void half(float,float);

       void display(float,int);

    void seta(float aa3,float aa2=0,float aa1=0,float aa0=0)

       {a0=aa0,a1=aa1,a2=aa2,a3=aa3;}

       float getx(){ return x;}

private:

       float x,a0,a1,a2,a3;

};

15.定义一个Dog类,它用静态数据成员Dogs记录Dog的个体数目,静态成员函数GetDogs用来存取Dogs。设计并测试这个类,说明静态数据成员属于类而不属于对象。

16、已定义一个Shape抽象类, GetArea()是纯虚函数,(1)通过继承派生出矩形类 Rectangle,类 Rectangle含私有成员: float L,W;(矩形的长L和宽W);公有成员:①2参数构造函数,用于初始化L和W;②用GetArea()函数计算Rectangle对象的面积;③添加float GetPerim( )函数计算Rectangle对象的周长;请写出矩形类 Rectangle声明及成员定义。(2) 派生出圆柱Cyl类,圆柱类有新增私有成员半径和高(double r, h);公有成员有:①有参构造函数,做底圆半径r和高h的初始化,②定义 GetArea( )函数计算并返回圆柱表面积。请写出圆柱类Cyl声明及成员定义。 

 

#include<iostream>

using namespace std;

class Shape 

{ public: 

Shape(){} 

virtual ~Shape(){} 

virtual float GetArea()=0; 

} ;

17、用已声明的Shape抽象类,派生出圆形Circle类,圆形类有新增私有成员半径(double r);公有成员有:①有参构造函数做圆半径初始化,②定义 GetPerim( )函数计算并返回圆对象的周长,③新增成员函数GetArea( )计算并返回圆面积。再编写一测试主函数,定义半径为8.5的圆形Circle对象,分别输出显示对象的周长和面积。

#include <iostream>

using namespace std;

class Shape 

{ public: 

Shape(){} 

virtual ~Shape(){} 

virtual float GetPerim()=0; 

} ;

18.定义分数类Rational,private部分用整数表示分子和分母,分子和分母以化简形式表示,即2/6应该以1/3的形式表示,并实现如下功能:

(1) 两个分数对象可以用+和*做相加和相乘,结果表示为简化形式;

(2) 按a/b的形式输出分数的值,a、b为整数。

最后在main函数中对上述功能进行测试。

*工具1:m和n的最大公约数Maxdivisor(辗转算法):设m>n,⑴k=m%n,若k=0,则n为最大公约数;⑵否则,用n做被除数,k做除数,回⑴处循环继续。

*工具2:m和n的最小公倍数Minmultiple:Minmultiple×Maxdivisor=m×n,

Minmultiple=m×n/Maxdivisor

 

 

一、单项选择题

1A. 2B. 3 D. 4C. 5C. 6B. 7B. 8A. 9B. 10A. 11B. 12A. 13C. 14A. 15D. 16D. 17B.

18C. 19A. 20C. 21D. 22C.23B.24A. 25B. 26B. 27C. 28C. 29D. 30A.31A. 32C. 

33D. 34B. 35C. 36A. 37D. 38B. 39D.

二、填空题

1. (   A<B||A<C    )                2、(  0  )。

3、 (  if(a>=’A’&&a<=’Z’)  a+=32; )      4、 ( int d=rand()%41-20;  )

5. (  地址传递(包括引用)   )。    6、 (  inline int fun(float,char);  )

7、(    (至少有一个)不同        )     8、(  类、结构、枚举、联合)。

9.(  抽象、封装、继承、多态  )。

10、((无参数函数体为空的)默认构造函数  )。

11. ( 构造函数 )。

12、(  构造函数   ); (   析构函数    );

13 、( 不会再 )。

14、(  析构函数不能有参数 )

15.(  类外 ); (  对象 ), ( 类 )。

16、(  构造函数的参数初始化表 )

17.(  void get_time() const  )

18、(  0  )。

19、( 被修改  ); ( 修改类数据成员  );

20、(访问控制方式或继承方式)。

21、( 多继承 ) ;( (多继承时)避免(重复继承)产生二义性 )。

22、( 纯虚函数都要定义 )。

 

三、程序分析题

1、给出下面程序输出结果,程序的功能是?

1答: max=268,min=-107 功能是求一维数组中最大、最小元素。

 

2、给出下面程序输出结果。

2答案:

Base(10) 

Derived(10,20) 

10, 20 

~Derived() 

~Base() 

 

3.给出下面程序输出结果。

3答:输出杨辉三角。或画出图象。

 

4、给出下面程序输出结果。

4答案

A 打印程序...

A 打印程序...

C 打印程序...

B 打印程序...

 

5、程序运行到断点所在行,写出程序的显示结果。

5答案:

4人加入游戏。现在共有4人参加。

8人加入游戏。现在共有12人参加。

8人退出游戏。现在共有 4人参加。

5人加入游戏。现在共有9人参加。

 

五、程序设计

1.编程求矩阵a[10][10]两条对角线上的元素之和并输出结果。。

答案:

#include <iostream>

using namespace std;

int main()

{     int a[10][10];

       int i,j;

       for(i=0;i<10;i++)

         for(j=0;j<10;j++)  

a[i][j]=i+j;

       int sum = 0;

       for(i=0;i<10;i++)

       {     sum+=a[i][i];

              sum+=a[9-i][i];

       }

       cout<<sum;

       return 0;

}

 

2、定义一能用于返回三个参数中的最大值的函数模板getmax(),三个参数是同类型的,模板可适用于整形、单精、双精和字符参数。

答案:

template<class T>

T getmax(T a,T b,T c)

{  T temp;

   temp=a>b? a:b;

   return (temp>c? temp:c);

}

3、定义能用于返回有n个元素数组中的最大值的函数模板getmax(Type x[],int n),模板中type可适用于整形数组、单精数组、双精数组和字符数组参数。

答案

template<class Type >

 Type getmax(Type x[],int n)

{

  Type max=x[0] ;  

   int i;

   for(i=1;i<n;i++)

      if (max<x[i]) max=x[i];

   return max;

}

 

4、定义能用于返回三个参数的中间值的函数模板getmidd(),三个参数是同类型的,模板可适用于整形、单精、双精和字符参数。

答案:

template<class T>

   T getmidd(T a,T b,T c)

{   if((a>b && b>c)||(a<b && b<c)) return b;

if((b >a &&a>c)||( b < a &&a<c)) return a;

if((a>c&& c > b)||(a<c&& c < b)) return c;   }

 

5.利用函数模板设计,求一维数组a[]中元素和的函数,并检验之。

答案:

#include < iostream >

using namespace std;

template<class T>

T sum (T a[],int n)

{     int i;

       T s=0;

       for(i=0;i< n;i++)

              s = s + a[i];

       return s;

}

int main ()

{     int a[5]={1,2,3,4,5};

       int s = sum(a,5);

       cout<< s<< endl;

   return 0;

}

 

6、如下数组类模板:

template<typename T, int SIZE>

class array

{private:

       T arr[SIZE];

    int len; 

public:

       array( );

       array( T b[] );

       T& operator[]( int i ) { return arr[i];}

       T get_elem( int i ) const { return arr[i]; }

       void set_elem( int i,const T& value ) {  arr[i]=value;  }

};

请在类模板外定义有参构造函数模板array( T b[] ),用SIZE初始化数组长度len,用数组b[]元素初始化成员arr[]的元素。

 

答案:

template<typename T,int SIZE> 

array1<T,SIZE>::array(T b[]):len(SIZE)

{      for(i=0;i<len;i++) arr[i]=b[i];

}

 

7、设计一函数,能对有n个元素的整形数组a[]进行排序。

答案:

void sortn(int a[],int n)

{      int min,i,j,temp;

       for (i=1;i<n;i++)

              {     min=i;  

                     for (j=i+1;j<=n;j++)

if(a[min]>a[j]) min=j; 

 temp=a[i]; 

a[i]=a[min]; 

a[min]=temp; 

              }

}

8、设计程序,把输入的一个华氏温度变换成摄氏温度输出,程序能在提示下重复运行,输出的温度只保留二位小数(要求用流控制符)。

答案:

#include <iostream>

#include  <iomanip>

using namespace std;

float ConvertT(float TempF){return ((TempF-32.0)*5/9);}

int main()

{  float tf,tc;

   char y='y';

  do { cout<<endl<<" 请输入华氏温度:";

       cin>>tf;

       cout<<endl;

    tc= ConvertT(tf);  

       cout<<" 摄氏温度为:";

cout<< setioflags(ios::fixed)<<setprecision(2) <<tc<<endl<<endl;

       cout<<" 继续变换华氏温度到摄氏温度吗(y/n)?";

       cin>>y;

       cout<<endl;

     }while (y==’Y’||y==’y’);

return 0;

}

9、程序设计,键盘输入a,程序求数a的平方根,用迭代式, ,结果输出显示。迭代进行到fabs(xn+1-xn)<10-5为止。

答案:

#include <iostream>

#include<cmath>

using namespace std;

int main ()

{     double x1,x2,p=0,a;

       cout<<"请输入a的值:";

       cin>>a;

       if (a<0)

       {     cout<<"a的值应当是正值,请重新输入a的值:";

              cin>>a;

       }

    x1=a/2;

       do

       {   x2=(x1+a/x1)/2 ;

 p=x1;  

x1=x2;  

 x2=p;

       } while( fabs(x2-x1) >1e-5 );

       cout<<"a的平方根为:"<<x1<<endl;

       return 0;

}

10、矩阵类Matrix 中定义了3×3整型数组int element[3][3]作为矩阵,重载运算符“<<”,用于输出Matrix类的对象。

class Matrix

{  public:

Matrix ( );

Matrix (int m[3][3]);

private:

int element[3][3];

};

答案:

class Matrix

{  public:

Matrix ( );

Matrix (int m[3][3]);

friend ostream& operator<<( ostream&, Matrix &);

private:

int element[3][3];

};

 

ostream& operator<<( ostream &output, Matrix &m)

{

   for(int i=0;i<3;i++)

      {  for(int j=0;j<3;j++)

            output<<m.element[i][j]<<’\t’;

         output<<endl;

       }

    return output;

}

11.设计一个点类Point,再设计一个矩形类,矩形类使用Point类的两个坐标点作为矩形的对角顶点。并可以输出4个坐标值和面积。使用测试程序验证程序。

答案:

#include < iostream >

using namespace std;

class Point    //点类

{private:

       int x, y;  //私有成员变量,坐标

 public :

       Point()  {     x = 0;     y = 0;     }

       Point(int a, int b) {     x = a; y = b;  }

       void setXY(int a, int b){   x = a; y = b;  }

       int getX(){   return x;      }

       int getY(){   return y;      }

};

class Rectangle   //矩形类

{private:

       Point point1, point2, point3, point4;

 public :

       Rectangle();

       Rectangle(Point one, Point two)

       {     point1 = one;

              point4 = two;

              init();

       }

       Rectangle(int x1, int y1, int x2, int y2)

       {     point1.setXY(x1, y1);

              point4.setXY(x2, y2);

              init();

       }

       void init()  //给另外两个点做初始化的函数

       {     point2.setXY(point4.getX(), point1.getY() );

              point3.setXY(point1.getX(), point4.getY() );

       }

       void printPoint()  //打印四个点的函数

       {

              cout<<"A:("<< point1.getX() <<","<< point1.getY() <<")"<< endl;

              cout<<"B:("<< point2.getX() <<","<< point2.getY() <<")"<< endl;

              cout<<"C:("<< point3.getX() <<","<< point3.getY() <<")"<< endl;

              cout<<"D:("<< point4.getX() <<","<< point4.getY() <<")"<< endl;

       }

       int getArea()//计算面积的函数

       {

              int height, width, area;

              height = point1.getY() - point3.getY();

              width = point1.getX() - point2.getX();

              area = height * width;

              if(area >=0)  return area;

              else  return -area;

        }

};

int main() 

{     Point p1(-15, 56), p2(89, -10);  //定义两个点

       Rectangle r1(p1, p2) ; //用两个点做参数,声明一个矩形对象r1

       Rectangle r2(1, 5, 5, 1);//用两队左边,声明一个矩形对象r2

       cout<<"矩形r1的4个定点坐标:"<< endl;

       r1.printPoint();

       cout<<"矩形r1的面积:"<< r1.getArea() << endl;

       cout<<"\n矩形r2的4个定点坐标:"<< endl;

       r2.printPoint();

       cout<<"矩形r2的面积:"<< r2.getArea() << endl;

    return 0;

}

12.声明复数的类Complex,使用成员函数add()实现复数加法。

class Complex

{     private:

              double real, image;

       public :

              Complex();

              Complex(double a,double b);

              void setRI(double a, double b) ;

double getReal() ;

double getImage();

void print();

Complex add(Complex);

};

答案:

#include < iostream >

using namespace std;

class Complex

{     private:

              double real, image;

       public :

              Complex(){real=0;  image=0; }

              Complex(double a,double b){ real = a; image = b;    }

              void setRI(double a, double b) { real = a; image = b; }

double getReal() {  return real;     }

double getImage(){   return image; }

void print(){

       cout<<"复数:("<< real <<" , "<< image <<"i )"<< endl;

                     }

Complex add(Complex);  //声明成员函数

};

 

Complex Complex::add( Complex c2)  //定义成员函数

{  Complex c;

c.real = real + c2.real; 

c.image = image + c2.image;

       return c;

}

int  main()

{     Complex c1(19, 0.864), c2, c3;

       c2.setRI(90,-125.012);

       c3 = c1.add( c2);

       cout<<"复数一:";c1.print();

       cout<<"复数二:";c2.print();

       cout<<"相加后:";c3.print();

   return 0;

}

13、复数类声明如下,请为复数类添加友元函数,将运算符“+”和“<<”重载为适用于复数对象加法和复数对象输出。

class Complex

{ public:

Complex( ){real=0;imag=0;}

Complex(double r,double i){real=r;imag=i;}

 

void display( );

 private:

double real;

double imag;

};

答案:

class Complex

{ public:

Complex( ){real=0;imag=0;}

Complex(double r,double i){real=r;imag=i;}

       friend Complex operator+( Complex &, Complex &); 

       friend ostream& operator<<( ostream &, Complex &);

void display( );

 private:

double real;

double imag;

};

 

Complex operator+( Complex &c1, Complex &c2) 

{

    Complex temp;

    temp.real=c1.real+c2.real;

temp.imag=c1.imag+c2.imag;

    return temp;

}

ostream& operator<<( ostream &out, Complex &c)

{   out<<”(”<<c.real<<”,”<<c.imag<<”i )”;   }

 

 

14、Solve类声明如下所示,功能是用于求方程a3x3+a2x2+a1x+a0=0的根,方程各系数ai可由构造函数或成员函数seta()设置,成员函数void half(float,float)使用二分法求方程在(x1,x2)之间根。成员函数void iteration(float)使用牛顿迭代法求方程在x0附近的根。

牛顿迭代法: 迭代式xn+1=xn-fn/fn’,其中fn=a3x3+a2x2+a1x+a0,f’是f在xn处的导数,迭代进行到|(xn+1-xn)}<10-5(或|f|<10-5)为止。

 

二分法:f(x)=a3x3+a2x2+a1x+a0,左界点x1,右界点x2,求f1(x1)和f2(x2),⑴若f1和f2同号(f1*f2>0),则无解;⑵否则,计算x1和x2的中点x0(=(x1+x2)/2),并求f0(x0);①若中点与左界点的f异号(f1*f0<0),则把中点当成右界点(x2=x0,f2=f0);②否则,把中点当成左界点(x1=x0,f1=f0);③判断当| f |<10-5为止,否则循环回⑵处继续计算。

请以类外定义方式:

①编写无参构造函数,功能:初始化各系数ai为1

②编写有参构造函数,功能:按参数初始化各系数ai

class Solve

{public:

       Solve();

       Solve(float aa3,float aa2=0,float aa1=0,float aa0=0);

       void half(float,float);

       void display(float,int);

    void seta(float aa3,float aa2=0,float aa1=0,float aa0=0)

       {a0=aa0,a1=aa1,a2=aa2,a3=aa3;}

       float getx(){ return x;}

private:

       float x,a0,a1,a2,a3;

};

答案:

①Solve::Solve(){a0=1;a1=a0;a2=a0;a3=a0;}

②Solve::Solve(float aa3,float aa2=0,float aa1=0,float aa0=0)

{a3=aa3;a2=aa2;a1=aa1;a0=aa0;}

 

15.定义一个Dog类,它用静态数据成员Dogs记录Dog的个体数目,静态成员函数GetDogs用来存取Dogs。设计并测试这个类,说明静态数据成员属于类而不属于对象。

答案:

#include < iostream >

using namespace std;

class Dog

{private:

       static int dogs;   //静态数据成员,记录Dog的个体数目

public :

       Dog(){}

       void setDogs(int a)     { dogs = a;    }

       static int getDogs(){ return dogs;   }

};

int Dog::dogs = 25;  //演示静态数据成员初始化值

int  main()

{     cout<<"未定义Dog类对象之前:x = "<< Dog::getDogs() << endl;

//dogs静态数据成员在产生对象之前即存在,输出

       Dog a, b;

       cout<<"a中x:"<< a.getDogs() << endl;

       cout<<"b中x:"<< b.getDogs() << endl;

       a.setDogs(360);

       cout<<"给对象a中的x设置值后:"<< endl;

       cout<<"a中x:"<< a.getDogs() << endl;

       cout<<"b中x:"<< b.getDogs() << endl;

       return 0;

}

程序可以说明静态成员属于类:main中第一句未定义Dog类对象之前dogs就可以使用并输出说明其静态特性,用类名域Dog::getDogs()调用成员函数说明静态成员属于类;第五句虽通过对象a设置值为360,其后通过a和b对象输出的dogs值全是360,说明dogs并不是a的,而是a和b的公共的,即静态成员属于类。

 

16、已定义一个Shape抽象类, GetArea()是纯虚函数,(1)通过继承派生出矩形类 Rectangle,类 Rectangle含私有成员: float L,W;(矩形的长L和宽W);公有成员:①2参数构造函数,用于初始化L和W;②用GetArea()函数计算Rectangle对象的面积;③添加float GetPerim( )函数计算Rectangle对象的周长;请写出矩形类 Rectangle声明及成员定义。(2) 派生出圆柱Cyl类,圆柱类有新增私有成员半径和高(double r, h);公有成员有:①有参构造函数,做底圆半径r和高h的初始化,②定义 GetArea( )函数计算并返回圆柱表面积。请写出圆柱类Cyl声明及成员定义。 

#include<iostream>

using namespace std;

class Shape 

{ public: 

Shape(){} 

virtual ~Shape(){} 

virtual float GetArea()=0; 

} ;

(1)答案

class Rectangle: public Shape

{

public:

       Rectangle(float a,float b):L(a),W(b){}

       ~Rectangle(){}

       float  GetArea(){return (L*W);}

       float GetPerim(){return (L+W)*2;}

private:

       float L,W;

};

(2)答案:

class Cyl: public Shape

{public:

    Cyl(float r0,float h0):r(r0),h(h0){}

    ~Cyl(){}

    float  GetArea(){return (2*r*r*3.14f+2*3.14f*r*h);}

private:

    float r,h;

};

17、用已声明的Shape抽象类,派生出圆形Circle类,圆形类有新增私有成员半径(double r);公有成员有:①有参构造函数做圆半径初始化,②定义 GetPerim( )函数计算并返回圆对象的周长,③新增成员函数GetArea( )计算并返回圆面积。再编写一测试主函数,定义半径为8.5的圆形Circle对象,分别输出显示对象的周长和面积。

#include <iostream>

using namespace std;

class Shape 

{ public: 

Shape(){} 

virtual ~Shape(){} 

virtual float GetPerim()=0; 

} ;

答案:

class Circle:public Shape  

{  public: 

Circle(float r0):r(r0){} 

float GetPerim(){return 3.14*2*r;} 

float GetArea(){return 3.14*r*r;} 

private: 

float r; 

}; 

int main() 

{  Circle c1(8.5);; 

cout<<c1.GetPerim ()<<endl; 

cout<<c1.GetArea()<<endl; 

return 0;

}

18.定义分数类Rational,private部分用整数表示分子和分母,分子和分母以化简形式表示,即2/6应该以1/3的形式表示,并实现如下功能:

(1) 两个分数对象可以用+和*做相加和相乘,结果表示为简化形式;

(2) 按a/b的形式输出分数的值,a、b为整数。

最后在main函数中对上述功能进行测试。

*工具1:m和n的最大公约数Maxdivisor(辗转算法):设m>n,⑴k=m%n,若k=0,则n为最大公约数;⑵否则,用n做被除数,k做除数,回⑴处循环继续。

*工具2:m和n的最小公倍数Minmultiple:Minmultiple×Maxdivisor=m×n,

Minmultiple=m×n/Maxdivisor

答:

(1)类的私有成员有:

①分子:int up;

②分母:int down;

③最小公倍数int Minmultiple(int a,int b); 

④最大公约数int Maxdivisor(int a,int b); 

(2)公有成员:

     ①构造函数(有参,无参):Rational( );

              ②转换构造函数:Rational(double a); 由实数转分数

              ③类型转换函数:operator double();由分数转实数

              ④分子与分母值更改函数:void setval();通过键盘输入方式完成

⑤分数显示函数:void Rational::showNomal() ;以分式方式显示分数

⑥重载运算符“+”、“*”和“<<”,实现2分数类对象的相加和相乘运算,结果以化简分式显示。

最后在main函数中对上述功能进行测试。

#include <iostream>

using namespace std;

class Rational

{    public:

              Rational(int num1=1,int num2=1);

              Rational(double a);

              void setval();

              void showNomal();

              Rational operator*(Rational r1);

              friend ostream& operator<<(ostream &out,const Rational &r);

              friend Rational operator+(Rational r1,Rational r2);

              operator double()

              {     double a=double(up)/down;

                     return a;

              }

       private:

              int up;        //分子

              int down;      //分母

              int Minmultiple(int a,int b);  //最小公倍数

              int Maxdivisor(int a,int b);   //最大公约数

       };

Rational::Rational(int num1,int num2)

{    up=num1;

       down=(num2==0)?1:num2;

       int i;

       i=Maxdivisor(up,down);

       up=up/i;

       down=down/i;

       }

Rational::Rational(double a){ //添加代码实现实数转分数...... }

 

void Rational::setval()

{    cout<<"输入分数的分子:";

       cin>>up;

       cout<<"输入分数的分母:";

       cin>>down;

       cout<<"输入的分数是:"<<up<<"/"<<down<<endl;

}

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

{    int temp;

       int remainder;

       if(a<b)   { temp=a; a=b; b=temp;   }

       remainder=a%b;

       while(remainder!=0)

              {     a=b;

                     b=remainder;

                     remainder=a%b;

              }

       return b;

}

int Rational::Minmultiple(int x,int y)

{    return x*y/Maxdivisor(x,y);

 }

Rational Rational::operator*(Rational r1)

{    int Ndown,Nup,i;

       Ndown=down*r1.down;

       Nup=up*r1.up;

       i=Maxdivisor(Nup,Ndown);

       return Rational(Nup/i,Ndown/i);

       }

 

void Rational::showNomal()

{    cout<<up<<"/"<<down<<endl;     }

 

ostream& operator<<(ostream &out,const Rational &r)

{     out<<r.up<<"/"<<r.down;

       return out;    }

 

Rational operator+(Rational r1,const Rational r2)

{

       int Ndown,Nup,i;

       Ndown=r1.down*r2.down;

       Nup=r1.up*r2.down+r2.up*r1.down;

       i=r1.Maxdivisor(Nup,Ndown);

       Ndown/=i; Nup/=i;

       Rational r(Nup,Ndown);

       return r;

}

int main()

{    Rational r1(4,14), r2(5,8), r3, r4;

       cout<<"The r1 is: ";

       r1.showNomal();

       cout<<"The r2 is: ";

       r2.showNomal();

       r3=r1*r2;

       cout<<"The r1*r2 is: "<<r3<<endl;

       r4=r1+r2;

       cout<<"The r1+r2 is: "<<r4<<endl;

       r1.setval();

       r2.setval();

       r4=r1+r2;

       cout<<"The r1+r2 is: "<<r4<<endl;

       double a;

       cout<<"输入一个实数";

       cin>>a;

       r4=r1+Rational(a);    //调用转换构造函数和+重载函数,显式类型转换

    cout<<"The r1 is: "<<r1<<endl;

       cout<<"The r1+"<<a<<" is: "<<r4;

       a=r4;                 //隐含调用类型转换函数

       cout<<" = "<<a<<endl;

       return 0;

       }

 

 

 

 

 


吐血推荐

奥鹏,国开形考,广开,电大在线,各省平台,新疆一体化,各类成人教育等学习。详情请咨询QQ : 103092222或微信: xyzlfx100

添加微信查看答案

福建师范大学《C++语言程序设计》期末复习题_学优资料分享网

添加微信二维码,了解更多学习技巧,平 台作业、毕业论文完成时间友情提醒。。

合作洽谈

诚信为本,合作共赢

欢迎各大学习中心前来治谈;有意请联系我们

推荐作业

留言板
captcha
感谢留言
我们会尽快与您联系
关闭