1、2015年上半年软件水平考试(初级)程序员下午(应用技术)真题试卷及答案与解析 1 阅读以下说明和流程图,填补流程图中的空缺。【说明】 下面流程图的功能是:在给定的两个字符串中查找最长的公共子串,输出该公共子串的长度 L及其在各字符串中的起始位置 (L一 O时不存在公共字串 )。例如,字符串 “Thelight is not bright tonight”与 “Tonight the light is not bri ght”的最长公共子串为 “he light isnot bright”,长度为 22,起始位置分别为 2和 10。 设 A1: M表示由 M个字符 Al,A2, , AM依次组
2、成的字符串; B1: N表示由 N个字符 Bl, B2, ,BN依次组成的字符串, MNl。 本流程图采用的算法是:从最大可能的公共子串长度值开始逐步递减,在 A、 B字符串中查找是否存在长度为 L的公共子串,即在 A、 B字符串中分别顺序取出长度为 L的子串后,调用过程判断两个长度为 L的指定字符串是否完全相同 (该过程的流程略 )。【流程图】2 阅读以下说明和 C函数,填补函数代码中的空缺。【说明 1】函数 f(double eps)的功 能是:利用公式 计算并返回 的近似值。 double f(double eps) double n一 1一 0, s = 1 0, term = 1 0
3、, pi = 0 0; while( fabs(term一eps ) pi=pi+term; n=(1); s=(2); term=s /n; return pi*4; 【说明 2】 函数fun(char *str)的功能是:自左至右顺序取出非空字符串 str中的数字字符,形成一个十进制整数 (最多 8位 )。例如,若 str中的字符串为 “iyt?67kp f398d5 j4ia2e3p12”,则函数返回值为 67385423。 I: C函数 2 long fun(char *str) int i=0; long num=0; char*p=str; while(i 8 &(3) if(*p
4、 = 0 &*p = 9 ) num=(4)+*p一 0; +i; (5); return num; 3 阅读以下说明和 C代码,填补代码中的空缺。【说明】 下面的程序代码根据某单位职工的月工资数据文件 (名称为 Salary dat,文本文件 ),通过调用 函数Get1ncomeTax计算出每位职工每月需缴纳的个人所得税额并以文件 (名称为IncomeTax dat,文本文件 )方式保存。 例如,有 4个职工工资数据的 Salary dat内容如下,其中第一列为工号 (整数 ),第 2列为月工资 (实数 )。 1030001 6200 00 1030002 5800 00 2010001 8
5、500 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 针对工资薪金收入的个人所得税计算公式为: 个人所得税额 =应纳税所得额 税率一速算扣除数 其中,应纳税所得额 =月工资一三险一金一起征点 税率和速算扣除数分别与不同的应纳税所得额对应,如表 3一 1所示。设三险一金为月工资的 19,起征点为 3500元。 例如,某人月工资为 5800元
6、,按规定 19缴纳三险一金,那么: 其应纳税所得额 X=5800一 5800x19一3500=1198元,对应税率 和速算扣除数分别为 3和 0元,因此,其个人所得税额为 11983一 0=35 94元。【 C代码】 #include stdio h #define BASE 3500 /起征点 #define RATE 0 19 /三险一金比例 (1); /声明函数 GetIncomeTax int main() int id; double salary; FILE *fin, *fout; fin=fopen(“Salary dat“, “r“); if(2)return 0; fout
7、=fopen “IncomeTax dat“, “w“); if(3)return 0; while(!feof(fin) if(fscanf(fin, “ood lf“, (4)!=2)break; fprintf(fout, “ d too 21ft 21fn“, id, salary, (5); fclose(fin); fclose(fout); return 0; double GetIncomeTax(double salary) double yns_sd; yns_sd=(6)一 BASE; /*计算应纳税所得额 */ if(yns_sd =0)return 0 0; else
8、 if(yns sd =1500)return yr cs_sd*0 03; else if(yns sd =4500)return yrs_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; 4 阅读
9、以下说明和 C函数,填补代码中的空缺。【说明】 函数 Combine(LinkList La, LinkList Lb)的功能是:将元素呈递减排列的两个含头结点单链表合并为元素值呈递增 (或非递减 )方式排列的单链表,并返回合并所得单链表的头指针。例如,元素递减排列的单链表 La和 Lb如图 4一 1所示,合并所得的单链表如图 4一 2所示。设链表结点类型 定义如下: typedef struct Node int data; struct Node *nextf Node, *LinkList;【 C函数】 LinkList Combine(LinkList La, LinkList Lb)
10、/La和 Lb为含头结点且元素呈递减排列的单链表的头指针 /函数返回值是将La和 Lb合并所得单链表的头指针 /且合并所得链表的元素值呈递增 (或非递减 )方式排列 (1)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=NULLf while(2) /pa和 pb所指结点均存在 (即两个
11、链表都没有到达表尾 )/令 tp指向 pa和pb所指结点中的较大者 if(pa一 data pb一 data) tp=paf pa = pa一 next; else f tp=pb; pb=pb一 next; (3)=Lc一 next; /tp所指结点插入 Lc链表的头结点之后 Lc一 next=(4); tp=(pa)? pa: pb; /设置 tp为剩余结点所形成链表的头指针 /将剩余的结点合并入结果链表中, pa作为临时指针使用 while(tp) pa=tp一 next; tp一 next =Lc一 next; Lc一 next = tp; (5); return Lc; 5 阅读下列
12、说明和 C+代码,填补代码中的空缺。【说明】 设计 RGB方式表示颜色的调色板,进行 绘图,其类图如图 5一 1所示。该程序的 C+代码附后。【 C+代码】 #include iostream #include stdlib h #include ctime using namespace std; class MyColorprivate: int red; int green; int bluefpublic: MyColor()red = 0; green = 0; blue=0; MyColor() MyColor(int red, int green, int blue) this一
13、 red = red; this一 green = green; this一 blue = blue; voici 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+) de
14、lete palettei); (1); Palette(MyColor* pale, int number) (2)= num: ber; palette =(MyColor*)malloc(sizeof(MyColor*)*number); memcpy(palette, pale, sizeof(pale)*number); void print() for(int i = 0; i number; i+) , palette i一 print(); ; class Drawing public: (3)int COLORNUMBER=16; public: Drawing() )voi
15、d draw() Palette* palette; int red, green, blue; MyColor* colorCOLORNUMBER; srand(unsigned)time(0); for(int i=0; iCOLORNUMBER; i+) red=rand() 256; green=rand()00 256; blue=rand()00 256; color i =(4)(red, green, blue); palette=new Palette(color, COLORNUMBER); palette一 print(); for(int i=0; i COLORNUM
16、BER, i+)delete color i; ; int main() Drawing*d=(5); d一 draw(); delete d; 6 阅读以下说明和 Java代码,填补代码中的空缺。【说明】 设计 RGB方式表示颜色的调色板,进行绘图。其类图如图 6一 1所示。该程序的 Java代码附后。【 Java代码】 /颜色类 class MyColor private int red, green, blue; public MyColor() red=0; green=0; blue 0; public MyColor(int red, int green, int blue) th
17、is red=red; this green=green; this blue=blue; /其他方法略 public String toString() return “Red: “+red十 “tGreen: +green+“tBlue“ +blue; /调色板类 class Palette public int number; /颜色数 private(1)palette; /颜色表 public Palette() number=256; palette=new MyColornumberl; public Palette(MyColor palette, int number)(2)
18、=number; (3)=palette; /其他方法略 public String toString() String str= fffll for(int i=0; i number; i+) str += i + : +palettei + n”; return str; /绘图类 class Drawing public(4)int COLORNUMBER=16; public static void main(String args) Palette palette; int red, green, blue; MyColor color一 new MyColor ECOLORNUM
19、BERl; for(int i=0; i COLORNUMBER; i+) red=(int)(Math random()*256); green一(int)(Math random()*256); blue=(int)(Math random()*256); color i = (5)(red, green, blue); palette=new Palette(color, COLORNUMBER); System out print1n(palette)j 2015年上半年软件水平考试(初级)程序员下午(应用技术)真题试卷答案与解析 1 【正确答案】 (1)N或 min(M, N) (2
20、)M一 L+1 (3)N一 L+1 (4)1一 1 (5)L, I, J 【试题解析】 本题考查对算法流程图的理解和绘制能力。这是程序员必须具有的技能 。 本题的算法可用来检查某论文是否有大段抄袭了另一论文。 “The light is not brighttonight”是著名的英语绕口令,它与 “Tonight the light is not bright”大同小异。 由于字符串 A和 B的长度分别为 M和 N,而且 MNl,所以它们的公共子串长度 L必然小于或等于 N。题中采用的算法是,从最大可能的公共子串长度值 L开始逐步递减,在 A、 B字符串中查找是否存在长度为 L的公共子串。因
21、此,初始时,应将 min(M, N)送 L,或直接将 N送 L。 (1)处应填写 N或 min(M, N),或其他等价形式。 对每个可能的 L值,为查看 A、 B串中是否存在长度为 L的公共子串,显然需要执行双重循环。 A串中,长度为 L的子串起始下标可以从 1开始直到 M一L+1(可以用实例来检查其正确性 ); B串中,长度为 L的子串起始下标可以从 1开始直到 N一 L+1。因此双重循环的始值和终值就可以这样确 定,即 (2)处应填 M一L+l,或等价形式; (3)处应填 N一 L+l或等价形式 (注意循环的终值应是最右端子串的下标起始值 )。 A串中从下标 I开始长度为 L的子串可以描述
22、为 AI: I+L一 1; B串中从下标J开始长度为 L的子串可以描述为 AJ: J+L一 l。因此,双重循环体内,需要比较这两个子串 (题中采用调用专门的函数过程或子程序来实现 )。 如果这两个子串比较的结果相同,那么就已经发现了 A、 B串中最大长度为 L的公共子串,此时,应该输出公共子串的长度值 L、在 A串中的起始下标 I、在 B串中的起始下标 J。因 此, (5)处应填 L, I, J(可不计顺序 )。 如果这两个子串比较的结果不匹配,那么就需要继续执行循环。如果直到循环结束仍然没有发现匹配子串时,就需要将 L减少 l(4)处填 L一 l或其等价形式 )。只要 L非 0,则还可以继续
23、对新的 L值执行双重循环。如果直到 L=0,仍没有发现子串匹配,则表示 A、 B两串没有公共子串。 2 【正确答案】 (1)n+2(2)s或一 1*s (3)*p!=0或等价形式 (4)num*10或等价形式 (5)p+或等价形式 【试题解析】 本题考查 C语言程序设计基本技能。考生 需认真阅读题目中的说明,从而确定代码的运算逻辑,在阅读代码时,还需注意各变量的作用。 函数 f(double eps)的功能是计算兀的近似值。观察题中给出的计算公式,可知在循环中 n每次递增 2,因此空 (1)处应填入 “n+2”。由于公式中的各项是正负交替的,因此结合表达式 “term=s/n”可知变量 s就是
24、起此作用的。空 (2)处应填入 “一 s”或 “一 1*s”。 对于函数 fun(char *str),从字符序列中取出数字并组合为一个整数时,对于每个数字,只需将之前获取的部分乘以 10再加上该数字的值即可。 以 67385423为例。 67385423=(0+6)*10+7)*10+3)*10+8)*10+5)*10+4)*10+2)*10+3 函数中的变量 i是用来计算位数的, num用来计算所获得的整数值。显然,最多读取字符序列中的前 8个数字,或者到达字符序列的末尾 (*p!= 0)时,计算也需结束。 因此,空 (3)处应填入 “*p!= 0”。 根据 num的作用,空 (4)处应填
25、入 “num*10”。 根据指针 p的作用,空 (5)处的代码应使得 p指向下一个字符, 因此应填入“p+”。 3 【正确答案】 (1)double Get1ncomeTax(double salary)或 double GetIncomeTax(double) (2)!fin或 fin=NULL或 fin=0 (3)!fout或 fout=NULL或 fout=0 (4)&id, &salary (5)GetIncomeTax(salary) (6)salary*(1一 RATE)或等价形式 注: RATE可替换为 0 19 【试题解析】 本题考查 C语言程序设计基本技能。考生需认真阅读题目
26、中 的说明,以便理解问题并确定代码的运算逻辑,在阅读代码时,还需注意各变量的作用。 根据注释,空 (1)处应填入 “double GetIncomeTax(double salary)”或 “double GetIncomeTax(double)”,对函数 GetIncomeTax进行声明。 空 (2)、 (3)处所在的代码是判断文件打开操作是否成功,因此应分别填入 “!fin”、 “! fout”。 根据说明可知,变量 id和 salary分别表示工号和月工资数。 空 (4)处所在语句为从文件中读取数 据的操作,从 fscanf的格式控制串可知读取的两个数是整数和双精度浮点数,则输入表列的两
27、个变量分别为接收整数值的变量 id和接收整数值的变量 salary,因此空 (4)应填入 “&id, &salary”。 空 (5)处所在代码向 fout关联的文件写入计算出的所得税额,显然需调用函数GetIncomeTax来计算,因此应填入 “GetIncomeTax(salary)“。 空 (6)处的代码计算应纳税所得额,根据说明中给出的计算公式及三险一金的计算方法: 应纳税所得额 =月工资一三险一金一起征点 空 (6)处应填入 “salary *(1一 RATE)”。 4 【正确答案】 (1)LinkList (2)pa&pb (3)tp一 next (4)tp (5)tp=pa 【试题
28、解析】 本题考查数据结构应用及 C语言实现。链表运算是 C程序设计题中常见的考点,需熟练掌握。考生需认真阅读题目中的说明,以便理解问题并确定代码的运算逻辑,在阅读代码时,还需注意各变量的作用。 根据注释,空 (1)所在的代码定义指向链表中结点的指针变量,结合链表结点类型的定义,应填入“LinkList”。 由于 pa指向 La链 表的元素结点、 pb指向 Lb链表的元素结点,空(2)所在的 while语句中,是将 pa指向结点的数据与 pb所指向结点的数据进行比较,因此空 (2)处应填入 “pa&pb”,以使运算 “pa一 data pb一 data“中的 pa和 pb为非空指针。 从空 (3
29、)所在语句的注释可知,需将 tp所指结点插入 Lc链表的头结点之后,空 (3)处应填入 “tp一 next“,空 (4)处应填入 “tp”,如下图所示。空 (5)所在的 while语句处理还有剩余结点的链表, pa是保存指针的临时变量,循环中的下面 4条语句执行后的链表状态如下图 所示。 pa=tp一 next; / tp一 next=Lc一 next; / Lc一 next=tp; / (5); / 空(5)处应填入 “tp=pa”,以继续上述的重复处理过程。 5 【正确答案】 (1)free(palette) (2)this一 number (3)static const (4)new M
30、y Color (5)new Drawing() 【试题解析】 本题考查 C+程序设计的能力,涉及类、对象、方法定义和相关操作。要求考生根据给出的案例和代码说明,认真阅读 并理清程序思路,然后完成题目。 先考查题目说明。本题目中涉及到颜色、调色板、绘图等类以及初始化和调色相关等操作。根据说明进行设计。 类图中给出三个类 Drawing Palette和 MyColor及其之间的关系。 Drawing与Palette、 MyColor之间具有关联关系, Palette与 MyColor之间是聚合关系。 MyColor为以 RGB方式表示颜色,由属性 red、 green和 blue表示,每个My
31、Color对象即为一个 RGB颜色。 MyColor具有两个构造器,缺省构造器将RGB颜色均初始化为 0;带参数的构造方法将当前对象的 RGB值设置为调用构造方法时消息中所传递的参数值。 print()用来输出当前对象的 RGB值供测试使用。 Palette类用于表示调色板,其调色板颜色数量,用血型 number表示,其MyColor对象指针数组,用指向指针的指针 MyColor* palette表示。 Palette的缺省构造方法中,将 number设置为 256色,并将 palette指向动态申请存储 256色MyColor对象指针的空间。另一个构造方法 Palette(MyColor*
32、pale, int number)中参数有指向 MyColor对象指针数组的指针 pale以及颜色数量 number。该构造方法设置当前调色板对象的颜色数量,用 this一 number表示当前对象的number属性,动态申请该数量对应的 MyColor指针类型的 number个存储空间,并将此存储空间复制给属性 palette。析构方法先用 delete删除用 new创建的每个MyColor对象,并用 free释放采用 malloc函数动态申请的存放 MyColor对象指针的存储空间。 print()方法用来打印 palette中每个颜色对象 的颜色,供测试使用。在 print()函数体内部
33、,为每个数组元素调用当前对象的 print()打印一个 RGB颜色。 Drawing类属性 int COLORNUMBER定义绘画时所用的颜色数量 (本例中设置为 16表示基于 1 6色绘图 )。 void draw()方法声明调色板 Palette palette、定义COLORNUMBER色 MyColor对象指针数组 color,随机生成 RGB颜色并根据此颜色创建 COLORNUMBER个 MyColor对象即循环 COLORNUMBER次,每次循环生成随机的 RGB颜色后调 用 MyColor的带参数构造器创建 MyColor对象,即: colori =new MyColor(red
34、, green, blue); 所有颜色数组创建完成后,基于所创建的 COLORNUMBER个 MyColor对象指针数组创建调色板,即: palette=new Palette(color, COLORNUMBER); 调用调色板的 print()方法进行打印 (模拟绘图 )。最后将 MyColor对象指针元素进行删除。由于 COLORNUMBER的作用是绘图的颜色数量,在创 建 MyColor对象指针数组时作为元素个数,所以,需要是 static const静态常量。 主控逻辑代码在 main函数中实现。在 main()函数中,创建 Drawing对象指针d,即生成一个绘图对象: Draw
35、ing*d=new Drawing(); 并进行绘图,即调用 d的 draw()方法,实现绘图功能。在使用完对象之后,需要对 new出的对象采用 delete操作进行释放对象,对 d对象进行删除,即 delete d;,释放内存。 综上所述,空 (1)需要表示释放 malloc函数申请的 动态内存的函数,即free(palette);空 (2)需要表示当前对象的 number属性,即 this一 number;空 (3)需要修饰 COLORNUMBER为静态常量,即 static const;空 (4)需要调用 MyColor的构造方法创建 MyColor对象,即 new MyColor;空
36、(5)处为创建 Drawing类的对象指针 d的 newDrawing()。 6 【正确答案】 (1)MyColor (2)this number (3)this palette (4)static final (5)new MyColor 【试题解析】 本题考查 Java语言程序设计的能力,涉及类、对象、方法的定义和相关操作。要求考生根据给出的案例和代码说明,认真阅读并理清程序思路,然后完成题目。 先考查题目说明。本题目中涉及到本题目中涉及到颜色、调色板、绘图等类以及初始化和调色相关等操作。根据说明进行设计。 类图中给出三个类 Drawing Palette和 MyColor及其之间的关系。
37、 Drawing与Palette、 MyColor之间具有关联关系, Palette与 MyColor之间是聚合关系。 MyColor为以 RGB方式表示颜色,由属性 red、 green和 blue表示,每个MyColor对象即为一个 RGB颜色。 MyColor具有两个构造器,缺省构造器将RGB颜色均初始化为 0;带参数的构造方法将当前对象的 RGB值设置为调用构造方法时消息中所传递的参数值。 toString()用来构造并返回当前对象的 RGB值的字符串供测试使用。 Palette类用于表示调色板,有调色板颜色数,用 int型 number表示,有MyColor对象数组,用 MyColo
38、r palette表示。 Palette的缺 省构造方法中,将number设置为 256色,并将 palette初始化成 256色 MyColor数组。另一个构造方法 Palette(MyColor pale, intnumber)中参数有 MyColor对象数组 pale以及颜色数量 number。该构造方法设置当前调色板对象的颜色数量,用 this number表示当前对象的 number属性,将参数 palette数组赋值给当前对象的 palette,用this palette表示当前对象的 palette属性。 toString()方法用来构造并返回 palette中每个 颜色对象的颜
39、色的字符串,供测试使用。在 toString()方法体内部,构造字符串时用 +进行拼接 palettei时,每个数组元素调用当前对象的 toString()构造并返回一个 RGB颜色的字符串。 Drawing类属性 int COLORNUMBER定义绘画时所用的颜色数量 (本例中设置为 16表示基于 16色绘图 )。 main()方法声明调色板 Palette palette、定义COLORNUMBER色 MyColor对象数组 color,即: MyColor color=new MyColor COLORNUMBER; 随机生成 RGB颜色并根据此颜色创建 COLORNUMBER个 MyC
40、olor对象,即循环 COLORNUMBER次,每次循环生成随机的 RGB颜色后调用 MyColor的带参数构造器创建 MyColor对象,即: colori =new MyColor(red, green, blue); 所有颜色数组创建完成后,基于所创建的 COLORNUMBER个 MyColor对象数组创建调色板,即: palette=new Palette(color, COLORNUMBER ); 采用 System out print1n(palette);进行打印 (模拟绘图 ),其中会自动调用调色板的 toString()方法。由于 COLORNUMBER的作用是绘图的颜色数量,在创建 MyColor对象数组时作为元素个数,所以,需要是 static final静态常量。 综上所述,空 (1)需要表示 MyColor对象数组,即 MyColor;空 (2)需要表示当前对象的 number属性,即 this number;空 (3)需要当前对象的 palette属性,即this palette;空 (4)需要表示 COLORNUMBER为静态常量,即 static final;空 (5)处为创建 MyColor类的对象,即 new MyColor。