返回试卷 在打印对话框中选择「另存为 PDF」即可下载

全国计算机等级考试《二级C语言程序设计》预测试卷二

二级C语言程序设计 / 预测试卷 共 43 题 更新于 2026-09-28

一、选择题

每小题1分,共40分。

1.
结构化程序的三种基本控制结构是(  )。
  • A.顺序、选择和重复(循环)
  • B.过程、子程序和分程序
  • C.顺序、选择和调用
  • D.调用、返回和转移

参考答案A

解析结构化程序设计中三种基本控制结构为顺序、选择和重复(循环)。答案选择A选项。
2.
软件按功能可以分为应用软件、系统软件和支撑软件(或工具软件)。下面属于应用软件的是(  )。
  • A.学生成绩管理系统
  • B.C语言编译程序
  • C.UNIX操作系统
  • D.数据库管理系统

参考答案A

解析应用软件是为解决特定领域的应用而开发的软件,如事务处理软件,工程与科学计算软件,学生成绩管理系统、教务管理系统、浏览器、编辑软件等应用性质不同的各种软件。系统软件是计算机管理自身资源,提高计算机使用效率并服务于其他程序的软件,如操作系统,编译程序,汇编程序,数据库管理系统等。支撑软件是介于系统软件和应用软件之间,协助用户开发软件的工具性软件,包括辅助和支持开发和维护应用软件的工具软件,如需求分析工具软件,设计工具软件,编码工具软件,测试工具软件,维护工具软件等。答案选择A选项。
3.
通常软件测试实施的步骤是(  )。
  • A.集成测试、单元测试、确认测试
  • B.单元测试、集成测试、确认测试
  • C.确认测试、集成测试、单元测试
  • D.单元测试、确认测试、集成测试

参考答案B

解析软件测试的实施过程主要有4个步骤:单元测试、集成测试、确认测试(验收测试)和系统测试。答案选择B选项。
4.
下面描述中错误的是(  )。
  • A.系统总体结构图支持软件系统的详细设计
  • B.软件设计是将软件需求转换为软件表示的过程
  • C.数据结构与数据库设计是软件设计的任务之一
  • D.PAD图是软件详细设计的表示工具

参考答案A

解析详细设计的任务是为软件结构图中而非总体结构图中的每一个模块确定实现算法和局部数据结构。软件系统的总体结构图是软件架构设计的依据,它并不支持软件的详细设计。支持软件系统的详细设计的有:程序流程N-S图以及PAD图等。答案选择A选项。
5.
结构化程序所要求的基本结构不包括(  )。
  • A.顺序结构
  • B.GOTO跳转
  • C.选择(分支)结构
  • D.重复(循环)结构

参考答案B

解析结构化程序以模块化设计为中心,使用顺序、选择和循环三种基本控制结构就可以实现任何算法功能。结构化程序设计的思想包括自顶向下、逐步求精、模块化、限制使用GOTO语句。答案选择B选项。
6.
某二叉树共有7个结点,其中叶子结点只有1个,则该二叉树的深度为(假设根结点在第1层)(  )。
  • A.3
  • B.4
  • C.6
  • D.7

参考答案D

解析在任意一个二叉树中,度为0的叶子结点总比度为2的结点多一个,所以本题中度为2的结点为1-1=0个,即二叉树的每一个结点都只有一个孩子,7个结点共7层。答案选择D选项。
7.
下列关于栈叙述正确的是(  )。
  • A.栈顶元素最先能被删除
  • B.栈顶元素最后才能被删除
  • C.栈底元素永远不能被删除
  • D.栈底元素最先能被删除

参考答案A

解析栈是先进后出的数据结构,因此栈顶元素最后入栈却最先被删除,栈底元素最先入栈却最后被删除。答案选择A选项。
8.
在数据库中,数据模型包括数据结构、数据操作和(  )。
  • A.数据约束
  • B.数据类型
  • C.关系运算
  • D.查询

参考答案A

