福师C++语言程序设计复习题

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2024-02-20 12:03

练习题2019.6 一、单项选择题 1. 关于预处理命令#includeiostream作用的描述中,错误的是( )。 A. 命令提供C++程序的结构框架 B. 程序编译时先处理#include等预处理命令 C. 文件iostream向程序提
练习题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;
       }
 
 
 
 
 

Tag:  

作业咨询:
点击这里给我发消息

论文咨询:
点击这里给我发消息

合作加盟:
点击这里给我发消息

服务时间:
8:30-24:00(工作日)