C语言程序设计复习样题及部分解析 选择题: ()以上叙述中错误的是 A)C语言编写的函数源程序,其文件名后缀可以是C B)C语言编写的函数都可以作为一个独立的源程序文件 C)C语言编写的每个函数都可以进行独立的编译并执行 D)一个C语言程序只能有一个主函数 (I)C【解析】C语言编写的某些函数是依附于主调函数而存在的,它不能独立编译并执行 的。 (2)若有定义语句:inta=10:double b=3.14,则表达式'A'+ab值的类型是 A).char B)int C)double D)float (2)C【解析】根据表达式运算规则,所有数据在混合运算中,一律向上一级换算原则。本 题最高级是双精度,所以最后表达式类型应是double。. (3)若有定义语句:intx=12,y-8zx:,在其后执行语句x0.9+xy:,则z的值为 A1.9B1 C)2 D)2.4 (3)B【解析】C语言对于表达式运算0.9+xy后的值是1.9,但给整型量z值,则去掉小 数为1。 (4)若有定义:inta,b;,通过语句scanf("%d%d",&a,&b,能把整数3赋给a,5赋给 b的输入数据是 A)35B)35C03:5 D)35 (4)C【解析】使用scanf函数时应注意的问题(2)规定:如果在格式控制字符串中除了格 式说明以外还有其他字符,则在输入数据时在对应位置应输入与这些字符相同的字符”,所 以选C。 (5i若有定义语句:imtk1=10,k2=20:,执行表达式k1=k1>k2&&(k2=k2>k1)后,k1和 k2的值分别为 A)0和1 B)0和20 C10和1D)10和20 (⑤B【解折】关于逻辑表达式运算规定(),ak&b&C,只要a为0,则不必判别b和c 若a为1才判别b:若b为0,则不必判别c。 现题目逻辑表达式左边(k1-k1>k2为0,右边不再判别,所以答案是a为0:b仍为原值20, 1/19
1 / 19 C 语言程序设计复习样题及部分解析 选择题: (1)以上叙述中错误的是_。 A)C 语言编写的函数源程序,其文件名后缀可以是 C B) C 语言编写的函数都可以作为一个独立的源程序文件 C) C 语言编写的每个函数都可以进行独立的编译并执行 D)一个 C 语言程序只能有一个主函数 (1)C 【解析】C 语言编写的某些函数是依附于主调函数而存在的,它不能独立编译并执行 的。 (2)若有定义语句:int a=10; double b=3.14;,则表达式'A'+a+b 值的类型是_。 A).char B)int C) double D)float (2)C 【解析】根据表达式运算规则,所有数据在混合运算中,一律向上一级换算原则。本 题最高级是双精度,所以最后表达式类型应是 double。 (3)若有定义语句:int x=12,y=8,z;,在其后执行语句 z=0.9+x/y;,则 z 的值为_。 A)1.9 B)1 C)2 D)2.4 (3)B 【解析】 C 语言对于表达式运算 0.9+x/y 后的值是 1.9,但给整型量 z 值,则去掉小 数为 1。 (4)若有定义:int a,b;,通过语句 scanf("%d;%d",&a,&b);,能把整数 3 赋给 a,5 赋给 b 的输入数据是_。 A)3 5 B)3,5 C)3;5 D)35 (4)C 【解析】 使用 scanf 函数时应注意的问题(2)规定:如果在格式控制字符串中除了格 式说明以外还有其他字符,则在输入数据时在对应位置应输入与这些字符相同的字符”,所 以选 C。 (5)i 若有定义语句: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 (5)B 【解析】 关于逻辑表达式运算规定(1),a&&b&&c,只要 a 为 0,则不必判别 b 和 c; 若 a 为 1 才判别 b;若 b 为 0,则不必判别 c。 现题目逻辑表达式左边(k1=k1>k2)为 0,右边不再判别,所以答案是 a 为 0;b 仍为原值 20
(6有以下程序 #include<stdio.h> mainO inta=1,b=0; if(-a)b++; else if(a=0)b+2; else b+=3; printf("%dn",b片 程序运行后的输出结果是 A)0 B)1 C)2 D)3 (6C【解析】此题非常简单,变量a运算前自减1,变为0,所以只执行了b+=2语句就 输出为2。 (⑦)下列条件语句中,输出结果与其他语句不同的是 A)if(a)printf("%dn",x):else printf("%d\n"y); B)if(a=0)printf("%dIn",y);else printf("%din",x); C)if(a!=0)printf("%d\n"x); else printf("%dn",y); D)ia=0) printf("%dn");else printf("%dn"y); ()D【解析】当a为0时A逻辑判断值为0,输出yB)逻辑判断值为1,输出:O逻 辑判断值为0,输出yD)逻辑判断值a=0为1,输出x (8)有以下程序段 #include <stdio.h> main( inta=7; while(a-); printf("%dn",a片 程序运行后的输出结果是 A-1B0C1D)7 2/19
2 / 19 (6)有以下程序 #include <stdio.h> main() { 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 (6)C 【解析】此题非常简单,变量 a 运算前自减 1,变为 0,所以只执行了 b+=2 语句就 输出为 2。 (7)下列条件语句中,输出结果与其他语句不同的是_。 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); (7) D 【解析】当 a 为 0 时 A)逻辑判断值为 0,输出 y;B) 逻辑判断值为 1,输出 y;C) 逻 辑判断值为 0,输出 y;D) 逻辑判断值 a==0 为 1,输出 x (8)有以下程序段 #include <stdio.h> main() { int a=7; while(a- -); printf("%d\n",a); } 程序运行后的输出结果是_。 A)-1 B)0 C)1 D)7
(⑧)A【解析】whil(是一句无执行句的循环语句,且变量a是变为0后跳出循环,并 且又自减1为-1。 (9)以下不能输出字符A的语句是 。(注:字符A的ASCI码值为65,字 符a的ASC1码值为97 A)printf("%cn",-32); B)printf("%dn",A'); C)printf("%cln",65); D)printf("%en",'B-1); (9)B【解析】输出字符取决于输出语句的格式说明符,显然)输出是数值65。 (10)有以下程序(注:字符a的ASCI码值为97) #include<stdio.h main() char *s={"abe"); do {printf("%d",s%1);+s)while(*s): 程序运行后的输出结果是 A)abe B)789C)7890D)979899 (10)B【解折】本题是考查学生能否区别“指针变量”与“指针变量的值”。前者是地址: 后者是指针变量所指地址内的量。此题指针变量s指向“字符审数组”的起始地址,★是。 指向的字符,例如,刚开始时s值为字符“a”,即数值97,+s后指针移向“b”,即数值 98,当s移向字符c后面一个字符为”0”,则其值为0,退出循环结束。 (I)若有定义语句:double,*p=&;以下叙述错误的是 A)定义语句:*号是一个简址运算符 B)定义语句:*号是一个说明符 C)定义语句中的p只能存放double类型变量的地址 D)定义语句中,*p=&a把变量a的地址作为初始值赋给指针变量p (山)A【解析】*号是一种、表示单目运算的指针运算符,简称“简接访问运算符 (12)有以下程序 #include<stdio.h double f(doublex); main() 3119
3 / 19 (8) A 【解析】while(a-);是一句无执行句的循环语句,且变量 a 是变为 0 后跳出循环,并 且又自减 1 为-1。 (9)以下不能输出字符 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); (9) B 【解析】输出字符取决于输出语句的格式说明符,显然 B)输出是数值 65。 (10)有以下程序(注:字符 a 的 ASCII 码值为 97) #include <stdio.h> main() { char *s={"abc"}; do { printf("%d",*s%10); ++s; } while(*s); } 程序运行后的输出结果是_。 A)abc B)789 C)7890 D)979899 (10) B 【解析】本题是考查学生能否区别“指针变量”与“指针变量的值”。前者是地址; 后者是指针变量所指地址内的量。此题指针变量 s 指向“字符串数组”的起始地址,*s 是 s 指向的字符,例如,刚开始时*s 值为字符“a”,即数值 97,++s 后指针移向“b”,即数值 98,当 s 移向字符 c 后面一个字符为”\0”,则其值为 0,退出循环结束。 (11)若有定义语句:double a, *p=&a; 以下叙述错误的是_。 A)定义语句:*号是一个简址运算符 B)定义语句:*号是一个说明符 C)定义语句中的 p 只能存放 double 类型变量的地址 D) 定义语句中,*p=&a 把变量 a 的地址作为初始值赋给指针变量 p (11) A 【解析】*号是一种、表示单目运算的指针运算符,简称“简接访问运算符” (12)有以下程序 #include <stdio.h> double f(double x); main()
double a=0;int i; for(i=0;i<30:i+=10)a+=f((double)i); printf("%5.0nn",a时 double f(double x) returnx*x+l;} 程序运行后的输出结果是 A)503B)401C500D)1404 (12)A【解析】主函数循环为1.0+101.0+401.0-503.0,即a显示为503 (13)若有定义语句:intyear-2009,*p-&ycar,以下不能使变量year中的值增至2010 的语句是 A)"p+=1;B)("p)++;C)++("p);D)*p++: (13)D【解析】此恶测试学生对运算符优先级判别和表达式运算法则中结合方向的判断: 根据运算符优先级规定,是2级,+与是14级:+是2级。 )*p叶=l;等效于yea=yea+1B)(*p)H+等效于year+(“C语言程序设计”P224) C)+(*p)等效于yea+D)*p+;由于两个运算符处于同一级别,且结合方向自右而 左,等效于*(p+,这样p不指向year了,year维持不变,p指向year下一个地址的值, 上机调试下一个地址的值为1245120。 (14)以下定义数组的语句错误的是 A)int num={1,2,3,4,5,6: B)int numl[3={1,23,45,6: C)int num24={1,2,3,4,5,6;D)int num4={1,2,3,45,6: (1C【解析】首先是测试数组下标的定义正确性,应该都是正确的:其次测试对数组赋 值的正确性: A)赋值后一维数组下标自动取6: B)赋值后二维数组下标取为3行3列《12,0,3,40,5,60: C二维数组是二行四列,但赋了三行四列的值,调试时出现如下:errorC2078:to0many initializer D)赋值后二维数组下标取为2行4列:《1,23,4,5,6,00}是正确的。 (15)有以下程序 #include<stdio.h> 4/19
4 / 19 { 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 (12) A 【解析】主函数循环为 1.0+101.0+401.0=503.0,即 a 显示为 503 (13)若有定义语句:int year=2009, *p=&year;,以下不能使变量 year 中的值增至 2010 的语句是_。 A)*p+=1; B)(*p)++; C)++(*p); D) *p++; (13) D 【解析】此题测试学生对运算符优先级判别和表达式运算法则中结合方向的判断: 根据运算符优先级规定,*是 2 级,+=j 是 14 级;++是 2 级。 A) *p+=1; 等效于 year=year+1 B)(*p)++等效于 year++ (“C 语言程序设计”P224) C)++(*p) 等效于 year++ D) *p++; 由于两个运算符处于同一级别,且结合方向自右而 左,等效于*(p++),这样 p 不指向 year 了,year 维持不变,p 指向 year 下一个地址的值, 上机调试下一个地址的值为 1245120。 (14)以下定义数组的语句错误的是_。 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}; (14) C 【解析】首先是测试数组下标的定义正确性,应该都是正确的;其次测试对数组赋 值的正确性: A)赋值后一维数组下标自动取 6; B) 赋值后二维数组下标取为 3 行 3 列{{1,2,0},{3,4,0},{5,6,0}}; C) 二维数组是二行四列,但赋了三行四列的值,调试时出现如下:error C2078: too many initializers D) 赋值后二维数组下标取为 2 行 4 列:{{1,2,3,4},{5,6,0,0}}是正确的。 (15)有以下程序 #include <stdio.h>
void fun(int*p) printf("%d\n",pl5): main() {inta101=f1,2,345,67,89,109 fun(&a[3J) 程序运行后的输出结果是 A)5B6C8D)9 (1⑤)D【解析】本题考核考核学生举握指针变量与数组之间关系,主函数将3地址传给 函数fum,此时函数fm中的p接收的是以首地址值为4的数组p,故5徽组元素值应 是9。 (16)有以下程序 #include <stdio.h> #define N4 void fun(intalN),int b) inti; for(i=0:i<N;i++)bli]-ali]lil-ali][N-1-il; main( {int x(NIIN]=(1,23,4,5,6,7,8,9,10,11,12,{13,14,15,161yN, fun(x.y): for(i=0:iN:+)printf("%d"il):printf("n"); } 程序运行后的输出结果是 12-3,0.0,B-3,-1,1,3C90,1,2,3D3,-3,3,-3 (1OB【解折】由于函数调用采用数组名为首地址共享方式,只要判别b0、b31即可确 定答案:由函数fm中b000-x0314-3确定答案只有A和D:其次计算 b13引-33x3到0-16-13-3。由此可知答案是B。 (17)有以下函数 int fun(char *x,char *y) 5/19
5 / 19 void fun(int *p) { 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 (15) D 【解析】本题考核考核学生掌握指针变量与数组之间关系,主函数将 a[3]地址传给 函数 fun,此时函数 fun 中的*p 接收的是以首地址值为 4 的数组 p[7],故 p[5]数组元素值应 是 9。 (16)有以下程序 #include <stdio.h> #define N 4 void fun(int a[][N], int b[]) { int i; for(i=0;i<N;i++) b[i]=a[i][i]-a[i][N-1-i]; } main() { 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<N;i++) printf("%d",y[i]); printf("\n"); } 程序运行后的输出结果是_。 A)-12,-3,0.0, B)-3,-1,1,3 C)0,1,2,3 D)-3,-3,-3,-3 (16) B 【解析】由于函数调用采用数组名为首地址共享方式,只要判别 b[0]、b[3]即可确 定答案:由函数 fun 中 b[0]=x[0][0]-x[0][3]=1-4=-3 确定答案只有 A 和 D;其次计算 b[3]=x[3][3]-x[3][0]=16-13=3。由此可知答案是 B。 (17)有以下函数 int fun(char *x, char *y)