![]() ![]() |
|
05年9月等级考试二级C语言考前密卷2 | |
作者:佚名 文章来源:不详 点击数 更新时间:2008/4/18 14:41:40 文章录入:杜斌 责任编辑:杜斌 | |
|
|
下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确选项涂写在答题卡相应位置上,答在试卷上不得分。 (1)算法分析的目的是________。 A)找出数据结构的合理性 B)找出算法中输入和输出之间的关系 C)分析算法的易懂性和可靠性 D)分析算法的效率以求改进 答案:D 评析:算法分析是指对一个算法的运行时间和占用空间做定量的分析,一般计算出相应的数掌级,常用时间复杂度和空间复杂度表示。分析算法的目的就是要降低算法的时间复杂度和空间复杂度,提高算法的执行效率。 (2)n个顶点的强连通图的边数至少有________。 A)n-1 B)n(n-1) C)n D)n+l 答案:C 评析:在有向图中,若任意两个顶点都连通,则称该图是强连通图,这样的有向图的形状是环状,因而至少应有n条边。 (3)已知数据表A中每个元素距其最终位置不远,为节省时间,应采用的算法是________。 A)堆排序 B)直接插入排序 C)快速排序 D)直接选择排序 答案:B 评析:当数据表A中每个元素距其最终位置不远,说明数据表A按关键字值基本有序,在待排序序列基本有序的情况.下,采用插入排序所用时间最少,故答案为选项B。 (4)用链表表示线性表的优点是________。 A)便于插入和删除操作 B)数据元素的物理顺序与逻辑顺序相同 C)花费的存储空间较顺序存储少 D)便于随机存取 答案:A 评析:链式存储结构克服了顺序存储结构的缺点:它的结点空间可以动态申请和释放;它的数据元素的逻辑次序靠结点的指针来指示,不需要移动数据元素。故链式存储结构下的线性表便于插入和删除操作。 (5)下列不属于结构化分析的常用工具的是________。 A)数据流图 B)数据字典 C)判定树 D)PAD图 答案:D 评析:结构化分析的常用工具有数据流图、数据字典、判定树和判定表。而PAD图是常见的过程设计工具中的图形设计。 (6)软件开发的结构化生命周期方法将软件生命周期划分成________。 A)定义、开发、运行维护 B)设计阶段、编程阶段、测试阶段 C)总体设计、详细设计、编程调试 D)需求分析、功能定义、系统设计 答案:A 评析:通常,将软件产品从提出、实现、使用维护到停止使用退役的过程称为软件生命周期。它可以分为软件定义、软件开发及软件运行维护三个阶段。 (7)在软件工程中,白盒测试法可用于测试程序的内部结构。此方法将程序看做是________。 A) 循环的集合 B)地址的集合 C)路径的集合 D)目标的集合 答案:C 评析:软件的白盒测试方法是把测试对象看做一个打开的盒子,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。 (8)在数据管理技术发展过程中,文件系统与数据库系统的主要区别是数据库系统具有________。 A)数据无 冗余 B)数据可共享 C)专门的数据管理软件 D)特定的数据模型 答案:D 评析:在文件系统中,相互独立的记录其内部结构的最简单形式是等长同格式记录的集合,易造成存储空间大量浪费,不方便使用。而在数据库系统中,数据是结构化的,这种结构化要求在描述数据时不仅描速数据本身,还要描述数据间的关系,这正是通过采用特定的数据模型来实现的。 (9)分布式数据库系统不具有的特点是________。 A)分布式 B)数据冗余 C)数据分布性和逻辑整体性 D)位置透明性和复制透明性 答案:B 评析:分布式数据库系统具有数据分布性、逻辑整体性、位置透明性和复制透明性的特点,其数据也是分布的;但分布式数据库系统中数据经常重复存储,数据也并非必须重复存储,主要视数据的分配模式而定。若分配模式是一对多,即一个片段分配到多个场地存放,则是冗余的数据库,否则是非冗余的数据库。 (10)下列说法中,不属于数据模型所描述的内容的是________。 A)数据结构 B)数据操作 C)数据查询 D)数据约束 答案:C 评析:数据模型所描述的内容有3个部分,它们是数据结构、数据操作和数据约束。数据操作主要是描述在相应数据结构上的操作类型与操作方式;数据模型中的数据约束主要描述数据结构内数据间的语法、语义联系,它们之间的制约与依存关系,以及数据动态变化的规则,以保证数据的正确、有效与胡容。
(11)在结构化程序设计中,限制使用goto语句的原因是________。 A)提高程序的执行效率 B)提高程序的清晰性和可靠性 C)便于程序的合成 D)该语句对任何结构的程序都不适用 答案:B 评析:在c语言中,限制使用goto语句,其目的是为了提高程序的清晰性与可靠性,一般来说,除了从多重循环中跳出,一般不使用goto语句。 (12)以下选项中合法的实型常数是________。 A)5E2.0 B)E-3 C).2E0 D)1.3E 答案:C 评析:以指数形式表示实数时,字母e(或E)之前必须有数字,且e后面指数必须为整数。 (13)下列叙述中,正确的是________。 A)C语言中既有逻辑类型也有集合类型 B)c语言中没有逻辑类型但有集合类型 B)C语言中有逻辑类型但没有集合类型 B)C语言中没有逻辑类型也没有集合类型 答案:B 评析:在c语言中只提供了整型、浮点型、字符型这几种基本类型,c语言没有提供逻辑类型,在c中一般用整型来表示逻辑类型。在自定义类型中,c提供了struct,enum及union类型,但没有提供集合类型,在pascal中提供了集合类型set。 (14)已知大写字母A的ASCII码是65,小写字母a的ASCII码是97,则用八进制表示的字符常量’\10l’是________。 A)字符A B)字符a C)字符e D)非法的常量 答案:A 评析:八进制101转换为十进制即为65,而字母A的ASCII码是65,所以用八进制表示的字符常量’\101’是A。 (15)设a和b均为double型常量,且a=5.5 、b=2.5,则表达式(int)a+b/b的值是________。 A)6.500000 B)6 C)5.500000 D)6.000000 答案:D 评析:各类数值型数据在进行混合运算时,不同类型的数据要先转换成同一类型,然后进行运算。转换的规则为:总是转换为精度更大的数据类型,字符数据转换为整数,short型转为int型,float型数据在运算时转换成双精度型,以提高运算精度。 (16)以下四个选项中不能看作一条语句的是________。 A){;} B)a=0,b:0,c=0; C)if(a>0); D)if(b==0)m=l;n=2; 答案:D 评析:选项A为空语句,选项B是一个由逗号运算符表达式形成的语句,选项c为一个条件语句,选项D有两个分号,是由两个语句构成,不能看成一条语句。 (17)已知i、j、k为int型变量,若从键盘输入:1,2,3↙,使i的值为l、j的值为2、k的值为3,以下选项中正确的输入语句是________。 A)scanf("%2d%2d%2 dtt,&i,&j,&k); B)scanf("%d %d %d",&i,&j,&k); C)scanf("%d,%d,%dfI,&i,&j,&k); D)scanf("i=%d,j=%d,k=%d-t,&i,&j,&k); 答案:C 评析:如果在"格式控制"字符串中除了格式说明以外还有其它字符,则在输入数据时应输入与这些字符相同的字符。 (18)关于goto语句的使用,下面正确的是________。 A)goto 2; B)goto g; C)goto g:; D)goto 2; 2:exit(0); g:exit(O); g:exit(O); 2 exit(0); 答案:B 评析:在c中,goto语句后面的标号的命名规则与c语言中标识符的命名规则相同,在goto语句后面的标号后不要加":"号,在某一行上添加标号时,在标号的后面要添加":"号。 (19)若有以下程序: main() {int k=2,i=2,m; m=(k+=I*=k); printf("%d,%d、n",m,i); } 执行后的输出结果是__________。 A)8,6 B)8,3 C)6,4 D) 7,4 答案:C 评析:在赋值符"="之前加上其它运算符,可以构成复合的运算符。此运算为右结合性,即从右往左计算。I*=k即i=i*k=2*2=4,k=k+i=2+4=6,然后将k的值赋给m。
(20)以下函数的功能是:通过键盘输入数据,为数组中的所有元素赋值。 #define N 10 void arrin(int x[N]) { int i=0; while(i<N)scanf("%d",_________); } 在下划线处应填入的是_________。 A)x+i B)&x[i+l] C)x+(i++) D)&x[++I] 答案:C 评析:在c中 ,对于一维数组而言,数组变量表示数组中首元素的的地址。当用scanf函数向数组x的第i个元素中输入整型数据时,只要执行scanf("%d"x+i):由于要循环输入数组中和各个元素,必须要使其地址值不断自增。故本题答案为c。 (21)已有定义:int x=3,y=4,z=5;,则表达式!(x+y)+z-l&&y+z/2的值是_________。 A)6 B)0 C)2 D)1 答案:D 评析:在本题中,运算符的优先级分别为:!>/>+,->&&即:!(3+4)+5-1&&4+5/2=0+5-1&&4+2=4&&6=l。 (22)以下选项中,与k=11++完全等价的表达式是__________。 A)k=n,n=n+1 B)n=n+1,l(=n C)l(=什n D)k+--n+1 答案:A 评析:n++是自增运算,是先使用,然后再使n加1, (28)已定义以下函数: fun(char*p2,char*p1) {while((*p2=*p1)!=’\0’){pl++;p2++;}} 函数的功能是__________。 A)将p1所指字符串复制到p2所指内存空间 B)将pl所指字符串的地址赋给指针p2 C)对p1和p2两个指针所指字符串进行比较 D)检查p1和p2两个指针所指字符串中是否有’\O’ 答案:A 评析:由于在while循环的条件中执行了*p2=*pl运算,其作用是将*pl中的内容复制到*p2中,而(*p2=*p1)!=’\0’的作用是判断当前字符是否为字符串结束字符’\O’。在循环体中p1++,p2++的目的是移动字 (29)有以下程序 void fun(char*c,int d) {*c=*c+1;d=d+1; printf("%c,%c,",*c,d); } main() {char a:。A’,b。’a’; fun(&b,a);printf("%c,%c\n",a,b); ) 程序运行后的输出结果是_________。 A)B,a,B,a B)a,B,a,B C)A,b,A,b D)b,B,A,b 答案:D 评析:将a,b代入函数得+&b=。&b+1=a+l=b,所以打印出第一个字母b; a=a+l=A+l=B,打印出第二个字符B; a=’A’,输出字母A; b由于是按地址传到函数而被修改,为’b’,输出字母b
(30)以下程序中函数sort的功能是对a所指数组中的数据进行由大到小的排序。 void sort(int a[],im n) {intiJ,t; for(i=O;i<n-1;i++) for=i+1 0<n0++) if(a[i]<aD)) {t=-a[I];a[I=a[j];a[j]=t;} } main() {int aa[10]:{1,2,3,4,5,6,7,8,9,10} ,i; sort(&aa[3],5); for(i=0;i<lO;i++)primf("%d,",aa[I]); printf("\n"); ) 程序运行后的输出结果是________。 A)l,2,3,4,5,6,7,8,9,10, B)10,9,8,7,6,5,4,3,2,1, C)l,2,3,8,7,6,5,4,9,10, D)l,2,10,9,8,7,6,5,4,3, 答案:C 评析:本题并不是对数组的所有元素进行排序,而是对从a[3]开始往后的4个元素进行排序。 (31)对于基类型相同的两个指针变量,不能进行的运算是________。 A)< B)= C)+ D) 答案:C 评析:对于指针变量,除了常规的*、&、=运算外,还可以对其比较地址的大小,计算两指针变量的差值,但对于地址执行+、*、/、%等算术运算都是无意义的。 (32)有以下程序 main() {char a[]={’a’,’b’,’c’,’d’,’e’,’f’,’g’,’h’,’\O’};int I,J; i=sizeof(a); j=strlen(a); printf("%d,%d\n",I,J); } 程序运行后的输出结果是________。 A)9,9 B)8,9 C)1,8 D)9,8 答案:D 评析:sizeof()函数是计算字符数组的长度,因为’\0’也是一个字符,要计算在内。strlen()是计算字符串长度的函数,遇到’\0’即认为是字符串结束,不把空字符计入字符串的长度。 (33)以下不能正确定义二维数组的选项是_________。 A)int a[2][2]={{1},{2}} B)int a[][2]={l,2,3,4} C)int a[2][2]={{l},2,3} D)int a[2][]={{1,2},{3,4}} 答案:D 评析:在二维数组进行初始化时,可以省略数组的一个维度,但省略的维数只能是高维部分,不能是低维。对于多维数组的初始化时,也是同样处理,因此,本题答案应选D,其它选项均能对数组进行正确的初始化。 (34)有一函数 ┏ l x>O y=┨ O x=O ┗ -1 x<O 以下程序段中不能根据x的值正确计算出y的值的是___________。 A)if(x>O)y=l;else if(x==O)y=0;else y=-l; B)y=O;if(x>O)y=1;else if(x<O)y=-1; C)y=0;if(x>=0)if(x>O)y=1;else y=-l; D)if(x>=0)if(x>O)y=l;else y=O;else y=-1; 答案:C 评析:本题应当注意if与else的配对关系。从最内层开始,else总是与它上面最近的(未曾配对的)if配对。 (35)以下程序中的函数reverse的功能是将a所指数组中的内容进行逆置。 void reverse(int a[],im n) {int i,t; for(i=O;i<n/2;i++) {t=a[i];a[i]=a[n-l-i];a[n-1-i]=t;} } main() {int b[10]={1,2,3,4,5,6,7,8,9,10};int i,s=0; reverse(b,8); for(i=6;i<10;i++)s+=b[I]; printf("%d\n",s); } 程序运行后的输出结果是 A)22 B)10 C)34 D)30 答案:A 评析:本题并不是将整个数组中的内容逆置,而是逆置前8个元素。逆置后的数组为:8,7,6,5,4,3,2,1,9,10通过for循环计算b[6]+b[7]+b[8]+b[9]即2+1+9+10=22。
(36)执行下面的程序段后,变量k的值为___________。 int k=3,s[2]; s[0]=k;k=s[1]*10; A)不确定 B)33 C)30 D)10 答案:A 评析:由于本题中未对数组进行初始化,因此程序运行时,数组s中各个元素的值都是不确定的,虽然在代码中对s[O]进行了赋值,但没有对s[1]进行赋值,故执行l(=s[1]+10;后,k的值不确定。 (37)有以下程序 #include<string.h> main() { char’p="abcde\0fghjik\O"; printf("%d\n",strlen(p)); } 程序运行后的输出结果是__________。 A)12 B)15 C)6 D)5 答案:D 评析:"\0"是字符串结束标志,当遇到此标志时字符串已结束。所以字符串的长度为5。 (38)程序中头文件t)rpel_h的内容是: #define N 5 #define Ml N*3 程序如下: #include"type 1.h" #define M2 N*2 main() { int i; i=MI+M2; printf("%d\n",i); } 程序编译后运行的输出结果是_________。 A)lO B)20 C)25 D)30 答案:C 评析:宏定义就是用一个指定的标识符(即名字)来代表一个字符串,它的一般形式为: #define 标识符 字符串 这种方法使用户能以一个简单的名字代替一个长的字符串,因此把这个标识符(名字)称为"宏名"。 (39)若有以下的程序段,则在执行for语句后,*(*(pt+1)+2)表示的数组元素是________。 int t[3][3],*pt[3],k; for(k=0;k<3;k++)pt[k]=&t[k][O]; A)t[2][0] B]t[2][2] C]t[1][2] D]t[2][1] 答案:C 评析:在题面中定义了一个二维数组l,及一个一维指针数组pt,在循环语句中分别对指针 数组赋值为二维数组t的第k行首元素的地址。*(pt+1),表示的是数组pt中下标为1的元素的值,而该值为二维数组t的第l行(从第0行算起)的首元素的地址,故*(*(pt+1)+2)表示的是数组t中t[1][2]的元素的值。 (40)以下叙述中错误的是_________。 A)二进制文件打开后可以先读文件的末尾,而顺序文件不可以 B)在程序结束时,应当用fclose函数关闭已打开的文件 C)利用fread函数从二进制文件中读数据,可以用数组名给数组中所有元素读入数 据 D)不可以用FILE定义指向二进制文件的文件指针 答案:D 评析:每个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息,这些信息是保存在一个名为FILE的结构体类型的结构体变量中的。而文件又分为ASCII文件和二进制文件,所以,、可以用FILE定义指向二进制文件的文件指针。 (41)有以下程序 #include<string.h> main(int argc,char *argv[]) { inti,len=0; for(i=1;i<argc;i++)len+=strlen(argv[I]); printf("%d\n",len); ) 程序编译连接后生成的可执行文件是exl.exe,若运行时输入带参数的命令行是: exl abcd efg 10↙ 则运行的结果是________。 A)22 B)17 C)12 D)9 答案:D 评析:本题主函数带有两个参数,一个int型变量argc,另一个是char型的一维一级指针数组argv。当主函数被执行时,系统自动将根据命令行的情况,分别给主函数的两个参数赋值。argc用于存放命令行中命令字和参数的总和的个数4,argv用来存放命令行中命令字和所有参数的字符串,并规定 argv[0]存放命令字字符串exl,argv[1]用来存放第一个参数的字符串abcd,argv[21用来存放第二个参数的字符串e龟,argv [3]用来存放第三个参数的字符串10。那么for循环将循环3次分别将argv数组中元素的长度累加到len中,所以答案为9。
(42)若有以下说明和定义:__________。 fun(*C){…} main() {int(*a)()=fun,(*b)(),w[10],c;} 在必要的赋值后,对fun函数调用正确的是_________。 A)a=a(w); B) (*a)(&C); C)b=*b(w); D)fun(b); 答案:B 评析:在主函数中定义了二个指向函数的指针a,b,其中指针a指向函数fun,指针b未初始化。对于选项A、c,其返回类型是错误的,对于D,其调用的参数是错误的,选项B是正确的,其相当于调用函数fhll(&C);。 (43)有以下程序 intfa(intx、 {returnx*x;} int fb(intxl {returnX*X*x;} int f(int(*f1)(),int(*f2)(),int x) {return f2(x)-fl(x);) mai n() { int i; i=f(fa,fb,2);printf("%d\n",i); } 程序运行后的输出结果是 A) 4 B)1 C)4 D)8 答案:C (28)已定义以下函数: fun(char*p2,char*p1) {while((*p2=*p1)!=’\0’){pl++;p2++;}} 函数的功能是__________。 A)将p1所指字符串复制到p2所指内存空间 B)将pl所指字符串的地址赋给指针p2 C)对p1和p2两个指针所指字符串进行比较 D)检查p1和p2两个指针所指字符串中是否有’\O’ 答案:A 评析:由于在while循环的条件中执行了*p2=*pl运算,其作用是将*pl中的内容复制到*p2中,而(*p2=*p1)!=’\0’的作用是判断当前字符是否为字符串结束字符’\O’。在循环体中p1++,p2++的目的是移动字 (29)有以下程序 void fun(char*c,int d) {*c=*c+1;d=d+1; printf("%c,%c,",*c,d); } main() {char a:。A’,b。’a’; fun(&b,a);printf("%c,%c\n",a,b); ) 程序运行后的输出结果是_________。 A)B,a,B,a B)a,B,a,B C)A,b,A,b D)b,B,A,b 答案:D 评析:将a,b代入函数得+&b=。&b+1=a+l=b,所以打印出第一个字母b; a=a+l=A+l=B,打印出第二个字符B; a=’A’,输出字母A; b由于是按地址传到函数而被修改,为’b’,输出字母b (30)以下程序中函数sort的功能是对a所指数组中的数据进行由大到小的排序。 void sort(int a[],im n) {intiJ,t; for(i=O;i<n-1;i++) for=i+1 0<n0++) if(a[i]<aD)) {t=-a[I];a[I=a[j];a[j]=t;} } main() {int aa[10]:{1,2,3,4,5,6,7,8,9,10},i; sort(&aa[3],5); for(i=0;i<lO;i++)primf("%d,",aa[I]); printf("\n"); ) 程序运行后的输出结果是________。 A)l,2,3,4,5,6,7,8,9,10, B)10,9,8,7,6,5,4,3,2,1, C)l,2,3,8,7,6,5,4,9,10, D)l,2,10,9,8,7,6,5,4,3, 答案:C 评析:本题并不是对数组的所有元素进行排序,而是对从a[3]开始往后的4个元素进行排序。
(31)对于基类型相同的两个指针变量,不能进行的运算是________。 A)< B)= C)+ D) 答案:C 评析:对于指针变量,除了常规的*、&、=运算外,还可以对其比较地址的大小,计算两指针变量的差值,但对于地址执行+、*、/、%等算术运算都是无意义的。 (32)有以下程序 main() {char a[]={’a’,’b’,’c’,’d’,’e’,’f’,’g’,’h’,’\O’};int I,J; i=sizeof(a); j=strlen(a); printf("%d,%d\n",I,J); } 程序运行后的输出结果是________。 A)9,9 B)8,9 C)1,8 D)9,8 答案:D 评析:sizeof()函数是计算字符数组的长度,因为’\0’也是一个字符,要计算在内。strlen()是计算字符串长度的函数,遇到’\0’即认为是字符串结束,不把空字符计入字符串的长度。 (33)以下不能正确定义二维数组的选项是_________。 A)int a[2][2]={{1},{2}} B)int a[][2]={l,2,3,4} C)int a[2][2]={{l},2,3} D)int a[2][]={{1,2},{3,4}} 答案:D 评析:在二维数组进行初始化时,可以省略数组的一个维度,但省略的维数只能是高维部分,不能是低维。对于多维数组的初始化时,也是同样处理,因此,本题答案应选D,其它选项均能对数组进行正确的初始化。 (34)有一函数 ┏ l x>O y=┨ O x=O ┗ -1 x<O 以下程序段中不能根据x的值正确计算出y的值的是___________。 A)if(x>O)y=l;else if(x==O)y=0;else y=-l; B)y=O;if(x>O)y=1;else if(x<O)y=-1; C)y=0;if(x>=0)if(x>O)y=1;else y=-l; D)if(x>=0)if(x>O)y=l;else y=O;else y=-1; 答案:C 评析:本题应当注意if与else的配对关系。从最内层开始,else总是与它上面最近的(未曾配对的)if配对。 (35)以下程序中的函数reverse的功能是将a所指数组中的内容进行逆置。 void reverse(int a[],im n) {int i,t; for(i=O;i<n/2;i++) {t=a[i];a[i]=a[n-l-i];a[n-1-i]=t;} } main() {int b[10]={1,2,3,4,5,6,7,8,9,10};int i,s=0; reverse(b,8); for(i=6;i<10;i++)s+=b[I]; printf("%d\n",s); } 程序运行后的输出结果是 A)22 B)10 C)34 D)30 答案:A 评析:本题并不是将整个数组中的内容逆置,而是逆置前8个元素。逆置后的数组为:8,7,6,5,4,3,2,1, 9,10通过for循环计算b[6]+b[7]+b[8]+b[9]即2+1+9+10=22。 (36)执行下面的程序段后,变量k的值为___________。 int k=3,s[2]; s[0]=k;k=s[1]*10; A)不确定 B)33 C)30 D)10 答案:A 评析:由于本题中未对数组进行初始化,因此程序运行时,数组s中各个元素的值都是不确定的,虽然在代码中对s[O]进行了赋值,但没有对s[1]进行赋值,故执行l(=s[1]+10;后,k的值不确定。
(37)有以下程序 #include<string.h> main() { char’p="abcde\0fghjik\O"; printf("%d\n",strlen(p)); } 程序运行后的输出结果是__________。 A)12 B)15 C)6 D)5 答案:D 评析:"\0"是字符串结束标志,当遇到此标志时字符串已结束。所以字符串的长度为5。 (38)程序中头文件t)rpel_h的内容是: #define N 5 #define Ml N*3 程序如下: #include"type 1.h" #define M2 N*2 main() { int i; i=MI+M2; printf("%d\n",i); } 程序编译后运行的输出结果是_________。 A)lO B)20 C)25 D)30 答案:C 评析:宏定义就是用一个指定的标识符(即名字)来代表一个字符串,它的一般形式为: #define 标识符 字符串 这种方法使用户能以一个简单的名字代替一个长的字符串,因此把这个标识符(名字)称为"宏名"。 (39)若有以下的程序段,则在执行for语句后,*(*(pt+1)+2)表示的数组元素是________。 int t[3][3],*pt[3],k; for(k=0;k<3;k++)pt[k]=&t[k][O]; A)t[2][0] B]t[2][2] C]t[1][2] D]t[2][1] 答案:C 评析:在题面中定义了一个二维数组l,及一个一维指针数组pt,在循环语句中分别对指针数组赋值为二维数组t的第k行首元素的地址。*(pt+1),表示的是数组pt中下标为1的元素的值,而该值为二维数组t的第l行(从第0行算起)的首元素的地址,故*(*(pt+1)+2)表示的是数组t中t[1] [2]的元素的值。 (40)以下叙述中错误的是_________。 A)二进制文件打开后可以先读文件的末尾,而顺序文件不可以 B)在程序结束时,应当用fclose函数关闭已打开的文件 C)利用fread函数从二进制文件中读数据,可以用数组名给数组中所有元素读入数 据 D)不可以用FILE定义指向二进制文件的文件指针 答案:D 评析:每个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息,这些信息是保存在一个名为FILE 的结构体类型的结构体变量中的。而文件又分为ASCII文件和二进制文件,所以,、可以用FILE定义指向二进制文件的文件指针。 (41)有以下程序 #include<string.h> main(int argc,char *argv[]) { inti,len=0; for(i=1;i<argc;i++)len+=strlen(argv[I]); printf("%d\n",len); ) 程序编译连接后生成的可执行文件是exl.exe,若运行时输入带参数的命令行是: exl abcd efg 10↙ 则运行的结果是________。 A)22 B)17 C)12 D)9 答案:D 评析:本题主函数带有两个参数,一个int型变量argc,另一个是char型的一维一级指针数组argv。当主函数被执行时,系统自动将根据命令行的情况,分别给主函数的两个参数赋值。argc用于存放命令行中命令字和参数的总和的个数4,argv用来存放命令行中命令字和所有参数的字符串,并规定 argv[0]存放命令字字符串exl,argv[1]用来存放第一个参数的字符串abcd,argv[21用来存放第二个参数的字符串e龟,argv [3]用来存放第三个参数的字符串10。那么for循环将循环3次分别将argv数组中元素的长度累加到len中,所以答案为9。
(42)若有以下说明和定义:__________。 fun(*C){…} main() {int(*a)()=fun,(*b)(),w[10],c;} 在必要的赋值后,对fun函数调用正确的是_________。 A)a=a(w); B) (*a)(&C); C)b=*b(w); D)fun(b); 答案:B 评析:在主函数中定义了二个指向函数的指针a,b,其中指针a指向函数fun,指针b未初始化。对于选项A、c,其返回类型是错误的,对于D,其调用的参数是错误的,选项B是正确的,其相当于调用函数fhll(&C);。 (43)有以下程序 intfa(intx、 {returnx*x;} int fb(intxl {returnX*X*x;} int f(int(*f1)(),int(*f2)(),int x) {return f2(x)-fl(x);) main() { int i; i=f(fa,fb,2);printf("%d\n",i); } 程序运行后的输出结果是 A) 4 B)1 C)4 D)8 答案:C (28)已定义以下函数: fun(char*p2,char*p1) {while((*p2=*p1)!=’\0’){pl++;p2++;}} 函数的功能是__________。 A)将p1所指字符串复制到p2所指内存空间 B)将pl所指字符串的地址赋给指针p2 C)对p1和p2两个指针所指字符串进行比较 D)检查p1和p2两个指针所指字符串中是否有’\O’ 答案:A 评析:由于在while循环的条件中执行了*p2=*pl运算,其作用是将*pl中的内容复制到*p2中,而(*p2=*p1)!=’\0’的作用是判断当前字符是否为字符串结束字符’\O’。在循环体中p1++,p2++的目的是移动字 (29)有以下程序 void fun(char*c,int d) {*c=*c+1;d=d+1; printf("%c,%c,",*c,d); } main() {char a:。A’,b。’a’; fun(&b,a);printf("%c,%c\n",a,b); ) 程序运行后的输出结果是_________。 A)B,a,B,a B)a,B,a,B C)A,b,A,b D)b,B,A,b 答案:D 评析:将a,b代入函数得+&b=。&b+1=a+l=b,所以打印出第一个字母b; a=a+l=A+l=B,打印出第二个字符B; a=’A’,输出字母A; b由于是按地址传到函数而被修改,为’b’,输出字母b (30)以下程序中函数sort的功能是对a所指数组中的数据进行由大到小的排序。 void sort(int a[],im n) {intiJ,t; for(i=O;i<n-1;i++) for=i+1 0<n0++) if(a[i]<aD)) {t=-a[I];a[I=a[j];a[j]=t;} } main() {int aa[10]:{1,2,3,4,5,6,7,8,9,10},i; sort(&aa[3],5); for(i=0;i<lO;i++)primf("%d,",aa[I]); printf("\n"); ) 程序运行后的输出结果是________。 A)l,2,3,4,5,6,7,8,9,10, B)10,9,8,7,6,5,4,3,2,1, C)l,2,3,8,7,6,5,4,9,10, D)l,2,10,9,8,7,6,5,4,3, 答案:C 评析:本题并不是对数组的所有元素进行排序,而是对从a[3]开始往后的4个元素进行排序。
(31)对于基类型相同的两个指针变量,不能进行的运算是________。 A)< B)= C)+ D) 答案:C 评析:对于指针变量,除了常规的*、&、=运算外,还可以对其比较地址的大小,计算两指针变量的差值,但对于地址执行+、*、/、%等算术运算都是无意义的。 (32)有以下程序 main() {char a[]={’a’,’b’,’c’,’d’,’e’,’f’,’g’,’h’,’\O’};int I,J; i=sizeof(a); j=strlen(a); printf("%d,%d\n",I,J); } 程序运行后的输出结果是________。 A)9,9 B)8,9 C)1,8 D)9,8 答案:D 评析:sizeof()函数是计算字符数组 的长度,因为’\0’也是一个字符,要计算在内。strlen()是计算字符串长度的函数,遇到’\0’即认为是字符串结束,不把空字符计入字符串的长度。 (33)以下不能正确定义二维数组的选项是_________。 A)int a[2][2]={{1},{2}} B)int a[][2]={l,2,3,4} C)int a[2][2]={{l},2,3} D)int a[2][]={{1,2},{3,4}} 答案:D 评析:在二维数组进行初始化时,可以省略数组的一个维度,但省略的维数只能是高维部分,不能是低维。对于多维数组的初始化时,也是同样处理,因此,本题答案应选D,其它选项均能对数组进行正确的初始化。 (34)有一函数 ┏ l x>O y=┨ O x=O ┗ -1 x<O 以下程序段中不能根据x的值正确计算出y的值的是___________。 A)if(x>O)y=l;else if(x==O)y=0;else y=-l; B)y=O;if(x>O)y=1;else if(x<O)y=-1; C)y=0;if(x>=0)if(x>O)y=1;else y=-l; D)if(x>=0)if(x>O)y=l;else y=O;else y=-1; 答案:C 评析:本题应当注意if与else的配对关系。从最内层开始,else总是与它上面最近的(未曾配对的)if配对。 (35)以下程序中的函数reverse的功能是将a所指数组中的内容进行逆置。 void reverse(int a[],im n) {int i,t; for(i=O;i<n/2;i++) {t=a[i];a[i]=a[n-l-i];a[n-1-i]=t;} } main() {int b[10]={1,2,3,4,5,6,7,8,9,10};int i,s=0; reverse(b,8); for(i=6;i<10;i++)s+=b[I]; printf("%d\n",s); } 程序运行后的输出结果是 A)22 B)10 C)34 D)30 答案:A 评析:本题并不是将整个数组中的内容逆置,而是逆置前8个元素。逆置后的数组为:8,7,6,5,4,3,2,1,9,10通过for循环计算b[6]+b[7]+b[8]+b[9]即2+1+9+10=22。 (36)执行下面的程序段后,变量k的值为___________。 int k=3,s[2]; s[0]=k;k=s[1]*10; A)不确定 B)33 C)30 D)10 答案:A 评析:由于本题中未对数组进行初始化,因此程序运行时,数组s中各个元素的值都是不确定的,虽然在代码中对s[O]进行了赋值,但没有对s[1]进行赋值,故执行l(=s[1]+10;后,k的值不确定。
(37)有以下程序 #include<string.h> main() { char’p="abcde\0 fghjik\O"; printf("%d\n",strlen(p)); } 程序运行后的输出结果是__________。 A)12 B)15 C)6 D)5 答案:D 评析:"\0"是字符串结束标志,当遇到此标志时字符串已结束。所以字符串的长度为5。 (38)程序中头文件t)rpel_h的内容是: #define N 5 #define Ml N*3 程序如下: #include"type 1.h" #define M2 N*2 main() { int i; i=MI+M2; printf("%d\n",i); } 程序编译后运行的输出结果是_________。 A)lO B)20 C)25 D)30 答案:C 评析:宏定义就是用一个指定的标识符(即名字)来代表一个字符串,它的一般形式为: #define 标识符 字符串 这种方法使用户能以一个简单的名字代替一个长的字符串,因此把这个标识符(名字)称为"宏名"。 (39)若有以下的程序段,则在执行for语句后,*(*(pt+1)+2)表示的数组元素是________。 int t[3][3],*pt[3],k; for(k=0;k<3;k++)pt[k]=&t[k][O]; A)t[2][0] B]t[2][2] C]t[1][2] D]t[2][1] 答案:C 评析:在题面中定义了一个二维数组l,及一个一维指针数组pt,在循环语句中分别对指针数组赋值为二维数组t的第k行首元素的地址。*(pt+1),表示的是数组pt中下标为1的元素的值,而该值为二维数组t的第l行(从第0行算起)的首元素的地址,故*(*(pt+1)+2)表示的是数组t中t[1] [2]的元素的值。 (40)以下叙述中错误的是_________。 A)二进制文件打开后可以先读文件的末尾,而顺序文件不可以 B)在程序结束时,应当用fclose函数关闭已打开的文件 C)利用fread函数从二进制文件中读数据,可以用数组名给数组中所有元素读入数 据 D)不可以用FILE定义指向二进制文件的文件指针 答案:D 评析:每个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息,这些信息是保存在一个名为FILE的结构体类型的结构体变量中的。而文件又分为ASCII文件和二进制文件,所以,、可以用FILE定义指向二进制文件的文件指针。 (41)有以下程序 #include<string.h> main(int argc,char *argv[]) { inti,len=0; for(i=1;i<argc;i++)len+=strlen(argv[I]); printf("%d\n",len); ) 程序编译连接后生成的可执行文件是exl.exe,若运行时输入带参数的命令行是: exl abcd efg 10↙ 则运行的结果是________。 A)22 B)17 C)1 2 D)9 答案:D 评析:本题主函数带有两个参数,一个int型变量argc,另一个是char型的一维一级指针数组 argv。当主函数被执行时,系统自动将根据命令行的情况,分别给主函数的两个参数赋值。argc用于存放命令行中命令字和参数的总和的个数4,argv 用来存放命令行中命令字和所有参数的字符串,并规定argv[0]存放命令字字符串exl,argv[1]用来存放第一个参数的字符串abcd,argv [21用来存放第二个参数的字符串e龟,argv[3]用来存放第三个参数的字符串10。那么for循环将循环3次分别将argv数组中元素的长度累加到 len中,所以答案为9。
(42)若有以下说明和定义:__________。 fun(*C){…} main() {int(*a)()=fun,(*b)(),w[10],c;} 在必要的赋值后,对fun函数调用正确的是_________。 A)a=a(w); B) (*a)(&C); C)b=*b(w); D)fun(b); 答案:B 评析:在主函数中定义了二个指向函数的指针a,b,其中指针a指向函数fun,指针b未初始化。对于选项A、c,其返回类型是错误的,对于D,其调用的参数是错误的,选项B是正确的,其相当于调用函数fhll(&C);。 (43)有以下程序 intfa(intx、 {returnx*x;} int fb(intxl {returnX*X*x;} int f(int(*f1)(),int(*f2)(),int x) {return f2(x)-fl(x);) main() { int i; i=f(fa,fb,2);printf("%d\n",i); } 程序运行后的输出结果是 A) 4 B)1 C)4 D)8 答案:C |
|
![]() ![]() |