1、(word完整版)C语言程序设计综合练习题集C语言程序设计综合练习题一、单选题1。 C语言中基本数据类型有 .CA) 整型、实型、逻辑型B)整型、字符型、逻辑型 C) 整型、实型、字符型D)整型、实型、字符型、逻辑型2。 在C语言中,数字O29是一个 。AA) 八进制数 B) 十进制数 C) 十六进制数 D) 非法数3. 在以下关于C语言的不严格的叙述中,错误的说法是 .AA) 在标识符中,大写字母和小些字母的意义相同 B) 有些不同类型的变量可以在一个表达式中运算 C) 在赋值表达式中等号“=左边的变量和右边的值可以是不同类型 D) 同一个运算符号在不同的场合可以有不同的含义4. 下列关于C
2、语言用户标识符的叙述中正确的是 .BA)用户标识符中可以出现下划线和中划线(减号)B)用户标识符中不可以出现中划线,但可以出现下划线C)用户标识符中可以出现下划线,但不可以放在用户标识符的开头D)用户标识符中可以出现下划线和数字,它们都可以放在用户标识符的开头【解析】考查C语言中的用户标识符规则,在C语言程序设计中,用户标识符是由字母、数字和下划线组成的,并且第一个字符必须是字母或下划线。5. 结构化程序设计方法中有三种基本控制结构,以下不正确的是 。DA) 顺序结构B) 选择结构C) 循环结构 D) 数组结构6。 C语言提供的合法关键字是 .DA) swicthB) cha C) Case
3、D) default7以下非法的赋值语句是 CA) n=(i=2,+i); B)j+; C) +(i+1); D)x=j0;【解析】对表达式不能进行自加自减运算。8。在以下一组运算符中,优先级最高的运算符是 。A) 逻辑或“”赋值运算符逗号运算符。由于C选项为求余运算符,所以本题正确答案为C选项。9. 以下四个选项中不能看作一条语句的是 。DA) ; B) a=0,b=0,c=0; C) if(a0) D) if(b=0)m=1;n=2;【解析】C语言的基本语句包含控制语句、表达式语句、空语句、复合语句、函数调用语句。控制语句:完成一定的控制功能,C语言有9种控制语句,分别是if-else、w
4、hile、continue、switch、return、for、do-while、break、goto;表达式语句:由各类表达式构成,后面加上一个分号,就可以单独作为一条语句出现在一行,多数情况下含赋值运算符.复合语句:由一对大括号将一组语句序列括起来形成一个程序段,经常出现在选择或循环语句中。空语句:只有一个分号,表示什么也不做。函数调用语句:由函数名、圆括号内加实参表和分号组成。本题中D选项为三条语句,一条控制语句,链条表达式语句。正确答案为D选项。10。 能将高级语言编写的源程序转换为目标程序的软件是 。DA) 汇编程序B) 编辑程序C) 解释程序D) 编译程序11。以下选项中合法的实型
5、常数是 。CA) 5E2。0B) E-3C) .2E0D) 1。3E【解析】以指数形式表示实数时,字母e或E之前必须有数字,且e后面指数必须为整数.12.依据C语言的语法规则,下列合法标识符是 A A)Else B)else C)user$2 D)5_examp【解析】标识符的定义有明确的规则:(1)标识符只能由字母、数字、下划线三者构成;(2)标识符的首字符必须是字母或者下划线;(3)标识符命名对字母大小写敏感;(4)标识符定义不能和C语言关键字(Key Words)相同。C语言中标识符对大小写敏感,sum和SUM是不同的标识符。13。以下选项中合法的用户标识是 。A) longB) _2T
6、estC) 3DmaxD) A.dat【解析】选项中A为保留字;选项C没有以字母或者“_”开头;选项D中不能有“。”14.在C语言中,字符型数据在内存中的存储形式是 。DA) 原码B) 补码C) 反码D) ASCII码【解析】数据在内存中是以二进制形式存放的。数值是以补码表示的.c的char数据属于基本类型,在内存中字符的存储实际上是把字符相对应的ASCII代码放到存储单元中的.而这些ASCII代码值在计算机中也是以二进制形式存放的.这个与整型的存储很相似.因此这两类之间的转换也比较方便!整型:一个正数的补码和其原码的形式相同。而负数的补码方式是将其绝对值的二进制形式“按位求反再加1”; 实型
7、:在内存中占4个字节,是按照指数形式存储的,实型数据分为小数部分和指数部分,分别存放!计算机用二进制表示小数部分,用2的幂次来表示指数部分!15.以下非法的赋值语句是 。CA) n=(i=2,+i);B) j+;C) +(i+1);D) x=j0;【解析】对表达式不能进行自加自减运算。16.已定义c为字符型变量,则下列正确的赋值语句是 。DA) c=66;B) c=”66”;C) c=”B”;D) c=66;17。已知小写字母的ASCII码为97,对于int a=99, b=b; printf(“c,%d”, a , b);的结果是 。BA) 99, bB) c, 98C) 99, 98D)
8、c, b【解析】字符类型变量用char来定义,特别要注意字符数据在内存中的存储方式:字符数据在内存中是用字符对应的ASCII码存储,其存储形式实质是采用整数形式,由于ASCII码集合中有256个字符,因此用0255这个范围内的256个整数分别与每个字符对应。因此字符型数据和整型数据在一定范围(0255)内,形式上可以相互引用。表现在这两种类型的变量能够以对方形式常量来赋值,以对方的形式来输出,还可以同时出现在算数表达式中参与运算int n=a; /*相当于n=97/char c=65; /相当于c=A,A的ASCII码是65*/printf(”n=d,n=c”,n,n); /*输出:c=97,
9、n=a*/printf(”c=d,c=c”,c,c); /输出:n=65,n=A/虽然字符型数据和整型数据在一定范围内可以通用,但其外在表现形式并不影响各自的数据类型,上例中n本质上还是整型变量,c本质上还是字符型变量。18。若变量a和i已正确定义,且i已正确赋值,合法的语句是 。BA) a=1B) +i;C) a=a+=5D) a=int(i)【解析】C语言的语句必须以分号结束,选项A是错误的.赋值表达式等号的左边只能是变量,而不能是表达式,选项C中含有a+=5,是错误的.选项D中的强制转换类型必须用圆括号将int括起来,也是不正确的。19.假定x和y为double型,则表达式x=2,y=x
10、+3/2的值是 .DA) 3。500000B) 3C) 2。000000D) 3。000000【解析】算出来结果为3,排除A和C选项;又因为是double型,所以D选项为正确答案。20。以下程序的输出结果是 .Cmain() int a=5,b=4,c=6,d; printf(“dn”,d=ab?(ac?a:c):(b);) 5) 4) 6) 不确定【解析】本题考察条件表达式.简单的条件表达式(条件表达式?表达式1:表达式2)可以用来代替if语句进行赋值。详见教材102页.21.设a=3,b=4,c=-5,则逻辑表达式:a b+c & b=c 的值是 。BA) 1B) 0C) 非0D) 语法错
11、【解析】运算符优先级由高到底为算术运算符-关系运算符-&和|赋值运算符。其中&和|的结合方向为从左到右22.表示关系x=y=z的c语言表达式为 .AA) (x=y)&(y=z)B) (x=y)AND(y=z)C) x=y=zD) (x算术运算符关系运算符逻辑与“”逻辑或“赋值运算符逗号运算符。由于关系运算符优先级别高于赋值运算符,所以先执行ab,得到结果为假,即0,所以变量a的值为0。25.能正确表示逻辑关系“a10或a0的C语言表达式是 .BA) a=10 or a=10 | a=0C) a=10 a=0 D) a=10 | a=026。设有定义 int a=3,b=4,c=5; ,则以下表
12、达式中,值为0的表达式是 。D A) a&b B) a=b C) a|b+c&bc D) !((a0; k-=3) putchar(*); 输出是 。B A)* B)* C)* D)无限循环【解析】在k分别为16,13,10,7,4,1的时候,分别输出一个.putchar()函数(字符输出函数)的作用是向终端输出一个字符。用putchar()函数可以输出能在屏幕上显示的字符,也可以输出控制字符,如putchar(n)的作用是输出一个换行符,使输出的当前位置移到下一行的开头.35.已知int i=1;执行语句while(i+4)后,变量i的值为 。CA) 3 B) 4 C) 5 D) 6【解析】
13、i+是先进行其他运算,运算终了后再将i加1。所以循环中过程如下:i=0判断i4:成立i=i+1,于是i=1继续循环:判断i4:成立i=i+1,于是i=2继续循环:判断i4:成立i=i+1,于是i=3继续循环:判断i4:成立i=i+1,于是i=4继续循环:判断i4:不成立i=i+1,于是i=5跳出循环,程序结束36。已知:int a 3=1,2,3,4,5,6,7,8,9,0; 则数组a的第一维的大小是 .C A)2 B)3 C) 4 D)无法确定;【解析】此数组共3列。应该是在C语言中如果对全部元素都赋初值(即提供全部初始数据),则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。系统
14、会根据总个数和第二维的长度算出第一维的长度。本题中一共有10个元素,每行3列,显然可以确定行数为4。见教材138.37.判断字符串的长度,应该使用的函数是 。A) strcat B) strcmp C) strcpy D) strlen【解析】strlen(string )字符串长度strcpy(字符数组1,字符串2)STRingCoPY(字符串复制)的简写.它是“字符串复制函数”,作用是将字符串2复制到字符数组1中去。见教材147页。strcat(字符数组1,字符数组2)-(字符串连接)其作用是连接两个字符数组中的字符串,把字符串2接到字符串1的后面,结果放在字符数组1中,函数调用后得到一个
15、函数值-字符数组1的地址。 strcmp(string ,string )-比较2个字符串,0为相同,0前1个大,7) m-;printf(“dn”,m);C)9876B)10987A)9 8 7D)1098【解析】复习一下while循环的执行过程:(1)计算while一对圆括号中表达式的值.当值为非零时,执行步骤(2);当值为零时,执行步骤(4)。(2)执行循环体中语句.(3)转去执行步骤(1)。(4)退出while循环。由以上while循环的一般过程来看,只有当while后面的括号中表达式的值为零时才停止循环。本题中,当m=7是循环停止,也就是说最后一个输出的应是7.开始m被赋予10,进入
16、循环体,由于m-;所以m自减1为9,所以第一个输出的应是9。44.若有如下程序段,其中s、a、b、c均已定义为整型变量,且a、c均已赋值(c大于0)s=a; for(b=1;b=c;b+) s=s+1;则与上述程序段功能等价的赋值语句是 .BA) s=a+b;B) s=a+c;C) s=s+c;D) s=b+c;【解析】掌握两点:一、a赋给了s;二、s执行c次自加;所以最终相当于将a+c赋给了s。45。以下程序中,while循环的循环次数是 。Dmain() int i=0;while(i10) if(i1)continue; if(i=5)break; i+; A) 1B) 10C) 6D)
17、 死循环,不能确定次数【解析】在循环中,如果执行continue,将直接开始下一次循环,不继续执行continue下面的语句.进入循环时,i=0,当执行到if(i1)continue;一句时,将执行continue命令,直接开始下一次循环,i的值始终没有变,循环条件(i10)将一直满足下去。所以,程序将一直无法退出循环,即死循环。46。当对两个字符串进行比较时,应该使用的函数是 。BA) strcatB) strcmpC) strcpyD) strlen47若有定义“int k,q;”,则下列各选项中赋值表达式正确的是 。BA) q=(&k+1)B) q=kC) q=kD) q=&k【解析】(
18、1)本题的定义语句中,在q前面有一个*号说明符,表示q是一个指针变量,而C语言规定,在指针变量中只能存放存储单元(即变量)的地址。(2)因为在定义中,q的基类型为int,所以q中只能存放int类型变量的地址。(3)在C程序中&号是求地址符,表达式&k的值是变量k在内存中的地址,而*号的作用是求地址指向单元的值.(4)现在来看看选项C和D.C中,是把整型变量直接赋给指针变量q,由于赋值不兼容性,这是错误的。D中,企图把k的地址赋给一个整型变量(p在此可代表一整型变量),这也是不允许的,地址值不可能转换为一个整数.(5)关于A,还得声明一点,地址符&只能应用于变量和以后将要介绍的数组元素,不可以用
19、于表达式,常量或者被说明为register的常量。因此A也不正确。(6)那答案只能是B,因为此处q中只能存放int类型的地址,而k是int型,&k又是k的地址,B当然是正确的。48。若有以下定义:char s20= “programming”,*ps=s;则不能代表字符g的表达式是 。AA) ps+3B) s3C) ps3D) ps+=3,*ps【解析】1、C语言对字符串常量是按字符数组处理的,在内存中开辟了一个字符数组用来存放该字符串常量。2、指向数组的指针变量也可以带下标,如pi与*(p+i)等价。详见教材231页.49.以下能正确定义数组并正确赋初值的语句是 .CA) int N=5,b
20、NN;B) int a12=1,3;C) int c2= 1,2,3,4;D) int d32=1,2,34;【解析】如果对全部元素都赋初值 (即提供全部初始数据),则定义数组时对第一维的长度可以不指定,但第二维的长度不能省!系统会根据总个数和第二维的长度算出第一维的长度。 详见教材p13850.假设已定义 char c8= ”test”;int i; 则下面的输出函数调用中错误的是 。DA) printf(”%s,c);B) for(i=0;i8;i+) printf(”c,ci);C) puts(c)D) for(i=0;i8;i+) puts(ci);【解析】首先A、B两个选项是没有问题
21、的,puts函数一般形式为puts(字符数组),其作用是输出字符串,所以D选项是错误的。51。下程序段:char s20 =xyz”, *sp=s; strcat(sp,”12345); puts(sp);的输出结果是 。AA) xyz12345B) 12345xyzC) 12345D) xyz 【解析】strcat(字符数组1,字符数组2)-(字符串连接)其作用是连接两个字符数组中的字符串,把字符串2接到字符串1的后面,结果放在字符数组1中,函数调用后得到一个函数值-字符数组1的地址。 52。 在执行int a 3=1,2,3,4; 语句后a12的值是 。CA. B。 C。 D. 【解析】考
22、查知识点:二维数组的初始化int a 3=1,2,3,4;初始化的数组元素如下:53已知:int a 3=1,2,3,4,5,6,7,8,9,0; 则数组a的第一维的大小是 。CA. 2 B. 3 C。 4 D. 无法确定;【解析】此数组共3列。应该是在C语言中如果对全部元素都赋初值(即提供全部初始数据),则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。系统会根据总个数和第二维的长度算出第一维的长度.本题中一共有10个元素,每行3列,显然可以确定行数为4.见教材138。54。设有定义语句:char str20=”Hello”,Beijing”,p=str; 则printf(”%dn
23、,strlen(p+20);输出结果是 。CA)0 B) 5 C)7 D)20【解析】数组char str20实际上是一个2行20列的字符数组。p正好指向H,一个英文字母占一个字节,这样p+20就指向第二行的第一列,也就是”Beijing的B,所以输出结果是7。注意:虽然第一行,第二行都没有排满,但Hello其后是0,而不是空格。55。用数组名作为函数调用时的实参,则实际传递给形参的是 。CA) 数组的第一个元素值B) 数组中全部元素值C) 数组的首地址D) 数组的元素个数二、读程序,写出程序执行结果1. void main() int a=5, b=8; printf(“a=d b=dn,
24、a,b) ; a=a+b; b=ab; a=ab; printf(“a=%d b=%dn, a,b) ; 运行结果:a=5 b=8a=8,b=52。 include stdio.hvoid main() int k=4,n=0;for( ; nk ; ) n+;if(n3!=0) continue;k- ; printf(”d,dn”,k,n);运行结果:3,33.#include void main() int a33=1,2,3,4,5,6,i,j,s=0;for(i=0;i3;i+)for(j=0;j=i;j+)s+=aij;printf(“%dn”,s);运行结果:195#includ
25、e stdio.hvoid main() int i,j;for(i=0; i3;i+)for(j=0; j=i;j+)printf(”);printf(n”);运行结果:*6#include stdio.h void main() int i; for (i=0; ivoid main()int i,n=1,2,3,4,5;for(i=0;i2;i+)ni=n4i+1;printf(”d ,ni);for(i=0;i5;i+)printf(d ,ni);运行结果:65653458#include char fun(char *s)if( *s = a & s = z ) s=*s-32;re
26、turn *s;void main()char a20=”Welcome”,*p,ch;for(p=a;*p!=0;p+)ch=fun(p);putchar(ch);运行结果:WELCOME9main() int a44=1,2,3,-4,0,12,13,14,21,23,0,-24,-31,32,33,0; int i, j, s=0; for (i=0; i4; i+) for (j=0; j4; j+) if (aij 0) continue; if (aij = 0) break; s += aij; printf(dn”, s); 运行结果:5810main() int k=4,n=
27、0;for( ; nk ; ) n+;if(n3!=0) continue;k-; printf(d,dn,k,n);运行结果:3,3三、编程题1. 设有分段函数:1 (x0)Y= 0 (x=0)1 (x0) 编一程序,输入一个 x值,输出 y 的值。具体程序详见教材100页.2求下列分段函数的值。已验证 #include stdio。hvoid main() int x;float y; printf(“输入x:);scanf(“%dn,&x); if(xb y= ab a=b ab具体程序请参照上述两题。4编写程序,用公式求的近似值,直到某一项的绝对值小于106为止。具体程序详见教材124
28、页。5任意输入100个整数,分别统计其中的正数、负数和零的个数。include stdio。hmain() int j=0,k=0,l=0;/j,k,l分别为正整数,0,负整数的个数。 int *p; int a100;/容纳这100个整数的数组 for(p=a;p(a+100);p+) scanf(“%d”,p); for(p=a;p(a+100);p+) if(p0) j+; elseif(p=0) k+;else l+; printf(“正数的个数为%dn0的个数为dn负数的个数为%dn”,j,k,l);6计算:s=1+1/1+1/2+1/n,其中n由键盘输入。已验证错误的程序:incl
29、ude stdio。hmain()int n;float s; scanf(“%f,&n);for(n=1,s=1.0;n=100;n+) s=s+1.0/n; printf(“%fn”,s);请同学们自己体会错误程序的原因。正确的程序:#include stdio.hmain()int n;float s,k; scanf(“%d”,n); s=1.0;for(k=1;kmain()int N,i,j,row=0,colum=0,max,min; int aNN;max=a00;min=a00;for(i=0;iN;i+) for(j=0;jN;j+)scanf(“%d,&aij);for(i=0;iN;i+) for(j=0;jmax) max=aij; row=i; colum=j; printf(“max=%d,row=%d,colum=%dn,max,row,colum);for(i=0;iN;i+)
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100