C++试题

第一章

一、选择题

1.最初的计算机编程语言是:
a.机器语言
b.汇编语言
c.高级语言
d.低级语言
2.程序应该必须包含的部分是:
a.头文件
b.注释
c.高级语言
d.数据结构和算法
3.结构化程序设计的基本结构不包含以下哪项?
a.顺序
b.选择
c.跳转
d.循环
4.下列哪项不是面向对象程序设计的主要特征?
a.封装
b.继承
c.多态
d.结构
5.对象之间的相互作用和通信是通过消息。下列哪项不是消息的组成部分?
a.接受消息的对象
b.要执行的函数的名字
c.要执行的函数的内部结构
d.函数需要的参数
-----------------------------------------------------------------------------------------
答案:

  1. 答案为a
  2. 答案为d
  3. 答案为c
  4. 答案为d
  5. 答案为c



二、填空题

1.语言处理程序主要包括  ,  ,  三种。
2.汇编程序的功能是将汇编语言所编写的源程序翻译成由  组成的目标程序。
3.编译过程一般分成5个阶段:  、语法分析、  、代码优化和目标代码生成。
4.目前,有两种重要的程序设计方法,分别是:  和  。
5.在C++中,封装是通过  来实现的?
6C++程序一般可以分为4个部分:  ,全局说明,  ,用户自定义的函数。
7.任何程序逻辑都可以用  、  和  等三种基本结构来表示。
-----------------------------------------------------------------------------------------
答案:

 

二、填空题

 1. 汇编程序,解释程序,编译程序
 2. 机器指令
 3. 词法分析,中间代码生成
 4. 结构化的程序设计,面向对象的程序设计
 5. 类
 6. 预处理指令,程序的主函数
 7. 顺序 选择 循环




三、编程及问答题

1.叙述高级程序设计语言相对于低级语言的优点。


2.什么是结构定理?简单叙述结构化程序设计的过程。


3.面向对象程序设计的基本思想是什么?什么是对象、消息和类?什么是面向对象程序设计的基本特征?


4C++语言具有哪些特点?


5.既然机器语言和汇编语言都是计算机可以理解的语言,使用它们可以完全控制计算机的行为,那么为什么人们还要创造并使用高级程序设计语言呢?


6.软件危机的含义是什么?

 

三、简答题
 1. 低级语言与计算机硬件联系紧密,涉及到许多计算机底层操作的细节,要求程序员详细说明由计算机执行的每一步操作,这样的特性决定了使用低级语言是很繁琐和易错的;低级语言指令会因为硬件 型号不同而有很大差异,使得用其编写的程序不具有可移植性。
高级语言不涉及计算机底层的硬件,它提供较高层次的抽象,使用高级语言,编程者可以远离机器细节;高级语言不是面向机器的,而是面向问题的,这样更加接近编程者习惯的思维;高级语言编写的程序具有一定的可移植性。

 2. 结构定理指出:任何程序逻辑都可以用顺序、选择和循环三种基本结构来表示。结构化程序设计方法采用"自顶向下逐步求精"的方式确定模块的执行过程,并且要求只用顺序、选择和循环三种基本结构反复嵌套来构造程序。结构化程序设计的详细过程可以参考本章图1.2b)。

 3. 向对象程序设计的基本思想,就是尽可能模拟人类习惯的思维方式,使开发软件的方法和过程尽可能接近人类认识世界、解决问题的方法和过程,也就是使描述问题的问题空间与实现解法的解空间在结构上尽可能一致。
  面向对象程序设计中,重要的是现实世界的模型。面向对象程序设计围绕着建立问题领域的对象模型来进行,对问题领域进行自然的分解和抽象,确定需要使用的对象和类,在对象间传递信息实现必要的联系,从而按照人们习惯的思维方式建立起问题领域的模型,模拟客观世界。
  面向对象程序设计的基本概念和主要特征详见本章第三节。

 4. 本章第四节。 

 5. 因为机器语言和汇编语言都是低级语言,是面向机器的,与具体的计算机相关。学习起来困难,编程效率也低,可读性、可维护性也差。

 6. 软件危机是指在计算机软件的开发和维护过程中遇到的一系列严重的问题。概括地讲,软件危机包含下述两方面的问题:如何开发软件以满足对软件日益增长的需求;如何维护数量不断膨胀的现有软件。

第二章
一、选择题:

1C++程序的执行总是从哪里开始的?
a.main函数
b.第一行
c.头文件
d.函数注释
2.字符型数据在内存中的存储形式是:
a.原码
b.补码
c.反码
d.ASCII
3.下面常数中不能作为常量的是
a.0xA5
b.2.5e-2
c.3e2
d.0583
4.以下选项中是正确的整型常量的是:
a.1.2
b.20
c.1,000
d.6 7 4
5.以下选项中不是正确的实型常量的是:
a.3.8E-1
b.0.4e 2
c.43.5
d.243.43e-2
  答案:
    

一、 选择题

 1. 答案为a
 2. 答案为d
 3. 答案为d
 4. 答案为b
 5. 答案为b




二、改错题

1.指出下面程序中的错误
 void main( )
 {
  cout<<"This is a string"
 }


2.指出下面程序中的错误
 #include <iostream.h>
 void main( )
 {
  cin>>x;
  int p=x*x;
  cout<<"p=<<p<<\n";
 }


3.指出下面程序中的错误
 #include <iostream.h>
 void main( )
 {
   int i,j;
   i=5;
   int k=i+j;
   cout<<"i+j="<<k<<"\n";
 }


4"A"'A'是等价的。

 

二 改错题

 1.答: 错误有二,首先程序中用到输出对象cout,则必须在程序首部加上文件包含语句#include <iostream.h>。第二,语句结束必须有结束符""

 2.答:错误有二,首先变量必须先定义后使用,而x未定义就输入值是错误的。第二,如果程序要输出p的值,括号位置是不对的,第二个语句应写为:cout<<"p="<<p<<"\n";

 3.答:变量应先定义再使用,但还要注意,变量要初始化后才能引用。因j未初始化, k的结果是不可预料的。

 4.二者一个是字符串,一个是字符,是不等价的,前者由两个字节组成(字符'A'与字符'\0'),而后者只有一个字节。





三、编程题:

1.写出能被编译、连接和运行的、最小的C++程序。


2.编写一个程序,实现一个温度格式转换器。接受用户输入华氏温度,要求输出摄氏温度(换算公式为C5F32/ 9),输入输出要有文字说明。


3.编写程序,计算圆周长、面积及球体积。要求用户输入半径,输出计算结果(要有文字说明)。


4.给出下面程序输出的结果:
 #include <iostream.h>
 void main( )
 {
  int a;
  char ch;
  ch='a' ;
  ch++;
  a=ch; 
  cout<<a<<',';
 }


5.给出下面程序输出的结果:
 #include <stdio.h>
 void main()
 {
  int a=10;
  float b=-5.2;
  printf("a=%#o,b=%08.3f",a,b);
 }


6.给出下面程序输出的结果:
 #include <stdio.h>
 void main()
 {
  int a=-3;
  printf("%d,%o,%x,%X,%6x\n",a,a,a,a,a);
 }


7.给出下面程序输出的结果:
 #include <stdio.h>
 void main()
 {
  char ch='a';
  int a=65;
  printf("%c,%d,%3c\n",ch,ch,ch);
  printf("%c,%d,%3d\n",a,a,a);
 }


8.给出下面程序输出的结果: 
 #include <stdio.h>
 void main()
 {
  printf("%3s,%-5.3s,%5.2s\n","hello","hello","hello");
 }

答案:

 

三、 编程题

 1. void main(){}

 2
 参考程序如下:
 #include <iostream.h> 
 void main()
 {
  double F,C; 
  /* 输入部分 */
  cout<<"请输入华氏温度:";
  cin>>F; 
  /* 计算部分 */
  C = 5.0 * (F - 32.0) / 9.0;

  /* 输出部分 */
  cout<<"相应的摄氏温度为:"<<C<<endl;
 }

 3. 参考程序如下:
 #include <iostream.h>
 const double PI= 3.1415 ;
 void main()
 {
  double R,C,S,V;

  /* 输入部分 */
  cout<<"请输入半径:";
  cin>>R;

  /* 计算部分 */
  C = 2.0 * PI * R;
  S = PI * R * R;
  V = 4.0 * S * R / 3.0;

  /* 输出部分 */
  cout<<"圆周长为:"<<C<<endl;
  cout<<"圆面积为:"<<S<<endl;
  cout<<"圆球体积为:"<<V<<endl;
  }程序输出结果为:
  请输入半径:2.0
  圆周长为:12.566
  圆面积为:12.566
  圆球体积为:33.5093

 4.答:将输出 98

 5.输出结果为:a=012,b=-005.200

 6.输出结果为:-3,37777777775,fffffffd,FFFFFFFD,fffffffd

 7.输出结果为:
  a,97, a
  A,65, 65

 8.输出结果为:
 hello,hel , he
 说明:第一个"hello"%3s输出,由于"hello"长度超过3,因此按实际长度输出。第二个"hello"输出宽度为5,且从前面截取3个字符左对齐输出,第三个"hello"的输出宽度仍为5,从"hello"中截取2个字符右对齐输出。


第三章
一:选择题
1.以下符号中不能作为标识符的是:
a._256
b.void
c.scanf
d.Struct
2.下面不能正确表示a*b/(c*d)的表达式是:
a.(a*b)/c*d
b.a*b/(c*d)
c.a/c/d*b
d.a*b/c/d
3.下列运算符中,运算对象必须是整型的是:
a./
b.%=
c.=
d.&
4.若x,y,z均被定义为整数,则下列表达式终能正确表达代数式1/x*y*z)的是:
a.1/x*y*z
b.1.0/(x*y*z)
c.1/(x*y*z)
d.1/x/y/(float)z
5.已知a,b均被定义为double型,则表达式:b=1,a=b+5/2的值为:
a.1
b.3
c.3.0
d.3.5
6.如有int a=11;则表达式(a++*1/3)的值是
a.0
b.3
c.4
d.12
7.在下列运算符中,优先级最低的是:
a.||
b.!=
c.<
d.+
8.表达式9!=10的值为:
a.非零值
b.true
c.0
d.1
9.能正确表示x>=3或者x<1的关系表达式是:
a.x>=3 or x<1
b.x>=3|x<1
c.x>=3||x<1
d.x> =3||x<1
10.下列运算符中优先级最高的是:
a.!
b.%
c.-=
d.&&

答案:

 

一:选择题

 1. 答案为b
 2. 答案为a
 3. 答案为b
 4. 答案为b
 5. 答案为c
 6. 答案为b
 7. 答案为a
 8. 答案为d
 9. 答案为c
 10. 答案为a




