1、软件水平考试(初级)程序员下午(应用技术)模拟试卷 26 及答案与解析 1 阅读以下技术说明、流程图和 C程序,根据要求回答问题 1和问题 2。 【说明】 如图 6-13所示的程序流程图描述了对 8位二进制整数求补的算法。该算法的计算过程如下:从二进制数的低位 (最右位 )开始,依次向高位逐位查看,直到首次遇到“1”时,停止查看。然后,对该 “1”位左面的更高位 (如果存在的话 ),逐位求反,所得的结果就是对原二进制数求补的结果。例如:对二进制整数 10010110求补的结果时 01101010。 设 8位二进制整数中的各位,从低位到 高位,依次存放在整型数组 BIT的 BIT1 BIT8中。
2、例如,二进制整数 10010110存放在数组 BIT后,则有 BIT1=0, BIT2=1, , BIT7=0, BIT8=1。若流程图中存在空操作,则用NOP表示。 以下待修改的【 C程序】完成的功能是:对于给定的 1个长正整数,从其个位数开始,每隔一位取 1个数字 (即取其个位、百位和万位等数字 ),形成 1个新的整数并输出。例如,将该程序修改正确后,运行时若输入 “9753186420”,则输出的整数为“73840”。 【 C程序】 行号 C代码 01 #include stdio.h 02 int main() 03 long n,num; 04 int i; 05 do 06 pri
3、ntf(“请输入一个正整数 :“); 07 scanf(“%1d“,n); 08 while(n =0); 09 k = 1; 10 for (i=1;n =0;i+) 11 if (i%2=1) 12 num = num + (n%10)*k; 13 k = k*10; 14 15 n = n/10; 16 17 printf(“新数据为 : %dn“,num); 18 return 0; 19 1 请将图 6-13流程图中 (1) (5)空缺处的内容补充完整。其中, (1)空缺处按 “循环变量名:循环初值,增量,循环终值 ”格式描述。 2 待修改的【 C程序】中存在 3个错误,请指出各个错
4、误所在的行号,并给出相应的修改意见。 3 阅读下列函数说明和 C代码,将应填入 (n)处的字句写在对应栏内。 【说明 2.1】 L为一个带头结点的循环链表。函数 deletenode(LinkList L, int c)的功能是删除 L中数据域 data的值大于 c的所有结点,并由这些结点组建成一个新的带头结点的循环链表,其头指针作为函数的返回值。 【函数 2.1】 LinkList deletenode(LinkList L, int c) LinkList Lc,p,pre; pre=L; p=(1); Lc=(LinkList)malloc(sizeof(ListNode) ); Lc-
5、 next=Lc while(p!=L) if(p- data c) (2); (3); Lc- next=p; p=pre- next; else pre=p; p=pre- next; return Lc; 【说明 2.2】 递归函数 dec_to_k_2(int n, int k)的功能是将十进制正整数 n转换成 k 2k9)进制数,并打印。 【函数 2.2】 dec_to_k_2(int n, int k) /*将十进制正整数 n转换成 k(2k9)进制数 */ if(n!=0) dec_to_k_2(4),k); printf(“%d“,(5); 4 阅读下列函数说明和 C代码,将应
6、填 入 (n)处的字句写在对应栏内。 假设以带头结点的单循环链表作非递减有序线性表的存储结构。函数deleteklist(LinkList head)的功能是删除表中所有数值相同的多余元素,并释放结点空间。 例如:链表初始元素为: (7, 10, 10, 21, 30, 42, 42, 42, 51, 70) 经算法操作后变为: (7, 10, 21, 30, 42, 51, 70) 【函数 3.1】 void deleteklist(LinkList head) LinkNode * p, * q; p=head- next; while(p!=head) q=p- next; while(
7、1) (2); free(q); q=p- next; p=p- next; 【说明 3.2】 已知一棵完全二叉树存放于一个一维数组 Tn中, Tn中存放的是各结点的值。下面的程序的功能是:从 T0开始顺序读出各结点的值,建立该二叉树的二叉链表表示。 【函数 3.2】 #include istream.h typedef struct node int data; stuct node leftChild, rightchild; BintreeNode; typedef BintreeNode * BinaryTree; void ConstrncTree(int T, int n, int
8、 i, BintreeNode * /*置根指针为空 */ else ptr=-(BTNode * )malloc(sizeof(BTNode) ) ptr- data=Ti; ConstrucTree(T,n,2, i+1, (4); ConstrucTree(T,n,(5),ptr- rightchild); main(void) /*根据顺序存储结构建立二叉链表 */ Binarytree bitree;int n; printf(“please enter the number of node: n%s“ ;n); int* A = (int *) malloc(n * sizeof(
9、int); for(int i=0;i n;i+)scanf(“ %d,A+i); /*从键盘输入结点值 */ for(int i=0;i n;i+)printf(“ %d“,Ai); ConstructTree(A, n,0, bitree); 5 阅读以下说明和 C代码,将应填入 (n)处的字句写在对应栏内。 【说明】 该程序的功能是从文件 IN.DAT中读取一篇英文文章存入到字符串数组 xx中,以行为单位对行中以空格或标点符号为分隔的所有单词进 行倒排。最后把已处理的字符串 (应不含标点符号 )仍按行重新存入字符串数组 xx中,最后把结果 xx输出到文件 OUT6.DAT中。 例如:原文
10、: You He Me I am a student 结果: Me He You student a am I 原始数据文件存放的格式是:每行的宽度均小于 80个字符,含标点符号和空格。 【函数】 #include string.h #include conio.h #include ctype.h #include stdio.h char xx50 80; int maxline=0; /*文章的总行数 */ int ReaaDat(void); void WriteDat(void); void StrOL(void) char * p1, * p2,t80; int i; for(i=
11、0;i maxline;i+) p1=xxi;t0=0; while(*p1)p1+; while(p1 =xxi) while(!isalpha(*p1) p2=p1; while(1)p1-; if(p1=xxi) if(isalpha(*p1)p1-; else if(!isalpha(*(p1+1)break; p2+; (2); strcat(t, p1+1); strcat(t,“ “); strcpy(xxi,t); void main( ) if(3) printf(“数据文件 in.dat不能打开 !n007“ ); return; StroL(); writeDat();
12、getch(); int ReadDat(void) FILE * fp; int i =0; char * p; if(fp=fopen(“e:ain.dat“,“ r“ )=NULL)return 1; while(fgets(xxi,80,fp)!=NULL) p=strchr(xxi,n) if(p)*p=0; i+; maxline=(4) fclose(fp); return 0; void WriteDat(void) FILE * fp; int i; fp=fopen(“e:aout6,dat“,“w“); for(i=0;i (5);i+) printf(“%sn“,xxi
13、); fprintf(fp,“%sn“,xxi) fclose(fp) 6 阅读以下应用说明及 Visual Basic程序代码,将应填入 (n)处的字句写在对应栏内。【应用说明 5.1】 本应用程序的窗体中有一个下拉式列表框 (名称为 Combo1)和两个文本框 (名称分别为 Txt1和 Txt2)。运行时,用户从 Combo1的列表中进行选择,程序就会将选中条目的内容以及编号 (从 0开始 )分别在文本框 Txt1和 Txt2中显示出来。 【程序代码 5.1】 Private Sub Combo1_Click() Txt1.Text = Combo1. (1) Txt2.Text = Co
14、mbo1. (2) End Sub (注:可供 (2)处选择的选项: List, Index, Listlndex, ListCount, Number) 【应用说明 5.2】 本应用程序的运行窗口如图 2所示。开发该应用的部分程序代码如下: 【程序代码 5.2】 Private Sub CmbOp_Click() Dim Dataln As Double,DataOut as Double Dataln=(3) Select Case (4) Case “取整数部分 “ DataOut =Int(Dataln) Case “求平方根 “ If Dataln 0 Then MagBox “负数
15、不能开平方 !“ Else DataOut = Sqr(Dataln) End If Case “取绝对值 “ DataOut = Abs(Dataln) (5) TxtOut. Text = str $ (DataOut) End Sub 7 阅读以下说明及 Visual Basic程序代码,将应填入 (n)处的字句写在对应栏内。【说明】 某学校举办了一场奥运知识竞赛,参加竞赛的选手为 200名, 1 200为选手编号。竞赛时间为 9:00 11:00。 8道竞赛题目依次从 “A” “H”编号,选手可按任意次序答题,每完成一道题目,可立即提交答案。若答案正确 (Y),则选择其他题目进行解答,
16、否则,可继续做该题目或选择其他题目进行解答,直至竞赛结束。 选手提交答案的情况及判定结果由专人即时录入,录入数据包括提交 答案的时间、选手编号、题目编号 (A H)、是否正确 (Y/N)等。 对竞赛情况进行统计和排名的规则如下: 1若选手 X在竞赛时提交的题目 P解答正确,则解答该题目所用时间计算如下: 解答题目 P的用时 =提交题目 P正确的时间 -竞赛的开始时间 +罚时,罚时 =提交题目 P错误解答的次数 20例如:表 1中 14号选手在 10:27提交了题目 A的正确解答,因此该选手正确解答该题目所用时间 P为 87分钟,由于他在09:37和 09:52两次提交了题目 A的错误解答,因此
17、罚时为 (220)分钟 =40分钟,所以 14号选手解答题目 A的用时 =(87+ 40)分钟: 127分钟。 2已经提交正确答案的题目再次提交时不再计算。 3竞赛结束时,选手的总用时为所有解答正确的题目用时累加所得,解答不正确的题目不计时。 4排名时,完成题目数量多者排名靠前;若完成的题目数相同,则用时少者排名靠前;若完成的题目数和所用时间均相等,则名次相同;完成题目数为。的选手不参加排名。 本应用程序的运行窗口如图 3所示。 窗口中的两个文本框为Txt_time和 Txt_player,分别用于录入提交答案的时间和选手编号。组合列表框Combo1提供题目编号 (A H),录入时从 中选择。
18、检查框 Chk_yn用于输入解答是否正确信息。当单击 “确定 ”按钮 (Cmd_comfirm)时,录入的提交信息加入列表框List1中,排名情况在列表框 List2输出。单击 “关闭 ”按钮时退出应用程序。 在开发过程中,需要编写的部分程序代码如下: 【程序】 Private Type info No As Integer 选手编号 Num As Integer 完成题目数量 Time As Integer 完成题目的总用时 d(8)As Integer d用于记录提交第 i个题目错误答案的次数 a(8)As Boolean a用于记录第 i个题目是否已经提交正确答案 End Type Di
19、m R(201)As info Rj用于统计编号为 j的选手提交答案的情况 Dim Maxlndex As Integer Maxlndex记录提交答案的选手中编号最大者 Private Sub Form_Load() For i = 1 to 8 Combo1. Addltem chr(1) Next Combo1. Text = Combo1. List(0):txt_time.Text =“ “:txt_player.Text =“ “ For i = 1 To 200 R(i) num=0:R(i).time =0:R(i).no=i Forj = 1 To 8 R(i).d(j) =
20、0:R(i).a(j) =False Next j,i End Sub Private Sub cmd_confirm_Click() Dim h, m, k, time As Integer, ch, pass, s1 As String K = Instr(txt_time, text,“: “):If k 2 Then Goto error1 H = Val(Left(txt_time. Text, k-1):m = Val(Mid(txt_time. Text, k+1) If h 11 Or h=11 And m 0 Or m =60 Then goto errorl Time=(2
21、) 计算答题时间,以分钟为单位 If txt_plater, text 1 or txt_player, text 200 Then Goto errorl ch=(3) pass = IIf(chk_yn.(4)=0,“N“ ,“Y“) s1 = txt_time. Text+Space(4) + txt_player. Text s1 = s1 + Space(10 - Len(txt_player. Text)+ch+Space(8)+pass List1. Additem s1 K = Val(txt_player. Text) k为选手编号 R(k). no =k 编号为 k的选手的
22、提交信息记录在下标为 k的数组 元素中 If kmaxindex Then maxindex = k M =Asc(ch)-Asc(“a“) If pass “Y“ Then 编号为k的选手提 交第 m个题目的解答不正确 R(k).d(m)=R(k).d(m)+1 Else If R(k).a(m) True Then 已经提交正确的题目的解答不再计算 R(k).a(m) =true:R(k).num=R(k).num+1 R(k).time = R(k). time +(5) Call statistic 调用过程statistic进行实时排名和输出 End If Exit Sub erro
23、r1: MsgBox “录入信息有错误 !“ ,vbOKOnly End Sub 8 阅读以下说明 和 C+程序,将应填入 (n)处的语句写在的对应栏内。 【说明】 以下程序的功能是计算三角形、矩形和正方形的面积并输出。 程序由 4个类组成:类 Triangle、 Rectangle和 Square分别表示三角形、矩形和正方形;抽象类 Figure提供了一个纯虚拟函数 getArea(),作为计算上述 3种图形面积的通用接口。 【 C+程序】 #include iostream.h #include math.h class Figure public: virtual double getA
24、rea()=0; /纯虚拟函数 ; class Rectangle:(1) protected: double height; double width; public: Rectangle() ; Rectangle(double height,double width) this- height=height; this- width=width; double getArea() return (2); ; class Square:(3) public: Square(double width) (4); ; class Triangle:(5) double la; double l
25、b; double lc; Public: Triangle(double la, double lb, double lc) This- la=la; this- lb=lb; this- lc=lc; double getArea() double s = (la+lb+c)/2.0; return sqrt(s,(s-la)*(s-lb)*(s-Ic); ; void main() Figure*figures3= new Triangle(2,3,3), new Rectangle(5,8), new SqUare(5); for(int i=0;i 3;i+) cout “figur
26、es“ i “area=“ (figuresi)- getArea() endl; 9 阅读以下说明和 Java代码,将解答写入对应栏内。 【说明】 下面的程序中定义了两个方法求自然数 1 100的和。具体如下: int suml(int n);利用循环求 1 n的和, int sum2(int n);利用递归方法求和 1 n的和;在 main()方法中调用这两个方法求 1 100的和并显示。在程序的每条横线处填写一个适当的语句,使程序的功能完整。 public class Sum public static void main (1) /1. 调用 sum1(int n),求 1 100的和
27、 /标准输出 (2) (“1 100的和 :“ +sum1(100); /2. 调用 sum2(int n),求 1 100的和 /标准输出 (2) (“1 100的和 :“+sum2(100); static iht sum1( int n) int result=0; for(int i=1;i =n;i+) (3) retrun result; static int sum2(int n) if (4) return 1 else (5) 软件水平考试(初级)程序员下午(应用技术)模拟试卷 26 答案与解析 1 【正确答案】 (1)i: 1, 1, 8 (2)1sw (3)0BITi (
28、4)NOP,或空操作 (5)1BITi 【试题解析】 由于题目中给出了对 8位二进制整数求补的算法,并且指明将 8位二进制整数中的各位,从低位到高位,依次存放在整型数组 BIT的 BIT1 BIT8中,因此,循环控制变量的初值应该为 1(从二进制数中的最低位开始 )、终值为8(二进制数中的每一位都要检查 )、增量为 1(每次检查 1位 ),按照 “循环变量名:循环初值,增量,循环终值 ”格式描述,则 (1)空缺处所填写的内容为 “i: 1, 1,8”。 0 由题目中给出的算法可知 ,从最右位开始向左找到的第一个 “1”及其右边的各位是不取反的,因此需要一个标志, sw 起的就是这个作用。由于
29、SW的初始值为0,因此在找到从右边数的第 1个 “1”之前,当 BITi等于 “0”且 SW=O时,则说明这些二进制位无须取反,对应于流程图的 (4)空缺处的操作应为空操作 (即 NOP)。 当某个 BITi的值等于 “1”且 SW的值等于 0,则说明找到了从右边数的第 1个“1”,此时应将 SW的值置为非 “0”,因此流程图中 (2)空缺处的操作要对 SW置1,即该空缺处所填写的内容是 “1sw” 。 最后,应将其余 各位取反,即 BITi等于 1时,要在流程图的 (3)空缺处将其置0(即 0BITi) ;反之,则要在流程图的 (5)空缺处将其置 1(即 1BITi) 。 2 【正确答案】 第 3行,变量 num没有初始化,应将其初始值设为 0 第 7行, scanf函数参数错,应将语句 “scanf(“%1d“,n);”中的 n修改为 “或等价形式 (4)n=1; (5)return n+sum2 (n-1); 【试题解析】 此处为 Java主函数的参数,是固定写法。 Java程序的标准输出是调用 System包的 out对象的函数。循环累加。这是递归调用的结束条件。对 n-1进行递归调用,并 返回 n 和 n-1个整数和的和。