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)成绩平均分只取整数部分,小数部分丢弃

参考类图:


image.png

输入样例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.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
 
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

源码

复制代码
 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
 
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

源码

复制代码
 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
 
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

源码

复制代码
 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)成绩平均分只取整数部分,小数部分丢弃

参考类图(与第一次相同,其余内容自行补充):

fdada4ca193119ee30531ab82ffebbfa_9dbcf4e8-1627-4cf6-8764-cccf44947e2a.png

输入样例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
 
代码长度限制
25 KB
时间限制
1500 ms
内存限制
64 MB

类图

源码

复制代码
  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-身份证排序

  1. 输入n,然后连续输入n个身份证号。
  2. 然后根据输入的是sort1还是sort2,执行不同的功能。输入的不是sort1或sort2,则输出exit并退出。
    输入sort1,将每个身份证的年月日抽取出来,按年-月-日格式组装,然后对组装后的年-月-日升序输出。
    输入sort2,将所有身份证按照里面的年月日升序输出。

注意:处理输入的时候,全部使用ScannernextLine()方法,以免出错。

输入样例:

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

 
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

源码

复制代码
 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题目集比较难和多,会跟其他科目的作业之类的起冲突,无法分配好做题时间,所以可以适当减少一点题目难度或者减少题量。

教学模式(BOPPPS)

段老师采用的应该是以教育目标为导向,以学生为中心的教学模式,达到了一个比较好的教学成果。
 
 
posted @   Oct&LY  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示