2011春江蘇省計算機二級VC++試題 |
第二部分 C++語言程序設計 選擇題(用答題卡答題,答案依次填在2l”30答題號內) 21.下列關于switch語句的描述中,不正確的是___(21)___ 。 A.switch語句中的default子句可以沒有,也可以有一個 B.switch語句中的每一個case子句中必須有一個break語句 C.switch語句中的default子句可放在switch語句中的任何位置 D.switch語句中的case子句后面的表達式只能是整型、字符或枚舉類型常量 22.設有說明語句:int a=1,b=2;float x=3,y:4:以下賦值中存在語法錯誤的是___(22)___ A. a=++x; B. y=++b; C. b++=x++; D. b+=x++ + y++ 23.設有說明語句:char ss[]={“I am a student.”};static float x[20]; 下列選項中,存在語法錯誤的是___(23)___ A.cout<<ss; B.cin>>ss; C.cout<<x; D.cin>>x; 24.設有說明語句:float f(int &a,int b):int x,y;以下對函數f的調用語句中,正確的是(24) A.f(x,y) ; B.f(&x,y); C.f(15,20); D.f(*x,y); 25.設有說明:int a=1O,b=15,c;執行語句:c=a ||(a+=b)||(++b);則a、b、c的值分別為___(25)___ A.10,15,1 B.25,16, 26.下列關于函數重載的描述中,不正確的是___(26)___ 。 A.兩個或兩個以上的函數取相同的函數名,但形參的個數不同 B.兩個或兩個以上的函數取相同的函數名,各函數的返回值的類型必須不同 C.兩個或兩個以上的函數取相同的函數名,形參的個數相同但類型不同 D.兩個或兩個以上的函數取相同的函數名,形參的個數不同或類型不同 27.在C++的集成環境中,系統約定c++源程序文件缺省的擴展名為___(27)___ A.vc B.c++ C.vc++ D.cpp 28.用友元函數進行雙目運算符重載時, 該友元函數的參數表中應定義___(28)___個參數 A.O B. 29.以下有關抽象類的敘述中,正確的是___(29)___ A.抽象類不能含有純虛函數 B.可以定義抽象類的對象 C.在抽象類中至少含有一個沒有函數體的虛函數 D.抽象類不能作為基類派生出新的類 30.以下有關this指針的敘述中,不正確的是___(30)___ A.當調用對象的非靜態成員時,總存在一個this指針 B.非靜態成員函數調用類中的成員時,可直接使用this指針 C.this指針隱含地指向要用到的當前對象 D.靜態成員函數也存在this指針 二、填空題(請將答案填寫在答題紙的相應答題號內,每個答案只占一行) ●基本概念題,共5分 1.成員函數實現雙目運算符重載時, 該運算符的左操作數是___(1)___ , 其右操作數是___(2)___ 。 2.在C++中,類的繼承方式有三種:保護繼承,私有繼承和___(3)___ 。 3.在定義全局變量和靜態變量時,若沒有設置其初值,則這兩種變量的初值為___(4)___ 。 4.在c++中,標識符是以___(5)___或下劃線開頭的,由字母、數字和下劃線組成的字符序列. ●閱讀程序題,共13分 5.[程序](2分) #include <iostream.h> t int a=1O; void fun(void) { int a=15; ::a-=--a; cout<<::a<<’\t’<<a<<’\n’; } void main(void) { int a=15; for(int i=-10;i<a+::a;i++) fun(); } 執行程序后輸出的第一行是___(6)___,第二行是___(7)___。 6.[程序](2分) #include <iostream.h> void main(void) { int i=1,j=1; for(:j<10;j++){ if(j>5){i+=2;break;} if(j%2!=0){ j+=2; continue; } cout<<i<<’\t’<<j<<’\n’; } cout<<i<<’\t’<<j<<’\n’; } 執行程序后輸出的第一行是___(8)___ ,第二行是___(9)___ . 7.[程序](2分) #include<iostream.h> int f(int &x,int &y) { x+=y; y+=x; return(x>y?x:y); } void main(void) { int x=20,y=30,z; z=f(x,y): cout<<x<<’\t’<<y<<’\t’<<z<<endl; z=f(y,x): cout<<x<<’\t’<<y<<’\t’<<z<<endl ; } 執行程序后輸出的第一行是___(10)___,第二行是___(11)___. 8.[程序](2分) #include <iostream.h> int f1(int n) { if(n==1)return 1; else return n*n+f1(n-1); } int f2(int n) { int mul=1; if(n==1) mul=1; else mul= n*f2(n-1); return mul; } void main(void) { cout<<f1(3)<<endl; cout<<f2(4)<<endl; } 執行程序后輸出的第一行是___(12)___,第二行是___(13)___ 9.[程序](3分) #include <iostream.h> char *str(char *p1,char*p2) { char *p=p1; while(*p)p++; *p++=’’; while(*p++=*p2++); *p++=’’; return p1; } void main(void) { char s1[200]={“NanJin”}; char s2[200]={“is”}; char s3[]={“good”}; cout<<str(s2,s3)<<’\n’; cout<<str(s1,s2)<<’\n’ ; cout<<s1<<’ !’<<s2<<’ !’<<s3<<’\n’; 執行程序后輸出的第一行是___(14)___ ,第二行是___(15)____,第三行是___(16)___ 1O.[程序](2分) #include<iostream.h> class A{ int x,y; public: A(int a,int b){x=a;y=b;} virtual void funl(){cout<<“x+y=“<<x+y<<“\n”;} }; class B:public A{ int m,n; public: B(int a,int b,int c,int d) :A(c,d){m=a ;n=b ;} void fun1(){cout<<“m*n= ”<<m*n<< ”\n”;} }; void print(A &ra){ra.fun1();} void main(void) { A a(10,20),*pa; B *p; p=new B(20,30,40,50); p->fun1(); pa=&a; pa->fun1(); pa=p; pa->fun1(); print(a); delete p; } 執行程序后輸出的第二行是___(17)____,第三行是___(18)___ 完善程序題,共12分 11.設有一條環形鐵路,共有n個車站,現有檢查組去檢查每個車站的服務質量,從第i個車站開始檢查,每隔m(已檢查過的車站不計算在內)個車站作為下一個要檢查的車站,直到所有車站都檢查完為止。下面的程序功能是:按以上要求計算出依次檢查的車站序號,并輸出計算的序號序列和檢查循環的圈數。例如,假設共有20個車站,車站的序號依次為:1,2,3,…,19,20;要求從第3個車站開始檢查,間隔5個車站,則檢查車站的順序為: 3->8->13->18->4->10->16->2->11->19->7->17->9->1->15->14->20->6->12->5 函數check()中的count記錄檢查完所有車站時要繞環形鐵路的圈數。 [程序](4分) #include<iostream.h> #define N 100 int check(int x[],int y[],int n,int i,int m) //x存放車站序號,y存放依次檢查的車站 {//n總車站數,i開始檢查的車站號,m要間隔的車站數 int k=O,k1,count=0; //k記錄已檢查車站的個數 x[O]=n; //初始化數組x,x[0]記錄最后一個車站號 for(int j=1;j<n;j++) x[j]=j; y[k++]=i: //i為第一個檢查的車站 x[i]=-1: //當“i]為一1時,表示該車站已檢查 j=i; while( ___(19)___){ k1=O; //用k1累加間隔車站個數 while(k1<m){ j++; if(j>=n){ . count++; j=___(20)___; } if(x[j]!=-1)k1++; } y[k++]= ___(21)___; x[j]=-1; } return count; } void main(void) { int A[N],B[N],n,m,i,j,k=O,k1,num;//A記錄車站序號,B記錄檢查順序 cout<<”輸入車站個數n,第一個開始檢查的車站號i,間隔的車站數m:”; cin>>n>>i>>m; num=___(22)___ ; cout<<“檢查順序:”<<endl; //輸出依次檢查車站的序號 for(j=O;j<n-1;j++) cout<<B[j]<<“一>“; cout<<B[j]<<endl: cout<<“全部檢查完各個車站,共要循環的圈數為:”<<num<<endl; } 12.以下程序的功能是:求滿足以下條件的所有三位數:(1)該三位數是某一個二位數的平方:(2)該三位數的個位數、十位數和百位數各不相同,即l到9這九個數字在該數中至多只允許出現一次.要求每行輸出五個數。例如,滿足以上條件的所有三位數有13個,分別為: 169 196 256 289 324 361 529 576 625 729 784 841 961 [程序](4分) #include <iostream.h> int f(int y) //y若滿足條件,返回1:否則返回O { int i,j,k; i=y%10; //求個位數 j=___(23)___ ; //求十位數 k=y/100; if( ___(24)___) //判是否有相同的數字 return 0; for(i=11:i<=31:i++) //因32.32=1024,已超過三位數 if(___(25)___) return 1; return 0; } void main(void) { int x[22]={0},count=O; for(int i=102:i<987;i++){ if(f(i)){ ___(26)___ ; count++; } } for(i=0;i<count;i++){ cout<<x[i]<<’\t’; if((i+1)%5==0)cout<<’\n’; } cout<<’\n’<<“共有:”<<count<<“個三位數滿足條件.\n”; } 13.在以下程序中,函數create()根據鍵盤依次輸入的整數建立一條單向無序鏈表,鏈表上的每一個結點包含一個整數;函數sort()根據鏈表結點的數據按從小到大的順序將鏈表調整為一條有序鏈表;函數print()將鏈表上的整數依次輸出;函數del()將鏈表刪除。 排序算法提示:(1)初始時,使P指向鏈表的首結點,(2)從P之后的所有結點中找出data值最小的結點。(3)讓p1指向該結點,并將P指向結點的data值與pl指向結點的data值進行交換,讓P指向下一個結點,(4)重復步驟(2)和(3),直至P指向鏈表的最后一個結點為止· [程序](4分) #include<iostream.h> struct Node{ int data; Node *next; }; Node *sort(Node *head) { Node *p=head,*p1,*p2; if(p==NULL)return head; while(p->next!=NULL){ p1=p; __________(27)___________; while(p2!=NULL){ if(p2->data<p1->data) ___(28)___; p2=p2->next; } if(p!=p1){ int t; t=p->data; p->data=p1->data; p1->data=t; } p=p->next; } return head; } Node *creat(void) { Node *h=NULL,*p,*p1; int data=1; while(data){ cout<<“輸入一個整數,0表示輸入結束:”; cin>>data; if(data){ p=new Node: p->data=data; p->next=NULL; if(h==NULL) h=p1=p; else{ ___(29)___; p1=p; } } } return h; } void print(Node *p) { while(p){ cout<<p->data<<’\t’; p=p->next; } cout<<’\n’; } void { Node *p; while(h){ p=h; ___(30)___ delete p; ) } void main(void) ( Node *head; head=creat(); cout<<“鏈表上的數據為:”; print(head); head=sort(head); cout<<“排序后鏈表上的數據為:”; print(head); cout<<endl; } |