admin 管理员组

文章数量: 887021


2023年12月19日发(作者:前端和后端哪个辛苦)

2022年计算机二级C语言真题

及参考答案

一、选择题 (请在【答题】菜单上选择【选择题】命令,启动选择题测试程序,按照题目上的内容进行答题。作答选择题时键盘被封锁,使用键盘无效,考生须使用鼠标答题。选择题部分只能进入一次,退出后不能再次进入。选择题部分不单独计时。)

1、以下叙述中正确的是( )。

A. C语言规定必须用main作为主函数名,程序将从此开始执行

B. 可以在程序中由用户指定任意一个函数作为主函数,程序将从此开始执行

C. C语言程序将从源程序中第一个函数开始执行

D. main的各种大小写拼写形式都可以作为主函数名,如:MAIN,Main等

『正确答案』A

『答案解析』

用户不能指定某函数为主函数,C语言规定,程序从main函数开始执行,从main函数退出,C语言函数名区别大小写。答案选择A选项。

2、下面描述不属于软件特点的是( )。

A. 软件是一种逻辑实体,具有抽象性

B. 软件在使用中不存在磨损、老化问题

C. 软件复杂性高

D. 软件使用不涉及知识产权

『正确答案』D

『答案解析』

软件具有以下特点:①软件是一种逻辑实体,具有抽象性;②软件没有明显的制作过程;③软件在使用期间不存在磨损、老化问题;④软件对硬件和环境具有依赖性;⑤软件复杂性高,成本昂贵;⑥软件开发涉及诸多的社会因素,如知识产权等。答案选择D选项。

3、标准库函数fgets(s,n,f)的功能是( )。

A. 从文件f中读取长度不超过n-1的字符串存入指针s所指的内存

B. 从文件f中读取长度为n的字符串存入指针s所指的内存

第1页,共23页

C. 从文件f中读取n个字符串存入指针s所指的内存

D. 从文件f中读取n-1个字符串存入指针s所指的内存

『正确答案』A

『答案解析』

fgets函数功能是从f所指文件中读入n-1个字符放入s为起始地址的空间内,并在尾端自动加一个结束标志“0”。同时将读/写位置指针向前移动字符串长度个字节。在读出n-1个字符之前,如遇到了换行符或EOF,则读出结束,A项正确。B项中“读取长度为n”错误。C项与D项中“读取n/n-1个字符串”错误,读取的是n-1个字符。答案选择A选项。

4、关系数据库管理系统所管理的关系是( )。

A. 若干个二维表

B. 一个DBF文件

C. 一个DBC文件

D. 若干个DBC文件

『正确答案』A

『答案解析』

在关系数库中,一个表就是一个关系,关系数据库管理系统管理的关系就是多个二维表。答案选择A选项。

5、若要使用C数学库中的sin函数,需要在源程序的头部加上#include

关于引用数学库,以下叙述正确的是( )。

A. 将数学库中sin函数的源程序插入到引用处,以便进行编译链接

B. 将数学库中sin函数链接到编译生成的可执行文件中,以便能正确运行

C. 通过引用math.h文件,说明sin函数的参数个数和类型,以及函数返回值类型

D. 实际上,不引用math.h文件也能正确调用sin函数

『正确答案』C

『答案解析』

考查文件包含处理。文件包含命令的功能是把指定的文件添加到预处理部分,从而把指定的文件和当前的源程序文件连接起来,该文件则包含了程序要调用的函数的声明。由此,选项A、B、D表述错误。答案选择C选项。

6、以下叙述中正确的是( )。

第2页,共23页

A. 函数调用时,不必区分函数名称的大小写

B. 调用函数时,函数名必须与被调用的函数名完全一致

C. 函数名允许用数字开头

D. 在函数体中只能出现一次return语句

『正确答案』B

『答案解析』

