1、软件水平考试(初级)程序员下午(应用技术)模拟试卷 46 及答案与解析 1 阅读以下说明和流程图,将应填入 (n)处的字句写在对应栏内。 说明 下面的流程图实现了正整数序列 K(1),K(2),K(n) 的重排,得到的新序列中,比 K(1)小的数都在 K(1)的左侧,比 K(1)大的数都在 K(1)的右侧。以 n=6为例,序列 12, 2, 9,13, 21, 8的重排过程为: 12,2,9,13,21,8 2,12,9,13,21,8 9,2,12,13,21,8 8,9,2,12,13,21 流 程图 2 阅读下列说明和 C代码,将应填入 (n)处的字句写在对应栏内。 【说明】 本题给出四
2、个函数,它们的功能分别是: 1 int push(PNODE*top, int e)是进栈函数,形参 top是栈顶指针的指针,形参 e是入栈元素。 2 int pop(PNODE*top, int*e)是出栈函数,形参 top是栈顶指针的指针,形参 e作为返回出栈元素使用。 3 int enQueue(PNODE*tail, int e)是入队函数,形参 tail是队尾指针的指针,形参 e是入队元素。 4 int deQueue(PNODE*tail, int*e)是出队函数,形参 tail是队尾指针的指针,形参 e作为返回出队元素使用。 以上四个函数中,返回值为。表示操作成功,返回值为 -1
3、表示操作失败。 栈是用链表实现的;队是用带有辅助结点 (头结点 )的单向循环链表实现的。两种链表的结点类型均为: typedef struct node int value; struct node * next; NODE, * PNODE; 【函数 1】 int push(PNOOE * top,int e) PNODE p = (PNODE) malloc (sizeof (NODE); if (! p) return-1; p- value=e; (1); *top=p; return 0; 【函数 2】 int pop (PNODE * top,int * e) PNODE p =
4、* top; if(p = NULL) return-1; * e = p- value; (2); free(p); return 0; 【函数 3】 int enQueue (PNODE * tail,int e) PNODE p,t; t= *tail; p = (PNODE) malloc(sizeof(NODE); if(!p) return-1; p- value=e; p- next=t- next; (3); * tail = p; return 0; 【函数 4】 int deQueue(PNODE * tail,int * e) PNODE p,q; if( * tail)
5、- next = * tail) return-1; p= (* tail)- next; q = p - next; * e =q - value; (4)=q- next; if(,tail=q) (5); free(q); return 0; 3 【说明】 下面程序的功能是:在含有 10个元素的数组中查找最大数,及最大数所在位置(即下标值 ),最大数可能不止一个。 例如:若输入 2 8 5 7 8 4 8 3 2 8 则应输出 The max: 8 Total: 4 /最大数出现次数 The positions: 1 4 6 9 【函数】 #include stdio.h #define
6、 M 10 int fun(int* a,int * n,int pos ) int i, k max = - 32767; (1) for(i=0;i M;i+) if(2)max=ai; for(i=0;i M;i+) if(3)posk+=i; *n=k; return max; main() int aM,posM,i=0j,n; printf(“Enter 10umber:“) for(i=0,i M;i+)scanf(“%d“,(4); j=fun(5); printf(“The max:%dn“,j); printf(“Total: %d“, n); printf(“The po
7、sition:“) for (i=0; i n;i+) printf (“%4d“, posi); printf(“n“); 4 阅读以下函数说明和 C语言函数,将应填入 (n)处的字句写在对应栏内。 【程序 2.1说明】 求所有满足如下条件的三位数:它除以 11得的商等于它各位数字的平方和。例如 550,除以 11商为 50, 50=52+52+02。 【程序 2.1】 void main() int i, j,n,s; for(i=100;i =999;i+) n=i; j=n/11; s=0; while(1) (2) n/=10; if(3) printf(“%dt“,i); 【程序
8、2.2说明】 本程序输入一字符串,将其中的大写字母改变成小写字母。 【程序 2.2】 void main() int i=0; char s120; scanf(“%s“,s); while(4) if(5) si=si- A+a; i+; printf(“%sn“,s); 5 阅读以下说明及 Visual Basic 程序代码,将应填入 (n)处的字句写在对应栏内。 说明 本程序求 3 100之间的所有素数 (质数 )并统计个数;同时将这些素数从小到大依次写入顺序文件 E:dataout.txt;素数的个数显示在窗体 Form1上。 Visual Basic 代码 Private Sub C
9、ommand1 Click ( ) Dim count as integer, flag as Boolean Dim t1 as Integer, t2 as Integer (1) Count=0 For t1=3 to 100 (2) For t2=2 to Int (Sqr (t1) If (3) Then flag=False Next t2 (4) count=count +1 write #1, t1 End if Next t1 (5) Close #1 End Sub 6 阅读以下说明和 C+代码,将解答写入对应栏内。 说明 类 Stock的定义中有三处错误,分别在代码的第
10、04、 06、 10行。请补齐下述代码中的空缺 (1) (3),修改错误并给出修改后该行的完整代码,最后完善程序运行后的输出结果。 C+程序 01 #include iostream.h 02 using namespace std; 03 class Stock 04 protected: 05 Stock()shares=0; share_val=0.0;Output(); 06 Stock(int n=0, double pr=3.5): (1) /初始化 shares值为 n 07 share_val=pr; 08 Output(); 09 ; 10 void Stock(); 11
11、void Output()(cout shares ; share val endl; 12 public: 13 /成员函数 14 private: 15 /成员变量 16 int shares; 17 double share_val; 18 ; 19 20 void main() /构造三个 Stock对象 a,b,C 21 Stock a(1); 22 Stock b; 23 Stock C; Stock(); 24 /其他代码省略,且代码无输出 25 程序运行后的输出结果为: 1:3.5 (2) (3) 7 阅读以下说明、 Java代码,将应填入 (n)处的字句写在对应栏内。 【 说
12、明】 本程序输出 10000之内的所有完全数。完全数是指等于其所有因子和 (包括 1,但不包括这个数本身 )的数。例如: 6=123, 6=1+2+3,则 6是一个完全数。 【程序】 public class PerfectNum Public static void main(String args) int count=1; for(int i=1; i 10000; i+) int y=0; for(int j=1; j i; j+) if(1) y=(2) if(3) System.out.print( (4) +String.valueOf(t); (5) If(count%3=0)
13、 System.out.printin(); 软件水平考试(初级)程序员下午(应用技术)模拟试卷 46 答案与解析 1 【正确答案】 (1) K(s) K(t) (2) K(s) (3) ii -1 (4) tt+1 (5) ss+1 【试题解析】 算法中变量 K(t)始终代表原始序列中的 K(1)值, t则代表它在当前序列中的位置编号,初始值为 1; k(s)代表待比较的数。算法首先拿 K(t)和其后的数做比较,若 K(s)比 K(t)小,则 K(s)移至序列的最左侧,同时顺次把第 i, i s位的元素向右移一位。让 s自增 1,重复这一步骤,直至到达序列末端 (即 s=n)为止。 2 【正
14、确答案】 (1)p- next=*top (2)*top=p- next或 * top=(*top)- next (3)t- next=p或 (*tail)- next=p (4)p- next或 (*tail)- next- next (5)*tail=p或 *tail=(*tail)- next 【试题解析】 (1)插入结点 p后, p应当指向插入前头结 点,所以填入 p -next=*top。 (2)出栈后,头指针应指向它的下一结点,所以填入 *top=p- next或*top=(*top)- next。 (3)入队时,需要将结点插入队尾,所以应当填入 (*tail)-next=p 或
15、t- next=p(t 也指向尾结点 )。 (4)出队时,需要删除队头结点,通过(*tail)- next可以得到对队头结点的引用。 (4)处是正常删除队头结点的情况,空格处应填入头结点指向下一结点的指针,即 p- next或 (*tail)- next- next。 (5)处是需要考虑的特殊情 况,即队列中最后一个元素出队后,要更新队尾指针,即填入 *tail=p或 *tail=(*tail)- next。 3 【正确答案】 (1)k=0 (2)ai max (3)ai=max (4)a+i或 (3)y=i (4)i (5)count+; 【试题解析】 本题考查用 Java语言的语法、结构及
16、算法的具体实现。 题目要求我们输出 10000之内的所有完全数,而完全数是指等于其所有因子和数。要想求出 1到 10000中的所有完全数,我们需要从 1开始对每个数进行求解,在判断一个数是否是完全数时,首先要求出其所有因子,再求其因子的和,从而通过判断因子的和与该数是否相等来确定该数是否为完全数。一个 数的因子是指能被该数整除的数。 下面我们来看代码,定义了一个类 PerfectNum来实现输出 10000 之内的所有完全数。在类中有一个主入口函数,在函数体中首先声明了一个整型变量 count并赋初值 1,接下来是一个循环语句,其作用是用来对从 1到 10000之间的数逐个求解。在这个循环体里
17、面又有一个循环,结合我们的分析和程序来看,此循环的功能是求得每个数的所有因子并计算其和,第 (1)空就是在这个循环体下面,是一个条件语句的判断条件,其作用是判断变量 i中的数值是否是变量 i中数的因子,判断是否是因子的方法是取余, 看结果是否为 0。因此,第 (1)空的答案是 i%j=0。 第 (2)空是紧接着第 (1)空来的,如果变量 i中的数值是变量 i中数的因子,则执行此空,那肯定是对因子求和,其和存放在变量 y中,那么此空答案是 y+1。 第 (3)空也是一个条件语句的判断条件,结合后面的程序,我们可以知道,此处是判断该数因子的和是否等于该数,如果是,则执行后面的输出语句:不是,则进入下一个循环。因此,此空答案是 y=i。 第 (4)空在输出语句中,这考查我们对 Java语言中输出语句的熟悉情况,如果熟悉的话,此空很简单,答案是 i或 y。 第 (5)空是用来记录从 1到 10000之间完全数的个数,有一个记录的变量 count,在每次输出一个完全数后只要我们对变量 count加 1即可。因此,此空答案为count+。