(26)下面程序的输出结果是__________。 #define P1(x)printf(x) main() { char d[]。"p"; Pl(d); P1("d"); } A)pd B)d"d" C)"p"d D)"p""d" 答案:A 评析:带参数的宏定义的一般形式为:#define宏名(参数表)字符串 程序中的Pl(d);经宏置换后为printf(d);,所以输出字符串p;程序中的Pl("d");经宏置换后printf("d")。
(27)以下选项中,能定义s为合法的结构体变量的是__________。 A) typedef struct abc { double a; charb[10]; }s; B) struct { double a; char b[10]; }s; C) struct ABC { double a; char b[10]; } ABC s: D) typedef ABC { double a; char b[10]; } ABC s: 答案:B 评析:定义一个结构体类型的变量,可采用三种方法: ①先定义结构体类型,再定义变量名;②在定义类型的同时定义变量:③直接定义结构类型变量,即不出现结构体名:选项B符合第三种定义方法。
(28)请读程序: #include #include main() { char*s1="AbCdEf", *s2="aB"; s1++; s2++; printf("%d、n",strcmp(sl,s2)); } 上面程序的输出结果是________。 A)正数 B)负数 c)零 D)不确定的值 答案:A 评析:strcmp(X1,X2)是串比较函数,本题中"s1"、"s2"分别表示这两个串中第一个字符的地址,s1++和s2++是将指针指向串的第二个字符,则*sl为"bCdEf'',*s2为"B"。在字符串比较中,大小的确定是各个字符串相应位置字符的ASCII码值的大小决定的, sl>s2,返回值为正数。
(29)请读程序: #include main() { int a=5,b=7,c=9; printf("%d,%d,",a,b,c); printf("%d,%d,%d,"a,b); } 上面程序的输出结果是________。 A)5,7,9,5,7 B)5,7,5,7 C)5,7,不定,7,9 D)5,7,5,7,不定 答案:D 评析:printf函数按格式控制符的个数输出表列中对应的数据,若输出表列的个数大于格式控制符个数,则输出与格式控制符对应的输出表列的数据,输出表列中多的则省略;若格式控制符个数大于输出表列的个数,则输出与格式控制符对应的输出表列的数据,格式控制符多的部分输出的数据是随机的。
(30)请读程序: #incIude func(int a,int b){ Int C; c=a+b: return C: } main(){ int x=6,y=7,z=8,r; r=func((x--,y++,x+y),z--); printf("%d\n",r); } 上面程序的输出结果是________。 A)ll B)20 C)2l D)31 答案:C 评析:函数func()的作用是返回两个形参的和,第一个形参是x、y分别自减和自增后的和,其中(x--,y++,x+y)是一个逗号表达式,它的值应该等于x+y,所以整个表达式(x--,y++,x+y)的值为13,而第二个形参的值为8(根据语法规则,应当先使用,后自增),所以func()的返回值为13+8=21。
(31)请读程序: #include main() { int a,b; for(a=l,b=1;a<=100;a十+){ if(b>=20)break; if(b%3==1){b+=3;continue;} b-=5: } printf("%d\n",a); } 上面程序的输出结果是_________。 A)7 B)8 C)9 D)10 答案:B 评析:break语句的作用是用于跳出循环体; continue语句的作用是用于跳出本次循环。执行第一次循环时,(b%3==1)为真,b=4,继续下一次循环,如此反复,当b=22时结束循环,共循环8次,即a=8。
(32)设变量x为float型且已经赋值,则以下语句中能够将x中的数值保留到小数点后面两位,并将第三位四舍五入的是__________。 A)X=X*100+0.5/100.0 B)x=(X*100+0.5)/100 C)x=(int)(x*100+0.5)/100.0 D)x=(x/100+0.5)*100.0 答案:C 评析:本题通过算术表达式的运算实现小数位数保留两位并四舍五入的操作,其中(int)(x*100+0.5)是指将(x*100+0.5)的值强制转换成整型。
(33)请读程序片段(字符串内没有空格字符): printf("%d\n",strlen("ATS\n012\1\\")); 上面程序片段的输出结果是____________。 A)ll B)10 C)9 D)8 答案:C 评析:这个语句的目的是输出"ATS\n012\1\\"这个串的长度,在串中"\\"代表一个"\",而"\1"代表数字1,也占一个字符,"\n"是回车换行符,也占一个字符,加上A、T、s、0、l、2,共9个字符。
(34)运行以下程序后,如果从键盘上输入china撑<回车>,则输出结果为_________。 #include main() { int v1=0,v2=0;char ch: while((ch=getchar())!='#') switch(ch) { case'a': case 'h': default:v1++; case'0':v2++: } printf("%d,%d\n",v1,v2); } A)2,0 B)5,0 C)5,5 D)2,5 答案:C 评析:执行完一个case后面的语句后,流程控制转移到下一个case继续执行。"case常量表达式"只是起语句标号作用,并不是在该处进行条件判断。在执行switch语句时,根据switch后面表达式的值找到匹配的入口标号,就从此标号开始执行下去,不再进行判断。
(35)请选出可用作c语言用户标识符的一组标识符__________。 A)void B)a3.b3 c)For D)2a define -123 -abc DO WORD IF case sizeof 答案:B 评析:c语言规定标识符只能由字母、数字和下划线三种符号组成,而且第一个字符必须是字母或下划线。选项A中的void是c语言的关键字,不合法;选项c中的case和c语言的关键字重名,不合法;选项D中的2a是数字打头而且sizeof和c语言的关键字重名,不合法。
(36)下面能正确定义数组,并正确赋值的语句是_________。 A)int N=5,b[N][N] B]int a[1][2]={{1},{3}} C)int c[2][]={{1,2},{3,4}} D)int d[3][2]={{1,2},{34}} 答案:D 评析:可以用下面的方法对二维数组初始化: l、分行给二维数组赋初值。如int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; 2、可以将所有数据写在一个花括弧内,按数组排列的顺序对各元素赋初值。如: int a[3][4]={1,2,3,4,5,6,7,8;9,10,1 l,12); 3、可以对部分元素赋初值:int a[3][4]={{1},{5},{9}}; 它的作用是只对各行第一列的元素赋初值,其余元素值自动为0。 4、如果对全部元素都赋初值(即提供全部初始数据),则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。如:int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; 与下面的定义等价:int a[][4]={1,2,3,4,5,6,7,8,9,10,1l,12};
(37)请选出以下程序的输出结果___________。 #include sub(int*s,int y) { static int t=3; y=s[t];t--; } main() { int a[]={1,2,3,4},i,x=0; for(i=0;i<4;i++){ sub(a,x);printf("%d",x);) printf("\n"); } A)1234 B)432l C)0000 D)4444 答案:C 评析:x作为函数sub()的实参时,函数对x值的改变没有返回主函数,并不能使得x的值变化,所以在打印时,x的值是始终不变的,即为0。
(38)假定下面程序可执行文件名prg.exe,则该程序所在的子目录下输入命令行:prg hello good<回车>后,程序的输出结果是_________。 main(int argc,char*argv[]) { int i; for=1;i } A)heUo good B)hg C)hel D)hellogood 答案:B 评析:带参数的main()函数常用形式为:main(int argc,char.*argv[]),其中,整型变量argc用来记录命令行中的参数个数。参数的个数由c程序运行时自动计算出来。字符型指针数组argv的第一个元素存放命令名,其后各个元素依次存放命令行中各个参数的首地址,数组的大小由argc确定。for循环语句实现输出各参数的第一个字母。
(39)若有以下说明和语句,请选出哪个是对c数组元素的正确引用_________。 int c[4][5],(*cp)[5]; cp=c; A)cp+l B)*(cp+3) C)*(cp+1)+3 D)*(*cp+2) 答案:D 评析:cp=c这个语句是将数组第0行的地址赋给了cp。cp+1使指针指向二维数组c的第一行;+(cp+3)是数组c的第三行的第0列的地址值;+(cp+1)+3是数组c的第一行第三列的地址值。
(40)下列选项中不能正确定义结构体的是_________。 A)typede fstruct B)struct color c1 { int red; { int red; int green; int green; int blue; int blue; }cOLOR; }; COLOR cl; C)struct color D)struct { int red; { int red; int green; int green; int blue; int blue; }cl; }cl; 答案:B 评析:将一个变量定义为标准类型与定义为结构体类型不同之处在于:后者不仅要求指定变量为结构体类型,而且要求指定为某一特定的结构体类型(例如,struct color),不能只指定结构体名。其中可以不出现结构体名,答案D就是缺省结构体名的情况。而变量名列表必须放在成员列表后面,所以B答案不能正确将c1定义为结构体变量。 (41)设有以下语句 char a=3,b=6,c; c=a^b<<2: 则c的二进制值是_________。 A)00011011 B)00010100 c)00011100 D)00011000 答案:A 评析:"<<"是c语言中规定的左移运算符,n是异或运算符,所以,c的二进制值应为0001 1011。
(42)设有如下定义 struct ss { char name[10]; int age; char sex; }std[3],*p=std; 下列各输入语句中错误的是__________. A)scanf("%d",&(*p).age); B)scanf("%s",&std.name); c)scanf("%c",&std[O].sex); D)SCanf("%c",&(p->SEX)); 答案:B 评析:在c语言中,结构体变量的引用有三种等价方式: 1、结构体变量.成员名;2、(*p).成员名;3、p->成员名。 因为std.name是字符数组名,-本身代表地址,其前面不应该使用"&"符号,所以选项B错误。
(43)设有 static char str[]="Beijing"; 则执行 printf(%d\n",strlen(strcpy(str,"China"))); 后的输出结果为__________。 A)5 B)7 C)12 D)14 答案:A 评析:在执行printf()函数前,数组str的长度是7,但是当使用strcpy()函数将新的值赋给str后,strlenr)函数返回的应当是现在的str字符串的字符个数,即是5。
(44)下列程序段中,不是死循环的是__________。 A)int i=100; B)unsigned k=0; while(1) do { { i=i%100+l: ++k; if(i>=100)break; } } while(k>=0); C)for(;;); D)int s=3379; while(s++%2+s%2)s++; 答案:A 评析:当表达式为非0值时,执行while语句中的内嵌语句,可用break语句跳出循环,用continue语句结束本次循环。选项A不是死循环,当i=100时跳出循环。选项c为空循环语句。
(45)以下程序的输出结果是________。 #include main() { int i; for(i=l;i<5;i++){ if(i%2)print引剃'); else continue; printf("≠f"); } printf("$\n"); } A)*#*#*#$ B)#*#*#*$ C)*#*#$ D)#*#*$ 答案:C 评析:当i不可以整除2时打印"*",然后打印"拌",不能整除2则执行continue,跳过printf("#"):语句,结束本次循环,返回到循环的起始点。当循环结束后,打印"$"。
(46)库函数strcpy用以复制字符串,若有以下定义和语句: char strl[]="china",str2[10],*str3,*str4="china"; 则对库函数strcpy的正确的调用是_________。 A)strcpy(strl,"people"); B)strcpy(str2,"people"); C)strcpy(str3,"people"); D)strcpy(str4,"people"); 答案:B 评析:strcpy(字符数组1,字符串2)其作用是将字符串2复制到字符数组l中去。 注:(1)字符数组l必须定义得足够大;(2)"字符数组1"必须写成数组名的形式; (3)复制时连同字符串后面的'\0'一起复制到字符数组1中。
(47)有以下程序 #include main() {int c; while((c=getchar())!='\n'){ switch(C-'2'){ case 0:case 1:putchar(c+4); case 2:putchar(c+4);break; case 3:putchar(c+3); default:putchar(c+2);break;} } } 从第一列开始输入以下数据,↙代表一个回车符。 2473↙ 程序的输出结果是_________。 A)668977 B)668966 C)66778777 D)6688766 答案:A 评析:getchar()函数是从键盘接受一个字符输入;当用户键入的字符不是回车符时,会进入一个多分支选择语句,根据C-'2'的值进行分支选择;putchar()是在屏幕上打印一个字符,最后的结果应当为668977。
(48)下面程序的输出结果是_________。 Union un { int a[4]; long b: char c[6];} main() { union un u: printf("%d%d",sizeof(u),sizeof(u.a)); } A)82 B)88 C)188 D)182 答案:B 评析:sizeof函数计算已知类型所占的字节数。共用体变量所占的内存长度等于最长的成员的长度。
(49)以下程序的输出结果是________。 main() { int w=5;fun(w);printf("\n");} fun(int k) { if(k>0) fun(k-1); printf("%d.t,k); } A)5 4 3 2 l B)0 1 2 3 4 5 C)l 2 3 4 5 D)5 4 3 2 l 0 答案:B 评析:函数的递归调用就是在调用一个函数的过程中又出现直接或间接地调用该函数本身。fun函数共被调用6次,即fun(5)、fun(4)、fun(3)、fun(2)、向n(1)、fun(0)。其中fun(5)是main函数调用的。
(50)若巾是指向某文件的指针,且已读到此文件的末尾,则函数feof(f1))的返回值是 A)EOF B)O C)非零值 D)NULL 答案:C 评析:函数feof是用来判断文件是否已读到末尾,如果已读到末尾则返回非零值,否则返回O。
二、填空题(每空2分,共40分) 请将每一个空的正确答案写在答题卡的【1】至【20】序号的横线上,答在试卷上不得 分。 (1)算法的复杂度主要包括时间复杂度和 【1】 复杂度。 答案:【1】空间 评析:习惯上常常把语句重复执行的次数作为算法运行时间的相对量度,称作算法的时间复杂度。算法在运行过程中需辅助存储空间的大小称为算法的空间复杂度。
(2)数据的物理结构在计算机存储空间中的存放形式称为数据的 【2】 。 答案:【2】内模式或物理模式或存储模式 评析:一个数据库只有一个内模式,它是数据物理结构和存储方式的描述,是数据库内部的表示方法。例如,记录的存储方式是顺序存储、索引按照什么方式组织;数据是否压缩存储,是否加密等。
(3)若按功能划分,软件测试的方法通常分为 【3】 测试方法和黑盒测试方法。 答案:【3】白盒 评析:软件测试的方法有三种:动态测试、静态测试和正确性证明。 设计 测试实例的方法一般有两类:黑盒测试方法和自盒测试方法。
(4)数据库三级模式体系结构的划分,有利于保持数据库的 【4】 。 答案:【4】数据独立性 评析:数据库的三级模式体系结构把数据的组织管理工作进行了划分,把数据的具体组织留给DBMS管理,使用户能逻辑地、抽象地处理数据,而不必关心数据在计算机中的具体表示方式与存储方式,保证了数据的独立性。
(5)在关系运算中,查找满足一定条件的元组的运算称之为 【5】 。 答案:【5】选择 评析:在关系数据库中,选择运算也是一个元运算,关系R通过选择运算(并由该运算给出所选择的逻辑条件)后仍为一个关系。这个关系是由R中的那些满足逻辑条件的元组所组成。
(6)在C语言中(以16位PC机为例),一个float型数据在内存中所占的字节数为4;一个double型数据在内存中所占的字节数为 【6】 。 答案:【6】8 评析:在一般16位PC机中,一个float型数据在内存中占4个字节(32位),一个double型数据占8个字节。
(7)设有以下变量定义,并已赋确定的值, char w;int x;float y;double z; 则表达式:w*x+z-y所求得的数据类型为 【7】 。 答案:【7】double型或双精度型 评析:①先进行W*X的运算,先将字符型w转换成整型,运算结果为整型;②再将W*X的结果与z相加,要先将第一步的整型转换为double型,运算结果为double型;③最后将W*X+Z的结果与y相减,要先将float型y转换成double型,结果为double型。
(8)若运行时给变量x输入12,则以下程序的运行结果是 【8】 ; main(){ int,y; scanf(""%d"",&X); y=x>12?x+lO:x-12; printf(""%d\n"",y); } 答案:【8】0 评析:三目运算符的形式为(表达式1)7(表达式2):(表达式3)。当(表达式1)值为真时,返回(表达式2)的值;为假时,返回(表达式3)的值。题中因为x>t2为假,所以结果为x-12,即为0。
(9)四条语句:x++;、++x;、x=x+l;、x=l+x;,执行后都使变量x中的值增l,请写出一条同一功能的赋值语句(不得与列举的相同) 【9】 。 答案:【9】x+=1: 评析:题面中的四条语句的作用是使x的值加1,在c中有多种方法可以对变量进行加1操作,这里可以利用C的复合赋值运算符+=实现,本题答案为x+=1:。
(10)设有以下定义和语句,则*(*(p+2)+1)的值为 【10】 。 int[3][2]={10,20,30,40,50,60},(*p)[2]; p=a; 答案:【10】60 评析:本题定义了一个3行2列的二维数组a,并定义了一个指向两个元素的一维数组指针p,让p指向二维数组a的首行。*(*(p+2)+1)是引用a[2][1],其值是60。
(11)若要使指针p指向一个double类型的动态存储单元,请填空。 p= 【11】 malloc(sizeof(double)); 答案:【11】(double*) 评析:函数malloc返回的是void*,所以若要使指针指向一个double类型,则必须进行类型转换,类型转换格式为:(数据类型*)。
(12)下面程序的功能:输出100以内能被3整除且个位数为6的所有整数,请补充完整。 main(). { int ij; for(i=O; 【12】 ;i++) { j=I*10+6; if( 【13】 )continue; printf("%d",j); } } 答案:【12】i 【13】j%3!=0 评析:本题要求输出100以内能被3整除且个位数为6的所有整数,程序中j=i*10+6;语句是求个位数为6的整数,由此可得出程序的循环次数为i (13)函数mycmp(char*s,char。t)的功能是比较字符串s和t的大小,当s等于t时返回0, 当s>t返回正值,当s mycmp(char*s,char*t) { while(*s==*t) { if(*s=='\0')return 0; ++s;++t; } return( 【14】 ); } 答案:【14】*s-*t或-*t+*s 评析:函数的两个形参是两个字符指针变量,字符串的首地址是指针变量的值,*s和*t表示字符串数组s和t的第一个字符,在while循环中,是通过s和t值的不断变化来改变指针所指向的字符,要改变s和t所指不同字符的ASCII码的差值,必须使用"*s-*t"得出。
(14)以下程序运行后的输出结果是 【15】 。 void fun(、) { static int a=0: a+=2;printf("%d",a); } main() { int cc; for(CC=1;cc<4;cc++)fun(); printf("\n"); } 答案:【15】2 4 6 评析:static声明的外部变量只限于被本文件引用,而不能被其他文件引用。用static来声明一个变量的作用有:①对局部变量用static声明,则为该变量分配的空间在整个程序执行期间始终存在;②全部变量用static声明,则该变量的作用域只限于本文件模块(即被声明的文件中)。
(15)下列程序的运行结果是 【16】 。 main() { union EXAMPLE { struct {int x;int y;}in; int a; int b: }e; e.a=1;e.b=2; e.in.x=e.a*e.b; e.in.y=e.a+e.b; printf("%d,%d\n",e.in.x,e.in.y); } 答案:【16】4,8 评析:c语言规定,共用体中各个成员变量在内存中占用同一段内存单元,即e.in.x和e.a、e.b占用同一段内存单元,由于e.in.x和e.a、e.b占用的是同一段内存单元,所以程序最后的打印结果为"4,8"。
(16)在对文件进行操作的过程中,若要求文件的位置回到文件的开头,应当调用的函数 是 【17】 函数。 答案:【17】[NNlrewind或fseek 评析:在对文件进行操作的过程中,若要求文件的位置回到文件的开头,可以调用rewind或fseek函数。其中rewind函数的作用是将位置指针重新返回文件的开头,而fseek函数可以实现文件指针的定位。
(17)以下函数用于求出一个2×4矩阵中的最大元素值。 max_value(arr) int arr[][4]; { int I,J,max; max=alT[0][0]; for(i=0;i<2;i++) for(j=0; 【18】 ;J++) if( 【19】 >max)max=[2Q]; return(max); } 答案:【18】j<4 【19】arr[i][j] 【20】arr[i][j] 评析:2*4矩阵实际上就是一个二维数组,结合本题应为arr[2][4],所以在第一个循环中应当填写"4";第二个横线处是要判断当前的数组元素值是否大于max,所以应填写arr[i][j];第三个横线处是要将当前大于max的数组元素的值赋给变量max,所以应当填写"arr[i][il"。
|