调用函数的时候只有保证调用语句的函数名和被调函数的函数名、参数列表一致才能保证调用的正确性,B正确。C语言对大小写敏感,选项A错。用户自定义的函数名需要遵循用户标识符的命名规则,由字母、数字、下划线组成并且第一个字符不能为数字,选项C错。一个函数每次只能使用一个return语句,但是该函数体中可以有多个返回点,也就是有多条return语

句,每次只从其中一点返回,选项D错。答案选择B选项。

7、关于C语言标识符,以下叙述错误的是( )。

A. 标识符可全部由数字组成

B. 标识符可全部由下划线组成

C. 标识符可全部由小写字母组成

D. 标识符可全部由大写字母组成

『正确答案』A

『答案解析』

C语言标识符只能由字母、数字、下划线构成,且只能以字母、下划线开头,故答案选择A选项。

8、下面结构体的定义语句中,错误的是( )。

A. struct ord {int x; int y; int z; } struct ord a;

B. struct ord {int x; int y; int z; }; struct ord a;

C. struct ord {int x; int y; int z; } a;

D. struct {int x; int y; int z; } a;

『正确答案』A

『答案解析』

C语言中结构体变量的定义有三种方法:①定义结构体类型的同时定义结构体变量,如C项;②使用无名结构体类型定义结构体变量,如D项;③先定义结构体类型,后定义结构体变量,如B项,A项错在分别定义结构体类型第3页,共23页

与结构体变量时需要用“;”隔开。故答案选择A选项。

9、以下程序中给数组所有元素输入数据,请从选项中选择正确的答案填入下划线处。( )

#include

main()

{int a[10],i=0;

while(i<10) scanf("%d", _________);

…}

A. &a[i+1]

B. a+(i++)

C. a+i

D. &a(i++)

『正确答案』

B

『答案解析』

A项错误,进入死循环,i一直为0,一直对a[i+1]读入数据;B项正确,a为数组首地址,i++先取i值再加1,scanf读入的数据依次存放在数组a中;C项错误,控制变量i没有依次加1,无法结束循环,也无法对整个数组赋值;D项错误,数组元素引用为[],不是()。答案选择B选项。

10、有以下程序:

#include

main( )

{

int i, array[6] = {1, 5, 0, 4};

for (i=0; i<5; i++)

printf("%d,", array[i] & 4);

printf("n");

}

程序运行后的输出结果是( )。

A. 0,4,0,4,0,

B. 1,5,0,4,0,

第4页,共23页

C. 1,5,5,4,0,

D. 1,2,1,2,0

『正确答案』A

『答案解析』

本函数的功能是将数组中所有元素与4进行与运算,首先将元素转换为二进制,然后和二进制数100(十进制4)进行与运算,第一个元素为001&100即为000,也就是0,同理可得答案分别为0、4、0、4、0,注意第五位按照0进行运算。答案选择A选项。

11、有以下程序

#include

main()

{

int a[10]={11,12,13,14,15,16,17,18,19,20},*p=a,i=9;

printf("%d,%d,%dn",a[p-a],p[i],*(&a[i]));

}

程序运行后的输出结果是( )。

A. 11,20,20

B. 12,20,20

C. 11,19,19

D. 12,19,20

『正确答案』A

『答案解析』

a表示数组a的第一个元素的地址,*p=a则将p指向了数组a的第一个元素的地址,p-a=0,所以a[p-a]即为a[0],p[i]相当于a[i]即a[9],输出第一个结果为11、第二个结果为20。取地址运算符&和取值运算符*互为逆运算,所以*(&a[i]))的值仍为a[i]即a[9],输出第三个结果为20,答案选择A选项。

12、设数据元素的集合D={1,2,3,4,5},则满足下列关系R的数据结构中为线性结构的是( )。

A. R={(1,2),(3,2),(5,1),(4,5)}

B. R={(1,3),(4,1),(3,2),(5,4)}

第5页,共23页

