试题一 1. 阅读以下说明和流程图,将应该填入______处的字句填写完整。
[说明]
求连续函数f(x)的根(方程f(x)=0的解)的最简单方法是二分法。为此,首先需要在若干点上检查函数值的符号,如果发现f(a)与f(b)符号相反(a<b),则在区间(a,b)中必然存在f(x)的根。因为当x从a变到b时,连续函数的值将从正变到负(或从负变到正),必然要经过0。区间(a,b)就是根的初始范围。
取该区间的中点m,如果f(m)=0,则根就是m。如果f(a)与f(m)符号相反,则根一定在区间(a,m)中;如果f(m)与f(b)符号相反,则根一定在区间(m,b)中。因此,根的范围缩小了一半。
依此类推,将区间一半一半地分下去,当区间的长度很小(达到根的精度要求,例如0.001)时,或者当区间中点处的函数值几乎接近于0(即绝对值小于预先规定的微小量,例如0.001)时,近似计算就可以结束了。
以下流程图描述了用二分法近似计算区间(a,b)中f(x)的根的过程。
[流程图]
(1)(a+b)/2,或其等价表示 (2)f(x),或f((a+b)/2),或其等价表示 (3)|y|,或abs(y) 其中y可由f(x)或f((a+b)/2)代替 (4)b (5)a
[解析] 本题描述了求函数根(0点)的二分法,题中还详细说明了二分法的原理。 假设a和b是区间两端点值的变量。流程图中,一开始就将函数两端的值分别送y1和y2,接着判断y1与y2符号是否相反(同号时该算法不能往下进行)。若相反,则应将a与b的中点值(a+b)/2送x。此时的函数值f(x),即f((a+b)/2)应送y。因此,第一空处应填“(a+b)/2”,第二空处可填“f(x)”或“f((a+b)/2)”。 接着需要判断新的函数值是否已经接近0,因此,第三空处应填“|y|”或“abs(y)”。 如果这个新函数值已经接近0,则可以直接输出变量x的值(刚取的中点值)作为函数的近似根;如果该函数值尚未接近0,则需要将该区间进行二分,即需要判断选用左半区间还是右半区间,继续进行迭代计算。 如果y*y1<0,则说明新的函数值与原区间的左端函数值符号相反,因此应取左半区间,否则应取右半区间。 若取左半区间,则原来的区间左端点a没有变化,左端点的函数值y1也没有变化,只要将中点值x送右端点变量b就可以。因此,第四空处填“b”。 若取右半区间,则区间的右端点没有变化,右端点的函数值y2也没有变化,这时需要将中点值x送左端点变量a。因此,第五空处应填“a”。由于每次迭代都需要判断y*y1的符号,因此y1的改变将影响下次迭代。因此,此时还需要将中点处的函数值y送y1,作为新区间的左端点函数值。 当新的区间(a,b)长度b-a很小时,迭代计算就可以结束,输出已经得到的近似根x就可以了。
试题二 1. 阅读以下函数说明和C语言函数,将应填入______处的字句填写完整。
[说明]
设有n个人围坐一圈并按顺时针方向从1到n编号,从第s个人开始进行1到m的报数,报数到第m个人,则此人出圈,再从他的下一个人重新开始1到m的报数,如此进行下去,直到所有的人都出圈为止。
现要求按出圈次序,每10人一组,给出这n个人的顺序表。
设n=100,s=1,m=10。
(1)将1到n个人的序号存入一维数组p中;
(2)若第i个人报数后出圈,则将p置于数组的倒数第i个位置上,而原来第i+1个至倒数第i个元素依次向前移动一个位置;
(3)重复第(2)步,直至圈中只剩下p[1]为止。
[函数]
#include<stdio.h>
#define N 100
#define S 1
#define M 10
void main()
{
int p[100],n,s,m;
m=M;
n=N;
s=S;
int i,j,s1,w;
s1=s;
for(i=1;______;i++)
______=i;
for(i=n;i>2;i--)
{
s1=______;
if(s1==0)s1=i;
w=______;
for(j=s1;j<i;j++)
p[j-1]=p[j];
p[i-1]=______;
printf("%4d",p[i])}
}
(1)i<=n (2)p[i-1] (3)(s1+m-1)%i (4)p[s1-1] (5)w
[解析] 题目中给出了n个人出圈问题的具体实现方法,要求用C语言来实现,结合题目中给出的方法,我们来具体分析程序。 第1空是循环的判断条件,根据题目的要求和程序来看,这个循环应该用来把n个人的编号存放到数组p中,总共是n个人,那么循环上界应该是n,从程序中可以知道循环变量是i,因此此空答案为“i<=n”。 第2空在循环体中,从上面的分析已经知道,这个循环实现将n个人的编号存放到数组p中,第一个人的编号应该存放到数组下标为0的位置,而第二个人的编号就存放到数组下标为1的位置,依此类推。因此此空答案为“p[i-1]”。 第3空在另一个循环体中,结合整个程序来看,不难推断出此循环体应该用来实现题目中的第二个与第三个要求。此空是用来给变量s1赋一个值,从后面的程序中可以推断出,变量s1中存放的是判断当前报数的人是否该出圈,如果为0,则出圈,因此此空答案为“(s1+m-1)%i”。 第4空是给一个变量w赋一个值,从此空上面的程序我们知道找到了要出圈的人,根据题目要求,应将出圈人的编号置于数组的倒数第i个位置上,在将其存放到倒数第i个位置时肯定要移动数组中的元素,而元素的移动是以当前位置为前提的,那么需要将当前位置人的编号先保存到变量w中,而当前位置人的编号存放在数组p[s1-1]中,因此此空答案为“p[s1-1]”。 第5空很明显是给p[i-1]赋一个值,而p[i-1]正好是数组的倒数第i个位置,应该用来存放当前出圈人的编号,而编号在变量w中,因此此空答案为“w”。
试题三 1. 阅读以下函数说明和C语言函数,将应填入______处的字句填写完整。
[说明]
给定函数fun的功能是:将从键盘上输入的每个单词的第一个字母转换为大写字母,输入时各单词必须用空格隔开,用“.”结束输入。
[函数]
int fun(char*c,int status)
{
if(______=='')
return 1;
else
{
if(______&&______&&______)
______='A'-'a';
return 0;
}
}
main()
{
int flag=1;
char ch;
printf("请输入一字符串,用点号结束输入!\n");
do{
ch=getchar();
flag=fun(&ch,flag);
putchar(ch);
}while(ch!='.');
printf(!"\n");
}
(1)*c (2)status (3)*c<='z' (4)*c>='a' (5)*c+
[解析] 本题考查在C语言中对字符串的处理。 题目要求程序将从键盘上输入的每个单词的第一个字母转换为大写字母,而输入的各单词必须用空格隔开,用“.”结束输入。要实现这个功能,关键之一在于如何取出单词中的第一个字母,关键之二是如何实现大小写字母的转换。 第1空是一个条件判断语句的条件,如果条件成立,则返回1,而从程序中可以看出,此条件判断语句是判断当前取到的字符是否等于空格字符。从主函数中可以看到,每次在调用功能函数fun()前都从输入的字符串中取出一个字符,并存放在变量ch中,而在调用函数时是将变量ch的地址传递给了指针变量c,因此此空的答案为“*c”。 第2空、第3空和第4空应该结合起来看,它们都是条件判断语句的条件,这个条件判断语句下面的程序是将一个小写字母改变成一个大写字母,根据题目要求,此条件判断语句的条件应该是判断当前取到的字母是一个单词的第一个字母且是一个小写字母,再结合主函数来看,我们不难发现单词的第一个字母用一个标记变量flag标识,如果是第一个字母,这个标记变量flag的值为1,否则为0。要判断一个字母是否是小写字母,应该判断其ASCII码值是否在a与z的ASCII码值之间。所以这3个空的答案应该分别为“status”、“*c<='z'”、“*c>='a;”。 第5空是在上面条件成立的情况下执行的一条语句,条件成立我们在上面已经分析过了,表明当前取到的字符是一个单词的第一个字母且是小写字母,此空所在语句的任务是将小写字母变成大写字母,根据上面的分析,因此可以得到此空答案为“*c+”。
试题四 1. 阅读以下函数说明和C语言函数,将应填入______处的字句填写完整。
[说明]
编写程序,生成一个新文本文件,它由一个已知文本文件的所有偶数行组成。要求已知文本文件名和新文本文件名均从键盘输入。请填空完善程序。
[C语言程序]
#include<stdio.h>
main()
{
FILE*oldf,*newf;
char ch,fname[20];
int i;
do{
printf("Enter name of existed text file to be read:");
scanf("%s",fname);
if((oldf=fopen(fname,"r"))==NULL)
printf("File%s can't open!\n",fname);
}while(oldf==NULL);
do{
printf("Enter mane of new text file to be written:");
scanf("%s",fname);
if((______==NULL)
printf("File%s can't open!\n",fname);
}while(______);
i=1;
while(!feof(oldf))
{
while((ch=fgetc(oldf))!=______)
{
if(i%2==______)
fputo(ch,newf);
}
fputc('\n',newf);
______;
}
fclose(oldf);
fclose(newf);
}
(1)newf=fopen(fname,"w") (2)newf==NULL (3)'\n' (4)0 (5)i=i+1或i++
[解析] 本题考查用C语言实现对文本文件的操作。 题目要求程序生成一个新文本文件,它的内容由一个已知文本文件的所有偶数行组成,而已知文本文件名和新文本文件名均从键盘输入,题目的关键在于对文件的操作。下面来具体分析代码。 第1空在一个循环体中,是条件判断语句的条件,此循环的作用我们不难从程序中看出,是用来打开新文本文件的,在C语言中要打开一个文件应该用函数fopen(),它的两个参数分别是其文件名和对文件操作的属性,根据题目意思,对这个文件的操作只有写操作。因此,此空答案为“newf=fopen(fname,"w")”。 第2空是一个循环的判断条件,上面我们已经分析了该循环的作用,是用来打开新文本文件的,结合第一个文件的打开程序,我们很容易发现此空的答案为“newf==NULL”。 第3空是一个二重循环第二层循环的判断条件,这个二重循环的作用是用来实现将已知文本文件的所有偶数行内容写到新文件中,这里需要注意每次取到的内容都是偶数行的内容,在对已知文本文件进行取内容时是逐行取的,那么条件判断语句是用来判断是否取完了一行内容,在C语言中,一般用换行符'\n'来标志一行的结束,因此此空答案为“'\n'”。 第4空是循环下条件判断语句的条件,根据题目要求可以知道每次对新文件进行写的数据都是已知文本文件的偶数行的内容,那么在写之前应该首先判断内容是否是偶数行的内容。此空所在语句就是用来实现这一功能的,而偶数对2取余的结果都为0,因此此空答案为“0”。 第5空是二重循环的最后一条语句,在上面的空中我们已经分析到,在对新文件进行写内容时要首先判断其内容所在行是否为偶数行,而当前行号存放在变量i中,整个程序都没有改变变量i的值,那么此空应该是用来改变变量i的值的,因此此空答案为“i++”。
试题五 1. 阅读以下说明,以及用C++在开发过程中所编写的程序代码,将应填入______处的字句填写完整。
[说明]
在下面函数横线处填上适当的字句,使其输出结果为:
构造函数.
构造函数.
1,2
5,6
析构函数
析构函数.
[C++代码]
#include"iostream.h"
class AA
{public:
AA(int i,int j)
{A=i;B=j;
cout<<“构造函数.\n";
}
~AA(){______;}
void print();
private:
int A,B;
};
void AA::print()
{cout<<A<<","<<B<<endl;}
void main()
{
AA*al,*a2;
______=new AA(1,2);
a2=new AA(5,6);
______;
a2-->print();
______a1;
______a2;
}
(1)cout<<"析构函数.\n" (2)a1 (3)a1->print() (4)delete (5)delete
[解析] 本题考查用C++语言对输出的实现。 题目中没有什么条件,只给出了输出结构,要求程序能实现这个输出。下面来具体分析代码。 第1空很明显是类AA的析构函数的函数体,类的析构函数一般在撤销一个对象时调用,根据题目的要求,要输出析构函数这样的结果,而在程序中没有与此相关的操作,那么此空应该是用来实现这个功能的,借鉴构造函数中的内容,我们很容易就得出此空答案为“cout<<"析构函数.\n"”。 第2空在主函数中,很明显此空所在的语句是创建一个AA类的对象,并让一个AA型的指针变量指向这个对象。在函数开始的时候声明了两个AA型的指针变量a1和a2,而a2在下面已经有了值,那么这里只有用变量a1,因此此空答案为“a1”。 第3空是在创建了两个对象后执行的语句,根据程序不难推断出,这里应该要实现对象a1的数据输出,那么就要调用函数print(),因此此空答案为“a1->print()”。 第4空所在的语句是在实现了构造函数与数据输出后执行的语句,从题目要求来分析,这里应该要调用对象的析构函数来输出“析构函数”这样一个结果,上面我们已经分析到了对象的析构函数一般在撤销对象时调用。从对象的执行过程来分析,在对象的所有处理完成后也应该撤销对象来释放所占的资源,那么此空的任务应该是用来撤销a1对象,在C++中一般用关键字delete,因此此空答案为“delete”。 第5空和第4空的情况一样,因此此空答案为“delete”。