《C++语言程序设计》部分习题解答

来源:互联网 发布:软件过程成熟度 编辑:程序博客网 时间:2024/05/16 03:24

应导师要求,这几天把《C++语言程序设计》中自己编写的那几个部分的PPT以及课后习题给完成了下。题都不难,本科生学的,但是有些程序题还是有些意思。时间所限,贴出一部分习题及解答如下。 

判断下面程序段哪些语句正确, 哪些不正确,如有错误请更正。
#include  "iostream.h"
class CShape
{
       protected:
            double a;
           public:
                  virtual void show();
            CShape(double x){ a=x; }
           };
class CSquare : public CShape
           public:
            CSquare(double x):CShape(x){}
                  void show()
{ cout<<"The Area of class CSquare. object /n"<<x*x<<endl; }
           };
        void main()
{
                  CShape objl, obj2, *ptrl;
                  CSquare obj3,obj4(10),*ptr2;
                  ptrl=&obj1;
                  ptrl->show();
                  ptrl=&obj3;
                  ptrl->show();
                  ptr2=&obj4;
                  ptr2->show();
                  ptr2=&obj2;
                  ptr2->show();
            }  
解答:
 ①CShape表示的形状类,是一个抽象的概念,因此要把它定义成抽象类。:“virtual void show();”应改成使用纯虚拟函数,即“virtual void show()=0;“;
②CSquare类中“cout<<"The Area of class CSquare. object /n"<<x*x<<endl;  }” 应该改为“cout<<"The Area of class CSquare. object /n"<<a*a<<endl;  }”;
③“CShape objl, obj2, *ptrl;”中定义抽象的对象是不正确的,应改为“CShape *ptrl;”,因为定义指向抽象基类的指针是可以的。相应的主函数中“ptrl=&obj1;ptrl->show();”以及“ptrl=&obj2;ptrl->show();”语句也应当删除;
④“CSquare obj3,obj4(10),*ptr2;”语句中使用“CSquare obj3”来定义对象是不正确的,程序中并未提供默认构造函数的实现。原因是程序中已经重载了构造函数,因此要用默认构造函数来初始化对象必须在程序中提供默认构造函数的实现

 分析下列程序,并给出下面程序的运行结果:
 #include "iostream.h"
#include "stdio.h"
class CPerson
{
public:
 CPerson(char *pName= "", int m_Age=0);
  ~ CPerson() {  cout<< "我归天哪。/n";  }
 virtual void ProduceString();
 void DisplayInfo();
protected:
  int Age;
char Info[128], Name [18];
};
CPerson:: CPerson (char*pName, int m_Age)
{     sprintf(Name, "%s", pName);   Age=m_Age;
     cout<< "我是上帝派到人间的人! /n";
 }
void CPerson::ProduceString()
{   sprintf(Info,"天之子:%s ,%d 岁", Name,Age);   }
void CPerson::DisplayInfo()
{     ProduceString();    cout<< Info <<endl; }

class CModernPerson:public CPerson
{
public:
 CModernPerson (char*pName= "", int m_Age=0) ;
  ~ CModernPerson( ) {  cout<< "我完啦!好还是不好?/n"; }
 virtual void ProduceString();
};
CModernPerson:: CModernPerson (char* pName, int m_Age)
{     sprintf(Name, "%s", pName);   Age=m_Age;
     cout<< "我是现代人,享受人间快乐!/n";
 }
void CModernPerson::ProduceString()
{     sprintf(Info,"龙之子:%s,%d岁 ",Name,Age);       }
void main(void)
{
     CPerson  YaDang("亚当", 1),  *pObj ;
    CModernPerson   Zhang( "张三", 20);
     pObj=&YaDang;   pObj->DisplayInfo();
    pObj=&Zhang;    pObj->DisplayInfo();
}
解答:
我是上帝派到人间的人!↙
我是上帝派到人间的人!↙
我是现代人,享受人间快乐!↙
天之子:亚当 ,1 岁↙
龙之子:张三,20岁↙
我完啦!好还是不好?↙
我归天哪。↙
我归天哪。↙

综合填空题, 阅读下列程序及其运算结果,填空使得下列程序成为一个完整的程序。
#include "iostream.h"
#include "math.h"
  class  CPoint
  {
  public:
    CPoint(  【1】                            )
{     
【2】                            
}
void SetPos(int  x0,  int  y0)
{      
【3】                          
}
    void  DisplayPoint( );
    【4】                            ;
  private:
    int  x,  y;
  };
  void  CPoint::DisplayPoint()
  {
     【5】                          
  }
  double  Distance(CPoint &a, CPoint &b)
  {
      double dx=a.x-b.x;
      double dy=a.y-b.y;
      【6】                         ;
  }
  void main(void)
  {
       CPoint  p1( 6.0, 8.0) ;
         【7】                  p2 ;
         【8】                   . SetPos( 6,  -1 ) ;
       p1. DisplayPoint ( );
       p2. DisplayPoint ( );
       double   d  ;
【9】                          ;
       cout<<【10】                          << d << endl;
}
运行结果:
        (6,   8)↙
        (6,  -1)↙
         Distance is 9↙
