2006
05-29

二、填空题


1.程序文件的编译错误分为__________和__________两类.


2.字符串类型的变量一般用__________和__________类型的变量表示.


3.空字符串的长度是__________.


4.一个指针类型的对象占用内存的__________个字节的存储空间.


5.假设p是一个指针,则a=*p++运算首先__________,然后__________.


6.若指针p所指向的对象的值为10,p+1所指向的对象的值为20,则*++p的值为__________.


7.除了在__________和__________的情况下,定义引用变量必须初始化.


8.下列程序计算由0到9之间的任意3个不相同的数字组成的三位数共有多少种不同的组合方式.请完成下列程序.


#include<iostream.h>


void main()


{


       int i,j,k,count=0;


       for(i=9;i>=1;i–)


               for(j=9;j>=0;j–)


                      if(______) continue;


                      else


                               for(k=0;k<=9;k++)


                                      if(_______) count++;


       cout<<count<<endl;


}


9.在C++中, __________函数不需要使用相应的函数原型语句加以声明.


10.函数的调用方式分为两种: __________调用和__________调用.其中, __________调用又根据C++中变量值的不同分为:传递变量本身的调用和__________的__________调用.


11.具有相同函数名但具有不同参数表的函数称为__________.


12.假定一个函数的参数说明为int x[][N](N是常数),则等价的指针参数说明为__________..


13.执行完下列三条语句后,指针变量c指向__________.


int a,b,*c=&a;        int *&p=c;                p=&b;


14.下面的函数Fun未使用中间变量实现了对两个数的交换,请完成下列函数的定义.


void Fun(int &x,int &y)   {       x+=y;       y= _______;                ________;}


15.在C语言中,编程单位是__________,在C++中,编程的单位是__________.


16.类的具体表现是通过定义__________来操作的.


17.一般情况下,按照面向对象的要求,把类中的数据成员(属性)定义为__________权限,而把成员函数(方法)定义为__________权限.


18.在结构定义中,数据和成员函数默认权限是__________.在类定义中,数据和成员函数默认权限是__________..


19.类中构造函数有__________个,析构函数有__________个.


20.要把类FriendClass定义为类MyClass的友元类,则应在类MyClass的定义中加入语句__________.


21.在C++语言中,每个类都有一个隐含的指针叫_____指针.该指针指向_____.


22.重载运算符函数的函数名有关键字_____引出.


23.利用成员函数对二元运算符重载,其左操作数为_____,右操作数为_____.


24.派生类对基类的继承有三种方式: _____. _____. _____.


25.构造函数_____被继承,析构函数_____被继承.


26.对于派生类的构造函数,在定义对象时构造函数的执行顺序为:先执行_____,再执行_____,最后执行_____.


27.对基类数据成员的初始化必须在派生类构造函数中的_____处执行.


28.当撤销一个含有基类和子对象成员的派生类对象时,将首先完成_____的析构函数定义体的执行,接着完成_____的析构函数定义体的执行,最后完成_____的析构函数定义体的执行.


29.动态联编中直到_____时才能确定调用哪个函数;而静态联编则是在_____时进行的.


30.对虚函数使用对象指针或引用调用,系统使用_____联编;使用对象调用时,系统使用_____联编.


31.C++中_____虚构造函数,但_____虚析构函数.


32.带有_____的类称为抽象类,它只能作为_____来使用.


33.抽象类不能_____,但可以_____作为参数类型,函数返回类型或显式转换类型.


34.如果一个模板声明列出多个参数,则多个参数之间必须使用_____隔开,每个参数都必须重复使用关键字_____.


35.函数模板既可以与_____重载,也可以与_____重载.


36.函数模板的友元函数可以是_____或_____.


 


 


三、阅读程序


1.写出下列程序的运行结果.


#include<iostream.h>


void main()


{


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


       p=a[0]+1;


       cout<<*p<<endl;


}


2.写出下列程序的运行结果.


#include<iostream.h>


void main()


{


       int x;


       int &p=x;


       x=10;


       p=x+10;


       cout<<x<<”,”<<p<<endl;


}


3.写出下列程序的运行结果


#include<iostream.h>


int a=100;


void fun()


{


       int a=0;


       a++;


       ::a=200;


       cout<<”The a of fun is”<<a<<endl;


       cout<<”::a=”<<::a<<endl;


}


void main()


{


       int a=10;


       fun();


       a++;


       ::a+=1;


       cout<<”The a of main is”<<a<<endl;


       cout<<”::a=”<<::a<<endl;


}