C. R={(1,2),(2,4),(4,5),(2,3)}

D. R={(1,3),(2,4),(3,5),(1,2)}

『正确答案』

B

『答案解析』

一个非空的数据结构如果满足以下两个条件:有且只有一个根结点;每一个结点最多有一个前件,也最多有一个后件,称为线性结构。不同时满足以上两个条件的数据结构就称为非线性结构。A选项,5是1的前件,1是2的前件,3是4的前件,则关系R中含有两个结构,即34和512,其中3和5均为根结点,故A项错误。B选项根结点为5,排列顺序为54132,B选项正确。C选项有两个根结点1和4,故错误。D选项有两个根结点1和2,故错误。答案选择B选项。

13、以下叙述中正确的是( )。

A. 如果企图通过一个空指针来访问一个存储单元,将会得到一个出错信息

B. 即使不进行强制类型转换,在进行指针赋值运算时,指针变量的基类型也可以不同

C. 设变量p是一个指针变量,则语句p=0;是非法的,应该使用p=NULL;

D. 指针变量之间不能用关系运算符进行比较

『正确答案』A

『答案解析』

空指针意味着该指针没有指向任何具体的变量,所以不能访问一个存储单元,A正确。指针的赋值运算只能在同一数据类型之间进行,故选项B错。语句p=0和p=NULL是一样的,都是把一个空指针赋给指针变量p,故选项C错。指针之间能进行关系运算,比较的是地址值的大小,选项D错。答案选择A选项。

14、下面结构体的定义语句中,错误的是( )。

A. struct ord {int x;int y;int z;} struct ord a;

B. struct ord {int x;int y;int z;}; struct ord a;

C. struct ord {int x;int y;int z;} a;

D. struct {int x;int y;int z;} a;

『正确答案』A

第6页,共23页

『答案解析』

C语言中结构体变量的定义有三种方法:①定义结构体类型的同时定义结构体变量,如C项;②使用无名结构体类型定义结构体变量,如D项;③先定义结构体类型,后定义结构体变量,如B项,A项错在分别定义结构体类型与结构体变量时需要用“;”隔开。故答案选择A选项。

15、一名工作人员可以使用多台计算机,而一台计算机可被多名工作人员使用,则实体工作人员与实体计算机之间的联系是( )。

A. 一对一

B. 一对多

C. 多对多

D. 多对一

『正确答案』C

『答案解析』

一名工作人员可以操作多台计算机,而一台计算机又可以被多名工作人员使用,所以两个实体之间是多对多的关系,答案选

择C选项。

16、有以下程序

#include

void fun(int *s)

{

static int j=0;

do s[j] += s[j+1]; while(++j<2);

}

main()

{

int i,a[10]={1,2,3,4,5};

for(i=1; i<3; i++) fun(a);

for(i=1; i<5; i++) printf("%d",a[i]);

printf("n");

}

程序运行后的输出结果是( )。

第7页,共23页

A. 5745

B. 34756

C. 5795

D. 35745

『正确答案』A

『答案解析』

从main函数开始,第一个for循环:k=1,满足条件k<3,调用fun(a)。fun()函数中,s为指向数组a的指针,则有s[0]=s[0]+s[1]=3,满足条件++j(此时j=1)小于2,继续执行do-while循环;s[1]=s[1]+s[2]=5,不满足条件++j(此时j=2)小于2,退出do-while循环。此时:k=2,满足条件k<3,再次调用fun(a)。由于j定义为静态变量,所以上次函数调用结束时j=2仍被保留,则有s[2]=s[2]+s[3]=7,不满足条件++j(此时j=3)小于2,退出do-while循环。此时,k=3,不再满足循环条件,退出第一个for循环,执行第二个for循环,输出a[1]~a[4]共4个数,即5745。答案选择A选项。

17、以下语句中存在语法错误的是( )。

A. char ss[6][20];ss[1]="right?";

B. char ss[][20]={"right?"};

