1、秋江苏省等级考试C+试卷附答案 秋江苏省等级考试C+试卷(笔试题,共60分)第一部分部分 计算机信息基础 (20道选择题,共20分,略)第二部分 C+语言程序设计(共430分)一、 选择题(用答题卡答题,答案依次填在2130答题号内)21. 以下不符合C+语法规则的数值常量是 d 。A034 B2.1E3C0Xab23 D2E1.422. 表示式:3.6-5/2+1.2+5%2的值是 c 。A4.3B4.8C3.8D3.323. 下列关于虚函数的叙述中,正确的是 c 。A. 虚函数能够是一个static类型的成员函数B. 基类中用virtual说明一个虚函数后,派生类中定义相同原型的函数时可不
2、必加virtual说明C. 派生类中的虚函数与基类中相同原型的虚函数具有不同的参数个数或类型D. 虚函数能够是非成员函数24. 下列关于缺省构造函数的叙述中,不正确的是 a 。 A每个类至少有一个缺省构造函数B缺省构造函数没有参数或每一个参数都有缺省值C缺省构造函数是唯一的D每个类至少有两个构造函数25. 在循环体中,使用break和continue语句的作用分别是 d 。A两语句都结束该层循环B前者结束该层的本次循环,后者结束该层循环C两语句都结束该层 的本次循环D前者结束该层循环,后者结束该层的本次循环26. 以下叙述中,不正确的是 d 。A派生类能够继承多个基类B能够有多个派生类继承同一
3、个基类C派生类能够有多个虚基类D抽象类必须是虚基类27. 设由类的成员函数和友元函数分别实现相同的运算符重载功能,以下叙述中正确的是 b 。A两种函数的参数个数相同B友元函数比成员函数多一个参数C成员函数比友元函数多一个参数D两种函数都带有this指针28. 以下对函数重载的叙述中,正确的是 c 。A函数名不同,但函数实现的功能相同B函数名相同,函数的参数个数相同但参数的类型不同C函数名相同,但函数的参数个数不同或参数的类型不同D函数名相同,但函数的参数类型不同或函数的返回值的类型不同29. 以下关于类成员的叙述中, 不正确的是 a 。A类的析构函数能够重载B类的构造函数能够重载C类中的成员都
4、有明确的访问权限D可将成员函数定义为静态的30. 以下的叙述中, 不正确的是 c 。A在不同函数中能够使用相同名字的变量B函数的形式参数是局部变量C在函数内的复合语句中定义的变量在本函数范围内有效D在函数内定义的变量只在本函数范围内有效二、 填空题(请将答案填写在答题纸的相应答题号内,每个答案只占一行)基本概念题,共5分1. 在C+中,函数的参数传递方式有三种:第一种是值传递,第二种是 指针传递 ,第三种是 引用传递 。2. 符号“&”作为单目运算符时的功能是取地址;作为双目运算符时,其功能是 按位与 。3. 设有以下语句:#define S(x) x*xint k=3,y;y= S(k+k)
5、;执行赋值语句:“y= S(k+k);”,则y的值为 15 。4. 如果派生类没有重载基类的纯虚函数时,则该派生类也是 抽象 类。阅读程序题,共13分5. 程序 (2分)#include void f1(void)int x=10;static int y=10;x+=y; y+=x;coutxtyendl;void main(void)f1( ); f1 ( );f1 ( ); 执行程序,输出的第二行是 40 ,第三行是 70 。 6. 程序 (2分)#include int x=100;void main(void)int x=30;x+=:x+; int x=60;:x+=x;cout+
6、xn;cout:xn;执行程序,输出的第一行是 131 ,第二行是 161 。7. 程序 (3分)#include int fact(int n)if (n1) return n*fact(n-1);return 1;int f (int a , int n)if (n=2) return f(a,n-1) + an-1 ;return a0 ;void exchange(int a, int n)int i, temp ;for (i=0; in/2; i+) temp=ai; ai=an-i-1; an-i-1=temp; void main(void) int aa5 = 1, 2, 3
7、, 4;cout f(aa,4) endl;coutfact(aa3)endl;exchange (aa, 4); for (int i=0; i4; i+) coutaait; coutendl;执行程序,输出的第一行是 10 ,第二行是 24 ,第三行是 4 3 2 1 。 8. 程序 (3分)#include class Aint x;public:A(int i) x=i; coutA: x=xendl; void print( ) coutx=x ; ;class B: public Aint y;A a;public:B(int i, int j): A(i+j), a(j+10)
8、y=i*j; coutB: y=yendl; void print( )A:print( );a.print( );couty=yendl;void main(void)B b(5,10);b.print( );执行程序,输出的第一行是 A:x=15 ,第三行是 B:y=50 ,第四行是 x=15,x=20,y=50 。 9. 程序 (3分)#include const int SIZE=100;class Stackchar stckSIZE;int top;public:Stack( ) top=0; virtual void push(char ch)if (top= SIZE) ret
9、urn;if(a=ch & ch=z)stcktop=ch; top+;virtual char pop( )if(top=0;i-)coutstcki;coutendl;class Stack2: public Stackchar stckSIZE;int top;public:Stack2( ) top=0; void push(char ch)if (top= SIZE) return;if(0=ch & ch=9)stcktop=ch; top+;char pop( )if(top0) return NULL;top-;return stcktop;void print( ) for
10、(int i=0; itop;i+) coutstcki;coutpush(*ptr+);ptr=str2; p=&s2;while(*ptr) p-push(*ptr+);s1.print( ); s2.print( );while(ch=p-pop( ) coutch;coutendl;执行程序,输出的第一行是 cba ,第二行是 5678 ,第三行是 8765 。完善程序题,共12分10. 以下函数sortdel(char *s)的功能是:首先将s所指向的字符串中的字符按照字符ASII码值的大小按升序排序,然后在排序后的字符串中删除重复的字符。在主函数中输入一个字符串,调用函数sortd
11、el( ),输出排序后的字符串。 程序 (4分)#include void sortdel(char *s) char *p,*q,*r,c;for(p=s; *p; p+) / 选择法排序 for(r=p,q=p+1; *q; q+)if(*r*q) r=q ; if(r!=p) c=*r; *r=*p; *p=c ; for(p=s; *p; p+) / 删除重复的字符r=p+1;while( *p=*r ) r+;if(p != r ) for(q=p+1; *r; q+) *q=*r ; r+; *q=0;void main(void) char str200;cin.getline(
12、str,199);coutstrendl;sortdel(str);coutstr”完成数组的输入;成员函数add( )实现将一个实数加入线性表。 程序 (4分)#include class Listpublic: List(int=1); List( ) delete list; List& operator =(const List&);void print( )for(int i=0;inum;i+)coutlisti,;if(i+1)%5=0)cout(istream&, List&);void add(double x)if( num=size)double *list1= new
13、doublesize+1;for(int i=0;isize;i+)list1i=listi;delete list; list=list 1 ;size+;listnum=x;num+;private:int size,num;double *list;List:List(int sz) size=sz;list= new doublesize ; num=0;List& List:operator =(const List& v) if(&v!=this) delete list;size=v.size; list=new doublev.size或doublesize ;for(int
14、i=0;i (istream& is, List& v) for(int i=0;iv.size;i+) coutiv.listi ; v.num=v.size; return is ;void main(void) List a(10),b(14);coutb; b.print( );a=b;a.add(37.25);a.print( );12. 以下程序的功能是:先创立两条带有空头结点(链表的第一个结点不存储数据,只是为了方便处理)的有序单向链表(结点元素值按升序排列),假设每条链表中的元素均不相同。然后将两条具有相同次序的单链表归并成一条有序单链表,而且规定相同元素只归并一次。函数Cre
15、ate( )利用给定的参数数组(数组中元素不要求有序)创立一条具有空头结点的有序单链表,函数Merge( )把两条有序链表归并成一条有序链表,原先的两条链表保持不变。程序 (4分)#include struct Node int data;Node *next;void Create(Node *&head,int *a,int n) /根据数组a中n个数据产生一条有序链表Node *L, *t, *p, *q;/p指向待处理结点,q指向p的前驱结点head=new Node;L=head-next=NULL; /L总是指向第一个结点(头结点的下一个结点)for (int i=0;idata=
16、ai; t-next=NULL;if (L=NULL | aidata) /若链表为空或ai小于第一个结点的值t-next=L;head-next=t; L=t ; else q=L; p=q-next;while (p!=NULL & aip-data) /找出新结点t的插入点q=p; p=p-next ; t-next=p; q-next=t;void Print(Node *h) h=h-next;while (h!=NULL) coutdatanext;coutnext=NULL;t=head; p=h1-next; q=h2-next;while (p!=NULL & q!=NULL
17、) s=new Node;if (p-datadata) s-data=p-data; p=p-next;else if (p-dataq-data) s-data=q-data ; q=q-next;else s-data=p-data; p=p-next ; q=q-next;t-next=s; t=s;if (q!=NULL) p=q;while (p!=NULL) s=new Node;s-data=p-data; p=p-next; t-next=s; t=s;t-next=NULL;return head;void main(void) int a =12,1,8,2,5,11,3,6,9,7,10,16,4;int b =0,12,8,2,5,18,13,16,9,17,3,6;int m=sizeof(a)/sizeof(int), n=sizeof(b)/sizeof(int);Node *h1,*h2,*h3;Create(h1,a,m); Create(h2,b,n);cout有序表h1为:; Print(h1);cout有序表h2为:; Print(h2);h3=Merge(h1,h2);cout26. return is27. L=t28. p=p-next29. s-data=q-data30. p=p-next