软考初级

阅读以下说明和流程图,将应填入(n)处的字句写在对应栏内。[说明]下面的流程图用于计算一个英文句子中最长单词的长度(即单词中字母个数)MAX。假设该英文句子中只含字母、空格和句点“.”,其中句点表示结尾,空格之间连续的字母串称为单词。[流程图]

题目

阅读以下说明和流程图,将应填入(n)处的字句写在对应栏内。

[说明]

下面的流程图用于计算一个英文句子中最长单词的长度(即单词中字母个数)MAX。假设该英文句子中只含字母、空格和句点“.”,其中句点表示结尾,空格之间连续的字母串称为单词。

[流程图]

参考答案和解析
正确答案:(1)MAX←0 (2)←L+1 (3)MAX←L (4)≠ (5)L←0
(1)MAX←0 (2)←L+1 (3)MAX←L (4)≠ (5)L←0 解析:本题用到的三个变量及其作用分别为:A,存放输入的一个字符;MAX,存放当前为止最长单词的长度;L,存放当前单同的长度。
(1)使用变量MAX应先赋予初值,由上下文知其初值为0;
(2)读取当前单词时,每读人一个字母,单词长度值L应增1;
(3)当前单词长度L比MAX时,应更新MAX的值;
(4)若当前字符不是句点,应当继续读取字符;
(5)读取下一个单词前,应当重置L的值。
如果没有搜索结果,请直接 联系老师 获取答案。
相似问题和答案

第1题:

试题三(共15分)

阅读以下说明和C函数,填补C函数中的空缺(1)~(6),将解答写在答题纸的对应栏内。

【说明】

函数numberOfwords (char message[])的功能是计算存储在message字符数组中的一段英文语句中的单词数目,输出每个单词(单词长度超过20时仅输出其前20个字母),并计算每个英文字母出现的次数(即频数),字母计数时不区分大小写。

假设英文语句中的单词合乎规范(此处不考虑单词的正确性),单词不缩写或省略,即不会出现类似don't形式的词,单词之后都为空格或标点符号。

函数中判定单词的规则是:

(1)一个英文字母串是单词;

(2) 一个数字串是单词;

