c语言程序设计综合练习题集.pdf
.-CC 语言程序设计语言程序设计 综合练习题综合练习题一、单项选择题一、单项选择题1.C 语言中根本数据类型有。C CA 整型、实型、逻辑型B整型、字符型、逻辑型C 整型、实型、字符型D整型、实型、字符型、逻辑型2.在 C 语言中,数字 O29 是一个。A AA 八进制数 B 十进制数 C 十六进制数 D 非法数3.在以下关于 C 语言的不严格的表达中,错误的说法是。A AA 在标识符中,大写字母和小些字母的意义一样B 有些不同类型的变量可以在一个表达式中运算C 在赋值表达式中等号=左边的变量和右边的值可以是不同类型D 同一个运算符号在不同的场合可以有不同的含义4.以下关于 C 语言用户标识符的表达中正确的选项是。B BA用户标识符中可以出现下划线和中划线减号B用户标识符中不可以出现中划线,但可以出现下划线C用户标识符中可以出现下划线,但不可以放在用户标识符的开头D用户标识符中可以出现下划线和数字,它们都可以放在用户标识符的开头【解析】考察 C 语言中的用户标识符规则,在 C 语言程序设计中,用户标识符是由字母、数字和下划线组成的,并且第一个字符必须是字母或下划线。5.构造化程序设计方法中有三种根本控制构造,以下不正确的选项是。D DA)顺序构造B)选择构造C)循环构造 D)数组构造6.C 语言提供的合法关键字是。D DA)swicthB)chaC)Case D)default7以下非法的赋值语句是 C CA)n=(i=2,+i);B)j+;C)+(i+1);D)*=j0;【解析】对表达式不能进展自加自减运算。8.在以下一组运算符中,优先级最高的运算符是。.优选-.-A)算术运算符关系运算符逻辑与&逻辑或|赋值运算符逗号运算符。由于 C 选项为求余运算符,所以此题正确答案为 C 选项。9.以下四个选项中不能看作一条语句的是。D DA);B)a=0,b=0,c=0;C)if(a0)D)if(b=0)m=1;n=2;【解析】C 语言的根本语句包含控制语句、表达式语句、空语句、复合语句、函数调用语句。控制语句:完成一定的控制功能,C 语言有 9 种控制语句,分别是 if-elseif-else、whilewhile、continuecontinue、switchswitch、returnreturn、forfor、do-whiledo-while、breakbreak、gotogoto;表达式语句:由各类表达式构成,后面加上一个分号,就可以单独作为一条语句出现在一行,多数情况下含赋值运算符。复合语句:由一对大括号将一组语句序列括起来形成一个程序段,经常出现在选择或循环语句中。空语句:只有一个分号,表示什么也不做。函数调用语句:由函数名、圆括号加实参表和分号组成。此题中 D 选项为三条语句,一条控制语句,链条表达式语句。正确答案为D 选项。10.能将高级语言编写的源程序转换为目标程序的软件是。D DA)汇编程序B)编辑程序C)解释程序 D)编译程序11.以下选项中合法的实型常数是。C CA)5E2.0B)E-3C).2E0D)1.3E【解析】以指数形式表示实数时,字母e 或 E 之前必须有数字,且 e 后面指数必须为整数。12.依据 C 语言的语法规则,以下合法标识符是A A A)Else B)else C)user$2 D)5_e*amp【解析】标识符的定义有明确的规则:1标识符只能由字母、数字、下划线三者构成;2标识符的首字符必须是字母或者下划线;3标识符命名对字母大小写敏感;4标识符定义不能和 C 语言关键字Key Words一样。C 语言中标识符对大小写敏感,sum 和 SUM 是不同的标识符。13.以下选项中合法的用户标识是。.优选-.-A)longB)_2TestC)3Dma*D)A.dat【解析】选项中 A 为保存字;选项 C 没有以字母或者_开头;选项 D 中不能有.14.在 C 语言中,字符型数据在存中的存储形式是。D DA)原码B)补码C)反码D)ASCII 码【解析】数据在存中是以二进制形式存放的。数值是以补码表示的。c 的 char 数据属于根本类型,在存中字符的存储实际上是把字符相对应的 ASCII 代码放到存储单元中的。而这些 ASCII代码值在计算机中也是以二进制形式存放的。这个与整型的存储很相似。因此这两类之间的转换也比拟方便!整型:一个正数的补码和其原码的形式一样。而负数的补码方式是将其绝对值的二进制形式按位求反再加 1”;实型:在存中占4 个字节,是按照指数形式存储的,实型数据分为小数局部和指数局部,分别存放!计算机用二进制表示小数局部,用2 的幂次来表示指数局部!15.以下非法的赋值语句是。C CA)n=(i=2,+i);B)j+;C)+(i+1);D)*=j0;【解析】对表达式不能进展自加自减运算。16.已定义 c 为字符型变量,则以下正确的赋值语句是。D 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);的结果是。B BA)99,bB)c,98C)99,98D)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,n=a*/.优选-.-printf(c=%d,c=%c,c,c);/*输出:n=65,n=A*/虽然字符型数据和整型数据在一定围可以通用,但其外在表现形式并不影响各自的数据类型,上例中 n 本质上还是整型变量,c 本质上还是字符型变量。18.假设变量 a 和 i 已正确定义,且 i 已正确赋值,合法的语句是。B BA)a=1B)+i;C)a=a+=5D)a=int(i)【解析】C 语言的语句必须以分号完毕,选项A 是错误的。赋值表达式等号的左边只能是变量,而不能是表达式,选项 C 中含有 a+=5,是错误的。选项 D 中的强制转换类型必须用圆括号将int 括起来,也是不正确的。19.假定*和 y 为 double 型,则表达式*=2,y=*+3/2 的值是。D DA)3.500000B)3C)2.000000D)3.000000【解析】算出来结果为 3,排除 A 和 C 选项;又因为是 double 型,所以 D 选项为正确答案。20.以下程序的输出结果是。C Cmain()int a=5,b=4,c=6,d;printf(%dn,d=ab(aca:c):(b);)5)4)6)不确定【解析】此题考察条件表达式。简单的条件表达式条件表达式.表达式 1:表达式2可以用来代替if 语句进展赋值。详见教材102 页。21.设 a=3,b=4,c=-5,则逻辑表达式:a|b+c&b=c 的值是。B BA)1B)0C)非 0D)语法错【解析】运算符优先级由高到底为算术运算符-关系运算符-&和|-赋值运算符。其中&和|的结合方向为从左到右22.表示关系*=y=z 的 c 语言表达式为。A AA)(*=y)&(y=z)C)*=y=zB)(*=y)AND(y=z)D)(*=y)&(yz-后,*,y,z 的值分别是。D D)1,1,1)1,2,0)0,1,1)0,2,0【解析】注:前缀是先增值后引用,后缀是先引用再增值注:前缀是先增值后引用,后缀是先引用再增值24.int a=4,b=5;,执行表达式 a=ab 后,变量 a 的值为。A AA0 B1 C4 D5【解析】C 语言常用的积累运算符的优先级关系是:逻辑非!算术运算符关系运算符逻辑与&逻辑或|赋值运算符逗号运算符。由于关系运算符优先级别高于赋值运算符,所以先执行 ab,得到结果为假,即 0,所以变量 a 的值为 0。25.能正确表示逻辑关系a10 或 a0”的 C 语言表达式是。B BA)a=10 or a=10|a=10&a=10|a=026.设有定义 int a=3,b=4,c=5;,则以下表达式中,值为0 的表达式是。D D A a&b B a=b C a|b+c&b-c D!(a=A&ch=A&ch0;k-=3)putchar(*);输出是。B B A*B*C*D无限循环【解析】在 k 分别为 16,13,10,7,4,1 的时候,分别输出一个*。putchar函数字符输出函数的作用是向终端输出一个字符。用 putchar函数可以输出能在屏幕上显示的字符,也可以输出控制字符,如 putcharn的作用是输出一个换行符,使输出的当前位置移到下一行的开头。35.int i=1;执行语句 while(i+4)后,变量 i 的值为。C C.优选-.-A)3 B)4 C)5 D)6【解析】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继续循环:判断 i0 前 1 个大,7)m-;printf(%dn,m);A)9B)10987计算析】复习C)9876while 一一下D)1098对圆括号中表达式的while 循环的执行过【解87程:1值。当值为非零时,执行步骤2;当值为零时,执行步骤4。.优选-.-2执行循环体中语句。3转去执行步骤1。4退出 while 循环。由以上 while 循环的一般过程来看,只有当 while 后面的括号中表达式的值为零时才停顿循环。此题中,当 m=7 是循环停顿,也就是说最后一个输出的应是7.开场 m 被赋予 10,进入循环体,由于 m-;所以 m 自减 1 为 9,所以第一个输出的应是9.44.假设有如下程序段,其中s、a、b、c 均已定义为整型变量,且 a、c 均已赋值c 大于 0s=a;for(b=1;b=c;b+)s=s+1;则与上述程序段功能等价的赋值语句是。B 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 循环的循环次数是。D Dmain()int i=0;while(i10)if(i1)continue;if(i=5)break;i+;A)1B)10C)6D)死循环,不能确定次数【解析】在循环中,如果执行continue,将直接开场下一次循环,不继续执行continue 下面的语句。.优选-.-进入循环时,i=0,当执行到if(i1)continue;一句时,将执行continue 命令,直接开场下一次循环,i 的值始终没有变,循环条件i10将一直满足下去。所以,程序将一直无法退出循环,即死循环。46.当对两个字符串进展比拟时,应该使用的函数是。B BA)strcatB)strcmpC)strcpyD)strlen47假设有定义int k,*q;,则以下各选项中赋值表达式正确的选项是。B BA)q=(&k+1)B)q=&kC)q=kD)*q=&k【解析】1此题的定义语句中,在 q 前面有一个*号说明符,表示 q 是一个指针变量,而 C语言规定,在指针变量中只能存放存储单元即变量的地址。2因为在定义中,q 的基类型为 int,所以 q 中只能存放 int 类型变量的地址。3在 C 程序中&号是求地址符,表达式&k 的值是变量 k 在存中的地址,而*号的作用是求地址指向单元的值。4现在来看看选项 C 和 D。C 中,是把整型变量直接赋给指针变量 q,由于赋值不兼容性,这是错误的。D 中,企图把k 的地址赋给一个整型变量*p 在此可代表一整型变量,这也是不允许的,地址值不可能转换为一个整数。5关于 A,还得声明一点,地址符&只能应用于变量和以后将要介绍的数组元素,不可以用于表达式,常量或者被说明为register 的常量。因此 A 也不正确。6那答案只能是 B,因为此处 q 中只能存放 int 类型的地址,而 k 是 int 型,&k 又是 k 的地址,B 当然是正确的。48.假设有以下定义:char s20=programming,*ps=s;则不能代表字符 g 的表达式是。A AA)ps+3【解析】1、C 语言对字符串常量是按字符数组处理的,在存中开辟了一个字符数组用来存放该字符串常量。2、指向数组的指针变量也可以带下标,如pi与*(p+i)等价。详见教材 231 页。49.以下能正确定义数组并正确赋初值的语句是。C CA)int N=5,bNN;B)int a12=1,3;B)s3C)ps3D)ps+=3,*ps.优选-.-C)int c2=1,2,3,4;D)int d32=1,2,34;【解析】如果对全部元素都赋初值 即提供全部初始数据,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省!系统会根据总个数和第二维的长度算出第一维的长度。详见教材 p13850.假设已定义 char c8=test;int i;则下面的输出函数调用中错误的选项是。D DA)printf(%s,c);C)puts(c)B)for(i=0;i8;i+)printf(%c,ci);D)for(i=0;i8;i+)puts(ci);【解析】首先 A、B 两个选项是没有问题的,puts 函数一般形式为 puts(字符数组),其作用是输出字符串,所以 D 选项是错误的。51.下程序段:char s20=*yz,*sp=s;strcat(sp,12345);puts(sp);的输出结果是。A AA)*yz12345B)12345*yzC)12345D)*yz【解析】strcat(字符数组 1,字符数组 2)-字符串连接其作用是连接两个字符数组中的字符串,把字符串 2 接到字符串 1 的后面,结果放在字符数组1 中,函数调用后得到一个函数值-字符数组 1 的地址。52.在执行 int a 3=1,2,3,4;语句后 a12的值是。C CA.B.C.D.【解析】考察知识点:二维数组的初始化int a 3=1,2,3,4;初始化的数组元素如下:12034053:int a 3=1,2,3,4,5,6,7,8,9,0;则数组 a 的第一维的大小是。C CA.2 B.3 C.4 D.无法确定;14【解析】此数组共 3 列。应该是7023568900在 C 语言中如果对全部元素都赋初值 即提供全部初始数据,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。系统会根据总个数和第二维的长度算出第一维的长度。此题中一共有 10 个元素,每行 3 列,显然可以确定行数为4.见教材 138.优选-.-54.设有定义语句:char str20=Hello,Beijing,*p=str;则 printf(%dn,strlen(p+20);输出结果是。C CA0 B 5 C7 D20【解析】数组 char str20实际上是一个 2 行 20 列的字符数组。*p 正好指向 H,一个英文字母占一个字节,这样 p+20 就指向第二行的第一列,也就是Beijing的 B,所以输出结果是 7。注意:虽然第一行,第二行都没有排满,但Hello 其后是 0,而不是空格。55.用数组名作为函数调用时的实参,则实际传递给形参的是。C CA)数组的第一个元素值B)数组中全部元素值C)数组的首地址D)数组的元素个数二、读程序,写出程序执行结果二、读程序,写出程序执行结果1.void main()int a=5,b=8;printf(a=%d b=%dn,a,b);a=a+b;b=a-b;a=a-b;printf(a=%d b=%dn,a,b);运行结果:a=5 b=8a=8,b=52.*include void main()int k=4,n=0;for(;nk;)n+;if(n%3!=0)continue;k-;printf(%d,%dn,k,n);运行结果:3,3.优选-.-3.*include void main()int*=1,a=0,b=0;switch(*)case 0:b+;case 1:a+;case 2:a+;b+;printf(a=%d,b=%dn,a,b);运行结果:a=2,b=14.*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*include void main()int i,j;for(i=0;i3;i+)for(j=0;j=i;j+)printf(*);printf(n);.优选-.-运行结果:*6*include void main()int i;for(i=0;i3;i+)switch(i)case 1:printf(%d,i);case 2:printf(%d,i);default:printf(%d,i);运行结果:0111227*include void main()int i,n=1,2,3,4,5;for(i=0;i2;i+)ni=n4-i+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;return*s;void main()char a20=Wele,*p,ch;for(p=a;*p!=0;p+)ch=fun(p);putchar(ch);.优选-.-运行结果:WELE9main()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=0;for(;nk;)n+;if(n%3!=0)continue;k-;printf(%d,%dn,k,n);运行结果:3,3三、编程题三、编程题1.设有分段函数:-1(*0)编一程序,输入一个*值,输出 y 的值。具体程序详见教材 100 页。2求以下分段函数的值。已验证*include.优选-.-voidmain()int*;float y;printf(输入*:);scanf(%dn,&*);if(*by=a abb a=b a*b具体程序请参照上述两题。4编写程序,用/4 11/31/51/7公式求的近似值,直到*一项的绝对值小于-610 为止。具体程序详见教材 124 页。5任意输入 100 个整数,分别统计其中的正数、负数和零的个数。*include main()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;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 由键盘输入。已验证错误的程序:*include main()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 main()int n;float s,k;scanf(%d,&n);s=1.0;for(k=1;k=n;k+)s=s+1.0/k;printf(%fn,s);7任意输入 aNN个数,找出并输出其中的最大数和最小数,以及它们的下标。此题涉及到二维动态数组的输入*include main()int N,i,j,row=0,colum=0,ma*,min;int aNN;ma*=a00;min=a00;for(i=0;iN;i+).优选-.-for(j=0;jN;j+)scanf(%d,&aij);for(i=0;iN;i+)for(j=0;jma*)ma*=aij;row=i;colum=j;printf(ma*=%d,row=%d,colum=%dn,ma*,row,colum);for(i=0;iN;i+)for(j=0;jN;j+)if(aijmin)min=aij;row=i;colum=j;printf(min=%d,row=%d,colum=%dn,min,row,colum);8以*为字符,打印一个正三角形。已验证*include main()int n,i,j;printf(n=%dn);scanf(%d,&n);/边长 n 由程序输入 for(i=0;in;i+)for(j=0;jn-1-i;j+)printf();for(j=0;j2*i+1;j+)printf(*);printf(n);运行的时候,任意输入一个数字,然后回车即可。9以为字符,打印一个 6 行的倒正三角形。已验证*include main().优选-.-int n,i,j;printf(n=%dn);scanf(%d,&n);/边长 n 由程序输入 for(i=0;in;i+)for(j=0;j-i;j+)printf();/输出空格for(j=0;j(2*(n-i)-1);j+)printf(*);printf(n);运行时输入 6,回车即可输出倒正三角。编程思路:*第 0 行:0 个空格,11 个*,即 2*6-1=2*n-i-1*第 1 行:1 个空格,9 个*,即 2*5-1=2*n-i-1*第 2 行:2 个空格,7 个*,即 2*4-1=2*n-i-1*第 3 行:3 个空格,5 个*,即 2*3-1=2*n-i-1*第 4 行:4 个空格,3 个*,即 2*2-1=2*n-i-1*第 5 行:5 个空格,1 个*,即 2*1-1=2*n-i-1【n=6,i 为相应行数】10.打印 101000 之间满足以下条件的所有数:正序读和反序读都一样,例如:55、232 等。已验证*include main()int n,a,b,c;for(n=10;n1000;n+)a=n/100;b=(n-100*a)/10;c=n-100*a-10*b;if(a=0&b=c)printf(%5d,n);if(a!=0&a=c)printf(%5d,n);.优选-