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

试题一

1、阅读以下说明和流程图,将应填入______处的字句填写完整。

    [说明]

    计算三角函数sinx

    

 

 

    给定精度e和n,若第k步后的结果为sin1,第k+1步后的结果为sin2,若|sin1-sin2|<e,则返回sin1的值。若没有达到精度e,但是步骤达到n步,则返回第n步后的值。其流程图如下所示:

    

 

 

试题二

2、阅读以下函数说明和C语言函数,将应填入______处的字句填写完整。

    [程序2.1说明]

    求所有满足如下条件的三位数:它除以11得的商等于它各位数字的平方和。例如550,除以11商为50,50=52+52+02

    [程序2.1]

    void main()

    {

     int i,j,n,s;

    for(i=100;i<=999;i++)

    {

    n=i;

    j=n/11;

    s=0;

    while(______)

    {

    ______

    n/=10;

    }

    if(______)

    printf("%d\t",i);

    }

    }

    [程序2.2说明]

    本程序输入一字符串,将其中的大写字母改变成小写字母。

    [程序2.2]

    void main()

    {

    int i=0;

    char s[120];

    scanf("%s",s);

    while(______)

    {

    if(______)

    s[i]=s[i]-'A'+'a';

    i++;

    }

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

    }

试题三

3、阅读以下说明和C语言程序,将应填入______处的字句填写完整。

    [说明]

    设有3n+2个球互连,用自然数1~3n+2分别为这些球编号,使相连的两球编号之差的绝对值正好是数列1,2,…,3n+1中的各数,如下图所示。

    

 

    其中填自然数的思想如下:

    (1)先自左向右,第1列中间1个填数,然后第2列上、下2个填数,每次2列;但若,2为偶数,最后1次只填第1列中间一个数。

    (2)自右向左,先右第1列中间填数;若n是奇数,再右第2列中间填数。然后依次右第1列上、下2个填数,再右第2列中间1个填数,直到左第2列为止。

    [程序]

    #include <stdio.h>

    #define size 10

    int a[3][size];

    void main()

    {

    int i,k,m,n;

    printf("imput the n:");

    scanf("%d",&n);

    k=1;

    for(i=0;i<=n/2;i++)

    {

    a[1][2*i]=k;k++;

    if((i==n/2)&&______||(i<n/2))

    {

    a[0][2*i+1]=k;

    k++;

    ______

    k++;

    }

    }

    if(n%2==1)

    {

    ______

    k++;

    m=n;

    }

    else

    ______

    for(i=0;i<n/2;i++)

    {

    a[1][m-2*i]=k; k++;

    ______

    k++;

    a[2][m-2*i-1]=k; k++;

    }

    a[1][1]=k;

    printf("\n");

    printf("    ");

    for(i=1;i<=n;i++)

    printf("%6d",a[0][i]);

    printf("\n\n");

    for(i=0;i<=n+1;i++)

    printf("%6d",a[1][i]);

    printf("\n\n");

    printf("    ");

    for(i=1;i<=n;i++)

    printf("%6d",a[2][i]);

    printf("\n");

    }

答案:

试题一

1、(1)i<=n&&abs(sin-temp)>e    (2)-t*x*x/((2*i)*(2*i+1))    (3)temp

    (4)sin+t    (5)i++

[解析] 本题考查程序流程图对三角函数sinx的计算。

    首先我们来分析一下三角函数sinx的计算过程。对三角函数sinx的计算是根据题目中给出的展开式来进行的,每次计算是在原来的基础上加上一项,其初始项为x。通过判断第k步与第k+1步结果的差的绝对值与精度e的大小来决定计算是否继续。如果结果的差大于精度e,计算继续,反之则停止。再有就是如果结果的差一直大于精度e,则计算到n步后停止。由上述描述我们知道,对三角函数sinx的计算需要一个条件循环,且循环的条件应该是第k步与第k+1步结果的差与精度e的大小关系和计算步数与n的大小关系。

    下面,我们来看程序流程图。在流程图中,首先输入x,e,n的值,接下来申请了几个临时变量sin,temp,i,t。第1空在条件循环的开始处,很明显是要填控制循环的条件,由上面的分析我们知道,循环的条件应该是第k步与第k+1步结果的差的绝对值与精度e的大小关系和计算步数与n的大小关系,但是,在此处我们还没弄清楚变量sin,temp,i,t分别用来存放什么内容,因此,此空最好是在做完后面的以后再回头来完成。

    第2空处是要将一个值赋给变量t,变量t的初始赋值语句是t=x,这是将展开式的第一项赋给了变量t,因此变量t有可能是用来存放第1步的运算结果,也很有可能用来存放每次要加的项。结合这个流程图来看,变量t中存放的是每次要加的项,确定了这个后,再结合展开式中第k项与第k+1项的特点和通项公式,不难看出第2空应该填“-t*x*x/((2*i)*(2*i+1))”。

    第3空是紧接着第2空而来的,是将一个值赋给变量sin,变量sin的初始赋值语句是sin=0,结合整个流程可以知道,第3空与第4空应该结合起来完成,变量sin与temp分别用于存放第k步与第k+1步的运算结果,由它们的初值我们可以判断出,变量sin用来存放第k步的运算结果,而temp用来存放第k步的运算结果与增加项的和,即第k+1步的运算结果。在每次运算前,我们都把其结果保存在变量sin中。因此,第3空的答案为“temp”,第4空的答案为“sin+t”。

    结合程序全过程来看,可以知道第5空处是用来控制计算步数的。每计算一次后程序的计算步数应该就增加了1,在流程图中,变量i是用来统计计算步数的,因此,第5空的答案是“i++”。

    在知道变了量sin,temp,i,t的作用后,第1空就很简单了,答案应该为“i<=n&&abs(sin-temp)>e”。

