第三次Blog作业
一、前言
大一下学期的Java课马上结束了,已经开始学习面向对象程序设计一个学期了,学到了很多,如何把难度的一个大问题拆成一个个小问题,逐个分析解决,这几次的作业也发现了,设计好结构是很重要的,类间关系,方法的设计,都是很重要的,很难。这几周的pta作业主要围绕的是做课程成绩统计系统,还有一些其他的练习例如set,map,ArrayList,之间还有几次课堂测试什么的,总体来说题量不是很大,都要花时间认真好好做好好分析,这次相比上次的菜单计价系统做的好一些,难度和上一次也差不多,只不过是这次的成绩统计是完全的一代一代出的,有一个过渡还是比较友好的。
二、设计与分析
首先说一下期中考试吧,就是一个简单的类的设计分成四个问题,题目要求都很明了,还有给了很多提示,看懂了写起来就很快了,现在也看不了题目了就不过多讲诉了。
然后就是第八次题目集,就只有一道题目:课程成绩统计程序-1

题目给的参考类图如此,因为题目类型和上次的菜单计价程序很相似,就借用了上次题目中给的类的设计,先设计题目中的类图中的类,再加上CourseRecord类用来记录录入的课程信息,班级类记录学生信息,再看题目要求,要求输出三大块,每名学生的成绩信息,每门课程的成绩信息,每个班级的成绩信息。课程包括必修和选修类型,考试和考察的考核类型,必修对应考试,选修可以考试也可以考察。处理方法和菜单计价程序类似,类图和代码如下。

