这次是对PTA第七次和第八次的总结,经过上次菜单5次迭代后我对类的设计更加深刻,而这次面对课程成绩统计的迭代二,由于迭代一我还是面向过程写的,多以毫不犹豫我重构了类图,但由于个人原因不小心误删了,所以没有类图展示(,重构代码后只剩两个测试点过不了,因为没有给测试点所以只能结束后取问老师,结果发现是自己的逻辑问题,选修不能选实验啊,真的只有实验能选实验。这是我自己理解错题目了。
7-3 课程成绩统计程序-2 分数 60 作者 蔡轲 单位 南昌航空大学课程成绩统计程序-2在第一次的基础上增加了实验课,以下加粗字体显示为本次新增的内容。
某高校课程从性质上分为:必修课、选修课、实验课,从考核方式上分为:考试、考察、实验。
考试的总成绩由平时成绩、期末成绩分别乘以权重值得出,比如平时成绩权重0.3,期末成绩权重0.7,总成绩=平时成绩*0.3+期末成绩*0.7。
考察的总成绩直接等于期末成绩
实验的总成绩等于课程每次实验成绩的平均分
必修课的考核方式必须为考试,选修课可以选择考试、考察任一考核方式。实验课的成绩必须为实验。
1、输入:
包括课程、课程成绩两类信息。
课程信息包括:课程名称、课程性质、考核方式(可选,如果性质是必修课,考核方式可以没有)三个数据项。
课程信息格式:课程名称+英文空格+课程性质+英文空格+考核方式
课程性质输入项:必修、选修、实验
考核方式输入选项:考试、考察、实验
考试/考查课程成绩信息包括:学号、姓名、课程名称、平时成绩(可选)、期末成绩
考试/考查课程信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+平时成绩+英文空格+期末成绩
实验课程成绩信息包括:学号、姓名、课程名称、实验次数、每次成绩
实验次数至少4次,不超过9次
实验课程信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+实验次数+英文空格+第一次实验成绩+...+英文空格+最后一次实验成绩
以上信息的相关约束:
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 实验 实验
20201103 张三 java 4 70 80 90
end
输出样例1:
在这里给出相应的输出。例如:
20201103 张三 : access mode mismatch
20201103 张三 did not take any exams
java has no grades yet
202011 has no grades yet
输入样例2:
在这里给出一组输入。例如:
java 实验 实验
20201103 张三 java 3 70 80 90
end
输出样例2:
在这里给出相应的输出。例如:
wrong format
java has no grades yet
输入样例3:
在这里给出一组输入。例如:
java 必修 实验
20201103 张三 java 3 70 80 90 100
end
输出样例3:
在这里给出相应的输出。例如:
java : course type & access mode mismatch
wrong format
输入样例4:
在这里给出一组输入。例如:
java 必修 实验
20201103 张三 java 4 70 80 90 105
end
输出样例4:
在这里给出相应的输出。例如:
java : course type & access mode mismatch
wrong format
输入样例5:
在这里给出一组输入。例如:
java 选修 考察
C语言 选修 考察
java实验 实验 实验
编译原理 必修 考试
20201101 王五 C语言 76
20201216 李四 C语言 78
20201307 张少军 编译原理 82 84
20201103 张三 java实验 4 70 80 90 100
20201118 郑觉先 java 80
20201328 刘和宇 java 77
20201220 朱重九 java实验 4 60 60 80 80
20201132 王萍 C语言 40
20201302 李梦涵 C语言 68
20201325 崔瑾 编译原理 80 84
20201213 黄红 java 82
20201209 赵仙芝 java 76
end
输出样例5:
在这里给出相应的输出。例如:
20201101 王五 76
20201103 张三 85
20201118 郑觉先 80
20201132 王萍 40
20201209 赵仙芝 76
20201213 黄红 82
20201216 李四 78
20201220 朱重九 70
20201302 李梦涵 68
20201307 张少军 83
20201325 崔瑾 82
20201328 刘和宇 77
C语言 65 65
java 78 78
java实验 77
编译原理 81 84 82
202011 70
202012 76
202013 77
评测详情
测试点 | 提示 | 内存(KB) | 用时(ms) | 结果 | 得分 | |
case1 | 样例1 | 20164 | 235 | 答案正确 | 4 / 4 | |
case2 | 样例2 | 18996 | 231 | 答案正确 | 4 / 4 | |
case3 | 样例3 | 18828 | 209 | 答案正确 | 4 / 4 | |
case4 | 样例4 | 16252 | 157 | 答案正确 | 4 / 4 | |
case5 | 样例5 | 23612 | 343 | 答案正确 | 4 / 4 | |
case6 | 一门实验课,一个班级,多个学生 | 20212 | 232 | 答案正确 | 4 / 4 | |
case7 | 一门实验课,多个班级,多个学生 | 20616 | 233 | 答案正确 | 4 / 4 | |
case8 | 一门实验课,多个班级、多个学生、含错误的成绩信息 | 20436 | 227 | 答案正确 | 4 / 4 | |
case9 | 一门实验课、多个班级、多个学生、含错误的成绩信息 | 19700 | 247 | 答案正确 | 4 / 4 | |
case10 | 两门实验课,多个班级,多个学生 | 20088 | 241 | 答案正确 | 4 / 4 | |
case11 | 多门实验课,多个班级、多个学生 | 19816 | 251 | 答案正确 | 4 / 4 | |
case12 | 多门实验课,含重名的课程,多个班级,多个学生, | 19860 | 260 | 答案正确 | 4 / 4 | |
case13 | 多门实验课,多个班级,多个学生,含没有成绩的课程 | 20924 | 287 | 答案正确 | 4 / 4 | |
case14 | 实验、必修课程混合,含不匹配的考核课程,多个班级、多个学生,含错误的成绩信息 | 22220 | 296 | 答案错误 | 0 / 4 | |
case15 | 多门课程、多个班级、多个学生、多种考核类型 | 25056 | 370 | 答案错误 | 0 / 4 |
我的答案
1 import java.util.ArrayList; 2 import java.util.Arrays; 3 import java.util.Collections; 4 import java.util.HashMap; 5 import java.util.Scanner; 6 import java.util.Set; 7 8 public class Main { 9 10 public static void main(String[] args) { 11 // TODO 自动生成的方法存根 12 ArrayList<String> list = new ArrayList<String>(); // 存分解的信息 13 Scanner inpu = new Scanner(System.in); 14 achievementmap achievementmap = new achievementmap(); 15 coursemap coursemap = new coursemap(); 16 Class class1 = new Class(); 17 String iString; 18 int test = 0; 19 while (!"end".equals(iString = inpu.nextLine())) { 20 iString.trim(); 21 for (String dan : iString.split(" ")) { 22 dan.trim(); 23 list.add(dan); 24 } 25 26 if (iString.matches( 27 "\\d{8}\\s[\\u4E00-\\u9FA5A-Za-z0-9]{2,10}\\s[\\u4E00-\\u9FA5A-Za-z0-9]{1,10}(\\s[1-9]?[0-9]|\\s100)+\\b")) { 28 29 if (list.size() > 5 && (Integer.parseInt(list.get(3)) < 4 || Integer.parseInt(list.get(3)) > 9)) { 30 System.out.println("wrong format"); 31 list.removeAll(list); 32 continue; 33 } 34 achievementmap.addachievement(list, coursemap);// 添加 35 class1.addclass(list.get(0).substring(0, 6)); 36 achievementmap.getSite1().get(list.get(0)).achievement(); // 计算 37 38 } else if (list.size() == 3) { 39 try { 40 coursemap.addone(list.get(0), list.get(1), list.get(2)); 41 } catch (mismatch e) { 42 System.out.println(list.get(0) + " : course type & access mode mismatch"); 43 } finally { 44 45 } 46 } else { 47 System.out.println("wrong format"); 48 list.removeAll(list); 49 continue; 50 } 51 list.removeAll(list); 52 } 53 54 for (achievement one1 : achievementmap.getSite1().values()) { // 获取课程成绩 55 for (course one2 : coursemap.getSites().values()) { 56 if(one1.getCourse()==null) { 57 break; 58 } 59 if (one1.getCourse().getNameString().equals(one2.getNameString())) { 60 one2.setJi(one1); 61 } 62 } 63 } 64 65 for (achievement one1 : achievementmap.getSite1().values()) { // 获取班级成绩 66 for (String one2 : class1.getClassHashMap().keySet()) { 67 if (one1.getStudent().getNumberString().substring(0, 6).equals(one2)) { 68 class1.setscore(one2, one1.getAchievement()); 69 } 70 } 71 } 72 73 // 输出 74 Set set = achievementmap.getSite1().keySet(); 75 Object[] arr = set.toArray(); 76 Arrays.sort(arr); 77 for (Object key1 : arr) { 78 if (achievementmap.getSite1().get(key1).getAchievement() == 0) { 79 System.out.println(achievementmap.getSite1().get(key1).getStudent().getNumberString() + " " 80 + achievementmap.getSite1().get(key1).getStudent().getNameString() + " did not take any exams"); 81 continue; 82 } 83 System.out.println(achievementmap.getSite1().get(key1).getStudent().getNumberString() + " " 84 + achievementmap.getSite1().get(key1).getStudent().getNameString() + " " 85 + achievementmap.getSite1().get(key1).getAchievement()); 86 } 87 set = coursemap.getSites().keySet(); 88 arr = set.toArray(); 89 Arrays.sort(arr); 90 for (Object key1 : arr) { 91 coursemap.getSites().get(key1).output(); 92 } 93 set = class1.getClassHashMap().keySet(); 94 arr = set.toArray(); 95 Arrays.sort(arr); 96 for (Object key1 : arr) { 97 if (class1.getClassHashMap().get(key1)[0] == 0) { 98 System.out.println(key1 + " has no grades yet"); 99 continue; 100 } 101 System.out.println( 102 key1 + " " + class1.getClassHashMap().get(key1)[0] / class1.getClassHashMap().get(key1)[1]); 103 } 104 105 } 106 107 } 108 109 class Class { 110 private HashMap<String, Integer[]> classHashMap = new HashMap<String, Integer[]>(); 111 // private Integer[] one =new Integer[2]; 112 113 void addclass(String in) { 114 Integer[] one = { 0, 0 }; 115 classHashMap.put(in, one); 116 } 117 118 void setscore(String name, int in) { 119 classHashMap.get(name)[0] += in; 120 if(in!=0) { 121 classHashMap.get(name)[1]++; 122 } 123 // classHashMap.replace(name, total+num+""); 124 } 125 126 public HashMap<String, Integer[]> getClassHashMap() { 127 return classHashMap; 128 } 129 } 130 131 class access extends Exception { 132 133 } 134 135 class achievementmap { 136 private HashMap<String, achievement> site1 = new HashMap<String, achievement>(); 137 138 void addachievement(ArrayList<String> list, coursemap coursemap) { 139 140 achievement achievement = new achievement(); 141 achievement.getStudent().setNumberString(list.get(0)); // 学号 142 achievement.getStudent().setNameString(list.get(1)); // 姓名 143 try { 144 achievement.setcourse(coursemap, list.get(2)); 145 } catch (notexist e) { 146 System.out.println( list.get(2) + " does not exist"); 147 if (site1.get(list.get(0)) == null) { 148 site1.put(list.get(0), achievement); 149 } 150 return; 151 } // 设置课程 152 if (achievement.getCourse().isExperiment()) { // 获取实验成绩 153 achievement.setTimeString(list.get(3)); 154 if (Integer.parseInt(list.get(3)) != (list.size() - 4)) { 155 System.out.println(list.get(0) + " " + list.get(1) + " : access mode mismatch"); 156 if (site1.get(list.get(0)) == null) { 157 site1.put(list.get(0), achievement); 158 } 159 return; 160 } 161 for (int i = 4; i <= (Integer.parseInt(list.get(3)) + 3); i++) { 162 achievement.setList(list.get(i)); // 加入成绩 163 } 164 } else if (achievement.getCourse().isExam()) { // 获取考试成绩 165 if (list.size() == 4) { 166 achievement.setList(list.get(3)); 167 } else if (list.size() == 5) { 168 achievement.setList(list.get(3)); 169 achievement.setList(list.get(4)); 170 } else { 171 System.out.println(list.get(0) + " " + list.get(1) + " : access mode mismatch"); 172 if (site1.get(list.get(0)) == null) { 173 site1.put(list.get(0), achievement); 174 } 175 return; 176 } 177 178 } else if (achievement.getCourse().isInspection()) { // 获取考察成绩 179 if (list.size() == 4) { 180 achievement.setList(list.get(3)); 181 } else { 182 System.out.println(list.get(0) + " " + list.get(1) + " : access mode mismatch"); 183 if (site1.get(list.get(0)) == null) { 184 site1.put(list.get(0), achievement); 185 } 186 return; 187 } 188 189 } 190 191 if (site1.get(list.get(0)) == null) { 192 site1.put(list.get(0), achievement); 193 return; 194 } 195 // site1.put(list.get(0), achievement); 196 } 197 198 public HashMap<String, achievement> getSite1() { 199 return site1; 200 } 201 } 202 203 class achievement { 204 private course course; 205 private student student = new student(); 206 private int achievement = 0; 207 private String timeString; 208 private ArrayList<String> list = new ArrayList<String>(); // 存入输入的成绩 209 210 public student getStudent() { 211 return student; 212 } 213 214 public void setList(String ji) { 215 list.add(ji); 216 } 217 218 public ArrayList<String> getList() { 219 return list; 220 } 221 222 public course getCourse() { 223 return course; 224 } 225 226 public void setcourse(coursemap coursemap, String name) throws notexist { 227 if (coursemap.findone(name) != null) { 228 this.course = coursemap.findone(name); 229 } else { 230 throw new notexist(); 231 // 抛出错误 232 } 233 234 } 235 236 public void setTimeString(String timeString) { 237 238 this.timeString = timeString; 239 } 240 241 public String getTimeString() { 242 return timeString; 243 } 244 245 public int getAchievement() { 246 return achievement; 247 } 248 249 void achievement() { 250 // TODO 自动生成的方法存根 251 if (list.size() == 0||achievement!=0) { 252 return; 253 } 254 if (course.isExam()) { 255 achievement = (int) (Integer.parseInt(list.get(0)) * (float) (0.3) 256 + Integer.parseInt(list.get(1)) * (float) (0.7)); 257 } 258 if (course.isInspection()) { 259 achievement = Integer.parseInt(list.get(0)); 260 } 261 if (course.isExperiment()) { 262 for (String one : list) { 263 achievement += Integer.parseInt(one); 264 } 265 achievement /= Integer.parseInt(timeString); 266 } 267 268 } 269 270 } 271 272 class outOfrange extends Exception { 273 274 } 275 276 class notexist extends Exception { 277 278 } 279 280 class coursemap { 281 282 private HashMap<String, course> sites = new HashMap<String, course>(); 283 284 void addone(String name, String xinzhi, String fangshi) throws mismatch { 285 course course = new course(); 286 course.setNameString(name); 287 course.setCurriculum(xinzhi); 288 course.setAssessmentMethod(fangshi); 289 if (sites.get(name) == null) { 290 sites.put(name, course); 291 } 292 } 293 294 course findone(String name) { 295 if (sites.containsKey(name)) { 296 return sites.get(name); 297 } else { 298 return null; 299 } 300 } 301 302 public HashMap<String, course> getSites() { 303 return sites; 304 } 305 } 306 307 class mismatch extends Exception { 308 309 } 310 311 class course { 312 private String nameString; 313 private String curriculum; 314 private String AssessmentMethod; 315 private int ji = 0, ping = 0, total = 0, num = 0; 316 317 public void setJi(achievement achievement) { 318 if(achievement.getList().size()==0) { 319 return; 320 } 321 if (achievement.getCourse().isExam()) { 322 ping += Integer.parseInt(achievement.getList().get(0)); 323 total += Integer.parseInt(achievement.getList().get(1)); 324 num++; 325 } else { 326 this.ji += achievement.getAchievement(); 327 num++; 328 } 329 330 } 331 332 public void output() { 333 if (isExam()) { 334 if (ping == 0) { 335 System.out.println(nameString + " has no grades yet"); 336 } else { 337 System.out.println( 338 nameString + " " + ping / num + " " + total / num + " " + (ping / num + total / num) / 2); 339 } 340 341 } else if (isInspection()) { 342 if (ji == 0) { 343 System.out.println(nameString + " has no grades yet"); 344 } else { 345 System.out.println(nameString + " " + ji / num + " " + ji / num); 346 } 347 348 } else { 349 if (ji == 0) { 350 System.out.println(nameString + " has no grades yet"); 351 } else { 352 System.out.println(nameString + " " + ji / num); 353 } 354 } 355 356 } 357 358 public void setNameString(String nameString) { 359 this.nameString = nameString; 360 } 361 362 public void setAssessmentMethod(String assessmentMethod) throws mismatch { 363 if (curriculum.equals("必修") && !assessmentMethod.equals("考试")) { 364 throw new mismatch(); 365 } 366 if (curriculum.equals("实验") && !assessmentMethod.equals("实验")) { 367 throw new mismatch(); 368 } 369 AssessmentMethod = assessmentMethod; 370 } 371 372 public void setCurriculum(String curriculum) { 373 this.curriculum = curriculum; 374 } 375 376 public boolean isInspection() { 377 if (AssessmentMethod.equals("考察")) { 378 return true; 379 } 380 return false; 381 } 382 383 public boolean isExam() { 384 if (AssessmentMethod.equals("考试")) { 385 return true; 386 } 387 return false; 388 } 389 390 public boolean isExperiment() { 391 if (AssessmentMethod.equals("实验")) { 392 return true; 393 } 394 return false; 395 } 396 397 public String getNameString() { 398 return nameString; 399 } 400 401 public String getAssessmentMethod() { 402 return AssessmentMethod; 403 } 404 405 public String getCurriculum() { 406 return curriculum; 407 } 408 } 409 410 class student { 411 private String nameString; 412 private String numberString; 413 414 public void setNameString(String nameString) { 415 this.nameString = nameString; 416 } 417 418 public void setNumberString(String numberString) { 419 this.numberString = numberString; 420 } 421 422 public String getNameString() { 423 return nameString; 424 } 425 426 public String getNumberString() { 427 return numberString; 428 } 429 }View Code
然后是课程成绩设计迭代3,这次添加了权重值,因为上次迭代二重构了代码,所以过程比较顺利,后面偶然调试遇到了浮点数精度问题,所以我用了BigDecimal类来解决,没想到后面很多同学没有意识到这个问题导致测试点过不了,所以最后问老师才发现是这个问题。
7-2 课程成绩统计程序-3 分数 64 作者 蔡轲 单位 南昌航空大学课程成绩统计程序-3在第二次的基础上修改了计算总成绩的方式,
要求:修改类结构,将成绩类的继承关系改为组合关系,成绩信息由课程成绩类和分项成绩类组成,课程成绩类组合分项成绩类,分项成绩类由成绩分值和权重两个属性构成。
完成课程成绩统计程序-2、3两次程序后,比较继承和组合关系的区别。思考一下哪一种关系运用上更灵活,更能够适应变更。
题目最后的参考类图未做修改,大家根据要求自行调整,以下内容加粗字体显示的内容为本次新增的内容。
某高校课程从性质上分为:必修课、选修课、实验课,从考核方式上分为:考试、考察、实验。
考试的总成绩由平时成绩、期末成绩分别乘以权重值得出,比如平时成绩权重0.3,期末成绩权重0.7,总成绩=平时成绩*0.3+期末成绩*0.7。
考察的总成绩直接等于期末成绩
实验的总成绩等于课程每次实验成绩乘以权重后累加而得。
课程权重值在录入课程信息时输入。(注意:所有分项成绩的权重之和应当等于1)
必修课的考核方式必须为考试,选修课可以选择考试、考察任一考核方式。实验课的成绩必须为实验。
1、输入:
包括课程、课程成绩两类信息。
课程信息包括:课程名称、课程性质、考核方式、分项成绩数量、每个分项成绩的权重。
考试课信息格式:课程名称+英文空格+课程性质+英文空格+考核方式+英文空格+平时成绩的权重+英文空格+期末成绩的权重
考察课信息格式:课程名称+英文空格+课程性质+英文空格+考核方式
实验课程信息格式:课程名称+英文空格+课程性质+英文空格+考核方式+英文空格+分项成绩数量n+英文空格+分项成绩1的权重+英文空格+。。。+英文空格+分项成绩n的权重
实验次数至少4次,不超过9次
课程性质输入项:必修、选修、实验
考核方式输入选项:考试、考察、实验
考试/考查课程成绩信息包括:学号、姓名、课程名称、平时成绩(可选)、期末成绩
考试/考查课程成绩信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+平时成绩+英文空格+期末成绩
实验课程成绩信息包括:学号、姓名、课程名称、每次成绩{在系列-2的基础上去掉了(实验次数),实验次数要和实验课程信息中输入的分项成绩数量保持一致}
实验课程信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+第一次实验成绩+...+英文空格+最后一次实验成绩
以上信息的相关约束:
1)成绩是整数,不包含小数部分,成绩的取值范围是【0,100】
2)学号由8位数字组成
3)姓名不超过10个字符
4)课程名称不超过10个字符
5)不特别输入班级信息,班级号是学号的前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)若出现重复的课程/成绩信息,只保留第一个课程信息,忽略后面输入的。
6)如果解析实验课程信息时,输入的分项成绩数量值和分项成绩权重的个数不匹配,输出:课程名称+" : number of scores does not match"
7)如果解析考试课、实验课时,分项成绩权重值的总和不等于1,输出:课程名称+" : weight value error"
信息约束:
1)成绩平均分只取整数部分,小数部分丢弃
参考类图(与第一次相同,其余内容自行补充):
输入样例1:
在这里给出一组输入。例如:
java 实验 实验 4 0.2 0.3 0.2 0.3
end
输出样例1:
在这里给出相应的输出。例如:
java has no grades yet
输入样例2:
在这里给出一组输入。例如:
java 实验 实验 4 0.2 0.3 0.2
end
输出样例2:
在这里给出相应的输出。例如:
java : number of scores does not match
输入样例3:
在这里给出一组输入。例如:
java 实验 实验 4 0.2 0.3 0.2 0.1
end
输出样例3:
在这里给出相应的输出。例如:
java : weight value error
输入样例4:
在这里给出一组输入。例如:
java 实验 实验 4 0.2 0.3 0.2 0.3
20201116 张三 java 70 80 90 100
end
输出样例4:
在这里给出相应的输出。例如:
20201116 张三 86
java 86
202011 86
输入样例5:
在这里给出一组输入。例如:
java 实验 实验 4 0.2 0.3 0.2 0.3
20201116 张三 java 70 80 90 100 80
end
输出样例5:
在这里给出相应的输出。例如:
评测详情20201116 张三 : access mode mismatch 20201116 张三 did not take any exams java has no grades yet 202011 has no grades yet
测试点 | 提示 | 内存(KB) | 用时(ms) | 结果 | 得分 | |
case1 | 样例1 | 18220 | 158 | 答案正确 | 4 / 4 | |
case2 | 样例2 | 16384 | 155 | 答案正确 | 4 / 4 | |
case3 | 样例3 | 16792 | 158 | 答案正确 | 4 / 4 | |
case4 | 样例4 | 20168 | 232 | 答案正确 | 4 / 4 | |
case5 | 样例5 | 19388 | 188 | 答案正确 | 4 / 4 | |
case6 | 重复的实验课程信息 | 19208 | 196 | 答案正确 | 4 / 4 | |
case7 | 重复的实验课程信息 | 20424 | 250 | 答案正确 | 4 / 4 | |
case8 | 一门实验课,一个班级,多个学生 | 20000 | 237 | 答案正确 | 4 / 4 | |
case9 | 两门实验课,多个班级,多个学生 | 20260 | 216 | 答案正确 | 4 / 4 | |
case10 | 含错误的课程信息(实验次数超出范围) 含引用了错误课程的成绩信息 | 22728 | 269 | 答案正确 | 4 / 4 | |
case11 | 含错误的课程信息(实验次数超出范围) 含引用了错误课程的成绩信息 | 22480 | 263 | 答案正确 | 4 / 4 | |
case12 | 含错误的课程信息(实验次数不匹配) 含引用错误课程的成绩信息 | 22084 | 311 | 答案正确 | 4 / 4 | |
case13 | 两门课程,多个学生,多个班级 | 20740 | 242 | 答案正确 | 4 / 4 | |
case14 | 实验、必修课程混合,含不匹配的考核课程,多个班级、多个学生,含错误的成绩信息 | 22328 | 292 | 答案正确 | 4 / 4 | |
case15 | 考试课程测试 | 19972 | 237 | 答案正确 | 4 / 4 | |
case16 | 多门课程、多个班级、多个学生、多种考核类型 | 20144 | 237 | 答案正确 | 4 / 4 |
我的答案
1 import java.math.BigDecimal; 2 import java.util.ArrayList; 3 import java.util.Arrays; 4 import java.util.Collections; 5 import java.util.HashMap; 6 import java.util.Scanner; 7 import java.util.Set; 8 9 public class Main { 10 11 public static void main(String[] args) { 12 // TODO 自动生成的方法存根 13 ArrayList<String> list = new ArrayList<String>(); // 存分解的信息 14 Scanner inpu = new Scanner(System.in); 15 achievementmap achievementmap = new achievementmap(); 16 coursemap coursemap = new coursemap(); 17 Class class1 = new Class(); 18 String iString; 19 int test = 0; 20 while (!"end".equals(iString = inpu.nextLine())) { 21 iString.trim(); 22 for (String dan : iString.split(" ")) { 23 dan.trim(); 24 list.add(dan); 25 } 26 27 if (iString.matches( 28 "\\d{8}\\s[\\u4E00-\\u9FA5A-Za-z0-9]{2,10}\\s[\\u4E00-\\u9FA5A-Za-z0-9]{1,10}(\\s[1-9]?[0-9]|\\s100)+\\b")) { 29 30 // if (list.size() > 5 && (Integer.parseInt(list.get(3)) < 4 || 31 // Integer.parseInt(list.get(3)) > 9)) { 32 // System.out.println("wrong format"); 33 // list.removeAll(list); 34 // continue; 35 // } 36 achievementmap.addachievement(list, coursemap);// 添加 37 class1.addclass(list.get(0).substring(0, 6)); 38 achievementmap.getSite1().get(list.get(0)).achievement(); // 计算 39 40 } else if (iString.matches("[\\u4E00-\\u9FA5A-Za-z0-9]{1,10}\\s(选修|必修|实验)\\s(考试|考察|实验).*")) { 41 try { 42 if (list.size() > 3 && list.get(2).equals("实验")) { 43 44 if ((Integer.parseInt(list.get(3)) < 4 || Integer.parseInt(list.get(3)) > 9)) { 45 System.out.println("wrong format"); 46 list.removeAll(list); 47 continue; 48 } 49 50 } 51 coursemap.addone(list); 52 } catch (mismatch e) { 53 System.out.println(list.get(0) + " : course type & access mode mismatch"); 54 } catch (scores e) { 55 System.out.println(list.get(0) + " : number of scores does not match"); 56 } catch (error e) { 57 System.out.println(list.get(0) + " : weight value error"); 58 } finally { 59 60 } 61 } else { 62 System.out.println("wrong format"); 63 list.removeAll(list); 64 continue; 65 } 66 list.removeAll(list); 67 } 68 69 for (achievement one1 : achievementmap.getSite1().values()) { // 获取课程成绩 70 for (course one2 : coursemap.getSites().values()) { 71 if (one1.getCourse() == null) { 72 break; 73 } 74 if (one1.getCourse().getNameString().equals(one2.getNameString())) { 75 one2.setJi(one1); 76 } 77 } 78 } 79 80 for (achievement one1 : achievementmap.getSite1().values()) { // 获取班级成绩 81 for (String one2 : class1.getClassHashMap().keySet()) { 82 if (one1.getStudent().getNumberString().substring(0, 6).equals(one2)) { 83 class1.setscore(one2, one1.getAchievement()); 84 } 85 } 86 } 87 88 // 输出 89 Set set = achievementmap.getSite1().keySet(); 90 Object[] arr = set.toArray(); 91 Arrays.sort(arr); 92 for (Object key1 : arr) { 93 if (achievementmap.getSite1().get(key1).getAchievement() == 0) { 94 System.out.println(achievementmap.getSite1().get(key1).getStudent().getNumberString() + " " 95 + achievementmap.getSite1().get(key1).getStudent().getNameString() + " did not take any exams"); 96 continue; 97 } 98 System.out.println(achievementmap.getSite1().get(key1).getStudent().getNumberString() + " " 99 + achievementmap.getSite1().get(key1).getStudent().getNameString() + " " 100 + achievementmap.getSite1().get(key1).getAchievement()); 101 } 102 set = coursemap.getSites().keySet(); 103 arr = set.toArray(); 104 Arrays.sort(arr); 105 for (Object key1 : arr) { 106 coursemap.getSites().get(key1).output(); 107 } 108 set = class1.getClassHashMap().keySet(); 109 arr = set.toArray(); 110 Arrays.sort(arr); 111 for (Object key1 : arr) { 112 if (class1.getClassHashMap().get(key1)[0] == 0) { 113 System.out.println(key1 + " has no grades yet"); 114 continue; 115 } 116 System.out.println( 117 key1 + " " + class1.getClassHashMap().get(key1)[0] / class1.getClassHashMap().get(key1)[1]); 118 } 119 120 } 121 122 } 123 124 class Class { 125 private HashMap<String, Integer[]> classHashMap = new HashMap<String, Integer[]>(); 126 // private Integer[] one =new Integer[2]; 127 128 void addclass(String in) { 129 Integer[] one = { 0, 0 }; 130 classHashMap.put(in, one); 131 } 132 133 void setscore(String name, int in) { 134 classHashMap.get(name)[0] += in; 135 if (in != 0) { 136 classHashMap.get(name)[1]++; 137 } 138 // classHashMap.replace(name, total+num+""); 139 } 140 141 public HashMap<String, Integer[]> getClassHashMap() { 142 return classHashMap; 143 } 144 } 145 146 class access extends Exception { 147 148 } 149 150 class achievementmap { 151 private HashMap<String, achievement> site1 = new HashMap<String, achievement>(); 152 153 void addachievement(ArrayList<String> list, coursemap coursemap) { 154 155 achievement achievement = new achievement(); 156 achievement.getStudent().setNumberString(list.get(0)); // 学号 157 achievement.getStudent().setNameString(list.get(1)); // 姓名 158 try { 159 achievement.setcourse(coursemap, list.get(2)); 160 } catch (notexist e) { 161 System.out.println(list.get(2) + " does not exist"); 162 if (site1.get(list.get(0)) == null) { 163 site1.put(list.get(0), achievement); 164 } 165 return; 166 } // 设置课程 167 if (achievement.getCourse().isExperiment()) { // 获取实验成绩 168 // achievement.setTimeString(list.get(3)); 169 if (achievement.getCourse().getTime() != (list.size() - 3)) { 170 System.out.println(list.get(0) + " " + list.get(1) + " : access mode mismatch"); 171 if (site1.get(list.get(0)) == null) { 172 site1.put(list.get(0), achievement); 173 } 174 return; 175 } 176 for (int i = 3; i < list.size(); i++) { 177 achievement.setList(list.get(i)); // 加入成绩 178 } 179 } else if (achievement.getCourse().isExam()) { // 获取考试成绩 180 // if (list.size() == 4) { 181 // achievement.setList(list.get(3)); 182 // } else 183 if (list.size() == 5) { 184 achievement.setList(list.get(3)); 185 achievement.setList(list.get(4)); 186 } else { 187 System.out.println(list.get(0) + " " + list.get(1) + " : access mode mismatch"); 188 if (site1.get(list.get(0)) == null) { 189 site1.put(list.get(0), achievement); 190 } 191 return; 192 } 193 194 } else if (achievement.getCourse().isInspection()) { // 获取考察成绩 195 if (list.size() == 4) { 196 achievement.setList(list.get(3)); 197 } else { 198 System.out.println(list.get(0) + " " + list.get(1) + " : access mode mismatch"); 199 if (site1.get(list.get(0)) == null) { 200 site1.put(list.get(0), achievement); 201 } 202 return; 203 } 204 205 } 206 207 if (site1.get(list.get(0)) == null) { 208 site1.put(list.get(0), achievement); 209 return; 210 } 211 // site1.put(list.get(0), achievement); 212 } 213 214 public HashMap<String, achievement> getSite1() { 215 return site1; 216 } 217 } 218 219 class achievement { 220 private course course; 221 private student student = new student(); 222 private int achievement = 0; 223 // private String timeString; 224 private ArrayList<String> list = new ArrayList<String>(); // 存入输入的成绩 225 226 public student getStudent() { 227 return student; 228 } 229 230 public void setList(String ji) { 231 list.add(ji); 232 } 233 234 public ArrayList<String> getList() { 235 return list; 236 } 237 238 public course getCourse() { 239 return course; 240 } 241 242 public void setcourse(coursemap coursemap, String name) throws notexist { 243 if (coursemap.findone(name) != null) { 244 this.course = coursemap.findone(name); 245 } else { 246 throw new notexist(); 247 // 抛出错误 248 } 249 250 } 251 252 public int getAchievement() { 253 return achievement; 254 } 255 256 void achievement() { // 计算还未写!!!!!!!! 257 // TODO 自动生成的方法存根 258 if (list.size() == 0 || achievement != 0) { 259 return; 260 } 261 if (course.isExam()) { 262 achievement = (int) (Integer.parseInt(list.get(0)) * (float) (getCourse().getZhong()[0]) 263 + Integer.parseInt(list.get(1)) * (float) (getCourse().getZhong()[1])); 264 } 265 if (course.isInspection()) { 266 achievement = Integer.parseInt(list.get(0)); 267 } 268 if (course.isExperiment()) { 269 float rr = 0; 270 for (int i = 0; i < getCourse().getTime(); i++) { 271 rr += Integer.parseInt(list.get(i)) * (float) (getCourse().getZhong()[i]); 272 } 273 achievement = (int) rr; 274 } 275 276 } 277 278 } 279 280 class outOfrange extends Exception { 281 282 } 283 284 class notexist extends Exception { 285 286 } 287 288 class coursemap { 289 290 private HashMap<String, course> sites = new HashMap<String, course>(); 291 292 void addone(ArrayList<String> list) throws mismatch, scores, error { 293 if (sites.get(list.get(0)) != null) { 294 return; 295 } 296 course course = new course(); 297 course.setNameString(list.get(0)); 298 course.setCurriculum(list.get(1)); 299 course.setAssessmentMethod(list.get(2)); 300 course.setzhong(list); 301 if (sites.get(list.get(0)) == null) { 302 sites.put(list.get(0), course); 303 } 304 } 305 306 course findone(String name) { 307 if (sites.containsKey(name)) { 308 return sites.get(name); 309 } else { 310 return null; 311 } 312 } 313 314 public HashMap<String, course> getSites() { 315 return sites; 316 } 317 } 318 319 class mismatch extends Exception { 320 321 } 322 323 class error extends Exception { 324 325 } 326 327 class scores extends Exception { 328 329 } 330 331 class course { 332 private String nameString; 333 private String curriculum; 334 private String AssessmentMethod; 335 private float[] zhong; 336 private int ji = 0, ping = 0, total = 0, num = 0, time = 0; 337 338 public int getTime() { 339 return time; 340 } 341 342 public float[] getZhong() { 343 return zhong; 344 } 345 346 public void setzhong(ArrayList<String> list) throws scores, error { // 设置权重 347 if (isExam()) { 348 if (list.size() != 5) { 349 throw new scores(); 350 } 351 zhong = new float[2]; 352 zhong[0] = Float.parseFloat(list.get(3)); 353 zhong[1] = Float.parseFloat(list.get(4)); 354 if (zhong[0] + zhong[1] != (float) (1.0)) { 355 throw new error(); 356 } 357 } 358 if (isExperiment()) { 359 time = Integer.parseInt(list.get(3)); 360 if (list.size() - 4 != time) { 361 throw new scores(); 362 } 363 364 zhong = new float[time]; 365 BigDecimal b1 = new BigDecimal("0.0"); 366 for (int i = 0; i < zhong.length; i++) { 367 368 BigDecimal a = new BigDecimal(list.get(i + 4)); 369 zhong[i] = a.floatValue(); 370 b1 = b1.add(a); 371 } 372 BigDecimal b2 = new BigDecimal("1.0"); 373 if (b1.compareTo(b2) != 0) { 374 throw new error(); 375 } 376 } 377 378 } 379 380 public void setJi(achievement achievement) { 381 if (achievement.getList().size() == 0) { 382 return; 383 } 384 if (achievement.getCourse().isExam()) { 385 ping += Integer.parseInt(achievement.getList().get(0)); 386 total += Integer.parseInt(achievement.getList().get(1)); 387 num++; 388 } else { 389 this.ji += achievement.getAchievement(); 390 num++; 391 } 392 393 } 394 395 public void output() { 396 if (isExam()) { 397 if (ping == 0) { 398 System.out.println(nameString + " has no grades yet"); 399 } else { 400 System.out.println(nameString + " " + (ping / num + total / num) / 2); 401 } 402 403 } else if (isInspection()) { 404 if (ji == 0) { 405 System.out.println(nameString + " has no grades yet"); 406 } else { 407 System.out.println(nameString + " " + ji / num); 408 } 409 410 } else { 411 if (ji == 0) { 412 System.out.println(nameString + " has no grades yet"); 413 } else { 414 System.out.println(nameString + " " + ji / num); 415 } 416 } 417 418 } 419 420 public void setNameString(String nameString) { 421 this.nameString = nameString; 422 } 423 424 public void setAssessmentMethod(String assessmentMethod) throws mismatch { 425 if (curriculum.equals("必修") && !assessmentMethod.equals("考试")) { 426 throw new mismatch(); 427 } 428 if (curriculum.equals("实验") && !assessmentMethod.equals("实验")) { 429 throw new mismatch(); 430 } 431 if (curriculum.equals("选修") && assessmentMethod.equals("实验")) { 432 throw new mismatch(); 433 } 434 AssessmentMethod = assessmentMethod; 435 } 436 437 public void setCurriculum(String curriculum) { 438 this.curriculum = curriculum; 439 } 440 441 public boolean isInspection() { 442 if (AssessmentMethod.equals("考察")) { 443 return true; 444 } 445 return false; 446 } 447 448 public boolean isExam() { 449 if (AssessmentMethod.equals("考试")) { 450 return true; 451 } 452 return false; 453 } 454 455 public boolean isExperiment() { 456 if (AssessmentMethod.equals("实验")) { 457 return true; 458 } 459 return false; 460 } 461 462 public String getNameString() { 463 return nameString; 464 } 465 466 public String getAssessmentMethod() { 467 return AssessmentMethod; 468 } 469 470 public String getCurriculum() { 471 return curriculum; 472 } 473 } 474 475 class student { 476 private String nameString; 477 private String numberString; 478 479 public void setNameString(String nameString) { 480 this.nameString = nameString; 481 } 482 483 public void setNumberString(String numberString) { 484 this.numberString = numberString; 485 } 486 487 public String getNameString() { 488 return nameString; 489 } 490 491 public String getNumberString() { 492 return numberString; 493 } 494 }View Code
标签:总结,第三次,get,list,PTA,课程,成绩,public,achievement From: https://www.cnblogs.com/nchu21207115/p/17883758.html