一、前言
在本次Blog要分析的是OOP第三阶段PTA题目集。对于OOP第三阶段PTA题目集,我个人认为难度还是较大的,每次一看到有新的题目集更新了,就心里一颤,因为难度较大耗时长。但是,正因为难度高,本人也从中踩了很多的坑,学到了很多编程思想和更加熟悉了JAVA的语法,对我本人的帮忙还是非常大的。在此次Blog中,我将主要对课程成绩统计程序系列进行分析,同时也包括了一些与数据结构相关的题目(例如set和map相关的)和容器相关的题目。
二、设计与分析
详细的分析在注解中,小结则为该题的一些概括说明
课程成绩统计程序系列:该系列题目的要求是设计一个程序,用于计算不同学生、不同班级、不同课程的平均分,课程具有不同的性质。总体来说难度适中,没有很难,就是代码量较长,所以有很多的细枝末节需要特别注意,同时在修正代码的时候更需要心平气和。
1.课程成绩统计程序-1
7-1 课程成绩统计程序-1 分数 100 作者 蔡轲 单位 南昌航空大学某高校课程从性质上分为:必修课、选修课,从考核方式上分为:考试、考察。
考试的总成绩由平时成绩、期末成绩分别乘以权重值得出,比如平时成绩权重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)成绩平均分只取整数部分,小数部分丢弃
参考类图:
输入样例1:
仅有课程。例如:
java 必修 考试
数据结构 选修 考试
形式与政治 选修 考察
end
输出样例1:
在这里给出相应的输出。例如:
java has no grades yet
数据结构 has no grades yet
形式与政治 has no grades yet
输入样例2:
单门考试课程 单个学生。例如:
java 必修 考试
20201103 张三 java 20 40
end
输出样例2:
在这里给出相应的输出。例如:
20201103 张三 34
java 20 40 34
202011 34
输入样例3:
单门考察课程 单个学生。例如:
java 选修 考察
20201103 张三 java 40
end
输出样例3:
在这里给出相应的输出。例如:
20201103 张三 40
java 40 40
202011 40
输入样例4:
考试课程 单个学生 不匹配的考核方式。例如:
java 必修 考试
20201103 张三 java 20
end
输出样例4:
在这里给出相应的输出。例如:
20201103 张三 : access mode mismatch
20201103 张三 did not take any exams
java has no grades yet
202011 has no grades yet
输入样例5:
单门课程,单个学生,课程类型与考核类型不匹配。例如:
java 必修 考察
20201103 张三 java 40
end
输出样例5:
在这里给出相应的输出。例如:
java : course type & access mode mismatch
java does not exist
20201103 张三 did not take any exams
202011 has no grades yet
输入样例6:
单门课程,多个学生。例如:
java 选修 考察
20201103 李四 java 60
20201104 王五 java 60
20201101 张三 java 40
end
输出样例6:
在这里给出相应的输出。例如:
20201101 张三 40
20201103 李四 60
20201104 王五 60
java 53 53
202011 53
输入样例7:
单门课程,单个学生,课程类型与考核类型不匹配。例如:
形式与政治 必修 考试
数据库 选修 考试
java 选修 考察
数据结构 选修 考察
20201103 李四 数据结构 70
20201103 李四 形式与政治 80 90
20201103 李四 java 60
20201103 李四 数据库 70 78
end
输出样例7:
在这里给出相应的输出。例如:
20201103 李四 73
java 60 60
数据结构 70 70
数据库 70 78 75
形式与政治 80 90 87
202011 73
输入样例8:
单门课程,单个学生,成绩越界。例如:
数据结构 选修 考察
20201103 李四 数据结构 101
end
输出样例8:
在这里给出相应的输出。例如:
wrong format
数据结构 has no grades yet
输入样例9:
多门课程,多个学生,多个成绩。例如:
形式与政治 必修 考试
数据库 选修 考试
java 选修 考察
数据结构 选修 考察
20201205 李四 数据结构 70
20201103 李四 形式与政治 80 90
20201102 王五 java 60
20201211 张三 数据库 70 78
end
输出样例9:
在这里给出相应的输出。例如:
20201102 王五 60
20201103 李四 87
20201205 李四 70
20201211 张三 75
java 60 60
数据结构 70 70
数据库 70 78 75
形式与政治 80 90 87
202011 73
202012 72
代码长度限制
16 KB
时间限制
1000 ms
内存限制
64 MB
源代码:
1 import java.util.Scanner; 2 import java.text.Collator; 3 import java.util.ArrayList; 4 import java.util.Arrays; 5 import java.util.Collections; 6 import java.util.Comparator; 7 8 public class Main{ 9 public static void main(String args[]) { 10 SelectCourseCenter selectCourseCenter = new SelectCourseCenter(); 11 selectCourseCenter.start(); 12 } 13 } 14 15 class SelectCourseCenter { 16 private ArrayList<Class> classAll = new ArrayList<Class>(); 17 private ArrayList<Course> courseAll = new ArrayList<Course>(); 18 public void start() { 19 Scanner input = new Scanner(System.in); 20 while(true) { 21 String information = input.nextLine(); 22 String infos[] = information.split(" "); 23 if(information.equals("end")) 24 break; 25 if(infos.length == 2) { 26 if(infos[0].length() > 10) { 27 System.out.println("wrong format"); 28 } 29 else { 30 if(infos[1].equals("选修")) { 31 System.out.println(infos[0] + " : course type & access mode mismatch"); 32 } 33 else if(getAppointCourse(infos[0]) != null) { 34 } 35 else if(infos[1].equals("必修")){ 36 courseAll.add(new Course(infos[0], infos[1])); 37 } 38 else { 39 System.out.println("wrong format"); 40 } 41 } 42 } 43 else if(infos.length == 3) { 44 if(infos[0].length() > 10) { 45 System.out.println("wrong format"); 46 } 47 else{ 48 if(infos[1].equals("必修") && infos[2].equals("考察")) { 49 System.out.println(infos[0] + " : course type & access mode mismatch"); 50 } 51 else if(getAppointCourse(infos[0]) != null) { 52 } 53 else if(infos[1].equals("选修") || (infos[1].equals("必修") && infos[2].equals("考试"))){ 54 courseAll.add(new Course(infos[0], infos[1], infos[2])); 55 } 56 else { 57 System.out.println("wrong format"); 58 } 59 } 60 } 61 else if(infos.length == 4) { 62 if(infos[0].length() != 8 || infos[1].length() > 10 || infos[2].length() > 10 || !isNumeric(infos[0]) 63 || !isNumeric(infos[3])) { 64 System.out.println("wrong format"); 65 continue; 66 } 67 int classNumber = Integer.parseInt(infos[0].substring(0, 6)); 68 if(classAll.size() == 0 || getAppointClass(classNumber) == null) { 69 classAll.add(new Class(classNumber)); 70 } 71 int scoreLast = Integer.parseInt(infos[3]); 72 int ID = Integer.parseInt(infos[0]); 73 Student student; 74 if(getAppointCourse(infos[2]) != null && // 是否存在该课程且分数合法 75 getAppointCourse(infos[2]).getAssessment().equals("考察") && 76 scoreLast >= 0 && scoreLast <= 100) { 77 if(getAppointClass(classNumber).getStudents().size() == 0 || 78 getAppointClass(classNumber).getAppointStudent(ID, infos[1]) == null){ 79 student = new Student(ID, infos[1]); 80 student.getCourseAll().add(new Course(infos[2] 81 , getAppointCourse(infos[2]).getAttribute() 82 , getAppointCourse(infos[2]).getAssessment())); 83 student.getCourseAll().get(student.getCourseAll().size() - 1).getScore().setScoreLast(scoreLast); 84 student.getCourseAll().get(student.getCourseAll().size() - 1).getScore().calculateScoreEnd(); 85 getAppointClass(classNumber).StudentTestNumber++; 86 getAppointClass(classNumber).getStudents().add(student); 87 } 88 else { 89 student = getAppointClass(classNumber).getAppointStudent(ID, infos[1]); // 引用 90 if(student.getAppointCourse(infos[2]) == null){ 91 student.getCourseAll().add(new Course(infos[2] 92 , getAppointCourse(infos[2]).getAttribute() 93 , getAppointCourse(infos[2]).getAssessment())); 94 student.getAppointCourse(infos[2]).getScore().setScoreLast(scoreLast); 95 student.getAppointCourse(infos[2]).getScore().calculateScoreEnd(); 96 } 97 } 98 getAppointCourse(infos[2]).studentTestNumber++; 99 getAppointCourse(infos[2]).getScore().setScoreLast(getAppointCourse(infos[2]).getScore().getScoreLast() 100 + student.getCourseAll().get(student.getCourseAll().size() - 1).getScore().getScoreLast()); 101 getAppointCourse(infos[2]).getScore().calculateScoreEnd(); 102 } 103 else if(getAppointCourse(infos[2]) == null) { 104 System.out.println(infos[2] + " does not exist"); 105 student = new Student(ID, infos[1]); 106 getAppointClass(classNumber).getStudents().add(student); 107 } 108 else if(getAppointCourse(infos[2]).getAssessment().equals("考试")) { 109 student = new Student(ID, infos[1]); 110 System.out.println(infos[0] + " " + infos[1] + " : access mode mismatch"); 111 getAppointClass(classNumber).getStudents().add(student); 112 } 113 else { 114 System.out.println("wrong format"); 115 } 116 } 117 else { 118 if(infos[0].length() != 8 || infos[1].length() > 10 || infos[2].length() > 10 || !isNumeric(infos[0]) 119 || !isNumeric(infos[3]) || !isNumeric(infos[4])) { 120 System.out.println("wrong format"); 121 continue; 122 } 123 int classNumber = Integer.parseInt(infos[0].substring(0, 6)); 124 if(classAll.size() == 0 || getAppointClass(classNumber) == null) { 125 classAll.add(new Class(classNumber)); 126 } 127 int scoreOrdinary = Integer.parseInt(infos[3]); 128 int scoreLast = Integer.parseInt(infos[4]); 129 int ID = Integer.parseInt(infos[0]); 130 Student student; 131 if(getAppointCourse(infos[2]) != null && // 是否存在该课程且课程考核方式正确、成绩合法 132 getAppointCourse(infos[2]).getAssessment().equals("考试") && 133 scoreLast >= 0 && scoreLast <= 100 && infos.length == 5 && 134 scoreOrdinary >= 0 && scoreOrdinary <= 100) { 135 if(getAppointClass(classNumber).getStudents().size() == 0 || 136 getAppointClass(classNumber).getAppointStudent(ID, infos[1]) == null){ 137 student = new Student(ID, infos[1]); 138 student.getCourseAll().add(new Course(infos[2], getAppointCourse(infos[2]).getAttribute(), "考试")); 139 Score temp = student.getCourseAll().get(student.getCourseAll().size() - 1).getScore();// 引用 140 temp.setScoreOrdinary(scoreOrdinary); 141 temp.setScoreLast(scoreLast); 142 temp.calculateScoreEnd(); 143 getAppointClass(classNumber).StudentTestNumber++; 144 getAppointClass(classNumber).getStudents().add(student); 145 } 146 else { 147 student = getAppointClass(classNumber).getAppointStudent(ID, infos[1]); // 引用 148 if(student.getAppointCourse(infos[2]) == null) { 149 student.getCourseAll().add(new Course(infos[2], getAppointCourse(infos[2]).getAttribute(), "考试")); 150 student.getAppointCourse(infos[2]).getScore().setScoreOrdinary(scoreOrdinary); 151 student.getAppointCourse(infos[2]).getScore().setScoreLast(scoreLast); 152 student.getAppointCourse(infos[2]).getScore().calculateScoreEnd(); 153 } 154 } 155 if(getAppointCourse(infos[2]).studentTestNumber == 0) 156 getAppointCourse(infos[2]).getScore().setScoreOrdinary(0); 157 getAppointCourse(infos[2]).studentTestNumber++; 158 Score temp = getAppointCourse(infos[2]).getScore(); // 引用 159 getAppointCourse(infos[2]).getScore().setScoreOrdinary(getAppointCourse(infos[2]).getScore().getScoreOrdinary() 160 + student.getCourseAll().get(student.getCourseAll().size() - 1).getScore().getScoreOrdinary()); 161 getAppointCourse(infos[2]).getScore().setScoreLast(getAppointCourse(infos[2]).getScore().getScoreLast() 162 + student.getCourseAll().get(student.getCourseAll().size() - 1).getScore().getScoreLast()); 163 getAppointCourse(infos[2]).getScore().calculateScoreEnd(); 164 } 165 else if(getAppointCourse(infos[2]) == null && infos.length == 5) { 166 System.out.println(infos[2] + " does not exist"); 167 student = new Student(ID, infos[1]); 168 student.calculateAverageStudent(); 169 getAppointClass(classNumber).getStudents().add(student); 170 } 171 else if(getAppointCourse(infos[2]).getAssessment().equals("考察") && infos.length == 5) { 172 student = new Student(ID, infos[1]); 173 System.out.println(infos[0] + " " + infos[1] + " : access mode mismatch"); 174 getAppointClass(classNumber).getStudents().add(student); 175 } 176 else { 177 System.out.println("wrong format"); 178 } 179 } 180 } 181 for(int i = 0; i < classAll.size(); i++) { // 给班级排序 182 for(int j = i+1; j < classAll.size(); j++) { 183 if(classAll.get(i).getClassNumber() > classAll.get(j).getClassNumber()) { 184 Collections.swap(classAll, i, j); 185 } 186 } 187 } 188 for(int i = 0; i < classAll.size(); i++) { // 输出学生成绩 189 classAll.get(i).Sort(); 190 for(int j = 0; j < classAll.get(i).getStudents().size(); j++) { 191 Student student = classAll.get(i).getStudents().get(j); // 引用 192 student.calculateAverageStudent(); 193 if(student.getAverageStudent() == -1) { 194 System.out.println(student.getID() + " " + student.getName() + " did not take any exams"); 195 } 196 else { 197 double score = student.getAverageStudent(); 198 if(student.courseTestNumber != 0) 199 score /= (double)student.courseTestNumber; 200 System.out.println(student.getID() + " " + student.getName() + " " + (int)score); 201 } 202 } 203 } 204 String courseCorrect[] = new String[courseAll.size()]; 205 for(int i = 0; i < courseAll.size(); i++) { 206 courseCorrect[i] = new String(); 207 courseCorrect[i] = courseAll.get(i).getName(); 208 } 209 Comparator<Object> com = Collator.getInstance(java.util.Locale.CHINA); 210 Arrays.sort(courseCorrect, com); // 排序 211 for(int i = 0; i < courseAll.size(); i++) { 212 Collections.swap(courseAll, i, courseAll.indexOf(getAppointCourse(courseCorrect[i]))); 213 } 214 for(int i = 0; i < courseAll.size(); i++) { // 输出每门课程成绩 215 if(courseAll.get(i).getScore().getScoreEnd() == -1) { 216 System.out.println(courseAll.get(i).getName() + " has no grades yet"); 217 } 218 else { 219 String temp = courseAll.get(i).getName() + " "; 220 if(courseAll.get(i).getScore().getScoreOrdinary() != -1) { 221 temp += (int)(courseAll.get(i).getScore().getScoreOrdinary() / (double)courseAll.get(i).studentTestNumber) + " "; 222 } 223 temp += (int)(courseAll.get(i).getScore().getScoreLast() / (double)courseAll.get(i).studentTestNumber) + " " 224 + (int)(courseAll.get(i).getScore().getScoreEnd() / (double)courseAll.get(i).studentTestNumber); 225 System.out.println(temp); 226 } 227 } 228 for(int i = 0; i < classAll.size(); i++) { // 输出每班的成绩 229 classAll.get(i).calculateGcdMax(); 230 classAll.get(i).calculateAverageClass(); 231 if(classAll.get(i).getAverageClass() == -1 && classAll.get(i).getStudents().size() != 0) 232 System.out.println(classAll.get(i).getClassNumber() + " has no grades yet"); 233 else if(classAll.get(i).getStudents().size() != 0) { 234 double score = classAll.get(i).getAverageClass(); 235 if(classAll.get(i).StudentTestNumber != 0) 236 score /= classAll.get(i).StudentTestNumber * classAll.get(i).gcdMax; 237 System.out.println(classAll.get(i).getClassNumber() + " " 238 + (int)score); 239 } 240 } 241 input.close(); 242 } 243 public Course getAppointCourse(String name) { 244 for(int i = 0; i < courseAll.size(); i++) { 245 if(courseAll.get(i).getName().equals(name)) 246 return courseAll.get(i); 247 } 248 return null; 249 } 250 public Class getAppointClass(int classNumber) { 251 for(int i = 0; i < classAll.size(); i++) { 252 if(classAll.get(i).getClassNumber() == classNumber) 253 return classAll.get(i); 254 } 255 return null; 256 } 257 public boolean isNumeric(String checkString) { 258 for(int i = 0; i < checkString.length(); i++) 259 if(checkString.charAt(i) < '0' || checkString.charAt(i) > '9') 260 return false; 261 return true; 262 } 263 } 264 265 class Course { 266 private String name = new String(); 267 private String attribute = new String(); // 课程性质 268 private String assessment = new String(); // 考核方式 269 private Score score; 270 protected int studentTestNumber = 0; 271 public Course() {} 272 public Course(String name, String attribute) { 273 this.name = name; 274 this.attribute = attribute; 275 if(attribute.equals("必修")) { 276 score = new scoreExamination(); 277 this.assessment = "考试"; 278 } 279 } 280 public Course(String name, String attribute, String assessment) { 281 this.name = name; 282 this.attribute = attribute; 283 this.assessment = assessment; 284 if(assessment.equals("考试")) { 285 score = new scoreExamination(); 286 } 287 else if(assessment.equals("考察")) { 288 score = new scoreInvestigate(); 289 } 290 } 291 public String getName() { 292 return name; 293 } 294 public String getAttribute() { 295 return attribute; 296 } 297 public String getAssessment() { 298 return assessment; 299 } 300 public Score getScore() { 301 return score; 302 } 303 } 304 305 abstract class Score { 306 private double scoreLast = 0; 307 private double scoreEnd = -1; // 最终成绩 308 private double scoreOrdinary = -1; 309 public Score() {} 310 public abstract void calculateScoreEnd(); 311 public double getScoreEnd() { 312 return scoreEnd; 313 } 314 public void setScoreEnd(double scoreEnd) { 315 this.scoreEnd = scoreEnd; 316 } 317 public double getScoreLast() { 318 return scoreLast; 319 } 320 public void setScoreLast(double scoreLast) { 321 this.scoreLast = scoreLast; 322 } 323 public double getScoreOrdinary() { 324 return scoreOrdinary; 325 } 326 public void setScoreOrdinary(double scoreOrdinary) { 327 this.scoreOrdinary = scoreOrdinary; 328 } 329 } 330 331 class scoreExamination extends Score { 332 public scoreExamination() {} 333 public scoreExamination(double scoreOrdinary, double scoreLast) { 334 setScoreLast(scoreLast); 335 setScoreOrdinary(scoreOrdinary); 336 } 337 public void calculateScoreEnd() { 338 setScoreEnd(getScoreOrdinary() * 0.3 + getScoreLast() * 0.7); 339 } 340 } 341 342 class scoreInvestigate extends Score { 343 public scoreInvestigate() {} 344 public scoreInvestigate(double scoreEnd) { 345 setScoreEnd(scoreEnd); 346 } 347 public void calculateScoreEnd() { 348 setScoreEnd(getScoreLast()); 349 } 350 } 351 352 class Class { 353 private ArrayList<Student> students = new ArrayList<Student>(); 354 private int classNumber = 0; 355 private double averageClass = -1; 356 protected int StudentTestNumber = 0; 357 protected int gcdMax = 1; 358 public Class() {} 359 public Class(int classNumber) { 360 this.classNumber = classNumber; 361 } 362 public void calculateGcdMax(){ 363 for(int i = 0; i < students.size(); i++){ 364 Student temp = students.get(i); 365 for(int j = 0; j < temp.getCourseAll().size(); j++){ 366 if(temp.courseTestNumber != 0) 367 gcdMax *= temp.courseTestNumber; 368 } 369 } 370 } 371 public void Sort() { // 学生排序 372 for(int i = 0; i < students.size(); i++) { 373 for(int j = i+1; j < students.size(); j++) { 374 if(students.get(i).getID() > students.get(j).getID()) { 375 Collections.swap(students, i, j); 376 } 377 } 378 } 379 } 380 public Student getAppointStudent(int ID, String nameStudent) { 381 for(int i = 0; i < students.size(); i++) { 382 if(students.get(i).getID() == ID && students.get(i).getName().equals(nameStudent)) 383 return students.get(i); 384 } 385 return null; 386 } 387 public void calculateAverageClass() { 388 double average = 0; boolean flag = false; 389 for(int i = 0; i < students.size(); i++) { 390 if(students.get(i).getAverageStudent() != -1){ 391 average += (students.get(i).getAverageStudent() * gcdMax) / students.get(i).courseTestNumber; 392 flag = true; 393 } 394 } 395 if(flag) 396 averageClass = average; 397 } 398 public int getClassNumber() { 399 return classNumber; 400 } 401 public double getAverageClass() { 402 return averageClass; 403 } 404 public ArrayList<Student> getStudents() { 405 return students; 406 } 407 } 408 class Student { 409 private String name = new String(); 410 private int ID; 411 private double averageStudent = -1; 412 private ArrayList<Course> courseAll = new ArrayList<Course>(); 413 protected int courseTestNumber = 0; 414 public Student() {} 415 public Student(int ID, String name) { 416 this.name = name; 417 this.ID = ID; 418 } 419 public void calculateAverageStudent() { 420 double average = 0; 421 for(int i = 0; i < courseAll.size(); i++) { 422 if(courseAll.get(i).getScore().getScoreEnd() != -1) { 423 average += courseAll.get(i).getScore().getScoreEnd(); 424 courseTestNumber++; 425 } 426 } 427 if(courseTestNumber != 0) 428 averageStudent = average; 429 } 430 public Course getAppointCourse(String nameCourse) { 431 for(int i = 0; i < courseAll.size(); i++) { 432 if(this.courseAll.get(i).getName().equals(nameCourse)) { 433 return this.courseAll.get(i); 434 } 435 } 436 return null; 437 } 438 public String getName() { 439 return name; 440 } 441 public int getID() { 442 return ID; 443 } 444 public double getAverageStudent() { 445 return averageStudent; 446 } 447 public ArrayList<Course> getCourseAll() { 448 return courseAll; 449 } 450 }课程成绩统计程序-1
设计类图:
SourceMonitor分析结果:
小结:本题是课程成绩统计程序系列的第一道题,是该系列最基础的一道题,但是即使是最基础的,刚开始设计起来还是存在一定的难度,最后PTA的分数也只拿到了91分。
本题的难点在于如何计算平均分和如何对成绩排序,在设计上并没有太大难度,因为已经给出了参考的设计类图,加上之前的OOP训练已经能大致知道该怎么设计类与类之间的关系了。在成绩如何排序这块,学生和班级的排序并不难,按学号大小和班级大小进行排序即可,主要难度在于课程成绩排序的问题上。在该题目的要求中,要求按课程名称的字符顺序输出,刚开始看到的时候有些懵逼,字符顺序?可是如果夹杂着中文和英文呢?后面试错试了很多次,最终确认了中文和英文比较是要先将中文转化为汉语拼音再与英文比较进行排序的,这里使用的是这段代码实现的成绩排序操作:
;再一个难点就是平均分的计算了,在这一块,踩得坑数不胜数。因为存在误差,所以计算出的成绩总会差那么个一两分无法通过测试节点。这道题PTA只拿到了91分我认为原因就在于平均分的计算,因为在该道题的迭代版-2中将平均分的算法进行修改后拿到了更高的分数。同时我也发现了在-1中的算法中,似乎与题目的要求有所出入,题目中所说的是 :平均分的计算方法为累加所有符合条件的单个成绩,最后除以总数。这里的单个成绩,我认为是已经舍去了小数部分的单个成绩,因为在该道题目中我并没有进行舍去成绩的小数部分进行平均分的计算,而在迭代版中进行修改后,其测试节点中并没有出现太大的问题不能通过。
总的来说,在这道题中,我的收获还是很大的,我学会了如何较为系统性的设计一个解决较为复杂问题的程序,同时对于如何设计算法来避免误差有了更深入的了解。
2.课程成绩统计程序-2
在课程成绩统计程序-1的基础上加入了如下要求:
一、
课程成绩统计程序-3在第二次的基础上修改了计算总成绩的方式;
二、
修改类结构,将成绩类的继承关系改为组合关系,成绩信息由课程成绩类和分项成绩类组成,课程成绩类组合分项成绩类,分项成绩类由成绩分值和权重两个属性构成。完成课程成绩统计程序-2、3两次程序后,比较继承和组 合关系的区别。思考一下哪一种关系运用上更灵活,更能够适应变更。
三、
增加了实验课程,实验的总成绩等于课程每次实验成绩乘以权重后累加而得。课程权重值在录入课程信息时输入。(注意:所有分项成绩的权重之和应当等于1)
四、
课程信息包括:课程名称、课程性质、考核方式、分项成绩数量、每个分项成绩的权重。
考试课信息格式:课程名称+英文空格+课程性质+英文空格+考核方式+英文空格+平时成绩的权重+英文空格+期末成绩的权重
考察课信息格式:课程名称+英文空格+课程性质+英文空格+考核方式
实验课程信息格式:课程名称+英文空格+课程性质+英文空格+考核方式+英文空格+分项成绩数量n+英文空格+分项成绩1的权重+英文空格+。。。+英文空格+分项成绩n的权重
五、
实验课程成绩信息包括:学号、姓名、课程名称、每次成绩{在系列-2的基础上去掉了(实验次数),实验次数要和实验课程信息中输入的分项成绩数量保持一致}
六、
为避免四舍五入误差,
计算单个成绩时,分项成绩乘以权重后要保留小数位,计算总成绩时,累加所有分项成绩的权重分以后,再去掉小数位。
学生总成绩/整个班/课程平均分的计算方法为累加所有符合条件的单个成绩,最后除以总数。
七、
单门课程成绩按课程名称的字符顺序输出
课程成绩输出格式:课程名称+英文空格+总成绩平均分
八、
如果解析实验课程信息时,输入的分项成绩数量值和分项成绩权重的个数不匹配,输出:课程名称+" : number of scores does not match"
如果解析考试课、实验课时,分项成绩权重值的总和不等于1,输出:课程名称+" : weight value error"
源代码:
1 import java.util.Scanner; 2 import java.text.Collator; 3 import java.util.ArrayList; 4 import java.util.Arrays; 5 import java.util.Collections; 6 import java.util.Comparator; 7 8 public class Main{ 9 public static void main(String args[]) { 10 SelectCourseCenter selectCourseCenter = new SelectCourseCenter(); 11 selectCourseCenter.start(); 12 } 13 } 14 15 class SelectCourseCenter { 16 private ArrayList<Class> classAll = new ArrayList<Class>(); 17 private ArrayList<Course> courseAll = new ArrayList<Course>(); 18 public void start() { 19 Scanner input = new Scanner(System.in); 20 while(true) { 21 String information = input.nextLine(); 22 String infos[] = information.split(" "); 23 if(information.equals("end")) 24 break; 25 if(infos[2].equals("实验") && infos.length > 4) { // 实验课程 26 if(infos[0].length() > 10) { 27 System.out.println("wrong format"); 28 continue; 29 } 30 if(getAppointCourse(infos[0]) != null) 31 continue; 32 if(!infos[1].equals("实验")) { 33 System.out.println(infos[0] + " : course type & access mode mismatch"); 34 Course courseExperiment = new Course(infos[0], infos[1], "实验"); 35 courseAll.add(courseExperiment); 36 continue; 37 } 38 int experimentNumber = Integer.parseInt(infos[3]); 39 if(experimentNumber < 4) { 40 System.out.println("wrong format"); 41 } 42 else { 43 if(infos.length - 4 != experimentNumber) { 44 System.out.println(infos[0] + " : number of scores does not match"); 45 } 46 else if(infos.length - 4 > 9) { 47 System.out.println("wrong format"); 48 } 49 else { 50 ArrayList<Float> experimentPercent = new ArrayList<Float>(); 51 float checkIsOne = 0; 52 for(int i = 0; i < experimentNumber; i++) { 53 float percent = Float.parseFloat(infos[i + 4]); 54 checkIsOne += percent; 55 experimentPercent.add(percent); 56 } 57 if(Math.abs(checkIsOne - 1) > 0.0001) { 58 System.out.println(infos[0] + " : weight value error"); 59 } 60 else { 61 Course courseExperiment = new Course(infos[0], infos[1], "实验"); 62 courseExperiment.getScore().getScoreExperiment().scorePercent = experimentPercent; 63 courseAll.add(courseExperiment); 64 } 65 } 66 } 67 continue; 68 } 69 if(infos[2].equals("考试") && infos.length >= 5) { // 考试课程 70 if(infos[0].length() > 10) { 71 System.out.println("wrong format"); 72 continue; 73 } 74 if(getAppointCourse(infos[0]) != null) 75 continue; 76 if(!infos[1].equals("必修")) { 77 System.out.println(infos[0] + " : course type & access mode mismatch"); 78 Course courseExamination = new Course(infos[0], infos[1], infos[2]); 79 courseAll.add(courseExamination); 80 } 81 else { 82 float percentOrdinary = Float.parseFloat(infos[3]); 83 float percentLast = Float.parseFloat(infos[4]); 84 if(percentOrdinary + percentLast != 1) { 85 System.out.println(infos[0] + " : weight value error"); 86 } 87 else { 88 Course courseExamination = new Course(infos[0], infos[1], infos[2]); 89 courseExamination.getScore().getScoreExamination().setPercentOrdinary(percentOrdinary); 90 courseExamination.getScore().getScoreExamination().setPercentLast(percentLast); 91 courseAll.add(courseExamination); 92 } 93 } 94 continue; 95 } 96 else if(infos.length == 3) { // 考察课程 97 if(infos[0].length() > 10) { 98 System.out.println("wrong format"); 99 } 100 else{ 101 if((infos[1].equals("必修") && !infos[2].equals("考试")) || (infos[1].equals("实验") && !infos[2].equals("实验"))) { 102 System.out.println(infos[0] + " : course type & access mode mismatch"); 103 } 104 else if(infos[1].equals("必修") && infos[2].equals("考试")) { 105 System.out.println(infos[0] + " : weight value error"); 106 } 107 else if(getAppointCourse(infos[0]) != null) { 108 } 109 else if(infos[1].equals("选修") && infos[2].equals("考察")){ 110 courseAll.add(new Course(infos[0], infos[1], infos[2])); 111 } 112 else { 113 System.out.println("wrong format"); 114 } 115 } 116 } 117 else if(infos.length == 4) { // 进行考察的成绩分析 118 if(infos[0].length() != 8 || infos[1].length() > 10 || infos[2].length() > 10) { 119 System.out.println("wrong format"); 120 continue; 121 } 122 int classNumber = Integer.parseInt(infos[0].substring(0, 6)); 123 if(classAll.size() == 0 || getAppointClass(classNumber) == null) { // 是否存在该班级 124 classAll.add(new Class(classNumber)); 125 } 126 int scoreLast = Integer.parseInt(infos[3]); 127 int ID = Integer.parseInt(infos[0]); 128 Student student; 129 if(getAppointCourse(infos[2]) != null && 130 getAppointCourse(infos[2]).getAssessment().equals("考察") && 131 scoreLast >= 0 && scoreLast <= 100) { 132 if(getAppointClass(classNumber).getStudents().size() == 0 || 133 getAppointClass(classNumber).getAppointStudent(ID, infos[1]) == null){ // 是否存在学生 134 student = new Student(ID, infos[1]); 135 student.getCourseAll().add(new Course(infos[2] 136 , getAppointCourse(infos[2]).getAttribute() 137 , getAppointCourse(infos[2]).getAssessment())); 138 student.getCourseAll().get(student.getCourseAll().size() - 1).getScore().getScoreInvestigate().setScoreLast(scoreLast); 139 getAppointClass(classNumber).StudentTestNumber++; 140 getAppointClass(classNumber).getStudents().add(student); 141 } 142 else { 143 student = getAppointClass(classNumber).getAppointStudent(ID, infos[1]); // 引用 144 if(student.getAppointCourse(infos[2]) == null){ 145 student.getCourseAll().add(new Course(infos[2] 146 , getAppointCourse(infos[2]).getAttribute() 147 , getAppointCourse(infos[2]).getAssessment())); 148 student.getAppointCourse(infos[2]).getScore().getScoreInvestigate().setScoreLast(scoreLast); 149 } 150 } 151 getAppointCourse(infos[2]).studentTestNumber++; // 参与考试学生人数+1 152 getAppointCourse(infos[2]).getScore().getScoreInvestigate().setScoreLast(getAppointCourse(infos[2]).getScore().getScoreInvestigate().getScoreLast() 153 + student.getCourseAll().get(student.getCourseAll().size() - 1).getScore().getScoreInvestigate().getScoreLast()); 154 } 155 else if(getAppointCourse(infos[2]) == null) { 156 if(scoreLast >= 0 && scoreLast <= 100){ 157 System.out.println(infos[2] + " does not exist"); 158 student = new Student(ID, infos[1]); 159 getAppointClass(classNumber).getStudents().add(student); 160 } 161 } 162 else if(getAppointCourse(infos[2]).getAssessment().equals("考试") || getAppointCourse(infos[2]).getAssessment().equals("实验")) { 163 student = new Student(ID, infos[1]); 164 System.out.println(infos[0] + " " + infos[1] + " : access mode mismatch"); 165 getAppointClass(classNumber).getStudents().add(student); 166 } 167 else { 168 System.out.println("wrong format"); 169 } 170 if(!(scoreLast >= 0 && scoreLast <= 100)) { 171 System.out.println("wrong format"); 172 } 173 } 174 else if(infos.length == 5) { // 进行考试的成绩分析 175 if(infos[0].length() != 8 || infos[1].length() > 10 || infos[2].length() > 10) { 176 System.out.println("wrong format"); 177 continue; 178 } 179 int classNumber = Integer.parseInt(infos[0].substring(0, 6)); 180 if(classAll.size() == 0 || getAppointClass(classNumber) == null) { 181 classAll.add(new Class(classNumber)); 182 } 183 int scoreOrdinary = Integer.parseInt(infos[3]); 184 int scoreLast = Integer.parseInt(infos[4]); 185 int ID = Integer.parseInt(infos[0]); 186 Student student; 187 if(getAppointCourse(infos[2]) != null && 188 getAppointCourse(infos[2]).getAssessment().equals("考试") && 189 scoreLast >= 0 && scoreLast <= 100 && 190 scoreOrdinary >= 0 && scoreOrdinary <= 100) { // 是否合法 191 if(getAppointClass(classNumber).getStudents().size() == 0 || 192 getAppointClass(classNumber).getAppointStudent(ID, infos[1]) == null){ 193 student = new Student(ID, infos[1]); 194 student.getCourseAll().add(new Course(infos[2], getAppointCourse(infos[2]).getAttribute(), "考试")); 195 Score temp = student.getCourseAll().get(student.getCourseAll().size() - 1).getScore();// 引用 196 temp.getScoreExamination().setScoreOrdinary(scoreOrdinary); 197 temp.getScoreExamination().setScoreLast(scoreLast); 198 temp.getScoreExamination().setPercentLast(getAppointCourse(infos[2]).getScore().getScoreExamination().getPercentLast()); 199 temp.getScoreExamination().setPercentOrdinary(getAppointCourse(infos[2]).getScore().getScoreExamination().getPercentOrdinary()); 200 getAppointClass(classNumber).StudentTestNumber++; 201 getAppointClass(classNumber).getStudents().add(student); 202 } 203 else { 204 student = getAppointClass(classNumber).getAppointStudent(ID, infos[1]); 205 if(student.getAppointCourse(infos[2]) == null) { 206 student.getCourseAll().add(new Course(infos[2], getAppointCourse(infos[2]).getAttribute(), "考试")); 207 scoreExamination temp = student.getAppointCourse(infos[2]).getScore().getScoreExamination(); 208 temp.setScoreOrdinary(scoreOrdinary); 209 temp.setScoreLast(scoreLast); 210 temp.setPercentLast(getAppointCourse(infos[2]).getScore().getScoreExamination().getPercentLast()); 211 temp.setPercentOrdinary(getAppointCourse(infos[2]).getScore().getScoreExamination().getPercentOrdinary()); 212 } 213 } 214 if(getAppointCourse(infos[2]).studentTestNumber == 0){ 215 getAppointCourse(infos[2]).getScore().getScoreExamination().setScoreOrdinary(0); 216 getAppointCourse(infos[2]).getScore().setScoreEnd(0); 217 } 218 getAppointCourse(infos[2]).studentTestNumber++; 219 getAppointCourse(infos[2]).getScore().getScoreExamination(). 220 setScoreOrdinary(getAppointCourse(infos[2]).getScore().getScoreExamination().getScoreOrdinary() 221 + student.getCourseAll().get(student.getCourseAll().size() - 1). 222 getScore().getScoreExamination().getScoreOrdinary()); 223 getAppointCourse(infos[2]).getScore().getScoreExamination(). 224 setScoreLast(getAppointCourse(infos[2]).getScore().getScoreExamination().getScoreLast() 225 + student.getCourseAll().get(student.getCourseAll().size() - 1). 226 getScore().getScoreExamination().getScoreLast()); 227 getAppointCourse(infos[2]).getScore().setScoreEnd(getAppointCourse(infos[2]).getScore().getScoreEnd() 228 + (int)student.getCourseAll().get(student.getCourseAll().size() - 1).getScore().getScoreEnd()); 229 } 230 else if(getAppointCourse(infos[2]) == null) { 231 if(scoreLast >= 0 && scoreLast <= 100 && 232 scoreOrdinary >= 0 && scoreOrdinary <= 100) { 233 System.out.println(infos[2] + " does not exist"); 234 student = new Student(ID, infos[1]); 235 student.calculateAverageStudent(); 236 getAppointClass(classNumber).getStudents().add(student); 237 } 238 } 239 else if(getAppointCourse(infos[2]).getAssessment().equals("考察") || getAppointCourse(infos[2]).getAssessment().equals("实验")) { 240 student = new Student(ID, infos[1]); 241 System.out.println(infos[0] + " " + infos[1] + " : access mode mismatch"); 242 getAppointClass(classNumber).getStudents().add(student); 243 } 244 else { 245 System.out.println("wrong format"); 246 } 247 if(scoreLast < 0 || scoreLast > 100 || 248 scoreOrdinary < 0 || scoreOrdinary > 100) { 249 System.out.println("wrong format"); 250 } 251 } 252 else if((infos.length > 5 && infos.length < 7)) { // 进行错误的实验课程成绩分析 253 ArrayList<Integer> scoreArray = new ArrayList<Integer>(); 254 for(int i = 3; i < infos.length; i++) { 255 scoreArray.add(Integer.parseInt(infos[i])); 256 } 257 if(infos[0].length() != 8 || infos[1].length() > 10 || infos[2].length() > 10 258 || scoreArray.size() < 4) { 259 System.out.println("wrong format"); 260 continue; 261 } 262 int classNumber = Integer.parseInt(infos[0].substring(0, 6)); 263 if(classAll.size() == 0 || getAppointClass(classNumber) == null) { 264 classAll.add(new Class(classNumber)); 265 } 266 int ID = Integer.parseInt(infos[0]); 267 Student student; 268 if(getAppointCourse(infos[2]) != null) { 269 student = new Student(ID, infos[1]); 270 System.out.println(infos[0] + " " + infos[1] + " : access mode mismatch"); 271 getAppointClass(classNumber).getStudents().add(student); 272 } 273 else if(getAppointCourse(infos[2]) == null) { 274 if(checkScoreExperiment(scoreArray)){ 275 System.out.println(infos[2] + " does not exist"); 276 student = new Student(ID, infos[1]); 277 getAppointClass(classNumber).getStudents().add(student); 278 } 279 } 280 if(!checkScoreExperiment(scoreArray)) { 281 System.out.println("wrong format"); 282 } 283 } 284 else if(infos.length >= 7 && infos.length <= 12) { // 进行实验课程成绩分析 285 ArrayList<Integer> scoreArray = new ArrayList<Integer>(); 286 for(int i = 3; i < infos.length; i++) { 287 scoreArray.add(Integer.parseInt(infos[i])); 288 } 289 if(infos[0].length() != 8 || infos[1].length() > 10 || infos[2].length() > 10) { 290 System.out.println("wrong format"); 291 continue; 292 } 293 int classNumber = Integer.parseInt(infos[0].substring(0, 6)); 294 if(classAll.size() == 0 || getAppointClass(classNumber) == null) { 295 classAll.add(new Class(classNumber)); 296 } 297 int ID = Integer.parseInt(infos[0]); 298 Student student; 299 if(getAppointCourse(infos[2]) != null && 300 getAppointCourse(infos[2]).getAssessment().equals("实验") && 301 checkScoreExperiment(scoreArray)) { 302 if(scoreArray.size() != getAppointCourse(infos[2]).getScore().getScoreExperiment().scorePercent.size()) { 303 student = new Student(ID, infos[1]); 304 System.out.println(infos[0] + " " + infos[1] + " : access mode mismatch"); 305 getAppointClass(classNumber).getStudents().add(student); 306 continue; 307 } 308 if(getAppointClass(classNumber).getStudents().size() == 0 || 309 getAppointClass(classNumber).getAppointStudent(ID, infos[1]) == null){ 310 student = new Student(ID, infos[1]); 311 student.getCourseAll().add(new Course(infos[2], "实验", "实验")); 312 Score temp = student.getCourseAll().get(student.getCourseAll().size() - 1).getScore(); 313 temp.getScoreExperiment().scoreArrays = scoreArray; // 引用 314 temp.getScoreExperiment().scorePercent = getAppointCourse(infos[2]).getScore().getScoreExperiment().scorePercent; // 引用 315 temp.getScoreExperiment().calculateScoreEnd(); 316 getAppointClass(classNumber).StudentTestNumber++; 317 getAppointClass(classNumber).getStudents().add(student); 318 } 319 else { 320 student = getAppointClass(classNumber).getAppointStudent(ID, infos[1]); 321 if(student.getAppointCourse(infos[2]) == null) { 322 student.getCourseAll().add(new Course(infos[2], "实验", "实验")); 323 scoreExperiment temp = new scoreExperiment(); // 引用 324 temp.scoreArrays = scoreArray; 325 temp.scorePercent = getAppointCourse(infos[2]).getScore().getScoreExperiment().scorePercent; // 引用 326 temp.calculateScoreEnd(); 327 } 328 } 329 if(getAppointCourse(infos[2]).getScore().getScoreEnd() == -1) { 330 getAppointCourse(infos[2]).getScore().setScoreEnd(0); 331 } 332 getAppointCourse(infos[2]).studentTestNumber++; 333 getAppointCourse(infos[2]).getScore().setScoreEnd(getAppointCourse(infos[2]).getScore().getScoreEnd() 334 + (int)student.getCourseAll().get(student.getCourseAll().size() - 1).getScore().getScoreEnd()); 335 } 336 else if(getAppointCourse(infos[2]) == null) { 337 if(checkScoreExperiment(scoreArray)){ 338 System.out.println(infos[2] + " does not exist"); 339 student = new Student(ID, infos[1]); 340 getAppointClass(classNumber).getStudents().add(student); 341 } 342 } 343 else if(getAppointCourse(infos[2]) != null) { 344 if(getAppointCourse(infos[2]).getAssessment().equals("考察") || getAppointCourse(infos[2]).getAssessment().equals("考试")) { 345 student = new Student(ID, infos[1]); 346 System.out.println(infos[0] + " " + infos[1] + " : access mode mismatch"); 347 getAppointClass(classNumber).getStudents().add(student); 348 } 349 } 350 if(!checkScoreExperiment(scoreArray)) { 351 System.out.println("wrong format"); 352 } 353 } 354 } 355 for(int i = 0; i < classAll.size(); i++) { // 给班级排序 356 for(int j = i+1; j < classAll.size(); j++) { 357 if(classAll.get(i).getClassNumber() > classAll.get(j).getClassNumber()) { 358 Collections.swap(classAll, i, j); 359 } 360 } 361 } 362 for(int i = 0; i < classAll.size(); i++) { // 给学生排序 363 classAll.get(i).Sort(); 364 for(int j = 0; j < classAll.get(i).getStudents().size(); j++) { 365 Student student = classAll.get(i).getStudents().get(j); 366 student.calculateAverageStudent(); 367 if(student.getAverageStudent() == -1) { 368 System.out.println(student.getID() + " " + student.getName() + " did not take any exams"); 369 } 370 else { 371 float score = student.getAverageStudent(); 372 if(student.courseTestNumber != 0) 373 score /= student.courseTestNumber; 374 System.out.println(student.getID() + " " + student.getName() + " " + (int)score); 375 } 376 } 377 } 378 String courseCorrect[] = new String[courseAll.size()]; 379 for(int i = 0; i < courseAll.size(); i++) { 380 courseCorrect[i] = new String(); 381 courseCorrect[i] = courseAll.get(i).getName(); 382 } 383 Arrays.sort(courseCorrect, Collator.getInstance(java.util.Locale.CHINA)); // 给课程排序 384 for(int i = 0; i < courseAll.size(); i++) { 385 Collections.swap(courseAll, i, courseAll.indexOf(getAppointCourse(courseCorrect[i]))); 386 } 387 for(int i = 0; i < courseAll.size(); i++) { 388 if(courseAll.get(i).getScore().getScoreEnd() == -1) { 389 System.out.println(courseAll.get(i).getName() + " has no grades yet"); 390 } 391 else { 392 String temp = courseAll.get(i).getName() + " "; 393 temp += (int)(courseAll.get(i).getScore().getScoreEnd() / courseAll.get(i).studentTestNumber); 394 System.out.println(temp); 395 } 396 } 397 for(int i = 0; i < classAll.size(); i++) { // 班级平均分 398 classAll.get(i).calculateAverageClass(); 399 if(classAll.get(i).getAverageClass() == -1 && classAll.get(i).getStudents().size() != 0) 400 System.out.println(classAll.get(i).getClassNumber() + " has no grades yet"); 401 else if(classAll.get(i).getStudents().size() != 0) { 402 float score = classAll.get(i).getAverageClass(); 403 System.out.println(classAll.get(i).getClassNumber() + " " + (int)(score)); 404 } 405 } 406 input.close(); 407 } 408 public boolean checkScoreExperiment(ArrayList<Integer> scoreArray) { // 实验成绩是否合法 409 for(int score : scoreArray) 410 if(score < 0 || score > 100) 411 return false; 412 return true; 413 } 414 public Course getAppointCourse(String name) { // 查找指定课程 415 for(int i = 0; i < courseAll.size(); i++) { 416 if(courseAll.get(i).getName().equals(name)) 417 return courseAll.get(i); 418 } 419 return null; 420 } 421 public Class getAppointClass(int classNumber) { // 查找指定班级 422 for(int i = 0; i < classAll.size(); i++) { 423 if(classAll.get(i).getClassNumber() == classNumber) 424 return classAll.get(i); 425 } 426 return null; 427 } 428 } 429 430 class Course { 431 private String name = new String(); 432 private String attribute = new String(); // 课程性质 433 private String assessment = new String(); // 考核方式 434 private Score score; 435 protected int studentTestNumber = 0; // 参与该课程考试人数 436 public Course() {} 437 public Course(String name, String attribute) { 438 this.name = name; 439 this.attribute = attribute; 440 if(attribute.equals("必修")) { 441 score = new Score("考试"); 442 this.assessment = "考试"; 443 } 444 } 445 public Course(String name, String attribute, String assessment) { 446 this.name = name; 447 this.attribute = attribute; 448 this.assessment = assessment; 449 if(assessment.equals("考试")) { 450 score = new Score("考试"); 451 } 452 else if(assessment.equals("考察")) { 453 score = new Score("考察"); 454 } 455 else if(assessment.equals("实验")) { 456 score = new Score("实验"); 457 } 458 } 459 public String getName() { 460 return name; 461 } 462 public String getAttribute() { 463 return attribute; 464 } 465 public String getAssessment() { 466 return assessment; 467 } 468 public Score getScore() { 469 return score; 470 } 471 } 472 473 class Score { // 分数 474 private float scoreEnd = -1; // 最终成绩 475 private String type = new String(); // 分数类型 476 private scoreExamination examination; 477 private scoreInvestigate investigate; 478 private scoreExperiment experiment; 479 480 public Score(String type) { 481 this.type = type; 482 if(type.equals("考试")) { 483 examination = new scoreExamination(); 484 } 485 else if(type.equals("考察")) { 486 investigate = new scoreInvestigate(); 487 } 488 else if(type.equals("实验")) { 489 experiment = new scoreExperiment(); 490 } 491 } 492 public scoreExamination getScoreExamination() { 493 return this.examination; 494 } 495 public scoreInvestigate getScoreInvestigate() { 496 return this.investigate; 497 } 498 public scoreExperiment getScoreExperiment() { 499 return this.experiment; 500 } 501 public void setScoreEnd(float scoreEnd) { 502 this.scoreEnd = scoreEnd; 503 } 504 public float getScoreEnd() { 505 if(this.scoreEnd == -1) { 506 if(type.equals("考试")) { 507 this.scoreEnd = (int)examination.calculateScoreEnd(); 508 } 509 else if(type.equals("考察")) { 510 this.scoreEnd = (int)investigate.calculateScoreEnd(); 511 } 512 else if(type.equals("实验")) { 513 this.scoreEnd = (int)experiment.calculateScoreEnd(); 514 } 515 } 516 return this.scoreEnd; 517 } 518 public String getType() { 519 return type; 520 } 521 } 522 523 class scoreExamination { // 考试成绩 524 private float scoreOrdinary = -1; //平时分 525 private float scoreLast = 0; // 期末成绩 526 private float percentOrdinary = 0; // 平时分权重 527 private float percentLast = 0; // 期末成绩权重 528 529 public scoreExamination() {} 530 public scoreExamination(float scoreOrdinary, float scoreLast) { 531 setScoreLast(scoreLast); 532 setScoreOrdinary(scoreOrdinary); 533 } 534 public float calculateScoreEnd() { 535 return getScoreOrdinary() * percentOrdinary + getScoreLast() * percentLast; 536 } 537 public float getPercentOrdinary() { 538 return this.percentOrdinary; 539 } 540 public float getPercentLast() { 541 return this.percentLast; 542 } 543 public void setPercentOrdinary(float percentOrdinary) { 544 this.percentOrdinary = percentOrdinary; 545 } 546 public void setPercentLast(float percentLast) { 547 this.percentLast = percentLast; 548 } 549 public void setScoreOrdinary(float scoreOrdinary) { 550 this.scoreOrdinary = scoreOrdinary; 551 } 552 public float getScoreOrdinary() { 553 return this.scoreOrdinary; 554 } 555 public void setScoreLast(float scoreLast) { 556 this.scoreLast = scoreLast; 557 } 558 public float getScoreLast() { 559 return this.scoreLast; 560 } 561 } 562 563 class scoreInvestigate { // 考察成绩 564 private float scoreLast = 0; // 期末成绩 565 566 public scoreInvestigate() {} 567 public scoreInvestigate(float scoreLast) { 568 setScoreLast(scoreLast); 569 } 570 public float calculateScoreEnd() { 571 return getScoreLast(); 572 } 573 public void setScoreLast(float scoreLast) { 574 this.scoreLast = scoreLast; 575 } 576 public float getScoreLast() { 577 return this.scoreLast; 578 } 579 } 580 581 class scoreExperiment { // 实验成绩 582 ArrayList<Integer> scoreArrays = new ArrayList<Integer>(); // 每次实验成绩的权重数组 583 ArrayList<Float> scorePercent = new ArrayList<Float>(); // 每次的实验成绩 584 585 public scoreExperiment() {} 586 public float calculateScoreEnd() { 587 float scoreEnd = -1; 588 if(scoreArrays.size() != 0){ 589 scoreEnd = 0; 590 for(int i = 0; i < scoreArrays.size(); i++) { 591 scoreEnd += scoreArrays.get(i) * scorePercent.get(i); 592 } 593 } 594 return scoreEnd; 595 } 596 } 597 598 class Class { 599 private ArrayList<Student> students = new ArrayList<Student>(); 600 private int classNumber = 0; // 班级号 601 private float averageClass = -1; // 班级平均分 602 protected int StudentTestNumber = 0; // 班级内参与了考试的学生数 603 public Class() {} 604 public Class(int classNumber) { 605 this.classNumber = classNumber; 606 } 607 public void Sort() { 608 for(int i = 0; i < students.size(); i++) { 609 for(int j = i+1; j < students.size(); j++) { 610 if(students.get(i).getID() > students.get(j).getID()) { 611 Collections.swap(students, i, j); 612 } 613 } 614 } 615 } 616 public Student getAppointStudent(int ID, String nameStudent) { 617 for(int i = 0; i < students.size(); i++) { 618 if(students.get(i).getID() == ID && students.get(i).getName().equals(nameStudent)) 619 return students.get(i); 620 } 621 return null; 622 } 623 public void calculateAverageClass() { 624 float average = 0; boolean flag = false; 625 for(int i = 0; i < students.size(); i++) { 626 if(students.get(i).getAverageStudent() != -1){ 627 average += (int)(students.get(i).getAverageStudent()); 628 flag = true; 629 } 630 } 631 if(flag) 632 averageClass = average / StudentTestNumber; 633 } 634 public int getClassNumber() { 635 return classNumber; 636 } 637 public float getAverageClass() { 638 return averageClass; 639 } 640 public ArrayList<Student> getStudents() { 641 return students; 642 } 643 } 644 class Student { 645 private String name = new String(); 646 private int ID; 647 private float averageStudent = -1; // 学生平均分 648 private ArrayList<Course> courseAll = new ArrayList<Course>(); 649 protected int courseTestNumber = 0; // 该学生参与的课程考试数 650 public Student() {} 651 public Student(int ID, String name) { 652 this.name = name; 653 this.ID = ID; 654 } 655 public void calculateAverageStudent() { 656 float average = 0; 657 for(int i = 0; i < courseAll.size(); i++) { 658 if(courseAll.get(i).getScore().getScoreEnd() != -1) { 659 average += courseAll.get(i).getScore().getScoreEnd(); 660 courseTestNumber++; 661 } 662 } 663 if(courseTestNumber != 0) 664 averageStudent = (int)average; 665 } 666 public Course getAppointCourse(String nameCourse) { 667 for(int i = 0; i < courseAll.size(); i++) { 668 if(this.courseAll.get(i).getName().equals(nameCourse)) { 669 return this.courseAll.get(i); 670 } 671 } 672 return null; 673 } 674 public String getName() { 675 return name; 676 } 677 public int getID() { 678 return ID; 679 } 680 public float getAverageStudent() { 681 return averageStudent; 682 } 683 public ArrayList<Course> getCourseAll() { 684 return courseAll; 685 } 686 }课程成绩统计程序-2
设计类图:
SourceMonitor分析结果:
小结:
这道题是课程成绩统计程序-1的迭代版-2,难度上,个人认为如果课程成绩统计程序-1如果在设计没有太大偏差,解决该道题难度并不大。这道题的分数是60分,本人拿到了56分。
此道题在课程成绩统计程序-1的基础上只是添加了一门实验课程,并没有做太大的改动,鉴于在课程成绩统计程序-1中设计录入必修课程和考察课程的经验,录入实验课程实现起来很轻松,在修改了平均分的算法后,就并没有太多需要总结的。非要说哪里存在难度,也许是case14这个节点,我在设计报错提示的顺序可能出现了一点偏差,多次调整代码中报错输出的顺序后其它测试节点依旧顺利通过而case14始终无法通过。
3.课程成绩统计程序-3
这道题是课程成绩统计程序-2的迭代版-3,添加的题目要求如下:
一、
课程成绩统计程序-3在第二次的基础上修改了计算总成绩的方式,
要求:修改类结构,将成绩类的继承关系改为组合关系,成绩信息由课程成绩类和分项成绩类组成,课程成绩类组合分项成绩类,分项成绩类由成绩分值和权重两个属性构成。
完成课程成绩统计程序-2、3两次程序后,比较继承和组合关系的区别。思考一下哪一种关系运用上更灵活,更能够适应变更。
二、
实验的总成绩等于课程每次实验成绩乘以权重后累加而得。
课程权重值在录入课程信息时输入。(注意:所有分项成绩的权重之和应当等于1)
三、
课程信息包括:课程名称、课程性质、考核方式、分项成绩数量、每个分项成绩的权重。
考试课信息格式:课程名称+英文空格+课程性质+英文空格+考核方式+英文空格+平时成绩的权重+英文空格+期末成绩的权重
考察课信息格式:课程名称+英文空格+课程性质+英文空格+考核方式
实验课程信息格式:课程名称+英文空格+课程性质+英文空格+考核方式+英文空格+分项成绩数量n+英文空格+分项成绩1的权重+英文空格+。。。+英文空格+分项成绩n的权重
四、
实验课程成绩信息包括:学号、姓名、课程名称、每次成绩{在系列-2的基础上去掉了(实验次数),实验次数要和实验课程信息中输入的分项成绩数量保持一致}
实验课程信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+第一次实验成绩+...+英文空格+最后一次实验成绩
五、
如果解析实验课程信息时,输入的分项成绩数量值和分项成绩权重的个数不匹配,输出:课程名称+" : number of scores does not match"
如果解析考试课、实验课时,分项成绩权重值的总和不等于1,输出:课程名称+" : weight value error"
源代码:
1 import java.util.Scanner; 2 import java.text.Collator; 3 import java.util.ArrayList; 4 import java.util.Arrays; 5 import java.util.Collections; 6 import java.util.Comparator; 7 8 public class Main{ 9 public static void main(String args[]) { 10 SelectCourseCenter selectCourseCenter = new SelectCourseCenter(); 11 selectCourseCenter.start(); 12 } 13 } 14 15 class SelectCourseCenter { 16 private ArrayList<Class> classAll = new ArrayList<Class>(); 17 private ArrayList<Course> courseAll = new ArrayList<Course>(); 18 public void start() { 19 Scanner input = new Scanner(System.in); 20 while(true) { 21 String information = input.nextLine(); 22 String infos[] = information.split(" "); 23 if(information.equals("end")) 24 break; 25 if(infos[2].equals("实验") && infos.length > 4) { // 实验课程 26 if(infos[0].length() > 10) { 27 System.out.println("wrong format"); 28 continue; 29 } 30 if(getAppointCourse(infos[0]) != null) 31 continue; 32 if(!infos[1].equals("实验")) { 33 System.out.println(infos[0] + " : course type & access mode mismatch"); 34 Course courseExperiment = new Course(infos[0], infos[1], "实验"); 35 courseAll.add(courseExperiment); 36 continue; 37 } 38 int experimentNumber = Integer.parseInt(infos[3]); 39 if(experimentNumber < 4) { 40 System.out.println("wrong format"); 41 } 42 else { 43 if(infos.length - 4 != experimentNumber) { 44 System.out.println(infos[0] + " : number of scores does not match"); 45 } 46 else if(infos.length - 4 > 9) { 47 System.out.println("wrong format"); 48 } 49 else { 50 ArrayList<Float> experimentPercent = new ArrayList<Float>(); 51 float checkIsOne = 0; 52 for(int i = 0; i < experimentNumber; i++) { 53 float percent = Float.parseFloat(infos[i + 4]); 54 checkIsOne += percent; 55 experimentPercent.add(percent); 56 } 57 if(Math.abs(checkIsOne - 1) > 0.0001) { 58 System.out.println(infos[0] + " : weight value error"); 59 } 60 else { 61 Course courseExperiment = new Course(infos[0], infos[1], "实验"); 62 courseExperiment.getScore().getScoreExperiment().scorePercent = experimentPercent; 63 courseAll.add(courseExperiment); 64 } 65 } 66 } 67 continue; 68 } 69 if(infos[2].equals("考试") && infos.length >= 5) { // 考试课程 70 if(infos[0].length() > 10) { 71 System.out.println("wrong format"); 72 continue; 73 } 74 if(getAppointCourse(infos[0]) != null) 75 continue; 76 if(!infos[1].equals("必修")) { 77 System.out.println(infos[0] + " : course type & access mode mismatch"); 78 Course courseExamination = new Course(infos[0], infos[1], infos[2]); 79 courseAll.add(courseExamination); 80 } 81 else { 82 float percentOrdinary = Float.parseFloat(infos[3]); 83 float percentLast = Float.parseFloat(infos[4]); 84 if(percentOrdinary + percentLast != 1) { 85 System.out.println(infos[0] + " : weight value error"); 86 } 87 else { 88 Course courseExamination = new Course(infos[0], infos[1], infos[2]); 89 courseExamination.getScore().getScoreExamination().setPercentOrdinary(percentOrdinary); 90 courseExamination.getScore().getScoreExamination().setPercentLast(percentLast); 91 courseAll.add(courseExamination); 92 } 93 } 94 continue; 95 } 96 else if(infos.length == 3) { // 考察课程 97 if(infos[0].length() > 10) { 98 System.out.println("wrong format"); 99 } 100 else{ 101 if((infos[1].equals("必修") && !infos[2].equals("考试")) || (infos[1].equals("实验") && !infos[2].equals("实验"))) { 102 System.out.println(infos[0] + " : course type & access mode mismatch"); 103 } 104 else if(infos[1].equals("必修") && infos[2].equals("考试")) { 105 System.out.println(infos[0] + " : weight value error"); 106 } 107 else if(getAppointCourse(infos[0]) != null) { 108 } 109 else if(infos[1].equals("选修") && infos[2].equals("考察")){ 110 courseAll.add(new Course(infos[0], infos[1], infos[2])); 111 } 112 else { 113 System.out.println("wrong format"); 114 } 115 } 116 } 117 else if(infos.length == 4) { // 进行考察的成绩分析 118 if(infos[0].length() != 8 || infos[1].length() > 10 || infos[2].length() > 10) { 119 System.out.println("wrong format"); 120 continue; 121 } 122 int classNumber = Integer.parseInt(infos[0].substring(0, 6)); 123 if(classAll.size() == 0 || getAppointClass(classNumber) == null) { // 是否存在该班级 124 classAll.add(new Class(classNumber)); 125 } 126 int scoreLast = Integer.parseInt(infos[3]); 127 int ID = Integer.parseInt(infos[0]); 128 Student student; 129 if(getAppointCourse(infos[2]) != null && 130 getAppointCourse(infos[2]).getAssessment().equals("考察") && 131 scoreLast >= 0 && scoreLast <= 100) { 132 if(getAppointClass(classNumber).getStudents().size() == 0 || 133 getAppointClass(classNumber).getAppointStudent(ID, infos[1]) == null){ // 是否存在学生 134 student = new Student(ID, infos[1]); 135 student.getCourseAll().add(new Course(infos[2] 136 , getAppointCourse(infos[2]).getAttribute() 137 , getAppointCourse(infos[2]).getAssessment())); 138 student.getCourseAll().get(student.getCourseAll().size() - 1).getScore().getScoreInvestigate().setScoreLast(scoreLast); 139 getAppointClass(classNumber).StudentTestNumber++; 140 getAppointClass(classNumber).getStudents().add(student); 141 } 142 else { 143 student = getAppointClass(classNumber).getAppointStudent(ID, infos[1]); // 引用 144 if(student.getAppointCourse(infos[2]) == null){ 145 student.getCourseAll().add(new Course(infos[2] 146 , getAppointCourse(infos[2]).getAttribute() 147 , getAppointCourse(infos[2]).getAssessment())); 148 student.getAppointCourse(infos[2]).getScore().getScoreInvestigate().setScoreLast(scoreLast); 149 } 150 } 151 getAppointCourse(infos[2]).studentTestNumber++; // 参与考试学生人数+1 152 getAppointCourse(infos[2]).getScore().getScoreInvestigate().setScoreLast(getAppointCourse(infos[2]).getScore().getScoreInvestigate().getScoreLast() 153 + student.getCourseAll().get(student.getCourseAll().size() - 1).getScore().getScoreInvestigate().getScoreLast()); 154 } 155 else if(getAppointCourse(infos[2]) == null) { 156 if(scoreLast >= 0 && scoreLast <= 100){ 157 System.out.println(infos[2] + " does not exist"); 158 student = new Student(ID, infos[1]); 159 getAppointClass(classNumber).getStudents().add(student); 160 } 161 } 162 else if(getAppointCourse(infos[2]).getAssessment().equals("考试") || getAppointCourse(infos[2]).getAssessment().equals("实验")) { 163 student = new Student(ID, infos[1]); 164 System.out.println(infos[0] + " " + infos[1] + " : access mode mismatch"); 165 getAppointClass(classNumber).getStudents().add(student); 166 } 167 else { 168 System.out.println("wrong format"); 169 } 170 if(!(scoreLast >= 0 && scoreLast <= 100)) { 171 System.out.println("wrong format"); 172 } 173 } 174 else if(infos.length == 5) { // 进行考试的成绩分析 175 if(infos[0].length() != 8 || infos[1].length() > 10 || infos[2].length() > 10) { 176 System.out.println("wrong format"); 177 continue; 178 } 179 int classNumber = Integer.parseInt(infos[0].substring(0, 6)); 180 if(classAll.size() == 0 || getAppointClass(classNumber) == null) { 181 classAll.add(new Class(classNumber)); 182 } 183 int scoreOrdinary = Integer.parseInt(infos[3]); 184 int scoreLast = Integer.parseInt(infos[4]); 185 int ID = Integer.parseInt(infos[0]); 186 Student student; 187 if(getAppointCourse(infos[2]) != null && 188 getAppointCourse(infos[2]).getAssessment().equals("考试") && 189 scoreLast >= 0 && scoreLast <= 100 && 190 scoreOrdinary >= 0 && scoreOrdinary <= 100) { // 是否合法 191 if(getAppointClass(classNumber).getStudents().size() == 0 || 192 getAppointClass(classNumber).getAppointStudent(ID, infos[1]) == null){ 193 student = new Student(ID, infos[1]); 194 student.getCourseAll().add(new Course(infos[2], getAppointCourse(infos[2]).getAttribute(), "考试")); 195 Score temp = student.getCourseAll().get(student.getCourseAll().size() - 1).getScore();// 引用 196 temp.getScoreExamination().setScoreOrdinary(scoreOrdinary); 197 temp.getScoreExamination().setScoreLast(scoreLast); 198 temp.getScoreExamination().setPercentLast(getAppointCourse(infos[2]).getScore().getScoreExamination().getPercentLast()); 199 temp.getScoreExamination().setPercentOrdinary(getAppointCourse(infos[2]).getScore().getScoreExamination().getPercentOrdinary()); 200 getAppointClass(classNumber).StudentTestNumber++; 201 getAppointClass(classNumber).getStudents().add(student); 202 } 203 else { 204 student = getAppointClass(classNumber).getAppointStudent(ID, infos[1]); 205 if(student.getAppointCourse(infos[2]) == null) { 206 student.getCourseAll().add(new Course(infos[2], getAppointCourse(infos[2]).getAttribute(), "考试")); 207 scoreExamination temp = student.getAppointCourse(infos[2]).getScore().getScoreExamination(); 208 temp.setScoreOrdinary(scoreOrdinary); 209 temp.setScoreLast(scoreLast); 210 temp.setPercentLast(getAppointCourse(infos[2]).getScore().getScoreExamination().getPercentLast()); 211 temp.setPercentOrdinary(getAppointCourse(infos[2]).getScore().getScoreExamination().getPercentOrdinary()); 212 } 213 } 214 if(getAppointCourse(infos[2]).studentTestNumber == 0){ 215 getAppointCourse(infos[2]).getScore().getScoreExamination().setScoreOrdinary(0); 216 getAppointCourse(infos[2]).getScore().setScoreEnd(0); 217 } 218 getAppointCourse(infos[2]).studentTestNumber++; 219 getAppointCourse(infos[2]).getScore().getScoreExamination(). 220 setScoreOrdinary(getAppointCourse(infos[2]).getScore().getScoreExamination().getScoreOrdinary() 221 + student.getCourseAll().get(student.getCourseAll().size() - 1). 222 getScore().getScoreExamination().getScoreOrdinary()); 223 getAppointCourse(infos[2]).getScore().getScoreExamination(). 224 setScoreLast(getAppointCourse(infos[2]).getScore().getScoreExamination().getScoreLast() 225 + student.getCourseAll().get(student.getCourseAll().size() - 1). 226 getScore().getScoreExamination().getScoreLast()); 227 getAppointCourse(infos[2]).getScore().setScoreEnd(getAppointCourse(infos[2]).getScore().getScoreEnd() 228 + (int)student.getCourseAll().get(student.getCourseAll().size() - 1).getScore().getScoreEnd()); 229 } 230 else if(getAppointCourse(infos[2]) == null) { 231 if(scoreLast >= 0 && scoreLast <= 100 && 232 scoreOrdinary >= 0 && scoreOrdinary <= 100) { 233 System.out.println(infos[2] + " does not exist"); 234 student = new Student(ID, infos[1]); 235 student.calculateAverageStudent(); 236 getAppointClass(classNumber).getStudents().add(student); 237 } 238 } 239 else if(getAppointCourse(infos[2]).getAssessment().equals("考察") || getAppointCourse(infos[2]).getAssessment().equals("实验")) { 240 student = new Student(ID, infos[1]); 241 System.out.println(infos[0] + " " + infos[1] + " : access mode mismatch"); 242 getAppointClass(classNumber).getStudents().add(student); 243 } 244 else { 245 System.out.println("wrong format"); 246 } 247 if(scoreLast < 0 || scoreLast > 100 || 248 scoreOrdinary < 0 || scoreOrdinary > 100) { 249 System.out.println("wrong format"); 250 } 251 } 252 else if((infos.length > 5 && infos.length < 7)) { // 进行错误的实验课程成绩分析 253 ArrayList<Integer> scoreArray = new ArrayList<Integer>(); 254 for(int i = 3; i < infos.length; i++) { 255 scoreArray.add(Integer.parseInt(infos[i])); 256 } 257 if(infos[0].length() != 8 || infos[1].length() > 10 || infos[2].length() > 10 258 || scoreArray.size() < 4) { 259 System.out.println("wrong format"); 260 continue; 261 } 262 int classNumber = Integer.parseInt(infos[0].substring(0, 6)); 263 if(classAll.size() == 0 || getAppointClass(classNumber) == null) { 264 classAll.add(new Class(classNumber)); 265 } 266 int ID = Integer.parseInt(infos[0]); 267 Student student; 268 if(getAppointCourse(infos[2]) != null) { 269 student = new Student(ID, infos[1]); 270 System.out.println(infos[0] + " " + infos[1] + " : access mode mismatch"); 271 getAppointClass(classNumber).getStudents().add(student); 272 } 273 else if(getAppointCourse(infos[2]) == null) { 274 if(checkScoreExperiment(scoreArray)){ 275 System.out.println(infos[2] + " does not exist"); 276 student = new Student(ID, infos[1]); 277 getAppointClass(classNumber).getStudents().add(student); 278 } 279 } 280 if(!checkScoreExperiment(scoreArray)) { 281 System.out.println("wrong format"); 282 } 283 } 284 else if(infos.length >= 7 && infos.length <= 12) { // 进行实验课程成绩分析 285 ArrayList<Integer> scoreArray = new ArrayList<Integer>(); 286 for(int i = 3; i < infos.length; i++) { 287 scoreArray.add(Integer.parseInt(infos[i])); 288 } 289 if(infos[0].length() != 8 || infos[1].length() > 10 || infos[2].length() > 10) { 290 System.out.println("wrong format"); 291 continue; 292 } 293 int classNumber = Integer.parseInt(infos[0].substring(0, 6)); 294 if(classAll.size() == 0 || getAppointClass(classNumber) == null) { 295 classAll.add(new Class(classNumber)); 296 } 297 int ID = Integer.parseInt(infos[0]); 298 Student student; 299 if(getAppointCourse(infos[2]) != null && 300 getAppointCourse(infos[2]).getAssessment().equals("实验") && 301 checkScoreExperiment(scoreArray)) { 302 if(scoreArray.size() != getAppointCourse(infos[2]).getScore().getScoreExperiment().scorePercent.size()) { 303 student = new Student(ID, infos[1]); 304 System.out.println(infos[0] + " " + infos[1] + " : access mode mismatch"); 305 getAppointClass(classNumber).getStudents().add(student); 306 continue; 307 } 308 if(getAppointClass(classNumber).getStudents().size() == 0 || 309 getAppointClass(classNumber).getAppointStudent(ID, infos[1]) == null){ 310 student = new Student(ID, infos[1]); 311 student.getCourseAll().add(new Course(infos[2], "实验", "实验")); 312 Score temp = student.getCourseAll().get(student.getCourseAll().size() - 1).getScore(); 313 temp.getScoreExperiment().scoreArrays = scoreArray; // 引用 314 temp.getScoreExperiment().scorePercent = getAppointCourse(infos[2]).getScore().getScoreExperiment().scorePercent; // 引用 315 temp.getScoreExperiment().calculateScoreEnd(); 316 getAppointClass(classNumber).StudentTestNumber++; 317 getAppointClass(classNumber).getStudents().add(student); 318 } 319 else { 320 student = getAppointClass(classNumber).getAppointStudent(ID, infos[1]); 321 if(student.getAppointCourse(infos[2]) == null) { 322 student.getCourseAll().add(new Course(infos[2], "实验", "实验")); 323 scoreExperiment temp = new scoreExperiment(); // 引用 324 temp.scoreArrays = scoreArray; 325 temp.scorePercent = getAppointCourse(infos[2]).getScore().getScoreExperiment().scorePercent; // 引用 326 temp.calculateScoreEnd(); 327 } 328 } 329 if(getAppointCourse(infos[2]).getScore().getScoreEnd() == -1) { 330 getAppointCourse(infos[2]).getScore().setScoreEnd(0); 331 } 332 getAppointCourse(infos[2]).studentTestNumber++; 333 getAppointCourse(infos[2]).getScore().setScoreEnd(getAppointCourse(infos[2]).getScore().getScoreEnd() 334 + (int)student.getCourseAll().get(student.getCourseAll().size() - 1).getScore().getScoreEnd()); 335 } 336 else if(getAppointCourse(infos[2]) == null) { 337 if(checkScoreExperiment(scoreArray)){ 338 System.out.println(infos[2] + " does not exist"); 339 student = new Student(ID, infos[1]); 340 getAppointClass(classNumber).getStudents().add(student); 341 } 342 } 343 else if(getAppointCourse(infos[2]) != null) { 344 if(getAppointCourse(infos[2]).getAssessment().equals("考察") || getAppointCourse(infos[2]).getAssessment().equals("考试")) { 345 student = new Student(ID, infos[1]); 346 System.out.println(infos[0] + " " + infos[1] + " : access mode mismatch"); 347 getAppointClass(classNumber).getStudents().add(student); 348 } 349 } 350 if(!checkScoreExperiment(scoreArray)) { 351 System.out.println("wrong format"); 352 } 353 } 354 } 355 for(int i = 0; i < classAll.size(); i++) { // 给班级排序 356 for(int j = i+1; j < classAll.size(); j++) { 357 if(classAll.get(i).getClassNumber() > classAll.get(j).getClassNumber()) { 358 Collections.swap(classAll, i, j); 359 } 360 } 361 } 362 for(int i = 0; i < classAll.size(); i++) { // 给学生排序 363 classAll.get(i).Sort(); 364 for(int j = 0; j < classAll.get(i).getStudents().size(); j++) { 365 Student student = classAll.get(i).getStudents().get(j); 366 student.calculateAverageStudent(); 367 if(student.getAverageStudent() == -1) { 368 System.out.println(student.getID() + " " + student.getName() + " did not take any exams"); 369 } 370 else { 371 float score = student.getAverageStudent(); 372 if(student.courseTestNumber != 0) 373 score /= student.courseTestNumber; 374 System.out.println(student.getID() + " " + student.getName() + " " + (int)score); 375 } 376 } 377 } 378 String courseCorrect[] = new String[courseAll.size()]; 379 for(int i = 0; i < courseAll.size(); i++) { 380 courseCorrect[i] = new String(); 381 courseCorrect[i] = courseAll.get(i).getName(); 382 } 383 Arrays.sort(courseCorrect, Collator.getInstance(java.util.Locale.CHINA)); // 给课程排序 384 for(int i = 0; i < courseAll.size(); i++) { 385 Collections.swap(courseAll, i, courseAll.indexOf(getAppointCourse(courseCorrect[i]))); 386 } 387 for(int i = 0; i < courseAll.size(); i++) { 388 if(courseAll.get(i).getScore().getScoreEnd() == -1) { 389 System.out.println(courseAll.get(i).getName() + " has no grades yet"); 390 } 391 else { 392 String temp = courseAll.get(i).getName() + " "; 393 temp += (int)(courseAll.get(i).getScore().getScoreEnd() / courseAll.get(i).studentTestNumber); 394 System.out.println(temp); 395 } 396 } 397 for(int i = 0; i < classAll.size(); i++) { // 班级平均分 398 classAll.get(i).calculateAverageClass(); 399 if(classAll.get(i).getAverageClass() == -1 && classAll.get(i).getStudents().size() != 0) 400 System.out.println(classAll.get(i).getClassNumber() + " has no grades yet"); 401 else if(classAll.get(i).getStudents().size() != 0) { 402 float score = classAll.get(i).getAverageClass(); 403 System.out.println(classAll.get(i).getClassNumber() + " " + (int)(score)); 404 } 405 } 406 input.close(); 407 } 408 public boolean checkScoreExperiment(ArrayList<Integer> scoreArray) { // 实验成绩是否合法 409 for(int score : scoreArray) 410 if(score < 0 || score > 100) 411 return false; 412 return true; 413 } 414 public Course getAppointCourse(String name) { // 查找指定课程 415 for(int i = 0; i < courseAll.size(); i++) { 416 if(courseAll.get(i).getName().equals(name)) 417 return courseAll.get(i); 418 } 419 return null; 420 } 421 public Class getAppointClass(int classNumber) { // 查找指定班级 422 for(int i = 0; i < classAll.size(); i++) { 423 if(classAll.get(i).getClassNumber() == classNumber) 424 return classAll.get(i); 425 } 426 return null; 427 } 428 } 429 430 class Course { 431 private String name = new String(); 432 private String attribute = new String(); // 课程性质 433 private String assessment = new String(); // 考核方式 434 private Score score; 435 protected int studentTestNumber = 0; // 参与该课程考试人数 436 public Course() {} 437 public Course(String name, String attribute) { 438 this.name = name; 439 this.attribute = attribute; 440 if(attribute.equals("必修")) { 441 score = new Score("考试"); 442 this.assessment = "考试"; 443 } 444 } 445 public Course(String name, String attribute, String assessment) { 446 this.name = name; 447 this.attribute = attribute; 448 this.assessment = assessment; 449 if(assessment.equals("考试")) { 450 score = new Score("考试"); 451 } 452 else if(assessment.equals("考察")) { 453 score = new Score("考察"); 454 } 455 else if(assessment.equals("实验")) { 456 score = new Score("实验"); 457 } 458 } 459 public String getName() { 460 return name; 461 } 462 public String getAttribute() { 463 return attribute; 464 } 465 public String getAssessment() { 466 return assessment; 467 } 468 public Score getScore() { 469 return score; 470 } 471 } 472 473 class Score { // 分数 474 private float scoreEnd = -1; // 最终成绩 475 private String type = new String(); // 分数类型 476 private scoreExamination examination; 477 private scoreInvestigate investigate; 478 private scoreExperiment experiment; 479 480 public Score(String type) { 481 this.type = type; 482 if(type.equals("考试")) { 483 examination = new scoreExamination(); 484 } 485 else if(type.equals("考察")) { 486 investigate = new scoreInvestigate(); 487 } 488 else if(type.equals("实验")) { 489 experiment = new scoreExperiment(); 490 } 491 } 492 public scoreExamination getScoreExamination() { 493 return this.examination; 494 } 495 public scoreInvestigate getScoreInvestigate() { 496 return this.investigate; 497 } 498 public scoreExperiment getScoreExperiment() { 499 return this.experiment; 500 } 501 public void setScoreEnd(float scoreEnd) { 502 this.scoreEnd = scoreEnd; 503 } 504 public float getScoreEnd() { 505 if(this.scoreEnd == -1) { 506 if(type.equals("考试")) { 507 this.scoreEnd = (int)examination.calculateScoreEnd(); 508 } 509 else if(type.equals("考察")) { 510 this.scoreEnd = (int)investigate.calculateScoreEnd(); 511 } 512 else if(type.equals("实验")) { 513 this.scoreEnd = (int)experiment.calculateScoreEnd(); 514 } 515 } 516 return this.scoreEnd; 517 } 518 public String getType() { 519 return type; 520 } 521 } 522 523 class scoreExamination { // 考试成绩 524 private float scoreOrdinary = -1; //平时分 525 private float scoreLast = 0; // 期末成绩 526 private float percentOrdinary = 0; // 平时分权重 527 private float percentLast = 0; // 期末成绩权重 528 529 public scoreExamination() {} 530 public scoreExamination(float scoreOrdinary, float scoreLast) { 531 setScoreLast(scoreLast); 532 setScoreOrdinary(scoreOrdinary); 533 } 534 public float calculateScoreEnd() { 535 return getScoreOrdinary() * percentOrdinary + getScoreLast() * percentLast; 536 } 537 public float getPercentOrdinary() { 538 return this.percentOrdinary; 539 } 540 public float getPercentLast() { 541 return this.percentLast; 542 } 543 public void setPercentOrdinary(float percentOrdinary) { 544 this.percentOrdinary = percentOrdinary; 545 } 546 public void setPercentLast(float percentLast) { 547 this.percentLast = percentLast; 548 } 549 public void setScoreOrdinary(float scoreOrdinary) { 550 this.scoreOrdinary = scoreOrdinary; 551 } 552 public float getScoreOrdinary() { 553 return this.scoreOrdinary; 554 } 555 public void setScoreLast(float scoreLast) { 556 this.scoreLast = scoreLast; 557 } 558 public float getScoreLast() { 559 return this.scoreLast; 560 } 561 } 562 563 class scoreInvestigate { // 考察成绩 564 private float scoreLast = 0; // 期末成绩 565 566 public scoreInvestigate() {} 567 public scoreInvestigate(float scoreLast) { 568 setScoreLast(scoreLast); 569 } 570 public float calculateScoreEnd() { 571 return getScoreLast(); 572 } 573 public void setScoreLast(float scoreLast) { 574 this.scoreLast = scoreLast; 575 } 576 public float getScoreLast() { 577 return this.scoreLast; 578 } 579 } 580 581 class scoreExperiment { // 实验成绩 582 ArrayList<Integer> scoreArrays = new ArrayList<Integer>(); // 每次实验成绩的权重数组 583 ArrayList<Float> scorePercent = new ArrayList<Float>(); // 每次的实验成绩 584 585 public scoreExperiment() {} 586 public float calculateScoreEnd() { 587 float scoreEnd = -1; 588 if(scoreArrays.size() != 0){ 589 scoreEnd = 0; 590 for(int i = 0; i < scoreArrays.size(); i++) { 591 scoreEnd += scoreArrays.get(i) * scorePercent.get(i); 592 } 593 } 594 return scoreEnd; 595 } 596 } 597 598 class Class { 599 private ArrayList<Student> students = new ArrayList<Student>(); 600 private int classNumber = 0; // 班级号 601 private float averageClass = -1; // 班级平均分 602 protected int StudentTestNumber = 0; // 班级内参与了考试的学生数 603 public Class() {} 604 public Class(int classNumber) { 605 this.classNumber = classNumber; 606 } 607 public void Sort() { 608 for(int i = 0; i < students.size(); i++) { 609 for(int j = i+1; j < students.size(); j++) { 610 if(students.get(i).getID() > students.get(j).getID()) { 611 Collections.swap(students, i, j); 612 } 613 } 614 } 615 } 616 public Student getAppointStudent(int ID, String nameStudent) { 617 for(int i = 0; i < students.size(); i++) { 618 if(students.get(i).getID() == ID && students.get(i).getName().equals(nameStudent)) 619 return students.get(i); 620 } 621 return null; 622 } 623 public void calculateAverageClass() { 624 float average = 0; boolean flag = false; 625 for(int i = 0; i < students.size(); i++) { 626 if(students.get(i).getAverageStudent() != -1){ 627 average += (int)(students.get(i).getAverageStudent()); 628 flag = true; 629 } 630 } 631 if(flag) 632 averageClass = average / StudentTestNumber; 633 } 634 public int getClassNumber() { 635 return classNumber; 636 } 637 public float getAverageClass() { 638 return averageClass; 639 } 640 public ArrayList<Student> getStudents() { 641 return students; 642 } 643 } 644 class Student { 645 private String name = new String(); 646 private int ID; 647 private float averageStudent = -1; // 学生平均分 648 private ArrayList<Course> courseAll = new ArrayList<Course>(); 649 protected int courseTestNumber = 0; // 该学生参与的课程考试数 650 public Student() {} 651 public Student(int ID, String name) { 652 this.name = name; 653 this.ID = ID; 654 } 655 public void calculateAverageStudent() { 656 float average = 0; 657 for(int i = 0; i < courseAll.size(); i++) { 658 if(courseAll.get(i).getScore().getScoreEnd() != -1) { 659 average += courseAll.get(i).getScore().getScoreEnd(); 660 courseTestNumber++; 661 } 662 } 663 if(courseTestNumber != 0) 664 averageStudent = (int)average; 665 } 666 public Course getAppointCourse(String nameCourse) { 667 for(int i = 0; i < courseAll.size(); i++) { 668 if(this.courseAll.get(i).getName().equals(nameCourse)) { 669 return this.courseAll.get(i); 670 } 671 } 672 return null; 673 } 674 public String getName() { 675 return name; 676 } 677 public int getID() { 678 return ID; 679 } 680 public float getAverageStudent() { 681 return averageStudent; 682 } 683 public ArrayList<Course> getCourseAll() { 684 return courseAll; 685 } 686 }课程成绩统计程序-3
设计类图:
SourceMonitor分析结果:
小结:
与课程成绩统计程序-2一样,如果设计好了上一次的版本,该次的迭代版也不会太难,这道题的分数是64分,这里我拿到了60分。
该道题目在-2的基础上主要改动就是实验课程成绩的每次分数的权重不再是平均分配,而是需要自己输入权重,于是这里就会存在一个问题,因为计算机在进行浮点数的运算的时候,答案并不是完全精确的,而是相对精确存在一定误差,刚开始并没有注意到此点。所以最初使用的权重判断语句是否等于1直接采用的是==1的形式,于是在半成品的代码中这几个测试点无法通过:
后将判定条件修改为该权重总和与1的误差是否在一个很小的范围顺利通过:
这是这道题最坑的地方,也是让我印象最深刻的地方,计算机的浮点数运算并不精确现在已经牢记于心。在与其他同学交流的过程中,我发现了好几位同学也出现了与我相同的问题,都是直接判断==1,后经修改分数都来到了90分以上。
接着是第二个坑的地方,double类型浮点数和float类型浮点数精确度不一样,我开始使用的全部为double类型的浮点数,始终无法通过case8这个测试节点:
后将double类型修改为float后顺利通过:
总的来说,该题相较于课程成绩统计程序-2也并没有太难,其难度在于如何控制精度,要考虑计算机不同浮点数计算的误差大小,注意了这点,这题也就迎刃而解了。
数据结构相关题目:考察的点并不难,考察目的是为了让我们稍微了解数据结构中的一些内容,为大二的数据结构做准备,这里只挑一道具有代表性的题目分析。
1.统计Java程序中关键词出现的次数(必须使用Set和Map)
分数 100 作者 段喜龙 单位 南昌航空大学编写程序统计一个输入的Java源码中关键字(区分大小写)出现的次数。说明如下:
- Java中共有53个关键字(自行百度)
- 从键盘输入一段源码,统计这段源码中出现的关键字的数量
- 注释中出现的关键字不用统计
- 字符串中出现的关键字不用统计
- 统计出的关键字及数量按照关键字升序进行排序输出
- 未输入源码则认为输入非法
输入格式:
输入Java源码字符串,可以一行或多行,以exit
行作为结束标志
输出格式:
- 当未输入源码时,程序输出
Wrong Format
- 当没有统计数据时,输出为空
- 当有统计数据时,关键字按照升序排列,每行输出一个关键字及数量,格式为
数量\t关键字
输入样例:
在这里给出一组输入。例如:
//Test public method
public HashMap(int initialCapacity) {
this(initialCapacity, DEFAULT_LOAD_FACTOR);
}
public HashMap(int initialCapacity, float loadFactor) {
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal initial capacity: " +
initialCapacity);
if (initialCapacity > MAXIMUM_CAPACITY)
initialCapacity = MAXIMUM_CAPACITY;
if (loadFactor <= 0 || Float.isNaN(loadFactor))
throw new IllegalArgumentException("Illegal load factor: " +
loadFactor);
this.loadFactor = loadFactor;
this.threshold = tableSizeFor(initialCapacity);
}
exit
输出样例:
在这里给出相应的输出。例如:
1 float
3 if
2 int
2 new
2 public
3 this
2 throw
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
源代码:
1 import java.util.*; 2 3 public class Main { 4 public static void main(String[] args) { 5 Scanner input = new Scanner(System.in); 6 HashMap<String,Integer> JavaKeyAll = new HashMap<>(); // 用于存放关键字的HashMap 7 TreeMap<String,Integer> res = new TreeMap<>(); 8 String[] JavaKeyAllTemp = {"abstract", "assert", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue", "default", "do", "double", "else", "enum", "extends", "false", "final", "finally", "float", "for", "goto", "if", "implements", "import", "instanceof", "int", "interface", "long", "native", "new", "null", "package", "private", "protected", "public", "return", "short", "static", "strictfp", "super", "switch", "synchronized", "this", "throw", "throws", "transient", "true", "try", "void", "volatile", "while"}; 9 for(int i = 0; i < 53; i++) 10 JavaKeyAll.put(JavaKeyAllTemp[i], 0); // 放入HashMap中 11 String information = ""; 12 StringBuilder temp = new StringBuilder(); 13 boolean isNull = true; 14 boolean sameLine = true; 15 while(input.hasNext()) { 16 information = input.nextLine(); 17 if(!sameLine) { // 多行注释 18 if(information.matches(".*/")) 19 sameLine = true; 20 } 21 if(information.matches("/*.*") && !information.matches(".*/")) { 22 sameLine = false; 23 information.replace("\n", " "); 24 } 25 if (information.equals("exit")) 26 break; 27 isNull = false; 28 temp.append(information.replaceAll("//.*", " ").replaceAll("\".*\""," "));// 利用正则表达式去掉"//"类型注释后面的内容以及双引号里的内容并用空格字符代替 29 } 30 String temp2 = temp.toString().replaceAll("/\\*.*?\\*/", " ").replace("{", " ").replace("}", " ").replace("(", " ").replace(")", " ") 31 .replace("=", "").replace(":", " ").replace(";", " ").replace("[", " ").replace("]", " ").replace(",", " ").replace(".", " ");//去掉"/* */"里的内容以及各种括号和分号 32 String codeAll[] = temp2.split(" "); 33 for(int i=0; i < codeAll.length; i++) { // 查找每一个关键词,并得到相应的出现的次数 34 String codeTemp = codeAll[i].replaceAll(" ", "").replaceAll(" ", ""); // 去除所有空格 35 if (JavaKeyAll.containsKey(codeTemp)) { //判断是否是关键词 36 if (!res.containsKey(codeTemp)) 37 res.put(codeTemp, 1); 38 else 39 res.replace(codeTemp, res.get(codeTemp) + 1); 40 } 41 } 42 for(String i : res.keySet()) 43 System.out.println(res.get(i) + "\t" + i); // 输出 44 if (isNull) 45 System.out.println("Wrong Format"); // 无输入 46 } 47 }统计Java程序中关键词的出现次数
小结:
该题代码长度较短且只有一个主类,这些就不放出类图设计和SourceMonitor的分析结果了。本道题主要是为了让我们了解Set和Map的用法,同时也需要了解一些正则表达式的用法。在这道题上踩的坑也挺多的,因为注释分为两种,一种是单行注释,另一种是多行注释。单行注释很简单,就是一个//后面加上内容就可以了;而多行注释是/* */,内容在星号之间,可以进行换行处理,如果进行了换行注释,那么要将该注释分离出去就存在了一定难度,刚开始并没有考虑到存在多行注释的问题。再一个踩坑的点就是多行注释可以写在代码的前头,不会将后面的代码内容变成注释,最初并没有考虑到这种情况,而节点9这个点就是用于测试这种极端情况的。
修改前:
修改后:
从这道题中,我了解了基本的Set和Map的用法,对容器和key也有了基本的了解,同时也知道了注释有多少种情况,这对我帮助很大,也为日后我写注释该如何更加简练打下了基础。
三、采坑心得
(在小结中已经很详细了,这里只写个大概或者进行适当补充。)
课程成绩统计程序系列题目:
1、了解到了计算机浮点数的运算并不精确,存在一定的误差,在日后需要特别注意,同时这也让我对计算机为什么无法精确计算浮点数产生了一些兴趣;
2、double类型和float类型浮点数精度不同,在复杂运算中的结果有误差不相同,需要注意;
3、自定义类变量的交换,只会交换指向地址,所以不能采用一个中间变量进行交换,可以使用ArrayList中的方法swap()进行交换;
4、审题一定要仔细仔细再仔细!!!!不能遗漏任何关键信息,任何一个字都是有价值的;
5、对系统性设计程序有了更加清楚的认识;
6、对于过长的类名,可以定义一个相对应的类的变量temp,然后将该过长的类名的变量的地址赋给temp,实现引用(类似于指针),可以减少代码的长度,增强代码可读性;
数据结构相关题目:
1、HashMap中的元素是不能直接输出的且可能与输入的顺序不同没有重复数据;
2、正则表达式中有许多表达式长相类似,不太熟悉可以通过写一段小程序不断试错;
3、对于测试程序的正确性,需要考虑各种各样的情况,正常情况、边缘数据测试、非法数据测试、极端数据测试等,通过了这些测试后发现代码依旧存在问题说明需要修正;
四、改进建议:
1、代码长度要更加简练,可以将重复的部分设置一个方法实现其功能。在课程成绩统计程序题目中设计的代码长度过长,有好几次出现了代码长度超出限制的提示,将代码注释几乎删除后才能提交;
2、定义的类可以更加简练一点。一定不能太复杂,因为名字太长会造成代码可读性大大降低,在此次程序设计中就吃了这个亏;
3、可以提前适当做好功课准备。例如在这次的Set和Map的题目中就花了大量时间,就一道简单的题花了有三四个小时,效率有点低了;
4、还是那句老话,不能太焦急,而是应该仔细仔细再仔细去看清题目中的每一个要求,审清题目了,才能好好设计代码;
五、总结
首先还是关于自己:
1、要仔细;
2、对于不了解的知识点需要提前做好功课准备;
3、一定要善于利用网络资源和程序设计课本寻找可能有用的Java等语言存在的方法和思想;
4、一定要相信自己,这是最重要的。在第三阶段的学习中,我不再像第二阶段遇到难题就退缩而是选择了迎难而上,最后发现自己是可以的,只是看上去难,但当自己真正花了时间之后,才会发现自己之前认为摆在面前的大山不是大山,而是一座能跨越的小山峰而已。万事开头难,只有鼓足勇气走下去,相信自己,终将会成功;
接着是教学方面:
1、(教学过程(PTA题目集驱动))PTA线上题目集的训练是非常好的,题目都有很高的质量,尤其是自己学校老师的自主命题,很有质量很有水平,能很好训练OOP的设计思想。但还是特别建议老师能够在一次题目集结束后放出相应的测试节点的输入和输出,这样才能好针对性地发现自己的问题所在,能更好地学习OOP。老师可能会觉得在日后的工作中都是未知的,没有什么标准答案,但是我认为我们在本科阶段的专业性知识还尚不成熟,还是需要不断地试错,这样就更需要针对性地更正,所以我还是特别希望老师能够放出测试节点的;
2、线下的教学情况,也只有课堂了,课堂这方面,我个人认为还是做的很到位的,边讲边练这种教学方法,我觉得很科学,我认为可以改进的是要更加注重“练”,应该少讲多练,实践才能出真理,磨炼硬实力;
3、线上的教学,就是PTA和学习通网课了,PTA在第一点已经阐述了,这里说一下网课的情况。我觉得网课可以不需要或者是出更加一点针对PTA题目知识点的网课,而不是那种太宽泛包括了大部分Java知识点的,就我本人和我身边的人而言,都是那种遇到了什么困难,才会去学习相应的能解决该困难的知识点,而不是提前做好所有的功课,就我本人而言为什么要这么做是因为人的记忆力是有限的,就算是学了,但是日后也很难想起来,只能在遇到困难的时候找相应的知识点学习;
六、对本门课程的评价以及改进建议
1、课程的教学理念(OBE):个人认为教学理念是很好的。课程的教学理念是让我们学会OOP的思想,而不是只会敲代码,面向过程编程。因此在教学这块对于Java语法的讲解还是比较少的,虽然刚开始在面对OOP训练集01时十分困难,在PTA上都是各种非零返回和编译错误,但是在自己稍微自学了一点Java语法后,还是没有太大问题的,因为学会了思想,就知道该用什么设计和方法,在本学期三个阶段的PTA训练中,我也明显能感受到自己编程能力的提升和OOP思想的构成,因此我认为教学理念可以一直延续下去;
2、教学方法(边讲边练)、教学组织(线上线下混合式教学)、教学过程(PTA题目集驱动)在总结的1、2、3点中都有提到并用橘黄色背景标记出关键词,这里便不再赘述;
3、教学模式(BOPPPS):这种教学模式我认为大体是很好、正确的,只有小部分我个人认为不好的地方需要注意,这里在上述都有提到,这里也不多赘述。总之,我个人是比较喜欢这种教学模式的,虽然又苦又难,但在吃下了这些苦和抗过了这些难后,才知道自己原来是可以的,能让自己提升那么大,所以我还是很认可这种教学模式的;
标签:第三阶段,String,get,int,PTA,OOP,new,infos,public From: https://www.cnblogs.com/Chinrab2004/p/17507849.html