试题一
1、阅读以下说明和流程图,填补流程图中的空缺处,将解答填写完整。
[说明]
下面的流程图采用公式ex=1+x+x2/2!+x3/3!+x4/4!+…+xn/n!+…计算ex的近似值。
设x位于区间(0,1),该流程图的算法要点是逐步累积计算每项Xn/n!的值(作为T),再逐步累加T值得到所需的结果S。当T值小于10-5时,结束计算。
[流程图]
试题二
2、阅读以下函数说明和C语言函数,将应填入______处的字句填写完整。
[程序2.1说明]
已知一个排好序的数组,现输入一个数,要求按原来的顺序规律,将它插入到数组中。
[程序2.1]
#include<stdioh>
#define N 100
void main()
{
float a[N+1],x;
int i,p;
printf("输入已经排好序的数列:");
for(i=0;i<N;i++)
scanf(%f",&a[i]);
printf("输入要插入的数:");
scanf("%f",&x);
for(i=0,p=N;i<N;i++)
if(x<a[i])
{
______
break;
}
for(i=N-1;i>=p;i--)
______
______
for(i=0;i<=N;i++)
printf("%f\t",a[i]);
}
[程序2.2说明]
本程序用变量count统计文件中字符的个数。
[程序2.2]
#include<stdio.h>
#include<stdlib.h>
void main()
{
FILE *fp;
long count=0;
if((fp=fopen("letter.txt","r"))==NULL)
{
printf("can not open file\n");
exit(0);
}
while(lfeof(fp))
{
______
count++;
}
printf("count=%d\n",count);
______
}
试题三
3、阅读以下说明和C语言程序,将应填入______处的字句填写完整。
[说明]
Fibonacci数列A={1,1,2,3,5,8,…)有如下性质:
a0=a1=1
ai=ai-1+ai-2, i>1
对于给定的n,另外有一个由n个元素组成的数列xn,该数列中各元素的值为:
xi=ai/ai+1,i=0,1,…,n
现要求对xn中的元素按升序进行排序,然后以分数形式输出排序后的xn。例如n=5时,排序前的xn={1/1,1/2,2/3,3/5,5/8},排序后的xn={1/2,3/5,5/8,2/3,1/1}。程序中函数make()首先生成排序前的xn,然后调用函数sort()进行排序,最后输出所求结果。
[程序]
#include<sldio.h>
#include<stdlib.h>
#include<malloc.h>
struct fact
{
long m,n;
};
void sort(int n,struct fact*p)
{
int a;
long s,t,u,v;
struct fact*q,*end;
for(end=p+(n-1),a=1;a;end--)
for(a=0,q=p;q<end;p++)
{
s=q->m;
t=q->n;
u=(q+1)->m;
v=(q+1)->n;
if(______)
{
q->m=u;
______
______
(q+1)->n=t;
a=1;
}
}
}
vloid make(int n)
{
int i;
long a,b,c;
struct fact*x,*y;
x=(struct fact*)malloc(sizeof(struct fact)*n);
x->m=1;
x->n=1;
for(a=1,b=1,i=2;i<=n;i++)
{
______
a=b;
b=c;
(x+(i-1))->m=a;
(x+(i-1))->n=b;
}
______
printf("x%d={%1d/%1d",n,x->m,x->n);
for(y=x+1;y<x+n;y++)
printf(",%1d/%1d",y->m,y->n);
printf("}\n");
free(x);
}
void main()
{
int n;
printf("input n:");
scanf("%d",&n);
make(n);
}
试题一答案:
1、(1)S (2)x/n (3)T<0.00001 (4)S+T (5)n+1→n
[解析] 本题属于简单的数值计算应用。
人们经常需要近似计算初等函数的值。在计算机内部,近似计算初等函数的值最常用的方法就是将初等函数按幂级数展开,再计算前若干项的和,直到计算误差满足要求为止。
在设计算法时应考虑,对于自变量的大致范围,如何展开级数,使级数收敛的速度比较快,在计算过程中,怎样估计计算的误差是否己经满足要求。
由于初等函数在计算机中需要频繁使用,因此设计高效率的算法非常重要。这种精益求精的设计是全世界许多专家已经反复探索并实现了的。
对于一般程序员来说,只要求基本的、正确的算法设计,并实现编程就可以了。
本题中,为了计算指数函数ex的值,已经给出了基本的算法,以及计算过程中控制误差终止计算的方法。本题主要的重点是如何设计计算流程,实现级数前若干项的求和,以及判断终止计算的条件。
级数求和通常采用逐项累加的方法。设S为累加的结果,T为动态的项值,那么,S+T→S就能完成各项的累加。
由于本题中T=xn/n!,如果每次都直接计算该项的值,则计算量会很大。这种项的特殊性表明,后一项与前一项有简单的关系Tn=Tn-1*x/n。充分利用前项的计算结果则会大大减少计算量。这是程序员需要掌握的基本技巧。
在本题的流程图中,一开始先输入自变量x,接着对一些变量赋初值。变量n与T需要赋初值,对变量S也应赋初值。级数项号n的初值为1,逐次进行累积的T也应有初值1,逐次进行累加的S则应有初值0或级数第1项的值1。从随后的流程看,S应有初值1,本题第一空填“S”。
项值T的累积公式应是T*x/n→T,所以本题中第二空应填“x/n”。
流程图中第三空处为判断计算过程结束的条件,按照题中的要求,当T<10-5时计算过程结束,因此,第三空处应填“F<0.00001”。
流程图中第四空处需要累加S,实现S+T→S,因此,第四空处应填“S+T”。
流程图中第五空处应对级数的项号n进行自增,因此,第五空处应填“n+1→n”。
试题二答案:
2、 (1)p=i; (2)a[i+1]=a[i]; (3)a[p]=x;
(4)fgetc(fp); (5)fclose(fp);
[解析] 本题考查在C语言中实现对数组的插入和对文件中字符个数的统计。
我们先来看程序2.1。题目要求在程序2.1中实现在排好序的数组中插入一个数,但不能改变数组中数字排序的规律。由于数组是已经排好序的,它有可能是按不递减的方法排序,也有可能是按不递增的方法排序。在插入时,从数组中第一个数开始,逐个进行比较,直到找到比其大或相等的数,在其前面进行插入,在插入前应该先将数组中的元素逐个后移。
下面我们来看代码。代码中有三个循环,第1空在第一个循环体下面的条件判断语句里,条件判断语句是判断要插入的数x与数组中元素的大小,如果数x小于数组中的元素,就执行第1空的语句。从上面的分析,再结合第二个循环语句的条件,我们可以知道,此空的作用是记录数要插入的位置,并把这个结果存放在变量p中,所以,答案为“p=i;”。
第2空所在的位置是第二个循环体下面,根据分析,要完成的任务应该是将数组中要插入位置后的元素逐个往后移动。所以,此空的答案为“a[i+1]=a[i];”。
在完成了上述两空之后,再结合整个程序来看,很明显还有一个功能没有完成,那就是插入数x,第3空就是用于完成这个任务的。由于在代码的前面已经记录下了要插入的位置,所以,此空答案为“a[p]=x;”。
在程序2.2中,题目要求完成的任务是用变量count统计文件中字符的个数,要实现对文件中字符个数的统计,首先需要我们判断出哪些是字符,这就涉及C语言中对文件中字符的判定。此外,还需要我们掌握对文件的基本操作。
下面,我们来看程序2.2的代码。首先用一个条件判断语句来打开一个文件,如果打开成功,则执行下面的while循环语句,循环体的功能是对文件中的内容逐个判断,如果是字符,则统计变量count加1,因此,第4空的功能就是要找出文件中的所有字符。这里没有条件判断语句来判断是否是字符,需要用到C语言中对文件处理的一个函数fgetc(),其作用是可以取出文件中所有的字符,因此,此空答案为“fgetc(fp)”。
第5空在代码的最后面,如果我们对文件操作很熟悉的话,不难发现文件在打开后还没有关闭,此空要实现的功能是关闭文件,因此,此空答案为“fclose(fp)”。
试题三答案:
3、(1)s*v>=t*u (2)q->n=v; (3)(q+1)->m=s;
(4)c=a+b; (5)sort(n,x);
[解析] 本题考查在C语言中实现对数列的排序。
题目要求我们对xn中的元素按升序进行排序,然后以分数形式输出排序后的xn,程序中函数make()用来生成排序前的xn,而使用函数sort()进行排序。在生成排序前的xn以前,我们应该仔细理解题目中给出的生成规则。
首先,我们来看函数sort(),此函数的功能是排序。在函数体中我们可以看到它是用双重循环来实现对数列元素排序的,从整个函数我们可以分析出它排序的方法是从数列中找出一个最大的数存放到数列的最后面,在下次循环时,再从剩下的部分找出其最大的数存放到剩下部分的最后面,这样直到整个数列排好序。
第1空是一个条件判断语句的条件,在第二重循环下面,根据上面的分析,该循环的作用是在数列中找出最大的数,那么,这个条件判断语句应该是判断相临两个数的大小,再结合程序中的内容,此空的答案应该是“s*v>=t*u”。
第2空和第3空是条件判断语句结果为真的情况下执行的语句,如果条件为真,则说明前面的数要大于后面的数。而根据上面的分析,要将较大的数放到后面位置,以方便下次和再后面的数比较,因此,这两个空的作用是要实现对两个数位置的交换,答案应该分别为“q->n=v;”和“(q+1)->m=s;”。
接着,我们来看函数make(),它的功能是用来生成排序前的xn,在生成数列时,我们应该注意Fibonacci数列的性质,它的每一项等于前两项的和。在函数体中,我们可以发现第一个循环体就是用来生成排序前的xn的。第4空就在循环体内,我们仔细看代码,就可以发现变量c没有初值,但后面又把变量c的值赋给了变量b,因此,第4空应该是给变量c赋初值,但应该给它一个什么样的初值呢?结合Fibonacci数列的性质ai=ai-1+ai-2,我们很容易知道变量c存放的就是ai的值。因此,此空答案为“c=a+b;”。
第5空是在循环体下面,上面我们已经说到,循环体生成了排序前的xn,根据题目的要求,应该要调用函数sort()进行排序了,因此,此空答案为“sort(n,x);”。