C++训练题
第一部分选择填空
1.下列变量名中,合法的是( C )。
A. 3Student
B. #3Student
C. _3_Student
D. _3-Student
2.下列标识符中,不合法的用户标识符为( C )。
A. _float
B. double8
C. a$b
D. Funny
(解答:标识符由字母、数字、下划线组成,且第一个字符必须为字母或下划线)
3.以下所列的C++语言常量中,错误的是( D )。
A.…\97? B.…\x61? C.“int” D. 98e0.98
4.属于合法的C++语言长整型常量的是( A )。
A.0L B.345 C.(long)5454 D.2e3 (解答:C是表达式)
5.下列变量定义中合法的是( A )。
A.short _a=1-.1e-1; B.double b=1+5e2.5;
C.long do=0xfdaL;D.float a=1-e-3;
6.若int y=18; y+=y/=y-14;则执行完这两个语句后,y的值是( D )
A.4 B.9 C.18 D.8
7. 设int y=18; y*=y+=y-=8;则表达式执行完后变量y的值为 ( A )
A.400 B.300 C.200 D.504
8.设int a=3,b=4,c=5;则执行完下列语句:a*=16+(b++)-(++c);后,a的值是( B )。A.48 B.42 C.45 D.60
9.C++语言中有以下三个逻辑运算符 &&, ||, !, 从高到低优先级顺序为( C )。A.!, ||, && B.&&, !, || C.!, && , || D.||, &&, !
10. Y能被4整除但不能被100整除,或Y能被400整除,正确描述这一逻辑关系的逻辑表达式是( C )
A.Y%4==0 || Y%100!=0 && Y%400==0 B.Y%4==0 | Y%100!=0 & Y%400==0
C.Y%4==0 && Y%100!=0 || Y%400==0 D.Y%4==0 & Y%100!=0 | Y%400==0
11.设int a=3,b=4,c=5;则下面的表达式中值为0的是( D )。
A.?b?&&?a? B.a<=b C.a||b+c&&b-c D.!((a
12.设int a,b,c;a=10||0;b=(-1)&&(-2);c=!300;赋值后,变量a,b,c的置为( A )。A.1,1,0 B.0,1,0 C.0,1,1 D.1,0,0
13.若变量c为char类型,则能正确判断出c为小写字母的表达式是( D )。
A.(c>=?a?)||(c<=?z?) B.?a?<=c<=?z?
C.(?a?<=c)and(?z?>=c) D.(c>=?a?)&&(c<=?z?)
14.定义char ch=?A?; 然后执行语句ch=(ch>=?A?&&ch<=?Z?)?(ch+32):ch; 则ch的值是( B )。
A.A B.a C.Z D.z
(解答:字符…0?的值为48,…1?的值为49 , …A?的值为65, …a?的值为97,要记住)
15.设int a=9,b=8,c=7,d=6,e; e=(a
16.与if(!m)x=10; 等价的语句是( B )。
A.if(m!=0)x=10; B.if(m==0)x=10; C.if(m!=1)x=10;D.if(m==1)x=10; 17.与while(!m) return; 等价的语句是( B )。
A.while(m!=0) return; B.while(m==0) return;
C.while(m!=1) return; D.while(m==1) return;
18.int data[ ]={20,37,6,92,45,55,16,77,89}, i=7; int *ptr=data; 则对数组元素不正确的引用是( A )。
A.data[9] B.ptr[i] C.*(&data[i]) D.data[ptr-data]
19.int data[ ]={20,37,6,92,45,55,16,77,89}, i=7; int *ptr=data; 则*(ptr+6),ptr[i],*(&data[i]),data[ptr-data]的值分别是( C )。
A.16,16,77,20 B.55,55,77,16C.16,77,77,20 D.55,77,16,20
20.若数组定义为: char a[]= “Hello";则数组 a所占的空间为( B )
A.5个字节 B.6个字节 C.7个字节 D.8个字节
21. 不能把字符串“Monday”赋给数组week的语句是( D )
A.char week[10]={…M?,…o?,…n?,…d?,…a?,…y?,…\0? };
B.char week[10]={ “Monday”};
C.char week[10]; strcpy(week, “Monday”);
D.char week[10]; week=“Monday”;
22.以下数组定义中不正确的是( B )
A.int a[ ][3]={{1,1,1},{2,2,2}}; B.int b[3][ ]={{1,1,1},{2,2,2}};
C.int c[3][3]= {{1,1,1},{2,2,2}}; D.int d[3][3]={0};
23. 若有定义 static int a[3][2]={2,3,4,5,6,7}; 则表达式*a[2]的值是( D )
A.3 B.4 C.5 D.6
24.若定义int x;下列那句能将x的值赋为10。( D )
A.int const *p=&x; *p=10; B.int *p; *p=10;
C.const int *p=&x; *p=10; D.int *const p=&x; *p=10;
25.若int x, y=2, *p=&x; 则与x=y;等价的语句是( D )
A.p=y; B.x=*p; C.x=&p; D.*p=*&j; 或*p=y;
26.若static int a[10]={1,2,3,4,5,6,7,8,9}; char *p=a;则不移动指针p,且通过指针p引用值为8的数组元素的表达式是( D )
A.p[8] B.*p+8 C.*(p+8) D.*(p+7)或p[7]
练习:若char a[]=”Student”,*p; p=a; 则*(p+3)的值是( D )
A.u B.S C.e D.d
27.Fun函数且已有定义,它的原型为void fun(long *x,int &y);对变量long y=5L;int x=10;则以下函数调用合法的是( A )。
A.fun(&y,x); B.fun(&y,&x); C.fun(&x,y); D.fun(y,&x); 28.设函数fun已有定义,它的原型为void fun(char *ch, double &d);又定义变量char a[]=”Quick!”; double b=3; 则以下函数调用合法的是( A )。
A.fun(a,b); B.fun(a,&b); C.fun(a[],b); D.fun(a[],&b);
29.有下列结构声明与结构数组定义
struct Student { char name[8]; int age;int score; };
Student a[4]={ "Li",18,78,"Sun",19,86,"Zhao",20,95,"Ma",17,62};
则能在屏幕上显示字母h的语句是( D )
A.cout< B. cout< C.cout< D. cout< 30. 有下列结构声明与结构数组定义 struct Student { char name[8]; int age;int score; }; Student a[4]={ "Li",18,78,"Sun",19,86,"Zhao",20,95,"Ma",17,62}; Student *p=a; 则能在屏幕上显示字母Sun的语句是( D ) A.cout<<*(p+2).name; B. cout<<(p+2)->name; C.cout<<(p+1).name; D. cout<<(p+1)->name; 解答:cout<<(p+1)->name;或cout<<(*(p+1)).name;或cout< 第二部分填空题 31.假定一结构类型的声明为struct student{ char name[20];int score[5];}; 则在Turbo C++3.0开发环境下,该结构类型的大小为: 30 。 (注:1*20+2*5) 32.假定一结构类型的声明为 struct Node{double a[8];char *p;}; 则在Turbo C++3.0开发环境下,该结构类型的大小为: 66 33.假定一结构类型的声明为 struct Node{int a[8];Node *p;}; 则在Turbo C++3.0开发环境下,该结构类型的大小为: 18 解答:在Turbo C++3.0中,不管什么类型的指针,指针的大小都是2 34.要在屏幕上显示"Hello,world!"应执行语句cout<<_ "\"Hello,world!\""_ 35. 有定义语句:static char a[]=”week”, b[]={…w?, …e?, …e?, …k?}; 则a 的元素个数是 5 ,b的元素个数是 4 。 36. 若定义:int a[ ][3]={ {1,1,1},{2,2},{3} }; 则a的元素个数是 9 。37.已知数组的定义为int a[10]; 则a的元素个数是 10 ,最大下标是 9 , 最小下标是 0 。 38.char ch[][6]={“One”,“Two”,“Three”,“Four”, “Five”};则*(ch+2)的值为Three , ch[2]的值为 Three , **(ch+2) 的值为 T , *ch[2]的值为 T 39.int a[ ]={10,20,30,40,50,60,70}; 则数组a的元素个数可由操作符sizeof 通过表达式 sizeof(a)/sizeof(a[0]) 或 sizeof(a)/sizeof(int) 计算出来。 40.要申请一块容纳n个double型数据的动态空间,使指针p指向这个动态空间,则语句可写为double *p=new double[n];释放p所指向的动态空间的语句为 delete [] p;。 41.在一个C/C++源文件中,若要定义一个只允许本源文件中调用的函数,则该函数使用的存储类别是 static (请回顾auto、static、extern的作用域、可见性、生命期)42.已知数组的定义为char a[100]; 则a的元素个数是 100 ,最大下标是 99 。43.设a是一个整型数组,则a+1所指向对象地址比a的大 2 字节。 44.int a[10]; int *p=a; p++; 则p 所指向对象地址比a 的大 2 字节。 45. int *p=new int[10]; 要使引用r 代表指针p , 则r 应定义为 int * &r=p; 46.假定一个参数说明为int &x ,则进行函数调用时,它是对应 实参 的别名。 47. char *a=”Morning !”; char *&r=a; 则*r 的值为 ?M ? , r 的值为”Morning !” 48. 有程序段如右,设整数x 已定义, x 大于10,程序段中for 语句的循环 体是: y++; ,则循环体将被重复 执行 x-9 次后正常结束。 49. 在for 语句中,假定循环被执行次数为n , 则for 语句头中的<表达式1>共被计算 1 次, <表达式2>共被计算 n+1 次,<表达式3>共被计算 n 次, 50. 设int i=0; while(i++<=100) cout<<”$”; 则循环体将被重复执行 101 次后正常结束。 练习:int i=100,y=0; while(i--) y++; 则运行后y 的值为 100 51. int i=100;若do 循环的尾为while(i--); 则循环体将被重复执行 101 次后正常结束。 练习:int i=0,y=0; do{ y++; }while(i++<=100); 运行后y 的值是 102 52. 算术表达式XY X Y X ++22对应的C++表达式为 (x*x+2*y)/(x+sqrt(x*y)) ; 53.C++的三类预处理指令是:(1)#include 包含指令,(2)#define 宏定义指令,(3) 条件编译指令 。 54.continue 语句只能用在 循环 语句中;break 语句既能用在__循环___语句中,也能用在 switch 语句中。 当程序执行到 break 语句时,将结束本层循环类语句或 switch 语句的执行。 55.若有宏定义#define M(a) a*a 则当int x=2时,执行M(x+2)得到的值是 8 。 56. 有以下程序段:#define M(a,b) a*b int a=1,b=2,c=-3; cout< 则该程序段执行后,屏幕显示的结果为 10 练习:宏#define M(a) a*a 语句int a=16, b=2, c=1; a/=M(b+c)/M(b+c); 结果是 2 。 57. 全局变量和静态变量没有赋初值时,将由系统自动置为 0 , 局部 变量没有初始化时,其值不确定(即为随机值)。 58. 重载函数至少应在 参数 个数、类型或顺序上有所不同。 59. 一个变量的指针实质就是该变量的 地址 ,所谓数组的指针是指 数组的起始地址 。 60.在函数的调用过程中,实参传递给形参有 值 传送与传 地址 两种方式。在进行函数调用时,若是值传送将把实参的 值 传给形参,形参的变化不会影响实参;若是传地址方式,则把实参的 地址 传递给形参,此时形参的变化会影响实参的变化,使形参与实参具有相同的值。 第三部分程序题 1.下列程序求2*4+4*6+6*8+……+98*100的值。请在横线上补足所缺语句。 #include"iostream.h" void main ( ) { long n, s; s=0; for( n=2;n<=98;n+=2 ) s+=n*(n+2); cout<<"result="< }//结果: result=166600 //提示:根据题意,结合循环体语句,确定循环变量的初始值、终止值、步长 2.以下程序求表达式1*3+3*5+5*7+……+97*99之值。请在横线上填充语句,以实现程序的功能。 #include"iostream.h" void main ( ) { long n, sum=0; for( n=1;n<=97;n+=2 ) sum+=n*(n+2); cout<<"result="< }//result=161651 3.以下程序求表达式3*5+5*7+……+199*201之值。请在横线上填充语句,以实现程序的功能。 #include"iostream.h" void main ( ) { long n, sum=0; for( n=3;n<=199;n+=2 ) sum+=n*(n+2); cout<<"result="< }//result=1353297 4.下列程序求1!+3!...+n!的值,其中n为不大于11的奇数。请填空完善程序。 #include"iostream.h" long jc(int x); void main() { int k,n; long s=0; cin>>n; if(n>11||n%2==0) return; for(k=1; k<=n; k+=2) { cout< s+=jc(k); } cout<<"result:"< }//n=11时结果为40284827 //求整数x的阶乘 long jc(int x) { int i; long d=1; for(i=1; i<=x; i++) d*=i; return d; } //提示:对这类题型,记住“求整数x的阶乘”这个函数,并学会怎样调用它。 5.下列程序打印右图所示的由字母组成的三角形图案,请在横线上补足所缺语句部分。 #include void fill(char c,int n); void main() { for(int i=1; i<=8; i++){ fill(' ',8-i); fill( i+64, 2*i-1 ); cout < } } void fill(char ch, int n) { for(int i=0;i } //问题:fill是干什么的? //提示:对这类题型,记住“fill”这个函数,并学会怎样调用它。 6.下列程序打印右图所示的三角形图案,请在横线上补足所缺语句。#include void fill(char c,int n); void main() { for(int i=5; i>0; i--){ fill(' ',5-i); fill('#', 2*i-1 ); A BB B CCCC DDDDDDD EEEEEEEEE FFFFFFFFFFF GGGGGGGGGGGGG HHHHHHHHHHHHHHH ############### ############# ########### ######### ####### ##### ### # cout < } } void fill(char c, int n) { for(int i=0;i } 7.下列程序求数组元素的最大值。请补足所缺语句。 #include"iostream.h" int fun (int *p,int n) { int max=*p; for(int i=0;i if(max<*(p+i)) max=*(p+i); return max; } void main() { int a[ ]={1,2,3,4,5,10,9,8,7,6}; int n; int max; n= sizeof(a)/sizeof(*a); max=fun ( A , n ); cout<<"Max="< } 8. 阅读下列程序。程序运行时,从键盘输入203 303;则屏幕上输出结果为:303 203 请问fun( )函数的功能是什么?交换两整数 #include"iostream.h" void fun(int &x, int &y) { int temp; temp=x; x=y; y=temp; } void main ( ) { int a,b; cin>>a>>b; fun(a,b); cout< } 9.阅读下列程序。程序运行时,从键盘输入203 303;则屏幕上输出结果为:303 203 请问fun( )函数的功能是什么?两整数从大到小排序 #include"iostream.h" void fun(int *x, int *y) { int *temp; if(*x<*y){*temp=*x; *x=*y; *y=*temp;} } void main ( ) { int a,b; cin>>a>>b; fun(&a,&b); cout< } //问题:若把fun()函数的参数改为引用,程序如何修改? 10. 下列程序输出结果是多少?fun()函数的功能是什么? 648, 求整数各位数字的积#include"iostream.h" long fun(long x) { long mm=1; while(x){ mm*=x%10; cout< x/=10; } return mm; } void main() { long data=1998; long result; result=fun(data); cout< } //问题:求一个整数各位数字的和,如何写函数? 11. 写出下列函数实现的功能(用数学表达式描述)。 X*Y double fun( double x, int y) { int i; double z=x; for(i=1;i return z; } //问题:求x的y次方,如何写函数? 12. 写出下列函数实现的功能。 1+2+3+…+n long fun(int n) { long s=0; int i; for(i=1;i<=n;i++) s+=i; return s; } 13. 写出下列程序实现的功能。打印命令行参数 #include"iostream.h" void main(int argc,char *argv[ ]) { int i; for(i=0;i cout< } 14. 下列程序的执行结果是 19 #include"iostream.h" int fun(char *str) { char *p=str; while(*p) p++; return p-str; } void main() { cout< } 15. 下列程序的执行结果是 22 #include"iostream.h" void main() { int a[2][3]={ {11,12,13}, {21,22,23} }; cout< } 16. 下列程序的执行结果是 0 #include"iostream.h" void main() { int a[2][3]={ (11,12,13), (21,22,23) }; cout< } 17.编写程序,求1908到2008之间有多少个素数(包括1908和2008)。[答] (程序仅供参考) #include"iostream.h" #include"math.h" //判明素数函数prime //判断整数n是否为素数。是:返回1,否:返回0 int prime(int n) { int k=sqrt(n); for(int i=2; i<=k; i++) if(n%i==0) return 0; return 1; } void main() { int m=0; for(int i=1908;i<=2008;i++) if(prime(i)) { cout< m++; } cout<<"number of prime: "< } 18. 编写程序,求1908到2008之间所有素数的和(包括1908和2008)。[答] (程序仅供参考) #include"iostream.h" #include"math.h" //判明素数函数prime int prime(int n) { int k=sqrt(n); for(int i=2; i<=k; i++) if(n%i==0) return 0; return 1; } void main() { long m=0; for(int i=1908;i<=2008;i++) if(prime(i)) m+=i; cout<<"the sum of prime: "< } 19.编写程序,求从1900年开始到2050年为止一共有多少个闰年。 [答] (程序仅供参考) #include"iostream.h" //判明闰年: year是闰年:返回1, year不是闰年:返回0 int LeapYear(int year) { if( (year%4==0 && year%100!=0) || year%400==0 ) return 1; else return 0; } void main() { int leap=0; for(int y=1908; y<=2008; y++) if(LeapYear(y)) { cout< leap++; } cout<<"number of leap year: "< } 20.已知Fibobacci数列数学定义:F(0)=0; F(1)=1; F(n)=F(n-1)+F(n-2), n>1。编写程序,求Fibonacci数列的第20项(不计F(0)项)。 [答] (程序仅供参考) #include"iostream.h" //求Fibobacci第n项 long fib(int n) { if(n==0) return 0; else if(n==1) return 1; long f1=0, f2=1, f; for(int i=1; i f=f1+f2; f1=f2; f2=f; } return f; } void main() cout< } 21. 已知Fibobacci数列数学定义:F(0)=0; F(1)=1; F(n)=F(n-1)+F(n-2), n>1。编写程序,求Fibonacci数列的第20项(F(0)项也计算在内)。 [答] (程序仅供参考) #include"iostream.h" //求Fibobacci第n项 long fib(int n) { if(n==0) return 0; else if(n==1) return 1; long f1=2, f2=1, f; for(int i=1; i f=f1+f2; f1=f2; f2=f; } return f; } void main() { int n=20; cout< } 22.编写程序,求Fibonacci数列的大于888的最小项。 [答] (程序仅供参考) #include"iostream.h" //Fibobacci long fib(int n) { if(n<3) return 1; long f1=0, f2=1, f; for(int i=1; i f=f1+f2; f1=f2; f2=f; } return f; } void main() { while(fib(n)<888) n++; cout< } 23.从键盘输入k个浮点数并存入数组a中。求最大数和最小数。求除最大数和最小数外所有数的和。要求打印所求结果。 [答] (程序仅供参考) #include"iostream.h" void main() { int k; cout<<"k: "; cin>>k; //输入k值 double *a=new double[k]; //因为数组大小是从键盘输入的,所以要动态建立数组a for(int i=0;i cout<<"data:"; cin>>a[i]; //输入k个数据 } double max=a[0],min=a[0],sum=0; for(i=0;i if(max if(min>a[i]) min=a[i]; //求最小数 sum+=a[i]; //求最和 } sum-=max; sum-=min; //修正和值