201011程序员下午真题

第 1 题

阅读以下说明和流程图,回答问题1至问题4,将解答填入答题纸的对应栏内。
说明】
 下面的流程图中有两个判断条件A>0和B>0。这些判断条件的各种组合情况如下表所示。表中Y表示相应的条件成立,N表示相应的条件不成立。每一列表示一种条件组合,并在列首用相应的序号来表示。

【流程图】

问题1(4分)
当遇到哪几种条件组合时,流程图能执行“1→i”?(写出相应的序号即可)
问题2(4分)
当遇到哪几种条件组合时,流程图能执行“2→j”?(写出相应的序号即可)
问题3(6分)
当遇到哪几种条件组合时,流程图能执行“3→k”?(写出相应的序号即可)
问题4(1分)
该流程图共有多少条实际执行路径?
 

答案与解析

  • 试题难度:一般
  • 知识点:流程图>流程图
  • 试题答案:

    【问题1】1,2
    【问题2】2,4,
    【问题3】1,3,4
    【问题4】4
     

  • 试题解析:

    针对流程图中的多个判断条件及其组合,给出流程图的各种输入数据方案,检查流程图的执行情况,这种方法实际上就是单元测试常用的白盒方法。一组输入数据方案就是一个测试案例。对于本题的处理流程,三个判断条件中有两个是一个样的,即只有两种判断条件。因此判断条件的组合共有4中。题中对这4中组合情况编制了序号。
    由于这4种执行的情况不同,即执行路径不同,因此,该流程图共有4条不同的执行路径。

第 2 题

阅读以下说明和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)   );
  }
}

答案与解析

  • 试题难度:较难
  • 知识点:C程序设计>C程序设计
  • 试题答案:

    (1)strlen(s)+1
    (2)*(s+i),或s[i]或其等价表示
    (3)*(t+k)或t[k] 或其等价表示
    (4)len>1  或len>=1  或其等价表示
    (5)s+1  len-2

  • 试题解析:

    根据说明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;

第 3 题

阅读以下说明和C代码,回答问题1和问题2,将解答写在答题纸的对应栏内。
【说明1
下面代码的设计意图是:将保存在文本文件data.txt中的一系列整数(不超过100个)读取出来存入数组arr[],然后调用函数sort()对数组arr的元素进行排序,最后在显示屏输出数组arr的内容。
【C代码】


【问题1】(9分)
以上C代码中有三处错误(省略部分的代码除外),请指出这些错误所在的代码行号,并在不增加和删除代码行的情况下进行修改,写出修改正确后的完整代码行。
【说明2
下面是用C语言书写的函数get str的两种定义以及两种调用方式。

 

</div>

【问题2(6分)
若分别采用函数定义方式1、2和调用方式1、2,请分析程序的运行情况,填充下面的空(1)~(3)。
若采用定义方式1和调用方式1,则输出为“00000000”。
若采用定义方式1和调用方式2,则    (1)  
若采用定义方式2和调用方式1,则    (2)  
若采用定义方式2和调用方式2,则    (3)  

答案与解析

  • 试题难度:较难
  • 知识点:C程序设计>C程序设计
  • 试题答案:

    【问题1】


 

【问题2】
(1)输出为“00000000”
(2)运行异常,无输出(或含义形同的叙述)
(3)输出为“testing”

- 试题解析:

【问题1】
有三个错误,第1个错误的源头在第14行对变量fp的定义上。第二个错误位于第19行,第3个错误位于第21行。
【问题2】
关于函数get_str的两种定义方式,其区别在形式参数的类型不同,从而导致调用时对实参的要求不同。
定义方式1,函数首部为:void get_str(char*p),参数p是指针参数,因此调用该函数时的实参应为指针,可以使字符数组名,字符变量的地址或指针变量。在调用方式1中,证实以指针变量ptr为实参,此时,采用的参数传递方式为传值,因此,回到调用函数时ptr的地址为实参进行调用。
定义方式2,其函数首部为:void get_str(char**p),参数p是指向指针的指针参数,要求调用该函数时的实参为指针的地址,因此对于调用方式1,以指针变量ptr为实参,与实参的要求不匹配,会导致运行异常,不能产生输出。而在调用方式2中,是以指针变量ptr的地址为实参进行调用,符合要求。

第 4 题