解析在数据库系统中的数据模型有三个要素:数据结构、数据操作和数据的约束条件。答案选择A选项。
9.
一名教师可讲授多门课程,一门课程可由多名教师讲授。则实体教师和课程问的联系是(  )。
  • A.1:1联系
  • B.1:m联系
  • C.m:1联系
  • D.m:n联系

参考答案D

解析一名教师可讲授多门课程,而一门课程又能由多名教师讲授,所以教师和课程之间是多对多的关系,可以表示为m:n,答案选择D选项。
10.
若变量均已正确定义并赋值,以下合法的C语言赋值语句是(  )。
  • A.x=n%2.5;
  • B.x=y==5;
  • C.x+n=i;
  • D.x=5=4+1;

参考答案B

解析B项正确,y==5返回0或者1,然后赋值给x。A项错误,浮点数不能参与模运算;C项错误,赋值运算符左边只能是单一变量,x+n是右值,不能给它赋值;D项错误,5是常量,不能被赋值。答案选择B选项。
11.
以下叙述中错误的是(  )。
  • A.C程序经过编译、链接步骤之后才能形成一个真正可执行的二进制机器指令文件
  • B.C语言中的每条可执行语句和非执行语句最终都将被转换成二进制的机器指令
  • C.用C语言编写的程序称为源程序,它以ASCII代码形式存放在一个文本文件中
  • D.C语言源程序经编译后生成后缀为.obj的目标程序

参考答案B

解析B项错误,注释语句不会被翻译成二进制的机器指令。C源程序经过C编译程序编译之后生成后缀为.obj的二进制文件(称为目标文件),然后由“链接程序”(Link)的软件把.obj文件与各种库函数连接起来生成一个后缀为.exe的可执行文件。答案选择B选项。
12.
下列叙述中错误的是(  )。
  • A.C程序可以由一个或多个函数组成
  • B.C程序可以由多个程序文件组成
  • C.一个C语言程序只能实现一种算法
  • D.一个C函数可以单独作为一个C程序文件存在

参考答案C

解析一个C程序可以有一个或多个程序文件,也可以有一个或多个函数,所以一个C语言程序可以实现多种算法,答案选择C选项。
13.
设有定义:
int a;float b;
执行scanf("%2d%f",&a,&b);
语句时,若从键盘输入876 543.0,则a和b的值分别是(  )。
  • A.87和6.0
  • B.876和543.0
  • C.87和543.0
  • D.76和543.0

参考答案A

解析scanf函数的一般形式为:scanf(格式控制,地址表列);。其中,“格式控制”是用双引号括起来的字符串,也称“转换控制字符串”,它包括两种信息:①格式说明,由“%”和格式字符组成;②普通字符,即需要原样输入的字符。“地址表列”是需要接收输入数据的一系列变量的地址。本题中的“格式控制”是“%2d%f”,其中%2d的意思是要输入一个整数,但该整数最宽只占2个字符,而%f是要输入一个浮点数。而题目要求输入的是876和543.0,所以scanf函数将87赋给a,6赋给b。答案选择A选项。
14.
关于C语言标识符,以下叙述错误的是(  )。
  • A.标识符可全部由数字组成
  • B.标识符可全部由下划线组成
  • C.标识符可全部由小写字母组成
  • D.标识符可全部由大写字母组成

参考答案A

解析C语言标识符只能由字母、数字、下划线构成,且只能以字母、下划线开头,故答案选择A选项。
15.
以下合法的转义字符是(  )。
  • A.'\x41'
  • B.'\0x41'
  • C.'\X41'
  • D.'\0X41'

参考答案A

解析转义字符以反斜杠'\'开头,后面跟一个字符或一个八进制或十六进制数表示。十六进制转义字符是由反斜杠'\'和字母x及随后的1~2个十六进制数字构成的字符序列。答案选择A选项。
16.
以下能正确表述算式 sin(2πr+30°)的C语言表达式是(  )。
  • A.sin(2*π*r+30)
  • B.sin(2*3.14*r+30)
  • C.sin(2*3.14*r+3.14*30/180.0)
  • D.sin(2*3.14*r+30*3.14/360.0)

参考答案C

