image

编辑人: 独留清风醉

calendar2025-06-13

message2

visits1014

2018年5月 程序员 下午题参考答案

一、问答题

1、阅读以下说明和流程图,填补流程图中的空缺,将解答填入答题纸的对应栏内。
[说明]
下面流程图的功能是:在给定的两个字符串中查找最长的公共子串,输出该公共子串的长度L及其在各字符串中的起始位置(L=0时不存在公共字串)。例如,字符串"The light is not bright tonight"与"Tonight the light is not bright"的最长公共子串为"he light is not bright",长度为22,起始位置分别为2和10。
设A[1:M]表示由M个字符A[1],A[2],…,A[M]依次组成的字符串;B[1:N]表示由N个字符B[1],B[2],…,B[N]依次组成的字符串,M≥N≥1。
本流程图采用的算法是:从最大可能的公共子串长度值开始逐步递减,在A、B字符串中查找是否存在长度为L的公共子串,即在A、B字符串中分别顺序取出长度为L的子串后,调用过程判断两个长度为L的指定字符串是否完全相同(该过程的流程略)。
[流程图]

参考答案:

N或rnin(M,N)
M-L+1
N-L+1
L-1
L,I,J


2、阅读以下说明和C函数,填补函数代码中的空缺,将解答填入答题纸的对应栏内。
[说明1]
函数f(double eps)的功能是:利用公式计算并返回π的近似值。

[C函数1]

    double f(double
eps)

    {

    double n=1.0,
 s=1.0,  term=1.0,  pi=0.0;

    while  (
 fabs(term)  >=eps
 ){

    pi=pi+term;

    n= ______;  
 s= ______;

    term=s/n;

    }

    return  pi*4;

    }
[说明2]
函数fun(char *str)的功能是:自左至右顺序取出非空字符串str中的数字字符,形成一个十进制整数(最多8位)。例如,若str中的字符串为"iyt?67kp f3g8d5.j4ia2e3p12",则函数返回值为67385423。
[C函数2]

    long fun(char
*str)

    {

    int i=0;

    long num: 0;

    char *p = str;

    while ( i<8 && ______)  {

    if  (
 *p >=  '0'
 && *p <=  '9'
 )  {

    num= ______ + *p -
'0';

    ++i;

    }

    ______;

    }

    return  num;

    }

参考答案:

n+2
-s或-1*s
*p!='\0'或等价形式
num*10或等价形式
p++或等价形式


3、阅读以下说明和C代码,填补代码中的空缺,将解答填入答题纸的对应栏内。
[说明]
下面的程序代码根据某单位职工的月工资数据文件(名称为Salary.dat,文本文件),通过调用函数GetIncomeTax计算出每位职工每月需缴纳的个人所得税额并以文件(名称为IncomeTax.dat,文本文件)方式保存。
例如,有4个职工工资数据的Salary.dat内容如下,其中第一列为工号(整数),第2列为月工资(实数)。
1030001  6200.00
1030002  5800.00
2010001  8500.00
2010010  8000.00
相应地,计算所得IncomeTax.dat的内容如下所示,其中第3列为个人所得税额:
1030001 6200.00 47.20
1030002 5800.00 35.94
2010001 8500.00 233.50
2010010 8000.00 193.00
针对工资薪金收入的个人所得税计算公式为:
个人所得税额=应纳税所得额×税率-速算扣除数
其中,应纳税所得额=月工资-三险一金-起征点
税率和速算扣除数分别与不同的应纳税所得额对应,如下表所示。

设三险一金为月工资的19%,起征点为3500元。
例如,某人月工资为5800元,按规定19%缴纳三险一金,那么:
其应纳税所得额X=5800-5800×19%-3500=1198元,对应税率和速算扣除数分别为3%和0元,因此,其个人所得税额为1198×3%-0=35.94元。

