PTA第6-8次成绩系统分析

发布时间 2023-06-23 21:11:50作者: 勿允

PTA6~8次题目分析

前言:

6-8次的成绩系统和之前菜单系统的结构和逻辑都有很多相似的地方,包括信息第二部分的处理判断都需要建立在第一部分上,以及排序输出等。不过这次的排序输出有点新东西,要按中英文的首字母顺序排,我也是搜过之后才学会这点。这次成绩系统还存在不简单的错误提示,有点复杂的分情况和顺序先后处理是否报某个地方的错报什么类型的错,需要逻辑很清晰的处理。

这两次的作业的共同点还有就是同样需要在前一次的代码上迭代修改,就需要第一次的代码设计和结构都得过得去,才能保证后面几次作业的进度。

 

设计与分析:

Main函数的main方法属性:

课程录入 kl=new 课程录入();

信息录入 x=new 信息录入();

Scanner input = new Scanner(System.in);

课表 c=new 课表();

选课[] xuan=new 选课[15];int count=0;int count1=0;

ArrayList<学生> student=new ArrayList();

年级 nian=new 年级();

String l=input.nextLine();

 

输入的信息分为课程和成绩两类信息,结尾用end表示输入结束。因此在输入时要判断输入的是哪一类信息。这一点比较容易判断,课程信息的开头是英文或者中文字符,成绩信息的开头是学号,即数字。只要先用nextln()获取整行输入,然后用split分割成字符串数组,再比较第一个字符串是否为八位数字即可,比较如下:

 

比较
if(!a[0].matches("^\\d{8}$")&&a[0].length()<11)//不是数字,录入课程信息  a[0].matches("[\u4e00-\u9fa5]{1,10}")||a[0].matches("[A-Za-z]{1,10}")||(a[0].matches("[A-Za-z]{1}")
                 kl.luru(l,c);
else if(a[0].matches("^\\d{8}$"))//是数字,录入学生信息

 

然后根据不同分支执行不同代码,这里我构建了两个类:课程录入和成绩录入来分别实现。

课程录入

课程录入类的方法实现要用到课表类对象的add方法。我这有个课表类,其原理与菜单系列的菜谱类相似,存放已经录入的课程信息,便于后面学生选课时进行课程的对比。课程对象属性包括字符串型课程名、性质、考核方式和整数型平时期末总成绩这些成绩类,方法包括改课程的平均成绩计算方法:计算();课表类包含一个动态数组的课程类属性,以及一个add方法。

添加课程的时候要多次判断,首先判断动态数组里是否已经存在同名课程,如果存在则跳过。再判断课程的性质和考核方式是否匹配,如果是必修,则可能没输入考试方式,但是如果有输入则必须是考试。选修则两者都行且必须输入考试方式,这时就要判断split的分割字符串长度了。Add方法代码如下

void add(String name,String xingzhi,String kaohe)

{

if(search(name)==null)

{

if(kaohe!=null&&((xingzhi.equals("必修")||xingzhi.equals("选修")||xingzhi.equals("实验")))&&(kaohe.equals("考试")||kaohe.equals("考察")||kaohe.equals("实验")))

{

if(!(xingzhi.equals("必修")&&kaohe.equals("考试"))&&!(xingzhi.equals("实验")&&kaohe.equals("实验"))&&!xingzhi.equals("选修"))

{

System.out.println(name+" : course type & access mode mismatch");

if(kaohe.equals("实验"))

课.add(new 课程(name,null,kaohe));

else

课.add(new 课程(name,null,null));

}

else 课.add(new 课程(name,xingzhi,kaohe));

}

else if(xingzhi.equals("必修")&&kaohe==null)

课.add(new 课程(name,xingzhi,"考试"));

else 

{System.out.println("wrong format");课.add(new 课程(name,null,null));}

}

}
add

 

如代码所示在每条判断之后都要执行相应类型的报错或者方法。在执行add方法的时候要传参。如果是必修且没输入考试方式,则默认传参为考试。当后面两项都赋值为null的时候,是为了方便在后面判断课程是否有误。

成绩录入

课程信息的录入比较简单,但是学生的成绩信息录入就不可比较了。因为课程录入也就仅仅是录入一门课程的三种信息而已,而录入成绩信息的时候,要执行多部分内容:创建学生,选择课程,录入课程成绩。每一项都有复杂的判断以及错误提示,很容易跑岔或者考虑不周导致非零返回。