阅读以下说明和C函数,将应填入n处的语句或语句成分写在答题纸的对应栏内。
【说明】
已知单链表L含有头结点,且结点中的元素值以递增的方式排列。下面的函数DeleteList在L中查找所有值大于minK且小于maxK的元素,若找到,则逐个删除,同时释放被删结点的空间。若链表中不存在满足条件的元素,则返回-1,否则返回0。
例如,某单链表如图4-1所示。若令minK为20、maxK为50,则删除后的链表如图4-2所示。

图4-1

图4-2
链表结点类型定义如下:
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;
}

答案与解析

  • 试题难度:较难
  • 知识点:C程序设计>C程序设计
  • 试题答案:

    (1)Node
    (2)p->next
    (3)p->next
    (4)q->next
    (5)!delTag,或delTag==0,或delTag!=1

  • 试题解析:

    函数DeleteList(LinkList L,int mink,int maxK)的功能是在L在含头结点的单链表L中删除大于minK且小于maxK的元素,因此除了头指针L意外,至少还需要两个临时指针,一个用于遍历链表中的元素,另外一个用于删除结点时重新链接结点,p和q就起这样的作用。
    空(1)处用于定义指针变量p和q,由于p和q之前已经有“*”,因此,应填入“Node”,若填入“LinkList”,则p和q为指向指针变量的指针变量,伺候对它们的使用方式就不正确了。
      由于链表中的元素已经按照顺序排列,所以在第一个大于minK的元素之前都可以令指针一直沿着指针链后移,即“q=p; p=p->next”,直到p指向第一个大于minK的元素结点为止,在此过程中,q始终指向p所指结点的前驱。因此,空(2)处应填入“p->next”.

第 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.close();
  
     (6)  ;
   ss.sort(testStudent,k);
   cout <<"top 30%: "<<end1;
   for(k = 0; k < number * 0.3; k++) {
    testStudent[k].out();
   }
   delete [ ]testStudent;
   return 0;
}

答案与解析

  • 试题难度:较难
  • 知识点:C++程序设计>C++程序设计
  • 试题答案:

    (1)int Stedent
    (2)void Student
    (3)getCredit()
    (4)getCredit()
    (5)new Student
    (6)SortStudent ss
     

  • 试题解析:

    首先分析程序的整体结构,本题中定义了两个类:Student和SortStudent,分别用于定义学生和进行排序。类Student的定义中,第一部分为private访问权限的成员,要对其进行访问,需要通过具有相应访问权限的成员函数。在第二部分的接口定义为public。
      Student类的成员函数的定义在类外,需要用类名约束机制,因此前面俩空需要补充函数的返回类型和类名。
      SortStudent类中的成员函数sort和Student类的对象所构成的对象数组根据分数进行排序,而由于在Strdent类中学号和分数为private访问权限,不可从外部直接访问,所以要通过getCredit而得到。
      Main函数中需要将学生信息读入,并根据学生信息创建对象并加入对象数组。空(5)为new Student。空(6)为单独语句,但是从其后续语句ss.sort的函数调用可知,使用了SortStudent的函数sort,使用前需要创建SortStudent类的对象。

第 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; //学生总数
}

答案与解析

  • 试题难度:较难
  • 知识点:Java程序设计>Java程序设计案例
  • 试题答案:

    (1)this.sNO
    (2)this.Credit
    (3)getCredit()
    (4)getCredit()
    (5)new Student
    (6)SortStudent ss
    (7)static 或static final

</p>

  • 试题解析:

    首先分析程序的整体结构,本题中定义了两个类:Student和SortStudent,分别用于定义学生和进行排序。类Student的定义中,第一部分为private访问权限的成员,要对其进行访问,需要通过具有相应访问权限的成员函数。
    Student类的构造器方法的参数和类中属性同名,需要用this标识符进行区分,因此前面俩空需要用this表明当前Student的属性。
      SortStudent类中的成员函数sort和Student类的对象所构成的对象数组根据分数进行排序,而由于在Strdent类中学号和分数为private访问权限,不可从外部直接访问,所以要通过getCredit而得到。
      Main函数中需要将学生信息读入,并根据学生信息创建对象并加入对象数组。空(5)为new Student。空(6)处根据其所在的语句右侧new SortStudent以及其后序语句ss.sort的方法调用,可知,需要声明SortStudent类的对象引用ss,所以空(6)处为SortStrdent ss。空(7)处是属性size的类型描述,size是作为作为数组大小的参数,其值不可变,因此是static 或者static final。

results matching ""

    No results matching ""