4.写出下列程序的运行结果.


#include<iostream.h>


int f(int a)


{


       return ++a;


}


int g(int &a)


{


       return ++a;


}


void main()


{


       int m=0,n=0;


       m+=f(g(m));


       n+=f(f(n));


       cout<<”m=”<<m<<endl;


       cout<<”n=”<<n<<endl;


}


5.写出下列程序的运行结果.


#include<iostream.h>


class MyClas


{


public:


       MyClass(int a)


       {


               X=a;


               cout<<”This is”<<X<<”‘s constructor.”<<endl;


       }


       ~MyClass()


       {


               cout<<”This is “<<X<<”‘s destructor.”<<endl;


       }


private:


       int X;


};


MyClass globalObj(0);


void main()


{


       MyClass commonObj(1);


       static MyClass staticObj(2);


}


6.写出下列程序的运行结果.


#include<iostream.h>


class CStatic


{


public:


       CStatic(){val++;}


       static int val;


};


int CStatic::val=0;


void main()


{


       cout<<”CStatic::val=”<<CStatic::val<<endl;


       CStatic cs1;


       cout<<”cs1.val=”<<cs1.val<<endl;


       CStatic cs2;


       cout<<”cs2.val=”<<cs2.val<<endl;


       CStatic cs3,cs4;


       cout<<”cs1.val=”<<cs1.val<<endl;


       cout<<”cs2.val=”<<cs2.val<<endl;


}


7. 写出下列程序的运行结果.


#include<iostream.h>


class MyClass


{


public:


       void SetValue(int val);


       MyClass();


       ~MyClass();


private:


       int i;


};


MyClass::MyClass()


{


       i=0;


       cout<<”This is a constructor!i=”<<i<<endl;


}


void MyClass::SetValue(int val)


{


       i=val;


       cout<<”i=”<<i<<endl;


}


MyClass::~MyClass()


{


       cout<<”This is a destructor!i=”<<i<<endl;


}


void main()


{


       MyClass * myl[3];


       int k;


       for(k=0;k<3;k++)


               myl[k]=new MyClass;


       for(k=0;k<3;k++)


               delete myl[k];


}


8. 写出下列程序的运行结果.


#include<iostream.h>


class Data


{


public:


       Data(int x)


       {


               Data::x=x;


               cout<<”Data cons.”<<endl;


       }


       ~Data(){ cout<<”Data des.”<<endl; }


private:


       int x;


};


class Base


{


public:


       Base(int x)d1(x){cout<<”Base cons.”<<endl;}


       ~Base(){cout<<”Base des.”<<endl;}


private:


       Data d1;


};


class Derived:public Base


{


public:


       Derived(int x):Base(x),d2(x){cout<<”Derived cons.”<<endl;}


       ~Derived(){cout<<”Derived des.”<<endl;}


private:


       Data d2;


};


void main()


{


       Derived obj(5);


}


9. 写出下列程序的运行结果.


#include<iostream.h>


class Base


{


public:


       Base(int i=0):x(i){}


       virtual int sum() const{ return x;}


private:


       int x;


};


class Derived:public Base


{


public:


       Derived(int i=0,int j=0):Base(i),y(j){}


       int sum() const { return Base::sum()+y;}


private:


       int y;


};


void Call(Base b)


{


       cout<<”sum=”<<b.sum()<<endl;


}


void main()


{


       Base b(10);


       Derived d(10,40);


       Call(b);


       Call(d);


}    


10. 写出下列程序的运行结果.


#include<iostream.h>


template<class T1,class T2>


void fun(T1 &x,T2 &y)


{


       if(sizeof(T1)>sizeof(T2))


               x=(T1)y;


       else


               y=(T2)x;


}


void main()


{


       double d;


       int i;


       d=99.99;


       i=88;


       fun(d,i);


       cout<<”d=”<<d<<”i=”<<i<<endl;


       d=8.8;


       i=9999;


       fun(i,d);


       cout<<”d=”<<d<<”i=”<<i<<endl;


}


 


 


四、编写程序


1.定义一个学生结构student,包括学生的学号、姓名、性别和出生日期。要求出生日期包括年、月、日。


2输入一个自然数,将该自然数的每一位数字按反序输出.例如:输入12345,输出54321.


3.编写程序,计算s=1+(1+2)+(1+2+3)+…..+(1+2+3+…+n)的值.


4.编写一个递归函数完成以下公式的运算:


