OOP第三次作业总结(222019班22201321)
一、前言
这次作业总结主要是总结分析训练集07~12,总共六次训练集,题量在可接受范围内,难度较大的主要是训练集10~12,这三次编写的都是课程成绩统计程序。
这六次训练集涉及的关于面向对象(Java)知识点主要有:类设计、继承、多态、接口、集合框架以及List、Set、Map接口的使用。
我感觉此次的难度较上一次又上升了一个梯度,尤其是在写训练集10课程成绩统计程序时,真的很难去理清其中的需求顺序,其中的排除异常情况数量比较多,程序很复杂,我未能在规定时间内通过所有的测试点,后来去请教了一下已经满分的同学,找到我的代码的缺陷,重构了一遍代码,但此时训练集10已经关闭,我无法验证我是否能过通过所有测试点,但应该是没有问题的。在接下来的训练集11和训练集12中是对课程成绩统计程序的扩展,我是在训练集10重构的代码的基础上扩展的,幸好这个代码是没有什么大问题的,所以训练集11和训练集12写起来没有训练集10那么困难,但也是花了比较大的精力。
二、设计与分析
接下来我主要对训练集08、训练集09以及训练集10~12中的课程成绩统计程序的提交源码进行分析。
训练集08:
题目需求:
(1)实现功能
本程序仅用于为学生所玩的游戏提供正确答案的功能,即根据学生得到的卡片种类与数量,给出 排序前和排序后的卡片顺序,同时给出所有卡片的面积之和。
(2)输入输出规则
①输入规则
首先,在一行上输入一串数字(1~4,整数),其中,1 代表圆形卡片,2 代表矩形卡片,3 代表 三角形卡片,4 代表梯形卡片。各数字之间以一个或多个空格分隔,以“0”结束。例如: 1 3 4 2 1 3 4 2 1 3 0 然后根据第一行数字所代表的卡片图形类型,依次输入各图形的相关参数,例如:圆形卡片需要 输入圆的半径,矩形卡片需要输入矩形的宽和长,三角形卡片需要输入三角形的三条边长,梯形需要 输入梯形的上底、下底以及高。各数据之间用一个或多个空格分隔。
②输出规则
如果图形数量非法(小于 0)或图形属性值非法(数值小于 0 以及三角形三边不能组成三 角形),则输出“Wrong Format”。
如果输入合法,则正常输出,所有数值计算后均保留小数点后两位即可。
输出内容如下:
排序前的各图形类型及面积,格式为“图形名称 1:面积值 1 图形名称 2:面积值 2 …图形名称 n:面积值 n ”,注意,各图形输出之间用空格分开,且输出最后存在一个用于分隔的空格; 排序后的各图形类型及面积,格式同排序前的输出;
所有图形的面积总和,格式为“Sum of area:总面积值”。
以下是我的代码:
1 import java.util.ArrayList; 2 import java.util.Collections; 3 import java.util.List; 4 import java.util.Scanner; 5 public class Main { 6 public static Scanner input = new Scanner(System.in); 7 public static void main(String[] args) { 8 CardUtil util=new CardUtil(); 9 util.init(); 10 } 11 } 12 class CardUtil { 13 private ArrayList<Card> cardList=new ArrayList<>(); 14 15 public CardUtil() { 16 cardList = new ArrayList<>(); 17 } 18 CardUtil(ArrayList<Card> cardList){ 19 this.cardList=cardList; 20 } 21 22 public void init() { 23 Scanner input = Main.input; 24 ArrayList<Integer> list = new ArrayList<Integer>(); 25 int count = input.nextInt(); 26 while(count != 0){ 27 if(count < 0 || count > 4){ 28 System.out.println("Wrong Format"); 29 return; 30 } 31 list.add(count); 32 count = input.nextInt(); 33 } 34 for(int i=0;i<list.size();i++){ 35 switch (list.get(i)) { 36 case 1: { 37 double radius = input.nextDouble(); 38 if (radius < 0) { 39 System.out.println("Wrong Format"); 40 return; 41 } 42 cardList.add(new Circle(radius)); 43 break; 44 } 45 case 2: { 46 double width = input.nextDouble(); 47 double length = input.nextDouble(); 48 if (width < 0 || length < 0) { 49 System.out.println("Wrong Format"); 50 return; 51 } 52 cardList.add(new Rectangle(width, length)); 53 break; 54 } 55 case 3: { 56 double side1 = input.nextDouble(); 57 double side2 = input.nextDouble(); 58 double side3 = input.nextDouble(); 59 if (side1 < 0 || side2 < 0 || side3 < 0 || side1 + side2 <= side3 || side1 + side3 <= side2 || side2 + side3 <= side1) { 60 System.out.println("Wrong Format"); 61 return; 62 } 63 cardList.add(new Triangle(side1,side2,side3)); 64 break; 65 } 66 case 4: { 67 double top = input.nextDouble(); 68 double bottom = input.nextDouble(); 69 double height = input.nextDouble(); 70 if (top < 0 || bottom < 0 || height < 0) { 71 System.out.println("Wrong Format"); 72 return; 73 } 74 cardList.add(new Trapezoid(top, bottom, height)); 75 break; 76 } 77 default: { 78 return; 79 } 80 } 81 } 82 show(); 83 input.close(); 84 } 85 86 public double getSumArea() { 87 double sum = 0; 88 for (Card shape : cardList) { 89 sum += shape.getArea(); 90 } 91 return sum; 92 } 93 94 public void show(){ 95 System.out.println("The original list:"); 96 ArrayList<Card> cards=new ArrayList<>(); 97 for(int i=0;i<cardList.size();i++){ 98 cardList.get(i).show(); 99 } 100 Collections.sort(cardList); 101 for(int i=0;i<cardList.size();i++){ 102 cards.add(cardList.get(cardList.size()-i-1)); 103 } 104 System.out.println("\nThe sorted list:"); 105 for(int i=0;i<cards.size();i++){ 106 cards.get(i).show(); 107 } 108 System.out.println("\nSum of area:"+String.format("%.2f",this.getSumArea())); 109 } 110 } 111 abstract class Card implements Comparable<Card>{ 112 113 public abstract double getArea(); 114 public abstract void show(); 115 116 @Override 117 public int compareTo(Card shape) { 118 double diff = this.getArea() - shape.getArea(); 119 if (diff > 0) { 120 return 1; 121 } else if (diff < 0) { 122 return -1; 123 } else { 124 return 0; 125 } 126 }// 实现 Comparable 接口的 CompareTo() 方法,根据卡片面积大小进行比较 127 128 } 129 class Circle extends Card{ 130 private double radius; 131 Circle(){} 132 Circle(double radius){ 133 this.radius=radius; 134 } 135 @Override 136 public double getArea(){ 137 return Math.PI*this.radius*this.radius; 138 } 139 @Override 140 public void show(){ 141 System.out.print("Circle:"+String.format("%.2f", getArea())+" "); 142 } 143 144 public double getRadius() { 145 return radius; 146 } 147 148 public void setRadius(double radius) { 149 this.radius = radius; 150 } 151 } 152 class Rectangle extends Card{ 153 private double width; 154 private double length; 155 Rectangle(){} 156 Rectangle(double width,double length){ 157 this.length=length; 158 this.width=width; 159 } 160 @Override 161 public double getArea(){ 162 return this.length*this.width; 163 } 164 @Override 165 public void show(){ 166 System.out.print("Rectangle:"+String.format("%.2f", getArea())+" "); 167 } 168 169 public double getLength() { 170 return length; 171 } 172 173 public void setLength(double length) { 174 this.length = length; 175 } 176 177 public double getWidth() { 178 return width; 179 } 180 181 public void setWidth(double width) { 182 this.width = width; 183 } 184 } 185 class Trapezoid extends Card { 186 private double top; 187 private double bottom; 188 private double height; 189 Trapezoid(){} 190 Trapezoid(double top,double bottom,double height){ 191 this.bottom=bottom; 192 this.top=top; 193 this.height=height; 194 } 195 @Override 196 public double getArea(){ 197 return (this.bottom+this.top)*this.height/2; 198 } 199 @Override 200 public void show(){ 201 System.out.print("Trapezoid:"+String.format("%.2f", getArea())+" "); 202 } 203 204 public double getTop() { 205 return top; 206 } 207 208 public void setTop(double top) { 209 this.top = top; 210 } 211 212 public double getBottom() { 213 return bottom; 214 } 215 216 public void setBottom(double bottom) { 217 this.bottom = bottom; 218 } 219 220 public double getHeight() { 221 return height; 222 } 223 224 public void setHeight(double height) { 225 this.height = height; 226 } 227 } 228 class Triangle extends Card{ 229 private double side1; 230 private double side2; 231 private double side3; 232 Triangle(){} 233 Triangle(double side1,double side2,double side3){ 234 this.side1=side1; 235 this.side2=side2; 236 this.side3=side3; 237 } 238 @Override 239 public double getArea(){ 240 double p=(this.side1+this.side2+this.side3)/2; 241 return Math.sqrt(p * (p - this.side1) * (p - this.side2) * (p - this.side3)); 242 } 243 @Override 244 public void show(){ 245 System.out.print("Triangle:"+String.format("%.2f", getArea())+" "); 246 } 247 248 public double getSide1() { 249 return side1; 250 } 251 252 public void setSide1(double side1) { 253 this.side1 = side1; 254 } 255 256 public double getSide2() { 257 return side2; 258 } 259 260 public void setSide2(double side2) { 261 this.side2 = side2; 262 } 263 264 public double getSide3() { 265 return side3; 266 } 267 268 public void setSide3(double side3) { 269 this.side3 = side3; 270 } 271 }
以下是我的设计类图:

首先,我定义了一个CardUtil类,用于处理卡片的操作。该类包含一个cardList成员变量,用于存储卡片对象。
在CardUtil类的构造函数中,我初始化了cardList对象。
init()方法用于初始化卡片列表。在该方法中,通过输入获取用户输入的卡片信息,并根据输入的类型创建相应的卡片对象,然后将其添加到cardList中。
show()方法用于展示卡片列表。在该方法中,首先在控制台打印原始的卡片列表,然后对其进行排序,将排序后的列表存储在一个新的ArrayList对象中,并打印排序后的列表。最后,计算卡片列表中所有卡片的面积之和,并打印该值。
Card类是一个抽象类,定义了getArea()和show()两个抽象方法。这两个方法将在具体的卡片类中被实现。
Circle、Rectangle、Trapezoid和Triangle类分别是Card类的子类,它们实现了Card类中定义的抽象方法。这些具体的卡片类分别代表圆形、矩形、梯形和三角形。
Comparable接口的compareTo()方法被Card类实现,用于比较两个卡片的面积大小。通过实现该方法,可以在排序卡片列表时使用Collections.sort()方法进行排序。
最后在Main类中,创建了CardUtil对象util,并调用util的init()方法来开始处理卡片操作。
训练集09:
题目需求:
编写程序统计一个输入的Java源码中关键字(区分大小写)出现的次数。说明如下:
- Java中共有53个关键字(自行百度)
- 从键盘输入一段源码,统计这段源码中出现的关键字的数量
- 注释中出现的关键字不用统计
- 字符串中出现的关键字不用统计
- 统计出的关键字及数量按照关键字升序进行排序输出
- 未输入源码则认为输入非法
以下是我的代码:
1 import java.util.*; 2 3 public class Main { 4 public static void main(String[] args) { 5 Scanner in = new Scanner(System.in); 6 StringBuilder code = new StringBuilder(); 7 String line; 8 while (!(line = in.nextLine()).equals("exit")) { 9 line=line.replaceAll("=","a"); 10 code.append(line).append("\n"); 11 } 12 if(code.length()==0){ 13 System.out.println("Wrong Format"); 14 return; 15 } 16 String[] keywords = {"abstract", "assert", "boolean", 17 "break", "byte", "case", "catch", "char", "class", "const", 18 "continue", "default", "do", "double", "else", "enum", 19 "extends", "for", "final", "finally", "float", "goto", 20 "if", "implements", "import", "instanceof", "int", 21 "interface", "long", "native", "new", "package", "private", 22 "protected", "public", "return", "short", "static", 23 "strictfp", "super", "switch", "synchronized", "this", 24 "throw", "throws", "transient", "try", "void", "volatile", 25 "while", "true", "false", "null"}; 26 27 Map<String, Integer> keywordCount = new TreeMap<>();//TreeMap内部自动排序 28 boolean inString = false;//字符串内 29 boolean inSingleLineComment = false;//行注释内 30 boolean inMultiLineComment = false;//块注释内 31 32 for (int i = 0; i < code.length(); i++) { 33 char c = code.charAt(i); 34 if (inSingleLineComment) { 35 if (c == '\n') { 36 inSingleLineComment = false; 37 } 38 } else if (inMultiLineComment) { 39 if (c == '*' && i < code.length() - 1 && code.charAt(i + 1) == '/') { 40 inMultiLineComment = false; 41 i++; 42 } 43 } else if (inString) { 44 if (c == '"') { 45 inString = false; 46 } 47 } 48 else { 49 if (c == '"') { 50 inString = true; 51 } else if (c == '/' && i < code.length() - 1) { 52 char next = code.charAt(i + 1); 53 if (next == '/') { 54 inSingleLineComment = true; 55 i++; 56 } else if (next == '*') { 57 inMultiLineComment = true; 58 i++; 59 } 60 } else if (Character.isJavaIdentifierStart(c)) {//检测i字节上的位置是否为关键词的第一个 61 StringBuilder builder = new StringBuilder(); 62 builder.append(c); 63 int j = i + 1; 64 while (j < code.length() && Character.isJavaIdentifierPart(code.charAt(j))) {//检测j字节上的位置是否为关键词的后几位 65 builder.append(code.charAt(j)); 66 j++; 67 } 68 String word = builder.toString(); 69 70 71 if (Arrays.asList(keywords).contains(word)) { 72 keywordCount.put(word, keywordCount.getOrDefault(word, 0) + 1); 73 } 74 i = j - 1; 75 } 76 } 77 } 78 if (keywordCount.isEmpty()) { 79 System.out.println(); 80 } else { 81 Set<Map.Entry<String, Integer>> sets=keywordCount.entrySet();//遍历 82 for (Map.Entry<String, Integer> entry : sets) { 83 System.out.println(entry.getValue() + "\t" + entry.getKey()); 84 } 85 } 86 } 87 }
使用StringBuilder对象code来存储用户输入的代码。通过使用循环和in.nextLine()方法读取每一行代码,并将其追加到code中。在添加代码行之前,将所有的"="替换为字母"a",以避免干扰关键词统计的过程。如果code的长度为0,说明用户没有输入任何代码,直接打印错误信息"Wrong Format"并返回。
创建一个TreeMap对象keywordCount,用于统计关键词的出现次数。因为TreeMap会自动按照关键词的字母顺序进行排序。
接着,使用一个for循环遍历code中的每一个字符。我们根据不同的情况处理字符:
- 如果在单行注释内,检查字符是否为换行符,如果是,则结束单行注释。
- 如果在块注释内,检查字符是否为"*/"的结束标记,如果是,则结束块注释。
- 如果在字符串内,检查字符是否为双引号的结束标记,如果是,则结束字符串。
- 如果不在注释和字符串内,检查字符是否为双引号的起始标记,如果是,则开始字符串。
- 如果字符为斜杠,并且紧跟着"//",则开始单行注释。 - 如果字符为斜杠,并且紧跟着"/*",则开始块注释。
- 如果字符是Java关键词的起始字符,则构建一个StringBuilder对象builder,并从当前位置开始,逐个添加字符,直到构建出完整的关键词。
如果关键词在keywords数组中,则在keywordCount中增加该关键词的计数。
训练集10:
课程成绩统计程序-1:
某高校课程从性质上分为:必修课、选修课,从考核方式上分为:考试、考察。
考试的总成绩由平时成绩、期末成绩分别乘以权重值得出,比如平时成绩权重0.3,期末成绩权重0.7,总成绩=平时成绩*0.3+期末成绩*0.7。
考察的总成绩直接等于期末成绩
必修课的考核方式必须为考试,选修课可以选择考试、考察任一考核方式。
1、输入:
包括课程、课程成绩两类信息。
课程信息包括:课程名称、课程性质、考核方式(可选,如果性质是必修课,考核方式可以没有)三个数据项。
课程信息格式:课程名称+英文空格+课程性质+英文空格+考核方式
课程性质输入项:必修、选修
考核方式输入选项:考试、考察
课程成绩信息包括:学号、姓名、课程名称、平时成绩(可选)、期末成绩
课程信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+平时成绩+英文空格+期末成绩
以上信息的相关约束:
1)平时成绩和期末成绩的权重默认为0.3、0.7
2)成绩是整数,不包含小数部分,成绩的取值范围是【0,100】
3)学号由8位数字组成
4)姓名不超过10个字符
5)课程名称不超过10个字符
6)不特别输入班级信息,班级号是学号的前6位。
2、输出:
输出包含三个部分,包括学生所有课程总成绩的平均分、单门课程成绩平均分、单门课程总成绩平均分、班级所有课程总成绩平均分。
为避免误差,平均分的计算方法为累加所有符合条件的单个成绩,最后除以总数。
1)学生课程总成绩平均分按学号由低到高排序输出
格式:学号+英文空格+姓名+英文空格+总成绩平均分
如果某个学生没有任何成绩信息,输出:学号+英文空格+姓名+英文空格+"did not take any exams"
2)单门课程成绩平均分分为三个分值:平时成绩平均分(可选)、期末考试平均分、总成绩平均分,按课程名称的字符顺序输出
格式:课程名称+英文空格+平时成绩平均分+英文空格+期末考试平均分+英文空格+总成绩平均分
如果某门课程没有任何成绩信息,输出:课程名称+英文空格+"has no grades yet"
3)班级所有课程总成绩平均分按班级由低到高排序输出
格式:班级号+英文空格+总成绩平均分
如果某个班级没有任何成绩信息,输出:班级名称+英文空格+ "has no grades yet"
异常情况:
1)如果解析某个成绩信息时,课程名称不在已输入的课程列表中,输出:学号+英文空格+姓名+英文空格+":"+课程名称+英文空格+"does not exist"
2)如果解析某个成绩信息时,输入的成绩数量和课程的考核方式不匹配,输出:学号+英文空格+姓名+英文空格+": access mode mismatch"
以上两种情况如果同时出现,按第一种情况输出结果。
3)如果解析某个课程信息时,输入的课程性质和课程的考核方式不匹配,输出:课程名称+" : course type & access mode mismatch"
4)格式错误以及其他信息异常如成绩超出范围等,均按格式错误处理,输出"wrong format"
5)若出现重复的课程/成绩信息,只保留第一个课程信息,忽略后面输入的。
信息约束:
1)成绩平均分只取整数部分,小数部分丢弃
以下是我的得分为71分的代码:
1 import java.util.ArrayList; 2 import java.util.Collections; 3 import java.text.Collator; 4 import java.util.Comparator; 5 import java.util.Scanner; 6 public class Main { 7 public static void main(String[] args) { 8 Scanner in=new Scanner(System.in); 9 String info=in.nextLine(); 10 Handle handle=new Handle(); 11 while(!info.equals("end")){ 12 handle.Handle(info); 13 info=in.nextLine(); 14 } 15 handle.showStudents(); 16 handle.showCourse(); 17 handle.showClasses(); 18 } 19 } 20 class Handle { 21 ArrayList<Course> listCourse = new ArrayList<>(); 22 ArrayList<Student> listStudent = new ArrayList<>(); 23 ArrayList<SelectCourse> listSelectCourse = new ArrayList<>(); 24 ArrayList<Class> listCls = new ArrayList<>(); 25 26 public Handle() { 27 } 28 29 public void Handle(String s) { 30 int i = InputMatching.matchingInput(s); 31 String[] items = s.split(" "); 32 switch (i) { 33 case 0: 34 System.out.println("wrong format"); 35 return; 36 case 1: 37 dealCourse(items); 38 return; 39 case 2: 40 dealScore(items); 41 } 42 } 43 Student getStudent(String stuId) { 44 for (int i = 0; i < listStudent.size(); i++) { 45 if (listStudent.get(i).getId().equals(stuId)) { 46 return listStudent.get(i); 47 } 48 } 49 return null; 50 } 51 52 Course getCourse(String courseName) { 53 for (int i = 0; i < listCourse.size(); i++) { 54 if (listCourse.get(i).getName().equals(courseName)) { 55 return listCourse.get(i); 56 } 57 } 58 return null; 59 } 60 61 Class getCls(String clsId) { 62 for (int i = 0; i < listCls.size(); i++) { 63 if (listCls.get(i).getId().equals(clsId)) { 64 return listCls.get(i); 65 } 66 } 67 return null; 68 } 69 70 71 public ArrayList<SelectCourse> getStudentSelects(String stuId) { 72 ArrayList<SelectCourse> stuSelects = new ArrayList<>(); 73 for (SelectCourse cs : listSelectCourse) { 74 if (stuId.equals(cs.student.getId())) { 75 stuSelects.add(cs); 76 } 77 } 78 return stuSelects; 79 } 80 81 82 public ArrayList<SelectCourse> getCourseSelects(String courseName) { 83 ArrayList<SelectCourse> courseSelects = new ArrayList<>(); 84 for (SelectCourse cs : listSelectCourse) { 85 if (courseName.equals(cs.course.getName())) { 86 courseSelects.add(cs); 87 } 88 } 89 return courseSelects; 90 } 91 92 public ArrayList<SelectCourse> getClassSelects(String className) { 93 Class cls=getCls(className); 94 ArrayList<SelectCourse> clsSelects = new ArrayList<>(); 95 for (SelectCourse cs : listSelectCourse) { 96 if (className.equals(cls.getId())){ 97 clsSelects.add(cs); 98 } 99 } 100 return clsSelects; 101 } 102 public int getAvgTotalScore(ArrayList<SelectCourse> listSelectCourse) { 103 int sum = 0; 104 for (SelectCourse cs : listSelectCourse) { 105 sum += cs.score.getTotalScore(); 106 } 107 return sum / listSelectCourse.size(); 108 } 109 public int getAvgUsualScore(ArrayList<SelectCourse> courseSelects) { 110 int sum = 0; 111 for (SelectCourse cs : courseSelects) { 112 sum += ((ExamScore)cs.score).getUsualScore(); 113 } 114 return sum / courseSelects.size(); 115 } 116 public int getAvgFinalScore(ArrayList<SelectCourse> courseSelects) { 117 int sum = 0; 118 for (SelectCourse cs : courseSelects) { 119 sum += cs.score.getFinalScore(); 120 } 121 return sum / courseSelects.size(); 122 } 123 124 private void dealCourse(String[] items) { 125 String courseName = items[0]; 126 String courseType = items[1]; 127 String checkType = items[2]; 128 Course course = new Course(courseName, courseType, checkType); 129 if (!checkCourse(course)) 130 return; 131 if (getCourse(courseName) == null) { 132 course = new Course(courseName, courseType, checkType); 133 listCourse.add(course); 134 } 135 } 136 private void dealScore(String[] items) { 137 String stuId = items[0]; 138 String stuName = items[1]; 139 String courseName = items[2]; 140 String clsId = stuId.substring(0, 6); 141 Class cls; 142 Student stu; 143 cls = getCls(clsId); 144 if (cls == null) { 145 cls = new Class(clsId); 146 listCls.add(cls); 147 } 148 stu = getStudent(stuId); 149 if (stu == null) { 150 stu = new Student(stuName, stuId); 151 listStudent.add(stu); 152 } 153 Course course = getCourse(courseName); 154 if (course == null) { 155 System.out.println(courseName + " does not exist"); 156 return; 157 } 158 if (!checkMethod(items, course)) 159 return; 160 Score score; 161 if (items.length == 4) { 162 int finalScore = Integer.parseInt(items[3]); 163 score = new AssessmentScore(finalScore); 164 } else { 165 int usualScore = Integer.parseInt(items[3]); 166 int finalScore = Integer.parseInt(items[4]); 167 score = new ExamScore(usualScore, finalScore); 168 } 169 if (existChooseCourse(stu, course)) 170 return; 171 SelectCourse selectCourse = new SelectCourse(course, stu, score); 172 listSelectCourse.add(selectCourse); 173 } 174 175 boolean existChooseCourse(Student stu, Course course) { 176 for (int i = 0; i < listSelectCourse.size(); i++) { 177 if (listSelectCourse.get(i).getCourse().getName().equals(course.getName())) { 178 if (listSelectCourse.get(i).getStudent().getName().equals(stu.getName())) { 179 return true; 180 } 181 } 182 } 183 return false; 184 } 185 186 private boolean checkMethod(String[] items, Course course) { 187 String courseType = course.getMethod(); 188 if (courseType.equals("考试") && items.length == 5) { 189 return true; 190 } 191 if (courseType.equals("考察") && items.length == 4) { 192 return true; 193 } 194 System.out.println(items[0] + " " + items[1] + " : access mode mismatch"); 195 return false; 196 } 197 198 boolean checkCourse(Course course) { 199 if (course.getType().equals("必修")&&course.getMethod().equals("考试")) 200 return true; 201 if (course.getType().equals("选修") && (course.getMethod().equals("考试")||course.getMethod().equals("考察"))) 202 return true; 203 System.out.println(course.getName() + " : course type & access mode mismatch"); 204 return false; 205 } 206 207 208 public void showCourse() { 209 Collections.sort(listCourse); 210 for (int i = 0; i < listCourse.size(); i++) { 211 Course course = listCourse.get(i); 212 ArrayList<SelectCourse> courseSelects = getCourseSelects(course.getName()); 213 if (courseSelects.size() == 0) { 214 System.out.println(course.getName() + " has no grades yet"); 215 } else { 216 if (course.getMethod().equals("考试")) { 217 System.out.println(course.getName() + " " + getAvgUsualScore(courseSelects) + " " + getAvgFinalScore(courseSelects) + " " + getAvgTotalScore(courseSelects)); 218 } else { 219 System.out.println(course.getName() + " " + getAvgFinalScore(courseSelects) + " " + getAvgTotalScore(courseSelects)); 220 } 221 } 222 } 223 } 224 225 public void showStudents() { 226 Collections.sort(listStudent); 227 for (int i = 0; i < listStudent.size(); i++) { 228 Student stu = listStudent.get(i); 229 ArrayList<SelectCourse> stuCourseSelects = getStudentSelects(stu.getId()); 230 if (stuCourseSelects.size() != 0) { 231 System.out.println(stu.getId() + " " + stu.getName() + " " + getAvgTotalScore(stuCourseSelects)); 232 } else { 233 System.out.println(stu.getId() + " " + stu.getName() + " did not take any exams"); 234 } 235 } 236 } 237 238 public void showClasses() { 239 Collections.sort(listCls); 240 for (int i = 0; i < listCls.size(); i++) { 241 Student stu = listStudent.get(i); 242 Class cls = listCls.get(i); 243 //ArrayList stuCls = getStudentSelects(stu.getId().substring(0, 6)); 244 ArrayList<SelectCourse> clsCourseSelects = getClassSelects(stu.getId().substring(0,6)); 245 if (clsCourseSelects.size() != 0) { 246 System.out.println(cls.getId() + " " + getAvgTotalScore(clsCourseSelects)); 247 } else { 248 System.out.println(cls.getId() + " has no grades yet"); 249 } 250 } 251 } 252 } 253 class SelectCourse { 254 Student student; 255 256 Course course; 257 Score score; 258 259 260 public SelectCourse(Course course, Student student, Score score) { 261 this.student = student; 262 this.course = course; 263 this.score = score; 264 } 265 266 public Student getStudent() { 267 return student; 268 } 269 270 public void setStudent(Student student) { 271 this.student = student; 272 } 273 274 public Course getCourse() { 275 return course; 276 } 277 278 public void setCourse(Course course) { 279 this.course = course; 280 } 281 282 public Score getGrade() { 283 return score; 284 } 285 286 public void setGrade(Score score) { 287 this.score = score; 288 } 289 } 290 class Student implements Comparable<Student> { 291 String name; 292 String Id; 293 Class cls; 294 295 public Student(String name, String id) { 296 this.name = name; 297 Id = id; 298 } 299 public String getName() { 300 return name; 301 } 302 303 public void setName(String name) { 304 this.name = name; 305 } 306 307 public String getId() { 308 return Id; 309 } 310 311 public void setId(String id) { 312 Id = id; 313 } 314 315 public Class getCls() { 316 return cls; 317 } 318 319 public void setCls(Class cls) { 320 this.cls = cls; 321 } 322 323 public int compareTo(Student o) { 324 return getId().compareTo(o.getId()); 325 } 326 } 327 328 class Class implements Comparable<Class> { 329 String cls; 330 String id; 331 ArrayList<Student> listStudent = new ArrayList<>(); 332 public Class(String id) { 333 this.id=id; 334 } 335 public String getId() { 336 return id; 337 } 338 void addStudent(Student stu) { 339 listStudent.add(stu); 340 } 341 public String getCls() { 342 return cls; 343 } 344 public void setCls(String cls) { 345 this.cls = cls; 346 } 347 348 public void setId(String id) { 349 this.id = id; 350 } 351 352 @Override 353 public int compareTo(Class o) { 354 return getCls().compareTo(o.getCls()); 355 } 356 } 357 358 359 class InputMatching { 360 static String stuNumMatching = "[0-9]{8}";//8个0-9的数字 361 static String stuNameMatching = "\\S{1,10}";//1到10个非空格(TAB)字符 362 static String scoreMatching = "([1-9]?[0-9]|100)"; 363 static String courseNameMatching = "\\S{1,10}";//1到10个非空格(TAB)字符 364 static String courseTypeMatching = "(选修|必修)"; 365 static String checkcourseTypeMatching = "(考试|考察)"; 366 //cousrInput用于定义课程信息模式(正则表达式) 367 static String courseInput = courseNameMatching + " " + courseTypeMatching + " " + checkcourseTypeMatching; 368 //scoreInput用于定义成绩信息模式(正则表达式) 369 static String scoreInput = stuNumMatching + " " + stuNameMatching + " " + courseNameMatching + " " + 370 scoreMatching + "(scoreMatching)?"; 371 public static int matchingInput(String s) { 372 if (matchingCourse(s)) { 373 return 1; 374 } 375 if (matchingScore(s)) { 376 return 2; 377 } 378 return 0; 379 } 380 private static boolean matchingCourse(String s) { 381 return s.matches(courseInput); 382 } 383 384 private static boolean matchingScore(String s) { 385 //System.out.println(match); 386 return s.matches(scoreInput); 387 } 388 } 389 class Course implements Comparable<Course>{ 390 String name; 391 String type; 392 String method; 393 public Course(String name, String type, String method) { 394 this.name = name; 395 this.type = type; 396 this.method = method; 397 } 398 399 public String getName() { 400 return name; 401 } 402 403 public void setName(String name) { 404 this.name = name; 405 } 406 public String getType() { 407 return type; 408 } 409 410 public void setType(String type) { 411 this.type = type; 412 } 413 414 public String getMethod() { 415 return method; 416 } 417 418 public void setMethod(String method) { 419 this.method = method; 420 } 421 422 public int compareTo(Course o) { 423 Comparator<Object> compare = Collator.getInstance(java.util.Locale.CHINA); 424 return compare.compare(name, o.getName()); 425 } 426 } 427 abstract class Score { 428 int finalScore; 429 int totalScore; 430 public Score(int finalScore, int totalScore) { 431 this.finalScore = finalScore; 432 this.totalScore = totalScore; 433 } 434 435 public Score(int finalScore){ 436 this.finalScore=finalScore; 437 } 438 public int getFinalScore() { 439 return finalScore; 440 } 441 442 public void setFinalScore(int finalScore) { 443 this.finalScore = finalScore; 444 } 445 446 public int getTotalScore() { 447 return totalScore; 448 } 449 450 public void setTotalScore(int totalScore) { 451 this.totalScore = totalScore; 452 } 453 } 454 class AssessmentScore extends Score //考察成绩 455 { 456 public AssessmentScore(int finalScore) { 457 super(finalScore); 458 this.totalScore = finalScore; 459 } 460 } 461 class ExamScore extends Score//考试成绩 462 { 463 464 private int usualScore; 465 466 public int getUsualScore() { 467 return usualScore; 468 } 469 470 public void setUsualScore(int usualScore) { 471 this.usualScore = usualScore; 472 } 473 474 public ExamScore(int usualScore, int finalScore) { 475 super(finalScore); 476 this.usualScore=usualScore; 477 this.totalScore = (int) (usualScore * 0.3 + finalScore * 0.7); 478 } 479 }
以下是我的设计类图:

为了方便对学生、课程和成绩进行管理,选择使用ArrayList作为存储数据的数据结构。通过ArrayList,可以方便地添加、删除和查找数据。
为了方便用户输入命令并进行相应的操作,设计了InputMatching类。这个类通过正则表达式进行输入的匹配,判断用户输入的命令类型,并返回相应的标识码。
某高校课程从性质上分为:必修课、选修课、实验课,从考核方式上分为:考试、考察、实验。
考试的总成绩由平时成绩、期末成绩分别乘以权重值得出,比如平时成绩权重0.3,期末成绩权重0.7,总成绩=平时成绩*0.3+期末成绩*0.7。
考察的总成绩直接等于期末成绩
实验的总成绩等于课程每次实验成绩的平均分
必修课的考核方式必须为考试,选修课可以选择考试、考察任一考核方式。实验课的成绩必须为实验。
课程性质输入项:必修、选修、实验
考核方式输入选项:考试、考察、实验
实验课程成绩信息包括:学号、姓名、课程名称、实验次数、每次成绩
实验次数至少4次,不超过9次
实验课程信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+实验次数+英文空格+第一次实验成绩+...+英文空格+最后一次实验成绩
实验课成绩格式:课程名称+英文空格+总成绩平均分
以下是我的代码:
1 import java.util.ArrayList; 2 import java.util.Collections; 3 import java.text.Collator; 4 import java.util.Comparator; 5 import java.util.Scanner; 6 public class Main { 7 public static void main(String[] args) { 8 Scanner in=new Scanner(System.in); 9 String info=in.nextLine(); 10 Handle handle=new Handle(); 11 while(!info.equals("end")){ 12 handle.Handle(info); 13 info=in.nextLine(); 14 } 15 handle.showStudents(); 16 handle.showCourse(); 17 handle.showClasses(); 18 } 19 } 20 class Handle { 21 ArrayList<Course> listCourse = new ArrayList<>(); 22 ArrayList<Student> listStudent = new ArrayList<>(); 23 ArrayList<SelectCourse> listSelectCourse = new ArrayList<>(); 24 ArrayList<Class> listCls = new ArrayList<>(); 25 26 public Handle() { 27 } 28 29 public void Handle(String s) { 30 InputMatching im=new InputMatching(); 31 int i = im.matchingInput(s); 32 String[] items = s.split(" "); 33 switch (i){ 34 case 0: 35 System.out.println("wrong format"); 36 break; 37 case 1: 38 dealCourse(items); 39 break; 40 case 2: 41 dealScore(items); 42 break; 43 } 44 } 45 Student getStudent(String stuId) { 46 for (int i = 0; i < listStudent.size(); i++) { 47 if (listStudent.get(i).getId().equals(stuId)) { 48 return listStudent.get(i); 49 } 50 } 51 return null; 52 } 53 54 Course getCourse(String courseName) { 55 for (int i = 0; i < listCourse.size(); i++) { 56 if (listCourse.get(i).getName().equals(courseName)) { 57 return listCourse.get(i); 58 } 59 } 60 return null; 61 } 62 63 Class getCls(String clsId) { 64 for (int i = 0; i < listCls.size(); i++) { 65 if (listCls.get(i).getId().equals(clsId)) { 66 return listCls.get(i); 67 } 68 } 69 return null; 70 } 71 72 73 public ArrayList<SelectCourse> getStudentSelects(String stuId) { 74 ArrayList<SelectCourse> stuSelects = new ArrayList<>(); 75 for (SelectCourse sc : listSelectCourse) { 76 if (stuId.equals(sc.student.getId())) { 77 stuSelects.add(sc); 78 } 79 } 80 return stuSelects; 81 } 82 83 public ArrayList<SelectCourse> getCourseSelects(String courseName) { 84 ArrayList<SelectCourse> courseSelects = new ArrayList<>(); 85 for (SelectCourse sc : listSelectCourse) { 86 if (courseName.equals(sc.course.getName())) { 87 courseSelects.add(sc); 88 } 89 } 90 return courseSelects; 91 } 92 93 public ArrayList<SelectCourse> getClassSelects(String classId) { 94 ArrayList<SelectCourse> clsSelects = new ArrayList<>(); 95 for (SelectCourse sc : listSelectCourse) { 96 if (classId.equals(sc.student.cls.getId())){ 97 clsSelects.add(sc); 98 } 99 } 100 return clsSelects; 101 } 102 public int getAvgTotalScore(ArrayList<SelectCourse> listSelectCourse) { 103 int sum = 0; 104 for (SelectCourse sc : listSelectCourse) { 105 sum += sc.score.getTotalScore(); 106 } 107 return sum / listSelectCourse.size(); 108 } 109 public int getAvgUsualScore(ArrayList<SelectCourse> courseSelects) { 110 int sum = 0; 111 for (SelectCourse sc : courseSelects) { 112 sum += ((ExamScore)sc.score).getUsualScore(); 113 } 114 return sum / courseSelects.size(); 115 } 116 public int getAvgFinalScore(ArrayList<SelectCourse> courseSelects) { 117 int sum = 0; 118 for (SelectCourse sc : courseSelects) { 119 sum += sc.score.getFinalScore(); 120 } 121 return sum / courseSelects.size(); 122 } 123 124 private void dealCourse(String[] items) { 125 String courseName = items[0]; 126 String courseType = items[1]; 127 String checkType = items[2]; 128 Course course = new Course(courseName, courseType, checkType); 129 if (!checkCourse(course)) 130 return; 131 if (getCourse(courseName) == null) { 132 listCourse.add(course); 133 } 134 } 135 private void dealScore(String[] items) { 136 String stuId = items[0]; 137 String stuName = items[1]; 138 String courseName = items[2]; 139 String clsId = stuId.substring(0, 6); 140 Class cls; 141 Student stu; 142 cls = getCls(clsId); 143 if (cls == null) { 144 cls = new Class(clsId); 145 listCls.add(cls); 146 } 147 stu = getStudent(stuId); 148 if (stu == null) { 149 stu = new Student(stuName, stuId); 150 listStudent.add(stu); 151 cls.addStudent(stu); 152 } 153 stu.setCls(cls); 154 Course course = getCourse(courseName); 155 if (course == null) { 156 System.out.println(courseName + " does not exist"); 157 return; 158 } 159 if (!checkMethod(items, course)) 160 return; 161 Score score; 162 if (items.length == 4) { 163 int finalScore = Integer.parseInt(items[3]); 164 score = new AssessmentScore(finalScore); 165 } else if(items.length==5) { 166 int usualScore = Integer.parseInt(items[3]); 167 int finalScore = Integer.parseInt(items[4]); 168 score = new ExamScore(usualScore, finalScore); 169 } 170 else { 171 int finalScore=0; 172 for(int i=4;i<items.length;i++){ 173 finalScore+=Integer.parseInt(items[i]); 174 } 175 finalScore=finalScore/Integer.parseInt(items[3]); 176 score=new AssessmentScore(finalScore); 177 } 178 if (existChooseCourse(stu, course)) 179 return; 180 SelectCourse selectCourse = new SelectCourse(course, stu, score); 181 listSelectCourse.add(selectCourse); 182 } 183 184 boolean existChooseCourse(Student stu, Course course) { 185 for (int i = 0; i < listSelectCourse.size(); i++) { 186 if (listSelectCourse.get(i).getCourse().getName().equals(course.getName())) { 187 if (listSelectCourse.get(i).getStudent().getName().equals(stu.getName())) { 188 return true; 189 } 190 } 191 } 192 return false; 193 } 194 195 private boolean checkMethod(String[] items, Course course) { 196 String courseType = course.getMethod(); 197 if (courseType.equals("考试") && items.length == 5) { 198 return true; 199 } 200 if (courseType.equals("考察") && items.length == 4) { 201 return true; 202 } 203 if(courseType.equals("实验")&&items.length==(4+Integer.parseInt(items[3]))){ 204 return true; 205 } 206 System.out.println(items[0] + " " + items[1] + " : access mode mismatch"); 207 return false; 208 } 209 210 boolean checkCourse(Course course) { 211 if (course.getType().equals("必修")&&course.getMethod().equals("考试")) 212 return true; 213 if (course.getType().equals("选修") && (course.getMethod().equals("考试")||course.getMethod().equals("考察"))) 214 return true; 215 if (course.getType().equals("实验")&&course.getMethod().equals("实验")) 216 return true; 217 System.out.println(course.getName() + " : course type & access mode mismatch"); 218 return false; 219 } 220 221 222 public void showCourse() { 223 Collections.sort(listCourse); 224 for (int i = 0; i < listCourse.size(); i++) { 225 Course course = listCourse.get(i); 226 ArrayList<SelectCourse> courseSelects = getCourseSelects(course.getName()); 227 if (courseSelects.size() == 0) { 228 System.out.println(course.getName() + " has no grades yet"); 229 } else { 230 if (course.getMethod().equals("考试")) { 231 System.out.println(course.getName() + " " + getAvgUsualScore(courseSelects) + " " + getAvgFinalScore(courseSelects) + " " + getAvgTotalScore(courseSelects)); 232 } else if(course.getMethod().equals("考察")){ 233 System.out.println(course.getName() + " " + getAvgFinalScore(courseSelects) + " " + getAvgTotalScore(courseSelects)); 234 } 235 else { 236 System.out.println(course.getName()+" "+getAvgTotalScore(courseSelects)); 237 } 238 } 239 } 240 } 241 242 public void showStudents() { 243 Collections.sort(listStudent); 244 for (int i = 0; i < listStudent.size(); i++) { 245 Student stu = listStudent.get(i); 246 ArrayList<SelectCourse> stuCourseSelects = getStudentSelects(stu.getId()); 247 if (stuCourseSelects.size() != 0) { 248 System.out.println(stu.getId() + " " + stu.getName() + " " + getAvgTotalScore(stuCourseSelects)); 249 } else { 250 System.out.println(stu.getId() + " " + stu.getName() + " did not take any exams"); 251 } 252 } 253 } 254 255 public void showClasses() { 256 Collections.sort(listCls); 257 for (int i = 0; i < listCls.size(); i++) { 258 Class cls = listCls.get(i); 259 ArrayList<SelectCourse> clsCourseSelects = getClassSelects(cls.getId()); 260 if (clsCourseSelects.size() != 0) { 261 System.out.println(cls.getId() + " " + getAvgTotalScore(clsCourseSelects)); 262 } else { 263 System.out.println(cls.getId() + " has no grades yet"); 264 } 265 } 266 } 267 } 268 class InputMatching { 269 InputMatching(){} 270 static String stuNumMatching = "\\d{8}";//8个0-9的数字 271 static String stuNameMatching = "[^ \\t]{1,10}";//1到10个非空格(TAB)字符 272 static String scoreMatching = "([1-9]?[0-9]|100)"; 273 static String courseNameMatching = "[^ \\t]{1,10}";//1到10个非空格(TAB)字符 274 static String courseTypeMatching = "(选修|必修|实验)"; 275 static String checkCourseTypeMatching = "(考试|考察|实验)"; 276 //courseInput用于定义课程信息模式(正则表达式) 277 static String courseInput = courseNameMatching + " " + courseTypeMatching + " " + checkCourseTypeMatching; 278 //scoreInput用于定义成绩信息模式(正则表达式) 279 static String scoreInput = stuNumMatching + " " + stuNameMatching + " " + courseNameMatching + " " + 280 scoreMatching + "(\\s([1-9]?[0-9]|100))?" ; 281 //experimentInput用于定义实验信息模式(正则表达式) 282 static String experimentInput=stuNumMatching+" "+stuNameMatching+" "+courseNameMatching+" " 283 +"[4-9]"+"(\\s([1-9]?[0-9]|100)){1,10}";// 284 public static int matchingInput(String s) { 285 if (matchingCourse(s)) { 286 return 1; 287 } 288 if (matchingScore(s)||matchingExperiment(s)) { 289 return 2; 290 } 291 return 0; 292 } 293 private static boolean matchingCourse(String s) { 294 return s.matches(courseInput); 295 } 296 private static boolean matchingExperiment(String s){ 297 return s.matches(experimentInput); 298 } 299 private static boolean matchingScore(String s) { 300 return s.matches(scoreInput); 301 } 302 } 303 304 305 class SelectCourse { 306 Student student; 307 Course course; 308 Score score; 309 310 311 public SelectCourse(Course course, Student student, Score score) { 312 this.student = student; 313 this.course = course; 314 this.score = score; 315 } 316 317 public Student getStudent() { 318 return student; 319 } 320 321 public void setStudent(Student student) { 322 this.student = student; 323 } 324 325 public Course getCourse() { 326 return course; 327 } 328 329 public void setCourse(Course course) { 330 this.course = course; 331 } 332 333 public Score getGrade() { 334 return score; 335 } 336 337 public void setGrade(Score score) { 338 this.score = score; 339 } 340 } 341 class Student implements Comparable<Student> { 342 String name; 343 String Id; 344 Class cls; 345 346 public Student(String name, String id) { 347 this.name = name; 348 Id = id; 349 } 350 public String getName() { 351 return name; 352 } 353 354 public void setName(String name) { 355 this.name = name; 356 } 357 358 public String getId() { 359 return Id; 360 } 361 362 public void setId(String id) { 363 Id = id; 364 } 365 366 public Class getCls() { 367 return cls; 368 } 369 370 public void setCls(Class cls) { 371 this.cls = cls; 372 } 373 374 public int compareTo(Student o) { 375 return getId().compareTo(o.getId()); 376 } 377 } 378 class Class implements Comparable<Class> { 379 String id; 380 ArrayList<Student> listStudent = new ArrayList<>(); 381 public Class(String id) { 382 this.id=id; 383 } 384 public String getId() { 385 return id; 386 } 387 void addStudent(Student stu) { 388 listStudent.add(stu); 389 } 390 391 @Override 392 public int compareTo(Class o) { 393 return getId().compareTo(o.getId()); 394 } 395 } 396 class Course implements Comparable<Course>{ 397 String name; 398 String type; 399 String method; 400 public Course(String name, String type, String method) { 401 this.name = name; 402 this.type = type; 403 this.method = method; 404 } 405 406 public String getName() { 407 return name; 408 } 409 410 public void setName(String name) { 411 this.name = name; 412 } 413 public String getType() { 414 return type; 415 } 416 417 public void setType(String type) { 418 this.type = type; 419 } 420 421 public String getMethod() { 422 return method; 423 } 424 425 public void setMethod(String method) { 426 this.method = method; 427 } 428 429 public int compareTo(Course o) { 430 Comparator<Object> compare = Collator.getInstance(java.util.Locale.CHINA); 431 return compare.compare(name, o.getName()); 432 } 433 } 434 abstract class Score { 435 int finalScore; 436 int totalScore; 437 public Score(int finalScore, int totalScore) { 438 this.finalScore = finalScore; 439 this.totalScore = totalScore; 440 } 441 442 public Score(int finalScore){ 443 this.finalScore=finalScore; 444 } 445 public int getFinalScore() { 446 return finalScore; 447 } 448 449 public void setFinalScore(int finalScore) { 450 this.finalScore = finalScore; 451 } 452 453 public int getTotalScore() { 454 return totalScore; 455 } 456 457 public void setTotalScore(int totalScore) { 458 this.totalScore = totalScore; 459 } 460 } 461 class AssessmentScore extends Score {//考察成绩 462 public AssessmentScore(int finalScore) { 463 super(finalScore); 464 this.totalScore = finalScore; 465 } 466 } 467 class ExamScore extends Score{//考试成绩 468 private int usualScore; 469 470 public int getUsualScore() { 471 return usualScore; 472 } 473 474 public void setUsualScore(int usualScore) { 475 this.usualScore = usualScore; 476 } 477 478 public ExamScore(int usualScore, int finalScore) { 479 super(finalScore); 480 this.usualScore=usualScore; 481 this.totalScore = (int) (usualScore * 0.3 + finalScore * 0.7); 482 } 483 }
以下是我的设计类图:

课程成绩统计程序-2只是在程序-1的基础添加了一门实验课,所以只需要在dealScore方法里面添加代码如下:
else {
int finalScore=0;
for(int i=4;i<items.length;i++){
finalScore+=Integer.parseInt(items[i]);
}
finalScore=finalScore/Integer.parseInt(items[3]);
score=new AssessmentScore(finalScore);
}
另外,需要添加修改checkMethod方法、checkCourse方法以及一些输入匹配的字符串。
训练集12:
课程成绩统计程序-3:
课程成绩统计程序-3在第二次的基础上修改了计算总成绩的方式。
要求:修改类结构,将成绩类的继承关系改为组合关系,成绩信息由课程成绩类和分项成绩类组成,课程成绩类组合分项成绩类,分项成绩类由成绩分值和权重两个属性构成。
以下内容为本次新增的内容:
考试的总成绩由平时成绩、期末成绩分别乘以权重值得出,比如平时成绩权重0.3,期末成绩权重0.7,总成绩=平时成绩*0.3+期末成绩*0.7。
考察的总成绩直接等于期末成绩
实验的总成绩等于课程每次实验成绩乘以权重后累加而得。
课程权重值在录入课程信息时输入。(注意:所有分项成绩的权重之和应当等于1)
课程信息包括:课程名称、课程性质、考核方式、分项成绩数量、每个分项成绩的权重。
考试课信息格式:课程名称+英文空格+课程性质+英文空格+考核方式+英文空格+平时成绩的权重+英文空格+期末成绩的权重
考察课信息格式:课程名称+英文空格+课程性质+英文空格+考核方式
实验课程信息格式:课程名称+英文空格+课程性质+英文空格+考核方式+英文空格+分项成绩数量n+英文空格+分项成绩1的权重+英文空格+。。。+英文空格+分项成绩n的权重
为避免四舍五入误差,计算单个成绩时,分项成绩乘以权重后要保留小数位,计算总成绩时,累加所有分项成绩的权重分以后,再去掉小数位。
学生总成绩/整个班/课程平均分的计算方法为累加所有符合条件的单个成绩,最后除以总数。
课程成绩输出格式:课程名称+英文空格+总成绩平均分
如果解析实验课程信息时,输入的分项成绩数量值和分项成绩权重的个数不匹配,输出:课程名称+" : number of scores does not match"
如果解析考试课、实验课时,分项成绩权重值的总和不等于1,输出:课程名称+" : weight value error"
以下是我的代码:
1 import java.util.ArrayList; 2 import java.util.Collections; 3 import java.text.Collator; 4 import java.util.Comparator; 5 import java.util.Scanner; 6 public class Main { 7 public static void main(String[] args) { 8 Scanner in=new Scanner(System.in); 9 String info=in.nextLine(); 10 Handle handle=new Handle(); 11 while(!info.equals("end")){ 12 handle.Handle(info); 13 info=in.nextLine(); 14 } 15 handle.showStudents(); 16 handle.showCourse(); 17 handle.showClasses(); 18 } 19 } 20 class Handle { 21 ArrayList<Course> listCourse = new ArrayList<>(); 22 ArrayList<Student> listStudent = new ArrayList<>(); 23 ArrayList<SelectCourse> listSelectCourse = new ArrayList<>(); 24 ArrayList<Class> listCls = new ArrayList<>(); 25 26 public Handle() { 27 } 28 29 public void Handle(String s) { 30 InputMatching im=new InputMatching(); 31 int i = im.matchingInput(s); 32 String[] items = s.split(" "); 33 switch (i){ 34 case 0: 35 System.out.println("wrong format"); 36 break; 37 case 1: 38 dealScore(items); 39 break; 40 case 2: 41 dealCourse(items); 42 break; 43 case 3: 44 dealCourse(items); 45 break; 46 case 4: 47 dealCourse(items); 48 break; 49 } 50 } 51 Student getStudent(String stuId) { 52 for (int i = 0; i < listStudent.size(); i++) { 53 if (listStudent.get(i).getId().equals(stuId)) { 54 return listStudent.get(i); 55 } 56 } 57 return null; 58 } 59 60 Course getCourse(String courseName) { 61 for (int i = 0; i < listCourse.size(); i++) { 62 if (listCourse.get(i).getName().equals(courseName)) { 63 return listCourse.get(i); 64 } 65 } 66 return null; 67 } 68 69 Class getCls(String clsId) { 70 for (int i = 0; i < listCls.size(); i++) { 71 if (listCls.get(i).getId().equals(clsId)) { 72 return listCls.get(i); 73 } 74 } 75 return null; 76 } 77 78 79 public ArrayList<SelectCourse> getStudentSelects(String stuId) { 80 ArrayList<SelectCourse> stuSelects = new ArrayList<>(); 81 for (SelectCourse sc : listSelectCourse) { 82 if (stuId.equals(sc.student.getId())) { 83 stuSelects.add(sc); 84 } 85 } 86 return stuSelects; 87 } 88 89 public ArrayList<SelectCourse> getCourseSelects(String courseName) { 90 ArrayList<SelectCourse> courseSelects = new ArrayList<>(); 91 for (SelectCourse sc : listSelectCourse) { 92 if (courseName.equals(sc.course.getName())) { 93 courseSelects.add(sc); 94 } 95 } 96 return courseSelects; 97 } 98 99 public ArrayList<SelectCourse> getClassSelects(String classId) { 100 ArrayList<SelectCourse> clsSelects = new ArrayList<>(); 101 for (SelectCourse sc : listSelectCourse) { 102 if (classId.equals(sc.student.cls.getId())){ 103 clsSelects.add(sc); 104 } 105 } 106 return clsSelects; 107 } 108 public int getAvgTotalScore(ArrayList<SelectCourse> courseSelects) { 109 int sum = 0; 110 for (SelectCourse sc : courseSelects) { 111 sum += sc.score.getTotal(); 112 } 113 return sum / courseSelects.size(); 114 } 115 116 private void dealCourse(String[] items) { 117 if(items.length==3){ 118 String courseName = items[0]; 119 String courseType = items[1]; 120 String checkType = items[2]; 121 Course course = new Course(courseName, courseType, checkType); 122 if (!checkCourse(course)) 123 return; 124 if (getCourse(courseName) == null) { 125 listCourse.add(course); 126 } 127 } 128 else if(items.length==5){ 129 String courseName = items[0]; 130 String courseType = items[1]; 131 String checkType = items[2]; 132 ArrayList<String> prop=new ArrayList<>(); 133 prop.add(items[3]); 134 prop.add(items[4]); 135 Course course=new Course(courseName,courseType,checkType,2,prop); 136 if (!checkCourse(course)) 137 return; 138 if (!checkProp(course)) 139 return; 140 if (getCourse(courseName) == null) { 141 listCourse.add(course); 142 } 143 } 144 else { 145 String courseName = items[0]; 146 String courseType = items[1]; 147 String checkType = items[2]; 148 int count=Integer.parseInt(items[3]); 149 ArrayList<String> prop=new ArrayList<>(); 150 for (int i=4;i<items.length;i++){ 151 prop.add(items[i]); 152 } 153 Course course=new Course(courseName,courseType,checkType,count,prop); 154 if (!checkCourse(course)) 155 return; 156 if(!checkCount(course)) 157 return; 158 if (!checkProp(course)) 159 return; 160 if (getCourse(courseName) == null) { 161 listCourse.add(course); 162 } 163 } 164 } 165 private void dealScore(String[] items) { 166 String stuId = items[0]; 167 String stuName = items[1]; 168 String courseName = items[2]; 169 String clsId = stuId.substring(0, 6); 170 Class cls; 171 Student stu; 172 cls = getCls(clsId); 173 if (cls == null) { 174 cls = new Class(clsId); 175 listCls.add(cls); 176 } 177 stu = getStudent(stuId); 178 if (stu == null) { 179 stu = new Student(stuName, stuId); 180 listStudent.add(stu); 181 cls.addStudent(stu); 182 } 183 stu.setCls(cls); 184 Course course = getCourse(courseName); 185 if (course == null) { 186 System.out.println(courseName + " does not exist"); 187 return; 188 } 189 if (!checkMethod(items, course)) 190 return; 191 Score score; 192 PartScore partScore; 193 if (items.length == 4) { 194 ArrayList<String> grade=new ArrayList<>(); 195 grade.add(items[3]); 196 ArrayList<String> prop=new ArrayList<>(); 197 prop.add("1"); 198 partScore=new PartScore(grade,prop); 199 score=new Score(partScore); 200 } else if(items.length==5) { 201 ArrayList<String> grade=new ArrayList<>(); 202 grade.add(items[3]); 203 grade.add(items[4]); 204 partScore=new PartScore(grade,course.getProp()); 205 score=new Score(partScore); 206 } 207 else { 208 ArrayList<String> grade=new ArrayList<>(); 209 for(int i=3;i<items.length;i++){ 210 grade.add(items[i]); 211 } 212 partScore=new PartScore(grade,course.getProp()); 213 score=new Score(partScore); 214 } 215 if (existChooseCourse(stu, course)) 216 return; 217 SelectCourse selectCourse = new SelectCourse(course, stu, score); 218 listSelectCourse.add(selectCourse); 219 } 220 221 boolean existChooseCourse(Student stu, Course course) { 222 for (int i = 0; i < listSelectCourse.size(); i++) { 223 if (listSelectCourse.get(i).getCourse().getName().equals(course.getName())) { 224 if (listSelectCourse.get(i).getStudent().getName().equals(stu.getName())) { 225 return true; 226 } 227 } 228 } 229 return false; 230 } 231 232 private boolean checkMethod(String[] items, Course course) { 233 String courseType = course.getMethod(); 234 if (courseType.equals("考试") && items.length == 5) { 235 return true; 236 } 237 if (courseType.equals("考察") && items.length == 4) { 238 return true; 239 } 240 if(courseType.equals("实验")&&items.length==(3+course.getCount())){ 241 return true; 242 } 243 System.out.println(items[0] + " " + items[1] + " : access mode mismatch"); 244 return false; 245 } 246 247 boolean checkCourse(Course course) { 248 if (course.getType().equals("必修")&&course.getMethod().equals("考试")) 249 return true; 250 if (course.getType().equals("选修") && (course.getMethod().equals("考试")||course.getMethod().equals("考察"))) 251 return true; 252 if (course.getType().equals("实验")&&course.getMethod().equals("实验")) 253 return true; 254 System.out.println(course.getName() + " : course type & access mode mismatch"); 255 return false; 256 } 257 boolean checkProp(Course course){ 258 int sum=0; 259 for (int i=0;i<course.getProp().size();i++){ 260 sum+=Float.parseFloat(course.getProp().get(i))*100; 261 } 262 if(sum!=100){ 263 System.out.println(course.getName()+" : weight value error"); 264 return false; 265 } 266 else 267 return true; 268 } 269 boolean checkCount(Course course){ 270 if(!(course.getCount()==course.getProp().size())){ 271 System.out.println(course.getName()+" : number of scores does not match"); 272 return false; 273 } 274 else 275 return true; 276 } 277 278 public void showCourse() { 279 Collections.sort(listCourse); 280 for (int i = 0; i < listCourse.size(); i++) { 281 Course course = listCourse.get(i); 282 ArrayList<SelectCourse> courseSelects = getCourseSelects(course.getName()); 283 if (courseSelects.size() == 0) { 284 System.out.println(course.getName() + " has no grades yet"); 285 } else { 286 System.out.println(course.getName()+" "+getAvgTotalScore(courseSelects)); 287 } 288 } 289 } 290 291 public void showStudents() { 292 Collections.sort(listStudent); 293 for (int i = 0; i < listStudent.size(); i++) { 294 Student stu = listStudent.get(i); 295 ArrayList<SelectCourse> stuCourseSelects = getStudentSelects(stu.getId()); 296 if (stuCourseSelects.size() != 0) { 297 System.out.println(stu.getId() + " " + stu.getName() + " " + getAvgTotalScore(stuCourseSelects)); 298 } else { 299 System.out.println(stu.getId() + " " + stu.getName() + " did not take any exams"); 300 } 301 } 302 } 303 304 public void showClasses() { 305 Collections.sort(listCls); 306 for (int i = 0; i < listCls.size(); i++) { 307 Class cls = listCls.get(i); 308 ArrayList<SelectCourse> clsCourseSelects = getClassSelects(cls.getId()); 309 if (clsCourseSelects.size() != 0) { 310 System.out.println(cls.getId() + " " + getAvgTotalScore(clsCourseSelects)); 311 } else { 312 System.out.println(cls.getId() + " has no grades yet"); 313 } 314 } 315 } 316 } 317 class InputMatching { 318 InputMatching(){} 319 public static int matchingInput(String s) { 320 //考察课程 321 if(s.matches("[^ \\t]{1,10}"+" "+"(选修|必修|实验)"+" "+"(考试|考察|实验)")){ 322 return 2; 323 } 324 //成绩 325 if(s.matches("\\d{8}"+" "+"[^ \\t]{1,10}"+" "+"[^ \\t]{1,10}"+" "+ 326 "([1-9]?[0-9]|100)"+"(\\s([1-9]?[0-9]|100))?")){ 327 return 1; 328 } 329 //实验成绩 330 if(s.matches("\\d{8}"+" "+"[^ \\t]{1,10}"+" "+"[^ \\t]{1,10}" 331 +"(\\s([1-9]?[0-9]|100)){1,10}")){ 332 return 1; 333 } 334 //考试课程 335 if(s.matches("[^ \\t]{1,10}"+" "+"(选修|必修|实验)"+" "+"(考试|考察|实验)"+" "+"(0\\.[1-9])"+" "+"(0\\.[1-9])")) 336 return 3; 337 //实验课程 338 if(s.matches("[^ \\t]{1,10}"+" "+"(选修|必修|实验)"+" "+"(考试|考察|实验)"+" "+"[4-9]" 339 +"(\\s(0\\.[1-9])){1,10}")) 340 return 4; 341 return 0; 342 } 343 } 344 class SelectCourse { 345 Student student; 346 Course course; 347 Score score; 348 349 350 public SelectCourse(Course course, Student student, Score score) { 351 this.student = student; 352 this.course = course; 353 this.score = score; 354 } 355 356 public Student getStudent() { 357 return student; 358 } 359 360 public void setStudent(Student student) { 361 this.student = student; 362 } 363 364 public Course getCourse() { 365 return course; 366 } 367 368 public void setCourse(Course course) { 369 this.course = course; 370 } 371 372 public Score getGrade() { 373 return score; 374 } 375 376 public void setGrade(Score score) { 377 this.score = score; 378 } 379 } 380 class Student implements Comparable<Student> { 381 String name; 382 String Id; 383 Class cls; 384 385 public Student(String name, String id) { 386 this.name = name; 387 Id = id; 388 } 389 public String getName() { 390 return name; 391 } 392 393 public void setName(String name) { 394 this.name = name; 395 } 396 397 public String getId() { 398 return Id; 399 } 400 401 public void setId(String id) { 402 Id = id; 403 } 404 405 public Class getCls() { 406 return cls; 407 } 408 409 public void setCls(Class cls) { 410 this.cls = cls; 411 } 412 413 public int compareTo(Student o) { 414 return getId().compareTo(o.getId()); 415 } 416 } 417 class Class implements Comparable<Class> { 418 String id; 419 ArrayList<Student> listStudent = new ArrayList<>(); 420 public Class(String id) { 421 this.id=id; 422 } 423 public String getId() { 424 return id; 425 } 426 void addStudent(Student stu) { 427 listStudent.add(stu); 428 } 429 430 @Override 431 public int compareTo(Class o) { 432 return getId().compareTo(o.getId()); 433 } 434 } 435 class Course implements Comparable<Course>{ 436 String name; 437 String type; 438 String method; 439 int count; 440 ArrayList<String> prop; 441 442 public Course(String name, String type, String method, int count, ArrayList<String> prop) { 443 this.name = name; 444 this.type = type; 445 this.method = method; 446 this.count = count; 447 this.prop = prop; 448 } 449 450 public Course(String name, String type, String method) { 451 this.name = name; 452 this.type = type; 453 this.method = method; 454 } 455 456 public String getName() { 457 return name; 458 } 459 460 public void setName(String name) { 461 this.name = name; 462 } 463 public String getType() { 464 return type; 465 } 466 467 public void setType(String type) { 468 this.type = type; 469 } 470 471 public String getMethod() { 472 return method; 473 } 474 475 public void setMethod(String method) { 476 this.method = method; 477 } 478 479 public int getCount() { 480 return count; 481 } 482 483 public ArrayList<String> getProp() { 484 return prop; 485 } 486 487 public int compareTo(Course o) { 488 Comparator<Object> compare = Collator.getInstance(java.util.Locale.CHINA); 489 return compare.compare(name, o.getName()); 490 } 491 } 492 class Score { 493 private PartScore partScore; 494 495 public Score(PartScore partScore) { 496 this.partScore = partScore; 497 } 498 public float getTotal(){ 499 float sum=0; 500 for (int i=0;i<partScore.getProp().size();i++){ 501 sum+=Float.parseFloat(partScore.getProp().get(i))*Float.parseFloat(partScore.getGrade().get(i)); 502 } 503 return sum; 504 } 505 } 506 507 class PartScore{ 508 private ArrayList<String> grade; 509 private ArrayList<String> prop; 510 511 public PartScore(ArrayList<String> grade, ArrayList<String> prop) { 512 this.grade = grade; 513 this.prop = prop; 514 } 515 516 public ArrayList<String> getGrade() { 517 return grade; 518 } 519 520 public void setGrade(ArrayList<String> grade) { 521 this.grade = grade; 522 } 523 524 public ArrayList<String> getProp() { 525 return prop; 526 } 527 528 public void setProp(ArrayList<String> prop) { 529 this.prop = prop; 530 } 531 }
以下是我的设计类图:

程序-3需要修改类设计,我将原本的AssessmentScore类和ExamScore类继承Score类,直接改成只有Score类和PartScore类,Score类和PartScore类一起使用,以便计算学生总成绩。Score类的getTotal()方法使用PartScore对象的属性进行计算,根据每个部分成绩和所占比例的乘积来计算学生的总成绩。
接下来,就是根据两个分数类修改其它部分的代码,包括输入格式的匹配部分、计算分数、输出格式部分和对输入课程的处理、对输入学生成绩的处理等。
三、踩坑心得
这里主要对训练集09的统计Java程序中关键词的出现次数踩的一个坑,我是万万没想到,过不去的测试点其实是一个“=”

将原先的代码:
while (!(line = in.nextLine()).equals("exit")) {
code.append(line).append("\n");
}
改成:
while (!(line = in.nextLine()).equals("exit")) {
line=line.replaceAll("=","a");
code.append(line).append("\n");
}
就行了。。。
但其实这样做,面向对象编程也就变成了面向测试点编程,还是因为原本我写的代码没有考虑全所有的情况,导致有很多符号没有在我的处理情况内,比如“!=” “&” “+” “-”等等。
四、改进建议
这里主要写对课程成绩统计程序-1的代码进行改进。
改进后的代码如下:
1 import java.util.ArrayList; 2 import java.util.Collections; 3 import java.text.Collator; 4 import java.util.Comparator; 5 import java.util.Scanner; 6 public class Main { 7 public static void main(String[] args) { 8 Scanner in=new Scanner(System.in); 9 String info=in.nextLine(); 10 Handle handle=new Handle(); 11 while(!info.equals("end")){ 12 handle.Handle(info); 13 info=in.nextLine(); 14 } 15 handle.showStudents(); 16 handle.showCourse(); 17 handle.showClasses(); 18 } 19 } 20 class Handle { 21 ArrayList<Course> listCourse = new ArrayList<>(); 22 ArrayList<Student> listStudent = new ArrayList<>(); 23 ArrayList<SelectCourse> listSelectCourse = new ArrayList<>(); 24 ArrayList<Class> listCls = new ArrayList<>(); 25 26 public Handle() { 27 } 28 29 public void Handle(String s) { 30 InputMatching im=new InputMatching(); 31 int i = im.matchingInput(s); 32 String[] items = s.split(" "); 33 switch (i){ 34 case 0: 35 System.out.println("wrong format"); 36 break; 37 case 1: 38 dealCourse(items); 39 break; 40 case 2: 41 dealScore(items); 42 break; 43 } 44 } 45 Student getStudent(String stuId) { 46 for (int i = 0; i < listStudent.size(); i++) { 47 if (listStudent.get(i).getId().equals(stuId)) { 48 return listStudent.get(i); 49 } 50 } 51 return null; 52 } 53 54 Course getCourse(String courseName) { 55 for (int i = 0; i < listCourse.size(); i++) { 56 if (listCourse.get(i).getName().equals(courseName)) { 57 return listCourse.get(i); 58 } 59 } 60 return null; 61 } 62 63 Class getCls(String clsId) { 64 for (int i = 0; i < listCls.size(); i++) { 65 if (listCls.get(i).getId().equals(clsId)) { 66 return listCls.get(i); 67 } 68 } 69 return null; 70 } 71 72 73 public ArrayList<SelectCourse> getStudentSelects(String stuId) { 74 ArrayList<SelectCourse> stuSelects = new ArrayList<>(); 75 for (SelectCourse cs : listSelectCourse) { 76 if (stuId.equals(cs.student.getId())) { 77 stuSelects.add(cs); 78 } 79 } 80 return stuSelects; 81 } 82 83 84 public ArrayList<SelectCourse> getCourseSelects(String courseName) { 85 ArrayList<SelectCourse> courseSelects = new ArrayList<>(); 86 for (SelectCourse cs : listSelectCourse) { 87 if (courseName.equals(cs.course.getName())) { 88 courseSelects.add(cs); 89 } 90 } 91 return courseSelects; 92 } 93 94 public ArrayList<SelectCourse> getClassSelects(String classId) { 95 ArrayList<SelectCourse> clsSelects = new ArrayList<>(); 96 for (SelectCourse sc : listSelectCourse) { 97 if (classId.equals(sc.student.cls.getId())){ 98 clsSelects.add(sc); 99 } 100 } 101 return clsSelects; 102 } 103 public int getAvgTotalScore(ArrayList<SelectCourse> listSelectCourse) { 104 int sum = 0; 105 for (SelectCourse cs : listSelectCourse) { 106 sum += cs.score.getTotalScore(); 107 } 108 return sum / listSelectCourse.size(); 109 } 110 public int getAvgUsualScore(ArrayList<SelectCourse> courseSelects) { 111 int sum = 0; 112 for (SelectCourse cs : courseSelects) { 113 sum += ((ExamScore)cs.score).getUsualScore(); 114 } 115 return sum / courseSelects.size(); 116 } 117 public int getAvgFinalScore(ArrayList<SelectCourse> courseSelects) { 118 int sum = 0; 119 for (SelectCourse cs : courseSelects) { 120 sum += cs.score.getFinalScore(); 121 } 122 return sum / courseSelects.size(); 123 } 124 125 private void dealCourse(String[] items) { 126 String courseName = items[0]; 127 String courseType = items[1]; 128 String checkType = items[2]; 129 Course course = new Course(courseName, courseType, checkType); 130 if (!checkCourse(course)) 131 return; 132 if (getCourse(courseName) == null) { 133 //course = new Course(courseName, courseType, checkType); 134 listCourse.add(course); 135 } 136 } 137 private void dealScore(String[] items) { 138 String stuId = items[0]; 139 String stuName = items[1]; 140 String courseName = items[2]; 141 String clsId = stuId.substring(0, 6); 142 Class cls; 143 Student stu; 144 cls = getCls(clsId); 145 if (cls == null) { 146 cls = new Class(clsId); 147 listCls.add(cls); 148 } 149 stu = getStudent(stuId); 150 if (stu == null) { 151 stu = new Student(stuName, stuId); 152 listStudent.add(stu); 153 cls.addStudent(stu); 154 } 155 stu.setCls(cls); 156 Course course = getCourse(courseName); 157 if (course == null) { 158 System.out.println(courseName + " does not exist"); 159 return; 160 } 161 if (!checkMethod(items, course)) 162 return; 163 Score score; 164 if (items.length == 4) { 165 int finalScore = Integer.parseInt(items[3]); 166 score = new AssessmentScore(finalScore); 167 } else { 168 int usualScore = Integer.parseInt(items[3]); 169 int finalScore = Integer.parseInt(items[4]); 170 score = new ExamScore(usualScore, finalScore); 171 } 172 if (existChooseCourse(stu, course)) 173 return; 174 SelectCourse selectCourse = new SelectCourse(course, stu, score); 175 listSelectCourse.add(selectCourse); 176 } 177 178 boolean existChooseCourse(Student stu, Course course) { 179 for (int i = 0; i < listSelectCourse.size(); i++) { 180 if (listSelectCourse.get(i).getCourse().getName().equals(course.getName())) { 181 if (listSelectCourse.get(i).getStudent().getName().equals(stu.getName())) { 182 return true; 183 } 184 } 185 } 186 return false; 187 } 188 189 private boolean checkMethod(String[] items, Course course) { 190 String courseType = course.getMethod(); 191 if (courseType.equals("考试") && items.length == 5) { 192 return true; 193 } 194 if (courseType.equals("考察") && items.length == 4) { 195 return true; 196 } 197 System.out.println(items[0] + " " + items[1] + " : access mode mismatch"); 198 return false; 199 } 200 201 boolean checkCourse(Course course) { 202 if (course.getType().equals("必修")&&course.getMethod().equals("考试")) 203 return true; 204 if (course.getType().equals("选修") && (course.getMethod().equals("考试")||course.getMethod().equals("考察"))) 205 return true; 206 System.out.println(course.getName() + " : course type & access mode mismatch"); 207 return false; 208 } 209 210 211 public void showCourse() { 212 Collections.sort(listCourse); 213 for (int i = 0; i < listCourse.size(); i++) { 214 Course course = listCourse.get(i); 215 ArrayList<SelectCourse> courseSelects = getCourseSelects(course.getName()); 216 if (courseSelects.size() == 0) { 217 System.out.println(course.getName() + " has no grades yet"); 218 } else { 219 if (course.getMethod().equals("考试")) { 220 System.out.println(course.getName() + " " + getAvgUsualScore(courseSelects) + " " + getAvgFinalScore(courseSelects) + " " + getAvgTotalScore(courseSelects)); 221 } else { 222 System.out.println(course.getName() + " " + getAvgFinalScore(courseSelects) + " " + getAvgTotalScore(courseSelects)); 223 } 224 } 225 } 226 } 227 228 public void showStudents() { 229 Collections.sort(listStudent); 230 for (int i = 0; i < listStudent.size(); i++) { 231 Student stu = listStudent.get(i); 232 ArrayList<SelectCourse> stuCourseSelects = getStudentSelects(stu.getId()); 233 if (stuCourseSelects.size() != 0) { 234 System.out.println(stu.getId() + " " + stu.getName() + " " + getAvgTotalScore(stuCourseSelects)); 235 } else { 236 System.out.println(stu.getId() + " " + stu.getName() + " did not take any exams"); 237 } 238 } 239 } 240 241 public void showClasses() { 242 Collections.sort(listCls); 243 for (int i = 0; i < listCls.size(); i++) { 244 Student stu = listStudent.get(i); 245 Class cls = listCls.get(i); 246 //ArrayList stuCls = getStudentSelects(stu.getId().substring(0, 6)); 247 ArrayList<SelectCourse> clsCourseSelects = getClassSelects(stu.getId().substring(0,6)); 248 if (clsCourseSelects.size() != 0) { 249 System.out.println(cls.getId() + " " + getAvgTotalScore(clsCourseSelects)); 250 } else { 251 System.out.println(cls.getId() + " has no grades yet"); 252 } 253 } 254 } 255 } 256 class SelectCourse { 257 Student student; 258 259 Course course; 260 Score score; 261 262 263 public SelectCourse(Course course, Student student, Score score) { 264 this.student = student; 265 this.course = course; 266 this.score = score; 267 } 268 269 public Student getStudent() { 270 return student; 271 } 272 273 public void setStudent(Student student) { 274 this.student = student; 275 } 276 277 public Course getCourse() { 278 return course; 279 } 280 281 public void setCourse(Course course) { 282 this.course = course; 283 } 284 285 public Score getGrade() { 286 return score; 287 } 288 289 public void setGrade(Score score) { 290 this.score = score; 291 } 292 } 293 class Student implements Comparable<Student> { 294 String name; 295 String Id; 296 Class cls; 297 298 public Student(String name, String id) { 299 this.name = name; 300 Id = id; 301 } 302 public String getName() { 303 return name; 304 } 305 306 public void setName(String name) { 307 this.name = name; 308 } 309 310 public String getId() { 311 return Id; 312 } 313 314 public void setId(String id) { 315 Id = id; 316 } 317 318 public Class getCls() { 319 return cls; 320 } 321 322 public void setCls(Class cls) { 323 this.cls = cls; 324 } 325 326 public int compareTo(Student o) { 327 return getId().compareTo(o.getId()); 328 } 329 } 330 331 class Class implements Comparable<Class> { 332 String cls; 333 String id; 334 ArrayList<Student> listStudent = new ArrayList<>(); 335 public Class(String id) { 336 this.id=id; 337 } 338 public String getId() { 339 return id; 340 } 341 void addStudent(Student stu) { 342 listStudent.add(stu); 343 } 344 public String getCls() { 345 return cls; 346 } 347 public void setCls(String cls) { 348 this.cls = cls; 349 } 350 351 public void setId(String id) { 352 this.id = id; 353 } 354 355 @Override 356 public int compareTo(Class o) { 357 return getId().compareTo(o.getId()); 358 } 359 } 360 361 362 class InputMatching { 363 InputMatching(){} 364 static String stuNumMatching = "\\d{8}";//8个0-9的数字 365 static String stuNameMatching = "[^ \\t]{1,10}";//1到10个非空格(TAB)字符 366 static String scoreMatching = "([1-9]?[0-9]|100)"; 367 static String courseNameMatching = "[^ \\t]{1,10}";//1到10个非空格(TAB)字符 368 static String courseTypeMatching = "(选修|必修)"; 369 static String checkcourseTypeMatching = "(考试|考察)"; 370 //cousrInput用于定义课程信息模式(正则表达式) 371 static String courseInput = courseNameMatching + " " + courseTypeMatching + " " + checkcourseTypeMatching; 372 //scoreInput用于定义成绩信息模式(正则表达式) 373 static String scoreInput = stuNumMatching + " " + stuNameMatching + " " + courseNameMatching + " " + 374 scoreMatching + "(\\s([1-9]?[0-9]|100))?"; 375 public static int matchingInput(String s) { 376 if (matchingCourse(s)) { 377 return 1; 378 } 379 if (matchingScore(s)) { 380 return 2; 381 } 382 return 0; 383 } 384 private static boolean matchingCourse(String s) { 385 return s.matches(courseInput); 386 } 387 388 private static boolean matchingScore(String s) { 389 //System.out.println(match); 390 return s.matches(scoreInput); 391 } 392 } 393 class Course implements Comparable<Course>{ 394 String name; 395 String type; 396 String method; 397 public Course(String name, String type, String method) { 398 this.name = name; 399 this.type = type; 400 this.method = method; 401 } 402 403 public String getName() { 404 return name; 405 } 406 407 public void setName(String name) { 408 this.name = name; 409 } 410 public String getType() { 411 return type; 412 } 413 414 public void setType(String type) { 415 this.type = type; 416 } 417 418 public String getMethod() { 419 return method; 420 } 421 422 public void setMethod(String method) { 423 this.method = method; 424 } 425 426 public int compareTo(Course o) { 427 Comparator<Object> compare = Collator.getInstance(java.util.Locale.CHINA); 428 return compare.compare(name, o.getName()); 429 } 430 } 431 abstract class Score { 432 int finalScore; 433 int totalScore; 434 public Score(int finalScore, int totalScore) { 435 this.finalScore = finalScore; 436 this.totalScore = totalScore; 437 } 438 439 public Score(int finalScore){ 440 this.finalScore=finalScore; 441 } 442 public int getFinalScore() { 443 return finalScore; 444 } 445 446 public void setFinalScore(int finalScore) { 447 this.finalScore = finalScore; 448 } 449 450 public int getTotalScore() { 451 return totalScore; 452 } 453 454 public void setTotalScore(int totalScore) { 455 this.totalScore = totalScore; 456 } 457 } 458 class AssessmentScore extends Score //考察成绩 459 { 460 public AssessmentScore(int finalScore) { 461 super(finalScore); 462 this.totalScore = finalScore; 463 } 464 } 465 class ExamScore extends Score//考试成绩 466 { 467 468 private int usualScore; 469 470 public int getUsualScore() { 471 return usualScore; 472 } 473 474 public void setUsualScore(int usualScore) { 475 this.usualScore = usualScore; 476 } 477 478 public ExamScore(int usualScore, int finalScore) { 479 super(finalScore); 480 this.usualScore=usualScore; 481 this.totalScore = (int) (usualScore * 0.3 + finalScore * 0.7); 482 } 483 }
这里主要是修改了InputMatching类内的正则表达式进行了修改,还有在SelectCourse的List内添加选课类的部分进行了修改,如下:
public ArrayList<SelectCourse> getClassSelects(String classId) {
ArrayList<SelectCourse> clsSelects = new ArrayList<>();
for (SelectCourse sc : listSelectCourse) {
if (classId.equals(sc.student.cls.getId())){
clsSelects.add(sc);
}
}
return clsSelects;
}
除此之外还修改了一些小细节,这里就不详细说明了。
五、总结
本阶段学习到了很多内容,包括继承、多态、接口,Set、Map、List等等,还有Comparable接口和Comparator接口,尤其经过三次课程成绩统计程序,对类的设计更加有了新的理解,在设计过程中,要重点考虑了系统的可扩展性和易用性。通过合理的类设计和方法封装,使得系统具有良好的扩展性,可以方便地添加新的功能和进行修改。
对于本门课程,在教学理念(OBE)方面,确确实实是提高了学生的主动性,但是有时可以稍稍指明一点方向,有时学生像无头苍蝇一样不知道如何去学,比如我。在教学方法(边讲边练)方面,我认为讲可以再多一点点。在教学组织(线上线下混合式教学)方面,我认为没什么问题。在教学过程(PTA题目集驱动)方面,PTA是一个很好提高编程能力的平台,能够很好地辅助学生消化所学的内容。在教学模式(BOPPPS)方面,我认为可以更加注重学生组内讨论,加强团队沟通能力。
以上是我对本门课程的一些想法。
对于我自身,我知自己还有很多不足,少年还须努力。

浙公网安备 33010602011771号