(3)表示名词所有格的撇号(')与对应的单词看作是一个单词。

除上述规则外,其他情况概不考虑。

例如,句子“The 1990's witnessed many changes in people's concepts ofconservation”中有10个单词,输出如下:

The

1990's

witnessed

many

changes

in

people's

concepts

of

conservation

函数numberOfijvords中用到的部分标淮库函数如下所述。

【C函数】

int numberOfwords (char message[])

{

char wordbuffer[21],i=0; /*i用作wordbuffer的下标*/

(1) pstr;

int ps[26]={0); /*ps[0]用于表示字母'A'或'a'的频数*/

/*ps[1]用于表示字母'B'或'b'的频数,依此类推*/

int wordcounter=0;

pstr=message;

while (*pstr){

if((2)(*pstr)){/*调用函数判断是否为一个单词的开头字符*/

i=0;

do{/*将一个单词的字符逐个存入wordbuffer[],并对字母计数*/

wordbuffer[i++]=*pstr;

if(isalpha(*pstr)){

if (3) (*pstr))ps[*pstr-'a']++;

else ps[*pstr-'A']++;

}

(4) ; /*pstr指向下一字符*/

}while (i<20&&(isalnum(*pstr)||*pstr=='\"));

if (i>=20) /*处理超长单词(含名词所有格形式)*/

while (isalnum(*pstr)||*pstr=='\"){pstr++;}

(5) ='\0';/*设置暂存在wordbuffepstrr中的单词结尾*/

wordcounter++; /*单词计数*/

puts(wordbuffer); /*输出单词*/

}

(6); /*pstr指向下一字符*/

}

retum wordcounter;

}


正确答案:
(1)char*,或unsigned char*
(2)isalnum,或isalpha(*pstr)||isdigit
(3)islower,或!isupper
(4)pstr++,或++pstr,或pstr=pstr+1,或pstr+=1
(5)wordbuffer[i],或*(wordbuffer+i)
(6)pstr++,或++pstr,或pstr=pstr+1,或pstr+=1

第2题:

试题三(共 15 分)

阅读以下说明和 C 程序,将应填入 (n) 处的字句写在答题纸的对应栏内。


正确答案:

第3题:

阅读下列说明和流程图,将应填入(n)处的语句写在对应栏内。

【说明】

设学生(学生数少于50人)某次考试的成绩按学号顺序逐行存放于某文件中,文件以单行句点“.”为结束符。下面的流程图用于读取该文件,并把全部成绩从高到低排序到数组B[50]中。

【流程图】


正确答案:(1)B[0]←a (2)i←0 (3)a="." (4)aB[j] (5)j--
(1)B[0]←a (2)i←0 (3)a="." (4)aB[j] (5)j-- 解析:本题考查用程序流程图来描述排序。
题目要求将文件中学生的成绩读出,并把全部成绩从高到低排序到数组B[50]中。这里面涉及两个问题,第一是从文件中读数,文件中的数据是以单行句点“.”为结束符的,在未读到此符号前,应该将继续取数据。第二是排序,每取到一个学生的成绩都要与数组的学生成绩比较,按照从高到低的顺序在数组中找到合适的位置存放。下面来具体分析流程图。
第(1)空在条件判断为假的情况下执行流程中,如果条件为假说明从文件中取到的数据是学生成绩。从程序流程图中可以看到,从文件中读的数据存放在变量a中,而此空是第一次取数据,应该存放数组B的第一个位置,因此此空答案为B[0]←a。
第(2)空是紧接着第(1)空来的,在上面已经把从文件中读到的第一个数存放到了数组中,接下来应该处理数组的下标问题,从后面的流程中可以推断出变量i是存放数组当前下标的,而且没有初值,那么此空的任务应该是用来给变量i赋一个初值,而对数组的操作应该从头开始,因此此空答案为i←0。
第(3)空是循环的判断条件,如果条件成立则结束,在这之前又对文件进行了一次读数,根据我们上面的分析只有在读到了结束符时程序才结束,那么此空肯定是判断从文件中读到的数据是否为结束符,因此此空答案为a="."?。
第(4)空也是一个循环的判断条件,如果条件成立,则将取到的数存放到数组的当前下标位置;如果不成立,则循环找到合适的位置再存放。从这里我们不难推断出,流程图中是将从文件取到的成绩与当前数组中的最小成绩进行比较的,而当前数组中的最小成绩存放在位置j中,因此此空答案为aB[i]?。
第(5)空在循环体中,这个循环的作用是为当前从文件中读到的成绩在已经排好序的数组元素中找到合适的位置,找到了就要插入,数组中的元素是按从大到小排列的,在查找合适位置时是从后往前依次比较,因此此空的任务应该是将数组的下标往前移动,所以此空答案为“i--”。

第4题:

阅读下列程序说明和C程序,将应填入(n)处的字句写在对应栏内。

[函数2.1说明]

下面程序的功能是计算x和y的最小公倍数。

[函数2.1]

main()

{ int m,n,d,r;

seanf("%d %d",&m,&n);

if(m<n) {r=m;m=n;n=r;}

(1);

while (d%n! =0) (2);

printf("%d\n",d);

}

[函数2.2说明]

下述程序接收键盘输入,直到句点“.”时结束。输入的字符被原样输出,但连续的空格输入将转换成一个空格。

[函数2.2]

include <stdio.h>

main()

{ char c,preChar='\0';

c = getchar();

while(c! = '.'){

if((3)) putchar(c);

else if(preChar! =' ') putchar(c);

(4);

c=(5);

}

}


正确答案:(1)d=m (2) d+=m或d=d+m (3) c!=‘’ (4) preChar=c (5) getchar()
(1)d=m (2) d+=m或d=d+m (3) c!=‘’ (4) preChar=c (5) getchar() 解析:(1)下文使用了变量d,因此需在此初始化,由下面循环的条件“d%n!=0”知初值不能是n,因此必为m;
(2)此处while循环生成最小公倍数d,其终止条件是n整除d,因此循环过程中需要保证m整除d并且d尽可能地小,于是d应以m为增量递增;
(3)当输入的字符非空格时,原样输出;
(4)程序中变量preChar用于记录上一次读入的字符,循环过程中应不断更新其值;
(5)接收下一个输入。

第5题:

阅读下列说明和流程图,将应填入(n)处的语句写在对应栏内。

【说明】

下列流程图用泰勒(Taylor)展开式y=ex=1+x+x2/2!+x3/3!+…+xn/n!+…计算并打印ex的近似值,其中用ε(>0)表示误差要求。

【流程图】


正确答案:(1)0 (2)0 (3)|t|:ε (4)s+1 (5)t*x/s
(1)0 (2)0 (3)|t|:ε (4)s+1 (5)t*x/s 解析:本题考查程序流程图的内容。
首先让我们来了解一下题目的真正含义,题目要求用泰勒展开式计算y=ex的近似值。并且给出了误差要求,只要当误差小于ε时,就可以输出计算结果了。泰勒展开式的式子是n项之和,每多加一项,其值就越接近真实值。因此,在程序设计时,每加一项之前,先进行此项与ε的比较,来判定计算结果是否已满足题目要求。
从流程图中看到有S、y、t、x这几个变量。其中x、y是公式中的变量,而S、t则是中间变量。从y←y+t语句可以看出,t是每次要加的项,S则是帮助t改变的变量。在计算开始前,我们应该将y的值赋为零,因此,第(2)空答案就为0;而S在t没发生变化的初值也应该是0,即第(1)空答案为0。
第(3)空处是个条件判断语句,应该是进行该加项与ε比较判断,因此第(3)空的答案是|t|:ε。
第(4)空与第(5)空要一起考虑。由于S是帮助t改变的变量,而t的每次改变是分母乘以一个加1的数,而分子乘以x。这里假设S是帮助t改变分母的变量,第(4)空应填s+1,那么第(5)空应该为t*x/s。

第6题:

阅读以下函数说明和C语言函数,将应填入(n)处的字句写在对应栏内。

【说明】

给定函数fun的功能是:将从键盘上输入的每个单词的第一个字母转换为大写字母,输入时各单词必须用空格隔开,用“.”结束输入。

【函数】

int fun(char *c,int status)

{

if((1)=='')

return 1;

else

{

if((2)&&(3)&&(4))

(5)='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+
(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。要判断一个字母是否是小写字母,应该判断其ASCⅡ码值是否在a与z的ASCⅡ码值之间。所以这3个空的答案应该分别为status、*c='z'、*c>='a'。
第(5)空是在上面条件成立的情况下执行的一条语句,条件成立我们在上面已经分析过了,表明当前取到的字符是一个单词的第一个字母且是小写字母,此空所在语句的任务是将小写字母变成大写字母,根据上面的分析,因此可以得到此空答案为*c+。

第7题:

阅读下列说明和流程图,将应填入(n)的字句写在对应栏内。

【说明】

下列流程图(如图4所示)用泰勒(Taylor)展开式

sinx=x-x3/3!+x5/5!-x7/7!+…+(-1)n×x2n+1/(2n+1)!+…

【流程图】

计算并打印sinx的近似值。其中用ε(>0)表示误差要求。


正确答案:(1)x*x (2)x->t (3)│t│:ε (4)s+2->s (5)(-1) * t* x2/(s* (s-1))
(1)x*x (2)x->t (3)│t│:ε (4)s+2->s (5)(-1) * t* x2/(s* (s-1)) 解析:该题的关键是搞清楚几个变量的含义。很显然变量t是用来保存多项式各项的值,变量s和变量x2的作用是什么呢?从流程图的功能上看,需要计算11、3!、5!,……,又从变量s的初值置为1可知,变量s主要用来计算这此数的阶乘的,但没有其他变量用于整数自增,这样就以判断s用来存储奇数的,即s值依次为1、3、5,……。但x2的功能还不明确,现在可以不用管它。
(2)空的作用是给t赋初值,即给它多项式的第一项,因此应填写“x->t”。(3)空处需填写循环条件,显然当t的绝对值小于ε(>0)就表示已经达到误差要求,因此(3)空应填入“│t│:ε”。由变量s的功能可知,(4)空应当实现变量s的增加,因此(4)空应填入“s+2->s”。 (5)空应当是求多项式下一项的值,根据多项式连续两项的关系可知,当前一项为t时,后一项的值为(-1)*t*x*x/(s*(s-1))。但这样的话,每次循环都需要计算一次x*x,计算效率受到影响,联想到变量x2还没用,这时就可以判断x2就是用来存储x*x的值,使得每次循环者少进行一次乘法运算。因此(1)空处应填入“x*x”,(5)空处应填入“(-1)*t*x2/(s*(s-1))”。

第8题:

阅读以下说明和流程图,将应填入(n)处的字句写在对应栏内。

[说明]

设学生某次考试的成绩按学号顺序逐行存放于某文件中,文件以单行句点“.”为结束符。下面的流程图读取该文件,统计出全部成绩中的最高分max和最低分min。


正确答案:(1) max←a (2) min←a (3) a="." (4) a>max或amax或maxa或max≤a (5) amin或a≤min或min>a或mina
(1) max←a (2) min←a (3) a="." (4) a>max或amax或maxa或max≤a (5) amin或a≤min或min>a或mina 解析:本题用到的三个变量及其作用分别为:a,存放读入的一行数据;max存放最高分;min存放最低分。算法首先读入文件的第一行数据a,若a为文件结束符“.”,则算法提前结束;否则为max和min赋初值a,循环读入文件其余部分,直至文件末尾。循环过程中,当某行数据a大于max时,更新max的值;当某行数据a小于min时,更新min的值。

第9题:

阅读以下说明和流程图,将应填入(n)处的字句写在对应栏内。

【说明】

已知头指针分别为La和lb的有序单链表,其数据元素都是按值非递减排列。现要归并La和Lb得到单链表Lc,使得Lc中的元素按值非递减排列。程序流程图如下所示:


正确答案:(1)pa->data=pb->data (2)pc->next=pa (3)pc=pb (4)pb=pb->next (5)pc->next=pa?pa:pb
(1)pa->data=pb->data (2)pc->next=pa (3)pc=pb (4)pb=pb->next (5)pc->next=pa?pa:pb 解析:本题考查程序流程图和有序链表的归并。
题目要求我们归并头指针分别为La和Lb的有序单链表,组成一个新的有序单链表 Lc,而Lc又是指向La的。首先,我们来了解一下单链表的结构。单链表中一般有两个域,一个是数据域,用来存放链表中的数据;另一个是指针域,用来存放指向下个结点的指针。其归并的过程应该是先比较链表La和Lb中第一个元素,将较小的从其链表中取出放到k中,再取下一个结点的值去比较,重复这个过程,直到一个链表被全部取完,再将另一个链表剩下的部分连接到Lc后面即可。
下面,我们来看程序流程图的内容。首先是用两个指针变量pa和pb分别指向La和Lb的当前待比较插入的结点,而pc指向Lc表中当前最后一个结点。再下面是一个条件判断语句,其作用是判断链表La和Lb是否为空,如果有一个为空,只要将另一个链表剩下的部分连接到Lc后面,程序应该就可以结束了。
第(1)空是条件判断语句的条件,根据我们上面的分析,再结合流程图下面的内容,我们可以知道,这个条件语句的作用是比较当前待插入的两个值的大小,而指针变量pa和pb分别指向La和Lb的当前待比较插入的结点,因此,此空的答案为 pa->data=pb->data。
第(2)空是在条件为真的情况下执行的语句,如果条件判断为真,应该将pa所指结点连接到pc所指结点后面,因此,pc所指结点的指针域应该存放pa所指结点的地址。所以,此空的答案为pc->next=pa。
第(3)空和第(4)空都是在条件为假的情况下执行的语句,如果条件为假,说明 pb所指结点的值小于pa所指结点的值,应该将pb所指结点连接到pc所指结点后面,图中已经实现这一功能,要我们完成的是在插入后的后继工作。由于pc指向的是Lc表中当前最后一个结点,在插入一个结点后,要修改pc的值。在将pb所指结点插入后,链表中的最后一个结点就是pb所指结点,第(3)空的答案应该为pc=pb。执行完这些功能后,指针pb应该要往后移动,即指向下一个结点,第(4)用来完成这个功能,所以答案为pb=pb->next。
在前面,我们已经讲到如果链表La和Lb有一个为空,只要将另一个链表剩下的部分连接到Lc后面即可。第(5)空就是用来完成这个功能的,但我们不知道具体是哪个链表为空,还需要判断,因此,此空答案为pc->next=pa?pa:pb。