C. char*ss[6];ss[1]="right?";

D. char *ss[]={"right?"};

『正确答案』A

『答案解析』

A项错误,数组定义后,不能对数组整体赋值,ss是二维数组,ss[1]是一维字符数组,即字符串,字符串赋值可以使用strcpy(ss[1],"right");的形式,但不能使用赋值的形式。BD两项正确,在定义时对数组同时进行初始化;C项正确,将常量字符串在内存中的首地址赋给指针数组的一个元素。答案选择A选项。

18、下面结构体的定义语句中,错误的是( )。

A. struct ord {int x;int y;int z;} struct ord a;

B. struct ord {int x;int y;int z;}; struct ord a;

C. struct ord {int x;int y;int z;} a;

第8页,共23页

D. struct {int x;int y;int z;} a;

『正确答案』A

『答案解析』

C语言中结构体变量的定义有三种方法:①定义结构体类型的同时定义结构体变量,如C项;②使用无名结构体类型定义结构体变量,如D项;③先定义结构体类型,后定义结构体变量,如B项,A项错在分别定义结构体类型与结构体变量时需要用“;”隔开。故答案选择A选项。

19、以下叙述中正确的是( )。

A. 函数调用时,不必区分函数名称的大小写

B. 调用函数时,函数名必须与被调用的函数名完全一致

C. 函数名允许用数字开头

D. 在函数体中只能出现一次return语句

『正确答案』B

『答案解析』

调用函数的时候只有保证调用语句的函数名和被调函数的函数名、参数列表一致才能保证调用的正确性,B正确。C语言对大小写敏感,选项A错。用户自定义的函数名需要遵循用户标识符的命名规则,由字母、数字、下划线组成并且第一个字符不能为数字,选项C错。一个函数每次只能使用一个return语句,但是该函数体中可以有多个返回点,也就是有多条return语句,每次只从其中一点返回,选项D错。答案选择B选项。

20、程序测试的目的是( )。

A. 为被测程序设计正确的测试用例

B. 发现并改正程序中的错误

C. 发现程序中的错误

D. 改正程序中的错误

『正确答案』C

『答案解析』

程序测试是使用人工或自动手段来运行或测定某个系统的过程,其目的在于检验它是否满足规定的需求或是弄清预期结果与

实际结果之间的差别,即为发现错误而执行程序的过程,而不是改正错误,调试是在测试的基础上去改正错误。答案选择C选项。

第9页,共23页

21、有以下程序

#include

#include

void fun( double *p1,double *p2,double *s)

{

s = (double *)calloc( 1,sizeof(double) );

*s = *p1 + *( p2+1 );

}

main()

{

double a[2] = { 1.1, 2.2 }, b[2] = { 10.0, 20.0 }, *s=a;

fun( a, b, s );

printf( "%5.2fn", *s);

}

程序的输出结果是( )。

A. 11.10

B. 1.10

C. 12.10

D. 21.10

『正确答案』B

『答案解析』

函数fun()的功能是用calloc()函数重新分配了1个长度为sizeof(double)的连续空间,并把返回的内存地址赋值给s,之后往新分配的内存中写入数据。由于函数传递过程中形参指针指向的变化不能影响到实参指针的指向,所以函数fun()并不能改变s的指向,*s与a[0]等价,格式输出的结果为

1.10,注意整数1前有一个空格,因为格式输出%5.2f要求输出的浮点数宽度为5,案选择B选项。

22、下面不属于需求分析阶段任务的是( )。

A. 确定软件系统的功能需求

B. 确定软件系统的性能需求

C. 需求规格说明书评审

第10页,共23页

D. 制定软件集成测试计划

『正确答案』D

『答案解析』