试题二

2、 (1)n    (2)s=s+(n%10)*(n%10);    (3)j==s

    (4)s[i]    (5)s[i]>='A'&&s[i]<='Z'

[解析] 本题考查C语言中一些运算的实现。

    在程序2.1中要求求出满足如下条件的所有三位数:它除以11得的商等于它各位数字的平方和。要想求出所有结果,我们应该对每个三位数进行计算来判断它是否符合题目中的要求,只有在除以11的商等于各位数字的平方和时,才是我们要求的数。

    有了上述分析后,我们再来看程序2.1的代码,代码中首先声明了几个临时变量i,j,n,s。接下来是一个循环,其目的是对从100到999的所有三位数来进行运算。再接下来的代码是将当前的这个三位数存放在变量n中,将除以11得到的商存放在j中。

    第1空所在的位置是循环的判断条件,根据我们上面的分析和整个程序代码来看,这个循环应该是用来计算三位数中各位数字的平方和用的,再看循环中语句n/=10,其作用是将n的值除以10,因为n是整型变量,保存数据时是直接去除小数点后面的数而只保留前面的整数部分,这个操作其本质是对数字降位,去除最低位(个位)。在对其进行此操作前应该对数字中的最低位进行求平方计算,这也应该是第2空的任务,要求个位数的方法是n%10,因此,第2空答案应该是“s=s+(n%10)*(n%10);”。

    第3空所在的位置是条件选择语句的条件,如果此条件成立,就输出变量i的值,i中存放的是当前参与计算的三位数,只有满足除以11得到的商等于它各位数字的平方和的三位数才能被输出,那么条件选择语句中的条件应该是判断除以11得的商是否等于它各位数字的平方和。因此,第3空的答案为“j==s”。

    在程序2.2中要求将输入的一字符串中的大写字母改变成小写字母,那么我们首先要了解C语言中大小写字母的转换规则。在C语言中字母的运算其实是字母对应的ASCII码码值的运算,其中小写字母a对应的ASCII码值为97,a后面的小写字母的ASCII码值依次增加1,而大写字母A的ASCII码值为65,A后面的大写ASCII码值也依次增加。这样,我们就知道了小写字母比对应的大写字母的ASCII码值大32,在将小写字母转化为大写字母时,我们只要相应地将小写字母的ASCII码值减去32或加上32的相反数即可。

    下面,我们来看程序2.2的代码,在代码中,声明了一个长度为120的字符型数组S存放输入的字符串,下面有一个循环语句,第4空是循环语句的循环条件,结合整个程序,我们可以知道,循环语句要实现字符串中大写字母改变成小写字母的功能,所以循环的条件应该是判断在操作时是否取到了字符,而字符是存放在数组中的,因此,此空答案应该是“s[i]”。第5空是一个条件选择语句的条件,如果条件成立就执行将大写字母改变成小写字母操作,因此,是判断取到的字符是否为大写字母,所以此空答案为“s[i]>='A'&&s[i]<='Z'”。

试题三

3、(1)(n%2==1)    (2)a[2][2*i+1]=k;    (3)a[1][n+1]=k;

    (4)m=n+1;    (5)a[0][m-2*i-1]=k;

[解析] 本题考查C语言中具体算法的实现。

    题目中要求将3n+2个球互连,并用自然数1~3n+2分别为这些球编号,使相连的两球编号之差的绝对值正好是数列1,2,…,3n+1中的各数。题目中还给出了具体的填自然数的思想。我们要完成的工作就是用C语言描述出题目中给出的思想。首先我们需要对其思想有个正确的认识,这是关键所在。

    下面,我们来分析代码。结合整段程序代码,我们可以分析出,二维数组a用来存放我们要填的数字,第一维表示行数,总行数应该是3。第二维表示列数,总列数应该是n+2。其中的第1空所在的位置是表示一个条件判断语句的条件,在这之前已经对第1列的中间1个进行了填数,那么根据“先自左向右,第1列中间1个填数,然后第2列上、下2个填数,每次2列”的思想,再结合下面的填数程序语句,我们可以知道,此语句就是用来实现先在第1列中间1个填数后,对第2列上、下2个进行填数,每次2列这个思想的。因此,第2空的答案就出来了,是对第2列下(第3行)进行填数,因此,答案为“a[2][2*i+1]=k;”。因为条件判断语句下面是进行了2次填数,因此可以判断n应该是个奇数,因为若n为偶数,最后1次只排第1列中间一个数,就不需要这个操作了。因此,第1空的作用应该是用来判断n是奇数,所以此空答案为“(n%2==1)”。

    第3空所在的位置在条件。n%2==1成立的情况下才执行,条件n%2==1成立表明n是奇数,根据若n是奇数,再右第2列中间填数的思想,我们可以知道,此处应该是对右第2列中间填数,因此,答案为“a[1][n+1]=k;”。

    第4空所在的位置是条件n%2==1不成立的情况下才执行,在上面我们知道n%2==1是用来判断n是否为奇数,如果n不是奇数,我们不做什么,但为了方便后面的操作,应该将n+1的值保存起来,因此,此空的答案为“m=n+1;”。

    根据思想:若n是奇数,再右第2列中间填数。然后依次右第1列上、下2个填数,再右第2列中间1个填数,直到左第2列为止。在前面程序中,我们已经完成了前面部分,第5空所在的循环体就是用来完成后面部分的,在循环体中已经实现了对中、下进行填数,缺一个对上进行填数的代码,因此,第5空要完成的任务就是对上行进行填数,因此,答案为“a[0][m-2*i-1]=k;”。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值