1、第 2 章数据类型和运算符 习题及解答一选择题。1.下列是用户自定义标识符的是A)_w1 B)3_xy C)int D)LINE-3答案:A解析: C语言规定用户标识符由英文字母、数字和下划线组成,且第一个字符必须是字母或下划线,由此可见选项B) ,D)是错的;此外,C语言不允许用户将关键字作为标识符,而选项C)选项项中的int是C语言的关键字。2.C语言中最简单的数据类型包括A)整型、实型、逻辑型 B)整型、实型、字符型C)整型、字符型、逻辑型 D)字符型、实型、逻辑型答案:B解析: 本题考查 C语言的数据类型。在 C语言中,没有专门的逻辑型数据类型,可以用 0和 1来表示逻辑值。所以,在本
2、题的选择答案中,不应该包括逻辑型。3.假定int类型变量占用两个字节,其有定义:int x10=0,2,4;,则数组x在内存中所占字节数是A)3 B)6 C)10 D)20答案:D解析: x数组共有 10个元素,在花括弧内只提供 3个初值,这表示只给前面的 3个成员赋值,后 7个元素的值为 0,所以,一共有 20个字节。4.以下选项中不正确的实型常量是A)1.607E-1 B)0.7204e C)-77.77 D)234e-2答案:B解析:实型常量表示时字母 E或 e前必须有数字,其后数字必需为整数,故 B错。5.若变量已正确定义并赋值,以下符合C语言语法的表达式是A)a:=b+1 B)a=b
3、=c+2 C)int 18.5%3 D)a=a+7=c+b答案:B解析: 选项 A)中包含一个不合法的运算符“:=” ;选项 C)应改为(int)18.5%3;选项 D)可理解为两个表达式:a+7=c+b 和 a=a+7,其中第一个是错的,因为 C语言规定赋值号的左边只能是单个变量,不能是表达式或常量等。因此,正确答案是选项 B) ,它实际上相当于 a=(b=c+2),进而可分解为两个表达式:b=c+2 和 a=b。6.下列可用于C语言用户标识符的一组是A)void, define, WORD B)a3_b3, _123,CarC)For, -abc, IF Case D)2a, DO, si
4、zeof答案:B解析: C语言规定标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线,排除选项 C)和 D) 。C 语言中还规定标识符不能为 C语言的关键字,而选项 A)中 void为关键字,故排除选项 A) 。7.C语言中运算对象必须是整型的运算符是A)%= B)/ C)= D)=A)y=x-y;x-=y;的功能是_。A)把 x和 y按从大到小排列 B)把 x和 y按从小到大排列C)无确定结果 D)交换 x和 y中的值答案:D49.下面能正确表示“整数 x的绝对值大于等于 5“的 C语言表达式是_。A) x0 B) abs(x) 0 C) abs(x)=0 D) ab
5、s(int(x)=0答案:C50.以下所列的 C语言常量中,错误的是_。A) 0xFF B) 1.2e0.5 C) 1.0/2.0 D) 72答案:C二填空题。1在 C语言中用关键字【1】定义整型类型变量,用关键字 float定义单精度实型变量,用关键字 double定义双精度实型变量。答案:【1】int解析:C 语言中规定用关键字 int定义整型变量。2. 3.5+1/2的计算结果是【2】 答案:【2】3.5解析:1/2 的值为 0,故 3.5+1/2的值为 3.5。3.设 y是 int型,请写出 y为奇数的关系表达式 【3】 。答案:【3】 (y%2)=1 或 (y%2)!=04.设 in
6、t a=5,b=6,表达式(a=b-)?+a:-b 的值是【4】 。答案:【4】7解析: 此表达式为三目运算符,a 的值为 6,b的值为 6,则整个表达式的值为+a 的值,a 的值为 7。请注意前缀,-和后缀,-的区别。5.以下程序的输出结果是【5】 。int a=1234;printf (“%2dn“,a) ;答案:【5】1234解析: 在%与格式符之间插入一个整形数来指这输出宽度,并不影响数据的完整性,当插入的宽度小于实际的宽度时,则实际的宽度输出。6. 以下程序的输出结果是【6】 。main()int a=0;a+=(a=8);printf(“%dn“,a);答案:【6】16解析: 赋值
7、表达式的值就是所赋值变量的值,本题中a+=8相当于a=a+8,对表达式逐步进行求解:a+=(a=8)此时,a的值由于赋值为8,而不是0a+=8a=a+8a=167.在计算机中,字符的比较是对它们的【7】进行比较。答案:ASCII 码解析:【7】 C 语言中,字符也可以进行比较运算,且是按照 ASCII码值进行的。8.在内存中,存储字符x要占用 1个字节,存储字符串X要占用【8】个字节。答案:【8】2解析: 计算机存储一个字符用 1个字节,存储字符串时,每个字符用占用 1个字节,另在字符串的有效字符之后存储 1个字符串的结束标记符。所以存储字符串“X”要占用 2个字节,存储字符x只要 1个字节。
8、9. 以下程序的运行结果是【9】。main()int m=5;if(m+5) printf(“%dn“m); else printf(“%dn“,m - -);答案:【9】610.设有 int x=8; 则表达式 (+x*1/3) 的值是【10】 。答案:【10】311. 设 x,y,z和 k都是 int型变量,则执行表达式:x=(y=4,z=16,k=32)后,x 的值为【11】。答案:【11】3212.设 int类型的数据长度为 2个字节,则 unsigned int 类型数据的取值范围是【12】 。答案:【12】0 至 6553513.执行以下语句后 b的值为【13】 。int a,b,
9、c; a=b=c=1; +a|+b答案:【13】114.设 int x=2, y=1; 则表达式(!x|y-)的值是【14】 。答案:【14】115.设 int a=5,b=2,c=3,d=4;则表达式 ab?a:cd?c:d值为【15】。答案:【15】516若有以下程序段,int c1=1,c2=2,c3;c3=1.0/c2*c1;则执行后,c3 的值是【16】 。答案:【16】0.517. 有程序:main() int y=3,x=3,z=1;printf(“%d %dn“,(+x,y+),z+2);运行该程序的输出结果是【17】 。答案:【17】3 318. 能正确表示逻辑关系:“a5
10、或 a-1“的 C语言表达式是【18】 。答案:【18】a=5|avoid f(int n);main() void f(int n);f(5);void f(int n) printf(“%dn“,n); 则以下叙述中不正确的是A)若只在主函数中对函数f进行说明,则只能在主函数中正确调用函数fB)若在主函数前对函数f进行说明,则在主函数和其后的其他函数中都可以正确调用函数fC)对于以上程序,编译时系统会提示出错信息:提示对f函数重复说明D)函数 f无返回值,所以可用 void将其类型定义为无返回值型答案:C解析: C语言规定,一个函数中调用另一个函数(即被调用函数)需要具备的条件有:首先被调
11、用的函数必须是已经存在的函数(是库函数或用户自己定义的函数) 。如果使用库函数,一般还应该在本文件开头用#include命令将函数调用有关库函数时所需要到的信息“包含”到本文件中来。如果使用自定义函数,而且该函数与调用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数作声明,即向编译系统声明将要调用此函数,并将有关信息通知编译系统。在C语言中,可以使用函数原型进行声明,函数原型的一般形式为:函数类型 函数名(参数类型1,参数类型2)或函数类型 函数名(参数类型1 参数名1,参数类型2 参数名2)14.下列程序的运行结果是void fun(int *a, int *b) int *k;
12、k=a; a=b; b=k;main() int a=3, b=6, *x=fun(x,y);printf(“%d %d“, a, b);A)6 3B)3 6C)编译出错D)0 0答案:B解析: 函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中去。在本题解析中,我们试图将这一问题解释清楚!大家可以考虑一下利用下面这函数可不可以实现a和b的互换。swap(x,y)int x,y; int t;t=x;x=y;y=t;15.已定义以下函数 fun(char *p2, char *p1) while(*p2=*p1)!=0)p1+;p2+;
13、 函数的功能是 A)将p1所指字符串复制到p2所指内存空间 B)将p1所指字符串的地址赋给指针p2 C)对p1和p2两个指针所指字符串进行比较 D)检查p1和p2两个指针所指字符串中是否有0答案:A解析: 在本题中,while(*p2=*p1)!= 0)有两个作用,一个是判断条件是否成立以决定是否再次进入循环,另一个作用是判定前先完成*p2=*p1,该处的作用是把p1所指存储单元的字符逐一送p2所指存储单元中,直到p1所指单元内容为0为止。16.有以下程序void ss(char *s,char t)while(*s)if(*s= =t)*s=t-a+A;s+;main()char str11
14、00=“abcddfefdbd“,c=d;ss(str1,c); printf(“%sn“,str1);程序运行后的输出结果是A)ABCDDEFEDBDB)abcDDfefDbDC)abcAAfefAbAD)Abcddfefdbd答案:B解析: 在内存中,字符数据以ASCII码存储,它的存储形式就与整数的存储形式相类似。C语言使字符型数据和整型数据之间可以通用。也可以对字符数据进行算术运算,此时相当于对它们的ASCII码进行算术运算,在本题中,s+相当于s=s+1,即让s指向数组中的下一个元素17.以下存储类型只有在使用时才为该类型变量分配内存的是_。A)auto和 static B)auto
15、和 register C)register和 static D)static和extern答案:B18. 设有以下函数:fun(int x)int y=0;static int z=2;y+; z+;return(x+y+z);若在下面主程序中调用该函数,则输出结果是_。main()int x=3,k;for(k=1;klong fun(char s )long n;int sign;for(;isspace(*s);s+);sign=(*s=-)?-1:1;if(*s=+|*s=-)s+;for(n=0;isdigit(*s);s+)n=10*n+(*s-0);return sign*n;答
16、案:【2】6354解析: 函数fun的第一个for循环跳过字符串的前导空白符,接着判断第一个非空白符是否是负号,若是则置变量sign为-1;否则,置变量sign为1。接着的if语句在第一个非空白字符是负号或正号时,跳过该字符。以后的for循环将后面的数字符当作十进制数的各位数字译出一个长整数n。遇字符a时,结束循环。最后,函数返回sign与n的乘积。所以若调用函数时提供的实参是“6354abc” ,函数返回值是6354。3.当调用函数时,实参是一个数组名,则向函数传递的是【3】 。答案:【3】数组的首地址。解析: 在函数中,可以通过指针变量来引用调用函数中对应的数组元素,此操作是通过传递数组的
17、首地址来实现。4.下列程序执行后的输出结果是【4】void func(int *a,int b ) b0=*a+6; main()int a,b5;a=0; b0=3;func( printf(“%dn“,b0 );答案:【4】6解析: 函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传递到另一个函数中。当数组名作参数时,如果形参数组中的各元素的值发生变化,实参数组元素的值随之发生变化。5.该程序运行的结果是【5】 。#include#include#define M 100void fun(int m, int *a, int *n) int i,j
18、=0;for(i=1;in。请填空完善函数fun()的功能。例如:m=12,n=8时,运行结果应该是495.000000。#include #include float fun (int m, int n) int i;double p=1.0;for(i=1;i#include #define M 81int fun(char *ss, char c) int i=0;for(; 【5】;ss+)if(*ss=c)i+;return i;main() char aM, ch;clrscr();printf(“nPlease enter a string: “); gets(a);printf
19、(“nPlease enter a char: “); ch=getchar();printf(“nThe number of the char is: %dn“, fun(a,ch) );答案:【5】*ss!=0解析: 从字符串ss中找出子字符串的方法是:从第1个字符开始,对字符串进行遍历;若ss串的当前字符等于t串的第1个字符,两字符串的指针自动加1,继续比较下一个字符;若比较至字符串的结尾,则跳出循环;若ss串的字符和c串的字符对应不同,继续对ss串的下一个字符进行处理。本程序是采用逐一比较的方式找出出现的次数。循环的作用是在串中从左到右逐一走动,if()的作用是进行判断是否相同,若与c
20、相同则表示又出现一次。4.下列给定程序中函数fun()的功能是:将长整型数中每一位上为奇数的数依次取出,构成一个新数放在t中。高位仍在高位,低位仍在低位。请填空。例如:当s中的数为87653142时,t中的数为7531。试题程序:#include #include void fun(long s,long *t)int d;long s1=1;*t=0;while(s0) d=s【6】10;if(d%2!=0)*t=d*s1+*t;s1*=【7】;s/=【8】; main()long s, t;clrscr();printf(“nPlease enter s: “); scanf(“%ld“,
21、fun(s,printf(“The result is :%ldn“,t);答案:【6】% 【7】10 【8】10【解析】填空6:根据题目的意思,此处是由低到高逐位地提取变量d的每一位,然后再进行判断,所以可以推断出这里应该使用取余符号“%“ 。填空7:根据题目的意思,这里是把提取出来满足条件的数字依次从低到高填入一个新的变量t中,所以进行的操作应该是每一个数字都循环乘以10,再加上原来的部分,例如:依次得到数字321,最后应该输出123。填空8:由算法可以看出,这里应该是进行完毕一次提取,所以应该舍弃最低位-个位,即把变量s除以10。5.下列给定程序中,函数fun()的功能是:通过某种方式实
22、现两个变量值的交换,规定不允许增加语句和表达式。请填空完善函数fun()的功能。例如变量a初值为8,b初值为3,程序运行后a中的值为3,b中的值为8。试题程序:#include #include int fun(int *x,int y)【9】 t;t=*x;*x=y;return(t);main()int a=3,b=8;printf(“%d %dn “,a,b);b=fun(【10】,b);printf(“%d %dn “,a,b);答案:【9】int 【10】“ 。填空3:fun()函数的调用方式说明fun()函数的参数应当为指针类型,即应该把变量的地址作为参数传递(符号“m=*a;m+
23、=*b-3;return(main()int x=21,y=35,*a=int *k;k=fun(a,b);printf(“%dn“,*k);答案:53【命题目的】考查函数返回地址值的掌握情况。【解题要点】函数的返回值的类型不仅可以是简单的数据类型,而且可以是指针类型。【错解分析】在函数内部实现的相当于是y=x+y-3。【考点链接】函数值的类型可以是整型、实型、字符型和指针型。2.阅读下列程序,则运行结果为 #include “stdio.h“fun() static int x=5;x+;return x;main() int i,x;for(i=0;i2)return(fun(n-1)+f
24、un(n-2) );else return(2);main()printf(“%ldn“,fun(5) );答案:10【命题目的】考查对于函数的递归的掌握情况。【解题要点】这是使用递归算法求著名的菲波拉奇数列,并要熟悉函数的递归方法的调用。【考点链接】递归的函数调用必须要有使递归结束的条件。4.阅读下面程序,则程序的执行结果为 #include “stdio.h“main()int a=30,b=20,z;z=fun(a+b,a-b);printf(“%dn“,z);fun(int a,int b)int z;z=a/b;return z;答案:5【命题目的】考查对于函数的调用和返回值的掌握情
25、况。【解题要点】函数调用的时候,函数名字必须与所调用的函数名完全一致,形参与实参类型要一致,在没有给出函数返回值类型的情况下,默认为整形,当返回值为整型的函数放到主函数后面时,可以不需要事先说明就调用这个函数。【考点链接】retrun 既可以返回一个普通常量,也可以返回一个指针变量。5.阅读下面程序,则程序的执行结果为 main() int i=2,p;int j,k;j=i;k=+i;p=f(j,k);printf(“%d“,p);int f(int a,int b) int c;if(ab)c=1;else if(a=b)c=0;else c=-1;return(c);答案:-1解析: 函
26、数调用相当于f(2,3) ,程序运算应得结果为“-1” 。五编写程序题。1.请编一个函数void fun(int ttMN, int ppN), tt指向一个M行N列的二维数组,求出二维数组每列中最大元素,并依次放入pp所指的一维数组中。二维数组中的数已在主函数中给出。【解析】本题中函数的功能是求出二维数组中每列的最大元素。首先,假设各列中的第一个元素最大,然后利用行标值的移动来依次取得各列中其他元素的值,并与假设的最大值进行比较,如果遇到更大的,则把这个更大的元素看做当前该列中最大的元素,继续与该列中其他元素比较。#include #include #define M 3#define N
27、4void fun(int ttMN,int ppN)int i,j,max;for(j=0;jmax) /*如果各列中的其他元素比最大值还大,则将这个更大的元素看做当前该列中最大的元素*/max=ttij;ppj=max; /*将各列的最大值依次放入pp数组中*/main()int tMN=68, 32, 54, 12,14, 24, 88, 58,42, 22, 44, 56;int pN,i,j,k;clrscr();printf(“The riginal data is:n“);for(i=0;i#include double fun(int m) double y=1.0;doubl
28、e j=1.0;int i;for(i=2; iv)t=u;u=v;v=t;a=u;b=v;while(r=b%a)!=0)b=a;a=r;return(a);int lcd(int u,int v,int h)return(u*v/h);main()int u,v,h,l;scanf(“%d,%d“,h=hcf(u,v);printf(“H.C.F=%dn“,h);l=lcd(u,v,h);printf(“L.C.D=%dn“,l);4.写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的信息。解:/* 判断整数是否为素数 */#include “stdio.h“int prime(int number)int flag=1,n;for(n=2;n#include void inverse(char *str)char t;int i,j;for(i=0,j=strlen(str);i#include#define MAX 1000int htoi(char *s)int i,n;n=0;for(i=0;si!=0;i+)if(si=0char ch;printf(“nnttt请输入一组字符!n“);