1、软件水平考试(初级)程序员下午(应用技术)模拟试卷 21及答案与解析 1 阅读以下函数说明和 C程序,将 C程序中 (1) (6)空缺处的语句补充完整。 【说明】 喜迎 2008年北京奥运会 !以下【 C程序】能将一个给定汉字 (例如,奥运会的“会 ”字 )的点阵逆时针旋转 90,并输出旋转前后的点阵数据及字形。 图 1-15是汉字 “会 ”字的 1616点阵字形,用数字 0表示空白位置,用数字 1表示非空白位置,“会 ”字的第 1行即可表示成如下的 0, 1序列: 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 如果把它 看做一个字的 16个位, “会 ”字的第 1行可以用十
2、六进制数 0100来表示。同理, “会 ”字的第 2行可以用十六进制数 0240表示,第 3行可以用十六进制数 0420表示 依此类推,用 16个双字节整型数即可存放一个汉字点阵字形。 “会 ”字的点阵数据及字形如图 1-15的左半部分所示。 将一个汉字逆时针旋转 90,就是把该汉字点阵的最右列作为旋转后新点阵的第 1行,次最右列作为旋转后新点阵的第2行 依此类推来形成一个旋转后的点阵字形。图 1-15的右半部分就是将 “会 ”字逆时针旋转 90后的点阵数据和字形 (提示:读者可将书本顺时 针旋转 90,以查看旋转 90后的点阵字形 )。 在【 C程序】中,数组 old存放着 “会 ”字的 1
3、6个双字节整型点阵数据。函数 turnleft能将该点阵数据逆时针旋转 90,旋转后的点阵数据存放在数组 new中。函数 display能将旋转前后的点阵数据加以编辑,用字符 “.”表示值为 0的位,用字符 “x”表示值为 1的位,从而将旋转前后的点阵按行输出其十六进制的数据和字形,如图 1-15所示。 【 C程序】#include stdio.h #define EMPTY .#define NONEMPTY x#define LEFT 0#define RIGHT 1main () static unsigned old16= 0x0100,0x0240,0x0420,0x0810,0x1
4、004,0x23c2, 0x4001,0x8ff8,0x0100,0x0200,0x0400,0x0800, 0xl000,0x2004,0x7ffe,0x0001 ; unsigned new16; turnleft (old, new); display (old,new);turnleft (old,new)unsigned old,new; int row, k; for (row=0;row 16;row+) for (1);k 16;k+) newrow|=(oldk (2)display (old, new)unsigned *old,*new; char out2 17,let
5、ter2; int row, col; letterO = EMPTY; letter1 = NONEMPTY; outLEFT 16=outRIGHT 16=(4); for (row = 0;row 16;row+,old+,new+) for (col = 0;co1 16;+col) outLEFT col = letter (5) outRIGHT col = letter (6) printf(“n %4x %s“,*old, printf(“%4x %s“,*new, 2 阅读以下应用程序说 明和 C程序,将 C程序段中 (1) (7)空缺处的语句填写完整。 【说明】 以下【 C
6、程序】能将自然数 1, 2, , N2按蛇形方式逐个存入 N阶矩阵。换言之,程序从 anO开始到 aOn。为止 (n=N-1)顺序填入自然数,交替地对每一斜列从左上元素向右下元素或从右下元素向左上元素存数。 例如,当 N=5时,程序输出结果如图 2-12所示;当 N=8时,程序输出结果如图 2-13所示。 【 C程序】 #include stdio.h #define SIZE 10int aSIZESIZE, k;main() int i, j, n, N; for (N = 3; N =SIZE; N+) k = 1; makeArray (n = N-1); printf (“nN =
7、%d;n“, n+1); for (i = 0; i =n; i+) for (j = 0; j =n; j+) printf(“%4d“, ai j); printf (“n“); makeline (int row_start, int col_start, int row end) /*完成矩阵一条斜线的整数 填写 */ int i, j, sign =(1); for (i = row_start, j = col start;(2); i += sign, j += sign) ai j = k+;makeArray (int n) /*完成矩阵每条斜线的整数填写 */ int d;
8、 for (d = 1; d =(3); d+) if (d = n) if (d%2) makeline (4); else makeline (5); else if (d%2) makeline (6); else makeline (7); 3 阅读以下应用程序说明和 C程序,将 C程序段中 (1) (7)空缺处的语句填写完整。 【说明】 某超市集团为发展业务向社会公开招聘 N个工种的工作人员,每个工种各有不同的编号 (1至 M)和计划招聘人数。每位应聘者需申报两个工种,并参加集团组织的考试。该集团公司将按应聘者的成绩从高分至低分的顺序进行排队录取。具体录取原则是:从高分到低分依次对每
9、位应聘者先按其第一志愿录取;当不能按其第一志愿录取时,便将他的成绩扣去 5分后,重新排队,并按其第二志愿录 取。 以下 C程序为输出各工种实际招聘的应聘人员,每个工种都保留一个录取者的有序队列。录取处理循环直至招聘额满或已对全部应聘者都作了录取处理后跳出。 C程序中,类型 STU包含有应聘者的基本信息:编号、成绩、志愿、排队成绩和录取志愿号。数组 rzl)的每个元素对应一个工种,包含有计划招聘人数和已录取的人数。 【 C程序】 #include #define N 36 #define EDMARK 5 typedef struct stu int no, total, z2, sortm,
10、zi; struct stu *next; STU; struct rznode int lmt, count; STU *next; rz N; STU *head = NULL, *over = NULL; int all FILE *fp; char dataf = “zp2008.dat“ ; print(STU *p) for (;p!=NULL; p = p- next) printf( “%d(%d) t“ , p- no, p- total insert(STU *p, STU *u) STU *v, *q; for (q = *p;q != NULL; v = q , (1)
11、 ) if (q- sortm u- sortm) break; if ( q = *p) (2); else (3); u- next = q ; main ( ) int zn, i, no, total, zl, z2 ; STU *p, *v, *q; fp = fopen(dataf, “r“ ); if (fp = NULL) printf (“Cant open file %s.kn“ ,dataf); exit (0); fscanf (fp, “%d“ , for (all = 0, i = 1; i = zn; i+) fscanf (fp, “%d“, rzi.count
12、 = 0; rzi.next = NULL; all +=(4); for (;) if ( fscanf(fp, “%d%d%d%d“ , p = ( STU *) malloc (sizeof (STU); p- no = no; p- total = p- sortm = total; p- zi = 0; p- z0 = z1; p- z1 = z2; (5); fclose (fp); for (;all ) p = head; head = head- next; if (rzp- zp- zi.count (6) rzp- zp- zi.count +; insert( all-
13、; continue; if (p- zi = 1 ) p- next = over; over = p; continue; p- sortm -= DEMARK; (7); insert( for (i = 1; i = zn; i+ ) printf(“%d:n“ ,i); print( rzi .next); printf(“ n“); printf( “over:n“ ); print(head); print(over); printf(“ n“); 4 阅读以下程序说明和 C程序,将程序段中 (1) (7)空缺处的语句填写完整。 【说明】 【 C程序 1】用回 溯算法来产生由 0
14、或 1组成的 2m个二进位串,使该串满足以下要求。 视串为首尾相连的环,则由 m位二进制数字组成的 2m个子序列,每个可能的子序列都互不相同。例如,如果 m=3,在串 11101000首尾相连构成的环中,由 3位二进制数字组成的每个可能的子序列都在环中恰好出现一次,它们依次是 111, 110, 101, 010, 100, 000, 001, 011,如图 2-14所示。 【 C程序 2】是求 “背包问题 ”的一组解的递归算法程序。 “背包问题 ”的基本描述是:有一个背包,能盛放的物品总重量为S,设有 N件物品,其重量分别为 W1, W2, , Wn,希望从 N件物品中选择若干件物品,所选物
15、品的重量之和恰能放入该背包,即所选物品的重量之和等于 S。【 C程序 1】 #define N 1024#define M 10int b N+M-1int equal(int k, int j int m) int i; for(i=0; i m; i+ if ( b k + i (1) ) return 0; return 1; int exchange (int k, int m, int v) while ( b k + m - 1 ) = v ) b kncm-i=! v (2); (3)=v; return k;init ( iht v) int k for( k = 0;K =
16、N + M - 1;k+) bk = v;main ( ) int m, v, k, n, j; printf (Enter m (lm 10) , v v=0, v=1) n“) ; scanf (“ %d%d , n = 0x01 m; init (!v); k=0; while(4) n) for (j=0;j k;j+) if (equal (k, j, m) k=exchange (k, m, v) j=(5); for (k= 0 ;k n ;k+ ) print (“ %d n“ , bk) ; 【 C程序 2】 #include stdio. h #define N 7#def
17、ine S 15int wN+1 = 0, 1, 4, 3, 4, 5, 2, 7;int knap (int S, int n) if (S = 0) return 1; if (s 0 | (s 0 if (6) printf( “4d“, wn); return 1; return (7) main ( ) if (knap (S, N) printf(“OK:n“); else printf(“NO!n“) 5 阅读以下关于某绘图系统的技术说明、部分 UML类图及 Visual Basic程序,将Visual Basic程序中 (1) (6)空缺处的语句填写完整。 【说明】 某绘图系统
18、定义了一个抽象类 Ishape,现有 3个类 Cpoint, CLine和 Ccircle,它们都具有 IShape界面。相应的类图关系如图 5-11所示。 已知某第三方库已经提供了 XCircle类,且完全满足 CCircle图元显示时所需的功能。【 Visual Basic代码 6-1】是抽象类 IShape类模块内容。【 Visual Basic代码 6-2】实现了类 CCircle的 IShape界面,并使用了 XCircle提供的显示功能。 XCircle提供的显示功能方法接口为 displayIt。 【 Visual Basic代码 6-1】 Publie Color As Lon
19、g Sub draw() 方法体不包括可执行语句 End Sub Sub move(stepx As Single, stepy As Single) 方法体不包括可执行语句 End Sub 【 Visual Basic代码 6-2】 (1) Private color As Long 其他定义省略 Private ridged As (2) Private Sub Class_Initialize() Set bridged=(3) End Sub Private Property (4) ()As Long IShape_Color=color End Property Private P
20、roperty (5) (ByVal newColor As Long) Color=newColor End Property Private Sub IShape_draw() 使用 XCircle提供的显示功能 (6) End Sub Private Sub IShape_move(stepx As Single, stepy As Single) 省略描述 End Sub 6 阅读以下程序说明和 C+程序,将程序段中 (1) (5)空缺处的语句填写完整。 说明 C+语言本身不提供对数组下标越界的判断。为了解决这一问题,在以下 C+程序 中定义了相应的类模板,使得对于任意类型的二维数组,
21、可以在访问数组元素的同时,对行下标和列下标进行越界判断,并给出相应的提示信息。 C+程序 #include iostream.h template class T class Array; template Class T class ArrayBody friend (1); T* tpBody; int iRows,iColumns, iCurrentRow; ArrayBody(int IRsz, int iCsz) tpBody =(2); iRows = iRsz; iColumns = iCsz; iCurrentRow = -1; Public: T row_error = co
22、lumn_error =false; try if (iCurrentRow 0 | iCurrentRow = iRows) row_error = true; if (j 0 | j = iColumns) column_error = true; if (row_error = true | column_error = true) (3); catch(char) if (row_error = true) cerr “行下标越界 “ iCurrentRow “; if (column_error = true) cerr “列下标越界 “ j “; cout “n“; return
23、tpBodyiCurrentRow * iColumns + j; Arraygody()deletetpBody; ; template class T class Array ArrayBody T tBody; Public; ArrayBody T return tBody; Array(int iRsz, int iCsz) :(5) ; void main() Array int a1(10,20); Array double a2(3,5); int b1; double b2; b1 = a1-510; /有越界提示:行下标越界 -5 b1 = a11015; /有越界提示:行
24、下标越界 10 b1 = a114; /没有越界提示 b2 = a226; /有越界提示:列下标越界 6 b2 = a21020; /有越界提示:行下标越界 10列下标越界 20 b2 = a214; /没有越界提示 7 阅读以下技术说明和 Java代码,将 Java程序中 (1) (5)空缺处的语句填写完整。 说明 类 Queue表示队列,类中的方法如表 4-12所示。 类 Node表示队列中的元素;类 EmptyQueueException给出了队列中 的异常处理操作。 Java代码 public class testmain /主类 public static viod main (st
25、ring args) Queue q= new Queue; q.enqueue(“first!“); q.enqueue(“second!“); q.enqueue(“third!“); (1) while(true) system.out.println(q.dequeue(); catch( (2) ) public class Queue /队列 node m_firstnode; public Queue()m_firstnode=null; public boolean isempty() if (m_firstnode= =null) return true; else retu
26、rn false; public viod enqueue(object newnode) /入队操作 node next = m_firstnode; if (next = = null) m_firstnode=new node(newnode); else while(next.getnext() !=null) next=next.getnext(); next.setnext(new node(newnode); public object dequeue() (3) /出队操作 object node; if (is empty() (4) else node =m_firstno
27、de.getobject(); m_firstnode=m_firstnode.getnext(); return node; public class node /队列中的元素 object m_data; node m_next; public node(object data) m_data=data; m_next=null; public node(object data,node next) m_data=data; m_next=next; public void setobject(object data) m_data=data; public object getobjec
28、t(object data) return m_data; public void setnext(node next) m_next=next; public node getnext() return m_next; public class emptyqueueexception extends (5) /异常处理类 public emptyqueueexception() system. out. println ( “队列已空 !“ ); 软件水 平考试(初级)程序员下午(应用技术)模拟试卷 21答案与解析 1 【正确答案】 (1)k=0,newlrowl=0 (2)row (3)1
29、5-k (4)“0 (5)*old (15-col) 或 oldrow (15-col) (6)*new (15-col) 或 newrow (15-col) 【试题解析】 这是一道要求读者掌握数组应用的程序设计题。本题的解答思路如下。 阅读程序说明后可知,本程序可将一个给定汉字的点阵逆转 90后输出。用 16个元素的元素数组表示汉字点阵,每个无符号整数有 16位, 0表示空白位置,为 1表示非空白位置。该 C程序的功能是将上述表示形式的汉字点阵 (“会 ”字 )逆时针旋转 90后存储在数组 new中,并输出旋转前后的十六进制点阵数据和字形。 函数 turnleft完成点阵数据逆时针旋转 90
30、,并将旋转后的点阵数据存放在数组New中。在函数 turnleft的 for循环中,语句 “newrow|=(01dk (2) )”语句可知,该题中采用的是以一维数组来模拟二维数组的创建。在构造函数有两个参数,分别为行数和列数。因此 (2)空缺处所填写的内容是 “new TiRsz*iCsz”。 (3)空缺处所在的语句前后有 try.和 catch.语 句序列,这是 C+中典型的异常处理搭配语句。因为 (3)空缺处所在的语句前面已进行了如下处理,当有行下标越界时,置 row_error=true;当有列下标越界时,置 column_error=true。 (3)空缺处前面的判断是 “row_e
31、rror=true|column_error=tree”,即只要有行下标越界或是列下标越界就执行 (3)空缺处的语句。而错误处理语句已放在 catch中予以处理。 catch是当正常程序段发生异常时才执行的,并且程序中指明了是 catch(char),所以只要在 (3)空缺处抛出一 个 catch异常,即可进行错误处理。故 (3)空缺处所填写的语句是“throw, e”,其中 throw之后可以填写任意的字符常数。 对于 Array类中的 (4)、 (5)空缺处所填写的内容。首先看 (5)空缺处,该空缺处显然是进行变量赋初值等相关的初始化工作。而 Array类只有一个成员变量 tBody,且
32、tBody是 ArrayBody类型的 ArrayBody的构造函数需要传递两个参数,分别代表数组的行和列,因此 (5)空缺处应填入 “tBody(iRsz, iCsz)”。 通过 main函数中对 a1和 a2的实例 化,就可大致了解整个程序。在 main函数中实例化 Array,而在类 Array的构造函数对 tBody这个变量进行实例化。此时就以一维数组的形式创建了二维数组。在类 Array中 运算符重载函数中返回了一个ArrayBody类,而在 ArrayBody也存在着 运算符重载函数,并且在 ArrayBody的重载函数中对行下标和列下标同时进行了检查,且返回了一个 T类型。对 A
33、rrayint来说,就是返回了 int,即数组的一个元素。通过对类 ArrayBody的观察发现,在整个 ArrayBody中并没有任何地方对 iCurrentRow进行赋值,而在ArrayBody的 运算符重载中却利用其对数组行下标进行判断,而数组的行下标只在 Array的 运算符重载中出现,那 (4)空缺处就应该是对类 ArrayBody 的成员变量iCurrentRow进行赋值,本题的该空缺处所填入的内容是 “tBody.iCurrentRow=i”。 7 【正确答案】 这是一道要求读者掌握 Java异常处理机制的程序分析题。本题的解答思路如下。 异常是指计算机程序执行期间中断的正常流程
34、的事件。例外是在程序运行过程中发生的异常事件,比如除 0溢出、数组 越界、文件找不到等,这些事件的发生将阻止程序的正常运行。 当一个方法中发生错误时,该方法创建一个对象 (该对象称之为异常对象 )并将它交给运行时系统。异常对象包含了关于错误的信息,即包括错误的类型和错误发生时程序的状态。 “抛出一个异常 ”是指创建异常对象并将它交给运行时系统。 Java的异常处理是通过 try、 catch、 throw、 throws和 finally 5个关键字来实现的。这几个关键字的解释如表 4-15所示。Java运行时系统要求方法必须捕获或者指定它可以抛出的所有被检查的异常,如表 4-16所示。try
35、块和 catch块是异常处理器的两个组件。在 try块中产生的异常通常被紧跟其后的 catch块指定的处理器捕获。 try 可能抛出异常的语句 catch(异常类型 异常引用 ) 处理异常的语句 catch语句可以有多个,分别处理不同类的例外。 Java运行时系统从上到下分别对每个 catch语句处理的例外类型进行检测,直到找到类型相匹配的 catch语句为止。其中,类型匹配是指 catch所处理的例外类型与生成的例外对象的类型完全一致或者是它的父类,因此, catch语句的排列顺序应该是从特殊到一般。也可以用一个 catch语句处理多个例外类型,此时它的例外类型参数应该是这几个例外类型的父类
36、,程序设计中要根据具体的情况来选择 catch语句的例外处理类型。 在选择要抛出的异常的类型时,可以使用其他人编写的异常类,也可以编写自己的异常类。本试题中采用自定义的类作为异常的类型。 仔细阅读试题中给出的 Java源代码可知,主类 TestMain包含了异常处理机制,用于检测在出队时 “队列为空 ”的错误。因此 (1)空缺处所填写的内容是 “try”。 由 catch语句的语法可知, (2)空缺处所填写的内容是对相应异常类型的引用。结 合试题中给出的关键信息 “类EmptyQueueException给出了队列操作中的异常处理操作 ”,即类EmptyQueueException是进行异常处
37、理的类,因此 (2)空缺处所填写的内容是“EmptyQueueExceptione”,或者 “Exceptione”,其中, e是对象名,可用任意合法标识符替换。 由于异常都是从超类 Exception派生而来的,因此 (5)空缺处所填写的内容是 “Exception”。 仔细阅读主类 TestMain程序段可以看到,在 try块的内部并没有给出显示的抛出异常语句,即没有出 现 throw语句。结合 (4)空缺处所在行的注释“队列为空,抛出异常 ”可以推断,在类 Queue的方法 dequeue中必定要抛出异常。因此 (3)空缺处应指定方法 dequeue可以抛出异常,即所填写的内容是 “throws EmptyQueueException”。 (4)空缺处可以使用 throw语句抛出异常,而使用 throw语句时需要一个参数,即一个可抛出的对象,因此 (4)空缺处所填写的内容是“throw(new EmptyQueueException()”。