依旧是将字符串分开处理,在主函数里判断该行为录入成绩信息时,不像录入课程时一样简单直接调用方法。首先要判断这行内容的成绩是否为0~100范围,如果超范围则输出错误提示,并不执行该行信息录入的相关操作。然后,对学生类进行操作(学生类也作为主要类的一部分,学生的成绩信息要用于班级的成绩比较和单个学生成绩的总成绩排序输出,其属性包括姓名学号,课程数目,总成绩和平均成绩),首先在动态数组的学生类中查找是否已经存在该学号姓名相同的学生(可以存在同名或者同号的两个学生),如果没有则创建相应学生对象。然后才是调用信息录入类的luru方法,其返回值为选课类型,我将其存在选课类型的数组里,实际上可以不用多此一举。但是考虑到后面可能要遍历就存了。

最复杂的部分就是信息录入部分。这个类包括三种方法:

选课 luru(String l,课表 ke,ArrayList<学生> student)

学生 search(String numb,ArrayList<学生> s)

选课 searchx(String l)

两个search方法都是录入里的辅助方法。下面讲讲luru方法:

 首先将传参的字符串用split按空格分割,接着有几条if分支:

第一条,search来查找课程是否存在,若不存在则报错。

第二条,判断所选课程的考察方式所需要的成绩数量与输入的是否一样

第三条,执行是实验课的情况(该分支是第七次作业加入的)

第四条,执行是输入长度正确的情况

最后返回null(因为各个正确输入情况分支里有相应的返回,这里执行的是异常情况下的返回)

第四条的详细规则是:按字符串的长度执行,长度为4和长度为5在传参的唯一区别在于最后多出一个整形形参。为此在选课类的构造参数设置了两种传参方式传入不同数量的成绩。成功添加选课类对象后,再进行成绩计算部分的操作。包含学生的部分和课程的部分,操作同一为该选课对应的学生和课程对象的总成绩加以及课程数/学生数+1

 

 1 class 信息录入
 2  {
 3      
 4      ArrayList<选课> 选课= new ArrayList<选课>();
 5      int count=0;
 6      信息录入()
 7      {
 8          
 9      }
10      选课 luru(String l,课表 ke,ArrayList<学生> student)
11      {
12          String[] in=l.split(" ");
13          String hao=in[0];String name=in[1];String k=in[2];
14          if(ke.search(k)==null||ke.search(k).kaohe==null)//课程不存在
15              System.out.println(k+" does not exist");//hao+" "+name+" :"+
16          else if((ke.search(k).kaohe.equals("考试")&&in.length!=5)||(ke.search(k).kaohe.equals("考察")&&in.length!=4))//方式不匹配
17              System.out.println(hao+" "+name+" : access mode mismatch");
18          else if(ke.search(k).kaohe.equals("实验"))
19          {
20              int numb=Integer.valueOf(in[3]);
21              int[] socer=new int[9];
22              int sum=0;
23              if(numb<4||numb>9)
24                  {System.out.println("wrong format");return null;}
25              if(in.length!=(4+numb))
26              {
27                  System.out.println(hao+" "+name+" : access mode mismatch");return null;
28              }
29              else 
30                  for(int i=4;i<4+numb;i++)
31                 { socer[i-4]=Integer.valueOf(in[i]);
32                  if(socer[i-4]<0||socer[i-4]>100) 
33                      {System.out.println("wrong format");return null;}
34                  else sum+=socer[i-4];
35                 }
36              if(ke.search(k).xingzhi==null)
37              {
38                  System.out.println(k+" does not exist");return null;
39              }
40              sum=sum/numb;
41              选课.add(new 选课(new 学生(hao,name),ke.search(k),sum));count++;
42              ke.search(k).实验+=sum;ke.search(k).count++;
43              if(search(hao,student)!=null)
44              { search(hao,student).cj+=sum;search(hao,student).课程数++;}//选课.s.cj+=a;//选课.s.课程数++;
45              return 选课.get(count-1);
46          }
47          else if((in.length==4||in.length==5)&&searchx(l)==null)
48          {
49              if(Double.valueOf(in[3])>100||Double.valueOf(in[3])<0)
50                  {return null;}/////////
51              if(in.length==4)
52              {
53                  选课.add(new 选课(new 学生(hao,name),ke.search(k),0,Double.valueOf(in[3])));count++;
54                  ke.search(k).期末+=Double.valueOf(in[3]);
55              }
56              else if(in.length==5)
57              {
58                 if(Double.valueOf(in[4])<0||Double.valueOf(in[4])>100) 
59                 {return null;}
60                 else 
61                     //选课.c=new 成绩(Double.valueOf(in[4]),Double.valueOf(in[5]));
62                     {选课.add(new 选课(new 学生(hao,name),ke.search(k),Double.valueOf(in[3]),Double.valueOf(in[4])));count++;
63                     ke.search(k).期末+=Double.valueOf(in[4]);
64                     ke.search(k).平时+=Double.valueOf(in[3]);
65                     }
66              }
67             
68              double a=选课.get(count-1).c.计算成绩(ke.search(k));
69              ke.search(k).成绩+=a;ke.search(k).count++;
70              if(search(hao,student)!=null)
71              { search(hao,student).cj+=a;search(hao,student).课程数++;}//选课.s.cj+=a;//选课.s.课程数++;
72              return 选课.get(count-1);
73          }
74          return null;
75      }
76      学生 search(String numb,ArrayList<学生> s)
77      {for(学生 student:s)
78      {
79          if(student.学号.equals(numb))
80              return student;
81      }
82       return null;
83      }
84      选课 searchx(String l)
85      {
86          String[] a=l.split(" ");
87          for(选课 x:选课)
88      {
89          if(x.s.学号.equals(a[0])&&x.s.name.equals(a[1])&&x.k.name.equals(a[2]))
90              return x;
91      }
92       return null;
93      }
94  }
成绩录入类

 

 

 

