1.1 C语言基础知识
1.【2011年9月选择题第11题】以下叙述中错误的是________。 A)C语言编写的函数源程序,其文件名后缀可以是.C B)C语言编写的函数都可以作为一个的源程序文件 。 C)C语言编写的每个函数都可以进行的编译并执行 D)一个C语言程序只能有一个主函数 参:C
【解析】C语言编写的每个函数可以被编译,但是除主函数外不能执行。
2.【2011年3月选择题第11题】计算机高级语言程序的运行方法有编译执行和解释执行两种,以下叙述中正确的是
A)C语言程序仅可以编译执行 B)C语言程序仅可以解释执行
C)C语言程序既可以编译执行又可以解释执行 D)以上说法都不对 参:A
【解析】解释程序是将源程序(如BASIC)作为输入,解释一句后就提交计算机执行一句,并不形成目标程序。编译程序是把高级语言(如FORTRAN、COBOL、Pascal、C等)源程序作为输入,进行翻译转换,产生出机器语言的目标程序,然后再让计算机执行这个目标程序,得到计算结果。
3.【2011年3月选择题第12题】以下叙述中错误的是 A)C语言的可执行程序是由一系列机器指令构成的 B)用C语言编写的源程序不能直接在计算机上运行
C)通过编译得到的二进制目标程序需要连接才可以运行
D)在没有安装C语言集成开发环境的机器上不能运行C源程序生成的.exe文件 参:D
【解析】C语言的可执行程序是由一系列机器指令组成的,用C语言编写的源程序必须经过编译生成二进制目标代码,再经过连接才能运行,并且可以脱离C语言集成开发环境。故答案为D)。
1.2 常量、变量和数据类型
4.【2011年9月选择题第13题】以下选项中关于C语言常量的叙述错误的是 。 A)所谓常量,是指在程序运行过程中,其值不能被改变的量 B)常量分为整型常量、实型常量、字符常量和字符串常量 C)常量可分为数值型常量和非数值型常量 D)经常被使用的变量可以定义成常量 参:D
【解析】常量是其值不可变化的量。常量分为数字常量和字符常量。在C语言中,常量多是通过符号常量来表示的。数字常量又包括整形常量和浮点型常量,浮点型常量又称实数。在程序中不希望被改变的变量才定义为常量,而不是经常使用的变量。
1
5.【2011年9月选择题第14题】若有定义语句:int a=10;double b=3.14;,则表达式’A’+a+b值的类型是________。
A)char B)int C)double D)float 参:C
【解析】本题考查数据类型的自动转换,C语言语法规定,当不同的变量相加时按最长的变量对齐,即转换优先级为:char < int < float < double。
6.【2011年9月选择题第21题】以下不能输出字符A的语句是(注:字符A的ASCII码值为65,字符a的ASCII码值为97)________。 A)printf(\"%c\\n\",'a'-32); B)printf(\"%d\\n\",'A'); C)printf(\"%c\\n\",65); D)printf(\"%c\\n\",'B'-1); 参:B
【解析】A)、C)、D)三个选项的输出格式都是%c,只有B)的输出格式是%d,只会输出数字65,所以应选择B)。
7.【2011年9月填空题第12题】有以下程序 #include { int c[3]={0},k,i; while((k=getchar())!='n') c[k-'A']++; for(i=0;i<3;i++) printf(\"%d\",c[i]); printf(\"\\n\"); } 若程序运行时从键盘输入ABCACC<回车>,则输出结果为__【12】__。 参:213 【解析】当输入A时,a[0]++;当输入B时,a[1]++;当输入C时,a[2]++;直到遇到回车循环停止,题输入2个A,1个B,3个C,所以输出结果为213。 8.【2011年3月选择题第13题】以下选项中不能用作C程序合法常量的是 A)1,234 B) '\\123' C)123 D)\"\\x7G\" 参:A 【解析】常量是在程序运行过程中,其值不能被改变的量。常量类型包括:整型常量、实例常量、字符常量、字符串常量和符号常量。A)含有逗号,容易理解为逗号表达式,所以不能作为常量;B)选项为字符常量,表示八进制数123代表的ASCII字符;C)选项为整型常量;D)选项为字符串常量。 9.【2011年3月选择题第14题】以下选项中可用作C程序合法实数的是 A).1e0 B)3.0e0.2 C)E9 D)9.12E 参:A 【解析】浮点型常量有十进制小数形式和指数形式。指数形式要求字母e(或者E)之前必须有数字,且e后面的指数必须为整数。B)、C)、D)都是不合法的指数形式,故答案为A)。 10.【2011年3月填空题第8题】有以下程序(说明:字符0的ASCIl码值为48) 2 #include { char c1,c2; scanf(\"%d\",&c1); c2=c1+9; printf(\"%c%c\\n\",c1,c2); } 若程序运行时从键盘输入48<回车>,则输出结果为 【8】 。 参:09 【解析】本题中通过ASCII码对字符变量赋值,由于字符0的ASCII码是48,因此字符变量c1为0,c2的ASCII码比c1大9,因此c2为9。 11.【2010年9月选择题第13题】以下叙述中错误的是 A)C程序在运行过程中所有计算都以二进制方式进行 B)C程序在运行过程中所有计算都以十进制方式进行 C)所有C程序都需要编译链接无误后才能运行 D)C程序中整型变量只能存放整数,实型变量只能存放浮点数 参:B 【解析】C程序在运行过程中所有计算都以二进制方式进行,所以A)正确B)错误。所有C程序先编译再链接,全都无误后才能运行。C程序中整型变量用于存放整数,实型变量用于存放浮点数。所以,本题答案为B)。 12.【2010年9月选择题第15题】以下选项中能表示合法常量的是 A)整数:1,200 B)实数:1.5E2.0 C)字符斜杠:'\\' D)字符串:\"\\007\" 参:D 【解析】A)选项中1,200不能表示整数1200。B)选项中应表示为1.5E2。在C语言中,反斜杠是转义符,其后必须跟有其他字符,所以选项C)也是错误的。D)选项正确。 13.【2010年3月选择题第13题】以下C语言用户标识符中,不合法的是 A)_1 B)AaBc C)a_b D)a--b 参:D 【解析】标识符由字母、下划线、数字三个方面组成,开头必须是字母或下划线。 14.【2010年3月选择题第16题】以下关于C语言数据类型使用的叙述中错误的是 A)若要准确无误差地表示自然数,应使用整数类型 B)若要保存带有多位小数的数据,应使用双精度类型 C)若要处理如\"人员信息\"等含有不同类型的相关数据,应自定义结构体类型 D)若只处理\"真\"和\"假\"两种逻辑值,应使用逻辑类型 参:D 【解析】C语言中没有逻辑类型,若只处理\"真\"或\"假\"两种逻辑值,可以使用整型数\"1\"或\"0\"表示,故选D。 15.【2009年9月选择题第12题】以下选项中,能用作用户标识符的是________。 A)void B) 8_8 3 C)_0_ D)unsigned 参:C 【解析】 C语言的标识符命名规则为:①只能由字母、数值和下划线3种字符组成;②第一个字符必须是字母或下划线;③不能与C语言中的关键字或保留字相同。 16.【2009年9月选择题第22题】有以下定义语句,编译时会出现编译错误的是________。 A)char a='a'; B)char a='\\n'; C)char a='aa'; D)char a='\\x2d'; 参:C 【解析】 aa是字符串,不用加上单引号。 17.【2009年3月选择题第11题】以下选项中合法的标识符是________。 A)1_1 B)1-1 C)_11 D)1_ _ 参:C 【解析】标识符命名规则:标识符必须由字母(a~z或A~Z)或下划线(_)开头;标识符的其他部分可以用字母、下划线或数字(0~9)组成;大小写字母表示不同意义,如cout和Cout代表不同的标识符;在定义标识符时,虽然语法上允许用下划线开头,但是,我们最好避免定义用下划线开头的标识符,因为编译器常常定义一些下划线开头的标识符。因此,本题正确答案为C)。 18.【2009年3月选择题第12题】若函数中有定义语句:int k;,则________。 A)系统将自动给k赋初值0 B)这时k中的值无定义 C)系统将自动给k赋初值-1 D)这时k中无任何值 参:B 【解析】用int方法定义变量时,编译器仅为变量开辟存储单元,并没有在存储单元中存放任何值,此时变量中的值是无确定的,称变量值\"无意义\"。因此,本题正确答案为B)。 19.【2009年3月选择题第13题】以下选项中,能用作数据常量的是________。 A)o115 B)0118 C)1.5e1.5 D)115L 参:D 【解析】 整型常量和实型常量统称为数值型常量。本题中A)项是数字和字符的组合,不能构成数值型常量。B)项以0开头代表该常量是一个8进制数,但其后面的数字中又出现了\"8\",因此不正确。C)项用指数形式表示实型常量,但e后面必须为整数,不正确。D)项中一个常量后面加字母L表示长整型数据。因此,本题答案为D)。 4 第2章 运算符与表达式 2.1 C语言运算符简介 20.【2010年9月选择题第38题】有以下程序 #include { int s,t,A=10;double B=6; s=sizeof(A); t=sizeof(B); printf(\"%d,%d\\n\",s,t); } 在VC6平台上编译运行,程序运行后的输出结果是 A)2,4 B)4,4 C)4,8 D)10,6 参:C 【解析】sizeof的作用就是返回一个对象或者类型所占的内存字节数。在VC6中整型占4个字节,双精度实型占8个字节,所以选C)。 2.2 算术运算符和算术表达式 21.【2011年9月填空题第7题】以下程序运行后的输出结果是__【7】__。 #include { int a=37; a%=9;printf(\"%d\\n\",a); } 参:1 【解析】本题考查的是取余运算。37%9 商为4,余数为1,所以输出的值为1。 22.【2011年3月选择题第18题】有以下程序 #include { int x=011; printf(\"%d\\n\",++x); } 程序运行后的输出结果是 A)12 B)11 C)10 D)9 参:C 【解析】x=011表示把八进制的11赋值给变量x,因此x的值为十进制的9,程序运行的结果输出变量x自加运算后的十进制值,即10。 23.【2011年3月填空题第6题】以下程序运行后的输出结果是 【6】 。 #include { int a; 5 a=(int)((double)(3/2)+0.5+(int)1.99*2); printf(\"%d\\n\",a); } 参:3 【解析】本题中3/2=1,(double)(3/2)=1,(int)1.99*2=1*2=2,因此(int)(1+0.5+2)=(int)3.5=3。 24.【2010年3月选择题第12题】以下关于C语言的叙述中正确的是 A)C语言中的注释不可以夹在变量名或关键字的中间 B)C语言中的变量可以在使用之前的任何位置进行定义 C)在C语言算术表达式的书写中,运算符两侧的运算数类型必须一致 D)C语言的数值常量中夹带空格不影响常量值的正确表示 参:A 【解析】C语言中注释可以放在任何位置,但不能夹在变量名或关键字中间,选项A正确;C语言中的变量要在使用之前定义,C标准规定定义位置在相关程序块的首部,选项B错误;C语言中两侧数据类型可以不一致,系统可进行强制类型转换,选项C错误;C语言数值常量中不允许存在空格,选项D错误。 25.【2010年3月填空题第13题】以下程序的功能是:将值为三位正整数的变量x中的数值按照个位、十位、百位的顺序拆分并输出。请填空。 #include {int x=256; printf(\"%d-%d-%d\\n\【13】,x/10%10,x/100); } 参:x%10 【解析】x=256,x%10=6。 26.【2009年9月选择题第14题】表达式:(int)((double)9/2)-(9)%2的值是________。 A)0 B)3 C)4 D)5 参:B 【解析】 (int)((double)9/2)的值为4,(9)%2的值为1,因此(int)((double)9/2)-(9)%2的值为3。 27.【2009年9月填空题第6题】若有定义语句:int a=5;,则表达式:a++的值是__【6】__。 参:5 【解析】 a++的含义是在使用a值以后,使a值加1,所以a++的值为5。 28.【2009年9月填空题第7题】若有语句double x=17;int y;,当执行y=(int)(x/5)%2;之后y的值为__【7】__。 参:1 【解析】 y=(int)(x/5)%2=(int)(3.4)%2=3%2=1。 29.【2009年3月填空题第6题】表达式(int)((double)(5/2)+2.5)的值是__【6】__。 参:4 6 【解析】计算5/2=2,其结果先转换为double类型,即2.000000,然后加上2.5为4.5000000,再转换为int型,所以结果为4。 2.3 赋值运算符和赋值表达式 30.【2011年9月选择题第15题】若有定义语句:int x=12,y=8,z;,在其后执行语句z=0.9+x/y;,则z的值为________。 A)1.9 B)1 C)2 D)2.4 参:B 【解析】x的值为12,y的值为8,那么x/y的值就是1,因为z的类型是int,所以0.9+1变成int的值就是1,所以选择B)。 31.【2011年3月选择题第15题】若有定义语句:int a=3,b=2,c=1;,以下选项中错误的赋值表达式是 A)a=(b=4)=3; B)a=b=c+1; C)a=(b=4)+c; D)a=1+(b=c=4); 参:A 【解析】在A)选项中,赋值语句b=4先把4赋值给整型变量b,之后执行(b=4)=3是把常量3赋值给常量4,但是由于C语言规定赋值运算符的左侧只能是变量,不能是常量或者表达式,因此A)选项错误。 32.【2010年9月选择题第14题】有以下定义:int a;long b;double x,y;则以下选项中正确的表达式是 A)a%(int)(x-y) B)a=x!=y; C)(a*y)%b D)y=x+y=x 参:B 【解析】A)选项中如果x与y的值相等那么取余时就会有除数为0的情况。C)选项中取余的两个数据都应为整数,不能有一方为实型变量,而a*y的结果为double型。D)选项表达式本身就错误,不能给表达式赋值。所以,本题答案为B)。 33.【2009年9月选择题第15题】若有定义语句:int x=10;,则表达式x-=x+x的值为________。 A)-20 B)-10 C)0 D)10 参:B 【解析】 x-=x+x可化为:x=x-(x+x),由于x初始值为10,所以计算后,x=10-20=-10,因此选B)。 34.【2010年9月选择题第16题】表达式a+=a-=a=9的值是 A)9 B)-9 C)18 D)0 参:D 【解析】题干中的表达式可以分解为以下表达式:① a=9;② a=a-a 即a=9-9,此时a的值为0;③ a=a+a 即a=0+0,此时a的值为0。故本题的答案为D)。 35.【2009年3月选择题第14题】设有定义:int x=2;,以下表达式中,值不为6的是________。 A)x*=x+1 B)x++,2*x C)x*=(1+x) 7 D)2*x,x+=2 参:D 【解析】 本题考察逗号运算符的运算方式,逗号运算符的作用是将若干表达式连接起来,它的优先级别在所有运算符中是最低的,结合方向为\"自左至右\"。A)项和C)项的结果是一样的,可展开为:x=x*(x+1)=2]+,因为++运算符有自加功能,逗号之前执行后x的值为3,逗号后的值就是整个表达式的值,即6;D)项逗号之前并未给x赋值,所以表达式的值就是x+=2的值,即4。因此,本题答案为D)。 2.4 位运算 36.【2011年9月选择题第38题】有以下程序 #include { int a=2,b; b=a<<2;printf(\"%d\\n\",b); } 程序运行后的输出结果是________。 A)2 B)4 C)6 D)8 参:D 【解析】考查移位操作,b的值是由a左移两位,所以b的值为2×2×2=8。 37.【2011年3月选择题第39题】有以下程序 #include { unsigned char a=8,c; c=a>>3; printf(\"%d\\n\",c); } 程序运行后的输出结果是 A)32 B)16 C)1 D)0 参:C 【解析】本题中将8赋值给字符变量a,则a的二进制为\"00001000\",a>>3的位运算是把a向右移动三位,结果为\"00000001\",输出其十进制的值1。 38.【2010年9月选择题第40题】有以下程序 #include { short c=124; c=c ; printf(\"%d\\n\",c); } 若要使程序的运行结果为248,应在下划线处填入的是 A)>>2 B)| 248 C)&0248 D)<<1 参:D 【解析】短整型在存储时占用16位,按照移位运算如果右移两位就等于原数除以4,结果 8 为31,如果左移一位相当于原数乘以2结果为248,所以选择D)。 39.【2010年3月选择题第39题】有以下程序 #include {int a=2,b=2,c=2; printf(\"%d\\n\} 程序运行后的输出结果是 A)0 B)1 C)2 D)3 参:A 【解析】对于a/b&c,先求a/b,得到1,然后求1&c(即按位与操作),显然得0。 40.【2009年9月选择题第39题】若有以下程序段: int r=8; printf(\"%d\\n\",r>>1); 输出结果是________。 A)16 B)8 C)4 D)2 参:C 【解析】 8用二进制表示为1000,右移1位后为0100,即十进制4。 41.【2009年3月选择题第39题】有以下程序: #include { int a=5,b=l,t; t=(a<<2)|b;printf(\"%d\\n\",t); } 程序运行后的输出结果是________。 A)2l B)11 C)6 D)1 参:A 【解析】按位或运算符\"|\"是双目运算符,其功能是参与运算的两数各对应的二进位相或。左移运算符\"<<\"是双目运算符,其功能把\"<<\"左边的运算数的各二进位全部左移若干位,由\"<<\"右边的数指定移动的位数,高位丢弃,低位补0。将5变换为二进制数为101,左移2位后为10100,1转换为二进制数为00001,10100与00001进行或运算后为10101,再将其转换为十进制数为21。因此,本题答案为A)。 9 第3章 基本语句 3.1 C语句概述 42.【2009年9月选择题第16题】有以下程序: #include { int a=1,b=0; printf(\"%d,\",b=a+b); printf(\"%d\\n\",a=2*b); } 程序运行后的输出结果是________。 A)0,0 B)1,0 C)3,2 D)1,2 参:D 【解析】 执行第一个printf语句时,b=a+b=1,所以输出1,执行第二个printf语句时,a=2*b=2,所以输出结果为2。 3.2 赋值语句 3.3 输入输出概念及其实现 3.4 单个字符的输入与输出 3.5 数据格式的输入与输出 43.【2011年9月选择题第16题】若有定义:int a,b;,通过语句scanf(\"%d;%d\",&a,&b);,能把整数3赋给变量a,5赋给变量b的输入数据是________。 A)3 5 B)3,5 C)3;5 D)35 参:C 【解析】在C语言中scanf函数中输入数据时要严格按照所规定的样式输入。 44.【2011年9月填空题第6题】若程序中已给整型变量a和b赋值10和20,请写出按以下格式输出a、b值的语句__【6】__。 ****a=10,b=20**** 参:printf(\"****a=%d,b=%d****\ 【解析】本题考查的是printf函数的用法, prinrf函数实际上是将所有参数按字符输出。 45【2010年9月填空题第6题】以下程序运行后的输出结果是 【6】 。 #include { int a=200,b=010; printf(\"%d%d\\n\",a,b); } 10 参:2008 【解析】整型变量a的值为200,b的值\"010\"是用八进制表示的\"10\"即十进制的\"8\",最后输出格式均为%d,即十进制格式,所以输出为\"2008\"。 46【2010年9月填空题第7题】有以下程序 #include { int x,y; scanf(\"%2d%1d\",&x,&y);printf(\"%d\\n\",x+y); } 程序运行时输入:1234567,程序的运行结果是 【7】 。 参:15 【解析】可以指定输入数据所占列宽,系统自动按所指定的格式截取所需数据。%2d即将输入数据的2个列宽的数据赋给变量 x ,因为输入的为\"1234567\",所以前两个列宽的数据为12,即x的值为12,同理%1d即把输入数据中前两个列宽所在数据后的一个列宽的数据赋给变量y,所以y的值为3 ,所以x+y的值为15。 47【2010年3月选择题第15题】有以下程序 #include {char a,b,c,d; scanf(\"%c%c\ c=getchar();d=getchar(); printf(\"%c%c%c%c\\n\} 当执行程序时,按下列方式输入数据(从第1列开始, 则输出结果是 A)1234 B)12 C)12 D)12 3 34 参:C 【解析】程序根据用户输入分别给字符型变量a、b、c、d赋值为'1'、'2'、' 48【2010年3月选择题第22题】有以下程序,其中k的初值为八进制数 #include { int k=011; printf(\"%d\\n\} 程序运行后的输出结果是 A)12 B)11 C)10 D)9 11 参:D 【解析】011转换成十进制为9,并且k++表示先使用k的值,再使k的值加1,所以输出值为9。 49【2009年9月选择题第13题】阅读以下程序: #include { int case;float printF; printf(\"请输入2个数:\"); scanf(\"%d %f\",&case,&printF); printf(\"% d %f\\n\",case,printF); } 该程序在编译时产生错误,其出错原因是________。 A)定义语句出错,case是关键字,不能用作用户自定义标识符 B)定义语句出错,printF不能用作用户自定义标识符 C)定义语句无错,scanf不能作为输入函数使用 D)定义语句无错,printf不能输出case的值 参:A 【解析】 标识符不能与C编译系统已经预定义的、具有特殊用途的保留标识符(即关键字)同名,否则程序在编译时会出现错误。题目源程序中使用了已经预定义的关键字case,所以将出现错误。 50【2009年9月选择题第23题】有以下程序: #include { char cl,c2; cl='A'+'8'-'4'; c2='A'+'8'-'5'; printf(\"%c,%d\\n\",cl,c2); } 已知字母A的ASCIl码为65,程序运行后的输出结果是________。 A)E,68 B)D,69 C)E,D D)输出无定值 参:A 【解析】 c1输出字符的ASCII码比字母A大4,即字母E;c2以十进制数字形式输出,因此可以判断本题答案为A)。 51【2009年3月选择题第15题】程序段:int x=12;double y=3.141593;printf(\"%d%8.6f\",x,y);的输出结果是________。 A)123.141593 B)12 3.141593 C)12,3.141593 D)123.1415930 参:A 12 【解析】 本题考查printf函数的输出格式控制符,%m.nf表示指定输出的实型数据的宽度为m(包含小数点),并保留n位小数。当输出数据的小数位大于n时,截去右边多余的小数,并对截去的部分的第一位小数做四舍五入处理;当输出数据的小数位小于n时,在小数的最右边补0,输出数据的小数部分宽度为n。若给出的总宽度m小于n加上整数位数和小数点,则自动突破m的;反之,数字右对齐,左边补空格。本题中3.141593数值长度为8,小数位数为6,因此左端没有空格,故正确答案为A)。 52【2009年3月选择题第23题】有以下程序: #include { int a1, a2; char c1,c2; scanf(\"%d%c%d%c\",&a1,&c1,&a2,&c2); printf(\"%d,%c,%d,%c\",a1,c1,a2,c2); } 若想通过键盘输入,使得a1的值为12,a2的值为34,c1的值为字符a,c2的值为字符b,程序输出结果是:12,a,34,b。正确的输入格式是(以下ㄩ代表空格, B)12ㄩaㄩ34ㄩb 【解析】 当输入整数或实数等数值型数据时,输入的数据之间必须用空格、回车、制表符等间隔符号隔开,间隔符个数不限。但整数和字符之间不用空格隔开,因为空格会被当作一个字符读入。因此,本题答案为A)。 53【2009年3月填空题第7题】若变量x、y已定义为int类型且x的值为99,y的值为9,请将输出语句printf(__【7】__,x/y); 补充完整,使其输出的计算结果形式为:x/y=11。 参:\"x/y=%d\" 【解析】printf语句中,除了格式转换说明外,字符串中的其他字符(包括空格)将按原样输出 54【2009年3月填空题第8题】有以下程序: #include { char c1,c2 ; scanf(\"%c\",&c1); while(c1<65||c1>90) scanf(\"%c\",&c1); c2=c1+32; printf(\"%c,%c\\n\",c1,c2); } 程序运行输入65回车后,能否输出结果、结束运行(请回答能或不能)__【8】__。 参:不能 【解析】c1,c2被定义为字符类型,当输入65时是以字符形式读入,只能读到字符6,6的ASCII码值是54,满足while(c1<65||c2>90),所以执行scanf(\"%c\",&c1),即不能输出结果。 13 第4章 选择结构 4.1 关系运算符和关系表达式 55【2011年9月选择题第19题】下列条件语句中,输出结果与其他语句不同的是________。 A)if(a) printf(\"%d\\n\",x); else printf(\"%d\\n\",y); B)if(a==0) printf(\"%d\\n\",y); else printf(\"%d\\n\",x); C)if(a!=0) printf(\"%d\\n\",x); else printf(\"%d\\n\",y); D)if(a==0) printf(\"%d\\n\",x); else printf(\"%d\\n\",y); 参:D 【解析】考查if语句中的判断,可以由A)、B)、C)三个选项看出,都是表示,只有当a不等于0时输出x,否则输出y,D)选项正好相反,所以选择D)。 56【2010年9月选择题第17题】若变量已正确定义,在if(W)printf(\"%d\\n\",k);中,以下不可替代W的是 A)a<>b+c B)ch=getchar() C) a==b+c D)a++ 参:A 【解析】在C语言中,表示不等于不能用\"<>\",而只能使用\"!=\"。其他选项均满足题目的要求。 4.2 逻辑运算符和逻辑表达式 57【2011年9月选择题第17题】若有定义语句:int k1=10,k2=20;,执行表达式(k1=k1>k2)&&(k2=k2>k1)后,k1和k2的值分别为________。 A)0和1 B)0和20 C)10和1 D)10和20 参:B 【解析】考查运算符的相关知识,逻辑与运算符的规则是如果第一个参数的值为0,那么就不会执行第二个参数的内容,在本题中,程序执行到第一个括号时,k1的值变为0,且括号内的值为0 ,所以不会执行第二个括号中的语句,即k2仍然保持原值,所以答案为0,20。 58【2010年3月选择题第14题】若有定义:double a=22;int i=0,k=18;,则不符合C语言规定的赋值语句是 A)a=a++,i++; B)i=(a+k)<=(i+k); C)i=a%11; D)i=!a; 参:C 【解析】C语言中取余运算符两侧的操作数只能是整型(若为char型,则会自动转换成整型)。 59【2010年3月选择题第17题】若a是数值类型,则逻辑表达式(a==1)||(a!=1)的值是 A)1 B)0 C)2 D)不知道a的值,不能确定 参:A 【解析】当A==1时,(A==1)||(A!=1)为真;当A!=1时,(A==1)||(A!=1)也为真,故正确答案为A。 14 60【2010年3月填空题第6题】在C语言中,当表达式值为0时表示逻辑值\"假\",当表达式值为 【8】 时表示逻辑值\"真\"。 参:非0 【解析】本题一定要明确一个概念,即:所有非0的数(并不只是\"1\"),在c语言中都表示逻辑值为\"真\"。 61【2009年9月选择题第21题】有以下程序: #include { int n=2,k=0; while(k++&&n++>2); printf(\"%d %d\\n\",k,n); } 程序运行后的输出结果是________。 A)0 2 B)1 3 C)5 7 D)1 2 参:D 【解析】 本题考查逻辑运算符的\"短路\"现象,由于k的值为0,表达式首先去求k++的值,因为表达式k++的值为0,系统完全可以确定逻辑表达式的运算结果总是为0,因此将跳过n++>2,不再对它进行求值,即k的值加1,n的值不变。 62【2009年9月填空题第8题】以下程序运行后的输出结果是 __【8】__。 #include { int x=20; printf(\"%d\",0 【解析】 第一个printf语句输出的结果是逻辑表达式(x>0||x<20)的值,显然为真,即为1;第二个printf语句输出的是逻辑表达式(x>0&&x<20)的值,该值为假,即为0。 63【2009年3月填空题第10题】下列程序运行时,若输入1abcedf2df<回车> 输出结果为__【10】__。 #include { char a=0,ch; while((ch=getchar())!=‘\\n’) { if(a%2!=0&&(ch>=‘a’&&ch<=‘z’)) ch=ch-’a’+’A’; a++;putchar(ch); } printf(\"\\n\"); } 参:1AbCeDf2dF 15 【解析】本题考查逻辑运算和ASCII码。While循环的功能是对输入的第偶数个且为小写字母的字符进行处理,将小写字母转化为大写,因此答案为1AbCeDf2dF。 4.3 if语句和if选择结构 【2011年9月选择题第18题】有以下程序 #include { int a=1,b=0; if(--a) b++; else if(a==0) b+=2; else b+=3; printf(\"%d\\n\",b); } 程序运行后的输出结果是________。 A)0 B)1 C)2 D)3 参:C 【解析】本题考查运算符和选择语句,执行到if语句时,--a为0,所以不会执行后面的语句,但是会执行else if 后面的语句,所以执行后,b=2,选项C)正确。 65【2011年3月选择题第17题】if语句的基本形式是:if(表达式)语句,以下关于\"表达式\"值的叙述中正确的是 A)必须是逻辑值 B)必须是整数值 C)必须是正数 D)可以是任意合法的数值 参:D 【解析】if语句中的表达式可以是逻辑值也可以是任意合法的数值,表达式的运算结果为非0(真)或者0(假)。 66【2011年3月选择题第27题】有以下程序 #include { int x=1,y=0; if(!x)y++; else if(x==0) if(x)y+=2; else y+=3; printf(\"%d\\n\",y); } 程序运行后的输出结果是 A)3 B)2 C)1 D)0 参:D 【解析】根据在if…else语句中,else总是和最近的if配对的原则,本题中层次关系是:if (!x)与else if(x==0)是一组,在最外层。而if(x)与else是一组,位于else if(x==0)条件的内层。据此所有条件均不成立,所以y未进行任何操作,仍为0。 16 67【2011年3月填空题第7题】有以下程序 #include scanf(\"%d\",&x); if(x>15)printf(\"%d\",x-5); if(x>10)printf(\"%d\",x); if(x>5)printf(\"%d\\n\",x+5); } 若程序运行时从键盘输入12<回车>,则输出结果为 【7】 。 参:1217 【解析】本题中输入12时,第一条if的条件x>15不满足因此不执行,第二条if的条件x>10满足因此输出12,第三条if的条件x>5满足因此输出17。 68【2011年3月填空题第10题】以下程序运行后的输出结果是 【10】 。 #include { int x=10,y=20,t=0; if(x==y)t=x;x=y;y=t; printf(\"%d%d\\n\",x,y); } 参:20 0 【解析】本题中if选择的条件x==y不满足,因此直接执行后面的x=y和y=t,则x的值为20,y的值为0。 69【2010年9月选择题第18题】有以下程序 #include { int a=1,b=0; if(!a)b++; else if(a==0) if(a) b+=2; else b+=3; printf(\"%d\\n\",b); } 程序运行后的输出结果是 A)0 B)1 C)2 D)3 参:A 【解析】根据在if…else语句中,else总是和最近的if配对的原则,本题中层次关系是:if(!a)与else if(a==0)是一组,在最外层。而if(a)与else是一组,位于else if(a==0)条件的内层。据此所有条件均不成立,所以b未进行任何操作仍为初始值0。 70【2010年3月选择题第19题】有如下嵌套的if语句 if(aif(a else k=c; else if(b 71【2010年3月填空题第7题】有以下程序 #include { int a=1,b=2,c=3,d=0; if(a==1) if(b!=2) if(c==3)d=1; else d=2; else if(c!=3)d=3; else d=4; else d=5; printf(\"%d\\n\} 程序运行后的输出结果是【7】。 参:4 【解析】a==1为真,b!=2为假,c!=3为假,所以d=4。 72【2009年9月选择题第17题】设有定义:int a=1,b=2,c=3;,以下语句中执行效果与其他三个不同的是________。 A)if(a>b)c=a,a=b,b=c; B)if(a>b){c=a,a=b,b=c;} C)if(a>b)c=a;a=b;b=c; D)if(a>b){c=a;a=b;b=c;} 参:C 【解析】 逗号表达式的求解过程是:按表达式顺序从左往右依次求解。本题中由于判断条件a>b的值为假,所以选项A)、B)、D)中if语句后面的语句均未被执行,而C)中的后两条语句a=b和b=c被执行,因此选项C)的执行效果与其他三个不同。 73【2009年9月选择题第19题】以下程序段中,与语句:k=a>b?(b>c?1:0):0;功能相同的是________。 A)if((a>b)&&(b>c))k=1; 18 else k=0; B)if((a>b)‖(b>c))k=1; else k=0; C)if(a<=b)k=0; else if(b<=c)k=1; D)if(a>b)k=1; else if(b>c) k=1; else k=0; 参:A 【解析】 表达式k=a>b?(b>c?1∶0)∶0表示:如果(a>b)条件为真,则k取值(b>c?1∶0),否则k取值0;当a>b的情况下,如果b>c,则k值为1,否则为0。所以该表达式与选项A)功能相同。 74【2009年3月选择题第17题】以下是if语句的基本形式: if(表达式)语句 其中\"表达式\"________。 A)必须是逻辑表达式 B)必须是关系表达式 C)必须是逻辑表达式或关系表达式 D)可以是任意合法的表达式 参:D 【解析】 C语言中if(表达式)中表达式的值可以是任意合法的表达式,如果表达式的值为0表示条件为假,如果表达式的值非0表示条件为真。 75【2009年3月选择题第18题】有以下程序: #include scanf(\"%d\",& x); if(x<=3); else if(x!=10) printf(\"%d\\n\",x); } 程序运行时,输入的值在哪个范围才会有输出结果________。 A)不等于10的整数 B)大于3且不等10的整数 C)大于3或等于10的整数 D)小于3的整数 参:B 【解析】 if-else控制结构中,else总是与最近的未配对的if匹配。本题的执行过程为:如果输入整数小于3则不进行任何操作,否则判断是否不等于10,若为真则进行输出。因此程序输出的数据为大于3且不等于10的整数。 76【2009年3月选择题第19题】有以下程序: #include < stdio.h> 19 main() { int a=l,b=2,c=3,d=0; if(a==l && b++==2) if(b!=2||c--!=3) printf(\"%d,%d,%d\\n\",a,b,c); else printf(\"%d,%d,%d\\n\",a,b,c); else printf(\"%d,%d,%d\\n\",a,b,c); } 程序运行后的输出结果是________。 A)1,2,3 B)1,3,2 C)l,3,3 D)3,2,1 参:C 【解析】 程序首先执行第一个判断语句,a==1成立;b++==2,先判断b是否为2,再进行b加1操作,执行后b的值为3。继续执行第二个判断语句,注意程序此时进行逻辑或运算,b!=2的值为真,因此条件表达式b!=2||c--!=3的值为真,程序便不再执行第二个逻辑语句c--!=3,而直接进行输出操作。因此,本题正确答案为C)。 4.4 switch语句和goto语句 77【2010年9月选择题第19题】若有定义语句int a,b;double x;则下列选项中没有错误的是 A) switch(x%2) B)switch((int)x/2.0) { case 0:a++;break; { case 0:a++;break; case 1:b++;break; case 1:b++;break; default :a++;b++; default:a++;b++; } } C)switch((int)x%2) D)switch((int)(x)%2) { case 0:a++;break; { case 0.0:a++;break; case 1:b++;break; case 1.0:b++;break; default:a++;b++; default:a++;b++; } } 参:C 【解析】switch()中括号内的变量类型应该与下面case语句后的常量保持类型一致。使用(int)x,可以将x强制转换成整型,然后与整型2做取余运算还是整型数据。若与数据2.0做取余运算,按照转换原理:向高精度的数据类型进行转换,结果就变成了实型数据。综上所述,本题C)正确,B)错误。A),D)均不满足switch语句的原则。 78【2010年3月选择题第18题】以下选项中与if(a==1)a=b;else a++;语句功能不同的switch语句是 A)switch(a) { case 1:a=b;break; default:a++; } B)switch(a==1) 20 { case 0:a=b;break; case 1:a++; } C)switch(a) { default:a++;break; case 1:a=b; } D)switch(a==1) { case 1:a=b;break; case 0:a++; } 参:B 【解析】switch(a==1)语句中,若a等于1,则a==1为\"真\",则应该进行a=b的操作,故选项B错误。 21 第5章 循环结构 5.1 循环语句概述 5.2 while循环语句 79【2011年9月选择题第20题】有以下程序 #include { int a=7; while(a--); printf(\"%d\\n\",a); } 程序运行后的输出结果是________。 A)-1 B)0 C)1 D)7 参:A 【解析】考查while循环,当a为0时,while(a--)下面的语句不会执行,但是会执行a--,所以最后a的结果为-1。 80【2011年3月选择题第26题】有以下程序段 #include while(getchar()!='\\n'); … } 以下叙述中正确的是 A)此while语句将无限循环 B)getchar()不可以出现在while语句的条件表达式中 C)当执行此while语句时,只有按回车键程序才能继续执行 D)当执行此while语句时,按任意键程序就能继续执行 参:C 【解析】本题中while循环条件为getchar()!='\\n',如果不按下回车键,则循环条件getchar()!='\\n'一直成立,形成一个空循环;如果按下回车键,则循环条件不成立使循环结束,程序继续执行。 81【2010年9月选择题第20题】有以下程序 #include { int a=l,b=2; while(a<6) {b+=a; a+=2;b%=10;} printf(\"%d,%d\\n\",a,b); } 22 程序运行后的输出结果是 A)5,11 B)7,1 C)7,11 D)6,1 参:B 【解析】第一次循环后 b为3,a为3;第二次循环后b为6,a为5;第三次循环:执行b+=a,所以b为11;执行a+=2所以a为7;执行b%=10,所以b为1。 82【2010年9月选择题第21题】有以下程序 #include { int y=10; while(y--); printf(\"y=%d\\n\",y); } 程序执行后的输出结果是 A)y=0 B)y=-1 C)y=l D)while构成无限循环 参:B 【解析】当y减为1时判断while(y--),此时满足条件,但是y变成0。下次循环判断while(y--)时,因为y为0不满足条件跳出循环,但是此时也要执行y--,所以y变成了-1。 打印输出时输出-1。 5.3 do…while循环语句 83【2009年9月填空题第9题】以下程序运行后的输出结果是__【9】__。 #include { int a=1,b=7; do{ b=b/2; a+=b; } while(b>1); printf(\"%d\\n\",a);} 参:5 【解析】 第一次循环执行后,b=3,a=4,满足条件b>1,循环继续;第二次循环执行后,b=1,a=5,不满足条件b>1,结束循环。所以输出的a值为5。 5.4 for循环语句 84【2011年9月填空题第8题】以下程序运行后的输出结果是__【8】__。 #include { int i,j; for(i=6;i>3;i--) j=i; printf(\"%d%d\\n\",i,j); } 参:34 【解析】该题中,只有执行完for循环后才输出数据,当for循环执行到最后一层时,即i=3 23 时,停止循环,此时i为3,j为上此循环的值为4,所以最终输出结果为34。 85【2011年9月填空题第10题】以下程序运行后的输出结果是__【10】__。 #include for(a=0;a<15;a+=5) { putchar(a+’A’); } printf(\"\\n\"); } 参:AFK 【解析】本题是进行字符输出,第一次输出0+'A',即A;第二次输出5+'A',即F;第三次输出10+'A',即K,然后跳出循环。 86【2011年3月选择题第22题】若i和k都是int类型变量,有以下for语句 for(i=0,k=-1;k=1;k++)printf(\"*****\\n\"); 下面关于语句执行情况的叙述中正确的是 A)循环体执行两次 B)循环体执行一次 C)循环体一次也不执行 D)构成无限循环 参:D 【解析】本题程序中,for循环的循环条件是k=1,这个语句是赋值语句总是正确的,因此循环条件将一直满足,构成一个无限循环。 87【2011年3月选择题第23题】有以下程序 #include { char b,c; int i; b='a'; c='A'; for(i=0;i<6;i++) { if(i%2)putchar(i+b); else putchar(i+c); } printf(\"\\n\"); } 程序运行后的输出结果是 A)ABCDEF B)AbCdEf C)aBcDeF D)abcdef 参:B 【解析】本题中当变量i取值为0、2、4时,i可以被2整除,程序执行putchar(i+c),分别输出ACE;当变量i取值为1、3、5时,2除i的余数不为0,因此程序执行putchar(i+b),分别输出bdf。所以最终输出AbCdEf。 88【2010年3月选择题第21题】有以下程序 #include 24 { int a=1,b=2; for(;a<8;a++){b+=a;a+=2;} printf(\"%d,%d\\n\} 程序运行后的输出结果是 A)9,18 B)8,11 C)7,11 D)10,14 参:D 【解析】初始值a=1,b=2,第一次循环:b=b+a=2+1=3,a=a+2=1+2=3,a=a+1=3+1=4;第二次循环:b=b+a=3+4=7,a=a+2=4+2=6,a=a+1=6+1=7;第三次循环:b=b+a=7+7=14,a=a+2=7+2=9,a=a+1=9+1=10,故本题答案选D。 【2009年9月填空题第10题】有以下程序: #include { int f,fl,f2,i; f1=0;f2=1; printf(\"%d %d \",f1,f2); for (i=3;i<=5;i++) { f=f1+f2;printf(\"%d\",f); f1=f2;f2=f; } printf(\"\\n\"); } 程序运行后的输出结果是__【10】__。 参:0 1 123 【解析】 第一个printf语句输出结果为0 1。循环体总共循环三次,第一次循环结果为,f=1,f1=1,f2=1;第二次循环结果为f=2,f1=1,f2=2;第三次循环结果为f=3,f1=2,f2=3。 5.5 循环的嵌套 90【2010年3月填空题第8题】有以下程序 #include { int m,n; scanf(\"%d%d\ while(m!=n) { while(m>n)m=m-n; while(m 程序运行后,当输入14 63<回车>时,输出结果是【8】。 参:7 【解析】执行while(m 25 91【2009年3月选择题第20题】以下程序段中的变量已正确定义: for(i=0;i<4;i++,i++) for(k=l;k<3;k++);printf(\"*\"); 程序段的输出结果是________。 A)******** B)**** C)** D)* 参:D 【解析】 本题考察for循环语句,注意第二个for语句的后面有一个分号,即printf函数不属于循环体,无论循环执行多少次,printf(\"*\")语句只执行一次。因此,本题正确答案为D)。 5.6 几种循环的比较 92【2009年3月选择题第22题】设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是________。 A)n=0;while((ch=getchar())!='\\n')n++; B)n=0;while(getchar()!='\\n')n++; C)for(n=0;getchar()!='n';n++); D)n=0;for(ch=getchar();ch!='\\n';n++); 参:D 【解析】 A)项每进行一次循环判断一个字符是否为回车,如果不是就进行下一次判断,因此可以统计出输入字符个数;B)项与A)项的判断相似,仅为是否将读入的数据赋值给一个变量,因此并不影响判断结果;C)想用for循环来判断,与B)项的判断完全相同,可以统计出输入字符个数;D)项中ch=getchar()是给变量ch赋初值,如果输入回车,则程序只循环一次,如果输入一个非回车的字符,则程序进入死循环。因此,本题正确答案为D)。 5.7 break语句和continue语句 93【2011年3月选择题第19题】有以下程序 #include scanf(\"%d\",&s); while(s>0) { switch(s) { case 1:printf(\"%d\",s+5); case 2:printf(\"%d\",s+4);break; case 3:printf(\"%d\",s+3); default:printf(\"%d\",s+1);break; } scanf(\"%d\",&s); } } 运行时,若输入123450<回车>,则输出结果是 26 A)65656 B)66656 C)66666 D)6666656 参:A 【解析】switch语句执行完一个case后面的语句后,流程控制转移到下一个case语句继续执行,遇到break会跳出本次循环。本题中输入1时会输出65,输入2时会输出6,输入3时会输出,输入4时会输出5,输入5时会输出6,在输入0时不满足循环条件,程序执行结束。 94【2011年3月选择题第20题】有以下程序段 int i,n; for(i=0;i<8;i++) { n=rand()%5; switch(n) { case 1: case 3:printf(\"%d\\n\",n);break; case 2: case 4:printf(\"%d\\n\",n);continue; case 0: exit(0); } printf(\"%d\\n\",n); } 以下关于程序段执行情况的叙述,正确的是 A)for循环语句固定执行8次 B)当产生的随机数n为4时结束循环操作 C)当产生的随机数n为1和2时不做任何操作 D)当产生的随机数n为0时结束程序运行 参:D 【解析】当产生的随机数n为1或2时,由于没有遇到break,因此程序将分别顺序执行case 3与case 4;当n为3时,程序输出n的值后跳出switch语句;当n为4时,程序输出n的值后将继续执行下一次循环;当n为0时,程序执行exit函数结束运行。 95【2010年3月选择题第20题】有以下程序 #include { int i,j,m=1; for(i=1;i<3;i++) { for(j=3;j>0;j--) {if(i*j>3)break; m*=i*j; } } printf(\"m=%d\\n\} 程序运行后的输出结果是 A)m=6 B)m=2 C)m=4 D)m=5 参:A 27 【解析】第一次循环i=1,j=3和j=2时都能执行m*=i*j,此时得到m的值为6;然后进行第二次循环i=2,j=3时会执行break语句,内部循环直接结束,此时i再加1,也会导致退出外部循环,所以最终结果m的值为6。 96【2009年9月选择题第18题】有以下程序: #include { int c=0,k; for (k=1;k<3;k++) switch(k) { default: c+=k; case 2:c++;break; case 4:c+=2;break; } printf(\"%d\\n\",c); } 程序运行后的输出结果是________。 A)3 B)5 C)7 D)9 参:A 【解析】 第一次循环时,k=1,在switch语句中,先执行default后面的语句,即c=c+k=1,因为没有break语句,所以不会跳出switch结构,会接着执行case2后面的语句,即c=c+1=2,然后跳出switch;第二次循环时,k=2,直接执行case2后面的语句,即c=c+1=3,然后跳出switch语句,结束循环,执行输出语句。 97【2009年3月选择题第28题】以下函数按每行8个输出数组中的数据: void fun(int *w,int n) { int i; for(i=0;i printf(\"\\n\"); } 下划线处应填入的语句是________。 A)if(i/8==0)printf(\"\\n\"); B)if(i/8==0)continue; C)if(i%8==0)printf(\"\\n\"); D)if(i%8==0)continue; 参:C 【解析】 在C语言循环语句中continue用来跳出当次循环,因此B)项和D)项不正确。if(i/8==0)是指当i除以8的得数等于0,即i的值小于8时,打印换行,因此A)项不正确。if(i%8==0)是指当i除以8的余数等于0,即当间隔8个数时,打印换行,因此选项C)正确。 28 98【2009年3月填空题第9题】以下程序运行后的输出结果是__【9】__。 #include { int k=1,s=0; do{ if((k%2)!=0)continue; s+=k; k++; }while(k>10); printf(\"s=%d\\n\",s); } 参:s=0 【解析】continue语句用于跳出本次循环,直接进行下一次循环。进行if判断时k的值为1不能够被2整除,因此执行continue退出本次循环,不对s进行任何操作,直接进行循环条件判断,此时k的值为1不满足循环条件,退出while循环,输出s的值为0。\\ 29 第6章 数组 6.1 一维数组的定义和引用 99【2011年9月填空题第9题】以下程序运行后的输出结果是__【9】__。 #include { int i,n[]={0,0,0,0,0}; for(i=1;i<=2;i++) { n[i]=n[i-1]*3+1; printf(\"%d\",n[i]); } printf(\"\\n\"); } 参:14 【解析】考查for循环的基础知识,当i=1时,a[1]为1,输出为1,当i=2时,a[2]为1*3+1=4,所以输出为4,最终输出为14。 100【2011年9月填空题第13题】以下程序运行后的输出结果是__【13】__。 #include { int n[2],i,j; for(i=0;i<2;i++) n[i]=0; for(i=0;i<2;i++) for(j=0;j<2;j++) n[j]=n[i]+1; printf(\"%d\\n\",n[1]); } 参:3 【解析】该题先是初始化数组n[2]中的元素全部赋值为0,然后执行两层for循环,当i=0,j=0,a[0]为1、a[1]为0,当j=1时,a[0]为1、a[1]为2;当i=1,j=0,a[0]为3、a[1]为2,当i=1,j=1时,a[0]为3、a[1]为3。 101【2011年3月填空题第11题】已知a所指的数组中有N个元素。函数fun的功能是,将下标k(k>0)开始的后续元素全部向前移动一个位置。请填空。 void fun(int a[N],int k) { int i; for(i=k;i 【解析】本题中要将数组元素向前移动一个位置,就要使a[i]赋值给前一个元素a[i-1]。 102【2011年3月填空题第13题】以下程序运行后的输出结果是 【13】 。 #include 30 { int i,n[5]={0}; for(i=1;i<=4;i++) { n[i]=n[i-1]*2+1;printf(\"%d\",n[i]);} printf(\"\\n\"); } 参:13715 【解析】本题中已知n[0]为0,根据循环的执行可以得到n[1]为1,n[2]为3,n[3]为7,n[4]为15,因此输出结果是13715。 103【2010年9月选择题第28题】若要定义一个具有5个元素的整型数组,以下错误的定义语句是 A)int a[5]={0}; B)int b[]={0,0,0,0,0}; C)int c[2+3]; D)int i=5,d[i]; 参:D 【解析】在进行数组的定义时,不能使用变量对数组的长度进行定义。其他选项均符合数组定义标准。 104【2010年9月填空题第9题】有以下程序 #include { int i,n[]={0,0,0,0,0}; for(i=l;i<=4;i++) {n[i]=n[i-1]*3+1;printf(\"%d \",n[i]);} } 程序运行后的输出结果是 【9】 。 参:1 4 13 40 【解析】第一次循环结果为:n[1]=0*3+1,即n[1]的值为1,打印输出1 ;第二次循环结果为:n[2]=1*3+1,即n[2]的值为4,打印输出4 ;第三次循环结果为:n[3]=4*3+1,即n[3]的值为13,打印输出13 ;第四次循环结果为:n[4]=13*3+1,即n[4]的值为40,打印输出40。 105【2010年9月填空题第13题】有以下程序 #include { int n[2],i,j; for(i=0;i<2;i++)n[i]=0; for(i=0;i<2;i++) for(j=0;j<2;j++)n[j]=n[i]+1; printf(\"%d\\n\",n[1]); } 参:3 【解析】通过第一次 for(i=0;i<2;i++) n[i]=0;的循环语句可知,已经将数组n 中的两个元素都赋初值为0。接下来的循环中,第一次循环,外循环 i=0 的前提下:内循环j=0时,运行完n[0]=n[0]+1后n[0]为1;j=1时,运行完n[1]=n[0]+1后,n[1]为2。第二次循环,外循环i=1的前提下,内循环j=0时,运行完n[0]=n[1]+1后n[0]为3;j=1时,运行完n[1]=n[1]+1后,n[1]为3。 106【2010年3月选择题第29题】有以下程序 31 #include { int a[5]={1,2,3,4,5},b[5]={0,2,1,3,0},i,s=0; for(i=0;i<5;i++) s=s+a[b[i]]; printf(\"%d\\n\} 程序运行后的输出结果是 A)6 B)10 C)11 D)15 参:C 【解析】当i=0时a[b[0]]=1;当i=1时a[b[1]]=3;当i=2时a[b[2]]=2;当i=3时a[b[3]]=4;当i=4时a[b[4]]=1。将以上各数值相加得11,故选C。 107【2009年9月选择题第29题】有以下程序: #include { int a[]={2,3,5,4},i; for(i=0;i<4;i++) switch(i%2) { case 0:switch(a[i]%2) {case 0:a[i]++;break; case 1:a[i]--; }break; case 1:a[i]=0; } for(i=0;i<4;i++) printf(\"%d\",a[i]);printf(\"\\n\"); } 程序运行后的输出结果是________。 A)3 3 4 4 B)2 0 5 0 C)3 0 4 0 D)0 3 0 4 参:C 【解析】 第一次循环,i=0,i%2=0,a[0]%2=0,a[0]=a[0]+1=3;第二次循环,i=1,1%2=1,a[1]=0;第三次循环,i=2,a[2]%2=1,a[2]=a[2]-1=4;第四次循环,i=3,i%2=1,a[3]=0。 6.2二维数组的定义和引用 108【2011年9月选择题第26题】以下定义数组的语句中错误的是________。 A)int num[]={1,2,3,4,5,6}; B)int num[][3]={{1,2},3,4,5,6}; C)int num[2][4]={{1,2},{3,4},{5,6}}: D)int num[][4]={1,2,3,4,5,6}; 参:C 【解析】考查数组的定义,选项C)中定义的数组为两行四列的,但是初始化时是为三行两列的,所以初始化不正确。 109【2011年3月选择题第31题】有以下程序 32 #include { char a[30],b[30]; scanf(\"%s\",a); gets(b); printf(\"%s\\n%s\\n\",a,b); } 程序运行时若输入: how are you? I am fine <回车> 则输出结果是 A)how are you? I am fine B)how are you? I am fine C)how are you? I am fine D)how are you? 参:B 解析】scanf函数会把空格字符作为输入的字符串之间的分隔符,因此字符串a为\"how\"。gets()函数读取字符串时,直至接受到换行符或EOF时才停止,并将读取的结果存放在指针所指向的字符数组中,因此其余输入的内容赋值给b。 110【2010年3月选择题第30题】有以下程序 #include { int b[3][3]={0,1,2,0,1,2,0,1,2},i,j,t=1; for(i=0;i<3;i++) for(j=i;j<=i;j++) t+=b[i][b[j][i]]; printf(\"%d\\n\} 程序运行后的输出结果是 A)1 B)3 C)4 D)9 参:C 【解析】当i=0,j=0时能进行相加操作,b[0][b[0][0]]=0;当i=1,j=1时能进行相加操作,b[1][b[1][1]]=1;当i=2,j=2时能进行相加操作,b[2][b[2][2]]=2。将以上各数值相加再加1,得4,故选C。 111【2010年3月填空题第9题】有以下程序 #include { int i,j,a[][3]={1,2,3,4,5,6,7,8,9}; for(i=0;i<3;i++) for(j=i;j<3;j++)printf(\"%d\ printf(\"\\n\"); } 程序运行后的输出结果是【9】。 参:123569 33 【解析】当i=0时,j=0、1、2时满足条件,则打印a[0][0]、a[0][1]、a[0][2];当i=1时,j=1、2时满足条件,则打印a[1][1]、a[1][2];当i=2时,j=2时满足条件,则打印a[2][2],所以打印结果为123569。 112【2010年3月填空题第11题】有以下程序 #include { int a[3][3]={{1,2,3},{4,5,6},{7,8,9}}; int b[3]={0},i; for(i=0;i<3;i++) b[i]=a[i][2]+a[2][i]; for(i=0;i<3;i++) printf(\"%d\ printf(\"\\n\"); } 程序运行后的输出结果是【11】。 参:101418 【解析】当i=0时,b[0]=a[0][2]+a[2][0]=3+7=10;当i=1时,b[1]=a[1][2]+a[2][1]=6+8=14;当i=2时,b[2]=a[2][2]+a[2][2]=9+9=18,则打印结果为101418。 6.3 字符数组 113【2011年9月选择题第30题】若有定义语句:char *s1=\"OK\",*s2=\"ok\";,以下选项中,能够输出\"OK\"的语句是________。 A)if(strcmp(s1,s2)==0) puts(s1); B)if(strcmp(s1,s2)!=0) puts(s2); C)if(strcmp(s1,s2)==1) puts(s1); D)if(strcmp(s1,s2)!=0) puts(s1); 参:D 【解析】strcmp(s1,s2)的作用是比较字符串s1和s2。参数str1,str2如果相同,则返回0,如果str1大于str2则返回一个正整数,如果str1小于str2则返回一个负整数。本题中s1,s2不相同,A)选项不会输出任何字符,B)选项输出ok,C)选项不输出任何字符,D)选项会输出OK。 114【2011年9月选择题第32题】有以下程序 #include { char a[5][10]={\"china\",\"beijing\",\"you\",\"tiananmen\",\"welcome\; int i,j; char t[10]; for(i=0;i<4;i++) for(j=i+1;j<5;j++) if(strcmp(a[i],a[j])>0) { strcpy(t,a[i]); strcpy(a[i],a[j]);strcpy(a[j],t);} puts(a[3]); } 程序运行后的输出结果是________。 A)beijing B)china C)wclcome D)tiananmen 34 参:C 【解析】本题中程序的主要实现的功能是对这个字符数组,对其中的字符串按照首字母的从小到大排序,排完序后a[5][10]为{\" beijing \",\" china \",\" tiananmen \",\" welcome \",\" you \"},所以a[3]为welcome。 115【2011年9月选择题第34题】有以下程序 #include { char ch[3][5]={\"AAAA\",\"BBB\",\"CC\"); printf(\"%s\\n\",ch[1]); } 程序运行后的输出结果是________。 A)AAAA B)CC C)BBBCC D)BBB 参:D 【解析】输出字符串ch[1],即输出BBB。 116【2011年3月选择题第16题】有以下程序段 char name[20]; int num; scanf(\"name=%s num=%d\",name,&num); 当执行上述程序段,并从键盘输入:name=Lili num=1001<回车>后,name的值为 A)Lili B)name=Lili C)Lili num= D)name=Lili num=1001 参:A 解析】scanf()函数规定,如果在\"格式控制\"字串中除了格式说明以外还有其他字符,则在输入数据时应输入与这些字符相同的字符,如题干中的\"name=\"和\"num=\"。在输入过程中遇到空格、回车或跳格键时认为输入结束,这些字符称为\"间隔符\"。 117【2011年3月选择题第21题】有以下程序 #include { char s[]=\"012xy\\08s34f4w2\"; int i,n=0; for(i=0;s[i]!=0;i++) if(s[i]>='0'&& s[i]<='9')n++; printf(\"%d\\n\",n); } 程序运行后的输出结果是 A)0 B)3 C)7 D)8 参:B 【解析】本题的程序是要统计字符串s中数字的个数,其中前三个字符满足选择条件,此时n为3,然后遇到字符'\\0',这个转义字符表示值为0的空字符NULL,此时循环条件不满足,因此循环结束。 118【2010年9月选择题第23题】有以下程序 #include 35 main() { char x[]=\"STRING\"; x[0]=0;x[1]='\\0';x[2]='0'; printf(\"%d %d\\n\",sizeof(x),strlen(x)); } 程序运行后的输出结果是 A)6 1 B)7 0 C)6 3 D)7 1 参:B 【解析】sizeof是返回字符串在内存中所占用的空间,是真正的长度。strlen是返回字符串的长度,strlen遇到'\0'就结束,而且不包括'\0'。 119【2010年9月选择题第31题】下列选项中,能够满足\"若字符串s1等于字符串s2,则执行ST\"要求的是 A)if(strcmp(s2,s1)==0) ST; B)if(sl==s2)ST; C)if(strcpy(s1,s2)==1) ST; D)if(sl-s2==0)ST; 参:A 【解析】函数strcmp(s2,s1)的作用是比较大小,函数strcpy(s1,s2)的作用是进行字符串复制,所以选择A)选项。B)和D)都是比较的字符串s1与s2的地址是否一致而不是比较字符串内容是否一致。 120【2010年9月选择题第32题】以下不能将s所指字符串正确复制到t所指存储空间的是 A)while(*t=*s){t++;s++;} B)for(i=0;t[i]=s[i];i++); C)do{*t++=*s++;}while(*s); D)for(i=0,j=0;t[i++]=s[j++];); 参:C 【解析】C)选项中,当复制完s所指字符串的最后一个非'\0'字符后,指针s指向了'\0',循环结束,没有将字符串结束符0复制到t中,因此C)选项是错误的。 121【2010年9月选择题第33题】有以下程序(strcat函数用以连接两个字符串) #include { char a[20]=\"ABCD\\0EFG\\0\",b[]=\"IJK\"; strcat(a,b);printf(\"%s\\n\",a); } 程序运行后的输出结果是 A)ABCDE\\0FG\\0IJK B)ABCDIJK C)IJK D)EFGIJK 参:B 【解析】char *strcat(char *dest,char *src)的功能是:把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'。因为'\0'是字符串的结束标志,所以a数组中存放的字符串为\"ABCD\",所以将两个字符串拼接后结果为\"ABCDIJK\"。 122【2010年3月填空题第12题】有以下程序 #include 36 { char temp;int n,i; n=strlen(str); temp=str[n-1]; for(i=n-1;i>0;i--)str[i]=str[i-1]; str[0]=temp; } main() { char s[50]; scanf(\"%s\程序运行后输入:abcdef<回车>,则输出结果是【12】。 参:fabcde 【解析】在函数fun中,先求出字符串str的长度,并将最后一个字符暂存到temp中,然后使用循环语句将所有字符向右移动一个位置,最后将temp中的字符放到字符串的第1个位置,所以结果为fabcde。 123【2010年3月填空题第14题】以下程序用以删除字符串中所有的空格,请填空。 #include { char s[100]={\"our teacher teach c language!\ for(i=j=0;s[i]!='\\0';i++) if(s[i]!=' '){s[j]=s[i];j++;} s[j]=【14】; printf(\"%s\\n\} 参:'\\0' 【解析】程序使用变量i遍历字符数组s中的所有字符,使用变量j存放非空格字符。当将所有的非空格字符重新存放到字符数组s中后,应添加字符串结束标志'\\0'。 124【2009年9月选择题第20题】有以下程序: #include { char s[]={\"012xy\;int i,n=0; for(i=0;s[i]!=0;i++) if (s[i]>='a'&&s[i]<='z') n++; printf(\"%d\\n\",n); } 程序运行后的输出结果是________。 A)0 B)2 C)3 D)5 参:B 【解析】 在字符串数组s[i]中,只有当下标i=3和i=4时,才满足if条件,所以n的值从0增加两次,结果为2。 125【2009年9月选择题第30题】有以下程序: #include 37 { char a[10]=\"abcd\"; printf(\"%d,%d\\n\",strlen(a),sizeof(a)); } 程序运行后的输出结果是________。 A)7,4 B)4,10 C)8,8 D)10,10 参:B 【解析】 strlen()用来返回字符串的长度,而sizeof()返回的是一个对象或者类型所占的内存字节数,即数组所占的内存。 126【2009年9月选择题第31题】下面是有关C语言字符数组的描述,其中错误的是________。 A)不可以用赋值语句给字符数组名赋字符串 B)可以用输入语句把字符串整体输入给字符数组 C)字符数组中的内容不一定是字符串 D)字符数组只能存放字符串 参:D 【解析】 字符数组中的内容既可以是字符,也可以是字符串,选项D)说法不正确。 127【2009年9月填空题第13题】有以下程序: #include { char a[20]=\"How are you?\",b[20]; scanf(\"%s\",b);printf(\"%s %s\\n\",a,b); } 程序运行时从键盘输入:How are you?<回车> 则输出结果为__【13】__。 参:How are you? How 【解析】用%s格式输入字符串时,空格和回车都作为输入数据的分隔符,不能被读入,因此数组b的输出结果为How。 128【2009年3月选择题第30题】设有定义:char s[81];int i=0;,以下不能将一行(不超过80个字符)带有空格的字符串正确读入的语句或语句组是________。 A)gets(s); B)while((s[i++]=getchar())!=‘\\n’);s[i]==‘\\0’ C)scanf(\"%s\",s); D)do{scanf(\"%c\",&s[i]);}while(s[i++]!=‘\\n’);s[i]=‘\\0’; 参:C 【解析】 在scanf格式控制字符串中,如果两个相邻的数据格式相同则需要用空格、逗号或其他制表符隔开,因此若输入字符中存在空格,scanf将把这个字符串认为是两个或多个字符串,因此不能够正确读入带有空格的字符串,本题答案为C)。 38 第7章 函数 7.1 函数概述 129【2010年9月选择题第11题】以下关于结构化程序设计的叙述中正确的是 A)一个结构化程序必须同时由顺序、分支、循环三种结构组成 B)结构化程序使用goto语句会很便捷 C)在C语言中,程序的模块化是利用函数实现的 D)由三种基本结构构成的程序只能解决小规模的问题 参:C 【解析】一个结构化程序可以由顺序、分支、循环三种结构组成,但不是必须同时都包括,可以包括其中的一个或多个,所以选项A)错误。goto语句会破坏程序的结构性、可读性,不得以不要用,所以选项B)错误。三种基本结构构成的程序也可以解决大规模的程序,所以选项D)错误。在C语言中,利用函数来实现程序的模块化,C)正确。 130【2010年3月选择题第11题】以下叙述正确的是 A)C语言程序是由过程和函数组成的 B)C语言函数可以嵌套调用,例如:fun(fun(x)) C)C语言函数不可以单独编译 D)C语言中除了main函数,其他函数不可作为单独文件形式存在 参:B 【解析】C语言中只有函数没有过程,故选项A错误;C语言可以嵌套调用,故选项B正确;C语言函数可以单独编译成.dll文件,故选项C错误;C语言中除main函数以外,其他函数可作为单独文件形式存在,故选项D也错误。 7.2 库函数概述 7.3 函数定义的一般形式 7.4 函数参数和函数返回值 131【2011年9月选择题第24题】有以下程序 #include { double a=0; int i; for(i=0;i<30;i+=10) a+=f((double)i); printf(\"%5.0f\\n\",a); } double f(double x) { return x*x+1;} 程序运行后的输出结果是________。 A)503 B)401 C)500 D)1404 39 参:A 【解析】考查函数的基础知识,当i分别为0、10、20时a分别为1,102,503,所以结果为503,选项A)正确。 132【2011年3月填空题第9题】有以下函数 void prt(char ch,int n) { int i; for(i=1;i<=n;i++) printf(i%6!=0 ? \"%c\":\"%c\\n\} 执行调用语句prt('*',24);后,函数共输出了 【9】 行*号。 参:4 【解析】本题中输出*并换行的条件是i能被6整除,否则输出*不换行。因此只有在i为6、12、18和24时*的输出才会换行,最终输出4行*。 133【2010年9月填空题第10题】以下fun函数的功能是:找出具有N个元素的一维数组中的最小值,并作为函数值返回。请填空。(设N已定义) int fun(int x[N]) { int i,k=0; for(i=0;i 【解析】通过函数中语句 return x[k]; 可知x[k]表示的是该一维数组中最小的值,所以当x[i]小于x[k]所代表的数值后应将i变量赋给k变量,使得x[k]表示当前值较小的那个数据。 134【2010年9月填空题第12题】以下fun函数的功能是在N行M列的整型二维数组中,选出一个最大值作为函数值返回,请填空。(设M,N已定义) int fun(int a[N][M]) { int i,j,row=0,col=0; for(i=0; i 参:a[row][col] 【解析】通过程序可以看出,外循环是行,内循环是列。先在行不变的情况下找一行内最大的数据进行记录。通过语句 if(a[i][j]>a[row][col]) { row=i; col=j;}可知,如果变量a[i][j]大于a[row][col],将i赋给了row,将j赋给了col,所以a[row][col]是记录当前最大值的变量。 135【2010年3月选择题第24题】以下关于return语句的叙述中正确的是 40 A)一个自定义函数中必须有一条return语句 B)一个自定义函数中可以根据不同情况设置多条return语句 C)定义成void类型的函数中可以有带返回值的return语句 D)没有return语句的自定义函数在执行结束时不能返回到调用处 参:B 【解析】一个自定义函数中可以没有返回值。如果函数不返回值,则应定义为void型,程序执行结束后自动返回到调用处。故选项A、C、D错误。一个自定义函数可以根据不同的情况设置多条return语句,但函数的返回值必须只有一个,故选项B正确。 136【2010年3月选择题第26题】有以下程序 #include printf(\"%c,%c,\} main() { char b='a',a='A'; fun(&b,a); printf(\"%c,%c\\n\} 程序运行后的输出结果是 A)b,B,b,A B)b,B,B,A C)a,B,B,a D)a,B,a,B 参:A 【解析】函数fun的第一个参数传指针,可以将更改后的值传回调用函数,第二个参数传值,不能将更改后的值传回调用函数,故选A。 137【2009年9月选择题第24题】有以下程序: #include p=d++; printf(\"%d\",p);} main() { int a=1; fun(a);printf(\"%d\\n\",a);} 程序运行后的输出结果是________。 A)32 B)12 C)21 D)22 参:C 【解析】 程序运行后,首先输出的是p的值,然后输出a的值。p=d++,得到p的值为d的初始值2;a的值不变,仍为1。 138【2009年9月填空题第11题】有以下程序: #include 41 void fun(int b) { int a=10; a+=b;printf(\"%d\",a); } main() { int c=20; fun(c);a+=c;printf(\"%d\\n\",a); } 程序运行后的输出结果是__【11】__。 参:3025 【解析】fun(c)调用函数fun(b),函数执行结果为a=a+b=10+20=30;调用完函数后,主函数继续执行,输出结果a=a+c=5+20=25。 139【2009年3月选择题第26题】有以下程序: #include void fun(int *a,int *b) { int *c; c=a;a=b;b=c; } main() { int x=3, y=5, *p=&x, *q=&y; fun(p,q);printf(\"%d,%d,\",*p,*q); fun(&x,&y);printf(\"%d,%d\\n\",*p,*q); } 程序运行后的输出结果是________。 A)3,5,5,3 B)3,5,3,5 C)5,3,3,5 D)5,3,5,3 参:B 【解析】 子函数fun功能为交换形式参数的值,即交换指针变量a和b的值。但是fun函数并不能够交换实参的值,因此fun(p,q)不能交换p和q的值,所以第一个printf语句的输出为3,5。第二个fun函数对x和y的地址进行了操作,同样不能交换x和y的值,并且不能影响p和q指针指向的数据,因此第二个printf语句的输出为3,5 7.5 函数的调用 140【2011年3月填空题第12题】有以下程序,请在 【12】 处填写正确语句,使程序可正常编译运行。 #include { double x,y,(*p)(); scanf(\"%lf%lf\",&x,&y); p=avg; 42 printf(\"%f\\n\",(*p)(x,y)); } double avg(double a,double b) { return((a+b)/2);} 参:double avg(double a ,double b); 【解析】c语言编译器对于源代码的编译是顺序编译的,当任意一个函数中调用某个函数的时候,这个函数的原型必须在调用之前声明,否则就会出现编译错误。本题中需要在main函数调用avg之前对其进行声明。 141【2009年3月填空题第12题】请将以下程序中的函数声明语句补充完整。 #include { int x,y,(*p)(); scanf(\"%d%d\",&x,&y); p=max; printf(\"%d\\n\",(*p)(x,y)); } int max(int a,int b) { return(a>b?a:b);} 参:max(int a,int b) 【解析】本题考的是函数声明。函数声明是把函数的名字、函数类型以及形参的类型、个数和顺序通知给编译系统。函数在被调用前必须先声明,因为main函数后面有max函数的定义。 7.6 函数的嵌套调用与递归调用 142【2011年9月填空题第11题】以下程序运行后的输出结果是__【11】__。 #include { if(x/5>0) fun(x/5); printf(\"%d\",x); } main() { fun(11);printf(\"\\n\");} 参:211 【解析】本题考查的是函数的嵌套。当执行fun(11)时,if的条件成立,所以转到执行fun(2),执行fun(2)时,if语句不成立,输出2,退出本层嵌套,继续执行fun(11)的下面语句,即输出11,最终输出211。 143【2011年3月选择题第32题】设有如下函数定义 int fun(int k) { if(k<1) return 0; else if(k==1)return 1; else return fun(k-1)+1; } 43 若执行调用语句:n=fun(3);,则函数fun总共被调用的次数是 A)2 B)3 C)4 D)5 参:B 【解析】执行fun(3)语句时会返回fun(3-1)+1,即fun(2)+1;执行fun(2)时会返回fun(2-1)+1,即fun(1)+1;执行fun(1)时会返回1,所以一共执行fun函数为3次。 144【2011年3月选择题第33题】有以下程序 #include { if(x!=y) return((x+y)/2); else return(x); } main() { int a=4,b=5,c=6; printf(\"%d\\n\",fun(2*a,fun(b,c))); } 程序运行后的输出结果是 A)3 B)6 C)8 D)12 参:B 【解析】本题中对函数fun()进行了嵌套的调用。首先调用fun(5,6),返回值为5,2*a的值为8,然后调用fun(8,5),最终输出值为6。 145【2010年9月选择题第24题】有以下程序 #include { int n=1,m; m=f(f(f(n)));printf(\"%d\\n\",m); } int f(int x) { return x*2;} 程序运行后的输出结果是 A)1 B)2 C)4 D)8 参:D 【解析】第一次调用的是最内层的f(n),即f(1) 返回值2。第二次调用中间的f(f(n)),即f(2)返回值4。最后调用最外层的f(f(f(n))),即f(4)返回值8,最后打印输出。 146【2010年9月选择题第35题】有以下程序 #include { if(x/2>1)fun(x/2); printf(\"%d\",x); } main() 44 { fun(7);printf(\"\\n\");} 程序运行后的输出结果是 A)1 3 7 B)7 3 1 C)7 3 D)3 7 参:D 【解析】本程序是一个递归函数,第一次实参为7,第二次为3,此时不满足条件,因为3/2结果为1,等于1而不大于1,所以跳过fun(x/2)语句,执行printf语句,即打印出3。然后向上返回到第一次调用打印出7。 147【2009年3月选择题第24题】有以下程序: #include { int a=3,b=4,c=5,d; d=f(f(a,b),f(a,c)); printf(\"%d\\n\",d); } 程序运行后的输出结果是________。 A)10 B)9 C)8 D)7 参:B 【解析】 将a、b、c的值分别带入f(a,b)和f(a,c)中计算得:f(a,b)=3,f(a,c)=6,再计算f(3,6),算出d=9。 148【2009年3月选择题第33题】有以下程序: #include else return((x+y)/2); } main() { int a=4,b=5,c=6; printf(\"%d\\n\",fun(2*a,fun(b,c))) } 则运行结果为。 A)3 B)6 C)8 D)12 参:B 【解析】函数fun的功能是求两个整数的平均值,返回值仍为整数。5和6的平均取整后为5,8和5的平均取整后为6。因此,本题答案为B)。 149【2009年9月填空题第15题】有以下程序: 45 #include { if(x/2>0) fun(x/2); printf(\"%d .\",x); } main() { fun(6),printf(\"\\n\");} 程序运行后的输出结果是__【15】__。 参:1 3 6 【解析】 依次执行fun(6),fun(3),fun(1),当执行fun(6)时要调用fun(3),执行fun(3)时要调用fun(1),所以输出的结果为1 3 6。 7.7 数组作为函数参数 150【2011年9月选择题第28题】有以下程序 #include void fun(int a[][N],int b[]) { int i; for(i=0;i { int x[N][N]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}},y[N],i; fun(x,y); for(i=0;i 【解析】从程序中看出,执行函数fun时,当i从0到3时,a[i][i]分别为1、6、11、16,a[i][N-1-i]分别为4、7、10、13,y[i]的值分别为两个数组对应值相减,所以答案为B)。 151【2011年9月选择题第31题】以下程序的主函数中调用了在其前面定义的fun函数 #include { double a[15],k; k=fun(a); ⋮ } 则以下选项中错误的fun函数首部是________。 A)double fun(double a[15]) B)double fun(double *a) C)double fun(double a[]) D)double fun(double a) 46 参:D 【解析】从主函数中调用fun函数的实参可以看出,形参应该是一个地址,不能省略前面的*号,D)选项的形参为一个double的值,所以不正确。 152【2010年9月选择题第30题】有以下程序(函数fun只对下标为偶数的元素进行操作) #include void fun(int *a,int n) { int i,j,k,t; for(i=0;i main() { int aa[10]={1,2,3,4,5,6,7},i; fun(aa,7); for(i=0;i<7;i++) printf(\"%d,\",aa[i]); printf(\"\\n\"); } 程序运行后的输出结果是 A)7,2,5,4,3,6,1, B)1,6,3,4,5,2,7, C)7,6,5,4,3,2,1, D)1,7,3,5,6,2,1, 参:A 【解析】由函数fun(int *a,int n)中语句if(a[j]>a[k]) k=j;可知当前k是记录数组中较大数据值所在位置的下标变量,所以该函数的作用是对数组a中的下标为偶数位置的数据进行从大到小的排序,即对a[0],a[2],a[4],a[6]中的数据 1,3,5,7进行从大到小的排序,其他位置的数据不变,所以答案为A)。 153【2010年9月选择题第34题】有以下程序,程序中库函数islower(ch)用以判断ch中的字母是否为小写字母 #include { if(p[i]==''&&islower(p[i-1])) p[i-1]=p[i-1]-'a'+'A'; i++; } } main() { char sl[100]=\"ab cd EFG !\"; fun(s1);printf(\"%s\\n\",s1); } 47 程序运行后的输出结果是 A)ab cd EFG ! B)Ab Cd EFg ! C)aB cD EFG ! D)ab cd EFg ! 参:C 【解析】int islower(char ch)的功能是判断字符c是否为小写英文字母,当ch为小写英文字母(a-z)时,返回非零值,否则返回零。后面语句p[i-1]=p[i-1]-'a'+'A'的作用是把小写字母转化为大写字母。根据判断条件可知,只有当空格字符的前一个字符为小写字符时才把该小写字符变成大写,所以选择C)。 154【2010年3月选择题第33题】有以下程序 #include { int a[4]={1,2,3,4},s; s=f(a,4); printf(\"%d\\n\} int f(int t[],int n) { if(n>0) return t[n-1]+f(t,n-1); else return 0; } 程序运行后的输出结果是 A)4 B)10 C)14 D)6 参:B 【解析】函数的功能是求数组所有元素的和。递归表示为a[3]+a[2]+a[1]+a[0]+f(t,0)=10。 155【2009年3月填空题第11题】有以下程序,程序执行后,输出结果是__【11】__。 #include { int a[10]={10,9,8,7,6,5,4,3,2,1),i; for(i=2;i>=0;i--)fun(&a[i]); for(i=0;i<10;i++)printf(\"%d\",a[i]); printf(\"\\n\"); } 参:7777654321 【解析】函数的功能是将输入的指针指向的后一个变量赋给指针指向的变量。第一个for循环,i为2满足条件,将a[3]赋值给a[2],数组变为{10,9,7,7,6,5,4,3,2,1},同理第二次循环数组变为{10,7,7,7,6,5,4,3,2,1},第三次为{7,7,7,7,6,5,4,3,2,1},运行此次循环后退出第一个for循环。第二个for循环为输出数组的值,因此答案为7777654321。 7.8 全局变量与局部变量 156【2009年3月选择题第35题】有以下程序: #include 48 int fun(int *k) { b=*k+b;return(b);} main() { int a[10]={1,2,3,4,5,6,7,8},i; for(i=2;i<4;i++){b=fun(&a[i])+b; printf(\"%d\",b);} printf(\"\\n\"); } 程序运行后的输出结果是________。 A)10 12 B)8 10 C)10 28 D)10 16 参:C 【解析】b为全局变量,在第一次执行for循环后b的值变为10并输出,第二次执行for循环后b的值变为28。因此,本题答案选C)。 7.9 变量的存储类别 157【2011年9月选择题第33题】有以下程序 #include { static int n=0; n+=m; return n; } main() { int n=0; printf(\"%d,\",f(++n)); printf(\"%d\\n\",f(n++)); } 程序运行后的输出结果是________。 A)1,2 B)1,1 C)2,3 D)3,3 参:A 【解析】static 变量用于局部变量中有记忆功能和全局生存期。函数中的静态变量的特点是每次调用函数,静态变量的值是上次调用完该函数后的静态变量值,所以在此题中,第一调用函数,返回1,此时函数中的静态变量n的值为1,所以第二次调用函数时,返回值为2。 158【2011年9月选择题第39题】以下选项中叙述错误的是________。 A)C程序函数中定义的赋有初值的静态变量,每调用一次函数,赋一次初值 B)在C程序的同一函数中,各复合语句内可以定义变量,其作用域仅限本复合语句内 C)C程序函数中定义的自动变量,系统不自动赋确定的初值 D)C程序函数的形参不可以说明为static型变量 参:A 【解析】C程序函数中定义的静态变量,每调用一次函数,不需要对静态变量赋初值,使用的值为上次调用完函数后的值。 159【2011年3月选择题第34题】有以下程序 49 #include { static int x=1; x*=2; return x; } main() { int i,s=1; for(i=1;i<=3;i++) s*=fun(); printf(\"%d\\n\",s); } 程序运行后的输出结果是 A)0 B)10 C)30 D) 参:D 【解析】静态局部变量只在定义它的函数内有效,程序仅为其分配一次内存,调用函数返回后,该变量仍然保存上次的结果值。本题中第一次for循环后x值为2,s值为2;第二次循环后x值为4,s值为8;第三次循环后x值为8,s值为。 160【2010年3月选择题第34题】有以下程序 #include { static int x=1; x*=2; return x; } main() { int i,s=1; for(i=1;i<=2;i++) s=fun(); printf(\"%d\\n\} 程序运行后的输出结果是 A)0 B)1 C)4 D)8 参:C 【解析】x被声明为静态变量,第一次调用fun()后,x值为2,第二次调用时直接执行x*=2,值为4。 161【2010年9月选择题第36题】有以下程序 #include { static int x=1; x+=1; return x; } main() { int i,s=1; for(i=l;i<=5;i++)s+=fun(); 50 printf(\"%d\\n\",s); } 程序运行后的输出结果是 A)11 B)21 C)6 D)120 参:B 【解析】本题目fun()函数中定义的变量x为静态局部变量, 第一循环后x的值为2,s的值为3;第二次循环后x的值为3,s的值为6;第三次循环后x的值为4,s的值为10;第四次循环后x的值为5,s的值为15;第五次循环后x的值为6,s的值为21。 162【2009年9月选择题第34题】有以下程序: #include { int a=3,s; s=f(a);s=s+f(a);printf(\"%d\\n\",s); } int f(int n) { static int a=1; n+=a++; return n; } 程序运行后的输出结果是________。 A)7 B)8 C)9 D)10 参:C 【解析】 s=f(a)表达式第一次调用f(n)函数时,f(n)函数运行结果为n=4,a=2,即s等于4;s=s+f(a)表达式第二次调用f(n)函数时,f(n)函数运行结果为n=5,所以得到s值为9。 163【2009年3月选择题第34题】设函数中有整型变量n,为保证其在未赋初值的情况下初值为0,应选择的存储类别是________。 A)auto B)register C)static D)auto或register 参:C 【解析】static(静态局部变量):有时我们希望函数中局部变量的值在函数调用结束后不消失而保留原值,这时就将局部变量指定为静态局部变量,如果定义静态局部变量时不赋值,则编译时自动赋初值0(对数据型变量)或空字符(对字符变量)。 auto(自动变量):函数中的局部变量,如不专门声明为static存储类别,都是动态地分配存储空间的,数据存储在动态存储区中。函数中的形参和在函数中定义的变量都属此类,在调用该函数时系统会给它们分配存储空间,在函数调用结束时自动释放这些存储空间。 register(寄存器变量):为了提高效率,C语言允许将局部变量的值放在CPU中的寄存器中,这种变量叫寄存器变量。 7.10 内部函数与外部函数 51 第8章 指针 8.1 关于地址和指针 1【2010年9月选择题第25题】以下程序段完全正确的是 A)int*p; scanf(\"%d\",&p); B)int*p; scanf(\"%d\",p); C)int k,*p=&k; scanf(\"%d\",p); D)int k,*p; *p=&k; scanf(\"%d\",p); 参:C 【解析】A)选项输入的是指针型变量p的地址,变量一定义就已分配好了地址不能再指定了,所以A错误。B)选项没有指定指针p应该指向的变量,没给变量赋初值。D)选项中,p是地址,*p是地址内存放的数据,它把整型变量k的地址赋给了*p,所以错误。 165【2010年9月填空题第11题】有以下程序 #include int*f(int *p,int *q); main() { int m=l,n=2,*r=&m; r=f(r,&n); printf(\"%d\\n\",*r);} int *f(int *p,int *q) { return (*p>*q)?p:q;} 程序运行后的输出结果是 【11】 。 参:2 【解析】本题中f函数的功能是返回指针p与指针q所指的元素中较大的那个元素的地址,从函数调用可知,在参数传递过程中变量m的地址传给了指针p,变量n的地址传给了指针q,因为n的值2大于m的值1,所以返回的是变量n的地址。在主函数中用来接收f函数返回值的变量是指针型变量r,所以r就变成了变量n的地址,所以*r即为2。 166【2009年9月选择题第26题】有以下程序: #include { int m=1,n=2,*p=&m,*q=&n,*r; r=p;p=q;q=r; printf(\"%d,%d,%d,%d\\n\",m,n,*p,*q); } 程序运行后的输出结果是________。 A)1,2,1,2 B)1,2,2,1 C)2,1,2,1 D)2,1,1,2 参:B 【解析】 m和n的值不变,输出结果为1,2。指针*p和*q交换了指向的位置,即*p=&n,*q=&m,输出结果分别为2,1。 52 167【2009年3月选择题第27题】有以下程序: #include { int m=1,n=2,*r=&m; f(r,&n);printf(\"%d,%d\",m,n); } void f(int *p,int *q) {p=p+1;*q=*q+1;} 程序运行后的输出结果是________。 A)1,3 B)2,3 C)1,4 D)1,2 参:A 【解析】 在f(int *p,int *q)函数中,执行p=p+1将p所对应的地址加1,而*q=*q+1是将q所指向的n的地址所对应的值加1,即m的地址所对应的值不变,而n的值为3。 8.2 变量的指针和指向变量的指针变量 168【2011年9月选择题第23题】若有定义语句:double a,*p=&a; 以下叙述中错误的是________。 A)定义语句中的*号是一个间址运算符 B)定义语句中的*号只是一个说明符 C)定义语句中的p只能存放double类型变量的地址 D)定义语句中,*p=&a把变量a的地址作为初值赋给指针变量p 参:A 【解析】本题中的*p=&a中,*不是间址运算符,只是一个指针说明符。间址运算符用于表示某变量是指针型数据,用于存放某个地址,例如int *p,k; p = &k; *p = 2; 这里的*就是间址运算符。 169【2011年9月填空题第14题】以下程序调用fun函数把x中的值插入到a数组下标为k的数组元素中。主函数中,n存放a数组中数据的个数。请填空。 #include void fun(int s[],int *n,int k,int x) { int i; for(i=*n-1;i>=k;i--)s[__【14】__]=s[i]; s[k]=x; *n=*n+__【15】__; } main() { int a[20]={1,2,3,4,5,6,7,8,9,10,11},i,x=0,k=6,n=11; fun(a,&n,k,x); for(i=0;i 参:i+1 1 【解析】该函数实现的原理是先找到先将下标为k的元素后面的元素都往后移动位,然后插入x值并将数组元素个数加1,程序运行到【14】空的时候,就是将元素顺次往后移动一位,所以空【14】填i+1。本题中因为插入了一个新的元素所以整个数组的个数要加1,所以【15】处应为1。 170【2009年3月选择题第16题】若有定义语句:double x,y,*px,*py;执行了px=&x;py=&y;之后,正确的输入语句是________。 A)scanf(\"%f%f\",x,y); B)scanf(\"%f%f\"&x,&y); C)scanf(\"%lf%le\",px,py); D)scanf(\"%lf%lf\",x,y); 参:C 【解析】 本题考查scanf函数,其格式为:scanf(\"控制格式\",地址表列)。其中地址表列中应为要赋值变量的地址。本题要为变量x和y赋值,并定义了两个指针分别指向x和y,因此取得变量x和y的地址的方法有两种,一种是使用取地址符号\"&\",即&x和&y,另一种是使用指针变量,即px和py。选项A)和D)中地址表列表示错误;选项B)中控制格式与地址表列之间应用逗号分开。因此,本题正确答案为C)。 8.3 数组与指针 171【2011年9月选择题第27题】有以下程序 #include { printf(\"%d\\n\",p[5]);} main() { int a[10]={1,2,3,4,5,6,7,8,9,10}; fun(&a[3]); } 程序运行后的输出结果是________。 A)5 B)6 C)8 D)9 参:D 【解析】考查指针和函数的相关知识,a[3]指向的是数据值为4的地址,那么相当于是p指向数据值4的地址,那么p[5]指向就是数据值9的地址,所以输出9。 172【2011年3月选择题第25题】有以下程序(说明:字母A的ASCIl码值是65) #include