import java.util.*; import java.text.Collator; public class Main { static CourseRecord courseRecord = new CourseRecord(); static Classroom classroom = new Classroom(); static Course course = null; static ArrayList<TotalScore> totalScoreList = new ArrayList<TotalScore>(); static int studentAmount = 0; private static List<Course> courseList = new ArrayList<Course>(); public static void main(String[] args) { Scanner input = new Scanner(System.in); int courseAmount = 0; int id = 0; int finalscore = 0; int a3,a4; String[] temp; int count; ArrayList<Student> studentList = new ArrayList<Student>(); String string = input.nextLine(); while (!string.equals("end")) { temp = string.split(" "); count = temp.length; if(count == 2 && temp[0].matches("^\\D{1,10}$")) { if(temp[1].equals("必修")) { course = courseRecord.searthCourse(temp[0]); if (course == null) { courseRecord.courses[courseAmount] = courseRecord.addCourse(temp[0], temp[1],"考试"); courseAmount++; } }else { System.out.println(temp[0]+" : course type & access mode mismatch"); System.out.println(temp[0] + " does not exist"); } } else if(count == 3 && temp[0].matches("^\\D{1,10}$")) { if (temp[1].equals("必修")) { if (temp[2].equals("考试")) { course = courseRecord.searthCourse(temp[0]); course = courseRecord.searthCourse(temp[0]); if (course == null) { courseRecord.courses[courseAmount] = courseRecord.addCourse(temp[0], temp[1],temp[2]); courseAmount++; } } else if (temp[2].equals("考察")) { System.out.println(temp[0] + " : course type & access mode mismatch"); System.out.println(temp[0] + " does not exist"); } else { System.out.println("wrong format"); break; } } else if (temp[1].equals("选修")) { if (temp[2].equals("考试") || temp[2].equals("考察")) { course = courseRecord.searthCourse(temp[0]); if (course == null) { courseRecord.courses[courseAmount] = courseRecord.addCourse(temp[0], temp[1],temp[2]); courseAmount++; } // courseRecord.courses[courseAmount] = courseRecord.addCourse(temp[0], temp[1], temp[2]); // courseAmount++; } else { System.out.println("wrong format"); break; } } else { System.out.println("wrong format"); break; } } else if(count == 4 && temp[3].matches("^(100|[1-9]\\d|\\d)$")) { id = Integer.parseInt(temp[0]); a3 = Integer.parseInt(temp[3]); finalscore = a3; if(a3 > 100 || a3 < 0 || !temp[0].matches("^[0-9]{8}$") || !temp[1].matches("^\\D{1,10}$") || !temp[2].matches("^\\D{1,10}$")){ System.out.println("wrong format"); break; } course = courseRecord.searthCourse(temp[2]); if (course == null) { TotalScore totalScoreObj = new TotalScore(id, temp[1], 0); totalScoreList.add(totalScoreObj); classroom.addStudents2(temp[0], temp[1],0, 0, 0); studentAmount++; Student studentObj = new Student(temp[0], temp[1], course, 0, 0); studentList.add(studentObj); } if (course != null) { if(!course.accessMode.equals("考察")) { System.out.println(id + " " + temp[1] + " : access mode mismatch"); TotalScore totalScoreObj = new TotalScore(id, temp[1], 0); totalScoreList.add(totalScoreObj); } else { TotalScore totalScoreObj = new TotalScore(id, temp[1], finalscore); totalScoreList.add(totalScoreObj); classroom.addStudents2(temp[0], temp[1],0, 0, finalscore); studentAmount++; Student studentObj = new Student(temp[0], temp[1], course, 0, a3); studentList.add(studentObj); } } } else if(count == 5 && temp[3].matches("^(100|[1-9]\\d|\\d)$") && temp[4].matches("^(100|[1-9]\\d|\\d)$")) { id = Integer.parseInt(temp[0]); a3 = Integer.parseInt(temp[3]); a4 = Integer.parseInt(temp[4]); finalscore = (int) Math.floor(a3 * 0.3 + a4 * 0.7); if(a3 > 100 || a3 < 0 || a4 > 100 || a4 < 0 || !temp[0].matches("^[0-9]{8}$") || !temp[1].matches("^\\D{1,10}$") || !temp[2].matches("^\\D{1,10}$")){ System.out.println("wrong format"); break; } course = courseRecord.searthCourse(temp[2]); if (course == null) { TotalScore totalScoreObj = new TotalScore(id, temp[1], 0); totalScoreList.add(totalScoreObj); classroom.addStudents2(temp[0], temp[1],0, 0, 0); studentAmount++; Student studentObj = new Student(temp[0], temp[1], course, 0, 0); studentList.add(studentObj); } if (course != null) { TotalScore totalScoreObj = new TotalScore(id, temp[1], finalscore); totalScoreList.add(totalScoreObj); classroom.addStudents2(temp[0], temp[1], a3, a4, finalscore); studentAmount++; Student studentObj = new Student(temp[0], temp[1], course, a3, a4); studentList.add(studentObj); } } else { System.out.println("wrong format"); } string = input.nextLine(); } for(int i = 0; i < studentAmount-1 ; i++) { for(int j = 0; j < studentAmount-i-1; j++){ if(Integer.parseInt(classroom.students[j].id) > Integer.parseInt(classroom.students[j+1].id)) { Student t = classroom.students[j]; classroom.students[j] = classroom.students[j+1]; classroom.students[j + 1] = t; } } } ArrayList<String> ids = new ArrayList<String>(); for(TotalScore totalScoreObj: totalScoreList){ if(!ids.contains(totalScoreObj.id)) ids.add(totalScoreObj.id); } Collections.sort(ids); for(String id1: ids){ String name = " "; int count1 = 0; int scoreTotal = 0; for(TotalScore totalScoreObj: totalScoreList){ if(totalScoreObj.id.equals(id1)){ name = totalScoreObj.name; count1++; scoreTotal += totalScoreObj.score; } } if(count1 == 0 || scoreTotal == 0){ System.out.println(id1 + " " + name + " did not take any exams"); } else { double scoreAverage = (double)scoreTotal / count1; System.out.println(id1+" "+name+" "+ (int)scoreAverage); } } Comparator<Object> cmp = Collator.getInstance(Locale.CHINA); for(int i = 0; i < courseAmount - 1; i++) { for(int j = 0; j < courseAmount - i -1; j++) { if(cmp.compare(courseRecord.courses[j].courseName, courseRecord.courses[j + 1].courseName) > 0){ Course t = courseRecord.courses[j]; courseRecord.courses[j] = courseRecord.courses[j + 1]; courseRecord.courses[j + 1] = t; } } } for (int j = 0; j < courseAmount; j++) { int coursecount = 0; int scoreTotal3 = 0; int scoreTotal4 = 0; double scoreTotal = 0; for (Student studentObj : studentList) { if(studentObj.course != null) { if (studentObj.course.courseName.equals(courseRecord.courses[j].courseName)) { coursecount++; if(studentObj.course.courseType.equals("必修")){ scoreTotal3 += studentObj.usualgrades; scoreTotal4 += studentObj.finalgrades; scoreTotal += studentObj.usualgrades * 0.3 + studentObj.finalgrades * 0.7; } else if (studentObj.course.courseType.equals("选修")) { if(studentObj.course.accessMode.equals("考试")){ scoreTotal3 += studentObj.usualgrades; scoreTotal4 += studentObj.finalgrades; scoreTotal += studentObj.usualgrades * 0.3 + studentObj.finalgrades * 0.7; } else if (studentObj.course.accessMode.equals("考察")) { scoreTotal4 += studentObj.finalgrades; scoreTotal += studentObj.finalgrades; } } } } } if (coursecount == 0) { System.out.println(courseRecord.courses[j].courseName + " has no grades yet"); } else if(courseRecord.courses[j].courseType.equals("必修")){ double scoreAverage3 = (double) scoreTotal3 / coursecount; double scoreAverage4 = (double) scoreTotal4 / coursecount; double scoreAverage = scoreTotal / coursecount; System.out.println( courseRecord.courses[j].courseName + " "+(int)scoreAverage3 +" "+ (int)scoreAverage4 +" "+(int)scoreAverage); } else if (courseRecord.courses[j].courseType.equals("选修")) { if(courseRecord.courses[j].accessMode.equals("考试")){ double scoreAverage3 = (double) scoreTotal3 / coursecount; double scoreAverage4 = (double) scoreTotal4 / coursecount; double scoreAverage = scoreTotal / coursecount; System.out.println( courseRecord.courses[j].courseName + " "+(int)scoreAverage3 +" "+ (int)scoreAverage4 +" "+(int)scoreAverage); } else if (courseRecord.courses[j].accessMode.equals("考察")) { double scoreAverage4 = (double) scoreTotal4 / coursecount; double scoreAverage = scoreTotal / coursecount; System.out.println( courseRecord.courses[j].courseName + " " + (int)scoreAverage4 + " " + (int)scoreAverage); } } } ArrayList<String> classIds = new ArrayList<String>(); ArrayList<Classroom> classrooms = new ArrayList<Classroom>(); for (TotalScore totalScoreObj : totalScoreList) { String classId = totalScoreObj.id.substring(0, 6); if (!classIds.contains(classId)) { classIds.add(classId); Classroom classScore = new Classroom(classId, (int) totalScoreObj.score, 1); classrooms.add(classScore); } else { for (Classroom classroom1 : classrooms) { if (classroom1.classId.equals(classId)) { classroom1.sum = (int)totalScoreObj.score + classroom1.sum; classroom1.scorecount = classroom1.scorecount + 1; break; } } } } Collections.sort(classIds); for (String classId : classIds) { int classcount = 0; double scoreTotal = 0; for (Classroom classroom1 : classrooms) { if (classroom1.classId.equals(classId)) { scoreTotal = classroom1.sum; classcount = classroom1.scorecount; break; } } if (classcount == 0 || scoreTotal == 0) { System.out.println(classId + " has no grades yet"); System.exit(0); } else { double scoreAverage = scoreTotal / classcount; System.out.println(classId + " " + (int)scoreAverage); } } input.close(); } } class Course { String courseName; String courseType; String accessMode; public Course() { } } class CourseRecord { Course[] courses = new Course[100]; int courseCount = 0; public Course searthCourse(String courseName) { for (int i = courseCount - 1; i >= 0; i--) { if (courseName.equals(courses[i].courseName)) { return courses[i]; } } return null; } public Course searthCourse1(String courseName,String courseType, String accessMode) { for (int i = courseCount - 1; i >= 0; i--) { if (courseName.equals(courses[i].courseName) && courseType.equals(courses[i].courseType) && accessMode.equals(courses[i].accessMode)) { return courses[i]; } } return null; } public Course addCourse(String courseName, String courseType, String accessMode) { Course course = new Course(); course.courseName = courseName; course.courseType = courseType; course.accessMode = accessMode; courseCount++; return course; } } abstract class Score { Student student; Course course; int usualgrades; int finalgrades; public Score() { } public Score(Student student, Course course, int finalgrades) { this.student = student; this.course = course; this.finalgrades = finalgrades; } public Score(Student student, Course course, int usualgrades, int finalgrades) { this.student = student; this.course = course; this.usualgrades = usualgrades; this.finalgrades = finalgrades; } public int getTotalScore() { return 0; } } class Student { String id; String name; Course course; Integer usualgrades; Integer finalgrades; int finalscore; public Student() { } public Student(String id, String name, Course course, Integer usualgrades, Integer finalgrades) { this.id = id; this.name = name; this.course = course; this.usualgrades = usualgrades; this.finalgrades = finalgrades; } } class Classroom { Student[] students = new Student[100]; int studentcount = 0; int sum; String classId; int scorecount = 0; public Classroom() { } public Classroom(String classId, int sum, int scorecount) { this.classId = classId; this.sum = sum; this.scorecount = scorecount; } public void addStudents2(String id, String name, Integer usualgrades, Integer finalgrades, int finalscore) { students[studentcount] = new Student(); students[studentcount].id = id; students[studentcount].name = name; students[studentcount].usualgrades = usualgrades; students[studentcount].finalgrades = finalgrades; students[studentcount].finalscore = finalscore; studentcount++; } } class TotalScore{ String id; String name; double score; public TotalScore(int id, String name, double score) { this.id = String.valueOf(id); this.name = name; this.score = score; } }
解释与心得:也是通过空格符的数量判断,将对应的信息储存在对应的类中,然后就是处理输出的三大块,遍历呗,求平均然后输出,处理第二类课程是要按照课程名字排序,使用
Comparator<Object> cmp = Collator.getInstance(Locale.CHINA);可以比较英文字母和中文汉字,一开始做的时候只是按照实例要求的输出而去写,就很特殊化,没有搞清为什么输出wrong format;
为什么输出course type & access mode mismatch等等,就很混乱,后面就大致领悟了,要把所有正确的可能的情况都写出来,然后它们的反面情况再去输出这些的错误输出,而且要搞清是否是终止进行程序,大脑cpu烧了好多次。
题目测试点还有就是对于重复的课程和学生信息忽略,先写的课程信息重复,就是对输入的课程名称进行重复性检索,如果有就跳过,没有就进行记录,写上去通过了,然后再依葫芦画瓢写学生信息重复时提示我代码长度超过要求限制就很烦。
第九次题目集也就只有一道题目,统计Java程序中关键词的出现次数,代码如下。
import java.util.*; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); StringBuilder sb = new StringBuilder(); Map<String, Integer> result = new TreeMap<>(); Set<String> keywords = new HashSet<>(Arrays.asList( "abstract", "assert", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue", "default", "do", "double", "else", "enum", "extends", "false", "final", "finally", "float", "for", "if", "goto", "implements", "import", "instanceof", "int", "interface", "long", "native", "new", "null", "package", "private", "protected", "public", "return", "short", "static", "strictfp", "super", "switch", "synchronized", "this", "throw", "throws", "transient", "true", "try", "void", "volatile", "while")); while (input.hasNextLine()) { String line = input.nextLine(); if ("exit".equals(line)) { break; } sb.append(line.replaceAll("\".*\"", "").replaceAll("//.*", "")); } if(sb.indexOf("/*")!=-1) { //删除/* */ 注释的 if(sb.indexOf("*/")!=-1) { sb.replace(sb.indexOf("/*"), sb.indexOf("*/")+2, ""); } } String sb1 = sb.toString(); sb1 = sb1.replace("=", "a"); if (sb1.isEmpty()) { System.out.println("Wrong Format"); return; } for(int i = 0; i < sb1.length(); i++) { while(i < sb1.length() && !((sb1.charAt(i)>='a'&&sb1.charAt(i)<='z') || (sb1.charAt(i)>='A'&&sb1.charAt(i)<='Z'))) { i++; } int j = i; while(j < sb1.length() && ((sb1.charAt(j)>='a'&&sb1.charAt(j)<='z') || (sb1.charAt(j)>='A'&&sb1.charAt(j)<='Z'))) { j++; } if(i < sb1.length()) { String r = sb1.substring(i, j); if(keywords.contains(r)) { if(!result.containsKey(r)) { result.put(r, 1); } else { result.replace(r, (result.get(r)+1)); } } } i = j; } if (result.isEmpty()) { return; } for (Map.Entry<String, Integer> a : result.entrySet()) { System.out.println(a.getValue() + "\t" + a.getKey()); } } }
首先将关键词存在set中,然后用String输入Java源码,使用StringBuilder中的append将所有的练成一行,并且去除其中的符号改成空格,然后使用indexOf("*/")!=-1删除/* */ 注释,再用toString改为字符串,再使用双指针弄出每个单词进行关键字比较,如果是关键字就储存在Map中的TreeMap
和次数加一,自动排序输出。
然后是题目集10,前两道题考察的HashMap检察和排序
import java.util.HashMap; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); HashMap<String, String> map = new HashMap<>(); String string = input.nextLine(); while (!string.equals("end")) { String[] temp = string.split(" "); map.put(temp[0], temp[1] + " " + temp[2]); string = input.nextLine(); } String id = input.nextLine(); if (map.containsKey(id)) { System.out.println(id + " " + map.get(id)); } else { System.out.println("The student " + id + " does not exist"); } } }
import java.util.*; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); HashMap<String, String> map = new HashMap<>(); String string = input.nextLine(); while (!string.equals("end")) { String[] temp = string.split(" "); map.put(temp[0], temp[1] + " " + temp[2]); string = input.nextLine(); } Map<String, String> treeMap = new TreeMap<>((o1, o2) -> Integer.parseInt(o2) - Integer.parseInt(o1)); treeMap.putAll(map); for (String key: treeMap.keySet()) { System.out.println(key + " " + treeMap.get(key)); } } }
都是使用HashMap存储学生信息,7-1是通过输入学号检察是否存在,使用map.containsKey(id)进行比较,因为学号是每个学生的唯一识别号,互不相同。姓名可能会存在重复。7-2是进行按学号从大到小的顺序输出所有学生信息,使用TreeMap中的Map<String, String> treeMap = new TreeMap<>((o1, o2) -> Integer.parseInt(o2) - Integer.parseInt(o1));进行倒序排序然后依次输出。
7-3课程成绩统计程序-2,这次在第一次的基础上增加了实验课,实验课程成绩信息包括:学号、姓名、课程名称、实验次数、每次成绩,实验次数至少4次,不超过9次,这就说明了实验信息的空格数不是固定的所以用空格范围判断,再直接计算实验的平均成绩存入,类图如下。