需求分析阶段的工作主要包括4个方面:①需求获取,其目的是确定对目标系统的各方面需求;②需求分析,对获取的需求进行分析和综合,最终给出系统的解决方案和目标系统的逻辑模型;③编写文档,编写需求规格说明书,编写初步用户使用手册;④确认测试计划,修改完善软件开发计划,需求评审。制定软件集成测试计划属于概要设计阶段的任务。答案选择D选项。

23、在C语言中,只有在使用时才占用内存单元的变量,其存储类型是( )。

A. auto和register

B. extern和register

C. auto和static

D. static和register

『正确答案』A

『答案解析』

C语言中,动态存储区域中存放的变量在使用时才分配内存空间。auto变量的存储单元是分配在内存的动态存储区中,每当进入函数体时自动分配存储单元。register变量也是自动类变量。static说明的变量为静态变量,静态变量在内存的静态存储中占据着永久的存储单元,直至程序运行结束。extern说明的变量为外部变量,属于全局变量,全局变量在整个程序运行期间都占用内存空间。答案选择A选项。

24、以下叙述中错误的是( )。

A. C程序经过编译、链接步骤之后才能形成一个真正可执行的二进制机器指令文件

B. C语言中的每条可执行语句和非执行语句最终都将被转换成二进制的机器指令

C. 用C语言编写的程序称为源程序,它以ASCII代码形式存放在一个文本文件中

D. C语言源程序经编译后生成后缀为.obj的目标程序

『正确答案』B

『答案解析』

第11页,共23页

B项错误,注释语句不会被翻译成二进制的机器指令。C源程序经过C编译程序编译之后生成后缀为.obj的二进制文件(称为目标文件),然后由“链接程序”(Link)的软件把.obj文件与各种库函数连接起来生成一个后缀为.exe的可执行文件。答案选择B选项。

25、要求通过while循环不断读入字符,当读入字母N时结束循环。若变量已正确定义,以下正确的程序段是( )。

A. while((ch=getchar())!='N') printf("%c ",ch);

B. while(ch=getchar()='N') printf("%c ",ch);

C. while(ch=getchar()=='N') printf("%c ",ch);

D. while((ch=getchar())=='N') printf("%c ",ch);

『正确答案』A

『答案解析』

A项正确,“(ch=getchar())!='N'”表示先把getchar()函数的返回值赋值给ch,然后判断,当读入字母不为N时,ch与'N'不相等,执行打印函数printf,当读入字母N时,ch与'N'相等,循环结束,同理知选项D错误。B项错误,“ch=getchar()='N'”表达式从右向左计算,会把´N´赋值给getchar()函数的返回值,而getchar()函数的返回值是右值,不可改变,出现编译错误;C项错误,“ch=getchar()=='N'”中“==(等于)”的优先级高于“=(赋值)”,它等价于“ch=(getchar()=='N')”,此时ch的取值是0或1。答案选择A选项。

26、设有某函数的说明为int* func(int a[10], int n);则下列叙述中,正确的是( )

A. 形参a对应的实参只能是数组名

B. 说明中的a[10]写成a[]或*a效果完全一样

C. func的函数体中不能对a进行移动指针(如a++)的操作

D. 只有指向10个整数内存单元的指针,才能作为实参传给a

『正确答案』B

『答案解析』

考查数组名作为函数参数。数组名作为函数参数时,只传递数组的首地址而不检查形参数组的长度,所以形参表中可以不给出形参数组的长度,形参数组和实参数组长度也可以不同,选项D错; a[10]、a[]、*a做形参都是接第12页,共23页

受实参数组首地址,效果一样,B正确。传递给形参的实参可以是数组名,还可以是指向该数组的指针变量,选项A错。数组名可以看做一个指针常量,对其进行自加自减运算相当于指针变量的自加自减,选项C错。答案选择B

27、有以下程序

#include

void main()

{

unsigned char a=8, c;

c = a>>3;

printf("%dn",c);

}

程序运行后的输出结果是( )。

A. 32

B. 16

C. 1

D. 0

『正确答案』

C

『答案解析』

