计算机等级考试二级C语言考前密卷[1]下
(26)执行下面的程序后,输出结果是_ _ _ _ _ _ _ _ _ _ _。
int d = l:
fun(int p)
{ int d .5;
d++ = p++;
printf("%d,",d);
}
main()
{ int a = 3;
乐趣(一);
d+= a++:
printf(" % d \ n ",d);
}
A)8,12 B)9,13 C)8,4 D)9,5
答案:C
评价:这道题的执行过程如下:首先调用fun函数,使实参A的值3传递给形参P,得到局部变量D。返回主函数执行“d++ = a++”,其中d是全局变量,所以d=1+3=4(因为subject是值传递,函数fun中p值的变化不能引起A的变化),所以这个subject的输出是8,4。
(27)知道下列程序段,正确的判断是_ _ _ _ _ _ _ _ _ _ _。
#定义A 3
#定义B(A)((_ A+1)' A)
int A = 3:
……
X = 3 *(A+B(7));
A)程序错误,并且不允许嵌套定义。B)X=93
C)X=8l D)程序错误,宏定义不允许有参数。
答案:C
点评:本题宏定义合法,宏定义扩展为3 * (3+(
(28)定义int*swap()指的是_ _ _ _ _ _ _ _。
A)返回整数值的函数swap
b)返回指向整数值的指针的函数swap
c)返回整数值的函数swap()的指针
D)以上说法都是错误的
答案在这个问题的定义中,包含了括号和&符号,因为f)的优先级比t高,所以它是返回整数指针的函数。
(29)下列程序段的输出结果是_ _ _ _ _ _ _ _ _。
main()
{ char s1[10],s2[10],S3[10];
scanf("%s ",S1);获取(S2);获取(S3);
看跌期权(s 1);卖出(S2);看跌期权(S3);
}
输入数据如下:(此处回车)
AAA
BBB
A)AAA B)AAA C)AAA \ 0 BBB \ 0d)AAABBB
BBB
BBB[/br gets的作用是从终端读取一行字符,也就是一直读到换行符,系统会自动将换行符替换为“\ 0”。
(30)下列功能是_ _ _ _ _ _。
Int fun(char * x)
{ char * y = x;
while(* y++);
return y-x-l;
}
A)求字符串的长度;b)找到字符串的位置;
C)比较两个字符串的大小;d)将字符串X连接到字符串Y的后面
答案:A
注释:在函数体中定义一个单字符指针指向参数,然后遍历字符直到为空。(31)下列程序的输出结果是_ _ _ _ _ _ _ _ _。
main()
{ char str[12]= { ' s ',' t ',' r ',' I ',' n ',' g ' };
printf("%d\n ",strlen(str));
}
A)6b)7c)ll d)12
答案:A
备注:在C语言中,一个字符串的长度是从它的第一个字符到NULL(不包括)字符的总字符数。本题同时定义了字符数组str,为第7个元素,由系统自动添加" \ 0 ",所以字符串的长度为6。
(32)请阅读程序段:
charstr [] = "ABCD ",* p = str
printf(" % d \ n " ,*(p+4));
程序段的输出结果是_ _ _ _ _ _ _ _ _。
A)68 B)0
C)字符' D '的地址D)不确定值
答案:B
备注:在给字符数组赋值字符串值时,系统会自动在字符串末尾加上一个字符串结束标志“\ 0”,因此它指向字符数组。因为“\ 0”的编码值是0,所以这个问题的输出是0。
(33)如果定义:int a[10];,下列选项中对数组元素a[i][j]的错误引用是_ _ _ _ _ _ _ _。
(0 = 0;i -,i - )
printf("%c ",* p[I]);
printf(" \ n ");
}
A)sob)sp c)spopkd)shob
答案:A
注释:p[0]存储“bool \ 0”的第一个地址;P[1]存储“OPK \ 0”的首地址等。
printf语句中的+p[I]输出表示p[I]字符串的第一个字符。在for循环中,I的初始值是3,那么输出的第一个字符是“s”,再I-两次,那么输出的值是+p[1],也就是字符“0”,所以这个题目的输出是这样的。(39)下列程序的输出结果是_ _ _ _ _ _ _ _ _。
# include
void PRT(int * x,int*y,int*z)
{ printf("%d,%d,%d\n",++*x,++* y *(z++));}
int a=10,b=40,c = 20
main()
{ prt(&a,& b & c);
prt(&a,&b,& c);
}
a) ll,42,3lb) ll,41,20c) 1l,21,40d) 11,41,2l
12,22,41 12,42,20 11,2l,42
(40)如果外部变量的定义形式是static int x;;,那么,统计在其中的作用应该是_ _ _ _ _ _ _。
A)在静态存储区存储变量
B)让变量X被系统自动初始化
c)让X只在这个文档中被引用
D)让X的值永久保留
答案:C
点评:其实不管作为装饰,static只是限制了这类外部变量的引用范围:只能在定义它的文件范围内使用。
(41)下列程序的输出结果是_ _ _ _ _ _。
# include
# define SQR(x)x * x
main()
{ int a,k = 3;
a = ++ SQR(k+1);
printf("%d\n ",a);
}
A)8B)9C)17D)20
答案:B
点评分析:在本题的宏替换中,形式参数X替换为实际参数k+l,其他字符保持不变。Sq (k+1)展开后应该是字符串k+l*k+l。
(42)以下是对宏定义的描述。不正确的是_ _ _ _ _ _ _ _ _。
A)宏没有类型问题,宏名没有类型,其参数也没有类型
B)宏替换不占用运行时间
C)宏替换时,先计算实际参数表达式的值,再用形式参数运算求值
D)宏替换只是字符替换
答案与函数相比,带参数的宏在编译前就已经把代码替换进程序中了, 所以在执行的时候不会出现类似函数调用的问题,所以可以说不占用运行时间。
(43)下面的程序(程序左边的数字是附加行号)_ _ _ _ _ _ _ _。
1 # include
2 # include
3 main()
4 { char s[]= " string ";
5次看跌期权;
6 strcpy(s," hello ");
7 printf("%3s\n ",s);}
A)没有错误B)第一行有错误C)第六行有错误D)第七行有错误
答案:B
备注:头文件string.h中包含字符串复制函数strcpy,所以程序中第一行文件包含命令是错误的。
(44)下列说法中,_ _ _ _ _ _ _ _ _ _ _ _的说法是正确的。
struct ST
{ int a;
int b[2l;
} a;
A)结构变量A与结构成员A同名,定义不合法
B)程序执行到这个定义时只为结构st分配存储单元
c)程序运行时为结构st分配6个字节的存储单元
D)类型名struct st可以通过extern关键字提前引用(即先引用,后解释)
回答:D
注释:同名引用成员A的方法是A.A .变量A处于不同的“层次”,系统完全可以区分。St是一个结构名,它不会为结构名分配存储空,而应该是运行时为结构变量A分配6个字节的存储单元,所以选项B和C是错误的。
(45)如果下列结构定义存在,_ _ _ _ _ _ _ _是正确的引用或定义。
结构示例
{ int x;
int y;
} v1;
A)example . x = 10 B)example v2 . x = 10
C)struct v2;v2.x=lO D)结构示例v2 = { 10 };
回答:D
评析:在定义结构体变量时,不能只用结构体名example或关键字strum进行定义,必需要用结构体类型名struct example定义,在引用结构体成员变量时,需要用结构体变量名进行引用,所以选D。
(46)下列程序的执行结果是_________。
#include
union un
{ int i;
char c[21;
};
void main()
{ union un x;
x.c[0]=10:
x.c[1]=1:
printf("\n%d",x.i);
}
A)266 B)ll C)265 D)138
答案:A
评析:由于本题定义的是共用体,所以成员表列中的整型变量x与字符数组c共占用同一个存储单元,且此存储单元为2个字节,通常c[O]位于低字节,c[1]位于高字节,所以x.i的值为266。(47)已知形成链表的存储结构如下图所示,则下述类型描述中的空白处应填_______。
struct link
Data next
{ char data;
___________
}node;
A)struct link next B)link*next
C)struct next link D)struct link*next
答案:D
评析:在单向链表中,由于每个结点需要存储下一个结点的地址,且下一个结点的数据类型与前一个结点的数据类型完全相同,故应为struct link*next。
(48)已知小写字母a的ASCII码为97,大写字母A的ASCII.码为65,以下程序的结果是__________。
main()
{ unsigned int a=32,b=66;
printf("%c\n",atb);
}
A)66 B)98 C)b D)B
答案:C
评析:位运算符"l"的作用是按位或,即两个二进制数的相应位中只要有一个为1,该位的结果值为l。最后以字符型输出, 98对应的字符"b"。
(49)C语言库函数龟ets(str,n,fp)的功能是_________。
A)从fp指向的文件中读取长度n的字符串存入str指向的内存
B)从fp指向的文件中读取长度不超过n-l的字符串存入str指向的内存
C)从fp指向的文件中读取n个字符串存/Xstr指向的内存
D)从str读取至多n个字符到文件fp
答案:B
评析:fgets函数的作用是从指定的文件读入一个字符串。fgets(str,n,fp);中的n为要求得到的字符的个数,但只从fb指向的文件输入n-1个字符,然后在最后加一个’\O’字符,因此得到的字符串共有n个字符。
(50)下述程序向文件输出的结果是__________。
#include
void main()
{ FILE*fp=fopen("TEST","wb");
fprintf(fp,"%d%5.0f%c%d",58,76273.0,’-’,2278);
fclose(fp);
}
A)58 76273-2278 B)5876273。.00000 0-2278
c)5876273-2278 D)因文件为二进制文件而不可读
答案:C
评析:fprintf函数工作时,多个数据间不会自动加分隔符,选项A错误;浮点数的输出格式是"%5.0f"表明其小数部分输出O位,即没有输出,所以选项B也是错误的。
二、填空题(每空2分,共40分)
请将每空的正确答案写在【l】至【20】序号的横线上,答在试卷上不得分。
(1)对于长度为n的顺序存储的线性表,当随机插入和删除一个元素时,需平均移动元素 的个数为 【l】 。
答案:【1】n/2
评析:删除一个元素,平均移动的元素个数为(n-l+n-2+……+0)n=(n-1)/2;插入一个元素,平均移动元素个数为(n+n-l+n-2+……+1)n=(n+1)/2;所以总体平均移动元素个数为n/2。
(2)注释说明了程序的功能,它分为 【2】 注释和功能性注释。
答案:【2】序言性
评析:注释一般分为序言性注释和功能性注释。
(3)软件测试中路径覆盖测试是整个测试的基础,它是对软件 【3】 进行测试。
答案:【3】结构
评析:路径测试是白盒测试方法中的一种,它要求对程序中的每条路径最少检查一次,目的是对软件的结构进行测试。
(4)数据库技术的主要特点为数据的集成性、数据的高 【4】 和低冗余性、数据独立性和数据统一管理与控制。
答案:【4】共享性
评析:数据库技术的主要特点有以下几个方面:数据的集成性,数据的高共享性与低冗余性,数据韵独立性,数据统一管理与控制。
(5)数据元素之间 【5】 的整体称为逻辑结构。
答案:【5】逻辑关系
评析:数据元素之间逻辑关系的整体称为逻辑结构。数据的逻辑结构就是数据的组织形式。
(6)若有定义int m=5,y=2,则执行表达式y+=y-=m*=y后,y的值为 【6】 。
答案:【6】.16
评析:将赋值运算符右侧的"表达式"的值赋给左侧的变量,并且赋值运算符按照"白右而左"的结合顺序,本题表达式应先算m的值为10,再运算y的值为8,最后计算y=y+(-8)=-8+(-8)=-16。
(7)若x和y都是double型变量,]ix的初值为3.0,y的初值为2.0,则表达式pow(y,fabs(x))的值为 【7】 。
答案:【7】8.000000
评析: fabs函数功能是求x的绝对值,计算结果为double型。pow功能是计算x的y次方的值,计算结果同样为double型。所以本题表达式相当于2.0的3.0次方,结果为8.000000。
(8)设有char a,b;,若要通过a&b运算屏蔽掉a中的其它位,只保留第2位和第8位(右起为第1位),则b的二进制是 【8】 。
答案:【8】10000010
评析:运算"&"的规则是只有当两个相应的二进制位都为1时,该位的结果才为1。要保留第2、8位,只要将其与二进制数10000010相与。
(9)下列程序执行后输出的结果是 【9】 。
f(int a)
{ static c=0;
C=a+C++:
return(c);
}
mai
n()
{ int a=2,i,k;
for(i=O;ik=f(a++);
printf("%d\n",k);
}
答案:【9】7
评析:在程序执行时,static变量仅初始化一次,下次使用时将使用上次保存的值。
(10)下面程序执行后输出的结果是 【10】 。
int m=13:
int fun(int x,int y)
{ int m=3;
return(x*y-m);
}
main()
{ int a=7,b=5;
printf("%d\n",fun(a,b)/m);
}
答案:【10】2
评析:本题变量m既是外部变量(值是13),又是fun函数的局部变量(值为3)。函数fun(x*y-m)的值为7*5-3=32,在main函数中,ftm(a,b)/m中的m应取外部变量的值13,因此输出2。(11)下列程序执行后输出的结果是 【11】 。
main()
{ nt arr[10],i,k=0;
for(I=0;ifor(I=1;iprintf("%d\n",k);
}
答案:【11】12
评析:本题的第一个fur循环用于给数组arr赋初值,第二个for循环用于求和运算。由于第二个fur循环初始值为1,而循环条件为i(12)下列程序执行后输出的结果是 【12】 。
struct s
{int x,y;}data[2]={10,100,20,200};
main()
{
struct s*p=data;
printf("%d\n",++(p->x));
}
答案:【12】11
评析:程序中结构体数组data首地址(即&data[0])赋值给结构体指针变量p,++(p->x)表示先将p所指向的结构体变量的成员x值加1,然后将此x(即data[01.x]输出。
(13)下面程序有两个printf语句,如果第一个printf语句输出的是194,则第二个print语句的输出结果是 【13】 。
main()
{ int a [10]={1,2,3,4,5,6,7,8,9,0},*p;
p=a;
printf("%X\n",p);
printf("%x\n",p+9);
}
答案:【13】la6
评析:对于指针变量的运算,就是对地址的运算。本题中由于指针指向的是整型变量,所以,使指针变量移动9个位置也就是移动18个字节。注意,本题是以16进制输出的。
(14)以下函数的功能是计算s=l+l/2!+l/3!+…+l/n!,请填空.
double fun(int n)
{ double s=O.O,fac=1.O;
int i,k=1;
for(i=l;i{ 【14】 ;
fat=fat/k;
s=s+fac;
}
}
答案:【14】k=k*i
评析:本题中通过for循环
求s表达式中每一项的和,表达式"fac=fac/k;"求的是每一项的值,所以k的值应为n!,在求n!的时候,可以用上次循环阶乘的值乘i,就可以直接得此次n!,故本题填k=k*i。
(15)下面程序的运行结果是 【15】 。
main()
{ unsigned a=0112,x;
x=a>>3:
printf("x=%o",x);
}
答案:【15】x=11
评析:在对无符号数的右移是高位补0。
(16)函数delete(s,i,n)是作用是从字符串s中删除从第i个字符开始的n个字符,请填空。
void delete(char s[],int i,int n)
{ int j,k,length=O;
while(s[1ength])
【16】 ;
--i:
j=i;
}
if( 【17】 )
{ k=i+n;
if(i+nwhile(ks[j++]=s[k++];
s[j]=’\0’;
}
答案:【16】length++
【17】i评析:第一个循环极有可能是计算串的长度,在is2,则返回个正数;如果sls2,所以函数的值为正数。
(36)下面程序的输出是_________。
char s[]="ABcD";
main()
{ char*p;
for(p=s;pprintf("%s\n",p);
}
A)ABCD B)A C)D D)ABCD
BCD B C ABC
CD C B AB
D D A A
答案:A
评析:在第一次执行for循环时,字符数组的首地址赋给了指针变量p,使得指针变量p指向了s的首地址,输出p所指向的字符串;第二次执行for循环时,p 值增加1,p指向了s的第二个元素输出BCD;第三次输出CD;第四次输出D;直到p指向字符串的结束字符"\0",for循环终止执行。(15)下面程序的 运行结果是 【15】 。
main()
{ unsigned a=0112,x;
x=a>>3:
printf("x=%o",x);
}
答案:【15】x=11
评析:在对无符号数的右移是高位补0。
(16)函数delete(s,i,n)是作用是从字符串s中删除从第i个字符开始的n个字符,请填空。
void delete(char s[],int i,int n)
{ int j,k,length=O;
while(s[1ength])
【16】 ;
--i:
j=i;
}
if( 【17】 )
{ k=i+n;
if(i+nwhile(ks[j++]=s[k++];
s[j]=’\0’;
}
答案:【16】length++
【17】i评析:第一个循环极有可能是计算串的长度,在i
0条评论