sum(n)=1-1/2+1/3-1/4+…(其中n>0)


5.用函数指针实现对下面3个函数的调用.


(1)求两个数的最大值:  int Max(int x, int y);


(2)求两个数的最小值:  int Min(int x, int y);


(3)求两个数的和:      int Add(int x, int y);


6.设计一个类CRectangle,要求如下所述.


(1)该类中的私有成员变量存放Rectangle的长和宽,并且设置它们的默认值是1.


(2)通过成员函数设置其长和宽,并确保长和宽都在(0,50)范围之内.


(3)求周长Perimeter.


7.设计一个类CDateInfo,要求其满足下述要求.


(1)要求有一个无参的构造函数,其初始的年.月.日分别为:2000,1,1.


(2)要求有一个带参数的构造函数,其参数分别对应年.月.日.


(3)要求用一个成员函数实现日期的设置.


(4)要求用一个成员函数实现日期的获取.


8.定义Point类,有数据成员X和Y,重载++和—运算符,要求同时重载前缀方式和后缀方式.


9.编写一个程序,其中有一个简单的串类String,包含设置字符串,返回字符串长度及内容等功能.另有一个具有编辑功能的串类EditString,它的基类时String,在其中设置一个光标,使其能支持在光标处的插入,替换和删除等编辑功能.


10.使用模板函数实现swap(x,y),函数功能为交换x和y的值.


11.分别用递归和非递归方式实现(在有效的范围内,考虑最简单的情况即可)


(1)将一个整型数转换为数字字符串


(2)将一个数字字符串转换为整型数


(3)将一个字符串反转