字符常量与其ASCII码值一一对应,在计算的时候,可以使用该字符的ASCII码参与运算,输出时会根据格式控制符输出对应的字符或者ASCII码。右移运算符“>>”的运算规则是把左边运算数的各二进制位全部右移n位,n取决于“>>”右边的数值。字符a的ASCII码值为8,对应二进制为1000,所以a>>3=1,输出的字符c的ASCII码值为1,答案选择C选项。

28、字符数组a和b中存储了两个字符串,判断字符串a和b是否相等,应当使用的是( )。

A. if(strcmp(a,b)==0)

B. if(strcpy(a,b))

C. if(a==b)

D. if(a=b)

『正确答案』A

第13页,共23页

『答案解析』

C语言中,判断字符串是否相等,使用字符串比较函数strcmp(),不能使用相等操作符“==”。strcmp(s1,s2)函数比较s1和s2所指字符串的大小时,若串s1>串s2,函数值大于0(正数);若串s1=串s2,函数值等于0;若串s1<串s2,函数值小于0(负数)。答案选择A选项。

29、下面对类-对象主要特征描述正确的是( )。

A. 对象唯一性

B. 对象无关性

C. 类的单一性

D. 类的依赖性

『正确答案』A

『答案解析』

类是对象的抽象具有抽象性、概括性等,对象是类的具体实例,具有标识惟一性、分类性、多态性、封装性、模块独立性。故答案选择A选项。

30、结构化程序的三种基本控制结构是( )。

A. 顺序、选择和重复(循环)

B. 过程、子程序和分程序

C. 顺序、选择和调用

D. 调用、返回和转移

『正确答案』A

『答案解析』

结构化程序设计中三种基本控制结构为顺序、选择和重复(循环)。答案选择A选项。

31、有以下程序:

#include

int *f(int *s,int *t)

{

if(*s < *t)s=t;

return s;

}

main()

第14页,共23页

{

int i=3,j=5,*p=&i,*q=&j,*r;

r=f(p,q);

printf("%d,%d,%d,%d,%dn",i,j,*p,*q,*r);

}

程序的运行结果是( )。

A. 3,5,3,5,5

B. 3,5,5,5,5

C. 5,3,3,3,5

D. 5,5,5,5,5

『正确答案』A

『答案解析』

考查指针与函数。被调函数为指针型函数,返回的是s这一指针型数据。虽然该函数进行的是地址传参,但只是改变了指针的指向,对原指向的数据并没有改变。并且若以指针作为操作单元,不涉及其指向的数据时,该函数仍然可以看做是值传递,即形参指针指向的变化不会影响到实参指针的指向。if语句将s指向*s、*t较大的数据的地址。所以函数调用结束之后,i、j值不变,p的指向不变,r的指向和p的指向一致,输出结果为:3,5,3,5,5,答案选择A选项。

32、有以下程序

#include

main()

{

int a=1,b=1;

while(a--)

b--;

printf("%d,%dn", a,b);

}

程序的运行结果是( )。

A. -1,-1

B. 0,0

第15页,共23页

C. -1,0

D. 1,1

『正确答案』C

『答案解析』

while循环的判定条件为“a--”,即a先作为循环条件判定,然后再自减1。第一次循环判定条件为真,执行完毕后a=0,b=0,第二次循环判定条件为假,循环不成立,所以只执行判定表达式"a--",所以最终a=-1,b=0,答案选择C选项。

33、下列叙述中错误的是( )。

A. 一个C语言程序只能实现一种算法

B. C程序可以由多个程序文件组成

C. C程序可以由一个或多个函数组成

D. 一个C函数可以单独作为一个C程序文件存在

『正确答案』A

『答案解析』

一个C程序可以有一个或多个程序文件,也可以有一个或多个函数,所以一个C语言程序可以实现多种算法,答案选择A选项。

34、设有定义:

int n = 1234;