解析C项正确。sin是库函数,其参数中的角度要求用弧度制表示。C语言中π不是已定义的常量,需要用户自定义或者直接使用3.14代替π。A项未替换π也没有将30度换算成弧度,错误。B项没有将30度换算成弧度,错误。D项弧度换算错误,π对应于180°,应该除以180.0而不是360.0。答案选择C选项。
17.
设有定义:char s[81];int i=0;,以下不能将一行(不超过80个字符)带有空格的字符串正确读入的语句或语句组是(  )。
  • A.gets(s);
  • B.while((s[i++]=getchar())!='\n');s[i]='\0';
  • C.scanf("%s",s);
  • D.do{ scanf("%c",&s[i]);} while(s[i++]!='\n');s[i]='\0';

参考答案C

解析字符串的输入有两种方式:①scanf()函数;②get()函数。A项,gets函数用来从终端键盘读入字符串(包括空格符),直到读入一个换行符为止;B项,getchar()函数从终端读入一个字符作为函数值;D项,%c格式读入单个字符,空格、回车符和Tab键都将作为字符读入。C项中,s代表输入一个字符数组而非地址,而且遇到空格时会默认字符串输入结束,所以不能读入带有空格的字符串。答案选择C选项。
18.
有以下程序
#include 
main()
{
char c1,c2,c3,c4,c5,c6;
scanf("%c%c%c%c", &c1,&c2,&c3,&c4);
c5=getchar();
c6=getchar();
putchar(c1);
putchar(c2);
printf("%c%c\n",c5,c6);
}
程序运行后,若从键盘输入(从第1列开始)
123<回车>
45678<回车>
则输出结果是(  )。
  • A.1256
  • B.1245
  • C.1278
  • D.1267

参考答案B

解析scanf是格式化输入函数;getehar函数从键盘缓冲区读入下一个字符;putchar输出一个字符;printf函数是格式化输出函数。在题目中,程序执行到scanf函数时,会暂停等待用户输入4个字符,按题意输入123<回车>后,字符'1'~'3'被分别赋值到c1~c3中,而c4会得到一个换行符'\n'。然后执行第1个getchar函数,由于前面的scanf函数读完了缓冲区中的所有字符,所以此时程序又会暂停等待用户输入,按题意输入45678<回车>后,缓冲区第一个字符'4'赋值c5,第二个字符'5'赋值给c6。答案选择B选项。
19.
有以下程序
#include
main()
{
int a,b;
for(a=0; a<3; a++)
{
scanf("%d", &b);
switch(b)
{
default: printf("%d,", ++b);
case 1: printf("%d,", ++b);
case 2: printf("%d,", ++b);
}
}
}
执行时输入:1 2 3 <回车>,则输出结果是(  )。
  • A.2,3,3,4,5,6,
  • B.2,3,4,
  • C.2,2,3,4,4,4,
  • D.2,3,4,3,4,4,

参考答案A

解析考查C语言中的switch-case语句。执行switch-case语句时,一定会先进行匹配,匹配成功则执行当前case语句,再根据是否有break,判断是否继续输出,或是跳出判断。程序中输入1时,与case 1匹配成功,执行后面的输出语句,输出2,且此时b=2,因为后面没有break语句,继续执行下一条输出语句,输出3。继续输入2时,与case 2匹配成功,执行后面的输出语句,输出3。输入3时,没有可匹配的case语句,执行default语句,输出4,b变为4;后面没有break语句,继续执行case 1后的输出语句,输出5,b变为5;同理继续执行case2后面的输出语句,输出6。答案选择A选项。
20.
对于if(表达式)语句,以下叙述正确的是(  )。
  • A.“表达式”的值可以是任意合法的数值
  • B.变量不能出现在“表达式”中
  • C.常量不能出现在“表达式”中
  • D.如果“表达式”的值不是逻辑值,程序会出编译错误

参考答案A

