blog3
一.前言
这篇博客主要是PTA7,8次题目集和期末考试的一次习题总结,在熟悉了面向对象三大特征继承,封装,多态前提下对接口的使用,排序方法的重写,Object类中String方法的重写,hashmap.treemap等知识点的深刻了解.加深了我个人对java知识体系的了解,以及在题目中对设计模式的体会。
pta7题目集
7-1 容器-HashMap-检索
7-2 容器-HashMap-排序
7-3 课程成绩统计程序-2
7-4 动物发声模拟器(多态)
二.设计与分析
输入多个学生的成绩信息,包括:学号、姓名、成绩。
学号是每个学生的唯一识别号,互不相同。
姓名可能会存在重复。
使用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
import java.util.*;
class Main {
public static void main(String[] args) {
Scanner indata =new Scanner(System.in);
HashMap<String,String> sMap = new HashMap<>();
while (true){
String a =indata.nextLine();
if(a.equals("end")){
break;
}
String[]b=a.split(" ");
sMap.put(b[0],b[1]+" "+b[2]);
}
String conform= indata.nextLine();
if(sMap.containsKey(conform)){
System.out.println(conform+" "+sMap.get(conform));
}
else{
System.out.println("The student " + conform + " does not exist");
}
}
}
总结:该题主要是熟悉hashmap的使用
输入多个学生的成绩信息,包括:学号、姓名、成绩。
学号是每个学生的唯一识别号,互不相同。
姓名可能会存在重复。
要求:使用HashMap存储学生信息。
输入格式:
输入多个学生的成绩信息,每个学生的成绩信息格式:学号+英文空格+姓名+英文空格+成绩
以“end”为输入结束标志
输出格式:
按学号从大到小的顺序输出所有学生信息,每个学生信息的输出格式:学号+英文空格+姓名+英文空格+成绩
输入样例:
在这里给出一组输入。例如:
20201124 张少军 83
20201136 李四 78
20201118 郑觉先 80
end
输出样例:
在这里给出相应的输出。例如:
20201136 李四 78
20201124 张少军 83
20201118 郑觉先 80
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;
public class Main {
public static void main(String[] args) {
Scanner indata =new Scanner(System.in);
HashMap<String,String> sMap = new HashMap<>();
while (true){
String a =indata.nextLine();
if(a.equals("end")){
break;
}
String[]b=a.split(" ");
sMap.put(b[0],b[1]+" "+b[2]);
}
TreeMap<String, String> tMap = new TreeMap<>(sMap);
for (Map.Entry<String, String> entry : tMap.descendingMap().entrySet())
{
System.out.println(entry.getKey() + " " + entry.getValue());
}
}
}
总结:可以使用treemap进行排序,
TreeMap<String, String> tMap = new TreeMap<>(sMap);
课程成绩统计程序-2在第一次的基础上增加了实验课,以下加粗字体显示为本次新增的内容。
某高校课程从性质上分为:必修课、选修课、实验课,从考核方式上分为:考试、考察、实验。
考试的总成绩由平时成绩、期末成绩分别乘以权重值得出,比如平时成绩权重0.3,期末成绩权重0.7,总成绩=平时成绩*0.3+期末成绩*0.7。
考察的总成绩直接等于期末成绩
实验的总成绩等于课程每次实验成绩的平均分
必修课的考核方式必须为考试,选修课可以选择考试、考察任一考核方式。实验课的成绩必须为实验。
1、输入:
包括课程、课程成绩两类信息。
课程信息包括:课程名称、课程性质、考核方式(可选,如果性质是必修课,考核方式可以没有)三个数据项。
课程信息格式:课程名称+英文空格+课程性质+英文空格+考核方式
课程性质输入项:必修、选修、实验
考核方式输入选项:考试、考察、实验
考试/考查课程成绩信息包括:学号、姓名、课程名称、平时成绩(可选)、期末成绩
考试/考查课程信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+平时成绩+英文空格+期末成绩
实验课程成绩信息包括:学号、姓名、课程名称、实验次数、每次成绩
实验次数至少4次,不超过9次
实验课程信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+实验次数+英文空格+第一次实验成绩+...+英文空格+最后一次实验成绩
以上信息的相关约束:
1)平时成绩和期末成绩的权重默认为0.3、0.7
2)成绩是整数,不包含小数部分,成绩的取值范围是【0,100】
3)学号由8位数字组成
4)姓名不超过10个字符
5)课程名称不超过10个字符
6)不特别输入班级信息,班级号是学号的前6位。
2、输出:
输出包含三个部分,包括学生所有课程总成绩的平均分、单门课程成绩平均分、单门课程总成绩平均分、班级所有课程总成绩平均分。
为避免误差,平均分的计算方法为累加所有符合条件的单个成绩,最后除以总数。
1)学生课程总成绩平均分按学号由低到高排序输出
格式:学号+英文空格+姓名+英文空格+总成绩平均分
如果某个学生没有任何成绩信息,输出:学号+英文空格+姓名+英文空格+"did not take any exams"
2)单门课程成绩平均分分为三个分值:平时成绩平均分(可选)、期末考试平均分、总成绩平均分,按课程名称的字符顺序输出
考试/考察课程成绩格式:课程名称+英文空格+平时成绩平均分+英文空格+期末考试平均分+英文空格+总成绩平均分
实验课成绩格式:课程名称+英文空格+总成绩平均分
如果某门课程没有任何成绩信息,输出:课程名称+英文空格+"has no grades yet"
3)班级所有课程总成绩平均分按班级由低到高排序输出
格式:班级号+英文空格+总成绩平均分
如果某个班级没有任何成绩信息,输出:班级名称+英文空格+ "has no grades yet"
异常情况:
1)如果解析某个成绩信息时,课程名称不在已输入的课程列表中,输出:学号+英文空格+姓名+英文空格+":"+课程名称+英文空格+"does not exist"
2)如果解析某个成绩信息时,输入的成绩数量和课程的考核方式不匹配,输出:学号+英文空格+姓名+英文空格+": access mode mismatch"
以上两种情况如果同时出现,按第一种情况输出结果。
3)如果解析某个课程信息时,输入的课程性质和课程的考核方式不匹配,输出:课程名称+" : course type & access mode mismatch"
4)格式错误以及其他信息异常如成绩超出范围等,均按格式错误处理,输出"wrong format"
5)若出现重复的课程/成绩信息,只保留第一个课程信息,忽略后面输入的。
信息约束:
1)成绩平均分只取整数部分,小数部分丢弃
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;
public class Main {
static ArrayList<Student> studentList = new ArrayList<>();
static ArrayList<Course> courseList = new ArrayList<>();
static ArrayList<Class> classList = new ArrayList<>();
static ArrayList<ChooseCourse> chooseCourseList = new ArrayList<>();
public static void main(String[] args) {
Scanner indata = new Scanner(System.in);
String sNum = "[0-9]{8}";
String sName = "\\S{1,10}";
String sc = "([1-9]?[0-9]|100)";
String tc = "([4-9])";
String CN = "\\S{1,10}";
String XB = "(选修|必修|实验)";
String SC = "(考试|考察|实验)";
String In1 = CN + " " + XB + " " + SC;
String In2 = sNum + " " + sName + " " + CN + " " +
sc;
String In3 = sNum + " " + sName + " " + CN + " " +
sc + " " + sc;
String In4 = sNum+ " "+sName+ " "+CN+" "+tc+"(\\s([1-9]?[0-9]|100))*";
while (true) {
String a = indata.nextLine();
if (a.matches("end"))
{
break;
}
if (a.matches(In1)) {
String[] b = a.split(" ");
String courseName = b[0];//课程名
String type = b[1];//课程类型
String testType = b[2];//课程考试类型
Course course = new Course(courseName, type, testType);
if(b[1].matches("必修")&&b[2].matches("考试")){
if (conformCourse(courseName) == null) {
courseList.add(course);
}
}
else if(b[1].matches("选修")&&b[2].matches("考试")){
if (conformCourse(courseName) == null) {
courseList.add(course);
}
}
else if(b[1].matches("选修")&&b[2].matches("考察")){
if (conformCourse(courseName) == null) {
courseList.add(course);
}
}
else if(b[1].matches("实验")&&b[2].matches("实验")){
if (conformCourse(courseName) == null) {
courseList.add(course);
}
}
else{
System.out.println(course.getCourseName()+" : course type & access mode mismatch");
}
}
if (a.matches(In2)) {
String[] b = a.split(" ");
String stuId = b[0];//学生学号
String classID = b[0].substring(0, 6);
String name = b[1];//学生姓名
String courseName = b[2];//课程名字
if (conformClass(classID) == null) {
Class class1 = new Class(classID);
classList.add(class1);
}
Student stu = new Student(classID, stuId, name);
if (!conformStudent(stuId)) {
studentList.add(stu);
}
if (conformCourse(courseName) == null) {
System.out.println(courseName + " " + "does not exist");
}
if (conformCourse(courseName) != null) {
Course course = conformCourse(courseName);
if (course.testType.equals("考察")) {
int finalGrade = Integer.parseInt(b[3]);
AssessGrade assessGrade = new AssessGrade(finalGrade);
ChooseCourse chooseCourse = new ChooseCourse(course, stu, assessGrade);
if (!conformChooseCourse(name, courseName))
chooseCourseList.add(chooseCourse);
} else {
System.out.println(stuId + " " + name + " " + ": access mode mismatch");
}
}
}
if (a.matches(In3)) {
String[] b = a.split(" ");
String stuId = b[0];//学生学号
String classID = b[0].substring(0, 6);
String name = b[1];//学生姓名
String courseName = b[2];//课程名字
if (conformClass(classID) == null) {
Class class1 = new Class(classID);
classList.add(class1);
}
Student stu = new Student(classID, stuId, name);
if (!conformStudent(stuId)) {
studentList.add(stu);
}
if (conformCourse(courseName) == null) {
System.out.println(courseName + " " + "does not exist");
}
if (conformCourse(courseName) != null) {
Course course = conformCourse(courseName);
if (course.testType.equals("考试")) {
int usualGrade = Integer.parseInt(b[3]);
int finalGrade = Integer.parseInt(b[4]);
ExamGrade examGrade = new ExamGrade(usualGrade, finalGrade);
ChooseCourse chooseCourse = new ChooseCourse(course, stu, examGrade);
if (!conformChooseCourse(name, courseName))
chooseCourseList.add(chooseCourse);
} else {
System.out.println(stuId + " " + name + " " + ": access mode mismatch");
}
}
}
if (a.matches(In4)) {
String[] b = a.split(" ");
String stuId = b[0];
String classID = b[0].substring(0, 6);
String name = b[1];
String courseName = b[2];
String n = b[3];
int num = Integer.parseInt(b[3]);
if (conformClass(classID) == null) {
Class class1 = new Class(classID);
classList.add(class1);
}
Student stu = new Student(classID, stuId, name);
if (!conformStudent(stuId)) {
studentList.add(stu);
}
if (conformCourse(courseName) == null) {
System.out.println(courseName + " " + "does not exist");
}
if (conformCourse(courseName) != null) {
Course course = conformCourse(courseName);
if (b.length == (num+4)) {
TestGrade testGrade = new TestGrade();
for(int j=0;j<num;j++){
testGrade.add = testGrade.add + Integer.parseInt(b[4+j]) ;
}
testGrade.count = num;
ChooseCourse chooseCourse = new ChooseCourse(course, stu, testGrade);
if (!conformChooseCourse(name, courseName))
chooseCourseList.add(chooseCourse);
}
else {
System.out.println(b[0] + " " + b[1] + " : access mode mismatch");
}
}
}
if(!a.matches(In1)&&!a.matches(In2)&&!a.matches(In3)&&!a.matches(In4)){
System.out.println("wrong format");
}
}
printStudents();
printCourses();
printClasses();
}
public static Course conformCourse(String name) {
for (Course course : courseList) {
if (course.getCourseName().equals(name))
return course;
}
return null;
}
public static Class conformClass(String classId) {
for (Class cls : classList) {
if (cls.getClassId().equals(classId))
return cls;
}
return null;
}
public static boolean conformStudent(String id) {
for (Student student : studentList) {
if (student.getId().equals(id))
return true;
}
return false;
}
public static boolean conformChooseCourse(String stuName, String courseName) {
for (ChooseCourse cs : chooseCourseList) {
if (cs.student.getName().equals(stuName) && cs.course.getCourseName().equals(courseName))
return true;
}
return false;
}
public static void printStudents(){
Collections.sort(studentList);
for(int i=0;i<studentList.size();i++){
Student stu=studentList.get(i);
ArrayList<ChooseCourse> stuCourseSelects=getStudentSelects(stu.getId());
if(stuCourseSelects.size()!=0) {
System.out.println(stu.getId()+" "+stu.getName()+" "+getAvgTotalScore(stuCourseSelects));
}
else if(stuCourseSelects.size()==0){
System.out.println(stu.getId()+" "+stu.getName()+" "+"did not take any exams");
}
}
}
public static ArrayList<ChooseCourse> getStudentSelects(String id) {
ArrayList<ChooseCourse> choose = new ArrayList<>();
for (ChooseCourse cos : chooseCourseList) {
if (cos.student.getId().equals(id))
choose.add(cos);
}
return choose;
}
public static int getAvgTotalScore(ArrayList<ChooseCourse> cs){
int average=0;
int sum=0;
for(ChooseCourse c:cs){
sum+=c.grade.getTotalGrade();
}
average=sum/cs.size();
return average;
}
public static void printCourses(){
Collections.sort(courseList);
for(int i=0;i<courseList.size();i++){
Course course=courseList.get(i);
ArrayList<ChooseCourse> stuCourseSelects=getCourseSelects(course.getCourseName());
if(stuCourseSelects.size()!=0){
if(course.testType.equals("考试"))
System.out.println(course.getCourseName()+" "+getAvgUsualScore(stuCourseSelects)+" "+getAvgFinalScore(stuCourseSelects)+" "+getAvgTotalScore(stuCourseSelects));
if(course.testType.equals("考察"))
System.out.println(course.getCourseName()+" "+getAvgFinalScore(stuCourseSelects)+" "+getAvgTotalScore(stuCourseSelects));
if(course.testType.equals("实验"))
System.out.println(course.getCourseName()+" "+getAvgTotalScore(stuCourseSelects));
}
else if(stuCourseSelects.size()==0){
System.out.println(course.courseName+" "+"has no grades yet");
}
}
}
public static ArrayList<ChooseCourse> getCourseSelects(String courseName) {
ArrayList<ChooseCourse> choose = new ArrayList<>();
for (ChooseCourse cos : chooseCourseList) {
if (cos.course.getCourseName().equals(courseName))
choose.add(cos);
}
return choose;
}
public static int getAvgUsualScore(ArrayList<ChooseCourse> cs){
int average=0;
int sum=0;
for(ChooseCourse c:cs){
if(c.course.getTestType().equals("考试")){
sum+=c.grade.usualGrade;
}
}
average=sum/cs.size();
return average;
}
public static int getAvgFinalScore(ArrayList<ChooseCourse> cs){
int average=0;
int sum=0;
for(ChooseCourse c:cs){
sum+=c.grade.finalGrade;
}
average=sum/cs.size();
return average;
}
public static void printClasses() {
Collections.sort(classList);
for (int i = 0; i < classList.size(); i++) {
Class cls = classList.get(i);
ArrayList<ChooseCourse> stuCourseSelects = getClassSelects(cls.getClassId());
if (stuCourseSelects.size() != 0) {
System.out.println(cls.getClassId() + " " + getAvgTotalScore(stuCourseSelects));
} else if (stuCourseSelects.size() == 0) {
System.out.println(cls.getClassId() + " " + "has no grades yet");
}
}
}
public static ArrayList<ChooseCourse> getClassSelects(String clsId){
ArrayList<ChooseCourse> choose =new ArrayList<>();
for(ChooseCourse cos:chooseCourseList) {
if (cos.student.getclassId().equals(clsId))
choose.add(cos);
}
return choose;
}
}
class ChooseCourse {
Course course;
Student student;
Grade grade;
public ChooseCourse(Course course, Student student, Grade grade) {
this.course = course;
this.student = student;
this.grade = grade;
}
}
class Student implements Comparable<Student> {
String Name;
String id;
String classId;
public String getId() {
return id;
}
public String getName() {
return Name;
}
public String getclassId() {
return classId;
}
public Student(String classId, String id, String Name) {
this.classId = classId;
this.id = id;
this.Name = Name;
}
public int compareTo(Student stu) {
return getId().compareTo(stu.getId());
}
}
class Course implements Comparable<Course> {
String courseName;
String type;
String testType;
public Course() {
}
public Course(String courseName, String type, String testType) {
this.courseName = courseName;
this.type = type;
this.testType = testType;
}
public String getCourseName() {
return courseName;
}
public String getType() {
return type;
}
public String getTestType() {
return testType;
}
@Override
public int compareTo(Course o) {
Comparator<Object> compare = Collator.getInstance(java.util.Locale.CHINA);
return compare.compare(courseName, o.getCourseName());
}
}
class Class implements Comparable<Class> {
String classId;
public Class() {
}
public String getClassId() {
return classId;
}
public Class(String classId) {
this.classId = classId;
}
@Override
public int compareTo(Class o) {
return getClassId().compareTo(o.getClassId());
}
}
abstract class Grade {
int finalGrade;
int usualGrade=0;
public abstract int getTotalGrade();
public Grade() {
}
}
class ExamGrade extends Grade {
public ExamGrade(int usualGrade, int finalGrade) {
this.usualGrade = usualGrade;
this.finalGrade =