二:填空题
1.若adouble性的变量,表达式a=1,a+5,a++的值为  。
2.表达式7.5+1/2+45%10=  
3.与! (x>2)等价的表达式是  。
4.表达式于语句的重要区别是  。
5.赋值运算符的结合性是由  至  。
6x *= y+8等价于x=  
7.给出下列程序的输出结果  。
 #include <iostream.h>
 void main()
 {
  int a=3,b=6;
  int c=a^b<<2;
  cout<<c<<endl;
 
8. 给出下列程序的输出结果  。
 #include <iostream.h>
 void main()
 {
  int x=5;
  int y=2+(x+=x++,x+8,++x);
  cout<<y<<endl;
 }
9. 给出下列程序的输出结果  。
 #include <iostream.h>
 void main()
 {
  int a=7,b=4;
  float x,y=27.2,z=3.4;
  x=a/2+b*y/z+1/3;
  cout<<x<<endl;
 }
10. 给出下列程序的输出结果  。
 #include <iostream.h>
 void main()
 {
  int a=-1,b=4,k;
  k=(a++<=0)&&!(b--<=0);
  cout<<k<<a<<b<<endl;
 }

 

二:填空题

 1. 答:1.0

 2. 答:12.5。注意,因为"/"两侧都是整型数,因此其结果也应该是整型,所以1/2的结果为0,而不是0.5

 3: 答:x<=2

 4: 答:表达式具有值,而语句是没有值的并且语句末尾要加分号。

 5: 答:右 左

 6: 答:x*(y+8)

 7. 答:27

 8. 答:14

 9. 答:35

 10. 答:1 0 3




三:编程及简答题
1x=2, y=3, z= 4时,计算下面表达式的值A1A2
A1 = x + y +2/2+z和 A2=x+(y+2)/(2-z)


2.述算术运算符的组成


3.下列运算符从高到底进行排序:+*&&、 &、 >、 >=、 *=。  

4.述下列运算符各能代表几种意义:-&*


5.下列运算符的结合性如何:+&=||


6.计算下列表达式的值:
i.1/2 + 5/2 + 7/6
ii.1/2. + 5/2. + 3.
iii.1/2 + 5./2 + 2
iv.(unsigned char) 500 + 200
v.(unsigned char) (500 + 200)
vi.(unsigned int)(unsingned char)750


7.编程实现:由键盘输入两个整数,然后输出最大者。


8int a=5, b=0; 问下面表达式运算后ab的值是多少?
(1) ! a && a+b && a++
(2) !a||a++||b++


9.有变量说明
int a=4,b;
指出下面表达式运算后ab的结果?
b+=b=++a;


10. 编程实现:测试你机器的 int,float,double,long,char 各类型变量存储的字节数。

 

三:编程及简答题

 1: 答:A1 = 2+3 + 1 + 4 = 5+1+4=6+4=10; A2 = 2 + (3+2)/(2+4) = 2 + 5/6 = 2 + 0 = 2

 2: 答:算术运算符由加'+''-''*''/'和取余'%'组成。

 3: 答:依次为'*''+''>'、 '>='、 '&''&&'、 '*='

 4: 答:'-'可以用于代表双目运算符减运算,同时可以代表单目运算符使后面的操作数变换符号。'&'可以用于代表双目运算符按位与运算,同时可以是地址运算符,表示后面操作数的地址。'*'可以用于代表双目运算符乘运算,同时可以与'&'相对应的单目运算符,表示后面的操作数地址中的值。

 5: 答:'+''&'作为单目运算符时结合性和从右到左,而作为双目运算符时,则为从左到右。'='运算符的结合性为从右到左,'||'运算符的结合性为从左到右。

 6: 答:(1) 3; (2) 6.0; (3) 4.5; (4) 644; (5) 188; (6) 238;

 7: 答:
 #include <iostream.h>
 void main()
 {
  int a,b;
  int max;
  cout<<"please input a and b:";
  cin>>a>>b;
  max=(a>b)? a:b ;
  cout<<"a 其中最大的是:"<<max<<endl;
 }

 8: 答:(1a=5, b=0
    (2) a=6, b=0

 9: 答:a5b10

 10:答:
 #include <iostream.h> 
 void main()
 {
  cout<<"Variables of type int use "<<sizeof(int)<<" bytes"<<endl;
  cout<<"Variables of type float use "<<sizeof(float)<<" bytes"<<endl;
  cout<<"Variables of type double use "<<sizeof(double)<<" bytes"<<endl;
  cout<<"Variables of type long use "<<sizeof(long)<<" bytes"<<endl;
  cout<<"Variables of type char use "<<sizeof(char)<<" bytes"<<endl;
 }


4
一:选择题
1. 如果变量x,y已经正确定义,下列语句哪一项不能正确将x,y的值进行交换:
a. x=x+y,y=x-y,x=x-y;
b. t=x,x=y;y=t;
c. t=y,y=x,x=t;
d. x=t,t=y,y=x
2. 如要求在if后一对括号中的表达式,表示a不等于0的时候的值为"",则能正确表示这一关系的表达式为:
a. a<>0
b. !a
c. a=0
d. a
3. 下面的这个循环的循环次数是:for(int i=0,j=10;i=j=10;i++,j--)
a. 无限次
b. 语法错误,不能执行
c. 10
d. 1
4. 以下哪个不是循环语句:
a. while语句
b. do-while语句
c. for语句
d. if-else语句
5.下列do-while循环的循环次数是:
 已知:int i=5;
 do{ cout<<i--<<endl;
  i--;
 }while (i!=0)
a. 0
b. 2
c. 5
d. 无限次
6.下列do-while循环的循环次数是:
  for(int i=0,x=0;!x&&i<=5;i++)
a.5
b.6
c.1
d.无限次

答案:

 

一:选择题

 1. 答案为d
 2. 答案为d
 3. 答案为a
 4. 答案为d
 5. 答案为d
 6. 答案为b





二:填空题
1. do-while语句与while语句的主要区别  。
2. x,y,zint类型的时候,下列语句执行之后,x的值为  , y的值为  ,z的值为  。
  x=10;y=20;z=30;
  if(x>y) x=y;y=z;z=x;
3.  是构造程序最基本的单位,程序运行的过程就是  的过程。
4. break语句实现的功能是  。
5. continue语句实现的功能是  。
答案:

 

二:填空题

 1. 答:do-while语句是先执行循环体,然后检查循环条件;while语句是先检查循环条件,再执行循环体。

 2. 答:102010

 3: 答:语句,执行程序语句

 4: 答:break语句用在循环语句的循环体内的作用是终止当前的循环语句。

 5: 答:根据程序的目的,有时需要程序在满足另一个特定条件时跳出本次循环。




三:编程及简答题
1. 用两次for 循环和求余运算符测试和打印输出(2-100)中为素数的正整数。


2.写一段程序,使用while循环从标准输入设备中读取字符到字符串中,自己确定输入什么字符时退出循环,对每一个读取的字符先用if语句判别是否为数字,然后用switch语句判别是否为字母,并打印输出相应字母为首字母的英文单词到屏幕。退出循环后在屏幕上显示输入的字符串。


3.把下面程序中的if语句换成switch语句。 
 #include <iostream.h>
 void main() 
 {
  char c;
  while(true) 
  {
   cout << "MAIN MENU:" << endl;
   cout << "l: left, r: right, q: quit -> ";
   cin >> c;
   if (c == 'q')
    break; // while结束
   if (c == 'l') 
   {
    cout << "LEFT MENU:" << endl;
    cout << "select c or d: ";
    cin >> c;
    if(c == 'c') 
    {
     cout << "you chose 'c'" << endl;
     continue; // 返回主菜单
    }
    if(c == 'd') 
    {
     cout << "you chose 'd'" << endl;
     continue; // 返回主菜单
    }
    else 
    {
     cout << "you didn't choose c or d!"<< endl;
     continue; //返回主菜单
    }
   }
   if (c == 'r') 
   {
    cout << "RIGHT MENU:" << endl;
    cout << "select a or b: ";
    cin >> c;
    if (c == 'a') 
    {
     cout << "you chose 'a'" << endl;
     continue; //返回主菜单
    }
    if (c == 'b') 
    {
     cout << "you chose 'b'" << endl;
     continue; //返回主菜单
    }
    else
    {
     cout << "you didn't choose c or d!"<< endl;
     continue; //返回主菜单
    }
   }
  cout << "you must type l or r or q!" << endl;
 }
 cout << "quitting menu..." << endl;
}


4.读下段程序,分析其功能是什么?
 #include <iostream.h>
 void main( )
 {
  cout<<"please input the b key to hear a bell."<<endl;
  char ch;
  cin>>ch;
  if (ch=='b')
   cout <<'\a';
  else
   if (ch=='\n'
    cout <<"what a boring select on..."<<endl;
   else
    cout <<"bye! \n";
 }


5.编写一个程序实现以下功能:从键盘读入3个整数,比较其大小,输出其中的最大数。


6.以下程序中的else应该与哪一个if配对?
 1、 if a==0
    p=0;
   if (a<0)
    p=-1;
   else
    p=1;
 2、 if a==0
   {
    p=0;
    if (a<0)
     p=-1;
   }
   else
    p=1;


7.看下面几个循环语句,说明循环的含义。
 1while ((c=getchar( ))!='Y'||c!='y'||c!='N'||c!='n' );
 2、 while (thue) {.... }
 3while (i ) {... }
 4int i=1,sum=0; while (i<=100) sum+=i++;


8.编程实现:输入一行字符,求其中字母、数字和其他符号的个数。


9.求满足下式的最小n值,其中的limit由键盘输入。
  1+1/2+1/3+……+1/n>limit

10.编写程序输出菲波那切数列的前20项。即前两项为1,以后每一项为前两项之和。

11.编写程序根据学生成绩输出优、良、中、及格和不及格。

12.编程实现如下功能:读入一行字母,求其中元音字母出现的次数。

答案:

 

三:编程及简答题

 

1 1: 答:

2  #include <stdio.h> 

3  int main()

4  {

5   int i,j; 

6   for (i=2; i<=100; i++)

7   {

8    for (j=2; j<i; j++)

9    {

10     if (i%j == 0)

11      break;

12    }

13    if (j==i)

14    {

15     printf("%d 是素数\n", i);

16    }

17   }

18   printf("按任意键结束");

19   return 0;

20  }

21 

22  2: 答:

23  #include <stdio.h>

24  #include <iostream.h>

25 

26  int main()

27  {

28   unsigned char iChar, sString[512];

29   int i = 0;

30 

31   while (true && i<511)

32   {

33    printf("请输入一个能显示的字符(qQ退出)");

34    cin>>iChar;

35    if (iChar == 'q' || iChar == 'Q')

36     break;

37    else if (iChar <='9' && iChar >= '0')

38     printf("%c为数字\n", iChar);

39    else

40    {

41     switch(iChar) 

42     {

43      case 'a':

44      case 'A':

45       printf("The first char of word 'an'\n");

46       break;

47      case 'b':

48      case 'B':

49       printf("The first char of word 'big'\n");

50       break;

51      case 'c':

52      case 'C':

53       printf("The first char of word 'china'\n");

54       break;

55      case 'd':

56      case 'D':

57       printf("The first char of word 'decad'\n");

58       break;

59      case 'e':

60      case 'E':

61       printf("The first char of word 'english'\n");

62       break;

63      case 'f':

64      case 'F':

65       printf("The first char of word 'flash'\n");

66       break;

67      case 'g':

68      case 'G':

69       printf("The first char of word 'great'\n");

70       break;

71      case 'h':

72      case 'H':

73       printf("The first char of word 'happy'\n");

74       break;

75      case 'i':

76      case 'I':

77       printf("The first char of word 'integer'\n");

78       break;

79      case 'j':

80      case 'J':

81       printf("The first char of word 'judge'\n");

82       break;

83      case 'k':

84      case 'K':

85       printf("The first char of word 'kick'\n");

86       break;

87      case 'l':

88      case 'L':

89       printf("The first char of word 'large'\n");

90       break;

91      case 'm':

92      case 'M':

93       printf("The first char of word 'manage'\n");

94       break;

95      case 'n':

96      case 'N':

97       printf("The first char of word 'nurse'\n");

98       break;

99      case 'o':

100      case 'O':

101       printf("The first char of word 'ok'\n");

102       break;

103      case 'p':

104      case 'P':

105       printf("The first char of word 'public'\n");

106       break;

107 

108      case 'r':

109      case 'R':

110       printf("The first char of word 'repair'\n");

111       break;

112      case 's':

113      case 'S':

114       printf("The first char of word 'save'\n");

115       break;

116      case 't':

117      case 'T':

118       printf("The first char of word 'test'\n");

119       break;

120      case 'u':

121      case 'U':

122       printf("The first char of word 'unable'\n");

123       break;

124      case 'v':

125      case 'V':

126       printf("The first char of word 'valid'\n");

127       break;

128      case 'w':

129      case 'W':

130       printf("The first char of word 'west'\n");

131       break;

132      case 'x':

133      case 'X':

134       printf("The first char of word 'xanthin'\n");

135       break;

136      case 'y':

137      case 'Y':

138       printf("The first char of word 'yes'\n");

139       break;

140      case 'z':

141      case 'Z':

142       printf("The first char of word 'zoo'\n");

143       break;

144      default:

145       printf("忽略输入的为控制字符!\n");

146       continue;

147      }

148     }

149     sString[i] = iChar;

150     i++;

151    }

152    sString[i] = '\0';

153    printf("\n输入的字符串为:%s\n", sString);

154    printf("按任意键结束");

155    return 0;

156  }

157 

158  3: 答:

159  #include <iostream.h>

160 

161  void main() 

162  {

163   char c; 

164   while(true) 

165   {

166    cout << "MAIN MENU:" << endl;

167    cout << "l: left, r: right, q: quit -> ";

168    cin >> c;

169    if (c == 'q') // while结束

170     break;

171    switch(c)

172    {

173     case 'l':

174      cout << "LEFT MENU:" << endl;

175      cout << "select c or d: ";

176      cin >> c;

177      switch(c)

178      {

179       case 'c':

180        cout << "you chose 'c'" << endl;

181        break;

182       case 'd':

183        cout << "you chose 'd'" << endl;

184        break;

185       default:

186        cout << "you didn't choose c or d!" << endl;

187        break;

188      }

189      break;

190     case 'r':

191      cout << "RIGHT MENU:" << endl;

192      cout << "select a or b: ";

193      cin >> c;

194      switch(c)

195      {

196       case 'a':

197        cout << "you chose 'a'" << endl;

198        break;

199       case 'b':

200        cout << "you chose 'b'" << endl;

201        break;

202       default:

203        cout << "you didn't choose a or b!" << endl;

204        break;

205      }

206      break;

207     default:

208      cout << "you must type l or r or q!" << endl;

209      break;

210     }

211    }

212    cout << "quitting menu..." << endl; 

213  }

 

 4: 答:是等待输入一个字符,如果是字符b,则响铃,否则,如果是回车,则输出what a boring select on...,不是,则输出bye!

 5: 答:

214  #include <iostream.h>

215  void main( )

216  {

217   long a,b,c;

218   cout<<"输入三个数"<<endl;

219   cin>>a>>b>>c;

220   if (a<b)

221    if (b<c)

222     cout <<c;

223    else

224     cout<<b;

225   else

226    if (a<c)

227     cout<<c;

228    else

229     cout<<a;

230  }

 

 6: 答:程序段1else 与第二个if 配对,程序段2else 与第一个if 配对。

 7: 答:
 程序段1接受键盘输入,直到输入的是Y,y,N,n为止。
 程序段2是一个死循环。
 程序段3i0,结束循环。
 程序段41+2+3+……+100的和。

231  8: 答:

232  #include <iostream.h>

233  #include <stdio.h>

234  void main( )

235  {

236   char c;

237   int letters=0,digits=0,others=0;

238   cout<<"Please input a line charaters\n";

239   while ((c=getchar( ))!='\n')

240   {

241    if (c>='a' && c<='z' || c>='A' && c<='Z' )

242     letters++;

243    else

244     if (c>='0' && c<='9')

245      digits++;

246     else

247      others++;

248   }

249   cout<<"letters:"<<letters<<endl

250   <<"digits"<<digits<<endl

251   <<"others"<<others<<endl;

252  }

253 

254  9: 答:

255  #include <iostream.h>

256  void main()

257  {

258   int i=0;

259   double sum=0.0,limit;

260   cout <<"Please input limit:\n";

261   cin>>limit;

262   do {

263    i++;

264    sum+=1.0/i;

265    cout<<i<<" "<<sum<<endl;

266   } while (sum<limit);

267   cout<<i;

268  }

269 

270  10:答:

271  #include <iostream.h>

272  void main()

273  {

274   int i1=1,i2=1,i3,i;

275   cout<<i1<<' '<<i2<<' ';

276   for (i=3;i<=20;i++)

277   {

278    i3=i1+i2;

279    cout<<i3<<' ';

280    i1=i2;

281    i2=i3;

282   }

283  }

284 

285  11:答: 

286  #include <iostream.h>

287  void main ( )

288  {

289   int sco, grade;

290   cout<<"please input a num\n";

291   cin>>sco;

292   grade=sco/10;

293   switch (grade)

294   {

295    case 10:

296    case 9: cout<<""; break;

297    case 8: cout<<""; break;

298    case 7: cout<<""; break;

299    case 6: cout<<"及格"; break;

300    case 5:

301    case 4:

302    case 3:

303    case 2:

304    case 1:

305    case 0: cout<<"不及格"; break;

306    default :cout<<"输入错误\n"; break; //break 可省略

307   }

308  }

 

 12:答:

309  #include <iostream.h>

310  #include <stdio.h>

311  void main( )

312  {

313   char c;

314   int count=0;

315   while ((c=getchar())!='\n')

316   {

317    switch (c) {

318     case 'a':

319     case 'A':

320     case 'e':

321     case 'E':

322     case 'i':

323     case 'I':

324     case 'o':

325     case 'O':

326     case 'u':

327     case 'U': count++;break;

328    }

329   }

330   cout<<count<<endl;

331  }

 


第五章
一:选择题
1. 下列叙述中正确的是:
a. C++语言程序必须要有return语句
b. C++语言程序中,要调用的函数必须在main()函数中定义
c. C++语言程序中,只有int类型的函数可以未经声明而出现在调用之后
d. C++语言程序中,main()函数必须放在程序开始的部分
2. 下列叙述中正确的是:
a. C++语言程序总是从第一个定义的函数开始执行
b. C++语言程序中,函数类型必须进行显式声明
c. C++语言程序中,return语句必须放在函数的最后
d. C++语言程序中,return语句中表达式的类型应该与函数的类型一致
3. 下列叙述中正确的是:
a. C++语言程序中,main()函数必须在其它函数之前,函数内可以嵌套定义函数
b. C++语言程序中,main()函数的位置没有限制,函数内不可以嵌套定义函数
c. C++语言程序中,main()函数必须在其它函数之前,函数内不可以嵌套定义函数
d. C++语言程序中,main()函数必须在其它函数之后,函数内可以嵌套定义函数
4. 一个C++语言程序总是从_______开始执行:
a. 主程序
b. 子程序
c. 主函数
d. 第一个函数
5.已知函数test定义为:
 void test()
 {
  …………
 }
 则函数定义中void的含义是:
a. 执行函数test后,函数没有返回值
b. 执行函数test后,函数不再返回
c. 执行函数test后,函数返回任意类型值
d. 以上三个答案都是错误的
6.以下对于C++语言的描述中,正确的是:
a.C++语言中调用函数时,值传递方式只能将实参的值传递给形参,形参的值不能传递给实参
b.C++语言中函数既可以嵌套定义,也可以递归调用
c.函数必须有返回值
d.C++程序中有调用关系的所有函数必须放在同一源程序文件中
7. C++语言中函数返回值的类型是由______决定的?
a.return语句中的表达式类型
b.调用该函数的主调函数类型
c.定义函数时所指定的函数类型
d.以上说法都不正确
8.在一个源文件中定义的全局变量的作用域为:
a.本程序的全部范围
b.本函数的全部范围
c.从定义该变量的位置开始到本文件结束
d.以上说法都不正确
9. 以下说法错误的是:
a.全局变量就是在函数外定义的变量,因此又叫做外部变量
b.一个函数中既可以使用本函数中的局部变量,也可以使用全局变量
c.局部变量的定义和全局变量的定义的含义不同
d.如果在同一个源文件中,全局变量和局部变量同名,则在局部变量的作用范围内,全局变量通常不起作用
10. 当一个函数无返回值时,定义它的函数类型应是___。
a.void
b.int
c.任意
d.
答案:

 

一:选择题:

 c)是正确的,本题为基础题,可参考教材得出答案。
 d)是正确的,本题为基础题,可参考教材得出答案。
 b)是正确的,在C++语言中,主函数main()在程序中的位置是没有限制的,可以在程序中的任何地方,但是C++语言中不允许进行函数嵌套定义。
 c)是正确的,本题为基础题,可参考教材得出答案。
 a)是正确的,本题为基础题,可参考教材得出答案。
 a)是正确的。(b)错误,C++语言中函数不可以嵌套定义。(c)错误,void类型的函数可以没有返回值。(d)错误,一个C++程序允许由多个文件组成,有调用关系的函数可以放在不同的源程序文件中。 
 c)是正确的
 c)是正确的
 9: (a) 是正确的
 10: (a) 是正确的