解析if语句中的“表达式”可以是任意合法的C语言表达式,包括关系表达式和逻辑表达式等,也可以是任意的数值类型(包括整型、实型、字符型等),A项正确。“表达式”中可以出现变量或者常量,也不一定必须是逻辑值,B、C、D项错误。答案选择A选项。
21.
以下程序段中的变量已正确定义
for( i=0; i<4; i++,i++ )
for( k=1; k<3; k++ );
printf("*" );
该程序段的输出结果是(  )。
  • A.********
  • B.****
  • C.**
  • D.*

参考答案D

解析for语句在没有"{}"说明时仅仅是跟随其后的第一条语句,即另外一个for语句,第二个for循环有个";"结束,所以整个双重循环将被视为空语句。然后执行下一个顺序语句,即输出语句,只输出一个"*"。答案选择D选项。
22.
有以下程序
#include  
main()
{
int a=-1, b=-1;
for(; ++a;)++b;
printf("%d,%d\n", a, b);
}
程序运行后的输出结果是(  )。
  • A.0,-1
  • B.0,0
  • C.-1,-1
  • D.结果不确定

参考答案A

解析这是对for循环的基本考查,C语言中for循环的形式:for(表达式1;表达式2;表达式3),本题中表达式1和表达式3为空语句。程序执行过程为:定义整型变量a、b并赋初值,执行for循环,执行控制语句++a,a先自增变为0再使用,不满足控制条件,跳出循环。因此b并未改变,最后输出0,-1。答案选择A选项。
23.
有以下程序:
#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,
  • 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选项。
24.
以下叙述中正确的是(  )。
  • A.数组说明符的一对方括号中只能使用整型常量,而不能使用表达式
  • B.一条语句只能定义一个数组
  • C.每个数组包含一组具有同一类型的变量,这些变量在内存中占有连续的存储单元
  • D.在引用数组元素时,下标表达式可以使用浮点数

参考答案C

解析A项错误,方括号中应当是整型常量表达式,可以使用表达式,只要计算结果是整型常量即可;B项错误,可以使用逗号隔开,来定义多个数组;D项错误,引用数组时,下标必须是自然数,还应保证下标不越界。C项正确,数组内部的变量都是同一类型,在内存中是连续存储的。答案选择C选项。
25.
若有定义语句:int m[][3]={1,2,3,4,5,6,7};,则与该语句等价的是(  )。
  • A.int m[][3]={{1,2,3},{4,5},{6,7}};
  • B.int m[][3]={{1,2},{3,4},{5,6,7}};
  • C.int m[][3]={{1,2,3},{4,5,6},{7}};
  • D.int m[][3]={{1},{2,3,4},{5,6,7}};

参考答案C

解析考查二维数组的初始化。二维数组的初始化有两种方式,①分行初始化,方式为:数据类型数组名[行下标表达式][列下标表达式]={{第0行初值},{第1行初值表},…{最后1行初值表}};,如果初值表只对部分元素赋初值,没有被赋初值的元素将被自动赋值为0。②不分行将所有数据依次列在一个花括号里,即数据类型数组名[行下标表达式][列下标表达式]={初值表};,这种方式的赋值就是将初值表的数据依次赋予数组的每个元素,其中赋值是按照数组元素在内存中的位置进行的。题目中的初始化语句是第二种方法,如果用第一种方法应该是int m[][3] = {{1,2,3}, {4,5,6}, {7}};,这里应该保证除r最后一行,每一行都满列有3个元素,答案选择C选项。
26.
以下叙述中正确的是(  )。
  • A.char c1, c2, *c3, c4[40];是合法的变量定义语句
  • B.数组下标的下限由数组中第一个非零元素的位置决定
  • C.数组下标的下限由数组中第一个被赋值元素的位置决定
  • D.数组下标的下限是1

参考答案A

解析A正确,char c1、c2、*c3、c4[40]表示定义了两个字符变量c1、c2,一个字符指针c3,一个字符数组c4。数组的下限永远为0,选项B、C、D错,答案选择A选项。
27.
字符数组a和b中存储了两个字符串,判断字符串a和b是否相等,应当使用的是(  )。
  • A.if(sdivcmp(a,b)==0)
  • B.if(sdivcpy(a,b))
  • C.if(a==b)
  • D.if(a=b)

参考答案A

