一、 填空题(25小题,共50分) (以下每小题2分,共20分) 14. 动态联编要满足两个条件,它们是_________________________________,________________________ 。 (以下每小题4分,共20分) test::test( ) test::~test( ) void main( ) 24. 下面程序的运行结果是________。 class B:public A void fun(A *a) void main() 25. 下面程序的运行结果是________。 |
二、 问答题(每小题5分,共20分) |
三、找出下面程序(或程序段)中的语法错误,并予以纠正(每小题4分,共8分)
(1)程序功能是倒序输出各给定的字符串。
#include <stdio.h>
void main()
{
char str[5][ ]={"First","Second","Third","Forth","Fifth"};
char *cp[ ]={str[4],str[3],str[2],str[1],str[0]};
int i;
while(i<=5)
{
printf("%c ",*(cp+i));
i++;
}
}
(2)程序功能是将各个平方根值放入数组中。
#include <stdio.h>
void main()
{
int max,a,i;
scanf("%d%d",max,a);
double x[max];
for (i=0;i<max;i++)
x[i]=sqrt(a*i);
}
四、(8分)下列shape类是一个表示形状的抽象类,area( )为求图形面积的函数,total( )则是一个通用的用以求不同形状的图形面积总和的函数。请从shape类派生三角形类(triangle)、矩形类(rectangle),并给出具体的求面积函数 |
五、(6分)完成顺序查找函数f_seq( )。其过程是:从表头开始,根据给定的模式,逐项与表中元素比较。如果找到所需元素,则查找成功,并打印出它在表中的顺序号。如果查找整个表仍未找到所需对象,则查找失败
#include <stdio.h>
void f_seq(char *list[],char *object,int len)
//list 指针数组,指向字符串
//object 模式串
//len 表的长度
{
char **p;
int strcmp(char *s,char *t);
p=list;
while (_____①______) //
if (strcmp(*p,object)==0)
break;
else ______②_______; // if (p<list+len)
printf( "Success! **% d/n",p-list);
else printf("Unsuccess!/n");
}
int strcmp(char *s,char *t)
{
for (;*s==*t; s++,t++)
if (*s=='/0')
return(0);
return(_____③______); //
}
六、(8分)完成使链表逆置函数reverse,若有链表:
链表结点的结构如下:
struct node
{
int num;
struct node *next;
}
struct node* reverse(struct node *head)
//head 链表头结点
{
struct node *p,*temp1,*temp2;
if(head==NULL____①____) return head; //
p=head->next;head->next=NULL;
while(____②____) //
{
temp1=head;
____③____; //
temp2=p;
p=p->next;
____④____; //
}//Match while statenment
return head; //返回逆置后的链表的头结点
}
地址或指针或引用传递
this指针
作用域分隔符限定时
引用
保持不变
A<B||A<C
没有形参的或缺省参数
共享
与最近的if
0
继承, 多态
不同, 派生类成员函数与在基类被覆盖的成员函数名、参数个数、参数类型和返回值类型均相同
析构函数没有参数 、 析构函数可以定义为虚函数 。
被调用的成员函数是虚函数 、 用指针或引用调用虚函数
抽象类, 纯虚函数
被修改, 修改类数据成员
类 、 枚举
字符数组, /0
输入输出库, cout<<n;
继承 、 复用
21. 3
22. 2 5 8 11 14
23. Initalizing default
Initalizing default
0 0
Desdtructor is active
Desdtructor is active
24. A::A() called.
B::B() called.
B::~B() called.
A::~A() called.
25. 9 5 3
8 4 7
26. 解答要点:当对象含有指针数据成员,并用它初始化同类型的另一个对象时,缺省的拷贝构造函数只能将该对象的数据成员复制给另一个对象,而不能将该对象中指针所指向的内存单元也复制过去。这样,就可能出现同一内存单元释放两次,导致程序运行出错。
27. 解答要点:以下几点必须说清楚:
成员函数是在类内部定义的,作用域在类的内部,成员函数可以访问类的数据成员(公有、保护和私有数据成员),可以调用该类的其它成员函数(公有、保护和私有成员函数),可以调用全局函数。如果友元函数是另一个类的公有成员函数,则该类的成员函数也只能通过那个类的对象调用,不能调用那个类的保护和私有成员函数。非本类成员函数(其它类成员函数或全局函数)可以通过该类的对象访问该类的公有数据成员和调用该类的的公有成员函数。
不是在类中定义的成员函数都是全局函数。
如果某一个函数(全局函数或类的成员函数)定义为另一个类的友元函数,需要在那个类中用friend关键字声明,友元函数并不是类的成员,它的定义自然是在那个类的外面。
28. 解答要点:结构化的程序设计将数据和对数据的操作分离,程序是由一个个的函数组成的,面向对象的程序设计将数据和操作封装在一起,程序是由一个个对象组成的,对象之间通过接口进行通信,它能够较好地支持程序代码的复用。
29. 解答要点:struct和class都可以定义类,但是缺省访问权限说明时,struct的成员是公有的,而class的成员是私有的。在C++中,struct可被class代替。
三
1
① "char str[5][ ]={"First","Second","Third","Forth","Fifth"};"应为
"char str[5][10 ]={"First","Second","Third","Forth","Fifth"};"
② "while(i<=5)"应为"while(i<5)"
③ "printf("%c ",*(cp+i));"应为"printf("%s",*(cp+i));"
④ "int i;"应为"int i=0;"
2
① 增加"#include <math.h>"
② "scanf("%d%d",max,a);"应为"scanf("%d%d",&max,&a);"
③ "double x[max];"改为:
"double *x=new double[max];"
…
"delete []x;"
四
class Triangle:public Shape
{
public:
Triangle(double h,double w){H=h;W=w;}
double Area() const{return H*W*0.5;}
private:
double H,W;
};
class Rectangle:public Shape
{
public:
Rectangle(double h,double w){H=h;W=w;}
double Area()const{return H*W;}
private:
double H,W;
};
五
p<list+len
p++
s-t或*s-*t或1
六
||head->next==NULL
p!=NULL或p
head=p;
temp2->next=temp1;或head->next=temp1;