二:编程及简答题
1. 下面的程序共有17行,程序中变量numitemp、对象cout和函数func()的作用域范围分别是什么?
 1#include<iostream.h>
 2int num;
 3void func();
 4void main()
 5{
 6、 char name[20];
 7、 int i;
 8、 for(i=0;i<20;i++)
 9、 {
 10、 char temp;
 11、 temp=name;
 12、 cout<<temp;
 13、 }
 14}
 15void func()
 16{
 17、 cout<<"A function!";
 18}


2.用递归函数完成以下运算:
 sum(n)=1+2+3+n
 函数的原型如下:
 int sum(int n);
 该函数完成1+2+3+n的运算,并返回运算结果,其中n>0


3.阅读下面的程序,回答问题:
 //file1.cpp 
 static int i = 20;
 int x;
 static int g(int p)
 {
  return i + p;
 }
 void f(int v)
 {
  x = g(v);
 }
 //file2.cpp
 #include <iostream.h>
 extern int x;
 void f(int);
 void main()
 {
  int i = 5;
  f(i);
  cout << x;
 }
 回答以下问题
 (1)、 程序的运行结果是什么样的? 
 (2)、 为什么文件file2.cpp中要包含头文件<iostream.h>? 
 (3)、 在函数main()中是否可以直接调用函数g(),为什么? 
 (4)、 如果把文件file1.cpp中的两个函数定义的位置换一下,程序是否正确,为什么? 
 (5)、 文件file1.cppfile2.cpp中的变量i的作用域分别是怎样的?在程序中直接标出两个变量各自的作用域 


4.给出下列程序中的输出结果。
 (1) #include<iostream.h>
  int add(int a,int b);
  void main()
  {
   extern int x,y;
   cout<<add(x,y)<<endl;
  }
  int x=20,y=5;
  int add(int a,int b)
  {
   int s=a+b;
   return s;
  }
 (2) #include<iostream.h>
  void fn(int n)
  {
   int x=5;
   static int y=10;
   if(n>0)
   {
    ++x;
    ++y;
    cout<<x<<","<<y<<endl;
   }
  }
  void main()
  {
   int m=1;
   fn(m);
  }
 (3)分析如下程序输出结果:
  #include "iostream.h"
  fun(int a,int b,int c)
  {
   c=a*b;
  }
  void main()
  {
   int c;
   fun(2,3,c);
   cout<<"c="<<c<<endl;
  }
 (4). 分析如下程序输出结果:
  #include "iostream.h"
  void outputab(int a,int b)
  {
   cout<<"a= "<<a<<" b= "<<b<<endl;
   a=100;
   b=200;
  }
  void main()
  {
   int a=300;
   int b=400;
   outputab(a,b);
   cout<<"a= "<<a<<" b= "<<b<<endl;
  }


5.为什么要使用函数?函数声明与函数体之间有什么区别?


6.求组合数,编程计算c(m,n)=(m!)/((n!)*(m-n)!)


7.已知银行的存款利息如下。某人有2000元钱,要存20年,问怎样存才能使20年后得到的本利合计最多(假定银行对定期存款过期部分不付利息)?
      0.63% 期限一年
      0.66% 期限二年
 月息利率= 0.69% 期限三年
      0.75% 期限五年
      0.84% 期限八年


8.下面的函数调用语句中,含有的实参个数有多少?
  Func(rec1,rec2+1,(rec3,rec4));


9.写函数int newint(double x)x的整数部分。例如:传送给函数参数x的值为3.45623,函数的返回值为3

10.编程实现,任输入一个正整数num,求1!+2!+3.+num!的和。
答案:

 

二:简答及编程 
1.答:
 num 的作用域为从第__2__行到第__18__.
 的作用域为从第__7__行到第__14__.
 temp 的作用域为从第__10__行到第__13__.
 cout 的作用域为从第__1__行到第__18_.
 func 的作用域为从第__3__行到第__18__.

2.答:

1  int sum(int n)

2  {

3   if(n==1)

4    return 1;

5   else

6    return n + sum(n-1);

7  }

 

3.答:
 (1)、 程序的运行结果:25 
 (2)、 因为程序中需要利用cout对象进行输出,而cout是在C++标准I/Oiostream中定义的类ostream的一个对象。 
 (3)、 在函数main()中不可以直接调用函数g(),因为g()是静态函数,只在它所在的文件内可见。 
 (4)、 如果把文件file1.cpp中的两个函数定义的位置换一下,程序不正确,因为C++规定所有使用的变量和函数需要先声明,后使用。在函数f中用到了函数g,所以函数f不能出现在函数g的定义或声明之前。 
 (5)、 文件file1.cpp中的变量i的作用域从它的定义开始到文件结束。File2.cpp中的变量i的作用域从它的定义开始到main函数结束。 

4.答:(1) 25 (2) 6 , 11
 (3) 分析这道题首先要弄清楚两点:1:未赋初值的变量,它的值是什么。2:形参变量的值和实参变量的值的关系。本题在main函数中定义了一个整型变量c,系统为其分配了一个存储单元。此单元中的原有信息并未被清除,这时变量c的值是不确定的"随机数"。调用函数fun时,将实参常量23分别传给了形参ab,实参变量c中的随机值传给了形参变量c。通过函数fun的运算,形参变量c中存放了a*b的运算结果,这一结果并不能反馈给实参变量c。因此在主函数中输出的c值是一个不确定的值。
 (4) 输出结果为:
 a= 300 b= 400
 a= 300 b= 400
 本题只要把握住一点即可:当函数调用的参数传递方式为值传递时,形参变量的值的改变不影响到实参变量。因此在outputab函数内部对变量ab的赋值并不会对main函数中的ab的值造成影响。

5.答:使用函数可以将大程序分成许多独立的模块,而且函数能在模块中单独编译并链接。使用函数还可将复杂的过程分解为简单的模块组合。函数声明要给出名称、返回值和参数。函数体中则是程序调用该函数时该函数所需执行的语句。

6.答:
 #include "iostream.h"
 //定义facto函数,在这里facto函数定义在main()函数之前,
 //如果定义在main()函数之后,
 //main()函数在调用facto函数之前需要先对facto函数进行声明
 

8 long facto(int x)

9  {

10   long y;

11   for(y=1;x>0;--x)

12    y*=x;

13    return y;

14  }

15 

16  void main()