解析C语言中,判断字符串是否相等,使用字符串比较函数strcmp(),不能使用相等操作符“==”。strcmp(s1,s2)函数比较s1和s2所指字符串的大小时,若串s1>串s2,函数值大于0(正数);若串s1=串s2,函数值等于0;若串s1<串s2,函数值小于0(负数)。答案选择A选项。
28.
若有定义:
char s[30] = {0};
运行时输入:
This is a sdiving.<回车>
则以下不能正确读入整个字符串:
This is a sdiving.
到字符数组 s 中的语句组是(  )。
  • A.scanf("%s",s);
  • B.gets(s);
  • C.for(i=0;(c=getchar())!= '\n';i++)s[i] = c;
  • D.i=0;while((c=getchar())!='\n')s[i++] = c;

参考答案A

解析scanf函数用格式控制符%s读取字符串时,不能接受空格、制表符Tab、回车。即在读入This is a string时,读到第一个空格时结束。最后s中的内容是This。答案选择A选项。
29.
以下叙述中正确的是(  )。
  • A.函数调用时,不必区分函数名称的大小写
  • B.调用函数时,函数名必须与被调用的函数名完全一致
  • C.函数名允许用数字开头
  • D.在函数体中只能出现一次return语句

参考答案B

解析调用函数的时候只有保证调用语句的函数名和被调函数的函数名、参数列表一致才能保证调用的正确性,B正确。C语言对大小写敏感,选项A错。用户自定义的函数名需要遵循用户标识符的命名规则,由字母、数字、下划线组成并且第一个字符不能为数字,选项C错。一个函数每次只能使用一个return语句,但是该函数体中可以有多个返回点,也就是有多条return语句,每次只从其中一点返回,选项D错。答案选择B选项。
30.
有以下程序
#include 
void fun(int a,int b)
{
int t;
t=a; a=b; b=t;
}
main()
{
int c[10]={1,2,3,4,5,6,7,8,9,0}, i;
for (i=0; i<10; i+=2) fun(c[i], c[i+1]);
for (i=0;i<10; i++) printf("%d,", c[i]);
printf("\n");
}
程序的运行结果是(  )。
  • A.1,2,3,4,5,6,7,8,9,0,
  • B.2,1,4,3,6,5,8,7,0,9,
  • C.0,9,8,7,6,5,4,3,2,1,
  • D.0,1,2,3,4,5,6,7,8,9,

参考答案A

解析在C语言中,函数参数传递的作用是“传值”,形参和实参是两个没有关系的变量。函数fun交换了参数值,但只是交换了形参的值,结果并不会传递给实参。所以数组c没有发生变化,原顺序输出。答案选择A选项。
31.
有以下程序
#include 
int fun(int n)
{
int a;
if(n==1) return 1;
a = n+fun(n-1);
return (a);
}
main()
{
printf("%d\n", fun(5));
}
程序的输出结果是(  )。
  • A.10
  • B.14
  • C.15
  • D.9

参考答案C

解析考查递归函数。函数fun()的功能是计算1到n之间的数字之和,所以计算结果为15,答案选择C选项。
32.
设有定义:
int x=0, *p;
紧接着的赋值语句正确的是(  )。
  • A.*p=x;
  • B.*p=NULL;
  • C.p=x;
  • D.p=NULL;

参考答案D

解析指针赋值的正确写法:①p=&x,表示p指向x的存储单元;②p=NULL,表示p是空指针。③*p=x,表示将p指向的内容赋值为x,但前提是p已进行了初始化。答案选择D选项。
33.
有以下程序
#include 
int add(int a,int b)
{
return (a+b);
}
main()
{
int k, (*f)(),a=5,b=10;
f=add;
…
}
则以下函数调用语句错误的是(  )。
  • A.k= *f(a,b);
  • B.k=add(a,b);
  • C.k=(*f)(a,b);
  • D.k=f(a,b);

参考答案A

