1、初级程序员下午试题-8 及答案解析(总分:120.00,做题时间:90 分钟)一、B试题一/B(总题数:1,分数:15.00)1.【函数 1.1 说明】 函数 strcpy(char*to,char*from)将字符串 from 复制到字符串 to。 【函数 1.1】 void strcpy(char*to,char*from) while (U (1) /U); 【函数 1.2 说明】 函数 merge(int a,int n,int b,int m,int*c)是将两个从小到大有序数组 a 和 b 复制合并出一个有序整数序列c,其中形参 n 和 m 分别是数组 a 和 b 的元素个数。 【
2、函数 1.2】 void merge(int a ,int n,int b ,int m,int * c) int i,j; for(i=j=0;in ) *c+=ai bj?ai+:bj+; while(U (2) /U)*c+=ai+; while(U (3) /U)*c+=bj+; 【函数 1.3 说明】 递归函数 sum(int a,int n)的返回值是数组 a的前 n 个元素之和。 【函数 1.3】 int sum(int a ,int n) if( n 0) return U(4) /U; else U(5) /U; (分数:15.00)_二、B试题二/B(总题数:1,分数:15
3、.00)2.【说明】 该程序运行后,输出下面的数字金字塔 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; for( max = 1; max = 9; max + +) for(i=1;i=20-U (1) /U;+i) printf(“ “); for(next = U(2) /U;next = U(3) /U;next +) printf(“ %c“ ,next); for(next=U (4) /
4、U;next=U (5) /U;next-) printf(“ %c“ ,next); printf(“ /n“ ); (分数:15.00)_三、B试题三/B(总题数:1,分数:15.00)3.【说明】 函数 diff 的功能是:根据两个由整数(都大于-32768)按升序构成的单链表 L1 和 L2(分别由A,B 指向)构造一个单链表 L3(由*r 指向),要求 13 中的所有整数都是 L1,并且不是 L2 中的整数,还要求 L3 中的所有整数都两两不等。 【函数】 #include malloc. h typedef struct node int d; struct node * next
5、 Node; void diff(Node *A,Node * B,Node * * r) int lastnum; Node * p; *r = NULL; if( ! A) return; while(U (1) /U) if(A-d B -d) lastnum =A - d; p= ( Node * ) malloc( sizeof(Node) ); p-d = lastnum; p-next= *r; U(2) /U; do A = A - next; while(U (3) /U); else if(A-d B-d) B=B- next; else U (4) /U; lastnum
6、=A - d; while ( A while(A) lastnum=A-d; p=( Node * ) malloc( sizeof(Node) ); p- d = lastnum; U (5) /U; *r=p; while (A (分数:15.00)_四、B试题四/B(总题数:1,分数:15.00)4.【说明】 本程序从若干个原始文件合并成的合并文件中恢复出其中一个或全部原始文件。所有文件均作为二进制文件进行处理。合并文件中先顺序存储各原始文件,然后顺序存储各原始文件的控制信息,即文件名、文件长度和在合并文件中的位置(偏移量)。其结构为: typedef struct char fnam
7、e 256 /*原始文件名*/ long length; /*原始文件长度(字节数)*/ long offset; /*原始文件在合并文件中的位置(偏移量)*/ FileInfo; 在合并文件最后存储如下一个特殊的标志信息作为合并文件的结束标记: FileInfo EndFlag=“Combined File“,0,_offset; 其中_offset 是第一个原始文件的控制信息在合并文件中的位置(偏移量)。 启动本程序的命令行的格式是: 程序名 合并文件名 原始文件名 如果不指定原始文件名,默认恢复合并文件中的所有原始文件。 程序中涉及的部分文件操作的库函数简要说明如下: int fread
8、(void * buffer,int size,int count,FILE * fbin):从二进制文件流 fbin 中读取 count 块长度为 size 字节的数据块到 buffer 指向的存储区。返回值为实际读取的数据块数。 int fwrite(void * buffer,int size,int count,FILE * fbin):各参数和返回值的意义与 fread 相同,但对文件进行写操作。 int fseek(FILE * fbin,long offset,int position):将文件流 fbin 的读/写位置以 position 为基准移动 offset 字节。pos
9、ition 的值可以是 SEEK_SET(文件头),SEEK_CUR(当前位置),SEEK_END(文件尾);offset 为正,表示向文件尾方向移动,为负表示向文件头方向移动,为零表示到基准位置。 long ftell(FILE * fbin):返回文件流 fbin 的当前读/写位置(相对于文件头的偏移量)。上述偏移量均以字节为单位,即偏移字节数。 【程序】 #include stdio. h #include string. h typedef struct char fname256;long lengt;long offset; Filelnfo; void copyfile( FIL
10、E*fin, FILE * fout,int fsize) char buf1024;int siz=1024; while(fsize !=0) /*每次复制 siz 个字节,直至复制完 fsize 个字节*/ if(siz fsize)U (1) /U; fread(buf,1,siz,fin); fwrite(buf,1,siz,fout); fsize=U (2) /U; int dofile(FILE * fin,Filelnfo * inp) long offset; FILE * fout; if ( fout = fopen ( inp - fname ,“wb“ )=NULL
11、) printf(“创建文件错误: %s/n“ , inp - fname); return 1; offset= U(3) /U; /*保留合并文件读/写位置*/ fseek(U (4) /U); /*定位于被恢复文件首*/ copyfile ( fin, fout, inp - length); fclose(fout); printf(“/n -文件名: %/n 文件长: %ld. /n“,inp - fname, inp - length); U(5) /U; /*恢复合并文件读/写位置*/ return 0; int main( int argc, char * argv ) Fil
12、elnfo finfo; char fname256 ;FILE * fcmbn; if(argc 2) printf(“输入合并文件名:“ ) ;scanf(“%s“ ,fname); else strcpy(fname,argv1); if(fcmbn = fopen(fname,“rb“ ) = NULL) printf(“文件打开错误: %s/n“ ,fname);return 1; fseek(fcmbn, -sizeof(Filelnfo),SEEK_END); /*定位于合并文件末尾的标志信息*/ fread( if(finfo. length!=0|strcmp(finfo.
13、fnane,“ CombinedFile“ ) printf(“指定的文件不是合法的合并文件/n“); fclose (fcmbn); return 2; fseek(fcmbn,finfo. offset,SEEK_SET); /*定位于首个原始文件的控制信息*/ for(;) /*恢复一个(argc2)或全部(argc=2)原始文件*/ fread ( if(finfo, length =0) break; if (argc 2 if (dofile ( fcmbn, fcolse(fcmbn);return 0; (分数:15.00)_五、B试题五/B(总题数:1,分数:15.00)5.
14、【说明】本应用程序的运行窗口如图 2 所示。(分数:15.00)_六、B试题六/B(总题数:1,分数:15.00)6.【说明】 单击窗体上的“测试”(cmdTest)按钮,出现一个输入框,要求输入一串字符,将该字符串中的非字母字符删除后,显示在窗体中的一个文本框(txtShow)中。 【程序代码】 Private Sub cmdTest_Click( ) Dim strT1 ,strT2 As String Dim strCh As U(1) /U Dim intL As Integer Dim intl As Integer strT1 = U(2) /U(“请输入一串字符“,“字符串输入“
15、) intL = U(3) /U strT2 = “ “ For intl = I To intL strCh = Mid ( strT1, intl, 1 ) If(strCh“A“AndU (4) /U) Or (strCh “a“ And suCh “z“ )Then strT2 = strT2 + strCh End If Next intl txtShow. Text= U(5) /U End sub(分数:15.00)_七、B试题七/B(总题数:1,分数:15.00)7.【说明】 以下程序的功能是设计一个栈类 stackT,并建立一个整数栈。 【程序】 #include iostr
16、eam. h #include stdlib. h const int Max =20; /栈大小 template class T class stack /栈元素数组 T sMax; /栈顶下标 int top; public: stack( ) top =-1; /栈顶初始化为-1 void push( const T /item 入栈 T pop( ); /出栈 int stackempty( ) const; /判断栈是否为 ; template class T void stack T :push(const T exit(1); top + stop = item; templa
17、te class T T stackT :pop() T temp; if(top=U (2) /U) cout “栈为空,不能出栈操作“ endl; exit(1); temp =stop; top -; return temp; template class T int stack T : stackempty( ) const return top = -1; void main( ) stack int st; int a =1,2,3,4,5; cout “整数栈“ endl; cout “入栈序列:“ endl; for(int i=0;i4;i +) cout ai “ “; U
18、 (3) /U; cout endl “出栈序列“; while(U (4) /U) toutU (5) /U“ “; cout endl; (分数:15.00)_八、B试题八/B(总题数:1,分数:15.00)8.【说明】 下面的程序是从命令行输入 3 个数传递到 public static void main(String args)方法中 (如 java IsTriangle 3 4 5),并判断这 3 个数能否构成三角形的 3 条边,并显示相应的结果。请在程序的每条横线处填入适当的语句,使程序的功能完整。 注意:请勿改动 main()主方法和其他已有的语句内容,仅在横线处填入适当的语句
19、。 public class IsTriangle public static void main( String args ) int a =new U(1) /Uargs. U(2) /U; for(int i=0;i3; U(3) /U) ai= U(4) /U if(U (5) /U) System. out. println(a0 +“,“+a1 +“,“+a2“能构成三角形的 3 条边“); else System. out. println(a0 +“,“+a1 +“,“+a2“不能构成三角形的 3 条边); (分数:15.00)_初级程序员下午试题-8 答案解析(总分:120.
20、00,做题时间:90 分钟)一、B试题一/B(总题数:1,分数:15.00)1.【函数 1.1 说明】 函数 strcpy(char*to,char*from)将字符串 from 复制到字符串 to。 【函数 1.1】 void strcpy(char*to,char*from) while (U (1) /U); 【函数 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
21、,int n,int b ,int m,int * c) int i,j; for(i=j=0;in ) *c+=ai bj?ai+:bj+; while(U (2) /U)*c+=ai+; while(U (3) /U)*c+=bj+; 【函数 1.3 说明】 递归函数 sum(int a,int n)的返回值是数组 a的前 n 个元素之和。 【函数 1.3】 int sum(int a ,int n) if( n 0) return U(4) /U; else U(5) /U; (分数:15.00)_正确答案:()解析:(1)*to+=*from+或(*to+=*from+)!=/0 (2
22、)in 或 i!=n (3)jm 或 j!=m (4)an-1+sum(a,n-1);或 a0+sum(a+1,n-1); (5)return 0; 解析 (1)完成字符的复制,并使指针指向下一元素。(2)当出现某一数组所有元素均已合并完成,则将另数组其他元素直接进行复制。b 串已复制完。(3)判断 a 串是否已复制完。(4)递归函数 sun()完成数组 n 个元素的累加,当 n0 时,使用规模为n-1 的函数进行递归。(5)当 n=0 时,返回 0 即可。二、B试题二/B(总题数:1,分数:15.00)2.【说明】 该程序运行后,输出下面的数字金字塔 1 1 2 1 1 2 3 2 1 1
23、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; for( max = 1; max = 9; max + +) for(i=1;i=20-U (1) /U;+i) printf(“ “); for(next = U(2) /U;next = U(3) /U;next +) printf(“ %c“ ,next); for(next=U (4) /U;next=U (5) /U;next-) printf(“ %c“ ,next); print
24、f(“ /n“ ); (分数:15.00)_正确答案:()解析:(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-11 的显示数字,即(4)空和(5)空分别填和 max-1 和1。三、B试题三/B(总题数:1,分数:15.00)3.【说明】 函数 diff 的功能是:根据两个由整数(都大于-32768)按
25、升序构成的单链表 L1 和 L2(分别由A,B 指向)构造一个单链表 L3(由*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(U (1) /U) if(A-d B -d) lastnum
26、=A - d; p= ( Node * ) malloc( sizeof(Node) ); p-d = lastnum; p-next= *r; U(2) /U; do A = A - next; while(U (3) /U); else if(A-d B-d) B=B- next; else U (4) /U; lastnum=A - d; while ( A while(A) lastnum=A-d; p=( Node * ) malloc( sizeof(Node) ); p- d = lastnum; U (5) /U; *r=p; while (A (分数:15.00)_正确答案:
27、()解析:(1)Along 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)U (1) /U; fread(buf,1,siz,fin); fwrite(buf,1,siz,fout); fsize=U (2) /U; int dofile(FILE * fin,Filelnfo * inp) long offs
28、et; FILE * fout; if ( fout = fopen ( inp - fname ,“wb“ )=NULL) printf(“创建文件错误: %s/n“ , inp - fname); return 1; offset= U(3) /U; /*保留合并文件读/写位置*/ fseek(U (4) /U); /*定位于被恢复文件首*/ copyfile ( fin, fout, inp - length); fclose(fout); printf(“/n -文件名: %/n 文件长: %ld. /n“,inp - fname, inp - length); U(5) /U; /*
29、恢复合并文件读/写位置*/ 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(“文件打开错误: %s/n“ ,fname);return 1; fseek(fcmbn, -sizeof(Filelnfo),SEEK_END);
30、 /*定位于合并文件末尾的标志信息*/ fread( if(finfo. length!=0|strcmp(finfo. fnane,“ CombinedFile“ ) printf(“指定的文件不是合法的合并文件/n“); fclose (fcmbn); return 2; fseek(fcmbn,finfo. offset,SEEK_SET); /*定位于首个原始文件的控制信息*/ for(;) /*恢复一个(argc2)或全部(argc=2)原始文件*/ fread ( if(finfo, length =0) break; if (argc 2 if (dofile ( fcmbn,
31、fcolse(fcmbn);return 0; (分数:15.00)_正确答案:()解析:(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 进行修改,使其代表当前未拷贝的字节数。(3)dofile()首先
32、创建一个新的文件 fout,用于存储被恢复的文件。然后先保存文件的读写位置(offset= ftell(fin),再获得被恢复文件在合并文件中的位置(fseek(fin,inp- offse,SEEK_SET),再进行拷贝。最后恢复合并文件的读写位置。本句保留合并文件的读写位置。(4)对被恢复文件进行定位。(5)对合并文件的读写位置进行恢复。五、B试题五/B(总题数:1,分数:15.00)5.【说明】本应用程序的运行窗口如图 2 所示。(分数:15.00)_正确答案:()解析:(1)Val(Txt_salary.Text)-Val(Txt_base.Text) (2)Kpaylevel(j)
33、(3)K-paylevel(j-1) (4)Txt_tax.Text (5)false 解析 (1)K 表示该月应纳的所得税额,即文本框 Txt_salary 和 Txt_base 的值之差,所以此处填入 Val(Txt_salary.Text)-Val(Txt_ base.Text),其中函数 Val 将字符转换成数字型。(2)此处是判断当前职工的工资是否超过第 j 级,所以应填入 Kpaylevel(j)。(3)当前职工的工资不超过第 j 级,计算它与第 j-1 级的差额的所得税,所以应填入 K-paylevel(j-1)。(4)此处输出计算的结果,所以应填入 Txt_tax. Text。
34、(5)由于免税金额不可修改,所以应该将它的 Enabled 属性设置为 false。六、B试题六/B(总题数:1,分数:15.00)6.【说明】 单击窗体上的“测试”(cmdTest)按钮,出现一个输入框,要求输入一串字符,将该字符串中的非字母字符删除后,显示在窗体中的一个文本框(txtShow)中。 【程序代码】 Private Sub cmdTest_Click( ) Dim strT1 ,strT2 As String Dim strCh As U(1) /U Dim intL As Integer Dim intl As Integer strT1 = U(2) /U(“请输入一串字符
35、“,“字符串输入“) intL = U(3) /U strT2 = “ “ For intl = I To intL strCh = Mid ( strT1, intl, 1 ) If(strCh“A“AndU (4) /U) Or (strCh “a“ And suCh “z“ )Then strT2 = strT2 + strCh End If Next intl txtShow. Text= U(5) /U End sub(分数:15.00)_正确答案:()解析:(1)String (2)InputBox (3)Len(strT1) (4)strCh“Z” (5)strT2 解析 VB
36、中字符和字符串属于同一类型,所以(1)空填“String”。 (2)空应填 VB 的输入对话框函数“InputBox”。根据题意,(3)空是求输入的字符串长度,故用“Len(strT1)”。(4)空处的条件是判断是否是字母字符,所以填strCh“Z”;删除非字母字符后的结果在 strT2 中,而题意是要显示在窗体中的文本框(txtShow)中,故(5)空填“strT2”。七、B试题七/B(总题数:1,分数:15.00)7.【说明】 以下程序的功能是设计一个栈类 stackT,并建立一个整数栈。 【程序】 #include iostream. h #include stdlib. h const
37、 int Max =20; /栈大小 template class T class stack /栈元素数组 T sMax; /栈顶下标 int top; public: stack( ) top =-1; /栈顶初始化为-1 void push( const T /item 入栈 T pop( ); /出栈 int stackempty( ) const; /判断栈是否为 ; template class T void stack T :push(const T exit(1); top + stop = item; template class T T stackT :pop() T te
38、mp; if(top=U (2) /U) cout “栈为空,不能出栈操作“ endl; exit(1); temp =stop; top -; return temp; template class T int stack T : stackempty( ) const return top = -1; void main( ) stack int st; int a =1,2,3,4,5; cout “整数栈“ endl; cout “入栈序列:“ endl; for(int i=0;i4;i +) cout ai “ “; U (3) /U; cout endl “出栈序列“; whil
39、e(U (4) /U) toutU (5) /U“ “; cout endl; (分数:15.00)_正确答案:()解析:(1)Max-1 (2)-1 (3)st.push(ai) (4)!st.stackempty() (5)st.pop() 解析 本题用类模板方式定义一个栈类,其中有两个私有数据成员:s(存放栈元素)和 top(栈顶元素下标),以及 3 个公有成员函数: push(元素入栈)、Pop(元素出栈)和 stackempty(判断栈是否为空)。 在函数 push()中,首先要判断是否栈满。栈的大小为 Max,数组的下标从。开始,所以栈满的条件是栈顶元素下标为 Max-1,所以(1
40、)空应填入“Max-1”。同样,在函数 pop()中,首先要判断是否为空栈,由于栈顶初始化为-1,所以(2)空应填入“-1”。 在主函数中,先进行入栈操作,所以(3)空应填入“st.push(a i)”。然后进行出栈操作,判断栈是否为空,调用对象的函数 stackempty(),所以(4)空应填入“!st.stackempty()”。(5)空处调用出栈函数,所以应填入“st.pop()”。八、B试题八/B(总题数:1,分数:15.00)8.【说明】 下面的程序是从命令行输入 3 个数传递到 public static void main(String args)方法中 (如 java IsTriangle 3 4 5),并判断这 3 个数能否构成三角形的 3 条边,并显示相应的结果。请在程序的每条横线处填入适当的语句,使程序的功能完整。 注意:请勿改动 main()主方法和其他已有的语句内容,仅在横线处填入适当的语句。 public class IsTriangle public static void main( String args ) int a =new U(1) /Uargs. U(2) /U; for(int i=0;i3; U(3) /U) ai= U(4) /U if(U (5) /U) System. out. println(a0 +“,