17  {

18   int m,n,temp;

19   double cmn;

20   cout<<"input m :"<<endl;

21   cin>>m;

22   cout<<"input n :"<<endl;

23   cin>>n;

24 

25   if ( m < n ) 

26   {

27    temp = n;

28    n = m;

29    m = temp;

30   }

31   cmn=facto(m)/(facto(n)*facto(m-n));

32   //三次调用facto函数

33   cout<<"the combination is "<<cmn<<endl;

34  }

 

7.答:
  为了得到最多的利息,存入银行的钱应该在到期时马上取出来,然后立刻将原来的本金和利息加起来再作为新的本金存入银行,这样本利不断的滚动直到满20年为止。由于存款的利率不同,所以有很多不同的存款方法(年限)存20年得到的利息也是不一样的。 
分析题意:设2000元存20年,其中一年期存了i1次,二年期存了i2次,三年期存了i3次,五年期存了i5次,八年期存了i8次,则到期时存款人应该得到的本利合计应该为:
  2000*(1+rate1) *(1+rate2) * (1+rate3) * (1+rate5) * (1+rate8) 其中rateN为对应存款年限的利率。根据题义还可以得到以下的限制条件:
  0<=i8<=2
  0<=i5<=(20-8*i8)/5
  0<=i3<=(20-8*i8-5*i5)/3
  0<=i2<=(20-8*i8-5*i5-3*i3)/2
  0<=i1<=20-8*i8-5*i5-3*i3-2*i2
  可以采用穷举法穷举所有的i8i5i3i2i1的组合,带入求本利的公式,算出本利为最大值时的存款方案。

35   #include "iostream.h"

36   #include <math.h>

37   void main()

38   {

39    int i8,i5,i3,i2,i1,n8,n5,n3,n2,n1;

40    //i:存款的年限,n:当前找到的最佳存款方法

41    double max=0,term;

42    for(i8=0;i8<3;i8++)

43     for(i5=0;i5<=(20-8*i8)/5;i5++)

44      for(i3=0;i3<=(20-8*i8-5*i5)/3;i3++)

45       for(i2=0; i2<=(20-8*i8-5*i5-3*i3)/2;i2++)

46       {

47        i1=20-8*i8-5*i5-3*i3-2*i2;

48        term=2000.0*pow(1+0.0063*12,(double)i1)

49         *pow(1+2*0.0066*12,(double)i2)

50         *pow(1+3*0.0069*12,(double)i3)

51         *pow(1+5*0.0063*12,(double)i5)

52         *pow(1+8*0.0063*12,(double)i8);

53        if(term>max)

54        {

55         max=term;

56         n1=i1;

57         n2=i2;

58         n3=i3;

59         n5=i5;

60         n8=i8;

61        }

62       }

63       cout<<"8 year: "<<n8<<endl;

64       cout<<"5 year: "<<n5<<endl;

65       cout<<"3 year: "<<n3<<endl;

66       cout<<"2 year: "<<n2<<endl;

67       cout<<"1 year: "<<n1<<endl;

68       cout<<"Total: "<<max<<endl;

69   }

 

8.答: C++函数调用的一般形式为: 函数名(实参1,实参2……
  其中实参可以是常量、变量或者是表达式。本题中容易知道前面的rec1,rec2+1均为实参,前者是一个变量,后者是一个表达式;关键是要正确识别(rec3,rec4),这也是一个表达式--逗号表达式。因为逗号表达式的优先级最低,所以只有用圆括号括起来才可以将他们看成是一个表达式。明确这一点后,就可以清楚地辨别出上述语句共有3个实参。

9.答:
 可以利用强制类型转换方法实现,程序如下:

70  int newint(double x)

71  {

72   int I;

73   I=(int)x;

74   return I;

75  }

 

10. 答:
 

76 #include "iostream.h"

77  int fn(int a);

78  void main()

79  {

80   int s=0;

81   cout<<"please putin a num:";

82   int num;

83   cin>>num;

84   for(int i=1;i<=num;i++) s+=fn(i);

85    cout<<"1!+2!+...+num!="<<s<<endl;

86  }

87  int fn(int a)

88  {

89   static int b=1;

90   b*=a;

91   return b;

92  

 


6
一:选择题
1. 要声明一个有10int型元素的数组,正确的语句是____
a. int a[10];
b. int a[2,5];
c. int a[];
d. int *a[10];
2. 合法的数组初始化语句是____
a. char a = "string";
b. int a[5] = {0,1,2,3,4,5};
c. int a[] = "string"
d. char a[] = {0,1,2,3,4,5};
3. 在下述对C++语言字符数组的描述中,有错误的是____
a. 字符数组可以存放字符串
b. 字符数组中的字符串可以进行整体输入输出
c. 可以在赋值语句中通过赋值运算符"="对字符数组整体赋值
d. 字符数组的下标从0开始
4. 若用数组名作为函数调用时的实参,则实际上传递给形参的是____
a. 数组首地址
b. 数组的第一个元素值
c. 数组中全部元素的值
d. 数组元素的个数
5.已知:
  int i,x[3][3] = {1,2,3,4,5,6,7,8,9};
  则下面语句的输出结果是____  for(i = 0;i < 3;i ++)

2   printf("%d ",x[i][2-i]);

 

a. 1 5 9
b. 1 4 7
c. 3 5 7 
d. 3 6 9
6.在C++语言中,引用数组元素时,其数组下标的数据类型允许是____
a.只能整型常量 
b.只能整型表达式
c.整型常量或整型表达式
d.任何类型的表达式
7. 以下对二维数组a的正确声明是____
a.int a[3][]
b.float a(3,4)
c.double a[1][4] 
d.float a(3)(4)
8.已知:int[3][4],则对数组元素引用正确的是____
a.a[2][4]
b.a[1,3] 
c.a[1+1][0]
d.a(2)(1)
9. 在C++语言中,二维数组元素在内存中的存放顺序是____
a.按行存放
b.按列存放
c.由用户自己定义
d.由编译器决定
10. 下面程序的运行结果是____
  char c[5] = {'a','b','\0','c','\0'};
  printf("%s",c);
a.'a''b'
b.ab
c.ab c 
d.以上三个答案均有错误
答案:

 

一:选择题:

 1.A 
 2.D 
 3.C 
 4.A 
 5.C 
 6.C 
 7.C
 8.C 
 9.A 
 10.B




二:程序填空题
1.程序读入20个整数,统计非负数个数,并计算非负数之和。 #include <stdio.h>

4  void main(void)

5  {

6   int i,a[20],s,count;

7   s = count = 0;

8   for(i = 0;i < 20;i ++)

9    scanf("%d",  );

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

11   {

12    if(a[i] < 0)

13     ;

14    s += a[i];

15    count ++;

16   }

17   printf("s = %d\t count = %d\n",s,count);

18  }

 

19 2. 函数index(char s[],char t[])检查字符串s中是否包含字符串t,若包含,则返回ts中的开始位置(下标值),否则返回-1 int index(char s[],char t[])

20  {

21   int i,j,k;

22   for(i = 0;s[i] != '\0';i ++)

23   {

24    for(j = i,k = 0;  &&s[j] == t[k];j ++,k ++);

25     if(  )

26      return i;

27   }

28   return -1;

29  }

 

30 3. 以下程序将数组中的数据按逆序存放。 #include<stdio.h> 

31  void main()

32  {

33   int a[12],i,j,t;

34   for(i=0;i<12;i++) scanf("%d",&a[i]);

35    i=0;j=12;

36   while(  )

37   { t=a[i];  ;  ;i++;j  ;}

38    for(i=0;i<12;i++)printf("%3d",a[i]);

39    printf("\n");

40  }

 

答案:

 

二、程序填空

41  1① &a[i] ② continue

42  2① t[k] != '\0' t[k] == '\0'

43  3.(1i<j/2 (2) a[i]=a[j-1] (3) a[j-1]=t (4) --

 




三:编程题
1. 编写3×3矩阵转置程序。


2.编程实现两字符串的连接,要求使用字符数组保存字符串(要求不使用库函数)


3.写统计输入的正文中有多少单词的程序,这里的单词指的是用空白符分隔开的字符串。


4.编写程序实现一个简单的加密器,实现英文字符串的加密。加密规则如下:将字符替换成它后面的第二个字符。比如'a'替换成'c''C'替换成'E''z'替换成'|'"Panda"替换成"Rcpfc"


5.编程实现对分查找。当数组很大时,循环查找很费时。如果程序已对数组进行升序和降序排序,就可用对分查找。对分查找是每一次查找操作都把要检查的数值个数对半分。对查找不到的数,输出-1
答案:

 

三、编程题

1.写3×3矩阵转置程序。

44  #include <iostream.h> 

45  void move (int matrix[3][3])

46  {

47   int i, j, k;

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

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

50   {

51    k = matrix[i][j];

52    matrix[i][j] = matrix[j][i];

53    matrix[j][i] = k;

54   }

55  

56  void main()

57  {

58   int i, j;

59   int data[3][3];

60   cout << "输入矩阵的元素" << endl;

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

62    for (j=0; j<3; j++)

63    {

64     cout << "" << i+1 << "行第" << j+1

65     <<"个元素为:";

66     cin >> data[i][j];

67    }

68   cout << "输入的矩阵为:" << endl;

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

70   {

71    for (j=0; j<3; j++)

72     cout << data[i][j] << " ";

73     cout << endl;

74   }

75   move(data);

76   cout << "转置后的矩阵为:" << endl;

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

78   {

79    for (j=0; j<3; j++)

80     cout << data[i][j] << " ";

81     cout << endl;

82   }

83  }

 

2. 编程实现两字符串的连接,要求使用字符数组保存字符串(要求不使用库函数)

84  #include <iostream.h>

85  void main()

86  {

87   int i=0,j=0;

88   char s1[200],s2[100];

89   cout << "请输入第一个字符串:";

90   cin >> s1;

91   cout << "请输入第二个字符串:";

92   cin >>s2;

93   while(s1[i])

94    i++;

95   while(s2[j])

96    s1[i++] = s2[j++];

97    s1[i] = '\0';

98    cout << "连接后的字符串为:" << s1 << endl;

99  }

 

3. 写统计输入的正文中有多少单词的程序,这里的单词指的是用空白符分隔开的字符串。

100  #include <stdio.h>

101  void main()

102  {

103   int c,n;

104   bool inword;

105   n = 0;

106   inword = false;

107   while((c = getchar()) != EOF)

108    if(c == ' '||c == '\t'||c == '\n')

109     inword = false;

110    else if(inword == false)

111    {

112     inword = true;

113     n ++;

114    }

115   printf("There are %d words\n",n);

116  }

 

4.参考程序如下:

117  #include <iostream.h>

118  const MAX_STR_LENGTH = 100;

119 

120  void main()

121  {

122   char str[MAX_STR_LENGTH];

123 

124   /* 输入部分 */

125   cout<<"Input a string:";

126   cin>>str;

127 

128   /* 加密部分 */

129   for(int i = 0; i < MAX_STR_LENGTH; i++)

130   {

131    if(str[i] == '\0') break;

132    str[i] = str[i] + 2;

133   }

134 

135   /* 输出部分 */

136   cout<<"加密后的字符串为:"<<str<<endl;

137  }

 

 程序输出结果如下:
 Input a string:China
 加密后的字符串为:Ejkpc

5. 答:

138  #include<iostream.h>

139  int binary_search(int array[],int value,int size)

140  {

141   int found=0;

142   int high=size,low=0,mid;

143   mid=(high+low)/2;

144   cout<<"Looking for: "<<value<<endl;

145   while((!found)&&(high>=low))

146   {

147    cout<<"low mid high "<<endl;

148    cout<<low<<" "<<mid<<" "<<high<<endl;

149    if(value==array[mid])

150     found=1;

151    else if(value<array[mid])

152     high=mid-1;

153    else

154     low=mid+1;

155     mid=(high+low)/2;

156   }

157   return((found)? mid: -1);

158  }

159  void main(void)

160  {

161   int array[100],i;

162   for(i=0;i<100;i++)

163   array[i]=i;

164   cout<<"Result of search: "<<binary_search(array,33,100)<<endl;

165   cout<<"Result of search: "<<binary_search(array,76,100)<<endl;

166   cout<<"Result of search: "<<binary_search(array,566,100)<<endl;

167  }

 


第七章  指针和引用

一:选择题
1. 下面函数的功能是:( )
 int fun(char *x)
 {
  char *y=x;
  while(*y++){};
  return y-x-1;
 }
a. 求字符串的长度
b. 求字符串存放位置
c. 比较两个字符串的大小
d. 将字符串x连接到字符串y后面
2. 若有以下说明和语句,且0<i<10,则( )是对数组元素的错误引用。
  int a[ ]={1,2,3,4,5,6,7,8,9,0},*p,i;
  p=a;
a. *(a+i)
b. a[p-a] 
c. p+i
d. *(&a)
3. 下面程序的输出是:( )
 #include <stdio.h>
 void main( )
 {
  int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;
  printf("%d", *(p+2));
 }
a. 3
b. 4
c. 1
d. 2
4. 若有以下定义和语句,且0<i<10,则对数组元素地址的正确表示是:( )
  int a[ ]={1,2,3,4,5,6,7,8,9,0},*p,i;
  p=a;
a. &(a+1)
b. a++ 
c. *p
d. &p
5.已知:int a,x=1;则下面正确的赋值语句是:( )
a. a=(a[1]+a[2])/2;
b. a=(a[1]+a[2])/2;
c. a=x+2;
d. a="good";
6.已知:int a[]={1,2,3,4,5,6}*p=a;下面表达式中其值为5的是:( )
a.p+=3;*(p++); 
b.p+=5;*p++ ;
c.p+=4;*++p;
d.p+=4;++*p;
7. 若有以下语句,且0<=k<6,则正确表示数组元素地址的语句是( )
  int x[]={1,9,10,7,32,4},*ptr=x,k=1;
a.x++
b.&ptr 
c.&ptr[k]
d.&(x+1)
8.若有说明:int i,j=7,*p;p=&i;则与i=j等价的语句是( )
a.i=*p; 
b.*p=*&j; 
c.i=&j 
d.i=**p;
9. 设p1p2是指向同一个int型一维数组的指针变量,kint型变量,则不能正确执行的语句是( )
a.k=*p1+*p2;
b.p2=k;
c.p1=p2;
d.k=*p1*(*p2);
10. 设有以下函数定义,则该函数返回的值是( )
 int * fun(int a)
 {
  int *t,n;
  n=a;t=&n;
  return t;
 }
a.一个不可用的存储单元地址值
b.一个可用的存储单元地址值
c.n中的值
d.形参a中的值
答案:
    

一:选择题:

 1.A 
 2.C 
 3.A 
 4.D 
 5.C 
 6.A 
 7.C 
 8.B 
 9.B 
 10.A




二:填空题
1、 给出以下程序的输出结果是  
 #include<stdio.h>
 void main()
 {
  int *v,b;
  v=&b; b=100; *v+=b;
  printf("%d\n",b);
 }
2、 说明语句"int (* p)();"的含义是  
3、 已知函数说明语句:void *fun();则它的含义是  
4、 已知:int i;char *s="a\045+045\'b";执行语句"fot(i=0;*s++;i++);"之后,变量i的结果是  
5、下面的程序是求两个整数之和,并通过形参传回结果。
 int add(intx,int y,  z)
 {  =x+y;}
6、给出以下程序的输出结果是  
 void fun(int *x)
 { printf("%d\n",++*x)'; }
 main()
 
  int a=25;
  fun(&a);
 }
7、给出以下程序运行的结果  
 #include <stdio.h>
 void main( )
 {
  int a[ ]={1,2,3,4,5};
  int x, y, *p;
  p=&a[0];
  x=*(p+2);
  y=*(p+4);
  printf("*p=%d,x=%d,y=%d\n",*p,x,y);
  return;
 }
8、给出以下程序运行的结果  
 #include<iostream.h>
 void callbyval(int a,int b,int c)
 {
  a=3;b=2;c=1;
 }
 void callbypointer(int* a,int* b,int* c)
 {
  *a=3;*b=2;*c=1;
 }
 void callbyreference(int& a,int& b,int& c)
 {
  a=1;b=2;c=3;
 }
 void main()
 {
  int a=1,b=2,c=3;
  int& a1=a;
  int& b1=a;
  int& c1=a;
  callbyval(a,b,c);
  cout<<a<<b<<c<<endl;
  callbypointer(&a,&b,&c);
  cout<<a<<b<<c<<endl;
  callbyreference(a1,b1,c1);
  cout<<a<<b<<c<<endl;
 }
9、给出以下程序运行的结果  
 #include<iostream.h>
 void ast(int x,int y,int *cp,int *dp)
 
  *cp=x*y; 
  *dp=x%y; 
 }
 void main()
 
  int a,b,c,d;
  a=2; b=3;
  ast(a,b,&c,&d);
  cout<<c<<d<<endl;
 }
10、给出以下程序运行的结果  
 #include <stdio.h>
 void main( )
 {
  int a=10,b=0,*pa, *pb;
  pa=&a; pb=&b;
  printf("%d,%d\n",a,b);
  printf("%d,%d\n",*pa,*pb);
  a=20; b=30;
  *pa=a++; *pb=b++;
  printf("%d,%d\n",a,b);
  printf("%d,%d\n",*pa,*pb);
  (*pa)++; 
  (*pb)++;
  printf("%d,%d\n",a,b);
  printf("%d,%d\n",*pa,*pb);
 }
答案:

 

二:填空题 
 1. 200
 2. p是一个指向函数的指针,该函数的返回值是一个整型
 3. 函数fun的返回值是一个通用型的指针
 4. 8 
  由于for语句就是求字符串的长度,所以可以知道i的结果是8
 5. 1int * 2*z
 6. 26
 7. *p=1 x=3 y=5
 8. 123
   321
   321
 9. 6 2
 10. 100
   100
   2131
   2131
   2232
   2232




三:简答和编程题
1. 判断执行下面的语句后,ab的值变为多少
 int *var, ab;
 ab=100; 
 var=&ab;
 ab=*var+10;


2.已知指针p的指向下图所示,则表达式*--p的值是多少?(这里,a[0],a[1],a[2]……仅作为连续存储单元的代号,a[0]在低地址,a[1]在高地址)。
    
 

3. 有定义:double var;那么,
 a) 使指针p可以指向double型变量的定义语句是什么?
 b) 使指针p指向变量var的赋值语句是什么?
 c) 通过指针p给变量var读入数据的scanf函数调用语句是什么?