解析int (*f)(int, int)声明了一个函数指针,它可以指向一个函数,该函数的形参是两个int,返回值是int;f=add,是把函数add的地址赋给指针f,选项B正确;函数指针的调用有两种方式,(*f)()和f(),选项C、D正确。f(a,b)已经表示调用函数add,返回15,k=*15出现编译错误,选项A错误。答案选择A选项。
34.
以下叙述中错误的是(  )。
  • A.当在程序的开头包含头文件sdivio.h时,可以给指针变量赋NULL
  • B.函数可以返回地址值
  • C.改变函数形参的值,不会改变对应实参的值
  • D.可以给指针变量赋一个整数作为地址值

参考答案D

解析A项正确,NULL是在头文件stdio.h中定义的符号常量;B项正确,函数的返回值可以是地址,即指针;C项正确,函数调用中形参值的变化不会传递给实参;D项错误,不能将一个整数直接赋给指针变量作为地址,只能用取地址运算符“&”把该整型变量的地址赋值给该指针变量。答案选择D选项。
35.
设已有定义:
float x;
则以下对指针变量p进行定义且赋初值的语句中正确的是(  )。
  • A.float *p=&x;
  • B.int *p=(float)x;
  • C.float p=&x;
  • D.float *p=1024;

参考答案A

解析考查指针变量的初始化。A项正确,p是float类型的指针,指向x的存储单元;B项错误,p是int类型的指针,只能指向int变量的存储单元;C项错误,p的float类型的变量,&x是取变量x的地址,不能把地址赋值给float类型变量;D项错误,p是指向float类型的指针,不能使用常整型赋值。答案选择A选项。
36.
以下叙述中正确的是(  )。
  • A.在C语言中,预处理命令行都以“#”开头
  • B.预处理命令行必须位于C源程序的起始位置
  • C.#include 必须放在C程序的开头
  • D.C语言的预处理不能实现宏定义和条件编译的功能

参考答案A

解析“编译预处理”就是在C编译程序对C源程序进行编译前,由编译预处理程序对这些编译预处理命令行进行处理的过程。A项正确,在C语言中,凡是以“#”号开头的行,都称为“编译预处理”命令行。B项错误,预处理命令行可以出现在程序的任何一行的开始部位,其作用一直持续到源文件的末尾;C项错误,#include 可以出现在程序的任意一行的开始部位;D项错误,预处理可以实现宏定义、条件编译和文件包含。答案选择A选项。
37.
有以下程序:
#include
#define PT 3.5;
#define S(x) PT*x*x;
main()
{
int a=1,b=2;
printf("%4.1f\n",S(a+b));
}
程序运行后的输出结果是(  )。
  • A.31.5
  • B.7.5
  • C.程序有错无输出结果
  • D.14.0

参考答案C

解析宏定义是预处理命令,不是C语句,结尾不加";",所以程序会出现编译错误,答案选择C选项。
38.
下面结构体的定义语句中,错误的是(  )。
  • A.sdivuct ord {int x; int y; int z; } sdivuct ord a;
  • B.sdivuct ord {int x; int y; int z; }; sdivuct ord a;
  • C.sdivuct ord {int x; int y; int z; } a;
  • D.sdivuct {int x; int y; int z; } a;

参考答案A

解析C语言中结构体变量的定义有三种方法:①定义结构体类型的同时定义结构体变量,如C项;②使用无名结构体类型定义结构体变量,如D项;③先定义结构体类型,后定义结构体变量,如B项,A项错在分别定义结构体类型与结构体变量时需要用“;”隔开。故答案选择A选项。
39.
有以下程序
#include 
typedef sdivuct {int b, p;} A;
void f(A c)
{
int j;
c.b+=1; 
c.p+=2;
}
void main()
{
int i;
A a={1,2};
f(a);
printf("%d,%d\n", a.b, a.p);
}
程序运行后的输出结果是(  )。
  • A.2,4
  • B.1,2
  • C.1,4
  • D.2,3

参考答案B

