201305程序员下午真题

第 1 题

阅读以下说明和流程图,填补流程图中的空缺(1)~ (5) ,将解答填入答题纸的对应栏内。
【说明】
平面上一个封闭区域内稳定的温度函数是一个调和函数。如果区域边界上各点的温度是己知的(非常数),那么就可以用数值方法近似地计算出区域内各点的温度。
假设封闭区域是矩形,可将整个矩形用许多横竖线切分成比较细小的网格,并以最简单的方式建立坐标系统,从而可以将问题描述为:己知调和函数u(i,j)在矩形 {0≤i≤m; 0≤j≤n}四边上的值,求函数u在矩形内部各个网格点{(i,j)|i=1,....m-1; j=1,.....,n-1}上的近似值。
根据调和函数的特点可以推导出近似算式:该矩形内任一网格点上的函数值等于其上下左右四个相邻网格点上函数值的算术平均值。这样,我们就可以用法代法来进行数值计算了。首先将该矩形内部所有网格点上的函数值设置为一个常数,例如 u(0,0); 然后通过该法代式计算矩形内各网格点上的新值。这样反复进行法代计算,若某次迭代后所 有的新值与原值之差别都小于预定的要求(如0.01),则结束求解过程。

【流程图】

答案与解析

  • 试题难度:较难
  • 知识点:流程图>流程图
  • 试题答案:(1) 0 或任意一个负数
    (2) (u(i,j+1)+u(i,j-1)+u(i-1,j)+u(i+1,j))/4 或等价表示
    (3) max
    (4) new 或 ((u(i,j+1)+u(i,j-1)+u(i-1,j)+u(i+1,j))/4 或等价表示
    (5) max
  • 试题解析:本题考查算法(数值计算)流程的描述。
    封闭区域内稳定(没有奇异点)的温度场、磁场等都是调和函数。已知边界上的值,就可以近似计算区域内各点的值。对于网格化后的矩形区域 {0≤i ≤m; 0≤j ≤n ,其边界点为 {(0,j)丨j=0,…,n}、{((i,0)丨i=0,…,m}、{(m,j)丨j=0,…,n}、{((i,n)丨i=0,..,m} ,其内点为{(i,j)丨i=1,… m-1 ;j=1 ,...,n-1} 。
    本题采用迭代法进行近似计算。初始时,设矩形每个内点处的u(i,j)均等于常数
    u(0,0) 。每次迭代需要再计算出所有内点处的 u(i,j)新值。为了检查迭代能否结束,需要,算出所有内点处函数 u 的新值与旧值之差的绝对值是否都小于 0.01 (或判断其最大值是否小于 0.01)。为此,每次算出的新值需要先暂存于一个临时变量 new 。它应是点(i,j)上下左右四个点处 u 值的算术平均值,因此 (2) 处应填(u(i,j+1)+u(i,j-1)+u(i-1,j)+u(i+1,j))/4。
    为了计算本次选代中新老值之差的绝对值 lu(i,j)-newl 的最大值max,需要先对 max赋一个不可能再低的值(由于绝对值总是非负,所以max常先存0)。因此(1)处可以填0(填任何一个负数也是可以的)。
    当某个内点处新老u值之差的绝对值超过max时,就需要将该值赋给max。因此, (3)处应填max。不管是否更新了max,此后新值就可以替代老值了。因此 (4) 处应填 new 。
    (5) 处应填本次迭代求出的最大值max ,以判断它是否小于0.01,是否达到了近似要求。如果已经达到误差要求,则计算结束,所有的u(i,j)就是计算结果。否则,还需要继续进行迭代。

第 2 题

阅读以下说明和C函数,填充函数中的空缺,将解答填入答题纸的对应栏内。
【说明】
函数GetDateld(DATE date)的功能是计算并返回指定合法日期date是其所在年份的第几天。例如,date表示2008年1月25日时,函数的返回值为25,date表示2008年3月3日时,函数返回值为63。
函数Kday_Date(int  theyear,int k)的功能是计算并返回指定合法年份theyear(theyear≥1900)的第k天(1≤k≤365)所对应的日期。例如,2008年的第60天是2008年2月29日,2009 年的第60天是2009年3月1日。
函数isLeapYear(int y)的功能是判断y代表的年份是否为闰年,是则返回1,否则返回0。

DATE 类型定义如下:
   typedef   struct  {
               int  year ,month ,day;
   }DATE;
 
【C函数1】
        int  GetDateld(  DATE  date  )
    {
        const   int  days _month[13]  =  {  0,31,28,31,30,31,30,31,31,30,
        31,30 ,31 );
            int i ,date_id = date.day;
            for (  i =  0;  i <      (1) ; i++ )
                    date_id  +=   days_month[i];
            if (   (2)  && isLeapYear(date.year)   )  date_id++;
            return date_id;
     }
【C函数2】
            (3)    Kday_Date(int   theyear ,int  k)
     {
     int i;
     DATE  date;
         int  days_month(13) = { 0,31,28,31,30,31,30,31,31,30,31,30,31}; 
         assert(k>=1  &&  k<=365  &&  theyear>=1900);    /不满足断言时程序终止/
         date .year =      (4)      ;
         if   (isLeapYear(date.year))     days_month[2]++;
         for (i=1;  ;  )    {
              k = k - days_month[i++];
              if  (k<=0) { date .day =  k +      (5)    ; date.month  = i-1;  break; }
         }
         return date;
      }

答案与解析

  • 试题难度:较难
  • 知识点:C程序设计>C程序设计
  • 试题答案:(1)date.month
    (2)date.month>2或其等价形式
    (3)DATE
    (4)theyear
    (5)days_month[i-1]或其等价形式
  • 试题解析:本题考查C程序的基本语法和运算逻辑。
    函数GetDateld(DATE date)的功能是计算并返回指定合法日期date是其所在年份的第几天。处理思路是:先将1月~date.month-1月的天数累加起来,然后加上date.month的天数date.day即可。若date.month>2,则需要考虑特殊情况2月份,在闰年为29天而不是28天。因此,空(1)处应填入date.month,空(2)处应填入date.month>2。
    函数 Kday_Date(int theyear,int k)的功能是计算井返回指定合法年份theyear (theyear≥1900)的第k天(1≤k≤365)所对应的日期。根据说明,显然空(3)应填入“DATE”。当 k<32时,计算出的日期一定在1月份;当k大于31而小于60(闰年时为61)时,计算出的日期一定在2月份;以此类推。函数中的处理思路是:先将k的值减去1月份的天数,若仍大于0,则继续减去2月份的天数,以此类推,直到k的值小于或等于0。此时将多减去的最后1个月的天数加上即可。因此,空(4)应填入“theyear“,空(5)应填入"day_smonth"。

第 3 题

阅读以下说明和C程序,填充程序中的空缺,将解答填入答题纸的对应栏内。
【说明】
埃拉托斯特尼筛法求不超过自然数N的所有素数的做法是:先把N个自然数按次序排列起来,1不是素数,也不是合数,要划去; 2是素数,取出2(输出),然后将2的倍数都划去:剩下的数中最小者为3,3 是素数,取出3(输出),再把3的倍数都划去;剩下的数中最小者为5,5是素数,再把5的倍数都划去。这样一直做下去,就会把不超过N的全部合数都筛掉,每次从序列中取出的最小数所构成的序列就是不超过N的全部质数。
下面的程序实现埃拉托斯特尼筛法求素数,其中,数组元素sievei的下标i对应自然数i,sieve[i]的值为1/0分别表示i在/不在序列中,也就是将i划去(去掉)时,就将sieve[i]设置为0。

【C 程序】
     include <stdio.h>
    
define N 10000
     int main ()
     {
         char sieve[N+1] = {0};
         int i =  0,k;
         /初始时2~N都放入sieve数组/
         for(i=2;         (1)      ; i++)
                sieve[i] = 1;
       
        for( k  =  2; ;){
             /找出剩下的数中最小者并用k表示/
             for( ; k<N+1&& sieve[k]==0;          (2)       );
             if (        (3)        )  break;
             printf("%d\t",k);       /输出素数/
             /从sieve中去掉k及其倍数/
             for( i=k; i<N+1;  i=       (4)    
                        (5)                   ;
         }/end of  for/
 
          return  0;
     }  /end  of  main/

答案与解析

  • 试题难度:较难
  • 知识点:C程序设计>C程序设计
  • 试题答案:(1)i<N+1或其等价形式
    (2)k++或++k或其等价形式
    (3)k>N或k==N+1或其等价形式
    (4)i+k或其等价形式
    (5)sieve[i]=0或其等价形式
  • 试题解析:本题考查 C 程序的运算逻辑,应用案例是埃拉托斯特尼筛法求素数。
    显然,空(1)所在的for语句用于设置 sieve()的初始值,根据题目描述,一开始1~N范围内的自然数 i 都在序列中,因此对应的数组元素 sieve[i]都要设置为 1。因此,空(1)处应填入 "i<N+1 "或其等价形式。
    根据注释,空 (2)  所在的for语句要找出剩下数中的最小者,也就是要找出sieve中第一个值不等于0 的数组元素sieve[K],顺序地考查sieve 的元素即可,因此空 (2)处应填入 "k++"。
    空(3)应填入"k>N" 或其等价形式,表示要找的最小素数已经大于 N,应结束处理。
    空 (4) 和 (5) 所在for 语句用于将刚找出的素数 k 及其倍数从序列中去掉,用 i 表示 k 的倍数(包括 k 自己)时,i 的取值为 k. 2k. 3k, ...,在 i 的初值已设置为k 的情况下,i 的迭代方式为 i=i+k,因此空 (4) 处应填入“i+k” ,空 (5) 处应填入" sieve[i]=0" 

第 4 题

阅读以下说明和C程序,填充函数中的空缺,将解答填入答题纸的对应栏内。
【说明】
N个游戏者围成一圈,从1~N顺序编号,游戏方式如下:从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,直到剩余一个游戏者为止,该游戏者即为获胜者。
下面的函数playing(LinkList head)模拟上述游戏过程并返回获胜者的编号。其中,N个人围成的圈用一个包含N个结点的单循环链表来表示,如图4-1所示,游戏者的编号放在结点的数据域中。

在函数中,以删除结点来模拟游戏者退出圈子的处理。整型变量c(初值为1)用于计数,指针变量p的初始值为head(如图4-1所示)。游戏时,从p所指向的结点开始计数,p沿链表中的指针方向遍历结点,c的值随p的移动相应地递增。当c计数到2时,就删除p所指结点的下一个结点(因下一个结点就表示报数到3的游戏者),如图4-2所示,然后将c设置为0后继续游戏过程。

结点类型定义如下:
typedef  struct node{
     int  code;       /游戏者的编号/
     struct  node  next;
}NODE,
LinkList;
【C 函数】
     int  playing(LinkList  head ,int  n)
     {    / head 指向含有n个结点的循环单链表的第一个结点(即编号为1的游戏者) /
     LinkList  p = head ,q;
     int theWinner ,c = 1;
             
 while   (  n  >     (1)  ){
          if (c == 2) { /当c等于2时,p所指向结点的后继即为将被删除的结点/
              q  =  p->next;
              p->next  =      (2)     ;
              printf("%d\t" ,q->code);     /输出退出圈子的游戏者编号时/
              free (q) ;
              c =       (3)     
               n--;
           } /if/
           p =    (4)        ;
           c++;
      }/while/
      theWinner=   5   ;
free(p);
     return   theWinner;  /返回最后一个游戏者(即获胜者)的编号/
}

答案与解析

  • 试题难度:较难
  • 知识点:C程序设计>C程序设计
  • 试题答案:(1) 1
    (2) q->next 或 p->next->next
    (3) 0
    (4) p->next
    (5) p->code
  • 试题解析:本题考查数据结构的应用和C程序的运算逻辑,主要涉及指针和链表。 由于游戏最后剩一人时结束,因此空(1)处应填入"1",表示N>1时游戏过程要继续。
    当c等于2时,p所指结点的后继表示为q(q = p->next),q所指结点即为要删除的结点,即如下图所示。

    此时,需要修改p所指结点的指针域,令其指向q所指结点的后继结点,对应的操作为p->next=q->next(等同于p->next = p->next->next) ,因此空(2)处应填入"q->next" 或 "p->next->next"。将q所示结点删除后的相关指针如下图所示。

    题目中已经说明,完成结点的删除后将c的值置为0,因此空(3)处应填入"0",为开始下次报数做好准备。由于下次应从上图中的x+2所在结点从1开始报数,因此空(4)处应填入"p->next",以令p指向上图中的x+2所在结点。空(5)处应填入"p->code"。

第 5 题

阅读以下说明和C++代码,填充代码中的空缺,将解答填入答题纸的对应栏内。
【说明】
某学校在学生毕业时要对其成绩进行综合评定,学生的综合成绩(GPA)由其课程加权平均成绩(Wg)与附加分(Ag)构成,即GPA= Wg +Ag
设一个学生共修了n门课程,则其加权平均成绩 (Wg) 定义如下:

其中 ,gradei C分别表示该学生第 i 门课程的百分制成绩及学分。
学生可以通过参加社会活动或学科竞赛获得附加分(Ag)。学生参加社会活动所得的活动分(Apoints)是直接给出的,而竞赛分(Awards)则由下式计算(一个学生最多可参加m项学科竞赛):

其中 ,l S分别表示学生所参加学科竞赛的级别和成绩。
对于社会活动和学科竞赛都不参加的学生,其附加分按活动分为0计算。
下面的程序实现计算学生综合成绩的功能,每个学生的基本信息由抽象类Student描述,包括学号(stuNo)、姓名(name) 、课程成绩学分(grades)  和综合成绩 (GPA)等,参加社会活动的学生由类ActStudent描述,其活动分由Apoints表示,参加学科竞赛的学生由类CmpStudent描述,其各项竞赛的成绩信息由awards表示。

【 C++代码】
      #include  <string>
      #include  <iostream>
      using namespace std;
      const  int  N=5;       /课程数/
      const  int  M=2;       /竞赛项目数/
   
      class Student{
      protected:
           int   stuNo; string name;
      double GPA;            /综合成绩/
      int (grades) [2];     /各门课程成绩和学分/
      public:
           Student  (   const  int  stuNo ,const  string  &name ,int  grades[ ] [2]  ){
                this->stuNo   =  stuNo; grades;   this->name   =   name;   this->grades    =
                grades;
           }
      virtual  ~Student( ) { }
           int getStuNo( )    {/
实现略/  }
      string getName( )      {/
实现略/ }
             (1)    ;
           double  computeWg   ( ){
                 int  totalGrades  =   0 ,totalCredits  =   0;
                 for  (int  i =  0;  i <  N;  i++)  {
                       totalGrades += grades [i] [0]
grades [i] [1];   totalCredits +=
                       grades [i]  [1];
                 }
                 return  GPA  =(double)totalGrades   /  totalCredits;
            }
      };
      class ActStudent :  public  Student  {
      int  Apoints;
      public:
            ActStudent(const int stuNo ,const string &name ,int gs[ ] [2] ,int
            Apoints)
      :   (2)  {
               this->Apoints = Apoints ;
            }
            double  getGPA ( ) {  return GPA = (3)   ;}
      };
      class CmpStudent: public Student{
      private:
      int (awards) [2];
      public:
         CmpStudent   (const  int  stuNo ,const  string  &name ,int  gs[] [2] ,int
         awards [ ] [2])
         :  (4)    {this->awards   =   awards;}
         double  getGPA( )    {
                 int Awards  =  0;
                 for  (int  i =  0;  i <  M;   i++)   {
      Awards  +=  awards [i] [0]  
  awards [i] [1];
      }
                 return GPA  =    (5) ;
          }
      }
      int main ( )
      {   //以计算 3 个学生的综合成绩为例进行测试
      int g1[ ] [2]  =  { {80 ,3} ,{90 ,2} ,{95 ,3} ,{85 ,4} ,{86 ,3} } ,
             g2[ ][2]   =  { {60 ,3} ,{60 ,2} ,{60 ,3} ,{60,4} ,{65,3} } ,
                g3[ ] [2] = { {80,3} ,{90,2} ,(70 ,3} ,{65,4} ,{75,3} };  //课程成绩
           int  c3[ ] [2] = { {2 ,3} ,{3,3} };                                                     //竞赛成绩
           Student  students[3]   =   {
                new  ActStudent   (101,"John" ,g1,3) , //3 为活动分
                new  ActStudent   (102 ,"Zhang" ,g2 ,0),
                new  CmpStudent   (103 ,"Li" ,g3 ,c3) ,
           };
      //输出每个学生的综合成绩
           for(int  i=0;  i<3;  i++)
                     cout<<  (6)    <<endl;
           delete 
students;
           return 0;
}

答案与解析

  • 试题难度:较难
  • 知识点:C++程序设计>C++程序设计
  • 试题答案:(1) virtual double getGPA()=0
    (2) Student(stuNo,name,gs)
    (3) computeWg()+Apoints或Student::computeWg() +Apoints
    (4) Student(stuNo,name,gs)
    (5) computeWg() +Awards或Student::computeWg() +Awards
    (6) students[i]->getGPA()
  • 试题解析:本题考查C++语言程序设计的能力,涉及类、对象、函数的定义和相关操作。要求考生根据给出的案例和执行过程说明,认真阅读理清程序思路,然后完成题目。
    先考查题目说明。以学校计算综合成绩 (GPA)为背景。本题目中综合成绩除了考
    虑基础课程加权平均成绩(Wg)之外,还有附加分(Ag),程序的主要任务是计算加 权平均成绩和附加分,并根据情况选择社会活动或学科竞赛获得的不同附加分:活动分(Apoints)或竞赛分(Awards )。每种成绩计算方式如题中所述。
    根据说明,将学生设计为一种类型,设计为类Student,学号(stuNo)、姓名(name) 、课程成绩学分(grades)和综合成绩(GPA)分别作为其数据属性,构造函数中对stuNo 、name、grades进行初始化,用相应的get函数获取相关属性值。对于GPA的获取值的函数,因为不同附加分的计算方法不同,设计为纯虚函数,具体实现由子类完成。将计算加权平均成绩设计为double computeWg()。将有活动附加分的学生设计为ActStudent,有竞赛附加分的学生设计为CmpStudent ,都作为Student的子类。
    子类中,继承父类中访问属性为protected的属性,其构造函数进行初始化时,调用父类Student中的构造函数对学号、项目和学分成绩进行初始化,并对活动分或竞赛分进行初始化。
    ActStudent(const int stuNo,const string &name,int gs[][2],int Apoints)
    :Student(stuNo,name,gs)

    CmpStudent(onst int stuNo,const string &name,int gs[][2],int awards[][2])
    : Student(stuNo,name,gs)
    在子类中,实现了获取GPA的函数getGPA ,根据题目描述,GPA的计算方式为加权平均成绩(Wg)和附加分(Ag)之和,所以返回值就是:
    computeWg() +Apoins或computeWg()+Awards
    其中,computeWg()在父类Student中定义,子类直接可以作为自己的函数一样使用。
    主控逻辑代码在main 函数中实现。初始化学生的各科学分和成绩,用数组gi表示,学生的竞赛分用数组ci表示。用Student student定义学生数组,而每个具体的学生是ActStudent或CmpStudent类型的对象,这里会自动向上转型成为Student类型。用如for循环对每个学生的综合成绩进行输出,调用时会继续动态绑定每个数组元素的实际类型,并调用其getGPA函数,即:
    cout << students[i]->getGPA( )<< endl;
    使用完指针数组对象之后,需要用delete操作进行释放,即:delete
    students;。
    因此,空(1)需要指向定义纯虚函数getGPA() ,即为virtual double getGPA()=0; 空 (2)和空(4)需要调用父类的构造函数,即Student(stuNo ,name,gs); 空(3)处计算附加分为活动分的GPA,调用computeWg()计算加权平均分,再加上附加分Apoints,即空(3)为computeWg()+Apoints; 空(5)处计算附加分为竞赛分的GPA ,调用computeWg()计算加权平均分,再加上计算出来的总竞赛分Awards ,即空(5)为computeWg() +Awards;空(6)处为在循环中根据数组下标所表示的每个学生对象调用getGPA()输出每个学生的GPA ,即students[i]->getGPA( ) 。

第 6 题

阅读以下说明和Java程序,填充代码中的空缺,将解答填入答题纸的对应栏内。
【说明】
某学校在学生毕业时要对其成绩进行综合评定,学生的综合成绩(GPA)由其课程加权平均成绩(Wg)与附加分(Ag)构成,即GPA= Wg +Ag
设一个学生共修了n门课程,则其加权平均成绩 (Wg) 定义如下:

其中 ,gradei C分别表示该学生第 i 门课程的百分制成绩及学分。
学生可以通过参加社会活动或学科竞赛获得附加分(Ag)。学生参加社会活动所得的活动分(Apoints)是直接给出的,而竞赛分(Awards)则由下式计算(一个学生最多可参加m项学科竞赛):

其中 ,l S分别表示学生所参加学科竞赛的级别和成绩。
对于社会活动和学科竞赛都不参加的学生,其附加分按活动分为0计算。
下面的程序实现计算学生综合成绩的功能,每个学生的基本信息由抽象类Student描述,包括学号(stuNo)、姓名(name) 、课程成绩学分(grades)  和综合成绩 (GPA)等,参加社会活动的学生由类ActStudent描述,其活动分由Apoints表示,参加学科竞赛的学生由类CmpStudent描述,其各项竞赛的成绩信息由awards表示。

【Java 代码】
        abstract  class  Student  {
                protected  String  name;
                protected  int  stuNo;
                protected double GPA;                      /综合成绩/
                protected  int [ ] [ ]  grades;               /各门课程成绩和学分/
        //其他信息略
        public  Student ( int  stuNo ,String name ,int[ ] [ ]  grades)   {
                this. stuNo = stuNo; grades;      this.name  = name;         this.grades    =
                grades;
         }
                (1)       ;
        double computeWg( ){
                 int  totalGrades  =  0 ,totalCredits  =  0;
                 for  (int i = 0;  i < grades.length;  i++)  {
                        totalGrades += grades [i] [0] grades [i]  [1] ;
                        totalCredits += grades [i]  [1];
                 }
                 return   (double)totalGrades / totalCredits;
         }
}
 
        class ActStudent  extends Student  {
               private   int  Apoints;
               ActStudent  (int stuNo ,String name ,int[] [] grades ,int Apoints){
                                 (2)        ;
                      this. Apoints = Apoints;                  
                }
                public double getGPA( ) {
        return  GPA  =      (3)      ;
}
}
 
class CmpStudent  extends  Student  {
        private  int [ ] [ ]  Awards;
        CmpStudent   (int  stuNo ,String name ,int[ ] [ ]  grades ,int[ ] [ ]  awards) {
                    (4)   ;
             this.Awards  = awards;
         }
         public double  getGPA() {
              int  totalAwards  =  0;
              for  (int  i =  0;  i < awards.length;  i++)  {
totalAwards  += awards[i]  [0] 
awards[i] [1];
}
              return  GPA =     (5)      ;
         }
}
        public  class  GPASystem   (   //以计算 3 个学生的综合成绩为倒进行测试
        public static void main(String[]  args)  {
                int  [ ] [ ] g1=  { {80,3} ,{90,2} ,{95,3} ,{85,4} ,(86 ,3}) ,
g2  =  { {60,3} ,{60,2} ,{60,3} ,{60,4} ,(65 ,3}) ,
        g3 =  { {80,3} ,{90,2} ,{70,3} ,{65,4} ,(75 ,3});  //课程成绩
                int  [ ][ ]  e1 =  ((2 ,3) ,{1,2} } ,e2  =  { {1,3} };  //竞赛成绩
                   Student  students[ ]  =  {
new ActStudent  (101,"John" ,gl ,3), / /3 为活动分
                          new  ActStudent   (102 ,"Zhang" ,g2 ,0)   ,
                          new   CmpStudent     (103,"Li",g3,e2)};
                }
         //输出每个学生的综合成绩
                  for  (int  i = 0;  i < students .length;  i++)  (
                         System.out,println(     (6)       );
                  }
}

答案与解析

  • 试题难度:较难
  • 知识点:Java程序设计>Java程序设计案例
  • 试题答案:(1)abstract double getGPA( )
    (2)super(stuNo,name,grades)
    (3)computeWg( ) + Apoints 或 super.computeWg( ) + Apoints
    (4)super(stuNo,name,grades)
    (5) computeWg( ) + totalAwards或 super.computeWg( ) + totalAwards
    (6) students[i].getGPA( )
  • 试题解析:本题考查 Java 语言程序设计的能力,涉及类、对象、方法的定义和相关操作。要求考生根据给出的案例和执行过程说明,认真阅读理清程序思路,然后完成题目。
    先考查题目说明。以学校计算综合成绩(GPA)为背景。本题目中综合成绩除了考虑基础课程加权平均成绩( Wg)之外,还有附加分 (Ag),其主要任务是计算加权平均成绩和附加分,并根据情况选择社会活动或学科竞赛获得的不同附加分:活动分(Apoints)或竞赛分(Awards)。每种成绩计算方式如题中所述。
    根据说明,将学生设计为 一种类型,设计为类Student ,学号(stuNo) 、姓名(name) 、 课程成绩学分(grades)和综合成绩 (GPA)  分别作为其数据属性,构造方法中对 stuNo 、 name 、grades 进行初始化,用相应的get方法获取相关属性值。对于 GPA的获取值的方法,因为不同附加分的计算方法不同,设计为抽象方法,实现由 子类完成。因为类中包 含抽象方法,所以 Student 必须设计为抽象类。将计算加权平均成绩设计为方法 double computeWg() 。将有活动附加分的学生设计为ActStudent  ,有竞赛附加分的学生设计为 CmpStudent ,都作为Student 的子类。
    子类中,继承父类中访问属性为 protected  的属性,其构造方法进行初始化时,调用父类Student中的构造方法对学号、项目和学分成绩进行初始化,并对活动分或竞赛分进行初始化。 Java 中,调用父类的构造方法在构造方法体内的第一条语句,即:
    ActStudent  (int stuNo,String name,int[][] grades,intApoints){
    super(stuNo,name,grades)

    CmpStudent (int stuNo,String name,int[] [] grades,int[] []awards){
    superstuNo,name,grades)
    在子类中,实现了获取 GPA 的方法 getGPA ,根据题目描述,GPA 的计算方式为加权平均成绩 (Wg) 和附加分 (Ag) 之和,所以返回值就是:
    computeWg() + Apoints  或 computeWg() +totalAwards
    其中, computeWg()在父类Student中定义,子类直接可以作为自己的方法一样使用。 主控逻辑代码在 GPASystem 类中的 main 方法中实现。初始化学生的各科学分和成 绩,用数组 gi表示,学生的竞赛分用数组 ei 表示。用 Student students[]定义学生数组, 而每个具体的学生是 ActStudent  或 CmpStudent  类型的对象,这里会自动向上转型成为 Student  类型。用for循环对每个学生的综合成绩进行输出,调用时会动态绑定每个数组元素的实际类型,并调用其 getGPA()方法,即:
    System.out.println(students[i].   getGPA()。
    因此,空(1)需要指向定义抽象方法getGPA() ,即为abstract double getGPA();   空
    (2) 和空 (4) 需要调用父类的构造方法,即 super(stuNo,name,grades); 空(3)处计算附加分为活动分的 GPA ,调用computeWg()计算加权平均分,再加上附加分 Apoints ,即 空(3)为 computeWg() + Apoins: 空(5)处计算附加分为竞赛分的 GPA ,调用computeWg()计算加权平均分,再加上计算出来的总竞赛分 totalAwards ,即空(5) 为computeWg()+totalAwards;    空 (6)处为在循环中根据数组下标所表示的每个学生对象调用getGPA()输出每个学生的 GPA ,即students[i].getGPA() 。

results matching ""

    No results matching ""