2014年9月全国计算机等级考试《二级C语言程序设计》真题及详解
(考试时间120分钟 满分100分)
一、选择题(每题1分,共40分)
1下列关于C语言文件的叙述中正确的是( )。
A.文件由一系列数据依次排列组成,只能构成二进制文件
B.文件由结构序列组成,可以构成二进制文件或文本文件
C.文件由数据序列组成,可以构成二进制文件或文本文件
D.文件由字符序列组成,其类型只能是文本文件
【答案】C
【解析】C语言将文件看作是一个字符(字节)的序列,即由一个一个字符(字节)数据顺序组成。根据数据的组成形式,可将文件分为两种:①ASCII文件,又称文本(text)文件,它的每一个字节可放一个ASCII码,代表一个字符;②二进制文件,是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。所以C文件就是一个字节流或一个二进制流。答案选择C选项。
2有以下程序:
#include<stdio.h>
main()
{
int m=1,n=2,*p=&m,*q=&n,*r;
r=p;
p=q;
q=r;
printf("%d,%d,%d,%d\n",m,n,*p,*q);
}
程序运行后的输出结果是( )。
A.1,2,1,2
B.1,2,2,1
C.2,1,2,1
D.2,1,1,2
【答案】B
【解析】m和n的值不变,分别是1,2;指针*p和*q交换了指向的位置,即*p=&n,*q=&m,分别为2,1。答案选择B选项。
3有以下程序:
#include <stdio.h>
#include <string.h>
struct A
{
int a;
char b[10];
double c;
};
struct A f(struct A t);
main()
{
struct A a={1001,"ZhangDa",1098.0};
a=f(a);
printf("%d,%s,%6.1f\n",a.a,a.b,a.c);
}
struct A f(struct A t)
{
t.a=1002;
strcpy(t.b,"ChangRong");
t.c=1202.0;
return t;
}
程序运行后的输出结果是( )。
A.1001,ZhangDa,1098.0
B.1002,ZhangDa,1202.0
C.1001,ChangRong,1098.0
D.1002,ChangRong,1202.0
【答案】D
【解析】函数f对结构体成员进行修改,并返回新的结构体;main函数先定义了一个结构体变量a并为它赋初值,然后调用函数f修改结构体变量的成员值,最后输出新的结构体变量成员值。答案选择D选项。
4数据库管理系统是( )。
A.操作系统的一部分
B.系统软件
C.一种编译系统
D.一种通信软件系统
【答案】B
【解析】系统软件主要包括:①操作系统软件;②各种语言的解释程序和编译程序;③各种服务性程序;④各种数据库管理系统。数据库管理系统是一种系统软件,负责数据库中的数据组织、数组操纵、数据维护、控制和保护以及数据服务等。答案选择B选项。
5有以下程序:
#include <stdio.h>
void fun(int p)
{
int d=2;
p=d++;
printf("%d",p);
}
main()
{
int a=1;
fun(a);
printf("%d\n",a);
}
程序运行后的输出结果是( )。
A.32
B.12
C.21
D.22
【答案】C
【解析】C语言中函数参数传递满足“单向传递”,实现传递值的功能,实参能传给形参,形参却不能传回给实参。fun函数体内输出p的值为2,并不影响到fun函数外a的值,a的值在main函数内依然为1。答案选择C选项。
6有以下程序:
#include <stdio.h>
#define f(x) x*x*x
main()
{
int a=3,s,t;
s=f(a+1);
t=f((a+1));
printf("%d,%d\n",s,t);
}
程序运行后的输出结果是( )。
A.10,64
B.10,10
C.64,10
D.64,64
【答案】A
【解析】C语言中带参数的宏可以理解为用参数直接替换定义式中的变量,而不经过任何修改。所以s=f(a+1)=a+1*a+1*a+1=3+3+3+1=10,t=f((a+1))=(a+1)*(a+1)*(a+1)=4×4×4=64,所以有无括号的运算结果是不同的。故答案选择A选项。
7有以下程序:
#include<stdio.h>
main()
{
int a[]={2,3,5,4},i;
for(i=0;i<4;i++)
switch(i%2)
{
case 0:switch(a[i]%2)
{
case 0:a[i]++;break;
case 1:a[i]--;
} break;
case 1:a[i]=0;
}
for(i=0;i<4;i++) printf("%d",a[i]);
printf("\n");
}
程序运行后的输出结果是( )。
A.3344
B.2050
C.3040
D.0304
【答案】C
【解析】main函数的主体是一个for循环语句,for循环中包含一个switch语句,如果判断条件为0则进入第二个switch语句,如果判断语句为1则执行“a[i]=0”,最后将数组顺序输出。所以程序功能是将数组下标为奇数的项设为0,数组下标为偶数的项,如果对应的元素为偶数则加1,如果对应的元素为奇数则减1。答案选择C选项。
8若有以下程序段:
int r=8;
printf("%d\n",r>>1);
输出结果是( )。
A.16
B.8
C.4
D.2
【答案】C
【解析】C语言中,“>>”右移运算符是将变量转换成二进制,然后右移相应位数,将移出的位信息舍去,并在高位补0,将所得的结果再赋值给变量。本题十进制数8转换为二进制数为00001000,右移一位得到00000100,再转换成十进制数就是4。所以答案选择C选项。
9有以下定义语句,编译时会出现编译错误的是( )。
A.char a='a';
B.char a='\n';
C.char a='aa';
D.char a='\x2d';
【答案】C
【解析】本题中a为一个字符型变量,只能为其赋值一个字符常量,A项编译可以通过。C项中'aa'不是字符常量,而是一个字符串,所以会编译错误。BD两项为转义字符,编译可以通过。答案选择C选项。
10下面结构体的定义语句中,错误的是( )。
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;
【答案】B
【解析】C语言中结构体变量的定义有三种方法:①定义结构体类型的同时定义结构体变量,如C项;②使用无名结构体类型定义结构体变量,如D项;③先定义结构体类型,后定义结构体变量,如A项,B项错在分别定义结构体类型与结构体变量时需要用“;”隔开。故答案选择B选项。
11有以下程序:
#include <stdio.h>
#include <string.h>
main()
{
char a[10]="abcd";
printf("%d,%d\n",strlen(a),sizeof(a));
}
程序运行后的输出结果是( )。
A.7,4
B.4,10
C.8,8
D.10,10
【答案】B
【解析】在C语言中,strlen()用来统计字符串中字符的个数(不包含字符串结束标志'\0'),sizeof()用来求分配给数组的存储空间大小。题目中字符串a中字符个数为4,但由于数组a定义含有10个字符,所以所占空间大小为10。所以答案选择B选项。
12以下函数findmax拟实现在数组中查找最大值并作为函数值返回,但程序中有错导致不能实现预定功能。
#define MIN -2147483647
int fingmax (int x[],int n)
{
int i,max;
for(i=0;i<n;i++)
{
max=MIN;
if(max<x[i])max=x[i];
}
return max;
}
造成错误的原因是( )。
A.定义语句int i,max;中max未赋初值
B.赋值语句max=MIN;中,不应给max赋MIN值
C.语句if(max<x[i]) max=x[i];中判断条件设置错误
D.赋值语句max=MIN;放错了位置
【答案】D
【解析】本题中for循环中首先将MIN值赋值给max,然后用x[i]与max的值比较。每次都是将MIN值与x[i]值进行比较,所以无论x[i]的值是什么,都不会影响if的判断语句,max=x[i]始终执行。所以函数返回的是数组中最后一个元素的值。程序的错误在于max=MIN的位置,for循环之前应先执行max=MIN。所以答案选择D选项。
13设有定义:char *c;,以下选项中能够使字符型指针c正确指向一个字符串的是( )。
A.char str[]="string";c=str;
B.scanf("%s",c);
C.c=getchar();
D.*c="string";
【答案】A
【解析】B,C选项均为输入函数,其表达意思为输入字符串c。B项中scanf()函数是将c定义为一个字符数组的数组名;C项中是将c定义为一个字符型变量;D项中是需要在指针定义时为它赋值,因此是不合法的,所以BCD三项都不正确。A项定义字符数组str,再将字符数组str的首地址赋给字符型指针c,正确。所以答案选择A选项。
14软件详细设计产生的图如下:
该图是( )。
A.N-S图
B.PAD图
C.程序流程图
D.E-R图
【答案】C
【解析】N-S图是由若干基本框图构成的流程图,其特点是没有流程线;PAD图即问题分析图,它是一种由左往右展开的二维树形结构;程序流程图用于描述问题解决的过程和步骤,其中方框表示处理步骤,菱形框表示逻辑判断,箭头表示控制流向;E-R图即实体-联系图,用来描述现实世界的概念模型,构成元素有实体、属性和联系,分别用矩形、椭圆形和菱形表示。答案选择C选项。
15下列函数的功能是( )。
fun(char * a,char * b)
{
while((*b= *a)!='\0')
{
a++;
b++;
}
}
A.将a所指字符串赋给b所指空间
B.使指针b指向a所指字符串
C.将a所指字符串和b所指字符串进行比较
D.检查a和b所指字符串中是否有'\0'
【答案】A
【解析】函数fun中a和b是两个字符型指针,在while语句的表达式中将指针a所指向的字符赋给指针b所指向的内存单元,再判断指针b所指向的字符是不是字符串中的结尾符,若不是,则字符指针a和b分别自增,再执行循环语句,直至b所指向的字符为字符串中的空字符。所以答案选择A选项。
16表达式:(int)((double)9/2)-9%2的值是( )。
A.0
B.3
C.4
D.5
【答案】B
【解析】运算符“/”“%”的优先级高于“-”,所以先进行除法和求余运算,再进行减法运算。强制类型转换表达式的形式:(类型名)(表达式)。“9/2”结果为4,转换成double类型再转换成int类型结果依然为4,9%2的结果为1,最后结果为4-1=3。答案选择B选项。
17有以下程序:
#include <stdio.h>
#include<string.h>
main()
{
char str[][20]={"One*World","One*Dream!"},*p=str[1];
printf("%d,",strlen(p));
printf("%s\n",p);
}
程序运行后的输出结果是( )。
A.9,One*World
B.9,One*Dream!
C.10,One*Dream!
D.10,One*World
【答案】C
【解析】程序将两个字符串常量赋值给一个二维字符数组,然后p指向第二个字符串。strlen统计字符串中有效字符的个数,可知"One*Dream!"中共有10个字符。所以答案选择C选项。
18对于循环队列,下列叙述中正确的是( )。
A.队头指针是固定不变的
B.队头指针一定大于队尾指针
C.队头指针一定小于队尾指针
D.队头指针可以大于队尾指针,也可以小于队尾指针
【答案】D
【解析】在循环队列中,用队尾指针(rear)指向队列中的队尾元素,用队头指针(front)指向队头元素的前一个位置。在循环队列中,一般情况下rear>front,当存储空间的最后一个位置被使用,而新元素要入队时,如果存储空间的第一个位置空闲,便可将元素插入到第一个位置,此时存储空间的第一个位置作为队尾,便有front>rear。所以答案选择D选项。
19有以下程序:
#include <stdio.h>
int f(int n);
main()
{
int a=3,s;
s=f(a);
s=s+f(a);
printf("%d\n",s);
}
int f(int n)
{
static int a=1;
n+=a++;
return n;
}
程序运行以后的输出结果是( )。
A.7
B.8
C.9
D.10
【答案】C
【解析】在函数f中,整型变量a为静态变量,所以每次调用函数f时不再为a重新赋值,而且a的值只有在程序结束时才被释放。第一次调用f后n=4,a=2,s=4;第二次调用时,a初值为2,调用后,a=3,n=5,s=4+5=9,所以输出结果为9。答案选择C选项。
20有以下程序:
#include <stdio.h>
main()
{
int c=0,k;
for(k=1;k<3;k++)
switch(k)
{
default:c+=k;
case 2:c++;break;
case 4:c+=2;break;
}
printf("%d\n",c);
}
程序运行后的输出结果是( )。
A.3
B.5
C.7
D.9
【答案】A
【解析】程序进入for循环后,首先k=1,执行default语句,c变为1。由于default语句之后没有break语句,因此继续执行case 2,c变为2,之后执行break语句跳出本次循环。下次循环k=2,直接执行case 2,c自增为3后跳出本次循环。k=3时for循环结束,最后输出3。答案选择A选项。
21有三个关系R,S和T如下:
其中关系T由关系R和S通过某种操作得到,该操作为( )。
A.选择
B.投影
C.交
D.并
【答案】D
【解析】选择和投影操作对单个关系进行操作,选择运算是对行的操作,投影运算是对列的操作。交和并运算要求参与运算的表具有相同的属性,交运算的结果是两个表的公共部分,并运算的结果包含两个表的所有元素。观察三个关系的元组可知,关系T=R∪S。答案选择D选项。
22下面是有关C语言字符数组的描述,其中错误的是( )。
A.不可以用赋值语句给字符数组名赋字符串
B.可以用输入语句把字符串整体输入给字符数组
C.字符数组中的内容不一定是字符串
D.字符数组只能存放字符串
【答案】D
【解析】C语言中,字符数组可以用来存放单个的字符或者字符串。答案选择D选项。
23若有定义语句:
int a[4][10],*p,*q[4];
且0≤i<4,则错误的赋值是( )。
A.p=a
B.q[i]=a[i]
C.p=a[i]
D.p=&a[2][1]
【答案】A
【解析】二维数组名是指向指针的指针,所以a和q都为指向指针的指针,而p为指向int类型的指针,p和a不同类型,故A选项中p=a赋值语句错误。其余选项可以正确赋值,其中D项是用取地址符&返回整数的地址,然后赋值给p。所以答案选择A选项。
24以下程序段中,与语句:
k=a>b?(b>c?1:0):0;
功能相同的是( )。
A.
if((a>b) && (b>c)) k=1;
else k=0;
B.
if((a>b) || (b>c)) k=1;
else k=0;
C.
if(a<=b) k=0;
else if(b<=c) k=1;
D.
if(a>b) k=1;
else if(b>c) k=1;
else k=0;
【答案】A
【解析】三元运算符表达式的形式为:表达式1?表达式2:表达式3,当表达式1的值为真时,结果为表达式2的值;当表达式1的值为假时,结果为表达式3的值。首先判断a、b的关系:①如果a>b,执行语句(b>c?1:0);判断b、c的关系,如果b>c,k=1,否则k=0;②如果a≤b,则k=0。综上所述:当a>b且b>c时,k=1,否则k=0,与A项语句功能相同。答案选择A选项。
25若有定义语句:
int x=10;
则表达式x-=x+x的值为( )。
A.-20
B.-10
C.0
D.10
【答案】B
【解析】单目加运算符优先级高于赋值运算符,所以先做x+x结果为20,再做x-20,结果为-10,然后赋值给x。所以答案选择B选项。
26有以下程序:
#include <stdio.h>
main()
{
char s[]={"012xy"};
int i,n=0;
for(i=0;s[i]!='\0';i++)
if(s[i]>='a'&&s[i]<='z')n++;
printf("%d\n",n);
}
程序运行后的输出结果是( )。
A.0
B.2
C.3
D.5
【答案】B
【解析】程序中main函数的作用就是判断字符串s中小写字母的个数,显然结果为2。答案选择B选项。
27下列选项中不属于结构化程序设计原则的是( )。
A.可封装
B.自顶向下
C.模块化
D.逐步求精
【答案】A
【解析】结构化程序设计的基本原则包括:①模块化;②自顶向下;③逐步求精;④限制使用goto语句。可封装是面向对象的设计思想。答案选择A选项。
28有以下程序:
#include <stdio.h>
main()
{
char c1,c2;
c1='A'+'8'-'4';
c2='A'+'8'-'5';
printf("%c,%d\n",c1,c2);
}
已知字母A的ASCII码为65,程序运行后的输出结果是( )。
A.E,68
B.D,69
C.E,D
D.输出无定值
【答案】A
【解析】C语言中每个字符都对应一个ASCII码值,该值可以用来运算。本题中main函数将字符A经过加四和加三运算后分别赋值给c1、c2,则c1='E',c2='D',然后将c1按字符格式输出,c2按整型格式输出。答案选择A选项。
29算法的空间复杂度是指( )。
A.算法在执行过程中所需要的计算机存储空间
B.算法所处理的数据量
C.算法程序中的语句或指令条数
D.算法在执行过程中所需要的临时工作单元数
【答案】A
【解析】算法的空间复杂度是指算法在执行过程中所需要的计算机存储空间。包括算法程序所占空间,输入的初始数据所占空间和执行过程中所需要的额外空间。答案选择A选项。
30以下叙述中正确的是( )。
A.程序设计的任务就是编写程序代码并上机调试
B.程序设计的任务就是确定所用数据结构
C.程序设计的任务就是确定所用算法
D.以上三种说法都不完整
【答案】D
【解析】程序设计是指设计、编程、调试程序的方法和过程,通常分为4个阶段:①问题建模;②算法设计;③编写代码;④编译调试。其工作内容涉及有关的基本概念、工具、方法及方法学,是目标明确的智力活动。答案选择D选项。
31下列数据结构中,能够按照“先进后出”原则存取数据的是( )。
A.循环队列
B.栈
C.队列
D.二叉树
【答案】B
【解析】栈和队列都是操作受限的线性表:栈只能在栈顶插入和删除元素,按照“先进后出”的原则组织数据;队列只能在队头删除元素,在队尾插入元素,按照“先进先出”的原则组织数据。B项,栈,按照“先进后出”的原则组织数据。A项,循环队列是队列的一种特殊形式,按照“先进先出”的原则组织数据;C项,队列,按照“先进先出”的原则组织数据。D项,二叉树属于非线性结构。答案选择B选项。
32有以下程序:
#include <stdio.h>
main()
{
int a=1,b=0;
printf("%d,",b=a+b);
printf("%d\n",a=2*b);
}
程序运行后的输出结果是( )。
A.0,0
B.1,0
C.3,2
D.1,2
【答案】D
【解析】main函数先为a、b赋值,然后做运算a+b结果赋值给b,此时b为1,并将b打印出来。接着做运算2*b结果为2*1=2赋值给a,将a打印出来,所以最终的输出结果为1,2。答案选择D选项。
33以下选项中,能用作用户标识符的是( )。
A.void
B.8_8
C._0_
D.unsigned
【答案】C
【解析】标识符是由若干个字符组成的字符序列,用来命名程序的一些实体。C语言定义标识符应遵循以下六种规则:①标识符由字母、数字或下划线组成;②第一个字符必须是字母或下划线;③标识符最多由274个字符组成;④在标识符中严格区分大小写字母;⑥关键字不能作为自定义的标识符在程序中使用。A、D项皆为C语言的关键字,B项第一个字符为数字,错误。答案选择C选项。
34软件设计中划分模块的一个准则是( )。
A.低内聚低耦合
B.高内聚低耦合
C.低内聚高耦合
D.高内聚高耦合
【答案】B
【解析】耦合性和内聚性是模块独立性的两个定性标准。内聚性是一个模块内部各个元素间彼此结合的紧密程度的度量,作为软件结构设计的设计原则,要求每个模块的内部都具有很强的内聚性;耦合性是指模块间相互连接的紧密程度的度量,一个模块与其他模块的耦合性越强则该模块的独立性越弱。一般优秀的软件设计应尽量做到高内聚、低耦合,即减弱模块之间的耦合性和提高模块内的内聚性,有利于提高模块的独立性。答案选择B选项。
35设有以下函数:
void fun(int n,char* s){……}
则下面对函数指针的定义和赋值均是正确的是( )。
A.void (* pf)();pf=fun;
B.void *pf();pf=fun;
C.void * pf(); *pf=fun;
D.void (* pf)(int,char);pf=&fun;
【答案】D
【解析】函数指针的一般定义形式为:
返回值类型 (* 指针变量名) ([形参列表]);
其中,“返回值类型”说明函数的返回类型,“(* 指针变量名)”中的括号不能省,括号改变了运算符的优先级。若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,后面的“形参列表”表示指针变量指向的函数所带的参数列表。
以本题函数和函数指针为例,将函数的首地址赋给指针,可以是pf=fun;或者pf=&fun;。
选项A,参数列表与题干函数不符,错误。选项B,函数指针定义格式错误。选项C。函数指针定义格式错误,复制格式也错误。答案选择D选项。
36下列数据结构中,属于非线性结构的是( )。
A.循环队列
B.带链队列
C.二叉树
D.带链栈
【答案】C
【解析】线性结构要满足两个条件:①有且仅有一个根结点;②每个结点最多有一个前驱,也最多有一个后继。栈和队列均满足这两个条件,属于线性结构;循环队列是一个头结点和尾结点互为前驱结点和后继结点的特殊的队列,属于线性结构;带链队列、带链栈都是用链表形式来实现的,分别满足队列和栈的条件,只是存储结构不连续,属于线性结构。二叉树除了叶子结点外,每个结点都可以有两个后继结点,属于非线性结构。答案选择C选项。
37阅读以下程序:
#include <stdio.h>
main()
{
int case;
float printF;
printf("请输入2个数:");
scanf("%d %f",&case,&printF);
printf("%d %f\n",case,printF);
}
该程序编译时产生错误,其出错原因是( )。
A.定义语句出错,case是关键字,不能用作用户自定义标识符
B.定义语句出错,printF不能用作用户自定义标识符
C.定义语句无错,scanf不能作为输入函数使用
D.定义语句无错,printf不能输出case的值
【答案】A
【解析】在C语言中,关键字又称保留字,它是系统预先定义的,具有特定含义的标识符,故不允许用户重新定义。case为C语言中的关键字,因此用户不能再定义标识符为case的变量。答案选择A选项。
38在E-R图中,用来表示实体联系的图形是( )。
A.椭圆形
B.矩形
C.菱形
D.三角形
【答案】C
【解析】在E-R图中,菱形表示联系,矩形表示实体,椭圆形表示属性。答案选择C选项。
39设有定义:
int a=1,b=2,c=3;
以下语句中执行效果与其他三个不同的是( )。
A.if(a>b)c=a,a=b,b=c;
B.if(a>b){c=a,a=b,b=c;}
C.if(a>b)c=a;a=b;b=c;
D.if(a>b){c=a;a=b;b=c;}
【答案】C
【解析】C语言中if语句后面只跟一条语句时,可以省略大括号。即if语句仅作用于紧随其后的那条语句或者是复合语句的内容,所以A项,执行三条语句组成的复合语句;BD两项执行大括号中的三条语句;而C项只执行c=a;。答案选择C选项。
40有以下程序:
#include <stdio.h>
main()
{
int n=2,k=0;
while(k++&&n++>2);
printf("%d %d\n",k,n);
}
程序运行后的输出结果是( )。
A.0 2
B.1 3
C.5 7
D.1 2
【答案】D
【解析】(表达式1)&&(表达式2)中,如果表达式1为假或0,那么表达式2就不会被执行。程序首先进入while的判断语句,执行k++和n++。k++为零,不满足循环条件,所以n++不会被执行,while循环结束后,k自增为1,n没有进行运算,仍为2。答案选择D选项。
二、程序填空题(共18分)
N个有序整数数列已放在一维数组中,给定下列程序中,函数fun()的功能是:利用折半查找法查找整数m在数组中的位置。若找到,则返回其下标值;反之,则返回“Not be found!”。
折半查找法的基本算法是:每次查找前先确定数组中待确定的范围:low和high(low<high),然后把m与中间位置(mid)中元素的值进行比较。如果m的值大于中间位置元素中的值,则下一次的查找范围放在中间位置之后的元素中;反之,下次查找范围落在中间位置之前的元素中。直到low>high,查找结束。
注意:
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。
【试题源程序】
#include<stdio.h>
#define N 10
int fun(int a[],int m)
{
int low=0,high=N-1,mid;
while(low<=high)
{
/**********found**********/
mid= ①______;
if(m<a[mid])
/**********found**********/
high= ②______;
else if(m>a[mid])
low=mid+1;
else
return(mid);
}
/**********found**********/
③______(-1);
}
main()
{
int i,a[N]={-3,4,7,9,13,24,67,89,100,180},k,m;
printf("a数组中的数据如下:");
for(i=0;i<N;i++)printf("%d ",a[i]);
printf("Enter m:");
scanf("%d",&m);
k=fun(a,m);
if(k>=0)
printf("m=%d,index=%d\n",m,k);
else
printf("Not be found\n");
}
答:
①(low+high)/2
②mid-1
③return
【解析】
填空1:此处要确定折半查找的中间位置,所以应该填(low+high)/2,这个式子的运算结果为整型数据。
填空2:由折半查找的算法可得,中间的元素值大,则应该选择前半段进行查找,所以此处应该把mid前一位的下标赋值给high。
填空3:由算法可以看出,此处应该是执行完毕,仍然没有找到满足条件的元素,此时应当返回-1,所以使用关键字“return”。
三、程序修改题(共18分)
下列给定程序中,函数fun()的功能是计算并输出high以内的素数之和。high由主函数传给fun( )函数。例如:若high的值为100,则函数的解为1060。
请改正程序中的错误,使它能得到正确结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构。
【试题源程序】
#include<conio.h>
#include<stdio.h>
#include<math.h>
int fun(int high)
{
int sum=0,n=0,j,yes;
while(high>=2)
{
yes=1;
for(j=2;j<=high/2;j++)
/**********found**********/
if high%j==0
{
yes=0;
break;
}
/**********found**********/
if(yes==0)
{
sum+=high;
n++;
}
high--;
}
return sum;
}
main()
{
printf("%d\n",fun(100));
}
答:
(1)错误:if high%j==0
正确:if(high%j==0)
(2)错误:if(yes==0)
正确:if(yes)
【解析】fun函数的功能是:用while循环查找high以内的素数。通过for循环判断一个数是否为素数;用变量n记录素数的个数;用return返回素数之和sum。
错误1:if语句的两侧要加括号。
错误2:yes为1时,说明被判断的数是素数,要累加到sum。
四、程序设计题(共24分)
请编写函数fun,其功能是:计算并输出3到n之间(含3和n)所有素数的平方根之和。例如,在主函数中从键盘给n输入100后,输出为:sum=148.874270。
注意:
要求n的值大于2但不大于100。部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
【试题源程序】
#include <math.h>
#include <stdio.h>
double fun(int n)
{
}
main()
{
int n;
double sum;
printf("\n\nInput n: ");
scanf("%d",&n);
sum=fun(n);
printf("\n\nsum=%f\n\n",sum);
}
答:
double fun(int n)
{
int i,j=0;
double s=0;
for(i=3;i<=n;i++)
{
int flag=1;
for(j=2;j<=i/2;j++)
if(i%j==0)
{
flag=0;
break;
}
if (flag)
s=s+sqrt(i);
}
return s;
}
【解析】程序是计算并输出3到n之间(含3和n)所有素数的平方根之和,所以fun应当具有判断一个数是否为素数的功能,可以利用sqrt()函数求一个数的平方根。