软考初级程序员下午题(11)

试题一

阅读以下说明和流程图,将应该填入______处的字句填写完整。
[说明]
求连续函数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)的根的过程。
[流程图]

在这里插入图片描述

试题二

阅读以下函数说明和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])}
}

试题三

阅读以下函数说明和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)(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,则需要将该区间进行二分,即需要判断选用左半区间还是右半区间,继续进行迭代计算。
如果yy1<0,则说明新的函数值与原区间的左端函数值符号相反,因此应取左半区间,否则应取右半区间。
若取左半区间,则原来的区间左端点a没有变化,左端点的函数值y1也没有变化,只要将中点值x送右端点变量b就可以。因此,第四空处填“b”。
若取右半区间,则区间的右端点没有变化,右端点的函数值y2也没有变化,这时需要将中点值x送左端点变量a。因此,第五空处应填“a”。由于每次迭代都需要判断y
y1的符号,因此y1的改变将影响下次迭代。因此,此时还需要将中点处的函数值y送y1,作为新区间的左端点函数值。
当新的区间(a,b)长度b-a很小时,迭代计算就可以结束,输出已经得到的近似根x就可以了。

试题二

(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
(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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值