double x = 3.1415;

则语句

printf("%3d,%1.3fn", n, x);

的输出结果是( )。

A. 1234,3.142

B. 123,3.142

C. 1234,3.141

D. 123,3.141

『正确答案』A

『答案解析』

注意理解printf函数的显示控制方式。%3d的含义是至少输出三个占位符,举例如下:变量值为2,则输出为__2,(_表示一个空格),如果变量值本身第16页,共23页

超过3位,则按变量输出,如本题应输出1234。%1.3f中,1表示整数至少占位一位,小数点后保留三位小数(四舍五入)。因此输出3.142,答案选择A选项。

35、关于C语言标识符,以下叙述错误的是( )。

A. 标识符可全部由数字组成

B. 标识符可全部由下划线组成

C. 标识符可全部由小写字母组成

D. 标识符可全部由大写字母组成

『正确答案』A

『答案解析』

C语言标识符只能由字母、数字、下划线构成,且只能以字母、下划线开头,故答案选择A选项。

36、如果定义

float a[10],x;

则以下叙述中正确的是( )。

A. 语句 a = &x; 是非法的

B. 表达式 a+1 是非法的

C. 三个表达式 a[1]、*(a+1)、*&a[1]表示的意思完全不同

D. 表达式*&a[1]是非法的,应该写成 *(&(a[1]))

『正确答案』A

『答案解析』

数组名表示该数组的首地址,是一个地址常量,不能对它重新赋值,A正确。但是可以把数组名看做一个指针常量,则表达式a+1表示的是数组中第二个元素的地址,选项B错。表达式a[1]、*(a+1)、*&a[1]都指的是数组a中第二个元素的值,选项C错。[]运算符的优先级高于*、&,取值*和取址&运算符优先级相等,同一优先级的运算符,运算次序由结合方向所决定,*&a[1]在运算符优先级和结合性上没有问题,并且取值*和取址&运算符互逆,*&a[1]和a[1]等价,相当于求得数组a第二个元素的值,选项D错。答案选择A

37、下面描述不属于软件特点的是( )。

A. 软件是一种逻辑实体,具有抽象性

第17页,共23页

B. 软件在使用中不存在磨损、老化问题

C. 软件复杂性高

D. 软件使用不涉及知识产权

『正确答案』D

『答案解析』

软件具有以下特点:①软件是一种逻辑实体,具有抽象性;②软件没有明显的制作过程;③软件在使用期间不存在磨损、老化问题;④软件对硬件和环境具有依赖性;⑤软件复杂性高,成本昂贵;⑥软件开发涉及诸多的社会因素,如知识产权等。答案选择D选项。

38、有以下程序:

#include

#define PT 3.5;

#define S(x) PT*x*x;

main()

{

int a=1,b=2;

printf("%4.1fn",S(a+b));

}

程序运行后的输出结果是( )。

A. 31.5

B. 7.5

C. 程序有错无输出结果

D. 14.0

『正确答案』C

『答案解析』

宏定义是预处理命令,不是C语句,结尾不加";",所以程序会出现编译错误,答案选择C选项。

39、下列选项中不属于结构化程序设计原则的是( )。

A. 可封装

B. 自顶向下

C. 模块化

第18页,共23页

D. 逐步求精

『正确答案』A

『答案解析』

结构化程序设计的基本原则包括:①模块化;②自顶向下;③逐步求精;④限制使用goto语句。可封装是面向对象的设计思想。答案选择A选项。

40、关于C语言标识符,以下叙述错误的是( )。

A. 标识符可全部由数字组成

B. 标识符可全部由下划线组成

C. 标识符可全部由小写字母组成

D. 标识符可全部由大写字母组成

『正确答案』A

『答案解析』

C语言标识符只能由字母、数字、下划线构成,且只能以字母、下划线开头,故答案选择A选项。

二、程序填空题