解答:
【1】double x1=0.0,double y1=0.0
【2】x=(int)x1;
y=(int)y1;
【3】x=x0;
y=y0;
【4】friend double Distance(CPoint &a, CPoint &b);
【5】cout<<"("<<x<<", "<<y<<")"<<endl;
【6】return(sqrt(dx*dx+dy*dy));
【7】CPoint
【8】p2
【9】d=Distance(p1,p2);
【10】"Distance is "

请重载运算符(),将以下的二维数组的表示方法:
     chessBoard[ row ][ column ]
 改为下面的表示方法:
     chessboard(  row,column  )
 解答:
 #include<iostream>
using namespace std;
class String
{private:
 int length;
 char *sPtr;
  public:
   String &operator()(int row,int column);
};
String &String::operator ()(int row,int column)
{
 String *subPtr=new String;
 subPtr->sPtr=new char[row*column];
 return *subPtr;
}
void main(void)
{
 String chessBorad;
String t=chessBoard(1,2);
}

建立一个分数类 CRationalNumber,使之具有下述功能:
a) 建立一个构造函数,能防止分母为0;当分数不是最简形式时进行约分避免分母为负数。
b)重载加法、减法、乘法以及除法运算符。
c)重载关系运算符和相等运算符。
解答:
#include<iostream>
using namespace std;

class CRationalNumber
{
private:
 int above; //分子
 int below; //分母
public:
 void ToSimp(CRationalNumber& x);
 CRationalNumber(int x,int y);
 CRationalNumber operator+(CRationalNumber a);
 CRationalNumber operator-(CRationalNumber a);
 CRationalNumber operator*(CRationalNumber a);
 CRationalNumber operator/(CRationalNumber a);
 bool operator>(CRationalNumber a);
 bool operator<(CRationalNumber a);
 bool operator==(CRationalNumber a);
 void Disp();
};

void CRationalNumber::ToSimp(CRationalNumber& x)
{ //把x化为最简分数
//求x的分子和分母的最大公约数
int m,n,r;
m=x.above;n=x.below;
r=m%n;
while(r!=0)
{ //循环结束值就是x分子分母的最倒公约数
m=n;n=r;
r=m%n;
}
//化简x,使分子分母缩小n倍
if(n!=1)
{
x.above/=n;
x.below/=n;
}
//若分母为负则让分子分母同时取负后使分子分母转换为正值
if(x.below<0)
{
x.above=-x.above;
x.below=-x.below;
}
}
CRationalNumber::CRationalNumber(int x=0,int y=0)
{  if(y!=0)
  {
 if(y<0){x=-x;y=-y;}
 above=x;
 below=y;
  }
}
CRationalNumber CRationalNumber::operator+(CRationalNumber a)
{
CRationalNumber c; //定义临时变量c,用于保存求和结果
c.above=above*a.below+below*a.above ;//计算结构分数的分子
c.below=below*a.below; //计算结果分数的分母
ToSimp(c); //化简分数
return c;
}
CRationalNumber CRationalNumber::operator-(CRationalNumber a)
{
CRationalNumber c; //定义临时变量c,用于保存求和结果
c.above=above*a.below-below*a.above; //计算结构分数的分子
c.below=below*a.below; //计算结果分数的分母
ToSimp(c); //化简分数
return c;
}
CRationalNumber CRationalNumber::operator*(CRationalNumber a)
{
CRationalNumber c; //定义临时变量c,用于保存求和结果
c.above=above*a.above; //计算结构分数的分子
c.below=below*a.below; //计算结果分数的分母
ToSimp(c); //化简分数
return c;
}
CRationalNumber CRationalNumber::operator/(CRationalNumber a)
{
CRationalNumber c; //定义临时变量c,用于保存求和结果
c.above=above*a.below; //计算结构分数的分子
c.below=below*a.above; //计算结果分数的分母
ToSimp(c); //化简分数
return c;
}
bool CRationalNumber::operator>(CRationalNumber a)
{
CRationalNumber c; //定义临时变量c,用于保存求和结果
c.above=above*a.below-below*a.above; //计算结构分数的分子
c.below=below*a.below; //计算结果分数的分母
if((c.above>0)^(c.below>0)) return false;
 
}
bool CRationalNumber::operator<(CRationalNumber a)
{
CRationalNumber c; //定义临时变量c,用于保存求和结果
c.above=above*a.below-below*a.above; //计算结构分数的分子
c.below=below*a.below; //计算结果分数的分母
if((c.above>0)^(c.below>0)) return true;
}
bool CRationalNumber::operator==(CRationalNumber a)
{
CRationalNumber c; //定义临时变量c,用于保存求和结果
c.above=above*a.below-below*a.above; //计算结构分数的分子
c.below=below*a.below; //计算结果分数的分母
if(c.above==0) return true;
}
void CRationalNumber::Disp()
{
 cout<<above<<"/"<<below<<endl;
}
void main()
{
CRationalNumber a(3,4),b(3,5);
(a+b).Disp();
(a-b).Disp();
(a*b).Disp();
(a/b).Disp();
if(a>b){cout<<"a>b"<<endl;}
else if(a==b){cout<<"a=b"<<endl;}
else {cout<<"a<b"<<endl;}
cin.get();
}