import java.util.*; import java.text.Collator; public class Main { static CourseRecord courseRecord = new CourseRecord(); static Classroom classroom = new Classroom(); static Course course = null; static Student student = null; static ArrayList<TotalScore> totalScoreList = new ArrayList<TotalScore>(); static int studentAmount = 0; private static List<Course> courseList = new ArrayList<Course>(); public static void main(String[] args) { Scanner input = new Scanner(System.in); int courseAmount = 0; int id = 0; int times = 0; //实验次数 int finalscore = 0; int a3,a4; String[] temp; int count; ArrayList<Student> studentList = new ArrayList<Student>(); String string = input.nextLine(); while (!string.equals("end")) { temp = string.split(" "); count = temp.length; if(count == 2 && temp[0].matches("^\\D{1,10}$")) { if(temp[1].equals("必修")) { course = courseRecord.searthCourse(temp[0]); if (course == null) { courseRecord.courses[courseAmount] = courseRecord.addCourse(temp[0], temp[1],"考试"); courseAmount++; } }else { System.out.println(temp[0]+" : course type & access mode mismatch"); System.out.println(temp[0] + " does not exist"); } } else if(count == 3 && temp[0].matches("^\\D{1,10}$")) { if (temp[1].equals("必修")) { if (temp[2].equals("考试")) { course = courseRecord.searthCourse(temp[0]); if (course == null) { courseRecord.courses[courseAmount] = courseRecord.addCourse(temp[0], temp[1],temp[2]); courseAmount++; } } else if (temp[2].equals("考察")) { System.out.println(temp[0] + " : course type & access mode mismatch"); System.out.println(temp[0] + " does not exist"); } else if (temp[2].equals("实验")) { System.out.println(temp[0] + " : course type & access mode mismatch"); } else { System.out.println("wrong format"); break; } } else if (temp[1].equals("选修")) { if (temp[2].equals("考试") || temp[2].equals("考察")) { course = courseRecord.searthCourse(temp[0]); if (course == null) { courseRecord.courses[courseAmount] = courseRecord.addCourse(temp[0], temp[1],temp[2]); courseAmount++; } } else if (temp[2].equals("实验")) { System.out.println(temp[0] + " : course type & access mode mismatch"); } else { System.out.println("wrong format"); break; } } else if (temp[1].equals("实验")) { if (temp[2].equals("实验")) { course = courseRecord.searthCourse(temp[0]); if (course == null) { courseRecord.courses[courseAmount] = courseRecord.addCourse(temp[0], temp[1],temp[2]); courseAmount++; } else { System.out.println(temp[0] + " : course type & access mode mismatch"); System.out.println(temp[0] + " does not exist"); break; } } else { System.out.println("wrong format"); break; } } else { System.out.println("wrong format"); break; } } else if(count == 4 && temp[3].matches("^(100|[1-9]\\d|\\d)$")) { id = Integer.parseInt(temp[0]); a3 = Integer.parseInt(temp[3]); finalscore = a3; if(a3 > 100 || a3 < 0 || !temp[0].matches("^[0-9]{8}$") || !temp[1].matches("^\\D{1,10}$") || !temp[2].matches("^\\D{1,10}$")){ System.out.println("wrong format"); break; } course = courseRecord.searthCourse(temp[2]); if (course == null) { student = classroom.searthStudent(temp[0], temp[1]); if(student == null) { TotalScore totalScoreObj = new TotalScore(id, temp[1], 0); totalScoreList.add(totalScoreObj); classroom.addStudents2(temp[0], temp[1],0, 0, 0); studentAmount++; Student studentObj = new Student(temp[0], temp[1], course, 0, 0); studentList.add(studentObj); System.out.println(id + " " + temp[1] + " did not take any exams"); } } if (course != null) { if(course.accessMode.equals("考试")) { System.out.println(id + " " + temp[1] + " : access mode mismatch"); student = classroom.searthStudent(temp[0], temp[1]); if(student == null) { TotalScore totalScoreObj = new TotalScore(id, temp[1], 0); totalScoreList.add(totalScoreObj); } else { System.out.println("wrong format"); } } else if (course.accessMode.equals("考察")){ student = classroom.searthStudent(temp[0], temp[1]); if(student == null) { TotalScore totalScoreObj = new TotalScore(id, temp[1], finalscore); totalScoreList.add(totalScoreObj); classroom.addStudents2(temp[0], temp[1],0, 0, finalscore); studentAmount++; Student studentObj = new Student(temp[0], temp[1], course, 0, a3); studentList.add(studentObj); } else { System.out.println("wrong format"); } } else if(course.accessMode.equals("实验")){ System.out.println(id + " " + temp[1] + " : access mode mismatch"); TotalScore totalScoreObj = new TotalScore(id, temp[1], 0); totalScoreList.add(totalScoreObj); classroom.addStudents2(temp[0], temp[1],0, 0, finalscore); studentAmount++; Student studentObj = new Student(temp[0], temp[1], course, 0, a3); studentList.add(studentObj); } else { System.out.println("wrong format"); } } } else if(count > 5 && count < 8) { times = Integer.parseInt(temp[3]); //实验次数 if(times == temp.length - 4) { System.out.println("wrong format"); } else { id = Integer.parseInt(temp[0]); System.out.println(temp[0] + " " + temp[1] + " : access mode mismatch"); TotalScore totalScoreObj = new TotalScore(id, temp[1], 0); totalScoreList.add(totalScoreObj); classroom.addStudents1(temp[0], temp[1],0); studentAmount++; Student studentObj = new Student(temp[0], temp[1], course, 0, 0); studentList.add(studentObj); } } else if((count == 5 && temp[3].matches("^(100|[1-9]\\d|\\d)$") && temp[4].matches("^(100|[1-9]\\d|\\d)$")) || (count > 7 && count <14)) { if (count == 5 && temp[3].matches("^(100|[1-9]\\d|\\d)$") && temp[4].matches("^(100|[1-9]\\d|\\d)$")) { id = Integer.parseInt(temp[0]); a3 = Integer.parseInt(temp[3]); a4 = Integer.parseInt(temp[4]); finalscore = (int) Math.floor(a3 * 0.3 + a4 * 0.7); if(a3 > 100 || a3 < 0 || a4 > 100 || a4 < 0 || !temp[0].matches("^[0-9]{8}$") || !temp[1].matches("^\\D{1,10}$") || !temp[2].matches("^\\D{1,10}$")){ System.out.println("wrong format"); break; } course = courseRecord.searthCourse(temp[2]); if (course == null) { student = classroom.searthStudent(temp[0], temp[1]); if(student == null) { TotalScore totalScoreObj = new TotalScore(id, temp[1], 0); totalScoreList.add(totalScoreObj); classroom.addStudents2(temp[0], temp[1],0, 0, 0); studentAmount++; Student studentObj = new Student(temp[0], temp[1], course, 0, 0); studentList.add(studentObj); System.out.println(temp[0] + " " + temp[1] + " did not take any exams"); } } if (course != null) { if(course.accessMode.equals("考试") || course.accessMode.equals("考察")) { student = classroom.searthStudent(temp[0], temp[1]); if(student == null) { TotalScore totalScoreObj = new TotalScore(id, temp[1], finalscore); totalScoreList.add(totalScoreObj); classroom.addStudents2(temp[0], temp[1], a3, a4, finalscore); studentAmount++; Student studentObj = new Student(temp[0], temp[1], course, a3, a4); studentList.add(studentObj); } } else if(course.accessMode.equals("实验")){ System.out.println(temp[0] + " " + temp[1] + " : access mode mismatch"); TotalScore totalScoreObj = new TotalScore(id, temp[1], 0); totalScoreList.add(totalScoreObj); } else { System.out.println("wrong format"); } } } else if (count > 7) { //实验 id = Integer.parseInt(temp[0]); times = Integer.parseInt(temp[3]); //实验次数 if (times == temp.length - 4) { int flag = 1; int a = 0; for (int i = 0; i < times; i++) { if (Integer.parseInt(temp[i + 4]) < 0 || Integer.parseInt(temp[i + 4]) > 100 || !temp[i + 4].matches("^(100|[1-9]\\d|\\d)$")) { flag = 0; } else { a += Integer.parseInt(temp[i + 4]); } } if(flag == 0) { System.out.println("wrong format"); } else { course = courseRecord.searthCourse(temp[2]); if (course == null) { student = classroom.searthStudent(temp[0], temp[1]); if(student == null) { TotalScore totalScoreObj = new TotalScore(id, temp[1], 0); totalScoreList.add(totalScoreObj); classroom.addStudents1(temp[0], temp[1],0); studentAmount++; Student studentObj = new Student(temp[0], temp[1], course, 0, 0); studentList.add(studentObj); System.out.println(temp[0] + " " + temp[1] + " did not take any exams"); } } if (course != null) { if(course.accessMode.equals("实验")) { student = classroom.searthStudent(temp[0], temp[1]); if(student == null) { TotalScore totalScoreObj = new TotalScore(id, temp[1], a/times); totalScoreList.add(totalScoreObj); classroom.addStudents1(temp[0], temp[1], a/times); studentAmount++; Student studentObj = new Student(temp[0], temp[1], course, 0, a/times); studentList.add(studentObj); } } else if(course.accessMode.equals("考试") || course.accessMode.equals("考察")) { System.out.println(temp[0] + " " + temp[1] + " : access mode mismatch"); TotalScore totalScoreObj = new TotalScore(id, temp[1], 0); totalScoreList.add(totalScoreObj); } else { System.out.println("wrong format"); } } } } else { System.out.println("wrong format"); } } } else { System.out.println("wrong format"); } String[] temp; } for(int i = 0; i < studentAmount-1 ; i++) { for(int j = 0; j < studentAmount-i-1; j++){ if(Integer.parseInt(classroom.students[j].id) > Integer.parseInt(classroom.students[j+1].id)) { Student t = classroom.students[j]; classroom.students[j] = classroom.students[j+1]; classroom.students[j + 1] = t; } } } ArrayList<String> ids = new ArrayList<String>(); for(TotalScore totalScoreObj: totalScoreList){ if(!ids.contains(totalScoreObj.id)) ids.add(totalScoreObj.id); } Collections.sort(ids); for(String id1: ids){ String name = " "; int count1 = 0; int scoreTotal = 0; for(TotalScore totalScoreObj: totalScoreList){ if(totalScoreObj.id.equals(id1)){ name = totalScoreObj.name; count1++; scoreTotal += totalScoreObj.score; } } if(count1 == 0 || scoreTotal == 0){ System.out.println(id1 + " " + name + " did not take any exams"); } else { double scoreAverage = (double)scoreTotal / count1; System.out.println(id1+" "+name+" "+ (int)scoreAverage); } } Comparator<Object> cmp = Collator.getInstance(Locale.CHINA); for(int i = 0; i < courseAmount - 1; i++) { for(int j = 0; j < courseAmount - i -1; j++) { if(cmp.compare(courseRecord.courses[j].courseName, courseRecord.courses[j + 1].courseName) > 0){ Course t = courseRecord.courses[j]; courseRecord.courses[j] = courseRecord.courses[j + 1]; courseRecord.courses[j + 1] = t; } } } for (int j = 0; j < courseAmount; j++) { int coursecount = 0; double scoreTotal3 = 0; double scoreTotal4 = 0; double scoreTotal = 0; for (Student studentObj : studentList) { if(studentObj.course != null) { if (studentObj.course.courseName.equals(courseRecord.courses[j].courseName)) { coursecount++; if(studentObj.course.courseType.equals("必修")){ if(studentObj.course.accessMode.equals("考试")) { scoreTotal3 += studentObj.usualgrades; scoreTotal4 += studentObj.finalgrades; scoreTotal += (int)Math.floor(studentObj.usualgrades * 0.3 + studentObj.finalgrades * 0.7); } } else if (studentObj.course.courseType.equals("选修")) { if(studentObj.course.accessMode.equals("考试")){ scoreTotal3 += studentObj.usualgrades; scoreTotal4 += studentObj.finalgrades; scoreTotal += (int)Math.floor(studentObj.usualgrades * 0.3 + studentObj.finalgrades * 0.7); } else if (studentObj.course.accessMode.equals("考察")) { scoreTotal4 += studentObj.finalgrades; scoreTotal += studentObj.finalgrades; } } else if(studentObj.course.courseType.equals("实验")) { if(studentObj.course.accessMode.equals("实验")) { scoreTotal += studentObj.finalgrades; } } } } } if (coursecount == 0) { System.out.println(courseRecord.courses[j].courseName + " has no grades yet"); } else if(courseRecord.courses[j].courseType.equals("必修")){ if (courseRecord.courses[j].accessMode.equals("考试")) { double scoreAverage3 = (scoreTotal3 / coursecount); double scoreAverage4 = (scoreTotal4 / coursecount); double scoreAverage = (scoreTotal / coursecount); System.out.println( courseRecord.courses[j].courseName + " " + (int)scoreAverage3 + " " + (int)scoreAverage4 + " " + (int)Math.floor(scoreAverage)); } } else if (courseRecord.courses[j].courseType.equals("选修")) { if(courseRecord.courses[j].accessMode.equals("考试")){ double scoreAverage3 = (scoreTotal3 / coursecount); double scoreAverage4 = (scoreTotal4 / coursecount); double scoreAverage = (scoreTotal / coursecount); System.out.println( courseRecord.courses[j].courseName + " "+(int)scoreAverage3 + " " + (int)scoreAverage4 + " " +(int)Math.floor(scoreAverage)); } else if (courseRecord.courses[j].accessMode.equals("考察")) { double scoreAverage4 = (scoreTotal4 / coursecount) ; double scoreAverage = (scoreTotal / coursecount); System.out.println( courseRecord.courses[j].courseName + " " + (int)scoreAverage4 + " " + (int)Math.floor(scoreAverage)); } } else if(courseRecord.courses[j].courseType.equals("实验")){ if(courseRecord.courses[j].accessMode.equals("实验")) { double scoreAverage = (scoreTotal / coursecount); System.out.println( courseRecord.courses[j].courseName + " " + (int)Math.floor(scoreAverage)); } } } ArrayList<String> classIds = new ArrayList<String>(); ArrayList<Classroom> classrooms = new ArrayList<Classroom>(); for (TotalScore totalScoreObj : totalScoreList) { String classId = totalScoreObj.id.substring(0, 6); if (!classIds.contains(classId)) { classIds.add(classId); Classroom classScore = new Classroom(classId, (int) totalScoreObj.score, 1); classrooms.add(classScore); } else { for (Classroom classroom1 : classrooms) { if (classroom1.classId.equals(classId)) { classroom1.sum = (int)totalScoreObj.score + classroom1.sum; classroom1.scorecount = classroom1.scorecount + 1; break; } } } } Collections.sort(classIds); for (String classId : classIds) { int classcount = 0; double scoreTotal = 0; for (Classroom classroom1 : classrooms) { if (classroom1.classId.equals(classId)) { scoreTotal = classroom1.sum; classcount = classroom1.scorecount; break; } } if (classcount == 0 || scoreTotal == 0) { System.out.println(classId + " has no grades yet"); System.exit(0); } else { double scoreAverage = scoreTotal / classcount; System.out.println(classId + " " + (int)scoreAverage); } } input.close(); } } class Course { String courseName; String courseType; String accessMode; public Course() { } } class CourseRecord { Course[] courses = new Course[100]; int courseCount = 0; public Course searthCourse(String courseName) { for (int i = courseCount - 1; i >= 0; i--) { if (courseName.equals(courses[i].courseName)) { return courses[i]; } } return null; } public Course searthCourse1(String courseName,String courseType, String accessMode) { for (int i = courseCount - 1; i >= 0; i--) { if (courseName.equals(courses[i].courseName) && courseType.equals(courses[i].courseType) && accessMode.equals(courses[i].accessMode)) { return courses[i]; } } return null; } public Course addCourse(String courseName, String courseType, String accessMode) { Course course = new Course(); course.courseName = courseName; course.courseType = courseType; course.accessMode = accessMode; courseCount++; return course; } } abstract class Score { Student student; Course course; double usualgrades; double finalgrades; double[] experimentScores; public Score() { } public Score(Student student, Course course, int finalgrades) { this.student = student; this.course = course; this.finalgrades = finalgrades; } public Score(Student student, Course course, double usualgrades, double finalgrades) { this.student = student; this.course = course; this.usualgrades = usualgrades; this.finalgrades = finalgrades; } public Score(Student student, Course course, double[] experimentScores) { this.student = student; this.course = course; this.experimentScores = experimentScores; } public int getTotalScore() { return 0; } } class ExamScores extends Score { public ExamScores() { } public ExamScores(Student student, Course course, double usualgrades, double finalgrades) { super(student, course, usualgrades, finalgrades); } @Override public int getTotalScore () { return (int) Math.floor(usualgrades * 0.3 + finalgrades * 0.7); } } class ExamineSores extends Score { public ExamineSores() { } public ExamineSores(Student student, Course course, int finalgrades) { super(student, course, finalgrades); } @Override public int getTotalScore() { return (int)Math.floor(finalgrades * 1.0); } } class ExperimentScore extends Score { public ExperimentScore() { } public ExperimentScore(Student student, Course course, double[] experimentScores) { super(student, course, experimentScores); } @Override public int getTotalScore() { double sum = 0; for (double score : experimentScores) { sum += score; } return (int)Math.floor(sum / experimentScores.length); } } class Student { String id; String name; Course course; double usualgrades; double finalgrades; double finalscore; double experimentscore; public Student() { } public Student(String id, String name, Course course, double usualgrades, double finalgrades) { this.id = id; this.name = name; this.course = course; this.usualgrades = usualgrades; this.finalgrades = finalgrades; } public Student(String id, String name, Course course, double experimentscore) { this.id = id; this.name = name; this.course = course; this.experimentscore = experimentscore; } } class Classroom { Student[] students = new Student[100]; int studentcount = 0; int sum; String classId; int scorecount = 0; public Classroom() { } public Classroom(String classId, int sum, int scorecount) { this.classId = classId; this.sum = sum; this.scorecount = scorecount; } public void addStudents1(String id, String name, double experimentscore) { students[studentcount] = new Student(); students[studentcount].id = id; students[studentcount].name = name; students[studentcount].experimentscore = experimentscore; studentcount++; } public void addStudents2(String id, String name, double usualgrades, double finalgrades, double finalscore) { students[studentcount] = new Student(); students[studentcount].id = id; students[studentcount].name = name; students[studentcount].usualgrades = usualgrades; students[studentcount].finalgrades = finalgrades; students[studentcount].finalscore = finalscore; studentcount++; } public Student searthStudent(String id, String name) { for (int i = studentcount - 1; i >= 0; i--) { if (id.equals(students[i].id)) { return students[i]; } } return null; } } class TotalScore{ String id; String name; double score; public TotalScore(int id, String name, double score) { this.id = String.valueOf(id); this.name = name; this.score = score; } }
一样要把所有正确的可能的情况都写出来,然后它们的反面情况再去输出这些的错误输出,而且要搞清是否是终止进行程序,如果一些成绩信息输入错误,也要存入,只不过是存入零分,这样进行计算时就要考虑零分说明时错误输入,而不是直接在输入错误时就直接错误输出,这样最多满足实例的样子,而不是题目中的需求。
import java.util.ArrayList; import java.util.Comparator; import java.util.*; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); String[] temp; ArrayList<Student> students = new ArrayList<>(); String string = input.nextLine(); while (!string.equals("end")){ temp = string.split(" "); String id = temp[0]; String name = temp[1]; int score = Integer.parseInt(temp[2]) + Integer.parseInt(temp[3]); students.add(new Student(id, name, score)); string = input.nextLine(); } Collections.sort(students, new Comparator<Student>(){ @Override public int compare(Student o1, Student o2) { return o2.getScore() - o1.getScore(); //降序 } }); for (Student student : students) { System.out.println(student.getId() + " " + student.getName() + " " + student.getScore()); } } } class Student { private String id; private String name; private int score; public Student() { } public Student(String id, String name, int score) { this.id = id; this.name = name; this.score = score; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getScore() { return score; } public void setScore(int score) { this.score = score; } }
使用Collections.sort(students, new Comparator<Student>()进行比较排序,重写比较方法return o2.getScore() - o1.getScore(); 降序返回。
第二题课程成绩统计程序-3,修改了计算总成绩的方式,意思就是每项的分数都是不同的权重,按照权重计算平均分,还有要求:修改类结构,将成绩类的继承关系改为组合关系,成绩信息由课程成绩类和分项成绩类组成,课程成绩类组合分项成绩类,分项成绩类由成绩分值和权重两个属性构成。
我认为组合关系更加灵活,因为它允许我们在不改变类结构的情况下进行修改和扩展,可以很容易地增加新的考核方式或者增加新的分项成绩,而不需要对类结构进行大幅度调整。而继承关系则相对更加固定,一旦类结构确定后,就很难进行修改和扩展。在适应变更方面,组合关系更加灵活,更具有优势。不出我所料,不做任何修改代码长度直接超过题目限制,加上那个星期事情比较多,分身乏术,没有过多深究
abstract class Score { String courseName; double totalScore; List<SubScore> subScores; public Score(String courseName, List<SubScore> subScores) { this.courseName = courseName; this.subScores = subScores; } public abstract double getTotalScore(); } class ExamineSores extends Score { double weightMid; double weightFinal; SubScore midScore; SubScore finalScore; public ExamineSores(String courseName, List<SubScore> subScores, double weightMid, double weightFinal) { super(courseName, subScores); this.weightMid = weightMid; this.weightFinal = weightFinal; this.midScore = subScores.get(0); this.finalScore = subScores.get(1); } @Override public double getTotalScore() { double mid = midScore.calculateWeightedScore(); double fin = finalScore.calculateWeightedScore(); return mid * weightMid + fin * weightFinal; } } class InspectScore extends Score { SubScore finalScore; public InspectScore(String courseName, List<SubScore> subScores) { super(courseName, subScores); this.finalScore = subScores.get(0); } @Override public double getTotalScore() { return finalScore.calculateWeightedScore(); } } class ExperimentScore extends Score { List<SubScore> experimentScores; public ExperimentScore(String courseName, List<SubScore> subScores, List<SubScore> experimentScores) { super(courseName, subScores); this.experimentScores = experimentScores; } @Override public double getTotalScore() { double sum = 0; for (SubScore experimentScore : experimentScores) { sum += experimentScore.calculateWeightedScore(); } return sum; } } class SubScore { double score; double weight; public SubScore(double score, double weight) { this.score = score; this.weight = weight; } public double calculateWeightedScore() { return score * weight; } }
按照题目要求,成绩改成组合关系,成绩信息由课程成绩类和分项成绩类组成,课程成绩类组合分项成绩类,分项成绩类由成绩分值和权重两个属性构成。先写分项成绩,包含成绩分值和权重,计算一个成绩,组合。
三、采坑心得
课程成绩统计程序-2

多个成绩超过范围(0-100),只会输出一个wrong format

这就是因为写的时候如果输入的学生成绩超过范围我就输出wrong format 然后System.exit(0);直接退出成绩了,然后就不会再对下一个学生进行分析。所以不能先对错误的进行处理,要把所有的正确的可能的情况进行处理才行,再用else进行错误输入处理。
四、改进建议
五、总结
通过这几次的作业,进一步掌握了类的设计,还有好多有用的方法ArrayList,map,set等等,希望通过书本和网上可以学习到更多Java知识,花更多的时间在java的学习上,老师上课讲的东西很少,但是很精。
浙公网安备 33010602011771号