初级程序员2010下半年下午试题
试题一
阅读以下说明和流程图,回答问题1至问题4,将解答填入对应栏内。 [说明]
下面的流程图中有两个判断条件A >0和B >0。这些判断条件的各种组合情况如下表所示。表中Y 表示相应的条件成立,N 表示相应的条件不成立。每一 ]
1、当遇到哪几种条件组合时,流程图能执行“1→i”?(写出相应的序号即可)
2、当遇到哪几种条件组合时,流程图能执行“2→j”?(写出相应的序号即可)
3、当遇到哪几种条件组合时,流程图能执行“3→k”?(写出相应的序号即可)
4、该流程图共有多少条实际执行路径?
试题二
阅读以下说明和C 函数,将应填入 (n) 处的语句或语句成分写在对应栏内。 [说明1]
函数deldigit(char *s)的功能是将字符串s 中的数字字符去掉,使剩余字符按原次序构成一个新串,并保存在原串空间中。其思路是:先申请一个与s 等长的临时字符串空间并令t 指向它,将非数字字符按次序暂存入该空间,最后再复制给s 。 [C函数]
void deldigit(char *s) {
char *t=(char*)malloc( (1) ); /*申请串空间*/ int i, k=0;
if (!t) return;
for(i=0; i < strlen(s); i++)
if ( ! (*(s+i)>='0' && *(s+i)<='9') ) { t[k++]= (2) ; }
(3) ='\0'; /*设置串结束标志*/ Strcpy(s,t); free(t); [说明2]
函数reverse(char *s,int len)的功能是用递归方式逆置长度为len 的字符串s 。例如,若串s 的内容为“abcd”,则逆置后其内容变为“dcba”。 [C函数]
void reverse(char *s, int len) {
char ch;
if ( (4) ) ch=*s;
*s=*(s+len-1); *(s+len-1)=ch; reverse( (5) ); } }
1、
2、
3、
4、
5、
试题三
阅读以下说明和C 代码,回答问题1和问题2,将解答写在对应栏内。 1、[说明1]
下面代码的设计意图是:将保存在文本文件data.txt 中的一系列整数(不超过100个) 读取出来存入数组arr[],然后调用函数sort()对数组arr 的元素进行排序,最后在显示屏输出数组arr 的内容。
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
void sort(int a[], int n)
{/*对n 个元素的整型数组a 按递增方式排列*/ /*
此处代码省略 */ return; } int main() {
int i, num=0; int arr[100]; FILE fp;
fp=fopen("data.txt", "r"); if(!fp) return -1; while(!feof(fp)) {
fscanf(fp, "%d", arr[num++]); }
sort(arr[], num); for(i=0; i<num;)
fprintf(stdout, "%d", arr[i++]);
以上C 代码中有三处错误(省略部分的代码除外) ,请指出这些错误所在的代码行号,并在不增加和删除代码行的情况下进行修改,写出修改正确后的完整代码行。
[说明2]
调用方式1
int main( ) {
char* ptr=NULL; get_str(ptr); if (ptr)
printf("%s\n",ptr); else
调用方式2
int main( ) {
char* ptr=NULL; get_str(&ptr); if (ptr)
printf("%s\n", ptr); else
printf("%p\n", ptr); /*输出指针的
printf("%p\n", ptr);
值*/ return 0;
return 0;
}
}
[问题]
若分别采用函数定义方式1、2和调用方式1、2,请分析程序的运行情况,填充下面的空(1)~(3)。
若采用定义方式1和调用方式1,则输出为“00000000”。 若采用定义方式1和调用方式2,则 (1) 。 若采用定义方式2和调用方式1,则 (2) 。 若采用定义方式2和调用方式2,则 (3) 。
1、
2、
3、
试题四
阅读以下说明和C 函数,将应填入 (n) 处的语句或语句成分写在对应栏内。 [说明]
已知单链表L 含有头节点,且节点中的元素值以递增的方式排列。下面的函数DeleteList 在L 中查找所有值大于mink 且小于maxK 的元素,若找到,则逐个删除,同时释放被删节点的空间。若链表中不存在满足条件的元素,则返回-1,否则返回0。
例如,某单链表如下图(a)所示。若令minK 为20、maxK 为50,则删除后的(b)所示。
链表节点类型定义如下: typedef struct Node{ int data;
struct Node *next; }Node, *LinkList; [C函数]
int DeleteList (LinkList L, int minK, int maxK)
{ /*在含头节点的单链表L 中删除大于minK 且小于maxK 的元素*/ (1) *q=L, *p=L->next ; /*p指向第一个元素节点*/ int delTag=0; while (p)
if (P->data <= minK) {q=p; p= (2) ; } else
if (p->data < maxK) { /*找到删除满足条件的节点*/ q->next= (3) ; free(p); p= (4) ; delTag=1; }
else break;
if ( (5) ) return -1; return 0; }
1、
2、
4、
5、
试题五
阅读以下说明和C++代码,将应填入 (n) 处的语句或语句成分写在对应栏内。 [说明]
某数据文件students.txt 的内容为100名学生的学号和成绩,下面的程序将文件中的数据全部读入对象数组,按分数从高到低进行排序后选出排名前30%的学生。
[C++代码]
#include <iostream > #include <fstream > #include <string > using namespace std; class Student { private:
string sNO; //学号 int credit; //分数 public:
Student(string a,int b) { sNO=a; credit=b; } Student () {} int getCredit (); void out (); };
(1) ::getCredit () { return credit; }
(2) ::out () {
cout << "SNO: " << sNO << ", Credit=" << credit << end1; }
class SortStudent { public:
void sort(Student *s, int n); SortStudent () {} };
void SortStudent::sort(Student *s, int n) { for (int i=0; i<n-1; i++) { for (int j=i+1; J<n; j++) {
if(s[i]. (3) < s[j]. (4) ) {
Student temp=s[i]; s[i]=s[j]; s[j]=temp;
} } }
int main(int argc, char* argv[]) {
const int number=100; //学生总数 ifstream Students;
Students.open("students.txt"); if(!students.is_open()) { throw 0; }
Student *testStudent= (5) [number]; int k=0; string s;
while (getline(students,s,'\n')) { //每次读取一个学生的学号和成绩
Student student(s.substr(0,s.find(',')), atoi(s.substr(s.find (',')+1).c_str()));
testStudent[k++] = student; }
students.colse(); (6) ;
ss.sort(testStudent,k);
cout <<"top 30%: "<<end1; for(k=0; k<number * 0.3; k++) { testStudent[k].out(); }
delete []testStudent; return 0; }
1、
2、
3、
4、
5、
6、
阅读以下说明和Java 代码,将应填入 (n) 处的语句或语句成分写在对应栏内。 [说明]
某数据文件students.txt 的内容为100名学生的学号和成绩,下面的程序将文件中的数据全部读入对象数组,按分数从高到低进行排序后,选出排名前30%的学生。 [Java代码]
import Java.io.*; class Student {
private string sNO; //学号 private int credit; //分数 public int getCredit () { return Credit; }
public String toString () {
return"sNO="+this.sNO+", Credit="+this.Credit; }
Student(String sNO, int Credit) { (1) =sNO; (2) =Credit; } }
public class SortStudent {
void sort(Student[] s) { //Sort the array s[] in descending order of
Credit
for (int i=0; i < s.length-1; i++) { for (int j=i+1; j < s.length; j++) { if (s[i]. (3) < s[j]. (4) ) { Student tmp=s[i]; s[i]=s[j]; s[j]=tmp; } } } }
public static void main(String argv[]) { Student[] testStudent = new Student[size]; try {
BufferedReader in = new BufferedReader(new FileReader ("Students.txt")); boolean done = false; int i = 0;
while (!done) {
String s = in.readLine(); //每次读取一个学生的学号和成绩 if (s !=null) {
String tmp[] = s.split(",");
testStudent[i++] = (5) (tmp[0], Integer.parseInt (tmp[1])); } else
done = true; }
in.close();
(6) =new SortStudent(); ss.sort(testStudent);
System.out.println("top 30%:");
for (int j = 0; j < size * 0.3; j++) System.out.println(testStudent[j]); } catch (IOException e) { System.out.println("io error!"); }catch (NumberFormatException e) { System.out.println("not a number!"); } }
(7) int size = 100; //学生总数 }
1、
2、
3、
4、
5、
6、
7、
答案:
试题一
1、1,2 2、2,4 3、1,3,4
4、
本题考查程序模块处理流程设计的理解能力。
针对流程图中的多个判断条件及其组合,给出流程图的各种输入数据方案,检查流程图的执行情况,这种方法实际上就是单元测试常用的白盒方法。一组
输入数据方案就是一个测试案例。
对于本题的处理流程,三个判断条件中有两个是一样的,即只有两种判断条件。因此判断条件的组合共有4种。题中对这4种组合情况编制了序号。我们
4种条件组合分析其执行流程的情况,见下表:
因此,条件组合序号为1、2时,该流程将执行1→i;条件组合序号为2、4时,该流程将执行2→j;条件组合序号为1、3、4时,该流程将执行3→k。
由于这4种执行的情况不同,即执行路径不同,因此,该流程图共有4条不同的执行路径。
试题二
1、strlen(s)+1 2、*(s+i),或s[i],或其等价表示 3、*(t+k),或t[k],或其等价表示 4、len >1,或len >=1,或其等价表示
5、s+1,len-2
本题考查C 程序基本结构的理解和应用。
根据说明1,在函数deldigit(char *s)中需先申请一个与s 等长的临时字
符串空间并令t 指向它,因此空(1)处应填入“strlen(s)+1”,其中,加1的
原因是函数strlen 计算s 所指向字符串的长度时,没有包含串结束标志字符
“\0”。当然,申请比“strlen(s)+1”更大的存储区也可以,只是没有必要。 由于需要将非数字字符按原来的顺序存入t 所指向的存储区,所以空(2)处
填入“s[i]”,或其等价表示形式。
最后再设置t 所指向字符串的结束标志,即令t[k]='\0'。在这里,空(3)
处的t[k]写为t[k++]也可以,而写为t[k+1]或t[++k]则不符合整个代码的处
理逻辑。
函数reverse(char *s, int len)的功能是用递归方式逆置长度为len 的字符串s ,其中,以下代码实现了将s 所指字符与串中最后一个字符交换的处理: ch=*s;
*s=*(s+len-1);
*(s+len-1)=ch;
显然,当字符串的长度len 小于或等于1时,无须进行交换,因此空(4)处
应填入“len>1”,或者“len>=1”。若长度为1时也进行交换,逻辑上没有错,但是运算是冗余的。
试题三
本题考查C 语言指针的理解和应用。
在说明1之后的C 代码中有三处错误。
第1个错误的源头在第14行对变量fp 的定义上。FILE 是预定义的一个结
构体类型,在C 语言程序中,必须通过定义FILE 类型的指针变量和文件操作函数来访问外存文件。因此,第14行的代码应为“FILE *fp;”。
第2个错误位于第19行,函数fscanf 与scanf 函数的用法相同,以整型、浮点型和字符型格式控制方式读取文件中的数据时,需要在获取值的变量名前
加取地址运算符号“&”,arr[num++]等同于arr[num],num+=1,而数组元素arr[num]的作用等同于一个变量,因此,该行的正确代码为“fscanf(fp, "%d", &arr[num++]);”。
第3个错误位于第21行。根据函数sort 的定义可知,调用函数sort 时第
一个实参应该为数组名或对数组元素取地址。因此,该行的正确代码为
“sort(arr, num);”或者“sort(&arr[0], num);”。1、输出为“00000000”
2、运行异常,无输出(或含义相同的叙述)
3、输出为“testing”
本题考查C 语言指针的理解和应用。
关于函数get_str的两种定义方式,其区别在形式参数的类型不同,从而导致调用时对实参的要求不同。
对于定义方式1,其函数首部为:void get_str(char* p),参数p 是指针
参数,因此,调用该函数时的实参应为指针,可以是字符数组名、字符变量的
地址或指针变量。在调用方式1中,正是以指针变量ptr 为实参,此时,采用
的参数传递方式为传值,因此,回到调用函数后,ptr 的值并没有变(仍然为
NULL) ,因此,输出为“00000000”。而在调用方式2中,是以指针变量ptr 的地址为实参进行调用,开始执行函数get_str时,指针p 指向的目标为变量
ptr ,但是调用了malloc 函数后,重新为p 赋值了,即p 指向了其他存储区(串拷贝函数运行后,p 所指区域的内容为字符串“testing”),p 一开始指向的目标变量ptr 的内容没有变。由于是传值调用,所以回到main 函数后,ptr 变量的值并没有改变,因此,输出仍为“00000000”。
对于定义方式2,其函数首部为:void get_str(char** p),参数p 是指向指针的指针参数,要求调用该函数时的实参为指针的地址,因此,对于调用方
式1,以指针变量ptr 为实参,与形参的要求不匹配,会导致运行异常,不能
产生输出。而在调用方式2中,是以指针变量ptr 的地址为实参进行调用,符
合要求,因此在函数get_str中,*p即表示目标变量ptr ,通过malloc 申请到的存储区域首地址复制给*p,也就是令ptr 指向了申请到的存储区域起始位置,串拷贝函数运行后,将字符串“testing”放入该存储区,最后回到调用函数
main 后,ptr 指向的目标改变了,因此输出为“testing”。
试题四
1、Node 2、p->next 3、p->next 4、q->next
5、!delTag ,或delTag==0,或delTag!=1
本题目考查C 语言指针和动态链表的应用。
函数DeleteList(LinkList L, int minK, int maxK)的功能是在L 在含头节点的单链表L 中删除大于minK 且小于maxK 的元素,因此除了头指针L 以外,至少还需要两个临时指针,一个用于遍历链表中的元素,另外一个用于删除节点时重新链接节点,p 和q 就起这样的作用。
空(1)处用于定义指针变量p 和q ,由于p 和q 之前已经有“*”,因此,空
(1)处应填入“Node”,若填入“LinkList”,则p 和q 为指向指针变量的指针变量,此后对它们的使用方式就不正确了。
由于链表中的元素已经按照升序排列,所以在第一个大于minK 的元素之前都可以令指针一直沿着指针链后移,即“q=p; p=p->next”,直到p 指向第一个大于minK 的元素节点为止,在此过程中,q 始终指向p 所指节点的前驱。因此,空(2)处应填入“p->next”。
删除节点的处理由以下代码完成:
if (P->data < maxK) { /*找到删除满足条件的节点*/
q->next= (3) ; free(p); p= (4) ; delTag=1;
}
当p 指向需要被删除的节点时,q 正好指向其前驱节点,如下图(a)所示,因此,“q->next=p->next”就可以将p 所指节点从链表中删除,如下图(b) 函数调用“free(p)”将p 所指节点的空间释放(由系统回收) 。因此空(3)应填入“p->next”。此后,应再令p 指向下一个需要被删除的节点,即空(4)应填入“q->next”。delTag 的作用是判断链表中是否存在满足删除条件的节点,因此根据题目的描述,空(5)处应填入“!delTag”,当delTag 的值保持为0时,说明链表中不存在满足删除条件的节点。
试题五
1、int Student 2、void Student 3、getCredit() 4、getCredit() 5、new Student
6、SortStudent ss
本题考查C++语言程序设计的能力,涉及类、对象、函数、访问控制、对象数组的定义和相关操作,以及对象数组的排序算法。要求考生根据给出的案例和执行过程说明,认真阅读理清程序思路,然后完成题目。
首先分析程序的整体结构。本题中定义了两个类:student 和SortStudent ,分别用于定义学生和进行排序。类Student 的定义中,第一部分为private 访问权限的成员,要对其进行访问,需要通过具有相应访问权限的成员函数。在第二部分的接口定义为public 。C++用类名约束机制允许将成员函数定义在类接口定义之外。类SortStudent 中定义了成员函数sort ,其功能是对参数为
Student 对象数组根据分数进行排序。考查main 函数的代码,理清程序的行为:打开学生文件,创建对象数组,将学生的学号和成绩读入,创建Student 对象并加入对象数组,将对象数组排序,然后输出top30%的学生信息。
Student类的成员函数的定义在类外,需要用类名约束机制,因此空(1)和
(2)需要补充函数的返回类型和类名。函数getCredit 和out 在接口定义时已经分别给出int 和void 类型,所以空(1)处即为int Student,空(2)处为void Student 。
SortStudent类中的成员函数sort 对Student 类的对象所构成的对象数组根据分数进行排序,而由于在Student 类中学号和分数为private 访问权限,不可从外部直接访问,所以需要通过getCredit 而得到。因此,空(3)和空(4)处均为getCredit 函数调用获得分数。
main函数中需要将学生信息读入,并根据学生信息创建对象并加入对象数组。空(5)处为创建对象数组。C++中对象数组的创建方式为采用new 关键字,而且从所在语句的赋值号左侧的Student*testStudent可知,要创建的对象为Student ,因此空(5)处为new Student。空(6)为单独语句,但是从其后续语句ss.sort 的函数调用可知,使用了SortStudent 的函数sort ,使用前需要创建SortStudent 类的对象,所以空(6)处为SortStudent ss。
试题六
1、this.sNO 2、this.Credit 3、getCredit() 4、getCredit() 5、new Student 6、SortStudent ss
7、static 或static final
本题考查Java 语言程序设计的能力,涉及类、对象、方法、访问控制、对象数组的定义和相关操作,以及对象数组的排序算法。要求考生根据给出的案例和执行过程说明,认真阅读理清程序思路,然后完成题目。
首先分析程序的整体结构。本题中定义了两个类:Student 和SortStudent ,分别用于定义学生类和进行排序。类Student 的定义中,属性sNO 和Credit 均定义为private 访问权限,要对其进行访问,需要通过具有相应访问权限的方法。方法getCredit 和toString 均为public 。Java 中的方法参数如果与类定义中的属性同名,则需通过this 关键字进行区分。类SortStudent 中定义了方法sort ,其功能是对参数为Student 对象数组根据分数进行排序。考察main 方法。理清程序整体过程:创建对象数组,读取学生文件,将学生的学号和成绩读入,创建Student 对象并加入对象数组,将对象数组排序,然后输出top30%的学生信息。
Student类的构造器方法的参数和类中属性同名,需要用this 标识符进行区分,因此空(1)和(2)需要用this 表明是当前Student 的属性。
SortStudent类中定义的方法sort 对Student 类的对象所构成的对象数组根据分数进行排序,而由于在Student 类中学号和分数为private 访问权限,不可从外部直接访问,所以需要通过getCredit 而得到。因此,空(3)和空(4)处均为getCredit 函数调用获得分数。
main函数中需要创建Student 类型的对象数组,将学生信息读入,并根据学生信息创建对象并加入对象数组。由于使用SortStudent 类中的属性size 作为数组大小的参数,因此其值不可变,即空(7)处为static 或者static final。空(5)处是创建对象数组中的Student 类型的对象元素,Java 中对象的创建方式为采用new 关键字,因此空(5)处为new Student。空(6)处根据其所在语句右侧new SortStudent以及其后续语句ss.sort 的方法调用,可知,需要声明SortStudent 类的对象引用ss ,所以空(6)处为SortStudent ss。
初级程序员2010下半年下午试题
试题一
阅读以下说明和流程图,回答问题1至问题4,将解答填入对应栏内。 [说明]
下面的流程图中有两个判断条件A >0和B >0。这些判断条件的各种组合情况如下表所示。表中Y 表示相应的条件成立,N 表示相应的条件不成立。每一 ]
1、当遇到哪几种条件组合时,流程图能执行“1→i”?(写出相应的序号即可)
2、当遇到哪几种条件组合时,流程图能执行“2→j”?(写出相应的序号即可)
3、当遇到哪几种条件组合时,流程图能执行“3→k”?(写出相应的序号即可)
4、该流程图共有多少条实际执行路径?
试题二
阅读以下说明和C 函数,将应填入 (n) 处的语句或语句成分写在对应栏内。 [说明1]
函数deldigit(char *s)的功能是将字符串s 中的数字字符去掉,使剩余字符按原次序构成一个新串,并保存在原串空间中。其思路是:先申请一个与s 等长的临时字符串空间并令t 指向它,将非数字字符按次序暂存入该空间,最后再复制给s 。 [C函数]
void deldigit(char *s) {
char *t=(char*)malloc( (1) ); /*申请串空间*/ int i, k=0;
if (!t) return;
for(i=0; i < strlen(s); i++)
if ( ! (*(s+i)>='0' && *(s+i)<='9') ) { t[k++]= (2) ; }
(3) ='\0'; /*设置串结束标志*/ Strcpy(s,t); free(t); [说明2]
函数reverse(char *s,int len)的功能是用递归方式逆置长度为len 的字符串s 。例如,若串s 的内容为“abcd”,则逆置后其内容变为“dcba”。 [C函数]
void reverse(char *s, int len) {
char ch;
if ( (4) ) ch=*s;
*s=*(s+len-1); *(s+len-1)=ch; reverse( (5) ); } }
1、
2、
3、
4、
5、
试题三
阅读以下说明和C 代码,回答问题1和问题2,将解答写在对应栏内。 1、[说明1]
下面代码的设计意图是:将保存在文本文件data.txt 中的一系列整数(不超过100个) 读取出来存入数组arr[],然后调用函数sort()对数组arr 的元素进行排序,最后在显示屏输出数组arr 的内容。
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
void sort(int a[], int n)
{/*对n 个元素的整型数组a 按递增方式排列*/ /*
此处代码省略 */ return; } int main() {
int i, num=0; int arr[100]; FILE fp;
fp=fopen("data.txt", "r"); if(!fp) return -1; while(!feof(fp)) {
fscanf(fp, "%d", arr[num++]); }
sort(arr[], num); for(i=0; i<num;)
fprintf(stdout, "%d", arr[i++]);
以上C 代码中有三处错误(省略部分的代码除外) ,请指出这些错误所在的代码行号,并在不增加和删除代码行的情况下进行修改,写出修改正确后的完整代码行。
[说明2]
调用方式1
int main( ) {
char* ptr=NULL; get_str(ptr); if (ptr)
printf("%s\n",ptr); else
调用方式2
int main( ) {
char* ptr=NULL; get_str(&ptr); if (ptr)
printf("%s\n", ptr); else
printf("%p\n", ptr); /*输出指针的
printf("%p\n", ptr);
值*/ return 0;
return 0;
}
}
[问题]
若分别采用函数定义方式1、2和调用方式1、2,请分析程序的运行情况,填充下面的空(1)~(3)。
若采用定义方式1和调用方式1,则输出为“00000000”。 若采用定义方式1和调用方式2,则 (1) 。 若采用定义方式2和调用方式1,则 (2) 。 若采用定义方式2和调用方式2,则 (3) 。
1、
2、
3、
试题四
阅读以下说明和C 函数,将应填入 (n) 处的语句或语句成分写在对应栏内。 [说明]
已知单链表L 含有头节点,且节点中的元素值以递增的方式排列。下面的函数DeleteList 在L 中查找所有值大于mink 且小于maxK 的元素,若找到,则逐个删除,同时释放被删节点的空间。若链表中不存在满足条件的元素,则返回-1,否则返回0。
例如,某单链表如下图(a)所示。若令minK 为20、maxK 为50,则删除后的(b)所示。
链表节点类型定义如下: typedef struct Node{ int data;
struct Node *next; }Node, *LinkList; [C函数]
int DeleteList (LinkList L, int minK, int maxK)
{ /*在含头节点的单链表L 中删除大于minK 且小于maxK 的元素*/ (1) *q=L, *p=L->next ; /*p指向第一个元素节点*/ int delTag=0; while (p)
if (P->data <= minK) {q=p; p= (2) ; } else
if (p->data < maxK) { /*找到删除满足条件的节点*/ q->next= (3) ; free(p); p= (4) ; delTag=1; }
else break;
if ( (5) ) return -1; return 0; }
1、
2、
4、
5、
试题五
阅读以下说明和C++代码,将应填入 (n) 处的语句或语句成分写在对应栏内。 [说明]
某数据文件students.txt 的内容为100名学生的学号和成绩,下面的程序将文件中的数据全部读入对象数组,按分数从高到低进行排序后选出排名前30%的学生。
[C++代码]
#include <iostream > #include <fstream > #include <string > using namespace std; class Student { private:
string sNO; //学号 int credit; //分数 public:
Student(string a,int b) { sNO=a; credit=b; } Student () {} int getCredit (); void out (); };
(1) ::getCredit () { return credit; }
(2) ::out () {
cout << "SNO: " << sNO << ", Credit=" << credit << end1; }
class SortStudent { public:
void sort(Student *s, int n); SortStudent () {} };
void SortStudent::sort(Student *s, int n) { for (int i=0; i<n-1; i++) { for (int j=i+1; J<n; j++) {
if(s[i]. (3) < s[j]. (4) ) {
Student temp=s[i]; s[i]=s[j]; s[j]=temp;
} } }
int main(int argc, char* argv[]) {
const int number=100; //学生总数 ifstream Students;
Students.open("students.txt"); if(!students.is_open()) { throw 0; }
Student *testStudent= (5) [number]; int k=0; string s;
while (getline(students,s,'\n')) { //每次读取一个学生的学号和成绩
Student student(s.substr(0,s.find(',')), atoi(s.substr(s.find (',')+1).c_str()));
testStudent[k++] = student; }
students.colse(); (6) ;
ss.sort(testStudent,k);
cout <<"top 30%: "<<end1; for(k=0; k<number * 0.3; k++) { testStudent[k].out(); }
delete []testStudent; return 0; }
1、
2、
3、
4、
5、
6、
阅读以下说明和Java 代码,将应填入 (n) 处的语句或语句成分写在对应栏内。 [说明]
某数据文件students.txt 的内容为100名学生的学号和成绩,下面的程序将文件中的数据全部读入对象数组,按分数从高到低进行排序后,选出排名前30%的学生。 [Java代码]
import Java.io.*; class Student {
private string sNO; //学号 private int credit; //分数 public int getCredit () { return Credit; }
public String toString () {
return"sNO="+this.sNO+", Credit="+this.Credit; }
Student(String sNO, int Credit) { (1) =sNO; (2) =Credit; } }
public class SortStudent {
void sort(Student[] s) { //Sort the array s[] in descending order of
Credit
for (int i=0; i < s.length-1; i++) { for (int j=i+1; j < s.length; j++) { if (s[i]. (3) < s[j]. (4) ) { Student tmp=s[i]; s[i]=s[j]; s[j]=tmp; } } } }
public static void main(String argv[]) { Student[] testStudent = new Student[size]; try {
BufferedReader in = new BufferedReader(new FileReader ("Students.txt")); boolean done = false; int i = 0;
while (!done) {
String s = in.readLine(); //每次读取一个学生的学号和成绩 if (s !=null) {
String tmp[] = s.split(",");
testStudent[i++] = (5) (tmp[0], Integer.parseInt (tmp[1])); } else
done = true; }
in.close();
(6) =new SortStudent(); ss.sort(testStudent);
System.out.println("top 30%:");
for (int j = 0; j < size * 0.3; j++) System.out.println(testStudent[j]); } catch (IOException e) { System.out.println("io error!"); }catch (NumberFormatException e) { System.out.println("not a number!"); } }
(7) int size = 100; //学生总数 }
1、
2、
3、
4、
5、
6、
7、
答案:
试题一
1、1,2 2、2,4 3、1,3,4
4、
本题考查程序模块处理流程设计的理解能力。
针对流程图中的多个判断条件及其组合,给出流程图的各种输入数据方案,检查流程图的执行情况,这种方法实际上就是单元测试常用的白盒方法。一组
输入数据方案就是一个测试案例。
对于本题的处理流程,三个判断条件中有两个是一样的,即只有两种判断条件。因此判断条件的组合共有4种。题中对这4种组合情况编制了序号。我们
4种条件组合分析其执行流程的情况,见下表:
因此,条件组合序号为1、2时,该流程将执行1→i;条件组合序号为2、4时,该流程将执行2→j;条件组合序号为1、3、4时,该流程将执行3→k。
由于这4种执行的情况不同,即执行路径不同,因此,该流程图共有4条不同的执行路径。
试题二
1、strlen(s)+1 2、*(s+i),或s[i],或其等价表示 3、*(t+k),或t[k],或其等价表示 4、len >1,或len >=1,或其等价表示
5、s+1,len-2
本题考查C 程序基本结构的理解和应用。
根据说明1,在函数deldigit(char *s)中需先申请一个与s 等长的临时字
符串空间并令t 指向它,因此空(1)处应填入“strlen(s)+1”,其中,加1的
原因是函数strlen 计算s 所指向字符串的长度时,没有包含串结束标志字符
“\0”。当然,申请比“strlen(s)+1”更大的存储区也可以,只是没有必要。 由于需要将非数字字符按原来的顺序存入t 所指向的存储区,所以空(2)处
填入“s[i]”,或其等价表示形式。
最后再设置t 所指向字符串的结束标志,即令t[k]='\0'。在这里,空(3)
处的t[k]写为t[k++]也可以,而写为t[k+1]或t[++k]则不符合整个代码的处
理逻辑。
函数reverse(char *s, int len)的功能是用递归方式逆置长度为len 的字符串s ,其中,以下代码实现了将s 所指字符与串中最后一个字符交换的处理: ch=*s;
*s=*(s+len-1);
*(s+len-1)=ch;
显然,当字符串的长度len 小于或等于1时,无须进行交换,因此空(4)处
应填入“len>1”,或者“len>=1”。若长度为1时也进行交换,逻辑上没有错,但是运算是冗余的。
试题三
本题考查C 语言指针的理解和应用。
在说明1之后的C 代码中有三处错误。
第1个错误的源头在第14行对变量fp 的定义上。FILE 是预定义的一个结
构体类型,在C 语言程序中,必须通过定义FILE 类型的指针变量和文件操作函数来访问外存文件。因此,第14行的代码应为“FILE *fp;”。
第2个错误位于第19行,函数fscanf 与scanf 函数的用法相同,以整型、浮点型和字符型格式控制方式读取文件中的数据时,需要在获取值的变量名前
加取地址运算符号“&”,arr[num++]等同于arr[num],num+=1,而数组元素arr[num]的作用等同于一个变量,因此,该行的正确代码为“fscanf(fp, "%d", &arr[num++]);”。
第3个错误位于第21行。根据函数sort 的定义可知,调用函数sort 时第
一个实参应该为数组名或对数组元素取地址。因此,该行的正确代码为
“sort(arr, num);”或者“sort(&arr[0], num);”。1、输出为“00000000”
2、运行异常,无输出(或含义相同的叙述)
3、输出为“testing”
本题考查C 语言指针的理解和应用。
关于函数get_str的两种定义方式,其区别在形式参数的类型不同,从而导致调用时对实参的要求不同。
对于定义方式1,其函数首部为:void get_str(char* p),参数p 是指针
参数,因此,调用该函数时的实参应为指针,可以是字符数组名、字符变量的
地址或指针变量。在调用方式1中,正是以指针变量ptr 为实参,此时,采用
的参数传递方式为传值,因此,回到调用函数后,ptr 的值并没有变(仍然为
NULL) ,因此,输出为“00000000”。而在调用方式2中,是以指针变量ptr 的地址为实参进行调用,开始执行函数get_str时,指针p 指向的目标为变量
ptr ,但是调用了malloc 函数后,重新为p 赋值了,即p 指向了其他存储区(串拷贝函数运行后,p 所指区域的内容为字符串“testing”),p 一开始指向的目标变量ptr 的内容没有变。由于是传值调用,所以回到main 函数后,ptr 变量的值并没有改变,因此,输出仍为“00000000”。
对于定义方式2,其函数首部为:void get_str(char** p),参数p 是指向指针的指针参数,要求调用该函数时的实参为指针的地址,因此,对于调用方
式1,以指针变量ptr 为实参,与形参的要求不匹配,会导致运行异常,不能
产生输出。而在调用方式2中,是以指针变量ptr 的地址为实参进行调用,符
合要求,因此在函数get_str中,*p即表示目标变量ptr ,通过malloc 申请到的存储区域首地址复制给*p,也就是令ptr 指向了申请到的存储区域起始位置,串拷贝函数运行后,将字符串“testing”放入该存储区,最后回到调用函数
main 后,ptr 指向的目标改变了,因此输出为“testing”。
试题四
1、Node 2、p->next 3、p->next 4、q->next
5、!delTag ,或delTag==0,或delTag!=1
本题目考查C 语言指针和动态链表的应用。
函数DeleteList(LinkList L, int minK, int maxK)的功能是在L 在含头节点的单链表L 中删除大于minK 且小于maxK 的元素,因此除了头指针L 以外,至少还需要两个临时指针,一个用于遍历链表中的元素,另外一个用于删除节点时重新链接节点,p 和q 就起这样的作用。
空(1)处用于定义指针变量p 和q ,由于p 和q 之前已经有“*”,因此,空
(1)处应填入“Node”,若填入“LinkList”,则p 和q 为指向指针变量的指针变量,此后对它们的使用方式就不正确了。
由于链表中的元素已经按照升序排列,所以在第一个大于minK 的元素之前都可以令指针一直沿着指针链后移,即“q=p; p=p->next”,直到p 指向第一个大于minK 的元素节点为止,在此过程中,q 始终指向p 所指节点的前驱。因此,空(2)处应填入“p->next”。
删除节点的处理由以下代码完成:
if (P->data < maxK) { /*找到删除满足条件的节点*/
q->next= (3) ; free(p); p= (4) ; delTag=1;
}
当p 指向需要被删除的节点时,q 正好指向其前驱节点,如下图(a)所示,因此,“q->next=p->next”就可以将p 所指节点从链表中删除,如下图(b) 函数调用“free(p)”将p 所指节点的空间释放(由系统回收) 。因此空(3)应填入“p->next”。此后,应再令p 指向下一个需要被删除的节点,即空(4)应填入“q->next”。delTag 的作用是判断链表中是否存在满足删除条件的节点,因此根据题目的描述,空(5)处应填入“!delTag”,当delTag 的值保持为0时,说明链表中不存在满足删除条件的节点。
试题五
1、int Student 2、void Student 3、getCredit() 4、getCredit() 5、new Student
6、SortStudent ss
本题考查C++语言程序设计的能力,涉及类、对象、函数、访问控制、对象数组的定义和相关操作,以及对象数组的排序算法。要求考生根据给出的案例和执行过程说明,认真阅读理清程序思路,然后完成题目。
首先分析程序的整体结构。本题中定义了两个类:student 和SortStudent ,分别用于定义学生和进行排序。类Student 的定义中,第一部分为private 访问权限的成员,要对其进行访问,需要通过具有相应访问权限的成员函数。在第二部分的接口定义为public 。C++用类名约束机制允许将成员函数定义在类接口定义之外。类SortStudent 中定义了成员函数sort ,其功能是对参数为
Student 对象数组根据分数进行排序。考查main 函数的代码,理清程序的行为:打开学生文件,创建对象数组,将学生的学号和成绩读入,创建Student 对象并加入对象数组,将对象数组排序,然后输出top30%的学生信息。
Student类的成员函数的定义在类外,需要用类名约束机制,因此空(1)和
(2)需要补充函数的返回类型和类名。函数getCredit 和out 在接口定义时已经分别给出int 和void 类型,所以空(1)处即为int Student,空(2)处为void Student 。
SortStudent类中的成员函数sort 对Student 类的对象所构成的对象数组根据分数进行排序,而由于在Student 类中学号和分数为private 访问权限,不可从外部直接访问,所以需要通过getCredit 而得到。因此,空(3)和空(4)处均为getCredit 函数调用获得分数。
main函数中需要将学生信息读入,并根据学生信息创建对象并加入对象数组。空(5)处为创建对象数组。C++中对象数组的创建方式为采用new 关键字,而且从所在语句的赋值号左侧的Student*testStudent可知,要创建的对象为Student ,因此空(5)处为new Student。空(6)为单独语句,但是从其后续语句ss.sort 的函数调用可知,使用了SortStudent 的函数sort ,使用前需要创建SortStudent 类的对象,所以空(6)处为SortStudent ss。
试题六
1、this.sNO 2、this.Credit 3、getCredit() 4、getCredit() 5、new Student 6、SortStudent ss
7、static 或static final
本题考查Java 语言程序设计的能力,涉及类、对象、方法、访问控制、对象数组的定义和相关操作,以及对象数组的排序算法。要求考生根据给出的案例和执行过程说明,认真阅读理清程序思路,然后完成题目。
首先分析程序的整体结构。本题中定义了两个类:Student 和SortStudent ,分别用于定义学生类和进行排序。类Student 的定义中,属性sNO 和Credit 均定义为private 访问权限,要对其进行访问,需要通过具有相应访问权限的方法。方法getCredit 和toString 均为public 。Java 中的方法参数如果与类定义中的属性同名,则需通过this 关键字进行区分。类SortStudent 中定义了方法sort ,其功能是对参数为Student 对象数组根据分数进行排序。考察main 方法。理清程序整体过程:创建对象数组,读取学生文件,将学生的学号和成绩读入,创建Student 对象并加入对象数组,将对象数组排序,然后输出top30%的学生信息。
Student类的构造器方法的参数和类中属性同名,需要用this 标识符进行区分,因此空(1)和(2)需要用this 表明是当前Student 的属性。
SortStudent类中定义的方法sort 对Student 类的对象所构成的对象数组根据分数进行排序,而由于在Student 类中学号和分数为private 访问权限,不可从外部直接访问,所以需要通过getCredit 而得到。因此,空(3)和空(4)处均为getCredit 函数调用获得分数。
main函数中需要创建Student 类型的对象数组,将学生信息读入,并根据学生信息创建对象并加入对象数组。由于使用SortStudent 类中的属性size 作为数组大小的参数,因此其值不可变,即空(7)处为static 或者static final。空(5)处是创建对象数组中的Student 类型的对象元素,Java 中对象的创建方式为采用new 关键字,因此空(5)处为new Student。空(6)处根据其所在语句右侧new SortStudent以及其后续语句ss.sort 的方法调用,可知,需要声明SortStudent 类的对象引用ss ,所以空(6)处为SortStudent ss。