初级程序员2010下半年下午试题

初级程序员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。


相关内容

  • 计算机技术与软件专业技术资格(水平)考试
  • 计算机技术与软件专业技术资格(水平)考试 计算机技术与软件专业技术资格(水平)考试(以下简 称计算机软件考试)是原中国计算机软件专业技术资格 和水平考试(简称软件考试)的完善与发展.这是由国 家人事部(已改为:人力资源和社会保障部)和信息产业 部(已改为:工业和信息化部)领导下的国家级考试, 其目的 ...

  • 2010初级经济法试题及答案
  • 2010年初级经济法试题 (客观题:单选24分.多选40分.判断10分.不定项选 择26分) 一.单选(24X1 24分)1.下列法的形式中,由全国人民代表大会及其常务委员会经一定立法程序制定颁布,调整国家.社会和公民生活中基本社会关系的是( ) A.宪法 B.法律 C.行政法规 D.行政规章 参考 ...

  • 计算机软件水平考试相关知识报告
  • 1.计算机技术与软件专业技术资格(水平)考试什么时候开始报名?报名时需要办理哪些手续? 报名时间一般为考前2-3个月左右(分别是2月下旬和8月下旬),上半年考试时间为5月底(第三个周六.周日),下半年考试时间为11月中旬(第二个周六.周日). 在当地考试机构指定的报名点,按当地标准交纳报名考试费,带 ...

  • 2010最新年软考各科目资料
  • 1. 软考各科目在线测试平台 2. 2010年上半年国家软考指定教材 3. 2010年各地软考报名安排 4. 软考各科目考试大纲 5. 2009下半年软考真题及答案讨论 6. 希赛教育2010年5月软考辅导 http://www.educity.cn/user/xch/from.asp?id=170 ...

  • 大学生考证汇总
  • 医学考试 临床执业医师 1月9.10日 资格 临床执业 3月下旬公布初试成绩.公 助理医师 口腔 布复试分线 执业医师 口腔 4月初调剂系统开通 执业助理医师 研究生考试 4月中.下旬 研究生调剂. 上一年10月 中西结合医师 考前名师辅导 复试 中西医结合执 5月中下旬省级招生主管部 业助理医师 ...

  • 2013年教师资格证报考条件
  • 2013年教师资格证报考条件 (一)思想品德条件 遵守宪法和法律,热爱教育事业,履行<教师法>规定的义务,遵守教师职业道德.并经申请人员单位或户籍所在地乡(镇)或街道办事处思想品德鉴定合格:应届毕业生,由所在学校进行思想品德鉴定. (二)学历条件 教师资格全国统一考试(幼儿园)报考条件: ...

  • 2016年计算机软件水平(软考)考试题答案
  • 2016年软考考试题答案抠 [3751,6206] bao.过 计算机软件水平考试(软考) 简介 计算机技术与软件专业技术资格(水平)考试(以下简称"软考")是原中国计算机软件专业技术资格和水平考试(简称"软件考试")的完善与发展.这是由国家人事和劳动保障部. ...

  • 2016上半年广西教师资格证考试面试公告
  • 2016上半年广西教师资格证考试面试公告 2016上半年广西教师资格证面试公告还未发布,2016上半年广西教师资格证面试时间尚未确定,考生可关注广西教师招聘考试网查看2015上半年广西教师资格证考试面试公告.面试时间安排.广西教师招聘面试课程.2015上半年广西教师资格考试安排:网上报名时间:1月2 ...

  • 系统分析师报考指南
  • 考试介绍 计算机技术与软件专业技术资格(水平)考试(以下简称计算机软件考试)是由国家人事部和信息产业部领导下的国家级考试. 根据人事部.信息产业部文件(国人部发[2003]39号),计算机与软件考试已纳入全国专业技术人员职业资格证书制度的统一规划.这种考试既是职业资格考试,又是职称资格考试.同时,这 ...