后续处理

接下来就是即为繁琐的错误处理,根据不同的先后顺序输出错误提示。要判断本次选课信息的录入成绩是否为0~100,如果不是则要删除动态学生数组的这个学生信息,并报错。在第七次以后要更具实验课的情况再加一条,如果输入的成绩数量不在4-9之间也要删除这个学生对象。

在执行完对输入信息的判断之后,要进行剩余功能的实现了。创建年级对象来包含各个班级,然后用遍历的方式对学生数组的成绩计算和排序。然后课程的执行也一样,不同的是课程按首字母排而不是成绩,要用到collateral排序。

最后就是对班级的成绩排序以及所有信息的遍历输出了。

 完整代码如下

  1  import java.util.Scanner;
  2  import java.util.ArrayList;
  3  import java.util.Collections;
  4  import java.util.Comparator;
  5 import java.util.Locale;
  6 import java.text.Collator;
  7 
  8 
  9  public class Main
 10  {
 11      public static void main(String[] args)
 12      {
 13          课程录入 kl=new 课程录入();
 14          信息录入 x=new 信息录入();
 15          Scanner input = new Scanner(System.in);
 16          课表 c=new 课表();
 17          选课[] xuan=new 选课[15];int count=0;int count1=0;
 18          ArrayList<学生> student=new ArrayList();
 19          年级 nian=new 年级();
 20          String l=input.nextLine();
 21          while(!l.equals("end"))//输入
 22          { 
 23              boolean f=false;
 24              String[] a=l.split(" ");
 25              if(!a[0].matches("^\\d{8}$")&&a[0].length()<11)//不是数字,录入课程信息  a[0].matches("[\u4e00-\u9fa5]{1,10}")||a[0].matches("[A-Za-z]{1,10}")||(a[0].matches("[A-Za-z]{1}")
 26                  kl.luru(l,c);
 27              else if(a[0].matches("^\\d{8}$"))//是数字,录入学生信息
 28          {
 29              String hao1[]=l.split(" ");
 30              if(!(a[3].matches("^\\d{1,2}$")||((a[4]!=null&&a[4].matches("^\\d{1,2}$"))||a[4]==null)))
 31              {
 32                  System.out.println("wrong format");l=input.nextLine();continue;
 33              }
 34              for(学生 stud:student)
 35              {
 36                  if(stud.学号.equals(hao1[0])&&stud.name.equals(hao1[1]))
 37                      f=true;
 38              }
 39              if(!f) {
 40                  student.add(new 学生(hao1[0],hao1[1])) ;count1++;
 41              }
 42 
 43              xuan[count]=x.luru(l,  c,student);
 44              if(xuan[count]!=null)
 45              count++;
 46              if (((Double.valueOf(hao1[3]) >100||Double.valueOf(hao1[3])<0)||(hao1.length==5&&(Double.valueOf(hao1[4]) >100||Double.valueOf(hao1[4])<0))))
 47                  {boolean m=false;
 48                  if(x.选课.size()>1)
 49                  for(int t=0;t<student.size()-1;t++)
 50                  {学生 s=student.get(t);
 51                      if(s.name.equals(hao1[1])&&s.学号.equals(hao1[0]))
 52                         m=true;
 53                  }
 54                  else
 55                      m=true;
 56                  if(m)
 57                  student.remove(student.size()-1);//删除错误信息学生
 58                  if(c.search(hao1[2])!=null) 
 59                      System.out.println("wrong format");
 60                  }
 61              if(c.search(hao1[2]).kaohe.equals("实验")||c.search(hao1[2]).xingzhi==null)//课程错误,删除相应学生选课记录
 62              {
 63                  int num=Integer.valueOf(hao1[3]);
 64                  int[] socer=new int[9];
 65                  boolean y=false;
 66                  if(num<4||num>9)
 67                      y=true;
 68                  for(int i=4;i<4+num;i++)
 69                  { if(hao1[i]!=null)//////////////////////////////////////非零返回
 70                      socer[i-4]=Integer.valueOf(hao1[i]);
 71                  else y=true;
 72                   if(socer[i-4]<0||socer[i-4]>100) 
 73                       {y=true;}
 74                  }
 75                  boolean m=false;
 76                  if(x.选课.size()>1)
 77                  for(int t=0;t<student.size()-1;t++)
 78                  {学生 s=student.get(t);
 79                      if(s.name.equals(hao1[1])&&s.学号.equals(hao1[0]))
 80                         m=true;
 81                  }
 82                  else
 83                      m=true;
 84                  if(m&&y)
 85                  student.remove(student.size()-1);
 86              }
 87 
 88          } 
 89              else System.out.println("wrong format");
 90              l=input.nextLine();
 91          } 
 92         
 93          Comparator<学生> comp = new Comparator<学生>() {
 94              public int compare(学生 s1, 学生 s2) {
 95                  return  (int) (Double.valueOf(s1.学号)  -  Double.valueOf(s2.学号));
 96              }
 97          };
 98          for(int i=0;i<student.size();i++)//学生平均成绩计算
 99          {
100              student.get(i).p=student.get(i).计算();
101          }
102          
103          Collections.sort(student, comp);///学生排序
104          for (学生 s : student) 
105          {if(s.课程数!=0)
106              System.out.println(s.学号+" "+s.name+" "+s.p);
107          else System.out.println(s.学号+" "+s.name+" did not take any exams");
108          }
109 
110          
111          Collator collator = Collator.getInstance(Locale.CHINA);//课程排序
112          Collections.sort(c.课, (o1, o2) -> collator.compare(o1.name, o2.name));
113            for(int j=0;j<c.课.size();j++)//课程平均值计算
114          {
115              c.课.get(j).计算();//计算+输出课程
116          }
117            
118            for(int i=0;i<student.size();i++)//创建班级
119            { 
120                if(nian.search(student.get(i).学号)==null)
121                {
122                    nian.add(student.get(i).学号);
123                    nian.search(student.get(i).学号).成绩+=student.get(i).p;
124                    if(student.get(i).课程数!=0)
125                    nian.search(student.get(i).学号).人数++;
126                }
127                else if(nian.search(student.get(i).学号)!=null)
128                {
129                    nian.search(student.get(i).学号).成绩+=student.get(i).p;
130                   if(student.get(i).课程数!=0)
131                    nian.search(student.get(i).学号).人数++;
132                }
133            }
134            
135          for(int i=0;i<nian.ban.size();i++)
136          {
137              nian.ban.get(i).平均=nian.ban.get(i).成绩/nian.ban.get(i).人数;
138          }
139          Comparator<班级> comp1 = new Comparator<班级>() {
140              public int compare(班级 n1,班级 n2) {
141                  return  (int) (Double.valueOf(n1.班号)  -  Double.valueOf(n2.班号));
142              }
143          };
144          Collections.sort(nian.ban, comp1);
145          for (班级 b:nian.ban) 
146          {if(b.人数!=0)
147              System.out.println(b.班号+" "+(int)b.平均);
148          else System.out.println(b.班号+" has no grades yet");
149          }
150      }
151      
152  }
153  class 课程录入
154  {
155      课程录入()
156      {
157          
158      }
159      void luru(String l,课表 c)
160      {
161          String[] in=l.split(" ");
162          if(in.length==3)
163              c.add(in[0],in[1],in[2]);
164          else if(in.length==2)
165              c.add(in[0],in[1],null);
166          else System.out.println("wrong format");
167      }
168  }
169  class 信息录入
170  {
171      
172      ArrayList<选课> 选课= new ArrayList<选课>();
173      int count=0;
174      信息录入()
175      {
176          
177      }
178      选课 luru(String l,课表 ke,ArrayList<学生> student)
179      {
180          String[] in=l.split(" ");
181          String hao=in[0];String name=in[1];String k=in[2];
182          if(ke.search(k)==null||ke.search(k).kaohe==null)//课程不存在
183              System.out.println(k+" does not exist");//hao+" "+name+" :"+
184          else if((ke.search(k).kaohe.equals("考试")&&in.length!=5)||(ke.search(k).kaohe.equals("考察")&&in.length!=4))//方式不匹配
185              System.out.println(hao+" "+name+" : access mode mismatch");
186          else if(ke.search(k).kaohe.equals("实验"))
187          {
188              int numb=Integer.valueOf(in[3]);
189              int[] socer=new int[9];
190              int sum=0;
191              if(numb<4||numb>9)
192                  {System.out.println("wrong format");return null;}
193              if(in.length!=(4+numb))
194              {
195                  System.out.println(hao+" "+name+" : access mode mismatch");return null;
196              }
197              else 
198                  for(int i=4;i<4+numb;i++)
199                 { socer[i-4]=Integer.valueOf(in[i]);
200                  if(socer[i-4]<0||socer[i-4]>100) 
201                      {System.out.println("wrong format");return null;}
202                  else sum+=socer[i-4];
203                 }
204              if(ke.search(k).xingzhi==null)
205              {
206                  System.out.println(k+" does not exist");return null;
207              }
208              sum=sum/numb;
209              选课.add(new 选课(new 学生(hao,name),ke.search(k),sum));count++;
210              ke.search(k).实验+=sum;ke.search(k).count++;
211              if(search(hao,student)!=null)
212              { search(hao,student).cj+=sum;search(hao,student).课程数++;}//选课.s.cj+=a;//选课.s.课程数++;
213              return 选课.get(count-1);
214          }
215          else if((in.length==4||in.length==5)&&searchx(l)==null)
216          {
217              if(Double.valueOf(in[3])>100||Double.valueOf(in[3])<0)
218                  {return null;}/////////
219              if(in.length==4)
220              {
221                  选课.add(new 选课(new 学生(hao,name),ke.search(k),0,Double.valueOf(in[3])));count++;
222                  ke.search(k).期末+=Double.valueOf(in[3]);
223              }
224              else if(in.length==5)
225              {
226                 if(Double.valueOf(in[4])<0||Double.valueOf(in[4])>100) 
227                 {return null;}
228                 else 
229                     //选课.c=new 成绩(Double.valueOf(in[4]),Double.valueOf(in[5]));
230                     {选课.add(new 选课(new 学生(hao,name),ke.search(k),Double.valueOf(in[3]),Double.valueOf(in[4])));count++;
231                     ke.search(k).期末+=Double.valueOf(in[4]);
232                     ke.search(k).平时+=Double.valueOf(in[3]);
233                     }
234              }
235             
236              double a=选课.get(count-1).c.计算成绩(ke.search(k));
237              ke.search(k).成绩+=a;ke.search(k).count++;
238              if(search(hao,student)!=null)
239              { search(hao,student).cj+=a;search(hao,student).课程数++;}//选课.s.cj+=a;//选课.s.课程数++;
240              return 选课.get(count-1);
241          }
242          return null;
243      }
244      学生 search(String numb,ArrayList<学生> s)
245      {for(学生 student:s)
246      {
247          if(student.学号.equals(numb))
248              return student;
249      }
250       return null;
251      }
252      选课 searchx(String l)
253      {
254          String[] a=l.split(" ");
255          for(选课 x:选课)
256      {
257          if(x.s.学号.equals(a[0])&&x.s.name.equals(a[1])&&x.k.name.equals(a[2]))
258              return x;
259      }
260       return null;
261      }
262  }
263  class 课程
264  {
265      String name;
266      String kaohe;
267      String xingzhi;
268      double 成绩=0;
269      int 平均=0;
270      double 平时,期末;
271      int 平均1=0,平均2=0;
272      int 实验=0;
273      int count=0;
274      课程(String name,String xingzhi,String kaohe)
275      {
276          this.name=name;
277          this.kaohe=kaohe;
278          this.xingzhi=xingzhi;
279      }
280      void 计算()
281      {
282          if(count==0&&kaohe!=null&&!(xingzhi==null&&kaohe.equals("实验")))
283              System.out.println(name+" has no grades yet");
284          else if(count!=0) 
285          {
286          实验=(int)(实验/count);
287          平均=(int)(成绩/count);
288          平均1=(int)(平时/count);
289          平均2=(int)(期末/count);
290          if(kaohe.equals("考试"))
291          System.out.println(name+" "+平均1+" "+平均2+" "+平均);
292          else if(kaohe.equals("考察"))
293              System.out.println(name+" "+平均2+" "+平均);
294          else if(kaohe.equals("实验"))
295              System.out.println(name+" "+实验);
296          }
297      }
298  }
299  class 课表
300  {
301      ArrayList<课程> 课=new ArrayList<>();
302      boolean cz;
303      课程 search(String name)
304      {
305          for(课程 k:课)
306          {
307              if(k.name.equals(name))
308                  return k;
309          }
310           return null;
311      }
312      课表()
313      {
314      }
315      void add(String name,String xingzhi,String kaohe)
316      {
317          if(search(name)==null)
318          {
319              if(kaohe!=null&&((xingzhi.equals("必修")||xingzhi.equals("选修")||xingzhi.equals("实验")))&&(kaohe.equals("考试")||kaohe.equals("考察")||kaohe.equals("实验")))
320            {
321              if(!(xingzhi.equals("必修")&&kaohe.equals("考试"))&&!(xingzhi.equals("实验")&&kaohe.equals("实验"))&&!xingzhi.equals("选修"))
322                  {
323                  System.out.println(name+" : course type & access mode mismatch");
324                  if(kaohe.equals("实验"))
325                      课.add(new 课程(name,null,kaohe));
326                  else
327                      课.add(new 课程(name,null,null));
328                  }
329              else 课.add(new 课程(name,xingzhi,kaohe));
330            }
331             else if(xingzhi.equals("必修")&&kaohe==null)
332                  课.add(new 课程(name,xingzhi,"考试"));
333             else 
334              {System.out.println("wrong format");课.add(new 课程(name,null,null));}
335          }
336      }
337  }
338  class 学生
339  {
340      String name;
341      String 学号;
342      //ArrayList<选课> 选课;
343      double cj;
344      int 课程数=0;
345      int p=0;
346      学生(String a,String b)
347      {
348          name=b;
349          学号=a;
350      }
351      public int 计算()
352      {
353          double p1;
354          p1=cj/课程数;
355          return (int)p1;
356      }
357      public int compareScore(学生 other) {
358             if (this.p > other.p) {
359                 return -1;
360             } else if (this.p < other.p) {
361                 return 1;
362             } else {
363                 return 0;
364             }
365         }
366  }
367  class 班级
368  {
369      String 班号;
370      double 成绩=0;
371      double 平均;
372      int 人数;
373      班级(String numb)
374      {
375          班号=numb.substring(0, 6);
376      }
377  }
378  class 年级
379  {
380      ArrayList<班级> ban=new ArrayList<>();
381      年级()
382      {
383          
384      }
385      班级 search(String numb)
386      {
387          String hao=numb.substring(0, 6);
388          for(班级 b:ban)
389          {
390              if(b.班号.equals(hao))
391                  return b;
392          }
393           return null;
394      }
395      void add(String numb)
396      {
397              ban.add(new 班级(numb));
398      }
399  }
400  class 成绩
401  {
402      double 平时=0;
403      double 期末=0;
404      double 权重1=0.3,权重2=0.7;
405      int 总=0;
406      成绩(double a,double b)
407      {
408          平时=a;
409          期末=b;
410      }
411      成绩(int m)
412      {
413          总=m;
414      }
415      int 计算成绩(课程 ke)
416      {
417          if(ke.kaohe.equals("考察"))
418              总=(int)期末;
419          else if(ke.kaohe.equals("考试"))
420              {
421              总=(int)(平时*权重1+期末*权重2);
422              }
423          else if(ke.kaohe.equals("实验"))
424          {
425              return 总;
426          }         
427          return 总;
428      }
429  }
430  class 选课
431  {
432      学生 s;
433      课程 k;
434      成绩 c;//总成绩
435      int tm=0;
436      选课(学生 student,课程 k1,double a,double b)
437      {
438          s=student;
439          k=k1;
440          c=new 成绩(a,b);
441          //c.计算成绩(k);
442      }
443      选课(学生 student,课程 k1,int m)
444      {
445          s=student;
446          k=k1;
447          c=new 成绩(m);
448      }
449     public 选课() {
450         // TODO 自动生成的构造函数存根
451     }
452 
453  }
完整代码

