PTA第6-8次成绩系统分析
PTA第6~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方法的时候要传参。如果是必修且没输入考试方式,则默认传参为考试。当后面两项都赋值为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 }
踩坑心得:
- 首先是输入信息的处理,没用到正则表达式,导致有时候会有非零返回的情况,就是因为超出了预计情况,导致无法执行。
- 然后就是必修,选修,实验,考试和考察之间的匹配关系,当时的if嵌套改了好多次,容易有情况遗漏,后来用树状图的分类解决了。
- 考虑到题目的奇怪要求有时候不创建对象报错有时候创建对象报错,我统一按照只要合格就创建对象,然后不符合条件再输出,否则情况杂糅报错的if判断语句不知道先执行那个,所以就分开来考虑了。
- 学生对象删除后,对应的一些信息也要改变。删除意味着这一行的信息作废,所以创建对象的时候对课程,班级的执行都有影响。所以吧年级的执行放在最后,省去了多次修改
- 然后是传参问题。刚开始我是传参分的很细,最后导致出现传参传不进去或者传错或者和情况不对等等等。后来就创建了几个抽象类比如录入类,来传入一整个类当参数。
- 最后还有一些奇奇怪怪的测试点,导致这个点过了那个不能过。比如错在实验和选修上的信息。也是和同学讨论了一些自己整出来的非人类正规脑回路的测试点才测出来哪错了。
改进建议:
通过这最后三次的的大作业来看,我认为成绩分析系列题还是有难度的,这三次作业的话,每一次都特别的做的特别的时间之长,才勉强拿到分数
,差不多基本到了后面一道题基本要花一天甚至两天的时间才有可能写完,并且还可能得不到全部的分数,另外就是我觉得在一些算法之类的题,也有一些难度,这也可能是做题少的原因吧!然后就我个人代码改进建议的话,我觉得我的代码行数还是有一点多的,这其中可能就是有一些地方做的不太周到,还可以减少更多的if else嵌套句的循环之类的,另外一点就是要多多的写累,这样的话可以做到自己代码更加的可持续性和可维护性,希望在下次大作业的时候可能更好的提前着手思考写什么样的框架,因为框架就像是一座房子的基石,基石搭不好,再多的努力也是白费,所以一定要先想好具体的框架,这样可以使自己在之后的代码之路上走的更远更轻松。
总结:
从这两次的迭代作业来看,代码的可维护性还是很重要的。如果在基础构架的时候结构就不全面或者歪了,可能会导致在迭代的时候情况不全面甚至要重构代码结构。那个时候就会很麻烦。所以首先在设计的时候就不能急,要多思考。细分所有情况。然后是类的相关问题,比如类的关系是选择组合还是继承等等关系。类之间的联系也是非常重要,决定着代码的结构和效率。还有类的属性,不仅仅是数组、字符串、整形那么简单。现在我们要会运用比较器,哈希图和动态数组等等对象了。合理运用对象也方便我们对信息的储存和查找等操作。