4.写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。


5.编程实现:从键盘输入一任意字符串,然后,输入所要查找字符。存在则返回它第一次在字符串中出现的位置;否则,输出"在字符串中查找不到!。并实现对同一字符串,能连续输入所要查找的字符。


6.编程实现:从字符串中删除子字符串。从键盘输入一字符串,然后,输入要删除的子字符串。最后输出删除子串后的新字符串。


答案:

 

三、问答和编程题 

 1. 本例定义了两个变量,int型的变量ab和指向int型的指针变量var;语句var=&ab;是将ab的地址赋给了var,在下一条语句中,*var 表示var所指单元的内容,即100。然后,将*var+10赋给了变量ab;那么,这时ab的值应该是110。 
 2.根据运算符的优先级,表达式*--p=*(--p)。所以,先执行--p操作,使指针p向低地址方向移动一个存储单元,指向a[1]。然后用运算符"*"取得该地址所存储的数据,即20

 3.(1)要求把p定义成指向double型的指针变量即可,所以定义语句是:double *p;
  (2)要使p指向变量var,即将var的地址赋给指针p,赋值语句为:p=&var;
  (3)用scanf函数把读入的数据赋给变量var的语句是:scanf("%lf",&var);由于(2)中已将var的地址赋给了p,所以该语句等价于scanf("%lf",p);

 4.程序为:
 #include <stdio.h>
 int length(char* a);
 void main( )
 {
  int len;
  char str[20];
  printf("请输入一个字符串:");
  scanf("%s",str);
  len=length(str);
  printf("字符串长度为%d",len);
  return;
 }
 int length(char* a)/*求字符串长度函数*/
 {
  char *p;
  p=a;
  int n;
  n=0;

  while(*p!='\0')
  {
   n++;
   p++;
  }
  return(n);
 }

 5.程序为:
 #include<iostream.h>
 char *strchr( char *string,int letter)
 {
  while((*string!=letter)&&(*string))
   string++;
  return string;
 }
 void main()
 {
  int tt=1;
  while(tt){
   char title[64];
   cout<<"请输入一字符串:";
   cin>>title;
   char *p;
   cout<<"请输入你想查找的字符: ";
   char ch;
   cin>>ch;
   p=strchr(title,ch);
   if(*p)
    cout<<"所查字符在字符串中第一次出现的位置为: "<<p-title<<endl;
   else
    cout<<"在字符串中没有所查字符!"<<endl;
    cout<<"do u cunteue!1--counte,0--exit"<<endl;
    cin>>tt;
   }
 }

 6.程序为:
 #include<string.h>
 #include<iostream.h>
 char* strstr_rep(char *source,char *old)
 {
  int i,j,k,loc=-1;
  for(i=0;source&&(loc==-1);i++)
   for(j=i,k=0;source[j]==old[k];j++,k++)
    if(!old[k+1])
     loc=i;
    if(loc!=-1)
    {
     for(k=0;old[k];k++);
     for(j=loc,i=loc+k;source;j++,i++)
      source[j]=source;
      source=NULL;
    }
    return(source);
 }
 void main()
 {
  char a[50];
  cout<<"请输入一字符串:";
  cin>>a;
  char b[30];
  cout<<"请输入上字符串的一个子串:";
  cin>>b;
  cout<<strstr_rep(a,b)<<endl;
 


8张 结构与链表

一:选择题
1.当说明一个结构变量时,系统分配给它的内存是( )
a. 各成语所需内存量的总和
b. 结构中第一个成员所需内存量
c. 成员中占内存量最大的成员所需的容量
d. 结构中最后一个成员所需内存量

2.下面四个运算符中,优先级最低的是( )
a. ()
b. 
c. ->
d. ++

3.选择下面程序的运行结果。 ( )
 #include <stdio.h>
 struct cmplx
 {
  int x;
  int y;
 }cnum[2]={1,3,2,7};
 int main( )
 {
  printf("%d\n",cnum[0].y*cnum[1].x);
  return 0;
 }
a. 0
b. 1
c. 3
d. 6

4.已知:
 struct sk
 { int a;
  float b;
 }data,*p;
 若有p=&data,则对data中的成员a的正确引用是( )
a. (*p).data.a 
b. (*p).a 
c. p->data.a
d. p.data.a

5.设有以下定义和语句,
 struct student
 { int num,age;
 };
 struct student stu[3]={{2001,20},{2001,21},{2001,19}};
 struct studeng *p=stu;
 则以下错误的引用是( )
a(p++)->num
bp++
c(*p).num
dp=&stu.age

6.设有以下说明语句,
 stuct ex
 { int x; float y; char z;}example;
 则下面的叙述中不正确的是( )
a.struct是结构类型的关键字
b.example是用户定义的结构类型名
c.x,y,z都是结构成员名
d.struct ex是用户定义的结构类型

7. 有以下定义和语句,则以下引用形式非法的是( )
 struct s
 { int i1;
  s *i2,*i0;
 };
 static s a[3]={2,&a[1],NULL,4,&a[2],&a[0],6,NULL,&a[1]};
 static s *ptr;
 ptr=a;
a.ptr->i1++
b.*ptr->i2
c.++ptr->i0
d.*ptr->i1

8.设有以下语句:
 struct st
 { int n;
  st *next;
 };
 static st a[3]={5,&a[1],7,&a[2],9,NULL},*p;
 p=&a[0];
 则以下表达式值为6的是( )
a.p++->n
b.++p->n
c.(*p).n++
d.p->n++

9.在对typedef的叙述中错误的是( )
a.typedef可以定义各种类型名,但不能用来定义变量
b.typedef可以增加新类型
c.typedef只是将已存在的类型用一个新的标识符来代表
d.使用typedef有利于程序的通用和移植

10.选择下面程序的运行结果是( )
 #include <iostream.h>
 struct stu
 { int num; 
  char name[10];
  int age;
 };
 void fun(stu *p)
 { cout<<(*p).name<<endl; }
 main()
 { stu students[3]={{9801,"Zhang",20},
  {9802,"Long",21},
  {9803,"Xue",19}};
  fun(students+2);
 }
a.Zhang
b.Xue
c.Long
d.18 

答案:

 

一:选择题:

 1. A 
 2. D 
 3. D 
 4. B 
 5. D 
 6. B 
 7. D 
 8. B 
 9. B 
 10. B





二:填空题
1、 有以下说明和定义语句,请给结构变量w赋初值,使w.a的值为7w.b指向a数组的首地址。
  double a[5];
  struct exp{ int a; double *b;}w={  ,  };
2、下面程序的输出是  .
 struct two
 { int x, *y ; }*p;
  int a[8]={1,2,3,4,5,6,7,8};
  two b[4]={100,&a[1],200,&a[3],10,&a[5],20,&a[7]};
 main()
 { p=b;
  printf("%d\n",++(p->x));
 }
3、有以下定义和语句,则表达式++ptr->i的值为  .
 struct s
 { int i; 
  int *j;
 };
 int a[]={1,2,3,4,5,6};
 s a[3]={5,&a[1],7,&a[2],9,'\0'},*ptr;
 void main()
 
  ptr=&a[0];
  
 }
4、 以下程序用以输出结构变量ex所占存储单元的字节数,请填空。
 #include<stdio.h>
 struct st
 { char name[20]; double score; };
 void main()
 { st ex;
  printf("ex size:%d\n",  );
 }