踩坑心得:

  1. 首先是输入信息的处理,没用到正则表达式,导致有时候会有非零返回的情况,就是因为超出了预计情况,导致无法执行。
  2. 然后就是必修,选修,实验,考试和考察之间的匹配关系,当时的if嵌套改了好多次,容易有情况遗漏,后来用树状图的分类解决了。
  3. 考虑到题目的奇怪要求有时候不创建对象报错有时候创建对象报错,我统一按照只要合格就创建对象,然后不符合条件再输出,否则情况杂糅报错的if判断语句不知道先执行那个,所以就分开来考虑了。
  4. 学生对象删除后,对应的一些信息也要改变。删除意味着这一行的信息作废,所以创建对象的时候对课程,班级的执行都有影响。所以吧年级的执行放在最后,省去了多次修改
  5. 然后是传参问题。刚开始我是传参分的很细,最后导致出现传参传不进去或者传错或者和情况不对等等等。后来就创建了几个抽象类比如录入类,来传入一整个类当参数。
  6. 最后还有一些奇奇怪怪的测试点,导致这个点过了那个不能过。比如错在实验和选修上的信息。也是和同学讨论了一些自己整出来的非人类正规脑回路的测试点才测出来哪错了。

 

 

 

 

改进建议:

通过这最后三次的的大作业来看,我认为成绩分析系列题还是有难度的,这三次作业的话,每一次都特别的做的特别的时间之长,才勉强拿到分数
,差不多基本到了后面一道题基本要花一天甚至两天的时间才有可能写完,并且还可能得不到全部的分数,另外就是我觉得在一些算法之类的题,也有一些难度,这也可能是做题少的原因吧!然后就我个人代码改进建议的话,我觉得我的代码行数还是有一点多的,这其中可能就是有一些地方做的不太周到,还可以减少更多的if else嵌套句的循环之类的,另外一点就是要多多的写累,这样的话可以做到自己代码更加的可持续性和可维护性,希望在下次大作业的时候可能更好的提前着手思考写什么样的框架,因为框架就像是一座房子的基石,基石搭不好,再多的努力也是白费,所以一定要先想好具体的框架,这样可以使自己在之后的代码之路上走的更远更轻松。

 

总结:

从这两次的迭代作业来看,代码的可维护性还是很重要的。如果在基础构架的时候结构就不全面或者歪了,可能会导致在迭代的时候情况不全面甚至要重构代码结构。那个时候就会很麻烦。所以首先在设计的时候就不能急,要多思考。细分所有情况。然后是类的相关问题,比如类的关系是选择组合还是继承等等关系。类之间的联系也是非常重要,决定着代码的结构和效率。还有类的属性,不仅仅是数组、字符串、整形那么简单。现在我们要会运用比较器,哈希图和动态数组等等对象了。合理运用对象也方便我们对信息的储存和查找等操作。