1、给定程序中,函数fun的功能是:找出100至x(x≤999)之间各位上的数字之和为15的所有整数,然后输出;符合条件的整数个数作为函数

值返回。例如,当n值为500时,各位数字之和为15的整数有:159、168、177、186、195、249、258、267、276、285、294、339、348、357、366、375、384、393、429、438、447、456、465、474、483、492。共有26个。请在程序的下划线处填入正确的内容并把下划线删除,是程序得出正确的结果。注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

/**********code.c**********/

#include

int fun(int x)

{

int n, s1, s2, s3, t;

/**********found**********/

n=①______;

t=100;

第19页,共23页

/**********found**********/

while(t<=②______)

{

s1=t%10;

s2=(t/10)%10;

s3=t/100;

if(s1+s2+s3==15)

{

printf("%d ",t);

n++;

}

/**********found**********/

③______;

}

return n;

}

void main()

{

int x=-1;

while(x>999||x<0)

{

printf("Please input(0

scanf("%d",&x);

}

printf("nThe result is: %dn",fun(x));

}

/**********-code.c**********/

输入答案内容...

【答案】

①0

②x

第20页,共23页

③t++

【解析】

填空1:变量n用于存放符合条件的整数的个数,应赋初值为0。

填空2:根据题目要求,确定循环变量t的取值范围t<=x。

填空3:循环变量t自增1操作。

三、程序改错题

1、给定程序MODI1.C中函数fun的功能:先将s所指字符串中的字符按逆序存放到t所指字符中,然后把s所指串中的字符按正序连接到t所指串的

后面。

例如:当s所指的字符串为:"ABCDE"时,则t所指的字符串应为:"EDCBAABCDE"。

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!

/**********code.c**********/

#include

#include

void fun (char *s, char *t)

{

/**********found**********/

int i;

i=0;

sl = strlen(s);

for (; i

/**********found**********/

t[i] = s[sl-i];

for (i=0; i

t[sl+i] = s[i];

t[2*sl] = '0';

}

main()

{

第21页,共23页

char s[100], t[100];

printf("nPlease enter string s:"); scanf("%s", s);

fun(s, t);

printf("The result is: %sn", t);

}

/**********-code.c**********/

输入答案内容...

【答案】

(1)错误:int i;

正确:int i, sl;

(2)错误:t[i] = s[sl-i];

正确:t[i]=s[sl-i-1];

【解析】

错误1:变量sl没有定义。

错误2:该循环实现将s串中的字符逆序存入t串中,t[i]对应s串中的s[sl-i-1]。

四、程序设计题

1、函数fun功能是:将a、b中的两个两位正整数合并形成一个新的整数放在c中。合并的方式是将a中的十位和个位数依次放在变量c的千位和十

位上,b中的十位和个位数依次放在变量c的个位和百位上。

例如,当a=45,b=12。调用该函数后,c=4251。

注意,部分源程序存在文件PROG1.C中。数据文件中的数据不得修改。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun花括号中填入你编写的若干语句。

/**********code.c**********/

#include

void fun(int a, int b, long *c)

{

}

int main()

第22页,共23页

{

int a,b;

long c;

printf("Input a b:");

scanf("%d%d", &a, &b);

fun(a, b, &c);

printf("The result is: %ldn", c);

}

/**********-code.c**********/

输入答案内容...

【答案】

void fun(int a, int b, long *c)

{

*c=a%10+(b%10)*10+(a/10)*100+(b/10)*1000;

}

【解析】

本题的主要问题是如何取出a和b的个位数和十位数,取出后如何表示成c中相应的位数。由于a和b都是只有两位

的整数,所以分别对它们除10可得到它们的十位数,分别用10对它们求余可得到它们的个位数。得到后对应乘以10

00、100、10、1就可得到c的千位数、百位数、十位数和个位数。注意:使用c时要进行指针运算。

第23页,共23页


本文标签: 函数 答案 指针 变量 选择