C++练习之二》有 25 条评论

  1. ningweidong 说:

    1.语法错误    逻辑错误(好像不对)

    2.数组    指针

    3.0

    4.4

    5.*p    p++

    6.20

    7.?    ?

    8.实在看不懂,只好自己重新写了一个

    void main()
    {
     int n[10]={0,1, 2, 3, 4, 5, 6, 7, 8, 9};
     int i = 0;
     int j = 0;
     int k = 0;
     for (i=0; i<10; i++)
     {
      for (j=0; j<10; j++)
      {
       for (k=0; k<10; k++)
       {
        cout<<n[i]<<n[j]<<n[k];
        cout<<endl;
       }
      }
     }
    }
    9.?

    10.?    ?    ?    ?    ?

  2. ningweidong 说:

    11.重载

    12.int *x

    13.a

    14.x-y   x -= y;

    15.函数 类

    16.对象

    17.private  public

    18.public  private

    19.多  1

    20.friend class friendclass

  3. ningweidong 说:

    21.this  当前对象

    22.operator

    23.第1个参数  第二个参数

    24.public  protected  private

    25.可以  不可以

    26.基类的构造函数  派生类的构造函数  ?

    27.之前

    28.派生类  基类  ?

    29.运行  编译

    30.动态  静态

  4. ningweidong 说:

    31.可以  不可以

    32.纯虚函数  基类

    33.生成对象  ?

    34.,  class

    35.普通函数  模版函数

    36.?  ?

  5. ningweidong 说:

    三1.2

    2.20,20 

    3.the a of fun is 1
      ::a=200
      the a of main is 11
      ::a=201

    4.m=3
       n=2

    5.this is 0′s constructor.
       this is 1′s constructor.
       this is 2′s constructor.
       this is 1′s destructor.
       this is 2′s destructor.
       this is 0′s destructor.这道题做错了

    6.cstatic::val=0
       cs1.val=1
       cs2.val=2
       cs1.val=4
       cs2.val=4

    7.this is a constructor!i=0
       this is a constructor!i=0
       this is a constructor!i=0
       this is a destructor!i=0
       this is a destructor!i=0
       this is a destructor!i=0

    8.data cons.
       base cons.
       data cons.
       derived cons.
       derived des.
       data des.
       base des.
       data des.

    9.sum=10
       sum=10

    10.d=88  i=88
        d=9999  i=9999这道也错了.

     

  6. ningweidong 说:

    1.

    struct BirthDay
    {
         int year;
         int month;
         int day;
    };

    struct student
    {
         int ID;
         char name[10];
         int sex;
         BirthDay birthday;
    };

  7. ningweidong 说:

    2.

    void main()
    {
         int i = 0;//用来接收数字
         int a[10];//用来存放数字的每一位
         int pos = 0;//记录数字有几位
         int j = 0;

         cin>>i;//没有判断输入是否为字母

         while (i != 0)
         {
               a[pos] = i%10;
               i /= 10;
               pos ++;
         }

         //输出逆向数字
         for (j=0; j<pos; j++)
         {
               cout<<a[j];
         }

    }

  8. ningweidong 说:

    3.

    void main()
    {
         int sum = 0;//用来存放结果
         int addition = 0;//用来存放每一次的增量
         int i = 0;
         int n = 0;

     
         cin>>n;

     
         for (i=1; i<=n; i++)
         {
              addition = i*(1+i) / 2;//用公式,你不会真的蠢到一个数一个数的加吧
              sum += addition;
         }

         cout<<sum<<endl;

    }

  9. ningweidong 说:

    4.

    double sum(int n)
    {
         if (n == 1)
         {
              return 1.0;
         }
         else 
         {
              return (int)pow(-1, n+1) * (1.0/n)
                        +sum(n-1);
         }
    }

  10. ningweidong 说:

    5.int (* p)(int, int);
       p = max;
       int i = (* p)(7, 6);

    另外两个的用法是一样的.

  11. ningweidong 说:

    6.

    class crectangle
    {
    public:
         crectangle()
         {
              length = 1;
              width = 1;
         }

         void set(int len, int wid)
         {
              if ( (len<0 || len>50)
                    || (wid <0 || len>50) )
               {
                    cout<<”error data”<<endl;
                    return ;
               }
               else 
               {
                    length = len;
                    width = wid;
              }
     }

         int perimeter(void)
         {
              return (length + width)*2;
         }

    private:
         int length;
         int width;
    };

  12. ningweidong 说:

    7.

    class cdateinfo
    {
    private:
         int year;
         int month;
         int day;

    public:
         cdateinfo()
         {
              year = 2000;
               month = 1;
              day = 1;
         }

         cdateinfo(int y, int m, int d)
         {
               year = y;
              month = m;
              day = d;
         }

         void setdate(int y, int m, int d)
         {
               year = y;
               month = m;
              day = d;
         }

         void display()
         {
              cout<<”year: “<<year
                        <&l t;”  month: “<<month
                        <<”  day: ” <<day
                        <<endl;
         }
    };

    ningweidong38914.8212037037

  13. ningweidong 说:

    8.

    class point
    {
    private:
         int x;
         int y;

    public:
         point()
         {
              x = 100;
              y = 100;
         }

         point & operator ++ ( )
         {
              x ++;
              y ++;
              return *this;
         }

         point operator ++ (int)
         {
               point temp(* this);
              x ++;
              y ++;
              return temp;
         }

         point & operator — ( )
         {
              x –;
               y –;
              return *this;
         }

         point operator — (int)
         {
               point temp(* this);
               x –;
              y –;
               return temp;
         }
    };

  14. VC爱好者 说:

    太强了,兄弟。。就是不知道是不是全对

  15. ningweidong 说:

    9.只写了一个String类出来,EditString还没写出来.

    class String
    {
    protected:
         char * str;

    public:
         ~String()
         {
               delete str;
         }
     
         void SetString(char *s)
         {
              str = new char[strlen(s)+1];
              strcpy(str,s);
         }
     
         void GetContent()
         {
              cout<<str<<endl;
         }

         int GetLength()
         {
              return strlen(str);
         }
    };

    ningweidong38914.8208333333

  16. ningweidong 说:

    9.最简单的实现方法,没有判断cursor位置的合法性,cursor是从0开始的

    class editstring : public string
    {
    private:
         int cursor;
     
    public:
         editstring():string()
         {
              cursor = 0;
         }

         void replace(char ch, int cur = 0)
         {
              str[cur] = ch;
         }

         void insert(char ch, int cur = 0)
         {
              int i = 0;//循环变量
               char * temp;//存放新字符串
              temp = new char[strlen(str)+2];//新生成的字符串比原来的多1个字节

               for (i=0; i<cur; i++)
               {
                    temp[i] = str[i];
              }
      
               temp[cur] = ch;
      
               for (i=cur+1; i <= (strlen(str)); i++)
               {
                    temp[i] = str[i-1];
               }
      
               temp[strlen(str)+1] = ‘\0′;
      
               delete str;//释放原字符串
              str = temp;
         }

         void del(int cur = 0)
         {
               int i = 0;//循环变量
              char * temp;//存放新字符串
               temp = new char[strlen(str)];//新生成的字符串比原来的少1个字节
     
               for (i=0; i<cur; i++)
               {
                    temp[i] = str[i];
               }
      
               for (i=cur; i < (strlen(str)) -1; i++)
               {
                    temp[i] = str[i+1];
               }
      
               temp[strlen(str)-1] = ‘\0′;
      
               delete str;//释放原字符串
               str = temp;
         }

    };

    上一个string类有点问题,请多加一个构造函数

    string()
    {
         str = NULL;
    }

  17. ningweidong 说:

    10.

    template <class t>
    void swap(t &a, t &b)
    {//用异或交换两个变量的值
         a ^= b;
         b ^= a;
         a ^= b;
    }

    ningweidong38914.8201736111

  18. ningweidong 说:

    11.将一个整型数转换为数字字符串(非递归)

    char * inttostr(int i)
    {
         char *ch = NULL;//字符指针,存放要返回的字符串
         int t = i;
         int len = 0;//数字长度
         while (t != 0)
         {//求数字的长度
               t /= 10;
               len ++;
         }

         ch = new char[len+1];//为字符指针分配空间

         for (t=(len-1); t>=0; t–)
         { 
               ch[t] = i%10 +48;//数字的ACII码与其表示的值错了48
              i /= 10;
         }

         ch[len] = ‘\0′;
       
         return ch;
    }

  19. ningweidong 说:

    11.将一个数字字符串转换为整型数(非递归)

    int strtoint(const char *ch)
    {
         int base = 1;//定义基数,个位上乘1,十位上乘10,百位上乘100
         int i = 0;//循环变量
         int result = 0;//返回值
      
         for (i=(strlen(ch)-1); i>=0; i–)
         {
               result += (ch[i] – 48) * base;//ascii码错48,所以要减去48
               base *= 10;//基数乘10
         }
     
         return result;
    }

     

  20. ningweidong 说:

    11.将一个字符串反转(非递归)

    void turnover(char *ch)
    {
         int len = strlen(ch) – 1;//字符串最后一位的编号,因为是从0开始的,所以要减1
         int pos = strlen(ch) / 2;//将字符串分成两段
         int i = 0;
     
         for (i=0; i<pos; i++)
         {//用异或交换
               ch[i] ^= ch[len-i];
               ch[len-i] ^= ch[i];
               ch[i] ^= ch[len-i];
         }
    }

  21. ningweidong 说:

    递归实在不会写.

  22. VC爱好者 说:

    I 服了 U

  23. ningweidong 说:

    11.将一个整型数转换为数字字符串(递归)

    int intlen(int n)
    {//返回数字的位数
         int length = 0;
         while (n != 0)
         {
               n /= 10;
               length ++;
         }
         return length;
    }

    char * inttostr(int n)
    {
         int i = 0;
         char * ch = new char[intlen(n)+1];
     
         i = n%10;//i用来存放数字的最后一位
         ch[0] = i + 48;
         ch[1] = ‘\0′;

         if (n<10)
         {
               return ch;//如果只有一位,就直接返回
         }
         else 
         {//如果有多位,就将数字最后一位去掉,进行递归
              return strcat(inttostr(n/10),ch);
         }
    }

     

  24. ningweidong 说:

    11.将一个数字字符串转换为整型数(递归)

    int strtoint(char *ch)
    {
         int num = 0;//用来存最后1位的值
         num = ch[strlen(ch)-1] – 48;

         if (strlen(ch) == 1)
         {//如果只有一位就返回
               return num;
         }
         else
         {//将字符串除最后1位外,复制
               char *c = new char[strlen(ch)];
               strncpy(c, ch, (strlen(ch) – 1));
               c[strlen(ch)-1] = ‘\0′;

               return num + 10*strtoint(c);//进行弟归
         }
    }

  25. ningweidong 说:

    11.将一个字符串反转(递归)

    void turnover(char * ch, int pos = 0)
    {//用异或交换两个变量的值
         ch[pos] ^= ch[strlen(ch)-1-pos];
         ch[strlen(ch)-1-pos] ^= ch[pos];
         ch[pos] ^= ch[strlen(ch)-1-pos];

         if (pos == strlen(ch)/2 -1)
         {//如果pos是字符串的中间位置,说明已经完成了逆置,可以返回了
               return ;
         }
         else
         {//将pos提前一位,递归
               turnover(ch, pos+1);
         }
    }

    这个递归用了默认参数.这样做你就可以不用给出位置的参数

    char ch[]=”abcd”

    turnover(ch);

     

留下一个回复