1、初级程序员下午试题-11 及答案解析(总分:90.00,做题时间:90 分钟)一、B试题一/B(总题数:1,分数:15.00)1.【说明】 设学生(学生数少于 50 人)某次考试的成绩按学号顺序逐行存放于某文件中,文件以单行句点“.”为结束符。下面的流程图用于读取该文件,并把全部成绩从高到低排序到数组 B50中。 【流程图】(分数:15.00)_二、B试题二/B(总题数:1,分数:15.00)2.【说明】 设有 n 个人围坐一圈并按顺时针方向从 1 到 n 编号,从第 s 个人开始进行 1 到 m 的报数,报数到第 m 个人,则此人出圈,再从他的下一个人重新开始 1 到 m 的报数,如此进行下
2、去,直到所有的人都出圈为止。 现要求按出圈次序,每 10 人一组,给出这 n 个人的顺序表。 设 n=100,s=1,m=10。 (1)将1 到 n 个人的序号存入一维数组 p 中; (2)若第 i 个人报数后出圈,则将 p 置于数组的倒数第 i 个位置上,而原来第 i+1 个至倒数第 i 个元素依次向前移动一个位置: (3)重复第(2)步,直至圈中只剩下 p1为止。#includestdio.h #define N 100 #define S 1 #define M 10 void main() int p100,n,s,m; m=M; n=N; s=S; int i,j,s1,w; s1=
3、s; for(i=1;U (1) /U;i+) (2)=i; for(i=n;i=2;i-) s1=U (3) /U; if(s1=0)s1=i; w=U (4) /U; for(j=s1;ji;j+) pj-1=pj; pi-1=U (5) /U; printf(“%4d“,pi) (分数:15.00)_三、B试题三/B(总题数:1,分数:15.00)3.【说明】 给定函数 fun 的功能是:将从键盘上输入的每个单词的第一个字母转换为大写字母,输入时各单词必须用空格隔开,用“.”结束输入。 【函数】 int fun(char *c,int status) if(U (1) /U=) retu
4、rn 1; else if(U (2) /U return 0; main() int flag=1; char ch; printf(“请输入一字符串,用点号结束输入!/n“); do ch=getchar(); flag=fun( putchar(ch); while(ch!=.); printf(“/n“); (分数:15.00)_四、B试题四/B(总题数:1,分数:15.00)4.【说明】 编写程序,生成一个新文本文件,它由一个已知文本文件的所有偶数行组成。要求已知文本文件名和新文本文件名均从键盘输入。请填空完善程序。 【C 语言程序】 #includestdio.h main() F
5、ILE *oldf,*newf; char ch,fname20; int i; do printf(“Enter name of existed text file to be read:“); scanf(“%s“,fname); if(oldf=fopen(fname,“r“)=NULL) printf(“File %s cant open!/n“,fname); while(oldf=NULL); do printf(“Enter mane of new text file to be written:“); scanf(“%s“,fname); if(U (1) /U=NULL) p
6、rintf(“File %s cant open!/n“,fname); while(U (2) /U); i=1; while(!feof(oldf) while(ch=fgetc(oldf)!=U (3) /U) if(i%2=U (4) /U) fputc(ch,newf); fputc(/n,newf); U (5) /U; fclose(oldf); fclose(newf); (分数:15.00)_五、B试题五/B(总题数:1,分数:15.00)5.【说明】 在下面函数横线处填上适当的字句,使其输出结果为: 构造函数. 构造函数. 1,2 5,6 析构函数 析构函数. 【C+代码】
7、 #include “iostream.h“ class AA public; AA(int i,int j) A=i; B=j; cout“构造函数./n“; AA()U (1) /U; void print(); private: int A, B; ; void AAprint() coutA“,“Bendl; void main() AA *a1, *a2; U(2) /U=new AA(1, 2); a2=new AA(5, 6); U(3) /U; a2-print(); U(4) /Ua1; U(5) /Ua2; (分数:15.00)_六、B试题六/B(总题数:1,分数:15.0
8、0)6.【Java 代码】 class usethread implementsU (1) /U int num usethread(int n) num=n; public voidU (2) /U for(int i=0;i3;i+) System.out.println(“running:“+num); System.out.println(“finished:“+num); public class multhread public static void main(String args)U (3) /UInterruptedException Thread m1=new Threa
9、d(new usethread(1); Thread m2=new Thread(new usethread(2); m1.start(); m2.start(); m1.join(); m2.join(); 【问题 1】 补充完整上面 Java 代码中U (n) /U处。 【问题 2】 写出上面Java 代码运行的结果。(分数:15.00)_初级程序员下午试题-11 答案解析(总分:90.00,做题时间:90 分钟)一、B试题一/B(总题数:1,分数:15.00)1.【说明】 设学生(学生数少于 50 人)某次考试的成绩按学号顺序逐行存放于某文件中,文件以单行句点“.”为结束符。下面的流程图
10、用于读取该文件,并把全部成绩从高到低排序到数组 B50中。 【流程图】(分数:15.00)_正确答案:()解析:(1)B0a (2)i0 (3)a=“.“ (4)aBj (5)j- 分析 本题考查用程序流程图来描述排序。 题目要求将文件中学生的成绩读出,并把全部成绩从高到低排序到数组 B50中。这里面涉及两个问题,第一是从文件中读数,文件中的数据是以单行句点“.”为结束符的,在未读到此符号前,应该将继续取数据。第二是排序,每取到一个学生的成绩都要与数组的学生成绩比较,按照从高到低的顺序在数组中找到合适的位置存放。下面来具体分析流程图。 第(1)空在条件判断为假的情况下执行流程中,如果条件为假说
11、明从文件中取到的数据是学生成绩。从程序流程图中可以看到,从文件中读的数据存放在变量 a 中,而此空是第一次取数据,应该存放数组 B 的第一个位置,因此此空答案为 B0a。 第(2)空是紧接着第(1)空来的,在上面已经把从文件中读到的第一个数存放到了数组中,接下来应该处理数组的下标问题,从后面的流程中可以推断出变量 i 是存放数组当前下标的,而且没有初值,那么此空的任务应该是用来给变量 i 赋一个初值,而对数组的操作应该从头开始,因此此空答案为 i0。 第(3)空是循环的判断条件,如果条件成立则结束,在这之前又对文件进行了一次读数,根据我们上面的分析只有在读到了结束符时程序才结束,那么此空肯定是
12、判断从文件中读到的数据是否为结束符,因此此空答案为 a=“.“?。 第(4)空也是一个循环的判断条件,如果条件成立,则将取到的数存放到数组的当前下标位置;如果不成立,则循环找到合适的位置再存放。从这里我们不难推断出,流程图中是将从文件取到的成绩与当前数组中的最小成绩进行比较的,而当前数组中的最小成绩存放在位置 j 中,因此此空答案为 aBi?。 第(5)空在循环体中,这个循环的作用是为当前从文件中读到的成绩在已经排好序的数组元素中找到合适的位置,找到了就要插入,数组中的元素是按从大到小排列的,在查找合适位置时是从后往前依次比较,因此此空的任务应该是将数组的下标往前移动,所以此空答案为“i-”。
13、二、B试题二/B(总题数:1,分数:15.00)2.【说明】 设有 n 个人围坐一圈并按顺时针方向从 1 到 n 编号,从第 s 个人开始进行 1 到 m 的报数,报数到第 m 个人,则此人出圈,再从他的下一个人重新开始 1 到 m 的报数,如此进行下去,直到所有的人都出圈为止。 现要求按出圈次序,每 10 人一组,给出这 n 个人的顺序表。 设 n=100,s=1,m=10。 (1)将1 到 n 个人的序号存入一维数组 p 中; (2)若第 i 个人报数后出圈,则将 p 置于数组的倒数第 i 个位置上,而原来第 i+1 个至倒数第 i 个元素依次向前移动一个位置: (3)重复第(2)步,直至
14、圈中只剩下 p1为止。#includestdio.h #define N 100 #define S 1 #define M 10 void main() int p100,n,s,m; m=M; n=N; s=S; int i,j,s1,w; s1=s; for(i=1;U (1) /U;i+) (2)=i; for(i=n;i=2;i-) s1=U (3) /U; if(s1=0)s1=i; w=U (4) /U; for(j=s1;ji;j+) pj-1=pj; pi-1=U (5) /U; printf(“%4d“,pi) (分数:15.00)_正确答案:()解析:(1)i=n (2)
15、pi-1 (3)(s1+m-1)%i (4)ps1-1 (5)w 分析 题目中给出了 n 个人出圈问题的具体实现方法,要求用 C 语言来实现,结合题目中给出的方法,我们来具体分析程序。 第(1)空是循环的判断条件,根据题目的要求和程序来看,这个循环应该用来把 n 个人的编号存放到数组 p 中,总共是 n 个人,那么循环上界应该是 n,从程序中可以知道循环变量是 i,因此此空答案为 i=n。 第(2)空在循环体中,从上面的分析已经知道,这个循环实现将 n 个人的编号存放到数组 p 中,第一个人的编号应该存放到数组下标为 0 的位置,而第二个人的编号就存放到数组下标为 1 的位置,依此类推。因此此
16、空答案为 pi-1。第(3)空在另一个循环体中,结合整个程序来看,不难推断出此循环体应该用来实现题目中的第二个与第三个要求。此空是用来给变量 s1 赋一个值,从后面的程序中可以推断出,变量 s1 中存放的是判断当前报数的人是否该出圈,如果为 0,则出圈,因此此空答案为(s1+m-1)%i。 第(4)空是给一个变量 w 赋一个值,从此空上面的程序我们知道找到了要出圈的人,根据题目要求,应将出圈人的编号置于数组的倒数第 i 个位置上,在将其存放到倒数第 i 个位置时肯定要移动数组中的元素,而元素的移动是以当前位置为前提的,那么需要将当前位置人的编号先保存到变量 w 中,而当前位置人的编号存放在数组
17、,ps1-1中,因此此空答案为 ps1-1。 第(5)空很明显是给 pi-1赋一个值,而 pi-1正好是数组的倒数第 i 个位置,应该用来存放当前出圈人的编号,而编号在变量 w 中,因此此空答案为 w。三、B试题三/B(总题数:1,分数:15.00)3.【说明】 给定函数 fun 的功能是:将从键盘上输入的每个单词的第一个字母转换为大写字母,输入时各单词必须用空格隔开,用“.”结束输入。 【函数】 int fun(char *c,int status) if(U (1) /U=) return 1; else if(U (2) /U return 0; main() int flag=1; c
18、har ch; printf(“请输入一字符串,用点号结束输入!/n“); do ch=getchar(); flag=fun( putchar(ch); while(ch!=.); printf(“/n“); (分数:15.00)_正确答案:()解析:(1)*c (2)status (3)*c=z (4)*c=a (5)*c+ 分析 本题考查在 C 语言中对字符串的处理。题目要求程序将从键盘上输入的每个单词的第一个字母转换为大写字母,而输入的各单词必须用空格隔开,用“.”结束输入。要实现这个功能,关键之一在于如何取出单词中的第一个字母,关键之二是如何实现大小写字母的转换。 第(1)空是一个条
19、件判断语句的条件,如果条件成立,则返回 1,而从程序中可以看出,此条件判断语句是判断当前取到的字符是否等于空格字符。从主函数中可以看到,每次在调用功能函数 fun()前都从输入的字符串中取出一个字符,并存放在变量 ch 中,而在调用函数时是将变量 ch 的地址传递给了指针变量 c,因此此空的答案为*c。 第(2)空、第(3)空和第(4)空应该结合起来看,它们都是条件判断语句的条件,这个条件判断语句下面的程序是将一个小写字母改变成一个大写字母,根据题目要求,此条件判断语句的条件应该是判断当前取到的字母是一个单词的第一个字母且是一个小写字母,再结合主函数来看,我们不难发现单词的第一个字母用一个标记
20、变量 flag 标识,如果是第一个字母,这个标记变量 flag 的值为 1,否则为 0。要判断一个字母是否是小写字母,应该判断其 ASC码值是否在 a 与z 的 ASC码值之间。所以这 3 个空的答案应该分别为 status、*c=z、*c=a。 第(5)空是在上面条件成立的情况下执行的一条语句,条件成立我们在上面已经分析过了,表明当前取到的字符是一个单词的第一个字母且是小写字母,此空所在语句的任务是将小写字母变成大写字母,根据上面的分析,因此可以得到此空答案为*c+。四、B试题四/B(总题数:1,分数:15.00)4.【说明】 编写程序,生成一个新文本文件,它由一个已知文本文件的所有偶数行组
21、成。要求已知文本文件名和新文本文件名均从键盘输入。请填空完善程序。 【C 语言程序】 #includestdio.h main() FILE *oldf,*newf; char ch,fname20; int i; do printf(“Enter name of existed text file to be read:“); scanf(“%s“,fname); if(oldf=fopen(fname,“r“)=NULL) printf(“File %s cant open!/n“,fname); while(oldf=NULL); do printf(“Enter mane of new
22、 text file to be written:“); scanf(“%s“,fname); if(U (1) /U=NULL) printf(“File %s cant open!/n“,fname); while(U (2) /U); i=1; while(!feof(oldf) while(ch=fgetc(oldf)!=U (3) /U) if(i%2=U (4) /U) fputc(ch,newf); fputc(/n,newf); U (5) /U; fclose(oldf); fclose(newf); (分数:15.00)_正确答案:()解析:(1)newf=fopen(fn
23、ame,“w“) (2)newf=NULL (3)/n (4)0 (5)i=i+1(或 i+) 分析 本题考查用C 语言实现对文本文件的操作。 题目要求程序生成一个新文本文件,它的内容由一个已知文本文件的所有偶数行组成,而已知文本文件名和新文本文件名均从键盘输入,题目的关键在于对文件的操作。下面来具体分析代码。 第(1)空在一个循环体中,是条件判断语句的条件,此循环的作用我们不难从程序中看出,是用来打开新文本文件的,在 C 语言中要打开一个文件应该用函数 fopen(),它的两个参数分别是其文件名和对文件操作的属性,根据题目意思,对这个文件的操作只有写操作。因此,此空答案为newf=fopen
24、(fname,“w“)。 第(2)空是一个循环的判断条件,上面我们已经分析了该循环的作用,是用来打开新文本文件的,结合第一个文件的打开程序,我们很容易发现此空的答案为 newf=NULL。 第(3)空是一个二重循环第二层循环的判断条件,这个二重循环的作用是用来实现将已知文本文件的所有偶数行内容写到新文件中,这里需要注意每次取到的内容都是偶数行的内容,在对已知文本文件进行取内容时是逐行取的,那么条件判断语句是用来判断是否取完了一行内容,在 C 语言中,一般用换行符/n来标志一行的结束,因此此空答案为/n。 第(4)空是循环下条件判断语句的条件,根据题目要求可以知道每次对新文件进行写的数据都是已知
25、文本文件的偶数行的内容,那么在写之前应该首先判断内容是否是偶数行的内容。此空所在语句就是用来实现这一功能的,而偶数对 2 取余的结果都为 0,因此此空答案为 0。 第(5)空是二重循环的最后一条语句,在上面的空中我们已经分析到,在对新文件进行写内容时要首先判断其内容所在行是否为偶数行,而当前行号存放在变量 i 中,整个程序都没有改变变量 i 的值,那么此空应该是用来改变变量 i 的值的,因此此空答案为 i+。五、B试题五/B(总题数:1,分数:15.00)5.【说明】 在下面函数横线处填上适当的字句,使其输出结果为: 构造函数. 构造函数. 1,2 5,6 析构函数 析构函数. 【C+代码】
26、#include “iostream.h“ class AA public; AA(int i,int j) A=i; B=j; cout“构造函数./n“; AA()U (1) /U; void print(); private: int A, B; ; void AAprint() coutA“,“Bendl; void main() AA *a1, *a2; U(2) /U=new AA(1, 2); a2=new AA(5, 6); U(3) /U; a2-print(); U(4) /Ua1; U(5) /Ua2; (分数:15.00)_正确答案:()解析:(1)cout“析构函数.
27、/n“ (2)a1 (3)a1print() (4)delete (5)delete 分析 本题考查用C+语言对输出的实现。 题目中没有什么条件,只给出了输出结构,要求程序能实现这个输出。下面来具体分析代码。 第(1)空很明显是类 AA 的析构函数的函数体,类的析构函数一般在撤销一个对象时调用,根据题目的要求,要输出析构函数这样的结果,而在程序中没有与此相关的操作,那么此空应该是用来实现这个功能的,借鉴构造函数中的内容,我们很容易就得出此空答案为 cout“析构函数./n“。 第(2)空在主函数中,很明显此空所在的语句是创建一个 AA 类的对象,并让一个 AA 型的指针变量指向这个对象。在函数
28、开始的时候声明了两个 AA 型的指针变量 a1 和 a2,而 a2 在下面已经有了值,那么这里只有用变量a1,因此此空答案为 a1。 第(3)空是在创建了两个对象后执行的语句,根据程序不难推断出,这里应该要实现对象 a1 的数据输出,那么就要调用函数 print(),因此此空答案为 a1-print()。 第(4)空所在的语句是在实现了构造函数与数据输出后执行的语句,从题目要求来分析,这里应该要调用对象的析构函数来输出“析构函数”这样一个结果,上面我们已经分析到了对象的析构函数一般在撤销对象时调用。从对象的执行过程来分析,在对象的所有处理完成后也应该撤销对象来释放所占的资源,那么此空的任务应该
29、是用来撤销 a1 对象,在 C+中一般用关键字 delete,因此此空答案为 delete。 第(5)空和第(4)空的情况一样,因此此空答案为 delete。六、B试题六/B(总题数:1,分数:15.00)6.【Java 代码】 class usethread implementsU (1) /U int num usethread(int n) num=n; public voidU (2) /U for(int i=0;i3;i+) System.out.println(“running:“+num); System.out.println(“finished:“+num); public
30、 class multhread public static void main(String args)U (3) /UInterruptedException Thread m1=new Thread(new usethread(1); Thread m2=new Thread(new usethread(2); m1.start(); m2.start(); m1.join(); m2.join(); 【问题 1】 补充完整上面 Java 代码中U (n) /U处。 【问题 2】 写出上面Java 代码运行的结果。(分数:15.00)_正确答案:()解析:(1)Runnable (2)r
31、un() (3)throws 程序输出结果: running:1 running:2 running:1 running:2 running:1 running:2 finished:1 finished:2 分析 本题考查 Java 中线程的相关知识。 题目要求按照程序给出的内容来完成填空和输出程序的运行结果。本题的关键是考查我们对线程的了解程度。线程的创建方法有两种,即通过类 Thread 和接口 Runnable 创建的方法。刚刚创建的线程还不能与其他的线程并发运行,当调用了方法 start 后,线程进入就绪态,在被 Java 虚拟机调度后才进入运行态。进入运行态的线程自动执行成员方法
32、run(),在执行完这个成员方法后线程就又自动进入死亡态。下面来具体分析程序。 第(1)空在定义类 usethread 语句中,从后面的关键字 implements 可以推断出类继承了一个接口,而在 Java 中,接口一般只有成员变量和成员方法的定义而没有成员方法的具体实现。根据后面的程序new Thread(new usethread(1)可以知道创建了线程对象,而这种创建线程对象的方法是通过接口Runnable 来实现的,因此类 usethread 肯定是继承了接口 Runnable,所以此空答案为 Runnable。 第(2)空是一个函数体的函数名,而函数体的作用是循环进行输出,从上面对
33、线程的分析可以知道,此函数一定是 run()函数,因此此空答案为 run()。 第(3)空是入口函数后面的语句,结合 Java 程序的特点,再从此空后面的内容不难推断出,此处是要显式生成异常来处理程序中的异常。而在 Java 中,一般用关键字throws 来显式生成异常,因此此空答案为 throws。 对于问题 2,我们可以根据程序来分析,程序中创建了两个线程,根据上面的分析我们可以知道,这两个线程都自动调用了函数 run(),因此程序输出结果为:running:1 running:2 running:1 running:2 running:1 running:2 finished:1 finished:2