1、软件水平考试(初级)程序员下午(应用技术)模拟试卷 11及答案与解析 1 阅读以下说明和流程图,回答问题,并将解答填入对应栏内。【说明】 求解约瑟夫环问题。算法分析: n个士兵围成一圈,给他们依次编号,班长指定从第 w个士兵开始报数,报到第 s个士兵出列,依次重复下去,直至所有士兵都出列。 【流程图】 【问题】 将流程图中的 (1) (5)处补充完整。 2 阅读以下函数说明和 C语言函数,将应填入 (n)处的字句写在对应栏内。 【函数 2.1】 void sort(char *s,int num) int i,j-num; char t; while(j- 1) for(i=0;i j;i+)
2、 if(si si+1) t=si; si=si+1; si+1=t; void main() char *s=“CEAedea“; sort(s,5); printf(“%s“,s); 上述程序的结果是 (1) 【函数 2.2】 void main() union int ig6; Char s12; try; try. ig0=0x4542; try.ig1=0x2049; try. ig2=0x494a; try.ig3=0x474e; try. ig4=0x0a21; try.ig5=0x0000; pintf(“%s“,try, s); 上述程序的结果是 (2) 【函数 2.3】 v
3、oid main() char *letter5= “ab“,“efgh“,“ijk“,“nmop“,“st“; char *p; int i; p=letter; for(i=0;i 4;i+) . printf(“%s“,pi); 上述程序的结果是 (3) 【函数 2.4】 main() int i=4,j=6,k=8,*p= int x,y,z; x=p= y=3*-*p/(*q)+7; z=*(r= printf(“x=%d,y=%d,z=%d“,x,y,z); 上述程序的结果是 (4) 【函数 2.5】 int a=5,4,3,2,1 ; void main() int i; int
4、 f=a0; int x=2; for(i=0;i 5;i+) f+=f*x+ai; printf(“%d“,f); 上述程序的结果是 (5) 3 阅读以下说明和 C语言函数,将应填入 (n)处的字句写在对应栏内。【说明】 将A, B, C, D, E, F这 6个变量排成如图 (a)所示的三角形,这 6个变量分别取 1,6中的整数,且均不相同。求使三角形三条边上的变量之和相等的全部解。图 (b)就是一个解。 程序引入变量 a,b,c,d,e,f,并让它们分别顺序取 1 6的整数,在它们互不相同的条件下,测试由它们排列成的如图 (a)所示的三角形三条边上的变量之和是否相等,如果相等即为一种符合
5、要求的排列,就输出它们。 【 程序】 void main() int a, b, c, d, e, f; for(a=1;a =6;a+) for(b=1;b =6;b+) if(1) continue; for(c=1;c =6;c+) if(2)continue; for(d=1;d =6;d+) if(3) continue; for(e=1;e =6;e+) if(4) continue; f=21-(a+b+c+d+e); if(5) printf(“%6d“,a); printf(“%4d%4d“,b,f); printf(“%2d%4d%4d“,c,d,e); scanf(“%*
6、c“); /*按回车键,继续找解 */ 4 阅读以下说明和 C语言函数,将应填入 (n)处的字句写在对应栏内。 【说明】 下面一段程序从给定的数组 b中找出值最小的元素,并输出该元素的数组下标、内存地址 minaddr以及元素值本身。函数 findmin负责在给定的数组中查找最小值,并返回最小值所在的内存地址,函数有三个参数: array是所要处理的数组;size是数组的大小 ; index负责从函数返回具有最大值的元素在数组中的数组下标。请填充空白,使其成为一个合乎要求的完整程序。 【程序】 /程序开始 #include iostream.h int *findmin(int *array,
7、 int size, int void main() /* 变量定义部分 */ int b10 = 34, 34, 23, 89, 1, 2, 13, 42, 5, 54; (1); int idx; /* 寻找最小值 */ minaddr = findmin(b, sizeof(b)/sizeof(int), idx); /* 输出最小值的有关信息 */ cout “Min value index: “ idx end1 “Min value address: “ minaddr end1 “Min value: “ (2) end1; /* 函数 findmin的定义部分 * int *f
8、indmin(int *array, int size, int /max 是当前具有最小值的数组元素下标值 for(int i = 1;(3); i+) if(arrayi (4) min = i; (5); return array + min;/返回最小值所在内存地址 5 阅读以下说明及 Visual Basic程序代码,将应填入 (n)处的字句写在对应栏内。 说明 我国现行使用的公民身份证号码有两种,分别遵循两个国家标准: GB 11643-1989和 GB 11643-1999。 CB 11643-1989中规定的是 15位身份证号码,排列顺序从左至右依次为:六位数字地址码,六位数字
9、出生日期码,三位数字顺序码,其中出生日期码不包含世纪数。 GB 11643 -1999中规定的是 18位身份证号码,是特征组合码,它由十七位数字本体码和一位数字校验码组成。排列顺 序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码。其中,校验码 C由本体码按如下过程求得: (1)计算校验码和S=a18W18+a17W17+a2W2 ,其中 i表示 18位身份证号,码每一位的序号,从右至左,最左侧为 18,最右侧为 1;ai表示身份证号码第 i位上的号码; wi表示第 i位上的权值,其值为 2i-1模 11的结果; (2)计算校验码值 R,其值为校验和模 11的结果
10、; (3)根据下面对应关系找出校验码 C: 由上述计算过程可以看出, 18位身份证号码中可能包含非数字的字母 X(代表 数字 10)。下面的应用程序基于这一算法实现了身份证号码的升位查询: 在开发过程中,显示新旧两种身份证号码的文本框 (TextBox)分别名为 Text1和 Text2, “号码升位 ”按钮 (CommandButton)名为Command1。 代码中使用到的字符串函数及功能说明如下: (1)Len(s):获取字符串s的长度; (2)Left(s, 1):返回字符串 s左端长度为 1的子串; (3)Right(s, 1):返回字符串 s右端长度为 1的子串; (4)Mid(s
11、, p, 1):返回字符串 s从第 P个字符开始长度为 1的子串。 Visual Basic代码 计算 18位身份证号码 Private Sub Commandl_Click() Dim code As String Dim S As Integer code = Textl. Text 提取 15位身份证号码 If Len(code) 15 Then MsgBox “ID 号码长度不正确,请检查 !“ (1) End If code = Left(code, 6) + “19“ + (2) (code, 9) 年份升位 S=0 For i = 18 To 2 Step -1 计算校验码和 S
12、 = S + Clnf(3) * (2 (i - 1) Mod11) Next i (4) 计算校验码值 Select Case S 确定校验码 Case 0: code = code + “1“ Case 1: code = code + “0“ Case 2: code = code + “X“ Case Else: code = code + CStr(5) End Select Text2. Text = code 显示 18位身份证号码 End Sub 6 阅读以下说明及 Visual Basic程序代码,高尔夫球应填入 (n)处的字句写在对应栏内。 说明 设某单位 Acess数据库
13、中有一张员工信息表,其中记录了员工编号、姓名、性别等基本信息。下面的应用程序利用数据控件 (Data)实现了对这张表中记录的增加、删除和修改操作。其运行界面如下: 在开发过程中,数据控件 Data1与员工数据表相连接,各文本框、 “性别 ”组合列表框 Combo1、 “政治面貌 ”组合列表框 Combo2都分别与数据表的相应字段绑定,界面上从左到右各操作按钮分别取名为 CmdAdd、 CmdDel、 CmdUpdate和 CmdExit。 Visual Basic代码 Private Sub Form_Load( ) 加载窗体 Combo1. (1) “男 “ Combo1. (1) “女 “
14、 Combo2. (1) “党员 “ Combo2. (1) “团员 “ Combo2. (1) “群众 “End SubPrivate Sub CmdAdd_Cliek( ) 增加记录 Datal. Recordset. AddNewEnd SubPrivate Sub CmdDel_Click( ) 删除记录 Datal. Recordset. (2) Datal. Recordset. MoveNextEnd SubPrivate Sub CmdUpdate_Click( ) 修改记录 If Datal. ReadOnly = (3) And Datal. Recordset. Upda
15、table Then Datal. Recordset. Edit Datal. Recordset. (4) Else MsgBox “数据表不允许修改 !“ End IfEnd SubPrivate Sub CmdExit_Click ( ) 退出程序 Dim ret As Long ret : MsgBox(“真的要退出吗 ?“, vbQuestion + vbYesNo, “退出 “ ) If (5) Then Datal. Reeordset. Close End End ffEnd Sub 7 阅读以下说明和 C+程序,将应填入 (N)处的字句写在对应栏内。 函数 8.1说明 现考
16、虑编写一个扑克游戏:只用一副无大小王的扑克,扑克的花色 (suit)分为Spade、 Heart、 Diamond和 Club,每门花色的牌共 13张,面值 (rank)分别为 2、 3、4、 5、 6、 7、 8、 9、 10、 Jack、 Queen、 King和 Ace,每张扑克牌应包含如下信息:惟一的 ID号 (1 52)、花色、面值、背面图案的编号等。每张扑克牌的操作有:判断两张扑克牌是相同花色吗 ?相同面值吗,判断一张扑克牌是给定的花色吗 ?是给定的面值吗 ?请补充扑克牌类 Card类的声明和实现代码,要求选取适当形式的数据成员描述每张扑克牌的信息,同时以成员函数的形式实现指定的操
17、作。 C+程序 const enum SUIT SPADE=0,HEART,DIAMOND,CLUB; const enum RANKTWO=0 THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TEN,JACK,QUEEN,KING,ACE; class Card。 public: (1) (int id): mID (id), mSuit(id 1)/13), mRank(id-1)%13) bool IsSameSuit (const Card int b; public: vector (int x=0,int y=0): a(x), b(y) double o
18、perator*(4) double c; (5); return c; void input (int x, int y) a=x; b=y; void output () cout ( a , b “) “ end1; ; void main() vector x(10,20), y; /定义 x, y, z三个矢量类对象,并将 x置初值 (10, 20) doubled; /定义实数 d以存放点乘结果 y. input (2, 3); /给 y赋值为 (2, 5) d=x*y; /两矢量点乘 x. output (); /输出矢量 x y. output (); /输出矢量 y cout
19、 d end1; /输出点乘结果 8 阅读以下程序说明和 Java代码,将应填 (n)处的字句写对应栏内。 说明 本程序的功能是产生一个抽奖游戏中的随机数组合。抽奖的规则是从自然数 1至50中无重复抽取 6个数。为了保证抽取的无重复性,将 50个自 然数放在数组source中。每抽取了一个数,就用数组的最后一个数来改写这个被抽中的数,并把数组的长度减 1。为使输出更为清晰,把抽取出来的 6个数放在数组 target中,经过排序 (Arrays类中的 sou方法实现排序 )然后输出。注: Math random方法返回一个在 0(包含 )到 1(不包含 )之间的随机浮点数。 Java代码 imp
20、ort java. util. *; public class DrawOut public static void main (String args) int n =50; int k =6; int source = new intn; for(int i=0; i (1);i+) sourcei = i + 1; int target = new intk; /将抽中的数字从 source数组中取出,放入到 target数组 for (int i = 0; i (2); i+ +) int r = (int) (Math. random() * (3); targeti = sourc
21、er; r =(4); (5); Arrays. sort(target); for (int i = 0; i target, length; i + + ) System. out. prinfln ( target i ); 软件水平考试(初级)程序员下午(应用技术)模拟 试卷 11答案与解析 1 【正确答案】 (1)Li.nextp=1 (2) k=w-1 (3) count!=n (4) +I (5) +count 2 【正确答案】 (1)ACEdeea (2) BEI JING! (3) abefghijkmnop (4) x=1,y=5,z=24 (5) 129 3 【正确答案】
22、 (1)b=a (2) c=ac=b (3) d=ad=bd=c (4) e=ae=be=ce=d (5) a+b+c=c+d+e & a+b+c = e+f+a 4 【正确答案】 (1)int *minaddr (2) bidx (3)i size (4) arraymin (5) index = min 5 【正确答案】 (1)Exit Sub(2)Right(3)Mid(code, 19-i, 1) (4)S=S Mod 11 (5)12-S 【试题解析】 (1)输入错误时,应即刻退出过程; (2)注意到 “19”是夹在 15位身份证号码左端 6位与右端 9位之间的,按照参数调用格式可以
23、推断此处函数是 Right; (3)此处应填入身份证号码中第 i位 (从左端起、序号自 18递减 )上的号码,它位于字符串 code的第 19-i位 (从左端起、序号自 1递增 ),因此可用 Mid(code, 19-i, 1)来获取; (4)略; (5)从校验码值与校验码的转换关系可知:当校验码值大于等于 3时,校验码值与校验码之和为 12。 6 【正确答案】 (1)Addhem(2)Delete(3)False(4)Update(5) ret=vbYes 【试题解析】 (1)组合列表框中的列表项是在窗体加载时添加的,其方法是调用组合框控件对象的 Addhem方法; (2)从数据集中删除记录
24、应使用 Delete方法; (3)若数据控件的 ReadOnly(只读 )属性为真,则数据记录不可更改,因此此处取假值; (4)数据集的 Edit方法用于对可更新的当前记录进行编辑修改。 Update方法则用于将修改的记录内容保存到数据库中。 (5)询问窗口返回两种值,一是单击按钮 “是 (Y)”返回的 vbYes,二是单击按钮 “否(N)”按钮返回的 vbNo。选择前者将结束程序。 7 【正确答案】 (1)Card (2)false:mSuit=rhs. mSuit (3)mSuit=suit (4)vector &x (5)c=a*x. a+ b*x. 8 【正确答案】 (1)source
25、. length (2)target. length (3)n (4)Sourcen-1 (5)n- 【试题解析】 本处 for循环的功能是将自然数 1至 50顺序放到 source数组中。数组 的下标从。开始,上标是 source. length; (2)本处 for循环的功能是将从 source数组中取出的数字放入 target数组。数组的下标从 0开始,上标是 tar- get. length; (3)Math. random方法返回一个在 0(包含 )到 1(不包含 )之间的随机浮点数,乘以n(此处值为 50)是为了产生一个。至 49之间的整数作为从 source数组中取数字的下标; (4)本行代码的功能是把 source数组的最后一个数字来改写这个被抽中的数字; (5)本行代码的功能是调整数组 source的大小,将 数组长度 n减 1。