解析考查结构体变量作为函数实参整体传递,也是一种值传参,形参的变化不能影响到实参,所以调用函数f(a)对a中的数据没有影响,输出结果为1,2,答案选择B选项。
40.
有以下程序
#include 
void main()
{
unsigned char a=8, c;
c = a>>3;
printf("%d\n",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选项。

二、程序填空题

共18分。

41.
给定程序中,函数fun的功能是:计算下式前n项的和作为函数的返回值
题目图片
  例如,当形参n的值为10时,函数返回:9.612558。
  请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的BLANK1.C中。
  不得增行或删行,也不得更改程序的结构!
/**********code.c**********/
#include
double fun(int n)
{
 int i;
 double s,t;
 /**********found**********/
 s=①______;
 /**********found**********/
 for(i=1; i<=②______; i++)
 {
  t=2.0*i;
  /**********found**********/
  s=s+(2.0*i-1)*(2.0*i+1)/③______;
 }
 return s;
}
main()
{
 int n=-1;
 while(n<0)
 {
  printf("Please input(n>0): ");
  scanf("%d",&n);
 }
 printf("\nThe result is: %f\n",fun(n));
}
/**********-code.c**********/

参考答案<br />  ①0<br />  ②n<br />  ③(t*t)

解析
  填空1:程序开始定义了变量s,但没有对其进行初始化,根据公式及后面的程序可知变量s用来存储公式的前n项和,因此该变量应初始化为0。
  填空2:通过for循环语句将表达式各项进行累加,结果存于变量s中,循环变量i的取值范围为1~n。
  填空3:根据题目要求确定表达式通项,前面已定义t=2.0*i,因此此空应填(t*t)。

三、程序改错题

共18分。

42.
给定程序MODI1.C中函数fun的功能是:统计subsdiv所指子字符串在sdiv所指字符串中出现的次数。
  例如,若字符串为aaas lkaaas,子字符串为as,则应输出2。
  请改正程序中的错误,使它能计算出正确的结果。
  注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
/**********code.c**********/
#include
int fun (char *sdiv,char *subsdiv)
{
int i,j,k,num=0;
/**********found**********/
for(i = 0, sdiv[i], i++)
for(j=i,k=0;subsdiv[k]==sdiv[j];k++,j++)
/**********found**********/
If(subsdiv[k+1]=='\0')
{
num++;
break;
}
return num;
}
void main()
{
char sdiv[80],subsdiv[80];
printf("Input a sdiving:") ;
gets(sdiv);
printf("Input a subsdiving:") ;
gets(subsdiv);
printf("%d\n",fun(sdiv,subsdiv));
}
/**********-code.c**********/

参考答案<br />(1)错误:for(i=0,str[i],i++)<br />  正确:for(i=0;str[i];i++)<br />(2)错误:If(substr[k+1]=='\0')<br />  正确:if(substr[k+1]== '\0')

解析
  错误1:循环条件for(i = 0, str[i], i++),不难发现此处for循环语句的格式有误,其中表达式之间应以“;”相隔。
  错误2:if条件语句处的关键字书写错误。

四、程序设计题

共24分。

43.
请编写一个函数fun,他的功能是:根据以下公式求 π的值(要求满足精度0.0005,即某项小于0.0005时停止迭代):
题目图片
  程序运行后,如果输入精度0.0005,则程序输出为3.14…。
  注意部分源程序存在文件PROG1.C立件中。
  请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
/**********code.c**********/
#include
#include
double fun(double eps)
{

}
void main()
{
 double x;
 printf("Input eps:") ;
 scanf("%lf",&x);
 printf("\neps = %lf,PI=%lf\n", x, fun(x));
}

参考答案<br />double fun(double eps)<br />{<br /> double s=1.0,s1=1.0;<br /> int n=1;<br /> while(s1>=eps)/*当某项大于精度要求时,继续求下一项*/<br /> {<br />  s1=s1*n/(2*n+1);/*求多项式的每一项*/<br />  s=s+s1;/*求和*/<br />  n++;<br /> }<br /> return 2*s;<br />}

解析首先应该定义double类型变量,并且赋初值,用来存放多项式的某一项和最后的总和。从第2项开始以后的每一项都是其前面一项乘以n/(2*n+1),程序中用s1来表示每一项,s表示求和后的结果。需注意s1和s的初值都为1.0,因为循环变量从第二项开始累加。