Java题目集7~11的总结
一、前言
第八次作业
主要涉及的知识点有类实现Comparable/Comparable<>接口类中重写compareTo(Object o)方法,使用Collections.sort()进行排序以及利用Comparator进行排序。这次只有一题,但难度还是比较大的,是写课程成绩统计程序-1。
第九次作业
主要涉及的知识点有Map和Set,用到了hashmap和hashset以及treemap,其中对于Map类:可以使用 get(key) 方法来获取 key 对应的 value,可以使用 remove(key) 方法来删除 key 对应的键值对(key-value)计算, Map 中的元素数量可以使用 size() 方法,可以使用 for-each 来迭代 Map 中的元素。题量很少只有一题,难度也适中。
第十次作业
主要涉及的知识点有HashMap排序和检索,以及多态。题量有4题,除了第三题课程成绩统计程序-2有难度外,其他三题都比较好写。
第十一次作业
主要涉及的知识点有ArrayList的排序和Stack类,对于Stack类: empty() 测试堆栈是否为空;peek( )查看堆栈顶部的对象,但不从堆栈中移除它; pop( )移除堆栈顶部的对象,并作为此函数的值返回该对象;push(Object element)把项压入堆栈顶部。题量有五题,难度中等,除了课程成绩统计程序-3。
二、设计与分析
题目集8
7-1 课程成绩统计程序-1
某高校课程从性质上分为:必修课、选修课,从考核方式上分为:考试、考察。
考试的总成绩由平时成绩、期末成绩分别乘以权重值得出,比如平时成绩权重0.3,期末成绩权重0.7,总成绩=平时成绩*0.3+期末成绩*0.7。
考察的总成绩直接等于期末成绩
必修课的考核方式必须为考试,选修课可以选择考试、考察任一考核方式。
1、输入:
包括课程、课程成绩两类信息。
课程信息包括:课程名称、课程性质、考核方式(可选,如果性质是必修课,考核方式可以没有)三个数据项。
课程信息格式:课程名称+英文空格+课程性质+英文空格+考核方式
课程性质输入项:必修、选修
考核方式输入选项:考试、考察
课程成绩信息包括:学号、姓名、课程名称、平时成绩(可选)、期末成绩
课程信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+平时成绩+英文空格+期末成绩
以上信息的相关约束:
1)平时成绩和期末成绩的权重默认为0.3、0.7
2)成绩是整数,不包含小数部分,成绩的取值范围是【0,100】
3)学号由8位数字组成
4)姓名不超过10个字符
5)课程名称不超过10个字符
6)不特别输入班级信息,班级号是学号的前6位。
2、输出:
输出包含三个部分,包括学生所有课程总成绩的平均分、单门课程成绩平均分、单门课程总成绩平均分、班级所有课程总成绩平均分。
为避免误差,平均分的计算方法为累加所有符合条件的单个成绩,最后除以总数。
1)学生课程总成绩平均分按学号由低到高排序输出
格式:学号+英文空格+姓名+英文空格+总成绩平均分
如果某个学生没有任何成绩信息,输出:学号+英文空格+姓名+英文空格+"did not take any exams"
2)单门课程成绩平均分分为三个分值:平时成绩平均分(可选)、期末考试平均分、总成绩平均分,按课程名称的字符顺序输出
格式:课程名称+英文空格+平时成绩平均分+英文空格+期末考试平均分+英文空格+总成绩平均分
如果某门课程没有任何成绩信息,输出:课程名称+英文空格+"has no grades yet"
3)班级所有课程总成绩平均分按班级由低到高排序输出
格式:班级号+英文空格+总成绩平均分
如果某个班级没有任何成绩信息,输出:班级名称+英文空格+ "has no grades yet"
异常情况:
1)如果解析某个成绩信息时,课程名称不在已输入的课程列表中,输出:学号+英文空格+姓名+英文空格+":"+课程名称+英文空格+"does not exist"
2)如果解析某个成绩信息时,输入的成绩数量和课程的考核方式不匹配,输出:学号+英文空格+姓名+英文空格+": access mode mismatch"
以上两种情况如果同时出现,按第一种情况输出结果。
3)如果解析某个课程信息时,输入的课程性质和课程的考核方式不匹配,输出:课程名称+" : course type & access mode mismatch"
4)格式错误以及其他信息异常如成绩超出范围等,均按格式错误处理,输出"wrong format"
5)若出现重复的课程/成绩信息,只保留第一个课程信息,忽略后面输入的。
信息约束:
1)成绩平均分只取整数部分,小数部分丢弃
参考类图:
输入样例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
类图
源码
1 import java.util.ArrayList; 2 import java.util.Collections; 3 import java.util.Scanner; 4 import java.util.Locale; 5 import java.text.Collator; 6 7 public class Main { 8 9 public static void main(String[] args) { 10 // TODO Auto-generated method stub 11 Data data = new Data(); 12 Scanner input = new Scanner(System.in); 13 String information = "start"; 14 String courseInformation[] = null; 15 String courseScoreInformation[] = null; 16 int count = 0; 17 while (!information.equals("end")) { 18 information = input.nextLine(); 19 if (information.equals("end")) break; 20 if (!(information.charAt(0) <= '9' && information.charAt(0) >= '0')) { 21 courseInformation = information.split(" "); 22 Course course = new Course(courseInformation[0],courseInformation[1],courseInformation[2]); 23 if (searchCourse(courseInformation[0], data) == null) { 24 data.getCourses().add(course); 25 } 26 course.setCourseSelects(data.getCourseSelects()); 27 28 } else { 29 courseScoreInformation = information.split(" "); 30 count ++; 31 Student student = new Student(courseScoreInformation[0],courseScoreInformation[1]); //学号和姓名 32 if (searchStudent(courseScoreInformation[0],data) == null) { 33 data.getStudents().add(student); 34 } 35 if (courseScoreInformation.length == 5 && 36 searchCourseSelect(searchCourse(courseScoreInformation[2], data), student, data) == null) { //如果课程为考试 37 int usualScore = Integer.parseInt(courseScoreInformation[3]); 38 int finalScore = Integer.parseInt(courseScoreInformation[4]); 39 Score score = new ExamScore(usualScore,finalScore); 40 CourseSelect courseSelect = new CourseSelect(searchCourse(courseScoreInformation[2],data),student,score); 41 data.getCourseSelects().add(courseSelect); 42 for (int i = 0; i < data.getCourseSelects().size(); i++) { 43 if (data.getCourseSelects().get(i).getStudent().getId().equals(student.getId())) { 44 student.getCourseSelects().add(courseSelect); 45 } 46 } 47 } 48 if (courseScoreInformation.length == 4 && 49 searchCourseSelect(searchCourse(courseScoreInformation[2], data), student, data) == null) { //如果课程为考察 50 int finalScore = Integer.parseInt(courseScoreInformation[3]); 51 Score score = new AccessScore(finalScore); 52 CourseSelect courseSelect = new CourseSelect(searchCourse(courseScoreInformation[2],data),student,score); 53 data.getCourseSelects().add(courseSelect); 54 for (int i = 0; i < data.getCourseSelects().size(); i++) { 55 if (data.getCourseSelects().get(i).getStudent().getId().equals(student.getId())) { 56 student.getCourseSelects().add(courseSelect); 57 } 58 } 59 } 60 if (searchClass(student.getClassId(),data) == null) { 61 Class studentClass = new Class(student.getClassId()); 62 data.getClasses().add(studentClass); 63 studentClass.addStudent(student); 64 } 65 if (searchCourse(courseScoreInformation[2], data) == null) { 66 data.getCourses().get(count).getCourseSelects().add(searchCourseSelect(searchCourse(courseScoreInformation[2], data), student, data)); 67 } 68 } 69 } 70 71 for (int i = 0; i < data.getClasses().size(); i++) { //添加学生到班级中 72 for (int j = 0; j < data.getStudents().size(); j++) { 73 if (data.getClasses().get(i).hasStudent(data.getStudents().get(j))){ 74 data.getClasses().get(i).addStudent(data.getStudents().get(j)); 75 } 76 } 77 } 78 79 Collections.sort(data.getStudents()); 80 Collections.sort(data.getClasses()); 81 Collections.sort(data.getCourses()); 82 83 for (int i = 0; i < data.getStudents().size(); i++) { 84 if (data.getStudents().get(i).getId() == null ||data.getStudents().get(i).getName() == null) { 85 System.out.println("wrong format"); 86 } 87 if (data.getStudents().get(i) == null) return; 88 System.out.println(data.getStudents().get(i).getId() + " " + data.getStudents().get(i).getName() + " " + 89 data.getStudents().get(i).getAverageScore()); 90 } 91 92 for (int i = 0; i < data.getCourses().size(); i++) { 93 if (data.getCourses().get(i) == null || data.getCourses().get(i).getCourseSelects() == null) return; 94 if (data.getCourses().get(i).getAccessMethod().equals("考试")) { 95 if(!data.getCourses().get(i).hasScore()) { 96 System.out.println(data.getCourses().get(i).getName() + " has no grades yet"); 97 continue; 98 } 99 System.out.println(data.getCourses().get(i).getName() + " " + data.getCourses().get(i).getAverageUsualScore() + " " + 100 data.getCourses().get(i).getAverageFinalScore() + " " + 101 data.getCourses().get(i).getAverageTotalScore()); 102 } 103 if (data.getCourses().get(i).getAccessMethod().equals("考察")) { 104 if(!data.getCourses().get(i).hasScore()) { 105 System.out.println(data.getCourses().get(i).getName() + " has no grades yet"); 106 continue; 107 } 108 System.out.println(data.getCourses().get(i).getName() + " " + data.getCourses().get(i).getAverageFinalScore() + " " + 109 data.getCourses().get(i).getAverageTotalScore()); 110 } 111 } 112 113 for (int i = 0; i < data.getClasses().size(); i++) { 114 if(!data.getClasses().get(i).hasScore()) { 115 System.out.println(data.getClasses().get(i).getClassId() + " has no grades yet"); 116 continue; 117 } 118 System.out.println(data.getClasses().get(i).getClassId() + " " + data.getClasses().get(i).getAverageScore()); 119 } 120 121 122 } 123 124 for (int i = 0; i < data.getCourses().size(); i++) { 125 if (data.getCourses().get(i) == null || data.getCourses().get(i).getCourseSelects() == null) return; 126 if (data.getCourses().get(i).getAccessMethod().equals("考试")) { 127 if(!data.getCourses().get(i).hasScore()) { 128 System.out.println(data.getCourses().get(i).getName() + " has no grades yet"); 129 continue; 130 } 131 System.out.println(data.getCourses().get(i).getName() + " " + data.getCourses().get(i).getAverageUsualScore() + " " + 132 data.getCourses().get(i).getAverageFinalScore() + " " + 133 data.getCourses().get(i).getAverageTotalScore()); 134 } 135 if (data.getCourses().get(i).getAccessMethod().equals("考察")) { 136 if(!data.getCourses().get(i).hasScore()) { 137 System.out.println(data.getCourses().get(i).getName() + " has no grades yet"); 138 continue; 139 } 140 System.out.println(data.getCourses().get(i).getName() + " " + data.getCourses().get(i).getAverageFinalScore() + " " + 141 data.getCourses().get(i).getAverageTotalScore()); 142 } 143 } 144 145 for (int i = 0; i < data.getClasses().size(); i++) { 146 if(!data.getClasses().get(i).hasScore()) { 147 System.out.println(data.getClasses().get(i).getClassId() + " has no grades yet"); 148 continue; 149 } 150 System.out.println(data.getClasses().get(i).getClassId() + " " + data.getClasses().get(i).getAverageScore()); 151 } 152 153 154 155 156 } 157 158 } 159 public static Course searchCourse(String courseName, Data data) { 160 for (int i = 0; i < data.getCourses().size(); i++) { 161 if (data.getCourses().get(i).getName().equals(courseName)) { 162 return data.getCourses().get(i); 163 } 164 } 165 return null; 166 } 167 168 public static Student searchStudent(String studentId, Data data) { 169 for (int i = 0; i < data.getStudents().size(); i++) { 170 if (data.getStudents().get(i).getId().equals(studentId)) { 171 return data.getStudents().get(i); 172 } 173 } 174 return null; 175 } 176 177 public static Class searchClass(String classId, Data data) { 178 for (int i = 0; i < data.getClasses().size(); i++) { 179 if (data.getClasses().get(i).getClassId().equals(classId)) { 180 return data.getClasses().get(i); 181 } 182 } 183 return null; 184 } 185 186 public static CourseSelect searchCourseSelect(Course course, Student student,Data data) { 187 for (int i = 0; i < data.getCourseSelects().size(); i++) { 188 if (data.getCourses().get(i).equals(course) && data.getStudents().get(i).equals(student)) { 189 return data.getCourseSelects().get(i); 190 } 191 } 192 return null; 193 } 194 195 } 196 197 class AccessScore extends Score { //考察成绩类 198 private int finalScore; 199 200 @Override 201 public int getUsualScore() { 202 return 0; 203 } 204 205 public AccessScore(int finalScore) { 206 super(); 207 if (finalScore < 0 || finalScore >100) return; 208 this.finalScore = finalScore; 209 } 210 211 public int getFinalScore() { 212 return this.finalScore; 213 } 214 215 public int getTotalScore() { //考察总成绩=期末成绩 216 return this.finalScore; 217 } 218 } 219 220 class Class implements Comparable<Class> { //班级类 221 private String classId = null; 222 private ArrayList<Student> students = new ArrayList(); 223 224 225 public Class() { 226 // TODO Auto-generated constructor stub 227 } 228 229 230 public Class(String classId) { 231 super(); 232 this.classId = classId; 233 } 234 235 public String getClassId() { 236 return classId; 237 } 238 239 240 public void setClassId(String classId) { 241 this.classId = classId; 242 } 243 244 245 public ArrayList<Student> getStudents() { 246 return students; 247 } 248 249 250 public void setStudents(ArrayList<Student> students) { 251 this.students = students; 252 } 253 254 @Override 255 public int compareTo(Class studentClass) { //比较班级的班号,如果比该班级大返回1,小则返回-1,相等返回0 256 // TODO Auto-generated method stub 257 if (Integer.parseInt(classId) > Integer.parseInt(studentClass.classId)) { 258 return 1; 259 } else if (Integer.parseInt(classId) < Integer.parseInt(studentClass.classId)) { 260 return -1; 261 } else return 0; 262 } 263 264 public void addStudent(Student stu) { //添加学生到班级里 265 if (this.hasStudent(stu)) return; 266 students.add(stu); 267 } 268 269 public boolean hasStudent(Student stu) { //判断该班级是否该有学生 270 for (int i = 0; i < students.size(); i++) { 271 if (students.get(i).getClassId().equals(classId)) { 272 return true; 273 } 274 } 275 return false; 276 } 277 278 public boolean hasScore() { //判断该班级是否有成绩 279 return this.getAverageScore() != -1; 280 } 281 282 public int getAverageScore() { //计算班级总成绩平均分 283 int total = 0; 284 for (int i = 0; i < this.students.size(); i ++) { 285 total += this.students.get(i).getAverageScore(); 286 } 287 if (this.students.size() == 0) return -1; 288 return (int)((double)(total / this.students.size())); 289 } 290 291 292 } 293 294 class Course implements Comparable<Course> { //课程类 295 296 private String name; //课程名称 297 private String courseType; //课程性质 298 private String accessMethod; //课程考核方式 299 private ArrayList<CourseSelect> courseSelects = new ArrayList(); 300 301 public Course() { 302 // TODO Auto-generated constructor stub 303 } 304 305 public Course(String name) { 306 super(); 307 this.name = name; 308 } 309 310 public Course(String name, String courseType, String accessMethod) { 311 super(); 312 this.name = name; 313 this.courseType = courseType; 314 this.accessMethod = accessMethod; 315 } 316 317 public Course(String name, String courseType, String accessMethod, ArrayList<CourseSelect> courseSelects) { 318 super(); 319 320 this.name = name; 321 this.courseType = courseType; 322 this.accessMethod = accessMethod; 323 this.courseSelects = courseSelects; 324 } 325 326 public String getName() { 327 return name; 328 } 329 330 public void setName(String name) { 331 this.name = name; 332 } 333 334 public String getCourseType() { 335 return courseType; 336 } 337 338 public void setCourseType(String courseType) { 339 this.courseType = courseType; 340 } 341 342 public String getAccessMethod() { 343 return accessMethod; 344 } 345 346 public void setAccessMethod(String accessMethod) { 347 this.accessMethod = accessMethod; 348 } 349 350 public ArrayList<CourseSelect> getCourseSelects() { 351 return courseSelects; 352 } 353 354 public void setCourseSelects(ArrayList<CourseSelect> courseSelects) { 355 this.courseSelects = courseSelects; 356 } 357 358 public int getAverageUsualScore() { //计算单科平时成绩平均分 359 int total = 0; 360 for (int i = 0; i < courseSelects.size(); i++) { 361 total += courseSelects.get(i).getScore().getUsualScore(); 362 } 363 if (courseSelects.size() == 0) return -1; 364 return (int)((double)(total / courseSelects.size())); 365 } 366 367 public int getAverageFinalScore() { //计算单科期末考试平均分 368 int total = 0; 369 for (int i = 0; i < courseSelects.size(); i++) { 370 total += courseSelects.get(i).getScore().getFinalScore(); 371 } 372 if (courseSelects.size() == 0) return -1; 373 return (int)((double)(total / courseSelects.size())); 374 } 375 376 public int getAverageTotalScore() { //计算单科总成绩平均分 377 int total = 0; 378 for (int i = 0; i < courseSelects.size(); i++) { 379 total += courseSelects.get(i).getScore().getTotalScore(); 380 } 381 if (courseSelects.size() == 0) return -1; 382 return (int)((double)(total / courseSelects.size())); 383 } 384 385 public boolean hasScore() { //判断该课程是否有成绩 386 return this.getAverageTotalScore() != -1; 387 } 388 389 @Override 390 public int compareTo(Course course) { //比较该课程名称的字符顺序,如果大返回1,小则返回-1,相等返回0 391 // TODO Auto-generated method stub 392 return Collator.getInstance(Locale.CHINA).compare(this.name, course.name); 393 394 } 395 396 } 397 398 class CourseSelect { //选课类 399 private Course course; 400 private Student student; 401 private Score score; 402 403 public CourseSelect(Course course, Student student, Score score) { 404 super(); 405 this.course = course; 406 this.student = student; 407 this.score = score; 408 } 409 410 public Course getCourse() { 411 return course; 412 } 413 414 public void setCourse(Course course) { 415 this.course = course; 416 } 417 418 public Student getStudent() { 419 return student; 420 } 421 422 public void setStudent(Student student) { 423 this.student = student; 424 } 425 426 public Score getScore() { 427 return score; 428 } 429 430 public void setScore(Score score) { 431 this.score = score; 432 } 433 434 435 436 } 437 438 class Data { //数据类,存储数据 439 private ArrayList<Course> courses = new ArrayList(); 440 private ArrayList<Student> students = new ArrayList(); 441 private ArrayList<Class> classes = new ArrayList(); 442 private ArrayList<CourseSelect> courseSelects = new ArrayList(); 443 444 public ArrayList<Course> getCourses() { 445 return courses; 446 } 447 public void setCourses(ArrayList<Course> courses) { 448 this.courses = courses; 449 } 450 public ArrayList<Student> getStudents() { 451 return students; 452 } 453 public void setStudents(ArrayList<Student> students) { 454 this.students = students; 455 } 456 public ArrayList<Class> getClasses() { 457 return classes; 458 } 459 public void setClasses(ArrayList<Class> classes) { 460 this.classes = classes; 461 } 462 public ArrayList<CourseSelect> getCourseSelects() { 463 return courseSelects; 464 } 465 public void setCourseSelects(ArrayList<CourseSelect> courseSelects) { 466 this.courseSelects = courseSelects; 467 } 468 469 470 471 } 472 473 class ExamScore extends Score { //考试成绩类 474 private int usualScore = -1; 475 private int finalScore = -1; 476 477 public ExamScore(int usualScore, int finalScore) { 478 super(); 479 if (usualScore < 0 || usualScore >100) return; 480 if (finalScore < 0 || finalScore >100) return; 481 this.usualScore = usualScore; 482 this.finalScore = finalScore; 483 } 484 485 @Override 486 public int getUsualScore() { 487 return this.usualScore; 488 } 489 490 public int getFinalScore() { 491 return this.finalScore; 492 } 493 494 public int getTotalScore() { //考试总成绩=平时成绩*0.3+期末成绩*0.7 495 return (int)((double)(this.usualScore * 0.3 + this.finalScore * 0.7)); 496 } 497 } 498 499 abstract class Score { //抽象分数类 500 public abstract int getUsualScore(); //平时成绩 501 public abstract int getFinalScore(); //期末成绩 502 public abstract int getTotalScore(); //总成绩 503 504 public Score() { 505 // TODO Auto-generated constructor stub 506 } 507 508 } 509 class Student implements Comparable<Student> { //学生类 510 private String id = null; //学号 511 private String name = null; //姓名 512 private ArrayList<CourseSelect> courseSelects = new ArrayList(); //选课 513 514 public Student(String id, String name) { 515 super(); 516 if (id.length() == 8) { 517 this.id = id; 518 } 519 if (name.length() < 10 && name.length() > 0) { 520 this.name = name; 521 } 522 523 } 524 525 public Student(String id, String name, ArrayList<CourseSelect> courseSelects) { 526 super(); 527 this.id = id; 528 this.name = name; 529 this.courseSelects = courseSelects; 530 } 531 532 public String getId() { 533 return id; 534 } 535 536 public void setId(String id) { 537 this.id = id; 538 } 539 540 public String getName() { 541 return name; 542 } 543 544 public void setName(String name) { 545 this.name = name; 546 } 547 548 public ArrayList<CourseSelect> getCourseSelects() { 549 return courseSelects; 550 } 551 552 public void setCourseSelects(ArrayList<CourseSelect> courseSelects) { 553 this.courseSelects = courseSelects; 554 } 555 556 public String getClassId() { 557 return this.id.substring(0, 6); 558 } 559 560 public boolean hasScore() { //判断该学生是否有成绩 561 return this.getAverageScore() != -1; 562 } 563 564 public int getAverageScore() { //计算学生所有课程总成绩的平均分 565 int total = 0; 566 for (int i = 0; i < courseSelects.size(); i++) { 567 total += courseSelects.get(i).getScore().getTotalScore(); 568 } 569 if (courseSelects.size() == 0) return -1; 570 return (int)((double)(total / courseSelects.size())); 571 } 572 573 @Override 574 public int compareTo(Student student) { //比较学生的学号,如果比该学生student大返回1,小则返回-1,相等返回0 575 // TODO Auto-generated method stub 576 if (Integer.parseInt(id) > Integer.parseInt(student.id)) { 577 return 1; 578 } else if (Integer.parseInt(id) < Integer.parseInt(student.id)) { 579 return -1; 580 } else return 0; 581 582 } 583 584 585 586 }
分析
Score类为抽象类,AccessScore类和ExamScore类继承Score类,分别代表考察成绩和考试成绩两个类。类中的属性根据题目要求可以设计好。CourseSelect类、Class类、Course类和Student类设计方法同理。主方法主要创建了四个ArrayList数组。分别用来存储输入的课程信息、学生选课信息、成绩信息等,同时运用正则表达式匹配课程信息和成绩信息。在这题中,还使用了Comparable接口,在计算成绩之后,对ArrayList数组进行排序。但是我的主方法设计的不够完整,有很多缺陷,没有完全符合题目要求,因此也没有拿到很多分。
题目集9
7-1 统计Java程序中关键词的出现次数
编写程序统计一个输入的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
源码
1 import java.util.Arrays; 2 import java.util.Comparator; 3 import java.util.HashMap; 4 import java.util.HashSet; 5 import java.util.Map; 6 import java.util.Scanner; 7 import java.util.TreeMap; 8 import java.util.regex.Matcher; 9 import java.util.regex.Pattern; 10 11 public class Main { 12 static Scanner input = new Scanner(System.in); 13 public static void main(String[] args) { 14 String code = StringConnection(); 15 if (NoSourceCodeinput(code)) { 16 System.out.println("Wrong Format"); 17 System.exit(0); 18 } 19 Map<String, Integer> orderMap = sortMapByKey(matchKeyWords(splitCode(removeNote(removeString(code))))); 20 orderMap.forEach((str, count) -> System.out.println(count + "\t" + str)); 21 } 22 public static boolean NoSourceCodeinput(String code) { //当未输入源码时,程序输出Wrong Format 23 if (code == "") return true; 24 return false; 25 } 26 public static String removeNote(String code) { //去除注释中的关键字 27 return Pattern.compile("(/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/|[ \\t]*//.*|\t@.*)").matcher(code).replaceAll(""); 28 } 29 public static String removeString(String code) { //去除字符串中的关键字 30 return Pattern.compile("\"(.*[^\\\\]|)\"").matcher(code).replaceAll(""); 31 } 32 public static String StringConnection() { //将代码的每一个字符串一起连接起来成为新的字符串 33 String code = ""; 34 String line = ""; 35 while (!(line = input.nextLine()).equals("exit")) { 36 code = code.concat("\n").concat(line); 37 } 38 return code; 39 } 40 public static String[] splitCode(String code) { //分割代码储存在一个数组中 41 return code.split("\\s+|\\{|\\}|\\.|\\,|\\[|\\]|;|\\(|\\)"); 42 } 43 public static HashMap<String, Integer> matchKeyWords(String[] code) { 44 HashSet<String> keyWords = new HashSet<String>(); 45 keyWords.addAll(Arrays.asList("abstract、assert、boolean、break、byte、case、catch、char、class、continue、default、do、double、else、enum、extends、final、finally、float、for、if、implements、import、int、interface、instanceof、long、native、new、package、private、protected、public、return、short、static、strictfp、super、switch、synchronized、this、throw、throws、transient、try、void、volatile、while、goto、const、true、false、null".split("、"))); 46 HashMap<String, Integer> matchKeyWords = new HashMap<String, Integer>(); 47 for (String str: code) { 48 if (keyWords.contains(str)) { 49 //如果hashMap中有此字符,则次数增1 50 if (matchKeyWords.get(str) == null) { 51 matchKeyWords.put(str, 1); 52 continue; 53 } 54 int count = matchKeyWords.get(str); 55 count++; 56 matchKeyWords.put(str, count); 57 } 58 } 59 return matchKeyWords; 60 } 61 public static Map<String, Integer> sortMapByKey(HashMap<String, Integer> map) { //当有统计数据时,关键字按照升序排列 62 if (map == null || map.isEmpty()) return null; 63 TreeMap<String, Integer> sortMap = new TreeMap<String, Integer>(new Comparator<String>() { 64 public int compare(String obj1, String obj2) { 65 return obj1.compareTo(obj2);//升序排序 66 } 67 }); 68 sortMap.putAll(map); 69 return sortMap; 70 } 71 }
分析
主要考察了map和set的使用。我创建了几个方法,removeString()来去除字符串中的关键字,removeNote()来去除注释中的关键字,stringConnection()来连接字符串,splitCode()来分割代码储存在一个数组里,最核心的方法是matchKeyWords()匹配关键字和sortMapByKey()将统计数据按升序排序。
题目集10
7-1 容器-HashMap-检索
输入多个学生的成绩信息,包括:学号、姓名、成绩。
学号是每个学生的唯一识别号,互不相同。
姓名可能会存在重复。
使用HashMap存储学生信息,并实现根据学号的检索功能
输入格式:
输入多个学生的成绩信息,每个学生的成绩信息格式:学号+英文空格+姓名+英文空格+成绩
以“end”为输入结束标志
end之后输入某个学号,执行程序输出该生的详细信息
输出格式:
输出查询到的学生信息格式:学号+英文空格+姓名+英文空格+成绩
如果没有查询到,则输出:"The student "+查询的学号+" does not exist"
输入样例1:
在这里给出一组输入。例如:
20201107 张少军 83
20201116 李四 78
20201118 郑觉先 80
end
20201116
输出样例1:
在这里给出相应的输出。例如:
20201116 李四 78
输入样例2:
在这里给出一组输入。例如:
20201107 张少军 83
20201116 李四 78
20201118 郑觉先 80
end
20202316
输出样例2:
在这里给出相应的输出。例如:
The student 20202316 does not exist
源码
1 import java.util.HashMap; 2 import java.util.Scanner; 3 4 public class Main { 5 6 public static void main(String[] args) { 7 // TODO Auto-generated method stub 8 HashMap<String, String[]> map = new HashMap<String, String[]>(); 9 Scanner input = new Scanner(System.in); 10 String information = ""; 11 String id = ""; //学号 12 13 while (!information.equals("end")) { //存入学生信息到map中 14 information = input.nextLine(); 15 String [] informations = null; 16 String [] value = new String[2]; //姓名和成绩 17 if (information.equals("end")) break; 18 informations = information.split(" "); 19 id = informations[0]; 20 value[0] = informations[1]; 21 value[1] = informations[2]; 22 map.put(id, value); 23 } 24 String matchStudentId = input.next(); 25 if (map.containsKey(matchStudentId)) { 26 System.out.println(matchStudentId + " " + map.get(matchStudentId)[0] + " " + map.get(matchStudentId)[1]); 27 } else System.out.println("The student " + matchStudentId + " does not exist"); 28 29 } 30 31 }
分析
主要考察的是HashMap如何检索信息,我是用下面的方法进行检索的。
String matchStudentId = input.next();
if (map.containsKey(matchStudentId)) {
System.out.println(matchStudentId + " " + map.get(matchStudentId)[0] + " " + map.get(matchStudentId)[1]);
} else System.out.println("The student " + matchStudentId + " does not exist");
7-2 容器-HashMap-排序
输入多个学生的成绩信息,包括:学号、姓名、成绩。
学号是每个学生的唯一识别号,互不相同。
姓名可能会存在重复。
要求:使用HashMap存储学生信息。
输入格式:
输入多个学生的成绩信息,每个学生的成绩信息格式:学号+英文空格+姓名+英文空格+成绩
以“end”为输入结束标志
输出格式:
按学号从大到小的顺序输出所有学生信息,每个学生信息的输出格式:学号+英文空格+姓名+英文空格+成绩
输入样例:
在这里给出一组输入。例如:
20201124 张少军 83
20201136 李四 78
20201118 郑觉先 80
end
输出样例:
在这里给出相应的输出。例如:
20201136 李四 78
20201124 张少军 83
20201118 郑觉先 80
源码
1 import java.util.Comparator; 2 import java.util.HashMap; 3 import java.util.Map; 4 import java.util.Scanner; 5 import java.util.TreeMap; 6 7 public class Main { //HashMap排序 8 9 public static void main(String[] args) { 10 // TODO Auto-generated method stub 11 HashMap<String, String[]> map = new HashMap<String, String[]>(); 12 Scanner input = new Scanner(System.in); 13 String information = ""; 14 String id = ""; //学号 15 while (!information.equals("end")) { //存入学生信息到map中 16 information = input.nextLine(); 17 String [] informations = null; 18 String [] value = new String[2]; //姓名和成绩 19 if (information.equals("end")) break; 20 informations = information.split(" "); 21 id = informations[0]; 22 value[0] = informations[1]; 23 value[1] = informations[2]; 24 map.put(id, value); 25 } 26 sortMapByKey(map).forEach((k, v) -> System.out.println(k + " " + map.get(k)[0] + " " + map.get(k)[1])); 27 28 } 29 public static Map<String, String[]> sortMapByKey(HashMap<String, String[]> map) { //关键字按照降序排列 30 if (map == null || map.isEmpty()) return null; 31 TreeMap<String, String[]> sortMap = new TreeMap<String, String[]>(new Comparator<String>() { 32 public int compare(String id1, String id2) { 33 return id2.compareTo(id1);//降序排序 34 } 35 }); 36 sortMap.putAll(map); 37 return sortMap; 38 } 39 40 41 }
分析
主要考察的是HashMap的排序问题,在这里我是运用treeMap对HashMap的关键字进行降序排序
public static Map<String, String[]> sortMapByKey(HashMap<String, String[]> map) { //关键字按照降序排列
if (map == null || map.isEmpty()) return null;
TreeMap<String, String[]> sortMap = new TreeMap<String, String[]>(new Comparator<String>() {
public int compare(String id1, String id2) {
return id2.compareTo(id1);//降序排序
}
});
sortMap.putAll(map);
return sortMap;
}
题目集11
7-2 课程成绩统计程序-3
课程成绩统计程序-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
类图
源码
1 import java.util.ArrayList; 2 import java.util.Collections; 3 import java.util.Scanner; 4 import java.text.Collator; 5 import java.util.Locale; 6 7 public class Main { 8 9 public static void main(String[] args) { 10 Scanner input = new Scanner(System.in); 11 String information = "start"; 12 String courseInformation[] = null; 13 String courseScoreInformation[] = null; 14 int flag = 0; 15 ArrayList<Student> students = new ArrayList<Student>(); 16 String course = input.nextLine(); 17 if (!(course.charAt(0) <= '9' && course.charAt(0) >= '0')) { 18 courseInformation = course.split(" "); 19 } 20 while (!information.equals("end")) { 21 information = input.nextLine(); 22 courseScoreInformation = information.split(" "); 23 if (Integer.parseInt(courseInformation[3]) >= 4 && Integer.parseInt(courseInformation[3]) <= 9) { 24 int number1 = Integer.parseInt(courseInformation[3]); 25 if (courseInformation.length < 4 + number1 || courseInformation.length > 4 + number1) { 26 System.out.println(courseInformation[0] +" : number of scores does not match"); 27 return; 28 } else { 29 double weightValue = 0; 30 for (int i = 4; i < courseInformation.length; i++) { 31 weightValue += Float.parseFloat(courseInformation[i]); 32 } 33 if (Math.abs(weightValue - 1) > 0.001) { 34 System.out.println(courseInformation[0] + " : weight value error"); 35 return; 36 } else { 37 if (courseScoreInformation.length > 3 + number1) { 38 Student student = new Student(courseScoreInformation[0], courseScoreInformation[1]); 39 students.add(student); 40 System.out.println(courseScoreInformation[0] + " " + courseScoreInformation[1] + " : access mode mismatch"); 41 System.out.println(courseScoreInformation[0] + " " + courseScoreInformation[1] + " did not take any exams"); 42 System.out.println(courseInformation[0] + " has no grades yet"); 43 System.out.println(courseScoreInformation[0].substring(0, 6) + " has no grades yet"); 44 break; 45 } 46 if (courseScoreInformation.length > 1) { 47 double total = 0; 48 for (int i = 4; i < courseInformation.length; i++) { 49 total += Float.parseFloat(courseScoreInformation[i - 1]) * Float.parseFloat(courseInformation[i]); 50 } 51 Student student = new Student(courseScoreInformation[0], courseScoreInformation[1], (int)total); 52 students.add(student); 53 flag = 1; 54 } 55 } 56 } 57 58 } 59 if (courseScoreInformation.length == 1) break; 60 61 if (courseInformation[1].equals("必修") && courseInformation[2].equals("实验")){ 62 System.out.println(courseInformation[0] + " : course type & access mode mismatch"); 63 System.out.println("wrong format"); 64 } else if (courseScoreInformation[3].matches("[0-3]")) { 65 System.out.println("wrong format"); 66 System.out.println(courseInformation[0] + " has no grades yet"); 67 break; 68 } else { 69 int number2 = Integer.parseInt(courseScoreInformation[3]); 70 if (courseScoreInformation.length > 3 + number2 && flag == 0) { 71 System.out.println(courseScoreInformation[0] + " " + courseScoreInformation[1] + " : access mode mismatch"); 72 System.out.println(courseScoreInformation[0] + " " + courseScoreInformation[1] + " did not take any exams"); 73 System.out.println(courseInformation[0] + " has no grades yet"); 74 System.out.println(courseScoreInformation[0].substring(0, 6) + " has no grades yet"); 75 return; 76 } 77 } 78 79 } 80 if (students.size() == 0) { 81 System.out.println(courseInformation[0] + " has no grades yet"); 82 return; 83 } 84 Collections.sort(students); 85 if (flag == 1) { 86 float courseTotal = 0; 87 for (int i = 0; i < students.size(); i++) { 88 System.out.println(students.get(i).getId() + " " + students.get(i).getName() + " " + students.get(i).getGrade()); 89 courseTotal += students.get(i).getGrade(); 90 } 91 System.out.println(courseInformation[0]+ " " + (int)(courseTotal / students.size())); 92 System.out.println(students.get(0).getId().substring(0, 6)+ " " + (int)(courseTotal / students.size())); 93 return; 94 } 95 } 96 } 97 98 class AccessScore extends Score { //考察成绩类 99 private int finalScore; 100 101 @Override 102 public int getUsualScore() { 103 return 0; 104 } 105 106 public AccessScore(int finalScore) { 107 super(); 108 if (finalScore < 0 || finalScore >100) return; 109 this.finalScore = finalScore; 110 } 111 112 public int getFinalScore() { 113 return this.finalScore; 114 } 115 116 public int getTotalScore() { //考察总成绩=期末成绩 117 return this.finalScore; 118 } 119 } 120 class Class implements Comparable<Class> { //班级类 121 private String classId = null; 122 private ArrayList<Student> students = new ArrayList<Student>(); 123 124 125 public Class() { 126 // TODO Auto-generated constructor stub 127 } 128 129 130 public Class(String classId) { 131 super(); 132 this.classId = classId; 133 } 134 135 public String getClassId() { 136 return classId; 137 } 138 139 140 public void setClassId(String classId) { 141 this.classId = classId; 142 } 143 144 145 public ArrayList<Student> getStudents() { 146 return students; 147 } 148 149 150 public void setStudents(ArrayList<Student> students) { 151 this.students = students; 152 } 153 154 @Override 155 public int compareTo(Class studentClass) { //比较班级的班号,如果比该班级大返回1,小则返回-1,相等返回0 156 // TODO Auto-generated method stub 157 if (Integer.parseInt(classId) > Integer.parseInt(studentClass.classId)) { 158 return 1; 159 } else if (Integer.parseInt(classId) < Integer.parseInt(studentClass.classId)) { 160 return -1; 161 } else return 0; 162 } 163 164 public void addStudent(Student stu) { //添加学生到班级里 165 if (this.hasStudent(stu)) return; 166 students.add(stu); 167 } 168 169 public boolean hasStudent(Student stu) { //判断该班级是否该有学生 170 for (int i = 0; i < students.size(); i++) { 171 if (students.get(i).getClassId().equals(classId)) { 172 return true; 173 } 174 } 175 return false; 176 } 177 178 public boolean hasScore() { //判断该班级是否有成绩 179 return this.getAverageScore() != -1; 180 } 181 182 public int getAverageScore() { //计算班级总成绩平均分 183 int total = 0; 184 for (int i = 0; i < this.students.size(); i ++) { 185 total += this.students.get(i).getAverageScore(); 186 } 187 if (this.students.size() == 0) return -1; 188 return (int)((double)(total / this.students.size())); 189 } 190 191 192 } 193 194 class Course implements Comparable<Course> { //课程类 195 196 private String name; //课程名称 197 private String courseType; //课程性质 198 private String accessMethod; //课程考核方式 199 private ArrayList<CourseSelect> courseSelects = new ArrayList<CourseSelect>(); 200 201 public Course() { 202 // TODO Auto-generated constructor stub 203 } 204 205 public Course(String name) { 206 super(); 207 this.name = name; 208 } 209 210 public Course(String name, String courseType, String accessMethod) { 211 super(); 212 this.name = name; 213 this.courseType = courseType; 214 this.accessMethod = accessMethod; 215 } 216 217 public Course(String name, String courseType, String accessMethod, ArrayList<CourseSelect> courseSelects) { 218 super(); 219 220 this.name = name; 221 this.courseType = courseType; 222 this.accessMethod = accessMethod; 223 this.courseSelects = courseSelects; 224 } 225 226 public String getName() { 227 return name; 228 } 229 230 public void setName(String name) { 231 this.name = name; 232 } 233 234 public String getCourseType() { 235 return courseType; 236 } 237 238 public void setCourseType(String courseType) { 239 this.courseType = courseType; 240 } 241 242 public String getAccessMethod() { 243 return accessMethod; 244 } 245 246 public void setAccessMethod(String accessMethod) { 247 this.accessMethod = accessMethod; 248 } 249 250 public ArrayList<CourseSelect> getCourseSelects() { 251 return courseSelects; 252 } 253 254 public void setCourseSelects(ArrayList<CourseSelect> courseSelects) { 255 this.courseSelects = courseSelects; 256 } 257 258 public int getAverageUsualScore() { //计算单科平时成绩平均分 259 int total = 0; 260 for (int i = 0; i < courseSelects.size(); i++) { 261 total += courseSelects.get(i).getScore().getUsualScore(); 262 } 263 if (courseSelects.size() == 0) return 0; 264 return (int)((double)(total / courseSelects.size())); 265 } 266 267 public int getAverageFinalScore() { //计算单科期末考试平均分 268 int total = 0; 269 for (int i = 0; i < courseSelects.size(); i++) { 270 total += courseSelects.get(i).getScore().getFinalScore(); 271 } 272 if (courseSelects.size() == 0) return -1; 273 return (int)((double)(total / courseSelects.size())); 274 } 275 276 public int getAverageTotalScore() { //计算单科总成绩平均分 277 int total = 0; 278 for (int i = 0; i < courseSelects.size(); i++) { 279 total += courseSelects.get(i).getScore().getTotalScore(); 280 } 281 if (courseSelects.size() == 0) return -1; 282 return (int)((double)(total / courseSelects.size())); 283 } 284 285 public boolean hasScore() { //判断该课程是否有成绩 286 return this.getAverageTotalScore() != -1; 287 } 288 289 @Override 290 public int compareTo(Course course) { //比较该课程名称的字符顺序,如果大返回1,小则返回-1,相等返回0 291 // TODO Auto-generated method stub 292 return Collator.getInstance(Locale.CHINA).compare(this.name, course.name); 293 294 } 295 296 } 297 class CourseSelect { //选课类 298 private Course course; 299 private Student student; 300 private Score score; 301 302 public CourseSelect(Course course, Student student, Score score) { 303 super(); 304 this.course = course; 305 this.student = student; 306 this.score = score; 307 } 308 309 public Course getCourse() { 310 return course; 311 } 312 313 public void setCourse(Course course) { 314 this.course = course; 315 } 316 317 public Student getStudent() { 318 return student; 319 } 320 321 public void setStudent(Student student) { 322 this.student = student; 323 } 324 325 public Score getScore() { 326 return score; 327 } 328 329 public void setScore(Score score) { 330 this.score = score; 331 } 332 333 334 335 } 336 class Data { //数据类,存储数据 337 private ArrayList<Course> courses = new ArrayList<Course>(); 338 private ArrayList<Student> students = new ArrayList<Student>(); 339 private ArrayList<Class> classes = new ArrayList<Class>(); 340 private ArrayList<CourseSelect> courseSelects = new ArrayList<CourseSelect>(); 341 342 public ArrayList<Course> getCourses() { 343 return courses; 344 } 345 public void setCourses(ArrayList<Course> courses) { 346 this.courses = courses; 347 } 348 public ArrayList<Student> getStudents() { 349 return students; 350 } 351 public void setStudents(ArrayList<Student> students) { 352 this.students = students; 353 } 354 public ArrayList<Class> getClasses() { 355 return classes; 356 } 357 public void setClasses(ArrayList<Class> classes) { 358 this.classes = classes; 359 } 360 public ArrayList<CourseSelect> getCourseSelects() { 361 return courseSelects; 362 } 363 public void setCourseSelects(ArrayList<CourseSelect> courseSelects) { 364 this.courseSelects = courseSelects; 365 } 366 367 368 369 } 370 class ExamScore extends Score { //考试成绩类 371 private int usualScore; 372 private int finalScore; 373 374 public ExamScore(int usualScore, int finalScore) { 375 super(); 376 if (usualScore < 0 || usualScore >100) return; 377 if (finalScore < 0 || finalScore >100) return; 378 this.usualScore = usualScore; 379 this.finalScore = finalScore; 380 } 381 382 @Override 383 public int getUsualScore() { 384 return this.usualScore; 385 } 386 387 public int getFinalScore() { 388 return this.finalScore; 389 } 390 391 public int getTotalScore() { //考试总成绩=平时成绩*0.3+期末成绩*0.7 392 return (int)((double)(this.usualScore * 0.3 + this.finalScore * 0.7)); 393 } 394 } 395 abstract class Score { //抽象分数类 396 public abstract int getUsualScore(); //平时成绩 397 public abstract int getFinalScore(); //期末成绩 398 public abstract int getTotalScore(); //总成绩 399 400 public Score() { 401 // TODO Auto-generated constructor stub 402 } 403 404 } 405 class Student implements Comparable<Student> { //学生类 406 private String id = null; //学号 407 private String name = null; //姓名 408 private int grade = 0; 409 private ArrayList<CourseSelect> courseSelects = new ArrayList<CourseSelect>(); //选课 410 411 public Student(String id, String name) { 412 super(); 413 if (id.length() == 8) { 414 this.id = id; 415 } 416 if (name.length() < 10 && name.length() > 0) { 417 this.name = name; 418 } 419 420 } 421 422 public Student(String id, String name, int grade) { 423 super(); 424 this.id = id; 425 this.name = name; 426 this.grade = grade; 427 } 428 429 public Student(String id, String name, ArrayList<CourseSelect> courseSelects) { 430 super(); 431 this.id = id; 432 this.name = name; 433 this.courseSelects = courseSelects; 434 } 435 436 public int getGrade() { 437 return grade; 438 } 439 440 public void setGrade(int grade) { 441 this.grade = grade; 442 } 443 444 public String getId() { 445 return id; 446 } 447 448 public void setId(String id) { 449 this.id = id; 450 } 451 452 public String getName() { 453 return name; 454 } 455 456 public void setName(String name) { 457 this.name = name; 458 } 459 460 public ArrayList<CourseSelect> getCourseSelects() { 461 return courseSelects; 462 } 463 464 public void setCourseSelects(ArrayList<CourseSelect> courseSelects) { 465 this.courseSelects = courseSelects; 466 } 467 468 public String getClassId() { 469 return this.id.substring(0, 6); 470 } 471 472 public boolean hasScore() { //判断该学生是否有成绩 473 return this.getAverageScore() != -1; 474 } 475 476 public int getAverageScore() { //计算学生所有课程总成绩的平均分 477 int total = 0; 478 for (int i = 0; i < courseSelects.size(); i++) { 479 total += courseSelects.get(i).getScore().getTotalScore(); 480 } 481 if (courseSelects.size() == 0) return 0; 482 return (int)((double)(total / courseSelects.size())); 483 } 484 485 @Override 486 public int compareTo(Student student) { //比较学生的学号,如果比该学生student大返回1,小则返回-1,相等返回0 487 // TODO Auto-generated method stub 488 if (Integer.parseInt(id) > Integer.parseInt(student.id)) { 489 return 1; 490 } else if (Integer.parseInt(id) < Integer.parseInt(student.id)) { 491 return -1; 492 } else return 0; 493 494 } 495 496 497 498 }
分析
由于这一题并没有做出来,只是对了很少的一部分样例,在此不做分析。
7-3 jmu-Java-02基本语法-03-身份证排序
- 输入n,然后连续输入n个身份证号。
- 然后根据输入的是sort1还是sort2,执行不同的功能。输入的不是sort1或sort2,则输出
exit
并退出。
输入sort1,将每个身份证的年月日抽取出来,按年-月-日格式组装,然后对组装后的年-月-日升序输出。
输入sort2,将所有身份证按照里面的年月日升序输出。
注意:处理输入的时候,全部使用Scanner
的nextLine()
方法,以免出错。
输入样例:
6
410425198309308225
320203197206115011
431227196108033146
330226196605054190
34080019810819327X
320111197112301539
sort1
sort2
e
输出样例:
1961-08-03
1966-05-05
1971-12-30
1972-06-11
1981-08-19
1983-09-30
431227196108033146
330226196605054190
320111197112301539
320203197206115011
34080019810819327X
410425198309308225
exit
源码
1 import java.util.ArrayList; 2 import java.util.Collections; 3 import java.util.Scanner; 4 5 public class Main { // jmu-Java-02基本语法-03-身份证排序 6 7 public static void main(String[] args) { 8 // TODO Auto-generated method stub 9 Scanner input = new Scanner(System.in); 10 int number = Integer.parseInt(input.nextLine()); //输入身份证的数量 11 int count = 0; 12 ArrayList<Identity> identities = new ArrayList<Identity>(); //储存年月日 13 while (count != number) { 14 String str = input.nextLine(); 15 Identity identity = new Identity(str); 16 identities.add(identity); 17 count++; 18 } 19 Collections.sort(identities); 20 String sort = "sort1"; 21 while (!(!sort.equals("sort1") && !sort.equals("sort2"))) { 22 sort = input.nextLine(); 23 if (!sort.equals("sort1") && !sort.equals("sort2")) { 24 System.out.println("exit"); 25 break; 26 } 27 if (sort.equals("sort1")) { 28 for(int i = 0; i < identities.size(); i++) { 29 System.out.println(identities.get(i).getYear() + "-" + identities.get(i).getMOnth() + "-" + identities.get(i).getDay()); 30 } 31 } 32 if (sort.equals("sort2")) { 33 for(int i = 0; i < identities.size(); i++) { 34 System.out.println(identities.get(i).getIdentity()); 35 } 36 } 37 } 38 39 40 } 41 42 } 43 class Identity implements Comparable<Identity>{ 44 private String identity; 45 46 public Identity(String identity) { 47 super(); 48 this.identity = identity; 49 } 50 public String getDate() { 51 return this.identity.substring(6, 14); 52 } 53 public String getYear() { 54 return this.identity.substring(6, 10); 55 } 56 public String getMOnth() { 57 return this.identity.substring(10, 12); 58 } 59 public String getDay() { 60 return this.identity.substring(12, 14); 61 } 62 public String getIdentity() { 63 return identity; 64 } 65 public void setIdentity(String identity) { 66 this.identity = identity; 67 } 68 @Override 69 public int compareTo(Identity o) { 70 // TODO Auto-generated method stub 71 int date1 = Integer.parseInt(getDate()); 72 int date2 = Integer.parseInt(o.getDate()); 73 return date1 - date2; 74 } 75 }
分析
这里考察的主要是ArrayList的排序,我在Identity类里实现了comparable接口,使得每一个Identity对象可以进行比较,从而能够使用Collection.sort方法对ArrayList里的对象排序。
三、踩坑心得
第九次作业
这次作业踩的一个坑是代码中的[]以及,分隔,这个卡了好久。后面发现是splitCode()方法里的正则表达式出现了问题。
踩坑截图
改正后
第十一次作业
这次作业踩的一个坑是stack的满栈和空栈问题。
踩坑截图
改正后
1 import java.util.Arrays; 2 import java.util.Scanner; 3 4 public class Main { 5 6 public static void main(String[] args) { 7 // TODO Auto-generated method stub 8 Scanner input = new Scanner(System.in); 9 int n = input.nextInt(); //输入n,建立可包含n个元素的ArrayIntegerStack对象 10 ArrayIntegerStack array = new ArrayIntegerStack(n); 11 int m = input.nextInt(); //输入m个值,均入栈。每次入栈均打印入栈返回结果。 12 int count = 0; 13 while (count != m) { 14 Integer item = input.nextInt(); 15 System.out.println(array.push(item)); 16 count++; 17 } 18 //输出栈顶元素,输出是否为空,输出size 19 System.out.println(array.peek() + "," + array.empty() + "," + array.size()); 20 //使用Arrays.toString()输出内部数组中的值。 21 System.out.println(Arrays.toString(array.getStack())); 22 int x = input.nextInt(); //输入x,然后出栈x次,每次出栈均打印。 23 count = 0; 24 while (count != x) { 25 System.out.println(array.pop()); 26 count++; 27 } 28 //输出栈顶元素,输出是否为空,输出size 29 System.out.println(array.peek() + "," + array.empty() + "," + array.size()); 30 //使用Arrays.toString()输出内部数组中的值。 31 System.out.println(Arrays.toString(array.getStack())); 32 } 33 34 } 35 36 interface IntegerStack { 37 public Integer push(Integer item); 38 //如果item为null,则不入栈直接返回null。如果栈满,也返回null。如果插入成功,返回item。 39 40 public Integer pop(); //出栈,如果为空,则返回null。出栈时只移动栈顶指针,相应位置不置为null 41 public Integer peek(); //获得栈顶元素,如果为空,则返回null. 42 public boolean empty(); //如果为空返回true 43 public int size(); //返回栈中元素个数 44 } 45 46 class ArrayIntegerStack implements IntegerStack { 47 private int max = 0; 48 private int size = 0; 49 private Integer[] stack; 50 public ArrayIntegerStack(int n) { 51 stack = new Integer[n]; 52 max = n; 53 } 54 55 public Integer[] getStack() { 56 return stack; 57 } 58 59 public void setStack(Integer[] stack) { 60 this.stack = stack; 61 } 62 63 @Override 64 public Integer push(Integer item) { 65 //如果item为null,则不入栈直接返回null。如果栈满,也返回null。如果插入成功,返回item。 66 if (item == null) { 67 return null; 68 } else if (size == max) { 69 return null; 70 } else { 71 stack[size] = item; 72 size++; 73 return item; 74 } 75 } 76 @Override 77 public Integer pop() { //出栈,如果为空,则返回null。出栈时只移动栈顶指针,相应位置不置为null 78 if (empty()) { 79 return null; 80 } else { 81 size--; 82 return stack[size]; 83 } 84 85 } 86 87 @Override 88 public Integer peek() { //获得栈顶元素,如果为空,则返回null. 89 if (empty()) { 90 return null; 91 } else { 92 return stack[size - 1]; 93 } 94 95 } 96 97 @Override 98 public boolean empty() { //如果为空返回true 99 if (size == 0) return true; 100 return false; 101 } 102 103 @Override 104 public int size() { //返回栈中元素个数 105 return size; 106 } 107 108 }
四、改进建议
1.把重复代码改成方法来实现功能,减少代码量,使得代码更加简洁,也更符合单一职责。
2.要养成写注释的好习惯,每一个方法都要写注释,便于自己查看。
五、总结
通过这一阶段的学习和做题,我了解和基本掌握了map和set的用法,知道了HashMap如何检索和排序,也会ArrayList的排序方法。同时通过写雨刷的仿真系统以及农夫过河的游戏界面,我熟悉了JavaFx的一些基本组件和用法,懂得了一些界面设计的方法。
六、对本门课程进行客观性评价
教学理念(OBE)
在我看来,段老师教学理念中以学生为主体,发挥学生的主观能动性,充分调动学生的思考,激发学生的兴趣。
教学方法(边讲边练)
我比较赞同这种的教学方法,通过边讲边练,我们可以熟练老师上课讲的方法并加以实践,达到巩固的效果。
教学组织(线上线下混合式教学)
通过观看学习通的线上视频,我们可以提前预习老师要讲的内容,达到一个预习的作用,这是很好的,可以让我们提前知道哪个知识点是自己上课需要特别注意的。
教学过程(PTA题目集驱动)
总体还是可以的,提高了一定的编程能力。但是有时候pta题目集比较难和多,会跟其他科目的作业之类的起冲突,无法分配好做题时间,所以可以适当减少一点题目难度或者减少题量。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】