[C代码] 

    #include <stdio.h> 

    #define BASE 3500
               //起征点 

    #define RATE 0.19
              //三险一金比例 

    ______;  
                     
    //声明函数GetIncomeTax


    int main() 

    { 

    int id; 

    double salary; 

    FILE *fin,*fout; 

    fin =
fopen("Salary.dat","r"); 

    if  (______)
 return 0; 

    fout =
fopen("IncomeTax.dat","w"); 

    if (______)
 return 0; 

    while (!feof(fin))
 { 

    if
 (fscanf(fin,"%d%if", ______) !=2) break; 

  
 fprintf(fout,"%d\t%.21f\t%.21f\n",id, salary, ______); 

    } 

    fclose(fin); 

    fclose(fout); 

    return 0; 

    } 

    double
GetIncomeTax(double salary) 

    { 

    double yns_sd; 

    yns_sd = ______ -
BASE;        /*计算应纳税所得额*/ 

    if  (yns_sd<=0)       return  0.0; 

    else  if
 (yns_sd<=1500)
     return yns_sd*0.03; 

    else  if
 (yns_sd<=4500)
     return yns_sd*0.1-105; 

    else  if
 (yns_sd<=9000)
     return yns_sd*0.2-555; 

    else  if
 (yns_sd<=35000)
    return yns sd*0.25-1005; 

    else  if
 (yns_sd<=55000)
    return yns_sd*0.3-2755; 

    else if(yns_sd<=80000)  return yns_sd*0.35-5505; 

    return
yns_sd*0.45-13505; 

    }

参考答案:

double GetIncomeTax(double salary)或double GetIncomeTax(double)
!fin或fin=NULL或fin==0
!fout或fout==NULL或fout==0
&id.&salary
GetIncomeTax(salary)
salary*(1-RATE)或等价形式
注:RATE可替换为0.19


4、阅读以下说明和C函数,填补代码中的空缺,将解答填入答题纸的对应栏内。
[说明]
函数Combine(LinkList La,LinkList Lb)的功能是:将元素呈递减排列的两个含头结点单链表合并为元素值呈递增(或非递减)方式排列的单链表,并返回合并所得单链表的头指针。例如,元素递减排列的单链表La和Lb如图1所示,合并所得的单链表如图2所示。

设链表结点类型定义如下:

typedef Struct Node{

    int data;

    struct Node*next;

    }Node,*LinkList;

    [C函数]

    LinkList
Combine(LinkList La,LinkList Lb)

    {  //La和Lb为含头结点且元素呈递减排列的单链表的头指针

    //函数返回值是将La和Lb合并所得单链表的头指针

    //且合并所得链表的元素值呈递增(或非递减)方式排列

    ______Lc,tp,pa,pb;
   //Lc为结果链表的头指针,其他为临时指针

    if(!La)return
NULL;

    pa=La->next;        //pa指向La链表的第一个元素结点

    if(!Lb) return
NULL;

    pb=Lb->next;       //pb指向Lb链表的第一个元素结点

    Lc=La;  
         //取La链表的头结点为合并所得链表的头结点

    Lc->next=NULL;

    while(______)
 {  //pa和pb所指结点均存在(即两个链表都没有到达表尾)

    //令tp指向pa和pb所指结点中的较大者

    if(pa->data>pb->data){

    tp=pa;  
 pa=pa->next;

    }

    else{

    tp=pb;  
 pb=pb->next;

    }

    ______ =Lc->next;    //tp所指结点插入Lc链表的头结点之后

    Lc->next=______;

    }

    tp=(pa)?pa:pb;
   //设置tp为剩余结点所形成链表的头指针

    //将剩余的结点合并入结果链表中,pa作为临时指针使用

    while  (tp)
 {

    pa=tp->next;

    tp->next=Lc->next;

    Lc->next=tp;

    ______;

    }

    return Lc;

    }

参考答案:

LinkList
pa&&pb
tp->next
tp
tp=pa


5、阅读下列说明和C++代码,填补代码中的空缺,将解答填入答题纸的对应栏内。
[说明]
设计RGB方式表示颜色的调色板,进行绘图,其类图如下图所示。该程序的C++代码附后。

类图

[C++代码]

    #include<iostream>

    #include <stdlib. h>

    #include <crime>

    using namespace
