1、软件水平考试(初级)程序员下午(应用技术)模拟试卷 5及答案与解析 1 阅读下列说明和流程图,将应填入 (n)处的语句写在对应栏内。【说明】 下列流程图用于从数组 K中找出一切满足: K(I)+K(J)=M的元素对 (K(I),K(J)(1IJN)。假定数组 K中的 N个不同的整数已按从小到大的顺序排列, M是给定的常数。 【流程图】 此流程图 1中,比较 “K(I)+K(J):M”最少执行次数约为(5)。 2 阅读下列函数说明和 C代码,把应填入其中 (n)处的字句写在答卷的对应栏内。 【函数 1.1说明】 函数 strcpy(char*to, char*from)将字符串 from复制到字
2、符串 to。 【函数 1.1】 void strcpy(char*to, char*from) while (1); 【函数 1.2说明】 函数 merge(int a, int n, int b, int m, int*c)是将两个从小到大有序数组 a和 b复制合并出一个有序整数序列 c,其中形参 n和 m分别是数组 a和 b的元素个数。 【函数 1.2】 void merge(int a ,int n,int b ,int m,int * c) int i,j; for(i=j=0;i n ) *c+=ai bj?ai+:bj+; while(2)*c+=ai+; while(3)*c+=
3、bj+; 【函数 1.3说明】 递归函数 sum(int a, int n)的返回值是数组 a的前 n个元素之和。 【函数 1.3】 int sum(int a ,int n) if( n 0) return (4); else (5); 3 阅读下列函数说明和 C代码,将应填入 (n)处的字句写在对应栏内。 【说明】 该程序运行后,输出下面的数字金字塔 1 1 2 1 1 2 3 2 1 1 2 3 4 3 2 1 1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1 【程序】 #include stdio. h main ( ) char max, next; int i;
4、for( max = 1; max = 9; max + +) for(i=1;i =20-(1);+i) printf(“ “); for(next =(2);next =(3);next +) printf(“ %c“ ,next); for(next=(4);next =(5);next-) printf(“ %c“ ,next); printf(“ n“ ); 4 阅读下列函数说明和 C代码,将应填 入 (n)处的字句写在对应栏内。 【说明】 函数 diff的功能是:根据两个由整数 (都大于 -32768)按升序构成的单链表 L1和L2(分别由 A, B指向 )构造一个单链表 L3(由
5、 *r指向 ),要求 13中的所有整数都是L1,并且不是 L2中的整数,还要求 L3中的所有整数都两两不等。 【函数】 #include malloc. h typedef struct node int d; struct node * next Node; void diff(Node *A,Node * B,Node * * r) int lastnum; Node * p; *r = NULL; if( ! A) return; while(1) if(A- d B - d) lastnum =A - d; p= ( Node * ) malloc( sizeof(Node) ); p
6、- d = lastnum; p- next= *r;(2); do A = A - next; while(3); else if(A- d B- d) B=B- next; else (4); lastnum=A - d; while ( A while(A) lastnum=A- d; p=( Node * ) malloc( sizeof(Node) ); p- d = lastnum; (5); *r=p; while (A 5 阅读下列程序说明和 C代码,将应填入 (n)处的字句写在对应栏内。 【说明】 本程序从若干个原始文件合并成的合并文件中恢复出其中一个或全部原始文件。所有文件
7、均作为二进制文件进行处理。合并文件中先顺序存储各原始文件,然后顺序存储各原始文件的控制信息,即文件名、文件长度和在合并文件中的位置 (偏移量 )。其结构为: typedef struct char fname 256 /*原始文件名 */ long length; /*原始文件长度 (字节数 )*/ long offset; /*原始文件在合并文件中的位置 (偏移量 )*/ FileInfo; 在合并文件最后存储如下一个特殊的标志信息作为合并文件的结束标记: FileInfo EndFlag=“Combined File“, 0, _offset; 其中 _offset是第一个原始文件的控制信
8、息在合并文件中的位置 (偏移量 )。 启动本程序的命令行的格式是: 程序名 合并文件名 原始文件名 如果不指定原始文件名,默认恢复合并文件中的所有原始文件。 程序中涉及的部分文件操作的库函数简要说明如下: int fread(void * buffer, int size, int count, FILE * fbin):从二进制文件流 fbin中读取 count块长度为 size字节的数据块到 buffer指向的存储区。返回值 为实际读取的数据块数。 int fwrite(void * buffer, int size, int count, FILE * fbin):各参数和返回值的意义与
9、 fread相同,但对文件进行写操作。 int fseek(FILE * fbin, long offset, int position):将文件流 fbin的读 /写位置以position为基准移动 offset字节。 position的值可以是 SEEK_SET(文件头 ),SEEK_CUR(当前位置 ), SEEK_END(文件尾 ); offset为正, 表示向文件尾方向移动,为负表示向文件头方向移动,为零表示到基准位置。 long ftell(FILE * fbin):返回文件流 fbin的当前读 /写位置 (相对于文件头的偏移量 )。上述偏移量均以字节为单位,即偏移字节数。 【程序
10、】 #include stdio. h #include string. h typedef struct char fname256;long lengt;long offset; Filelnfo; void copyfile( FILE*fin, FILE * fout,int fsize) char buf1024;int siz=1024; while(fsize !=0) /*每次复制 siz个字节,直至复制完 fsize个字节 */ if(siz fsize) (1); fread(buf,1,siz,fin); fwrite(buf,1,siz,fout); fsize=(2)
11、; int dofile(FILE * fin,Filelnfo * inp) long offset; FILE * fout; if ( fout = fopen ( inp - fname ,“wb“ )=NULL) printf(“创建文件错误 : %sn“ , inp - fname); return 1; offset=(3); /*保留合并文件读 /写位置 */ fseek(4); /*定位于被恢复文件首 */ copyfile ( fin, fout, inp - length); fclose(fout); printf(“n -文件名 : %n 文件长 : %ld. n“,
12、inp - fname, inp - length); (5); /*恢复合并文件读 /写位置 */ return 0; int main( int argc, char * argv ) Filelnfo finfo; char fname256 ;FILE * fcmbn; if(argc 2) printf(“输入合并文件名 :“ ) ;scanf(“%s“ ,fname); else strcpy(fname,argv1); if(fcmbn = fopen(fname,“rb“ ) = NULL) printf(“文件打开错误 : %sn“ ,fname);return 1; fse
13、ek(fcmbn, -sizeof(Filelnfo),SEEK_END); /*定位于合并文件末尾的标志信息*/ fread( if(finfo. length!=0|strcmp(finfo. fnane,“ CombinedFile“ ) printf(“指定的文件不是合法的合并文件 n“); fclose (fcmbn); return 2; fseek(fcmbn,finfo. offset,SEEK_SET); /*定位于首个原始文件的控制信息 */ for(;) /*恢复一个 (argc 2)或全部 (argc=2)原始文件 */ fread ( if(finfo, length
14、 =0) break; if (argc 2 if (dofile ( fcmbn, fcolse(fcmbn);return 0; 6 阅读以下说明及 Visual Basic程序代码,将应填入 (n)上处的字句写在对应栏内。说明 字符组合:程序界面如图示,在文本框 Text1中输入若干个任意字符,单击“颠倒 ”按钮,将这些字符按相反 的顺序显示在标签 Lable1 中,并在标签 Labs1 2处显示字符的个数。例如:输入 abcabc2,显示为 2cbabca,组成字符数为 4。 Visual Basic 代码 Private Sub cmdshow_ Click ( Dim n As I
15、nteger Dim I As Integer Dim str1 As String N=Len ( Text1.Text ) For I=n To Step- 1 Str1=(1) Next I Labe11. Caption=Str1 End Sub Private Sub cmdcount_ Click ( ) Dim n As Integer Dim in As Integer Dim i As Integer Dim j As Integer Dim flag As Integer Dim str1 As Integer Dim str2 As Integer N=(2) Str1
16、=Mid ( Text1.Text, i. 1 For I =2 To n Str2=mid ( Text1,Text,I,1 M=Len (str1) (3) For j=1 To m If (4) Then flag= 1; Exit For Next j If flag 1 then str1=str1 int b; public: vector(1):(2) void input(int x, int y) (3) void output( ) cout ( a , b “)“ endl; friend double Multiply(vector ; double Multiply(
17、vector (4) return c; void main( ) vector x(10,20),y; double d; y. input(2,3) d=Multiply(x,y); cout d endl; 程序输出结果是 :(5)。 9 阅读以下说明和 Java代码,将解答写入对应栏内。【说明】 请完成下列 Java程序。程序的执行结果是生成一个具有一个 TextField类型的对象 in、 Button类型的对象 btn和 Label类型的对象 out图形用户界面,程序的功能是计算用户输入数的平方 ,如图 3所示。 注意:请勿改动main()主方法和其他已有的语句内容,仅在下划线处填
18、入适当的语句。 【程序】 import java. awt.*; import java, awt. event.*; public class square public static void main(String args ) (1) class AppFrame extends Frame TheAdapterTest listener = new TheAdapterTest( ); Text Field in = new TextField (5); Button btn = new Button(“计算 “); Label out = new Label(“用于显示计算结果 “
19、); public AppFrame( ) setLayout( new FlowLayout( ); add(in); add(btn) add(out); btn. addActionListener( new BtnActionAdapter( ); addWindowListener (listener); setSize(400,100); show( ); class BtnActionAdapter implements (2) public void actionPerformed(3) String s = in. getText( ); double d =(4) doub
20、le sq = d * d; out. setText(d+“的平方是 :“ +sq); class TheAdapterTest extends WindowAdapter public void windowCIosing(5) System. exit(1) 软件水平考试(初级)程序员下午(应用技术)模拟试卷 5答案与解析 1 【正确答案】 (1) (2) (3)I+1- I (4)J-1- J (5)N/2 【试题解析】 该算法的思路是:设置了两个变量 I和 J,初始时分别指向数组 K的第一个元素和最后一个元素。如果这两个元素之和等于 M时,输出结果,并这两个指针都向中间移动;如果小于
21、 M,则将指针 I向中间移动 (因为数组 K已按从小到大的顺序排列 );如果大于 M,则将指针 J向中间移动 (因为数组 K已按从小到大的顺序排列 )。当 IJ时,说明所有的元素都搜索完毕,退出循环。 根据上面的分析, (1)、 (2)空要求填写循环结束条件,显然, (1)空处应填写 “”,(2)空处应填写 “ ”。这里主要要注意 I=J的情况,当 I=J时,说明指两个指针指向同一元素,应当退出循环。 (3)空在流程图有两处,一处是当 K(I)+K(J)=M时,另一处是当 K(I)+K(J) M时,根据上面分析这两种情况都要将指针 I向中间移动,即 “I+1- I”。同样的道理, (4)空处应
22、填写 “J-1- J”。 比较 “K(I)+K(J): M”最少执行次数发生在第 1元素与第 N个元素之和等于 M、第 2元素与第 N-1个元素之和等于 M、 ,这样每次比较,两种指针都向中间移动,因此最小执行次数约为 “N-2”。 2 【正确答案】 (1)*to+=*from+或 (*to+=*from+)!=0 (2)i n或 i!=n (3)j m或 j!=m (4)an-1+sum(a, n-1);或 a0+sum(a+1, n-1); (5)return 0; 【试题解析】 (1)完成字符的复制,并 使指针指向下一元素。 (2)当出现某一数组所有元素均已合并完成,则将另 数组其他元素
23、直接进行复制。 b 串已复制完。 (3)判断 a串是否已复制完。 (4)递归函数 sun()完成数组 n个元素的累加,当 n 0时,使用规模为 n-1的函数进行递归。 (5)当 n =0时,返回 0即可。 3 【正确答案】 (1)(max-0) (2)1 (3)max (4)max-1 (5)1 【试题解析】 该程序共有 9行输出,即循环控制变量 max的值是从 1 9。每行输出分 3部分,先用循环 for语句输出左边空白, (1)空填 “(max-0)”;再用循环输出从 1到 max-0的显示数字,即 (2)空和 (3)串分别填 1和 max;最后输出从 max-1 1的显示数字,即 (4)
24、空和 (5)空分别填和 max-1和 1。 4 【正确答案】 (1)A&B (2)*r=p (3)A&A- d=lastnum (4)B=B- next (5)p- next=*r 【试题解析】 函数的功能在函数说明中已经讲得很清楚了,这里就不再重复。程序的思路是:从链表 A取一个元素和链表 B中第一个元素进行比较,如果链表 A元素小 于链表 B的元素,则将链表 A中元素插入到链表 C中,指针后移,在后移时要屏蔽所有相同元素;如果链表 A元素大于链表 B的元素,将链表 B指针后移;如果链表 A元素等于链表 B的元素,链表 A和链表 B的指针都向后移,而且要屏蔽链表 A中所有相同元素。当链表 A
25、和链表 B都没有结束时,循环执行上述操作。如果链表 B已经到链尾,但链表 A没有结束,则将链表 A中的剩余元素加入到链表 C中,同时也要屏蔽所有相同元素。 根据上面的分析, (1)空处需要填写循环条件,显然是链表 A没有结束,而且链表 B也没有结束,即 “A!=NULL&B!=NULL”或其等价形式。 (2)空所在的语句块是处理链表 A元素小于链表 B的元素的情况,需要将链表 A中元素插入到链表 C中,在它的前一条语句已经把这个结点后继指针指向链表 C的第一个结点,这里需要将链表 C的第一个结点设置成该结点,即 “*r=p”。 (3)空处所在 dowhile 循环的目的是屏蔽所有相同元素,需要
26、写出这个循环的条件,显然是当一个结点的值不等于刚刚插入的结点的值或链表 A已经到了链尾时就要退出循环。因此 (3)空处应填写 “A! =NULL&A- d=lastnum”及其等价形式。 (4)空 所在语句块是处理链表 A元素等于链表 B元素的情况,链表 A和链表 B的指针都向后移,而且要屏蔽链表 A中所有相同元素。链表 A的指针向后移已经写出,因此, (4)空应填写 “B=B- next”。 (5)空所在 while循环是处理链表 B已经到链尾,但链表 A没有结束的情况。这时需要将链表 A中的剩余元素加入到链表 C中,插入的方法和 (2)空处所在语句块插入方法一致。 (5)空需将要插入结点的
27、指针域指向链表 C的头指针 *r,因此 (5)空处应填写 “p- next=*r”。 5 【正确答案】 (1)siz=fsize (2)fsize-siz (3)ftell(fin) (4)fin, inp- offset, SEEK_SET (5)fseek(fin, offset, SEEK_SET) 【试题解析】 (1)copyfile()每次拷贝 min(siz, fsize)个单元,并修改 fsize以记录已拷贝的字节数,最终完成 fsize个字节的拷贝。本题进行 siz和 fsize最小关系的判断。 (2)拷贝完 siz个字节后,对 fsize进行修改,使其代表当前未拷贝的字节数。
28、(3)dofile()首先创建一个新的文件 fout,用于存储被恢 复的文件。然后先保存文件的读写位置 (offset= ftell(fin),再获得被恢复文件在合并文件中的位置 (fseek(fin,inp- offse, SEEK_SET),再进行拷贝。最后恢复合并文件的读写位置。本句保留合并文件的读写位置。 (4)对被恢复文件进行定位。 (5)对合并文件的读写位置进行恢复。 6 【正确答案】 (1) Str1& Mid (Text1.Text,I,1) (2) Len (Text1.Text) (3) Flag=0 (4) str 2=Mid (str1,j,1) (5) Str (Le
29、n (str1) 7 【正确答案】 (1) open“ e:dataout.txt”For Output as#1 (2) Flag=True (3) t1 mod t2=0 (4) If t2 Int (sqr (t1)Then (5) Form1. Print “素数个数 “; count 8 【正确答案】 (1)int x=0, int y=0 (2)a(x), b(y) (3)b=x; a=y (4)c=x.a*y.a+x.b*y.b (5)70 【试题解析】 注意参数默认值的书写方法。分别对 a, b赋值。注意赋值顺序,与构造函数的赋值不同。注意对象访问成员使用 “.”操作符。 x.a=10; y.a=3;x.b=20; y.b=2,所以 c=70。 9 【正确答案】 (1)new AppFrame() (2)ActionListener (3)ActionEvent (4)Integer, parseInt(s);或等价形式 (5)WindowEvent 【试题解析】 生成类 AppFrame的对象。实现接口 ActionListener。按钮动作事件类名。将字符串 a转化为整数并赋给变量 d。窗口事件类名。
copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1