1、初级程序员下午试题-43 及答案解析(总分:120.00,做题时间:90 分钟)一、试题一(总题数:1,分数:15.00)1.【函数 1.1说明】函数 strcpy(char*to,char*from)将字符串 from复制到字符串 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(in
2、t a ,int n,int b ,int m,int * c)int i,j;for(i=j=0;in )*c+=ai bj?ai+:bj+;while( (2) )*c+=ai+;while( (3) )*c+=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) ;(分数:15.00)_二、试题二(总题数:1,分数:15.00)2.【说明】该程序运行后,输出下面的数字金字塔11 2 11 2 3 2 11 2 3 4
3、3 2 11 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- (1) ;+i)printf(“ “);for(next = (2) ;next = (3) ;next +)printf(“ %c“ ,next);for(next= (4) ;next= (5) ;next-)printf(“ %c“ ,next);printf(“ /n“ );(分数:15.00)_三、试题三(总题数:1,分
4、数: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 * nextNode;void diff(Node *A,Node * B,Node * * r)int lastnum;Node * p;*r = NULL;if( ! A) return;whil
5、e( (1) )if(A-d B -d)lastnum =A - d;p= ( Node * ) malloc( sizeof(Node) );p-d = lastnum;p-next= *r; (2) ;doA = 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 (分数:15.00)_四、试题四(总题
6、数:1,分数:15.00)4.【说明】本程序从若干个原始文件合并成的合并文件中恢复出其中一个或全部原始文件。所有文件均作为二进制文件进行处理。合并文件中先顺序存储各原始文件,然后顺序存储各原始文件的控制信息,即文件名、文件长度和在合并文件中的位置(偏移量)。其结构为:typedef struct char fname 256 /*原始文件名*/long length; /*原始文件长度(字节数)*/long offset; /*原始文件在合并文件中的位置(偏移量)*/FileInfo;在合并文件最后存储如下一个特殊的标志信息作为合并文件的结束标记:FileInfo EndFlag=“Combi
7、ned File“,0,_offset;其中_offset 是第一个原始文件的控制信息在合并文件中的位置(偏移量)。启动本程序的命令行的格式是:程序名 合并文件名 原始文件名如果不指定原始文件名,默认恢复合并文件中的所有原始文件。程序中涉及的部分文件操作的库函数简要说明如下:int fread(void * buffer,int size,int count,FILE * fbin):从二进制文件流 fbin中读取 count块长度为 size字节的数据块到 buffer指向的存储区。返回值为实际读取的数据块数。int fwrite(void * buffer,int size,int cou
8、nt,FILE * fbin):各参数和返回值的意义与 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的当前读/写位置(相对于文件头的偏移量)。上述偏移量均以字节
9、为单位,即偏移字节数。【程序】#include stdio. h#include string. htypedef 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
10、= (2) ;int dofile(FILE * fin,Filelnfo * inp)long offset;FILE * fout;if ( fout = fopen ( inp - fname ,“wb“ )=NULL) printf(“创建文件错误: %s/n“ , inp - fname);return 1;offset= (3) ; /*保留合并文件读/写位置*/fseek( (4) ); /*定位于被恢复文件首*/copyfile ( fin, fout, inp - length);fclose(fout);printf(“/n -文件名: %/n 文件长: %ld. /n“,
11、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(“文件打开错误: %s/n“ ,fname);return 1;fseek(fcmbn, -
12、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(;) /*恢复一个(argc2)或全部(argc=2)原始文件*/fread ( if(finfo, length =0) break;if (argc 2 i
13、f (dofile ( fcmbn, fcolse(fcmbn);return 0;(分数:15.00)_五、试题五(总题数:1,分数:15.00)5.【说明】本应用程序的运行窗口如图 2所示。(分数:15.00)_六、试题六(总题数:1,分数:15.00)6.【说明】单击窗体上的“测试”(cmdTest)按钮,出现一个输入框,要求输入一串字符,将该字符串中的非字母字符删除后,显示在窗体中的一个文本框(txtShow)中。【程序代码】Private Sub cmdTest_Click( )Dim strT1 ,strT2 As StringDim strCh As (1) Dim intL A
14、s IntegerDim intl As IntegerstrT1 = (2) (“请输入一串字符“,“字符串输入“)intL = (3) strT2 = “ “For intl = I To intLstrCh = Mid ( strT1, intl, 1 )If(strCh“A“And (4) ) Or (strCh “a“ And suCh “z“ )ThenstrT2 = strT2 + strChEnd IfNext intltxtShow. Text= (5) End sub(分数:15.00)_七、试题七(总题数:1,分数:15.00)7.【说明】以下程序的功能是设计一个栈类 s
15、tackT,并建立一个整数栈。【程序】#include iostream. h #include stdlib. h const int Max =20; /栈大小template class T class stack /栈元素数组T sMax; /栈顶下标int top;public:stack( )top =-1; /栈顶初始化为-1void push( const T /item入栈T pop( ); /出栈int stackempty( ) const; /判断栈是否为;template class T void stack T :push(const T exit(1);top +
16、stop = item;template class T T stackT :pop()T temp;if(top= (2) )cout “栈为空,不能出栈操作“ endl;exit(1);temp =stop;top -;return temp;template class T int stack T : stackempty( ) constreturn 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 “ “;(3)
17、 ;cout endl “出栈序列“;while( (4) )tout (5) “ “;cout endl;(分数:15.00)_八、试题八(总题数:1,分数:15.00)8.【说明】下面的程序是从命令行输入 3个数传递到 public static void main(String args)方法中 (如 java IsTriangle 3 4 5),并判断这 3个数能否构成三角形的 3条边,并显示相应的结果。请在程序的每条横线处填入适当的语句,使程序的功能完整。注意:请勿改动 main()主方法和其他已有的语句内容,仅在横线处填入适当的语句。public class IsTrianglep
18、ublic static void main( String args )int a =new (1) args. (2) ;for(int i=0;i3; (3) )ai= (4) if( (5) )System. out. println(a0 +“,“+a1 +“,“+a2“能构成三角形的 3条边“);elseSystem. out. println(a0 +“,“+a1 +“,“+a2“不能构成三角形的 3条边);(分数:15.00)_初级程序员下午试题-43 答案解析(总分:120.00,做题时间:90 分钟)一、试题一(总题数:1,分数:15.00)1.【函数 1.1说明】函数 s
19、trcpy(char*to,char*from)将字符串 from复制到字符串 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;in )*c+=ai bj?ai+:bj+;while
20、( (2) )*c+=ai+;while( (3) )*c+=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) ;(分数:15.00)_正确答案:(1)*to+=*from+或(*to+=*from+)!=/0(2)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)当
21、出现某一数组所有元素均已合并完成,则将另数组其他元素直接进行复制。b 串已复制完。(3)判断 a串是否已复制完。(4)递归函数 sun()完成数组 n个元素的累加,当 n0 时,使用规模为 n-1的函数进行递归。(5)当 n=0 时,返回 0即可。二、试题二(总题数:1,分数:15.00)2.【说明】该程序运行后,输出下面的数字金字塔11 2 11 2 3 2 11 2 3 4 3 2 11 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 =
22、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“ );(分数:15.00)_正确答案:(1)(max-0) (2)1 (3)max (4)max-1 (5)1)解析:解析 该程序共有 9行输出,即循环控制变量 max的值是从 1 9。每行输出分 3部分,先用循环 for语句输出左边空白,(1)空填“(max-0)”;再
23、用循环输出从 1到 max-0的显示数字,即(2)空和 (3)串分别填 1和 max;最后输出从 max-11 的显示数字,即(4)空和(5)空分别填和 max-1和1。三、试题三(总题数: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 *
24、nextNode;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-d = lastnum;p-next= *r; (2) ;doA = A - next;while( (3) );else if(A-d B-d)B=B- next;else (4) ;lastnum=A - d;while ( A while(A)las
25、tnum=A-d;p=( Node * ) malloc( sizeof(Node) );p- d = lastnum;(5) ;*r=p;while (A (分数:15.00)_正确答案:(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) (1) ;fread(buf,1,siz,fin); fwrite(b
26、uf,1,siz,fout);fsize= (2) ;int dofile(FILE * fin,Filelnfo * inp)long offset;FILE * fout;if ( fout = fopen ( inp - fname ,“wb“ )=NULL) printf(“创建文件错误: %s/n“ , inp - fname);return 1;offset= (3) ; /*保留合并文件读/写位置*/fseek( (4) ); /*定位于被恢复文件首*/copyfile ( fin, fout, inp - length);fclose(fout);printf(“/n -文件名
27、: %/n 文件长: %ld. /n“,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(“文件打开错误: %s/n“ ,fname);ret
28、urn 1;fseek(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(;) /*恢复一个(argc2)或全部(argc=2)原始文件*/fread ( if(finfo, length =0
29、) break;if (argc 2 if (dofile ( fcmbn, 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进行修改,
30、使其代表当前未拷贝的字节数。(3)dofile()首先创建一个新的文件 fout,用于存储被恢复的文件。然后先保存文件的读写位置(offset= ftell(fin),再获得被恢复文件在合并文件中的位置(fseek(fin,inp- offse,SEEK_SET),再进行拷贝。最后恢复合并文件的读写位置。本句保留合并文件的读写位置。(4)对被恢复文件进行定位。(5)对合并文件的读写位置进行恢复。五、试题五(总题数:1,分数:15.00)5.【说明】本应用程序的运行窗口如图 2所示。(分数:15.00)_正确答案:(1)Val(Txt_salary.Text)-Val(Txt_base.Text
31、)(2)Kpaylevel(j) (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)此处输出计算的结果,所以应填入T
32、xt_tax. Text。(5)由于免税金额不可修改,所以应该将它的 Enabled属性设置为 false。六、试题六(总题数:1,分数:15.00)6.【说明】单击窗体上的“测试”(cmdTest)按钮,出现一个输入框,要求输入一串字符,将该字符串中的非字母字符删除后,显示在窗体中的一个文本框(txtShow)中。【程序代码】Private Sub cmdTest_Click( )Dim strT1 ,strT2 As StringDim strCh As (1) Dim intL As IntegerDim intl As IntegerstrT1 = (2) (“请输入一串字符“,“字符
33、串输入“)intL = (3) strT2 = “ “For intl = I To intLstrCh = Mid ( strT1, intl, 1 )If(strCh“A“And (4) ) Or (strCh “a“ And suCh “z“ )ThenstrT2 = strT2 + strChEnd IfNext intltxtShow. Text= (5) End sub(分数:15.00)_正确答案:(1)String (2)InputBox (3)Len(strT1)(4)strCh“Z” (5)strT2)解析:解析 VB 中字符和字符串属于同一类型,所以(1)空填“Strin
34、g”。 (2)空应填 VB的输入对话框函数“InputBox”。根据题意,(3)空是求输入的字符串长度,故用“Len(strT1)”。(4)空处的条件是判断是否是字母字符,所以填 strCh“Z”;删除非字母字符后的结果在 strT2中,而题意是要显示在窗体中的文本框(txtShow)中,故(5)空填“strT2”。七、试题七(总题数:1,分数:15.00)7.【说明】以下程序的功能是设计一个栈类 stackT,并建立一个整数栈。【程序】#include iostream. h #include stdlib. h const int Max =20; /栈大小template class T
35、 class stack /栈元素数组T sMax; /栈顶下标int top;public:stack( )top =-1; /栈顶初始化为-1void 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 temp;if(top= (2) )cout “栈为空,不能出栈操作“ endl;exit(1);tem
36、p =stop;top -;return temp;template class T int stack T : stackempty( ) constreturn 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 “ “;(3) ;cout endl “出栈序列“;while( (4) )tout (5) “ “;cout endl;(分数:15.00)_正确答案:(1)Max-1 (2)-1 (3)st.push(ai
37、)(4)!st.stackempty() (5)st.pop()解析:解析 本题用类模板方式定义一个栈类,其中有两个私有数据成员:s(存放栈元素)和 top(栈顶元素下标),以及 3个公有成员函数: push(元素入栈)、Pop(元素出栈)和 stackempty(判断栈是否为空)。在函数 push()中,首先要判断是否栈满。栈的大小为 Max,数组的下标从。开始,所以栈满的条件是栈顶元素下标为 Max-1,所以(1)空应填入“Max-1”。同样,在函数 pop()中,首先要判断是否为空栈,由于栈顶初始化为-1,所以(2)空应填入“-1”。在主函数中,先进行入栈操作,所以(3)空应填入“st.
38、push(a i)”。然后进行出栈操作,判断栈是否为空,调用对象的函数 stackempty(),所以(4)空应填入“!st.stackempty()”。(5)空处调用出栈函数,所以应填入“st.pop()”。八、试题八(总题数:1,分数:15.00)8.【说明】下面的程序是从命令行输入 3个数传递到 public static void main(String args)方法中 (如 java IsTriangle 3 4 5),并判断这 3个数能否构成三角形的 3条边,并显示相应的结果。请在程序的每条横线处填入适当的语句,使程序的功能完整。注意:请勿改动 main()主方法和其他已有的语句
39、内容,仅在横线处填入适当的语句。public class IsTrianglepublic static void main( String args )int a =new (1) args. (2) ;for(int i=0;i3; (3) )ai= (4) if( (5) )System. out. println(a0 +“,“+a1 +“,“+a2“能构成三角形的 3条边“);elseSystem. out. println(a0 +“,“+a1 +“,“+a2“不能构成三角形的 3条边);(分数:15.00)_正确答案:(1)int (2)length (3)i+ (4)argsi(5)a0+a1a2或等价形式)解析:解析 声明并创建数组,通过 length属性取得参数的长度,循环递增条件,将输入参数逐个传给ai,构成三角形的条件,两边之和大于第三边或者两边之差小于第三边。