std;

    class MyColor {

    private:

    int red;  
   int green;      int blue;

    public:

    MyColor(){red = 0;
green = 0; blue = 0;  }

    ~MyColor () { }

    MyColor(int red,
 int green,  int blue)  {

    this->red = red; this->green = green; this->blue =
blue;}

    void print()
 {

    cout<<"Red: " << red << "\tGreen: " << green << "\tBlue " << blue

    << endl;

    }

    };

    class Palette {

    private:

    int number;
MyColor** palette;

    public:

    Palette(){ number
= 256; palette = (MyColor**)malloc

    (sizeof (MyColor*)
*number);  }

    ~Palette () {

    for (int i = 0; i < number; i++)  { delete palette[i];  }

    ______;

    }

    Palette(MyColor**
pale,  int number)  {

    ______ = number;

    palette =
(MyColor**)malloc(sizeof(MyColor*)*number);

    memcpy(palette,
pale,sizeof(pale)*number);

    }

    //其他方法略

    void print()
 {

    for (int i = 0; i<number; i++)  {

    cout << i << ":";

    palette [i] ->print ();

    }

    }

    };

    class Drawing{

    public:

    ______ int
COLORNUMBER = 16;

    public:

    ~Drawing()  {  }

    void draw()
 {

    Palette* palette;

    int red,
 green,  blue;

    MyColor*
color[COLORNUMBER];

    srand ((unsigned)
time (0));

    for (int i=0; i<COLORNUMBER; i++)    {

    red=rand()  %
256; green = rand()  % 256; blue = rand() % 256;

    color[i] = ______
(red,  green, blue);

    }

    palette = new
Palette (color,  COLORNUMBER);

    palette->print ();

    for  (int
i=0; i <
COLORNUMBER; i++)

    delete color[i];

    }

    };

    int main  ()
{

    Drawing * d =
______;

    d->draw ();

    delete d;

    }

参考答案:

free(palette)
this->number
static const
new MyColor
new Drawing()


6、阅读以下说明和Java代码,填补代码中的空缺,将解答填入答题纸的对应栏内。
[说明]
设计RGB方式表示颜色的调色板,进行绘图。其类图如下图所示。该程序的Java代码附后。

类图

[Java代码]

    //颜色类

    class MyColor {

    private int red,
 green, blue;

    public MyColor()
 {

    red = 0; green = O;
blue=0;

    }

    public MyColor(int
red,  int green,  int blue)  {

    this.red = red;

    this.green =
green;

    this.blue = blue;

    }

    //其他方法略

    public String
toString()  {

    return "Red:
 " + red + "\tGreen:  " + green + "\tBlue "
+ blue;

    }

    }

    //调色板类

    class Palette {

    public int number;
           //颜色数

    private ______
palette;    //颜色表

    public Palette()
 {

    number = 256;

    palette = new
MyColor[number];

    }

    public
Palette(MyColor[] palette,  int number)

    ______ = number;

    ______ = palette;

    }

    //其他方法略

    public String
toString()  {

    String  str =
 "";

    for (int i = 0; i < number; i++)  {

    str +=
i+":" + palette[i] + "\n";

    }

    return str;

    }

    }

    //绘图类

    class Drawing
 {

    public ______ int
COLORNUMBER = 16;

    public static void
main(String[]  args)        {

    Palette palette;

    int red,
 green, blue;

    MyColor[]
 color = new MyColor[COLORNUMBER];

    for (int i = 0; i < COLORNUMBER; i++)    {

    red =  (int)
(Math.random()  * 256);

    green =
 (int) (Math.random()  * 256);

    blue =  (int)
(Math.random()  * 256);

    color[i]  =
______ (red,  green, blue);

    }

    palette = new
Palette (color, COLORNUMBER);

    System.out.println
(palette);

    }

    }

参考答案:

MyColor[]
this.number
this.palette
static final
new MyColor


喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!

创作类型:
原创

本文链接:2018年5月 程序员 下午题参考答案

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。
分享文章
share