5、已知:
 struct
 {
  int x,y;
 }s[2]={ {1,2},{3,4} },*p=s;
 则表达式++p->x的值为  ,表达式(++p->x的值为  
6、为了建立如下结点的链表,结点的正确描述形式是: 

 struct node
 { int data;
   ;
 }
7、 用typedef定义整型一维数组:
  typedef int ARRAY[10];
  则对整型数组a[10]b[10]c[10]可以定义为  .
8、下面程序的执行结果是  .
 #include <stdio.h>
 struct n_c
 {
  int x;
  char c;
 };
 main( )
 {
  struct n_c a={10,'x'};
  func(a);
  printf("%d%c",a.x,a.c);
  return 0;
 }
 void func(struct n_c b)
 {
  b.x=20;
  b.c='y';
 }

 

二:填空题
 1. (1) 7 (2) a
 2. 101
 3. 6
 4. sizeof(struct st)
 5. (1) 2 (2) 3
 6. node *next
 7. ARRAY a,b,c;
 8. 10 x





三:简答和编程题
1. 结构类型数据有什么特性,在什么场合下使用结构处理数据?


2. 定义结构变量和对结构变量进行初始化的时候应该注意些什么问题?


3. 链表是怎样的一种数据结构,它与数组有什么不同?链表的插入和删除是怎样实现的?


4. 阅读下面的程序,分析结构在其中的定义,使用,思考程序的输出结果。
 #include <iostream.h>

2  struct clock

3  {

4   int hour;

5   int minute;

6   int second;

7  }aClock;

8  void updata()

9  {

10   aClock.second++;

11   if(aClock.second==60)

12   {

13    aClock.second=0;

14    aClock.minute++;

15   }

16   if(aClock.minute==60)

17   {

18    aClock.minute=0;

19    aClock.hour++;

20   }

21   if(aClock.hour==24)

22    aClock.hour=0;

23  }

24  void display()

25  {

26   cout<<aClock.hour<<":"<<aClock.minute<<":"<<aClock.second<<endl;

27  }

28  void main()

29  {

30   aClock.hour=aClock.minute=aClock.second=0;

31   for(int i=0;i<10000;i++)

32   {

33    updata();

34    display();

35   }

36  }

 

5.编写一个函数day,该函数使用data结构作为参数,函数返回某日是这年的第几天。


6.有4个学生,每个学生包括学号,姓名,成绩。要求找出成绩最高者的姓名和成绩。

 

三、简答与编程题

 1. 结构类型是将一组数据类型定义为一个新的数据类型,常常有特殊的含义,用于在程序中表示和处理类似于学生纪录,日期等复杂的数据。因此,结构类型数据与一般的基本数据类型相比,它更加能够满足程序对处理复杂数据的需要。当程序中需要对一组不同类型的数据作为整体进行处理的时候,就要用到结构类型了。

 2. 结构类型在使用之前必须先进行定义,所以,定义结构变量必须出现在结构定义之后。可以在定义结构变量的时候初始化,也可以在后面的程序中通过整体赋值或对成员赋值进行初始化。对结构变量初始化的时候必须要符合结构类型定义的成员顺序及其类型。另外,如果一个结构类型内又嵌套了另一个结构类型,那么在初始化的时候,要依次对内部的结构变量各成员进行赋值。

 3. 链表是一种重要的数据结构,是一种动态分配内存的结构。相对来说,用数组不能实现动态存储。当用数组来进行数据存储时,必须事先确定固定的长度;而链表是一组结点的序列,每个结点是由系统存储到不同的地址空间的。它们之间的连接是由指针实现的。插入和删除一个结点是非常容易的,而且链表比数组能表示更复杂的数据类型。
插入和删除一个结点的基本方法就是,首先对链表进行遍历,找到需要插入的地方或需要删除的结点,然后改变相邻结点指针的连接关系就可以了。

 4. 该程序实现了一个时钟的显示。首先定义了一个结构clock,包括三个整形成员hour,minute,second来表示时间,并且定义了clock型的变量aClock。在主程序中,首先对aClock各成员赋值,然后循环10000次,每次循环调用一次子函数updata()display(),用来计时和显示时间。
  程序的输出结果是:
  001
  002
  003
  004
  .
  .
  .
  0059
  010
  011
  .
  .
  .
  05959
  100
  .
  .
  .
  24640

 5.答:

37  #include <iostream.h>

38  struct data

39  {

40   int maths;

41   int days;

42  }

43  void day(data dd)

44  {

45   int dayth;

46   switch(dd.maths)

47   {

48    case 1:

49     dayth=31;

50     break;

51    case 2:

52     dayth=31+28;

53     break;

54    case 3:

55     dayth=31+28+31;

56     break;

57    case 4:

58     dayth=31+28+31+30;

59     break;

60    case 5:

61     dayth=31+28+31+30+31;

62     break;

63    case 6:

64     dayth=31+28+31+30+31+30;

65     break;

66    case 7:

67     dayth=31+28+31+30+31+30+31;

68     break;

69    case 8:

70     dayth=31+28+31+30+31+30+31+31;

71     break;

72    case 9:

73     dayth=31+28+31+30+31+30+31+31+30;

74     break;

75    case 10:

76     dayth=31+28+31+30+31+30+31+31+30+31;

77     break;

78    case 11:

79     dayth=31+28+31+30+31+30+31+31+30+31+30;

80     break;

81    case 12:

82     dayth=31+28+31+30+31+30+31+31+30+31+30+31;

83     break;

84   }

85   dayth=dayth+dd.days;

86   cout<<"the day of the date is:"<<dayth;

87  }

88  int main()

89  {

90   data d;

91   cout<<"input the maths:"<<endl;

92   cin<<d.maths; 

93   cout<<"input the date:"<<endl;

94   cin<<d.days;

95   day(d);

96   return 0;

97  }

 

6. 分析:可以把学生定义为结构类型,包括学号,姓名和成绩等成员。
 程序为:

98  #include <stdio.h>

99  int main( )

100  {

101   struct student

102   {

103    int num;

104    char name[20];

105    float score;

106   };

107   struct student stu[4];

108   struct student *p;

109   int i,temp=0;

110   float max;

111   for(i=0;i<4;i++)

112    scanf("%d%s%f",&stu.num,&stu.name,&stu.score); 

113   for(max=stu[0].score,i=1;i<4;i++)

114    if (stu.score>max)

115    { max=stu.score; temp=i; }

116    p=stu+temp;

117   printf("\n The maximum score:\n");

118   printf("No.:%d\n name:%s\n score:%4.1f\n",p->num, p->name, p->score);

119   return 0;

120  }

 

 


9章 编译预处理

一:选择题

1.从下面的选项中选出正确的答案在宏定义:#define MAXINT 324中,宏名MAXINT代替的是:
a. 实型数
b. 整型数
c. 常量
d. 一串字符
2.分析下列叙述是正确的:
a. 在带参的宏定义中,形式参数是变量。
b. 在带参的宏定义中,形式参数是变量。
c. 宏替换不占用运行时间。
d. 在带参的宏定义中,要定义其形式参数的类型。
3.一个C++程序开始执行的位置是:
a. 程序开头
b. 预编译
c. main函数
d. 以上答案都不正确
4.下列叙述正确的是:
a. 一个程序中可以有多个#include命令行
b. 在#include命令行中,用双引号和用尖括号将被包含的文件名括起来没有区别
c. #include命令行只能放在程序开始位置
d. #include命令后也必须以分号结束
5.以下叙述不正确的是:
a. C++语言中,编译预处理命令行总以"#"开头
b. 编译预处理命令行可以根据需要出现在程序的任何一行的开始位置
c. C++编译中的编译预处理可以看作一行C++语句
d. C++中的预处理是在程序运行之前进行的
6.预处理命令在程序中都是以以下哪个符号开头的。
a.*
b.#
c.
d./
7. 文件包含中被包含的文件的扩展名。
a.必须为 .h 
b.不能用 .h
c.必须是 .c
d.不一定是 .h
8.带参数的宏定义中,程序中引用宏定义的参数是。
a.只能是常量
b.只能是整型量
c.只能是整型表达式
d.可以是任意表达式
9.在宏定义#define PI 3.1415926中,用宏名PI代替是一个。
a.单精度数
b.双精度数
c.常量
d.字符串
10.以下对头文件叙述不正确的是。
a. 头文件可以自己编写。
b. 头文件可以系统提供。
c. 既可以自己编写,也可以系统提供。
d. 以上都不对。 

答案:

 

一:选择题:

 (1) d
 (2) c
 (3) c
 (4) a
 (5) c
 (6) b
 (7) d
 (8) d
 (9) d
 (10) d



二、简答与编程题:

1. 写出下面程序的输出结果:
  #include "iostream.h"
  #define PR(a) cout<<a
  #define PRINT1(a) PR(a);cout<<endl
  #define PRINT2(a,b) PR(a);PRINT1(b)
  void main()
  {
   int k;
   for(k=0;k<=100;k+=50)
    PRINT2(k,k+12.4);
  }


2. 写出下面程序的输出结果:
  #include<iostream.h>
  #define CIR(r) r*r
  void main()
  {
   int x=1;
   int y=2;
   int z;
   z=CIR(x+y);
   cout<<z<<endl;
  }


3. 写出下面程序的输出结果:
  #include <iostream.h>
  #define TEST
  void main()
  {
   int x=0;
   int y=1;
   int z=1;
   #ifdef TEST
   cout<<x<<y;
   #endif
   cout<<z;
  }


4. 下列程序执行时输入5,给出运行结果。
  #include<iostream.h>
  #define N -2
  void main()
  {
   int n;
   cin>>n;
   #if N>0
   cout<<"1"<<endl;
   #else
   cout<<"-1"<<endl;
   #endif
   #ifdef EOF
   cout<<EOF<<endl;
   #endif
  }


5.设有宏定义如下:
 #define N 3
 #define Y(n) ((N+1)*n)
 则执行语句:z=2*(N+Y(5+1));后,z的值是多少?


6.编写一个宏定义DIGIT(c),用来判断c是不是数字字符,如果是得1,不是得0

 

二、简答与编程题:
 1、答:在本题中,程序中共定义了三个带参数的宏,且后两个宏定义的替换文本中又包含前面定义过的宏;程序中的输出语句不仅是用宏名表示的,而且还放在了循环语句中。事实上,只要按照宏替换的原则将宏名一步步展开,分析出结果并不困难。下面依次给出语句PRINT2(k,k+12.4);的宏替换结果:
  首先将宏PRINT2用对应的"替换文本"替换,并用实参k替换形参a,用实参k+12.4替换形参b,得到
  PR(k);PRINT1(k+12.4);
  替换后的语句中又出现了两个宏PRPRINT1。若先将PRINT1展开,以上语句变为:
  PR(k);PR(k+12.4);cout<<endl;
  最后将PR宏展开,得到: 
  cout<<k;cout<<k+12.4;cout<<endl;
  这时可以清楚的看出:原本一条语句PRINT2(k,k+12.4);经宏替换后变成了三条语句。由于for循环中没有使用复合语句,所以只有第一条语句cout<<k;属于for循环体,后两条语句要等执行完循环体后才执行。
  根据for语句中的条件可知,循环体将执行3次,k的取值依次为050100,每输出完一项并不换行,而是用一个逗号分隔。退出for循环后,k的值为150。执行语句cout<<k+12.4;时,输出162.4,然后执行语句cout<<endl;实现换行,因此本题的答案应该是:
  050100162.4

 2、答:本题输出的结果是变量z的值,也就是要求出对CIR(x+y)进行宏替换后表达式的值。按照宏定义应该用替换文本r*r代替宏,并用实参x+y代替形参r,从而替换为:x+y*x+y。再将x=1,y=2代入表达式得到1+2*1+2,计算所得的结果为5,显然变量z的值,也就是本程序输出的结果为5
  通过本题我们应该体会到:宏替换是纯粹的文本串的替换。在定义替换文本时,形参r两侧没有加括号,替换后实参x+y两侧也不能有括号。从而先进行y*x的运算,而不是(1+2)*(1+2)的求(x+y)的平方的运算。因此,在进行宏定义的时候要注意括号的使用。 

 3、答:输出结果为"011"

 4、答:
  -1
  -1

 5、答:赋值语句z=2*(N+Y(5+1));中引用了两个宏名。为了求得z的值,必须分析宏替换后的结果。按照宏替换的原则,首先将带参的宏Y(5+1)展开:用"替换文本"来替换宏,用实参5+1代替宏定义中的形参n(注意区分大小写字母)。从而有语句:
  z=2*(3+((3+1)*5+1));
  赋值号右侧的表达式计算结果为48,即z的值为48

 6、答:判断是不是字符可以用ASCII码值进行关系比较,并且数字字符'0'-'9'ASCII是有序排列的,因此判断是不是数字字符可以转化为判断是否在'0''9'的区间内。
  定义如下:
  #define DIGIT(c) (((c)>='0')&&((c)<='9')?1:0

10章  类与对象

一:选择题
1.在下列关键字中,用于说明类中公有成员的是__.
a. public
b. private
c. protected
d. friend
2.下列的各函数中, ___不是类的成员函数.
a. 构造函数
b. 析构函数
c. 友元函数
d. 复制构造函数
3___不是构造函数的特征。
a. 构造函数的函数名与类名相同
b. 构造函数可以重载
c. 构造函数可以设置缺省参数
d. 构造函数必须指定类型说明
4___是析构函数的特征。
a. 一个类中只能定义一个析构函数
b. 析构函数在对象创建时调用
c. 析构函数的定义只能在类体内
d. 析构函数可以有一个或多个参数
5.关于成员函数特征的下述描述中,___是错误的。
a.成员函数一定是内联函数
b.成员函数可以重载
c.成员函数可以设置参数的缺省值
d.成员函数可以是静态的
6.复制构造函数的形参是___
a.某个对象名
b.某个对象的成员名
c.某个对象的引用名
d.某个对象的指针名
7.如果编程者没有显式定义构造函数(包括复制构造函数),C++编译器就___
a.出现编译错误
b.没有构造函数
c.必须显示定义
d.隐式定义缺省的构造函数
8.静态成员函数仅能访问___
a.静态的数据成员
b.非静态的成员函数
c.非静态的数据成员
d.以上都不对
9.静态数据成员的初始化必须在___
a.类内
b.类外
c.在构造函数内
d.静态成员函数内
10.友元作用___
a.提高程序的运用效率
b.加强类的封装性
c.实现数据的隐藏性
d.增加成员函数的种类 

答案:

 

一:选择题:

 1. A 
 2. C 
 3. D 
 4. A 
 5. A 
 6. C 
 7. D 
 8. A 
 9. B 
 10. A




二:判断题
1. 使用关键字class定义的类中缺省的访问权限是私有(private)的。  
2. 构造函数和析构函数都不能重载。  
3. 说明或定义对象时,类名前不需加class关键字。  
4. 可以在类的构造函数中对静态数据成员进行初始化。  
5. rotectedprivate区别在于:protected成员可以被派生类访问,而private成员则不能被派生类访问。  

 

二:判断题
 1. 对 
 2. 错 
 3. 对 
 4. 错 
 5. 




三、编程实现
1. 创建一个类,具有publicprivateprotected数据成员和函数成员。创建该类的一个对象,看看试图存取所有的类成员时会得到一些什么信息。编写一个全局friend函数来访问该类的私有数据成员。


2. 创建一个没有任何构造函数的类,显示可以用缺省的构造函数创建对象。然后为该类创建一个非缺省的构造函数(带一个参数),试着在编译一次,解释发生的现象。


3. 建立一个类,该类包含const成员函数和非const成员函数,然后建立这个类的const和非const对象。分别为这两种类型的对象调用两种成员函数,解释发生的现象。


4. 利用静态数据成员的概念,编写一个类,可以统计目前存在多少个该类的对象。


5. 列举调用复制构造函数的三种情况。


6. 编写几何点(二维平面上)的类Point,包括位置属性(二维坐标xy),成员函数包括点的位置获取函数GetX()和GetY(),点的位置设置函数SetX()和SetY(),和点的位置移动函数MoveTo()以及点的信息打印函数Display()。

7. 编写几何图形圆的类Circle,包括两个属性:圆心O(用上题中的Point类实现)和半径R。成员函数包括:圆心位置获取函数GetO()和半径获取函数GetR();半径位置设置函数SetR();圆的位置移动函数MoveTo();圆的半径设置函数SetR();以及圆的信息打印函数Display()。

8. 编写复数类Complex。实现各种常用构造函数,实现整数、实数向复数的转化函数,实现整数、实数和复数以及复数之间的加、减、乘、除各种运算,实现==、!=等逻辑运算。

 

1 三、编程实现

3  1. 参考程序如下:

4  #include <iostream.h> 

5  class C

6  {

7  private:

8   int private_data;

9   void private_method()

10   {

11    cout<<"I am private method"<<endl;

12   }

13  protected:

14   int protected_data;

15   void protected_method()

16   {

17    cout<<"I am protected method"<<endl;

18   }

19  public:

20   int public_data;

21   void public_method()

22   {

23    cout<<"I am public method"<<endl;

24   }

25  C()

26  {

27   private_data = 0;

28   protected_data = 1;

29   public_data = 2;

30  }

31 

32  friend void friendFunction(C c);

33  };

34  void friendFunction(C c)

35  {

36   c.private_method();

37   c.protected_method();

38   cout<<"c.private_data = "<<c.private_data<<endl;

39   cout<<"c.protected_data = "<<c.protected_data<<endl;

40  }

41  void main()

42  {

43   C c;

44   // Error: c.private_method();

45   // Error: c.protected_method;

46   // Error: cout<<c.private_data<<endl;

47   // Error: cout<<c.protected_data<<endl;

48   friendFunction(c);

49  }

50 

51   说明:上述main()函数中注释起来的语句是普通函数访问对象cprivate成员和proctected成员,它们,不能通过编译器。例如,Visual C++6.0 编译器将产生这样的出错信息:

52   cannot access private member declared in class 'C'

53 或者

54   cannot access protected member declared in class 'C'

55 然而, 利用声明为类C的友元的friendFunction()函数,就可以实现对于私有成员的访问。

56   程序输出结果如下:

57   I am private method

58   I am protected method

59   c.private_data = 0

60   c.protected_data = 1

61 

62  2.参考程序如下:

63  #include <iostream.h>

64  class C

65  {

66  public:

67   //C(char a){}

68   void Display()

69   {

70    cout<<"hello world!"<<endl;

71   }

72  };

73 

74  void main()

75  {

76   C c;

77   c.Display();

78  }

79   说明:上述程序可以编译通过,程序输出结果如下: 

80   hello world!

81   说明main()函数中C c;代码行调用了类C的缺省调用函数。

82   但是,如果我们将注释行的注释去掉,实际上就是给类C加入一个带有一个参数的构造函数,则编译不能通过,Visual C++ 6.0编译器显示下列出错信息:

83   no appropriate default constructor available

84   因为我们已经建立了一个构造函数,所以编译器不再建立缺省的构造函数,C c;代码行也就不能再通过编译了。

85 

86 3.参考程序如下:

87  #include <iostream.h>

88 

89  class C

90  {

91  private:

92   int i;

93  public:

94 

95   C():i(0){}

96   ~C(){}

97 

98   int getI()const

99   {

100    return this->i;

101   }

102 

103   void setI(int i)

104   {

105    this->i = i;

106   }

107  };

108 

109  void main()

110  {

111   C noConstC;

112   const C constC;

113 

114   cout<<noConstC.getI()<<endl;

115   noConstC.setI(1);

116   cout<<noConstC.getI()<<endl;

117 

118   cout<<constC.getI()<<endl;

119   // Error: constC.setI(1);

120   cout<<constC.getI()<<endl;

121  }

122   说明:上述代码编译可以通过,如果加入注释行,则程序不能编译通过, Visual C++ 6.0编译器显示下面的信息:

123   cannot convert 'this' pointer from 'const class C' to 'class C &'

124   这是由于新加入的代码涉及到常量对象调用非cosnt成员函数引起的。 

125   下表显示了变量和函数的调用关系:   const成员函数 非const成员函数 

126 const对象 可以调用 不可以调用 

127 非const对象 可以调用 可以调用 

128 

129 

130  4.参考程序如下:

131  #include <iostream.h>

132 

133  class ObjectCounter

134  {

135  public: 

136   ObjectCounter(char ch)

137   {

138    counter++;

139    name = ch;

140    cout<<"Object "<<name<<" comes into being"<<endl;

141   }

142   ~ObjectCounter()

143   {

144    counter--;

145    cout<<"Object "<<name<<" dies out"<<endl;

146   }

147   static int counter;

148   void printCounter()

149   {

150    cout<<name<<" say: Now CLASS ObjectCounter has "<<counter<<" objects altogether!"<<endl;

151   }

152  private:

153  char name;

154  };

155  int ObjectCounter::counter = 0;

156  void main()

157  {

158   ObjectCounter* oc1;

159   ObjectCounter* oc2;

160   ObjectCounter* oc3;

161 

162   oc1 = new ObjectCounter('1');

163   oc1->printCounter();

164   oc2 = new ObjectCounter('2');

165   oc1->printCounter();

166   oc2->printCounter();

167   oc3 = new ObjectCounter('3');

168   oc1->printCounter();

169   oc2->printCounter();

170   oc3->printCounter();

171 

172   delete oc3;

173   oc1->printCounter();

174   oc2->printCounter();

175   delete oc2;

176   oc1->printCounter();

177   delete oc1;

178  }

179  说明:程序输出结果如下:

180  Object 1 comes into being

181  1 say: Now CLASS ObjectCounter has 1 objects altogether!

182  Object 2 comes into being

183  1 say: Now CLASS ObjectCounter has 2 objects altogether!

184  2 say: Now CLASS ObjectCounter has 2 objects altogether!

185  Object 3 comes into being

186  1 say: Now CLASS ObjectCounter has 3 objects altogether!

187  2 say: Now CLASS ObjectCounter has 3 objects altogether!

188  3 say: Now CLASS ObjectCounter has 3 objects altogether!

189  Object 3 dies out

190  1 say: Now CLASS ObjectCounter has 2 objects altogether!

191  2 say: Now CLASS ObjectCounter has 2 objects altogether!

192  Object 2 dies out

193  1 say: Now CLASS ObjectCounter has 1 objects altogether!

194  Object 1 dies out

195 

196  5.解答:

197  构造函数被调用通常发生在以下三种情况,第一种情况就是用一个对象初始化另一个对象时,比如c2 = c1;第二种情况是当对象作函数参数,实参传给形参时;第三种情况是程序运行过程中创建其它临时对象时。

198 

199  6.参考程序如下:

200  #include <iostream.h>

201 

202  class Point

203  {

204  private:

205   int X;

206   int Y;

207  public:

208   Point(int X, int Y)

209   {

210    this->X = X;

211    this->Y = Y;

212   }

213   Point()

214   {

215    this->X = 0;

216    this->Y = 0;

217   }

218   ~Point(){}

219 

220   int GetX()const

221   {

222    return this->X;

223   }

224   int GetY()const

225   {

226    return this->Y;

227   }

228 

229   void SetX(int X)

230   {

231    this->X = X;

232   }

233   void SetY(int Y)

234   {

235    this->Y = Y;

236   }

237 

238   void MoveTo(int X, int Y)

239   {

240    SetX(X);

241    SetY(Y);

242   }

243   void Display()const

244   {

245    cout<<"X: "<<GetX()<<endl;

246    cout<<"Y: "<<GetY()<<endl;

247   }

248  };

249 

250  void main()

251  {

252   Point p(100,100);

253 

254   p.Display();

255 

256   p.MoveTo(200,200);

257 

258   cout<<"after moving"<<endl;

259 

260   p.Display();

261  }

262 

263  程序输出结果如下:

264  X: 100

265  Y: 100

266  after moving

267  X: 200

268  Y: 200

269 

270  7.参考程序如下:

271  #include <iostream.h>

272 

273  class Point

274  {

275  private:

276   int X;

277   int Y;

278  public:

279   Point(int X, int Y)

280   {

281    this->X = X;

282    this->Y = Y;

283   }

284   Point()

285   {

286    this->X = 0;

287    this->Y = 0;

288   }

289   ~Point(){}

290 

291   int GetX()const

292   {

293    return this->X;

294   }

295   int GetY()const

296   {

297    return this->Y;

298   }

299 

300   void SetX(int X)

301   {

302    this->X = X;

303   }

304   void SetY(int Y)

305   {

306    this->Y = Y;

307   }

308 

309   void MoveTo(int X, int Y)

310   {

311    SetX(X);

312    SetY(Y);

313   }

314   void Display()const

315   {

316    cout<<"X: "<<GetX()<<endl;

317    cout<<"Y: "<<GetY()<<endl;

318   }

319  };

320 

321  class Circle

322  {

323  private:

324   Point O;

325   int R;

326  public:

327   Circle(Point& p, int R)

328   {

329    O.MoveTo(p.GetX(),p.GetY());

330 

331    this->R = R;

332   }

333   ~Circle(){}

334 

335   Point GetO()const

336   {

337    return this->O;

338   }

339   int GetR()const

340   {

341    return this->R;

342   }

343 

344   void MoveTo(Point& p)

345   {

346    O.MoveTo(p.GetX(), p.GetY());

347   }

348   void SetR(int R)

349   {

350    this->R = R;

351   }

352 

353   void Display()

354   {

355    cout<<"Circle: ("<<O.GetX()<<","<<O.GetY()<<"),"<<R<<endl;

356   }

357  };

358 

359  void main()

360  {

361   Point p(100,100);

362   Point p2(200,200);

363   Circle c(p, 100);

364   c.Display();

365 

366   c.MoveTo(p2);

367   cout<<"after moving"<<endl;

368   c.Display();

369 

370   c.SetR(200);

371   cout<<"after altering r"<<endl;

372   c.Display();

373  }

374  程序输出结果如下:

375  Circle: (100,100),100

376  after moving

377  Circle: (200,200),100

378  after altering r

379  Circle: (200,200),200

380 

381  8.参考程序如下:

382  #include <iostream.h>

383 

384  class Complex

385  {

386   double R;

387   double I;

388  public:

389   Complex(double R = 0.0, double I = 0.0)

390   {

391    this->R = R;

392    this->I = I;

393   }

394   ~Complex(){}

395 

396   /* copy constructor function */

397   Complex(const Complex& c)

398   {

399    this->R = c.R;

400    this->I = c.I;

401   }

402 

403   /* (+ - * /) */

404   friend const Complex operator+(const Complex& a, const Complex& b);

405   friend const Complex operator-(const Complex& a, const Complex& b);

406   friend const Complex operator*(const Complex& a, const Complex& b);

407   friend const Complex operator/(const Complex& a, const Complex& b);

408 

409   /* - */

410   friend const Complex operator-(const Complex& a);

411 

412   /* == != */

413   friend bool operator==(const Complex& a, const Complex& b);

414   friend bool operator!=(const Complex& a, const Complex& b);

415 

416   friend ostream& operator<<(ostream& out, const Complex& c);

417  };

418 

419  /* + overloading */

420  const Complex operator +(const Complex& a, const Complex& b)

421  {

422   Complex c;

423 

424   c.R = a.R + b.R;

425   c.I = a.I + b.I;

426 

427   return c;

428  }

429 

430  /* - overloading */

431  const Complex operator -(const Complex& a, const Complex& b)

432  {

433   Complex c;

434 

435   c.R = a.R - b.R;

436   c.I = a.I - b.I;

437 

438   return c;

439  }

440  /* * overloading */

441  const Complex operator *(const Complex& a, const Complex& b)

442  {

443   Complex c;

444 

445   c.R = (a.R * b.R) - (a.I * b.I);

446   c.I = (a.R * b.I) + (a.I * b.R);

447 

448   return c;

449  }

450  /* / overloading */

451  const Complex operator /(const Complex& a, const Complex& b)

452  {

453   Complex c;

454   double temp;

455 

456   temp = b.R*b.R + b.I*b.I;

457 

458   if(temp == 0)

459   {

460    c.R = 0; c.I = 0;

461    return c;

462   }

463 

464   c.R = (a.R*b.R + a.I*b.I) / temp;

465   c.I = (a.I*b.R - a.R*b.I) / temp;

466 

467   return c;

468  }

469 

470  /* - overloading */

471  const Complex operator -(const Complex& a)

472  {

473   Complex c;

474 

475   c.R = - a.R;

476   c.I = - a.I;

477 

478   return c;

479  }

480 

481  /* == overloading */

482  bool operator==(const Complex& a, const Complex& b)

483  {

484   if((a.I == b.I) && (a.R == b.R))

485   {

486    return true;

487   }else

488   {

489    return false;

490   }

491  }

492 

493  /* != overloading */

494  bool operator!=(const Complex& a, const Complex& b)

495  {

496   if((a.I == b.I) && (a.R == b.R))

497   {

498    return false;

499   }else

500   {

501    return true;

502   }

503  }

504 

505  /* ostream overloading */

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

507  {

508   out<<"("<<c.R<<")"<<"+"<<"("<<c.I<<")"<<"i";

509 

510   return out;

511  }

512 

513  void main()

514  {

515   Complex a(1);

516   Complex b(1, 2);

517   Complex c;

518   double da = 100.0;

519   int ia = 99;

520 

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

522   cout<<"b = "<<b<<endl;

523   cout<<"da = "<<da<<endl;

524   cout<<"ia = "<<ia<<endl;

525 

526   c = a + b;

527   cout<<"c = a + b = "<<c<<endl;

528 

529   c = a - b;

530   cout<<"c = a - b = "<<c<<endl;

531 

532   c = a * b;

533   cout<<"c = a * b = "<<c<<endl;

534 

535   c = a / b;

536   cout<<"c = a / b = "<<c<<endl;

537 

538   c = -a;

539   cout<<"c = -a = "<<c<<endl;

540 

541   c = da;

542   cout<<"c = da = "<<c<<endl;

543 

544   c = ia;

545   cout<<"c = ia = "<<c<<endl;

546 

547   c = a * da;

548   cout<<"c = a * da = "<<c<<endl;

549 

550   c = a * ia;

551   cout<<"c = a * ia = "<<c<<endl;

552 

553   c = a / da;

554   cout<<"c = a / da = "<<c<<endl;

555 

556   c = a / ia;

557   cout<<"c = a / ia = "<<c<<endl;

558 

559   c = a + da;

560   cout<<"c = a + da = "<<c<<endl;

561 

562   c = a + ia;

563   cout<<"c = a + ia = "<<c<<endl;

564 

565   c = a - da;

566   cout<<"c = a - da = "<<c<<endl;

567 

568   c = a - ia;

569   cout<<"c = a - ia = "<<c<<endl;

570 

571   if(c == a)

572   {

573    cout<<"c == a"<<endl;

574   }

575   if(c != a)

576   {

577    cout<<"c != a"<<endl;

578   }

579 

580   if(c == da)

581   {

582    cout<<"c == da"<<endl;

583   }

584   if(c != da)

585   {

586    cout<<"c != da"<<endl;

587   }

588 

589   c = ia;

590   cout<<"c = ia = "<<c<<endl;

591   if(c == ia)

592   {

593    cout<<"c == ia"<<endl;

594   }

595   if(c != ia)

596   {

597    cout<<"c != ia"<<endl;

598   }

599  


11章   继承与多态

一:填空题
1. A继承类B,则A称为B的  ,B称为A的  。 
2. 一个派生类继承多个基类称为  。 
3. 三种继承访问说明符是:  、  、  ,如果基类的公有函数到继承类中仍是公有函数,应该使用  继承方式。 
4.  、  和  是不能被派生类继承的。 
5. 派生类中对基类的成员函数f进行覆盖,如果调用基类的成员f应该使用  。
6. 多态也称为  或  ,在C++中是通过  实现的。 
7. 通过在虚函数参数表后加  ,我们可以定义纯虚函数。含有纯虚函数的类我们称为  。 
8. C++中,构造函数和析构函数,  不能定义为虚函数,  可以定义为虚函数。 
9. 要达到动态联编的效果,基类和派生类的对应函数不仅名字相同,而且返回类型、参数  和  也必须相同。 
10.C++编译器不允许用抽象类创造对象,它只能被其它类  。  

答案:

 

填空题

 1. 派生类 基类
 2. 多继承
 3. public private protected public
 4. 构造函数、析构函数、operator
 5. 域运算符
 6. 动态联编或迟后联编、虚函数
 7. 0、抽象类
 8. 构造函数 析构函数
 9. 个数 类型
 10. 继承




二、判断题
1. 创建派生类对象时,先调用基类的构造函数,再调用派生类的构造函数,当销毁这个对象时顺序正好相反,先调用派生类的析构函数,再调用基类的析构函数。  
2. 无论何时编译器都为类构造一个无参数的缺省的构造函数。  
3. 无论什么方式的继承,基类的私有成员都不能被派生类访问。  
4. 基类中定义了虚函数,在派生类中相应函数会自动变成虚函数。  
5. 要达到动态联编的效果,基类和派生类的对应函数不仅名字相同,而且返回类型、参数个数和类型也必须相同。  
6. 如果派生类没有实现虚函数,那么它将使用他的基类的虚函数。  
7. 如果抽象类的虚函数在基类中被实现,我们就可以用它创建对象。  
8. 我们不能用抽象类定义对象,但可以定义对象的指针。  
9. 构造函数和析构函数可以是虚函数。  
10. 虚析构函数的工作过程与普通虚函数不同,普通虚函数只是调用相应层上的函数,而虚析构函数是先调用相应层上的析构函数,然后逐层向上调用基类的析构函数。  

答案:

 

判断题

 1. 
 2. 
 3. 
 4. 
 5. 
 6. 
 7. 
 8. 
 9. 
 10. 




三、简答题
1.实现一个类A,在A中有两个私有的整型变量ab,定义构造函数对ab进行初始化,并实现成员函数geta()取得a的值和getb()取b的值。实现类BA继承,覆盖geta(),使其返回a2倍。


2.在上题中类AB的构造函数和析构函数中加入输出语句,观察构造函数和析构函数的调用顺序。


3.在上题中定义一个基类A的指针,使他指向派生类B的对象,使用A的指针调用geta()函数,观察结果。


4.将类Ageta()定义为虚函数,重复第五题,观察结果。


5.生成一个Object抽象类,在其中声明CalArea()、IsIn()纯虚函数,从Object派生出Rect类、Circle类,实现这些函数。

 

三、简答题

 1.源程序
 class A
 {
  int a;
  int b;
 public:
  A(int m,int n):a(m),b(n) {}
  int geta() {return a; }
  int getb() {return b; }
 }; 
 class B :public A
 {
 public:
  B(int m,int n):A(m,n) {}
  int geta() {return A::geta()*2; }
 };

 void main()
 {
  B b(2,2);
  b.geta();
 }

 2、源程序
 #include "iostream.h"
 class A
 {
  int a;
  int b;
 public:
  A(int m,int n):a(m),b(n) { cout<<"A created"<<endl; }
  int geta() {return a; }
  int getb() {return b; }
  ~A() {cout<<"A destroyed"<<endl; }
 };

 class B :public A
 {
 public:
  B(int m,int n):A(m,n) { cout<<"B created"<<endl;}
  int geta() {return A::geta()*2; }
  ~B() {cout<<"B destroyed"<<endl; }
 };

 void main()
 {
  B b(2,2);
  b.geta();
 }

 3. 源程序
 #include "iostream.h"
 class A
 {
  int a;
  int b;
 public:
  A(int m,int n):a(m),b(n) { cout<<"A created"<<endl; }
  int geta() {return a; }
  int getb() {return b; }
  ~A() {cout<<"A destroyed"<<endl; }
 };

 class B :public A
 {
 public:
  B(int m,int n):A(m,n) { cout<<"B created"<<endl;}
  int geta() {return A::geta()*2; }
  ~B() {cout<<"B destroyed"<<endl; }
 };

 void main()
 {
  B b(2,2);
  A* pa=&b;
  b.geta();
  pa->geta();
 }

 4. 源程序
 #include "iostream.h"
 class A
 {
  int a;
  int b;
 public:
  A(int m,int n):a(m),b(n) { cout<<"A created"<<endl; }
  virtual int geta() {return a; }
  virtual int getb() {return b; }
  ~A() {cout<<"A destroyed"<<endl; }
 };

 class B :public A
 {
 public:
  B(int m,int n):A(m,n) { cout<<"B created"<<endl;}
  int geta() {return A::geta()*2; }
  ~B() {cout<<"B destroyed"<<endl; }
 };

 void main()
 {
  B b(2,2);
  A* pa=&b;
  b.geta();
  pa->geta();
 

 5. 源程序
 #include<iostream.h>
 #include<math.h>
 #define pi 3.1416
 class Point{
 public:
  Point(int a,int b)
  {
   x=a;
   y=b;
  

  int x;
  int y;
 };
 class Object {

 public:
  virtual double calarea()=0;
  virtual int IsIn(Point p)=0;
 };

 class Rect :public Object {
 Point topleft;
 Point bottomright;
 public:
  Rect(Point p1,Point p2): topleft(p1),bottomright(p2) {}
  double calarea() {
  return fabs((topleft.x-bottomright.x)* (topleft.y-bottomright.y));
 }
 int IsIn(Point p) {
  if ((p.x>=topleft.x&&p.x<=bottomright.x)&&(p.y>=topleft.y&&p.y<=bottomright.y) )
   return 1;
  else return 0;
  }
 };

 class Circle :public Object {
  Point cc;
  double radius;
 public:
  Circle(Point p,double r):cc(p),radius(r) {}
 double calarea() {
  return pi*radius*radius;
 }
 int IsIn(Point p) {
  if ((p.x-cc.x)*(p.x-cc.x)+ (p.y-cc.y)* (p.y-cc.y)<radius*radius)
   return 1;
  else return 0;
  }
 };

 void main()
 {
  Object *obj[2];
  obj[0]=new Rect(Point(0,0),Point(100,200));
  obj[1]=new Circle(Point(100,200),100.0);
  int i;
  for (i=0;i<2;i++) {
   cout<<"the area is "<<obj->calarea()<<endl;
  }
 }

 

posted on 2013-02-19 20:31  呈现2014年中国男性魅力PUA风采  阅读(953)  评论(0)    收藏  举报

导航