南昌航空大学BLOG-1Java前三次作业总结

发布时间 2023-10-06 20:11:26作者: 梦lin

一、前言

1、第一次作业

  第一次作业考察的主要是一些基本数据类型比如int、char、float、double等类型的应用,以及String类型和相关函数的简单应用。身体质量指数(BMI)测算、巴比伦法求平方根近似值考察的主要是基本数据类型的应用,奇数求和考察的则是for循环的运用,房产税费计算和 判断三角形类型考察if、else基本语法以及浮点数运用,游戏角色选择考察数组的运用,学号识别和二进制数值提取考察String相关函数比如substring函数、StringBuilder的应用。本次作业有9道题目,题目数较多,但题目比较简单。整体看来第一次作业中运用的Java知识跟C语言等语言中并无太大差别。

2、第二次作业

  第二次作业考察的是Java中类和方法的应用,类的属性的设计和属性的类型、以及对象的创建是本次作业的重点。在成绩计算和去除重复数据时,考察的还有数组或集合的应用,在面向对象编程中则是考察类和方法的实现,在GPS测绘中度分秒转换则主要考察数据类型的相互转换以及对浮点数小数位数的掌握。在菜单计价程序中则是侧重考察类与类之间的调用、类中方法的运用。最后的Java日期类的基本使用则是考察一些日期函数的调用、String函数的调用、以及正则表达式的应用。本次作业有8道题目,题目数较多。第二次作业开始体现处Java的特别之处,即面对对象编程,开始和C语言等语言出现差别。

3、第三次作业

   第三次作业考察的是Java知识点的综合应用。第一题日期类的基本使用与第二次作业中的基本一致,第二题课程成绩统计程序-1则考察Java中类的构建、以及类中属性和方法的设计,还考察集合、数组,以及集合和数组中函数的运用,以及正则表达式对格式的要求等等,在面向对象编程(封装性)题目中则是较与第二次作业的题目添加了属性私有化和方法的构造函数以及属性的get和set函数,最后一题判断两个日期的先后,计算间隔天数、周数跟第一题日期类的基本使用有着相似之处,只不过第一题中的日期格式问题还可以用substring函数来解决,但最后一题的格式问题则最好用正则表达式才能完美的解决。本次作业有4道题目,题目数较少。但题目比较难,尤其是第二题课程成绩统计程序。

二、设计与分析

1、第二次作业

7-1 成绩计算-1-类、数组的基本运用

创建学生类,包含

属性:学号(String)、姓名(String)、语文成绩(int)、数学成绩(int)、物理成绩(int)

方法:计算总分、计算平均分

输入5个学生的信息,将每个学生的信息封装在一个学生对象中。

按输入顺序依次输出5个学生的总分、平均分(精确到小数点后两位,舍去部分按四舍五入规则计入最后一位)。

类图:

 源码分析:

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Student[] s = new Student[5];
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < s.length; i++) {
            Student s1 = new Student();
            s1.studentID = sc.next();
            s1.studentName = sc.next();
            s1.ChineseScore = sc.nextInt();
            s1.mathScore = sc.nextInt();
            s1.physicsScore = sc.nextInt();
            s[i] = s1;
        }
        for (int i = 0; i < s.length; i++) {
            System.out.print(s[i].studentID + " " + s[i].studentName + " " + s[i].getAllScore() + " ");
            System.out.printf("%.2f",s[i].getAverageScore());
            System.out.println();
        }
    }


}
class Student{
    String studentID;
    String studentName;
    int ChineseScore;
    int mathScore;
    int physicsScore;

    public int getAllScore(){
        return this.physicsScore + this.mathScore + this.ChineseScore;
    }

    public double getAverageScore(){
        double average1 =Math.round(this.getAllScore() * 100 / 3.0);
        double average = average1 / 100.00;
        return average;
    }
}

 SourceMonitor分析结果:

本题设计建立一个学生类,学生属性为学号(String)、姓名(String)、语文成绩(int)、数学成绩(int)、物理成绩(int),方法为计算总分getAllScore()、计算平均分getAverageScore(),将学生信息存放在一个大小为5的学生数组Student[5]中,用for循环让学生数组接收输入的学生信息,让学生成员调用方法即可求出每个学生的总分和平均分。平均分的计算则是运用先扩大100倍调用Math.round(),再缩小100倍的方法进行精确,最后输出时用printf的方法输出两位小数。
7-2 成绩计算-2-关联类

创建成绩类,包含:

属性:平时成绩(int)、期末成绩(int)

方法:计算总成绩(计算规则:平时成绩*0.4+期末成绩*0.6,保留整数部分,小数部分直接丢弃)

创建学生类,包含:

属性:学号(String)、姓名(String)、语文成绩(成绩类)、数学成绩(成绩类)、物理成绩(成绩类)

方法:计算总分、计算平均分

输入3个学生的信息,将每个学生的信息封装在一个学生对象中。

按输入顺序依次输出3个学生的总分、平均分(精确到小数点后两位,舍去部分按四舍五入规则计入最后一位)。

类图:

 

 源码分析:

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Student[] s = new Student[3];
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < s.length; i++) {
            Student s1 = new Student();
            s1.ChineseScore = new Score();
            s1.mathScore = new Score();
            s1.physicsScore = new Score();
            for (int j = 0; j < 3; j++) {
                s1.studentID = sc.next();;
                s1.studentName = sc.next();
                String class1 =sc.next();
                if(class1.equals("语文")){
                    s1.ChineseScore.usualScore = sc.nextInt();
                    s1.ChineseScore.finalScore = sc.nextInt();
                }
                if(class1.equals("数学")){
                    s1.mathScore.usualScore = sc.nextInt();
                    s1.mathScore.finalScore = sc.nextInt();
                }
                if(class1.equals("物理")){
                    s1.physicsScore.usualScore = sc.nextInt();
                    s1.physicsScore.finalScore = sc.nextInt();
                }
            }
            s[i] = s1;
        }
        for (int i = 0; i < s.length; i++) {
            System.out.print(s[i].studentID + " " + s[i].studentName + " " + s[i].getAllScore() + " ");
            System.out.printf("%.2f ",s[i].getusualScoreAverageScore());
            System.out.printf("%.2f ",s[i].getfinalScoreAverageScore());
            System.out.printf("%.2f",s[i].getAllAverageScore());
            System.out.println();
        }
    }


}
class Score{
    int usualScore;
    int finalScore;

    public int gettotalScore(){
        return (int ) (this.usualScore * 0.4+ this.finalScore * 0.6);
    }
}
class Student{
    String studentID;
    String studentName;
    Score ChineseScore;
    Score mathScore;
    Score physicsScore;
    public int getAllScore(){
        return this.physicsScore.gettotalScore()+ this.mathScore.gettotalScore() + this.ChineseScore.gettotalScore();
    }

    public double getAllAverageScore(){
        double average1 =Math.round(this.getAllScore() * 100 / 3.0);
        double average = average1 / 100.00;
        return average;
    }
    public double getusualScoreAverageScore(){
        return (double)(Math.round((this.ChineseScore.usualScore + this.mathScore.usualScore + this.physicsScore.usualScore) * 100 / 3.0) /100.00);
    }
    public double getfinalScoreAverageScore(){
        return (double)(Math.round((this.ChineseScore.finalScore + this.mathScore.finalScore + this.physicsScore.finalScore) * 100 / 3.0) /100.00);
    }
}

SourceMonitor分析结果:

本题设计了成绩类和学生类,成绩类的属性包括平时成绩(int)和期末成绩(int),方法为计算总成绩gettotalScore();学生类属性为学号(String)、姓名(String)、语文成绩(成绩类)、数学成绩(成绩类)、物理成绩(成绩类),方法为计算总分getAllScore()、计算平均分getAllAverageScore()、计算平时成绩平均分getusualScoreAverageScore()、计算期末成绩平均分getfinalScoreAverageScore(),将学生信息存放在一个大小为3的学生数组Student[3]中,用两层for循环接收输入的学生信息,第一次循环表示不同的学生,第二层循环表示同一学生的不同科目的成绩,最后调用学生方法即可得到结果。

2、第三次作业

7-2 课程成绩统计程序-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

实际类图:

 

 源码分析:

import java.text.Collator;
import java.util.*;
public class Main {
    static int flag1 = -1,flag2 = -1;
    public static void main(String[] args) {
        int temp1 = -1;
        Scanner sc = new Scanner(System.in);
        ArrayList<Course> courseArrayList = new ArrayList<>();
        ArrayList<Student> studentArrayList = new ArrayList<>();
        ArrayList<Student> studentArrayList1 = new ArrayList<>();
        ArrayList<ClassStudent> classStudentArrayList = new ArrayList<>();
        String s = sc.nextLine();
        while (!s.equals("end")){
            String[] str = s.split(" ");
            if(str.length == 3){
                Course course1 = new Course();
                if(!iscourse(str[0],courseArrayList)){
                    course1.cname = str[0];
                    course1.cCharacter = str[1];
                    course1.cExamMethod = str[2];
                    courseArrayList.add(course1);
                }
            }
            else {
                Score score = new Score();
                Course course1 = new Course();
                InvestScore investScore = new InvestScore();
                ExamScore examScore = new ExamScore();
                course1.cname = str[2];
                int temp=-1;
                for (int i = 0; i < courseArrayList.size(); i++) {
                    if(courseArrayList.get(i).cname.equals(course1.cname)){
                        temp = i;
                        course1.cCharacter = courseArrayList.get(i).cCharacter;
                        course1.cExamMethod = courseArrayList.get(i).cExamMethod;
                        break;
                    }
                }
                if(str.length == 4){
                    investScore.lastScore = Integer.parseInt(str[3]);
                    score.investScore = investScore;
                }
                else {
                    examScore.usualScore = Integer.parseInt(str[3]);
                    examScore.finalScore = Integer.parseInt(str[4]);
                    score.examScore = examScore;
                }
                course1.score = score;
                if(temp==-1){
                    temp1 = 1;
                    System.out.println(str[2] + " does not exist");
                    continue;
                }else {
                    courseArrayList.set(temp, course1);
                }
                Student student = new Student(str[0],str[1],course1);
                isstudent(str[0],str[2],studentArrayList1);
                isstudent(str[0],str[2],studentArrayList);
                if(flag1!=1) {
                    studentArrayList.add(student);
                }
                if(flag2!=1){
                    studentArrayList1.add(student);
                }
                if(!isclassexist(classStudentArrayList,str[0])){
                    ClassStudent classStudent = new ClassStudent();
                    classStudent.cid = str[0].substring(0,6);
                    classStudentArrayList.add(classStudent);
                }
            }
            s = sc.nextLine();
        }
        if(temp1==1){
            System.exit(0);
        }
        Collections.sort(classStudentArrayList, (ClassStudent o1, ClassStudent o2)-> {
                return o1.cid.compareTo(o2.cid);
            });

        if(!isexamMethodwithgrad(courseArrayList)){
            for (Course course : courseArrayList) {
                if(iscourseexamMethodwithgrad(course)){
                    for (int i = 0; i < studentArrayList.size(); i++) {
                        if(studentArrayList.get(i).course.cname.equals(course.cname)) {
                            System.out.println(studentArrayList.get(i).sid + " " + studentArrayList.get(i).sname + " : access mode mismatch");
                            System.out.println(studentArrayList.get(i).sid + " " + studentArrayList.get(i).sname + " did not take any exams");
                        }
                    }
                    System.out.println(course.cname + " has no grades yet");
                }
            }
            for (ClassStudent classStudent : classStudentArrayList) {
                System.out.println(classStudent.cid + " has no grades yet");
            }
            System.exit(0);
        }
        studentArrayList1 = caculateStudentAverageScore(studentArrayList,studentArrayList1);
        ArrayList<Course> courseArrayList1 = caculateCourseAverageScore(courseArrayList,studentArrayList);
        Student[] students = studentArrayList1.toArray(new Student[studentArrayList1.size()]);
        Arrays.sort(students, (Student o1, Student o2) ->{
                return o1.sid.compareTo(o2.sid);
            });
        classStudentArrayList = caculateClassAverageScore(students,classStudentArrayList);
        int indix = isexamMethodRight(courseArrayList);
        if(indix != -1){
            System.out.println(courseArrayList.get(indix).cname + " : course type & access mode mismatch");
            System.out.println(courseArrayList.get(indix).cname + " does not exist");
            for (int i = 0; i < studentArrayList.size(); i++) {
                if(studentArrayList.get(i).course.cname.equals(courseArrayList.get(indix).cname)){
                    System.out.println(studentArrayList.get(i).sid + " " + studentArrayList.get(i).sname + " did not take any exams");
                }
            }
            for (ClassStudent classStudent : classStudentArrayList) {
                System.out.println(classStudent.cid + " has no grades yet");
            }
            System.exit(0);
        }

        if(!isgraderight(studentArrayList)){
            System.out.println("wrong format");
            for (Course course : courseArrayList) {
                System.out.println(course.cname + " has no grades yet");
            }
        }
        else {
            printstudent(students);
            printcourse(courseArrayList1);
            printclass(classStudentArrayList);
        }

    }
    public static boolean isclassexist(ArrayList<ClassStudent> classStudentArrayList,String sid){
        String s = sid.substring(0,6);
        for (ClassStudent classStudent : classStudentArrayList) {
            if(classStudent.cid.equals(s)){
                return true;
            }
        }
        return false;
    }
    public static boolean isexamMethodwithgrad(ArrayList<Course> courseArrayList){
        for (int i = 0; i < courseArrayList.size(); i++) {
            if(courseArrayList.get(i).score!=null) {
                if ((courseArrayList.get(i).cExamMethod.equals("考试") && courseArrayList.get(i).score.examScore == null && courseArrayList.get(i).score.investScore != null) || (courseArrayList.get(i).cExamMethod.equals("考察") && courseArrayList.get(i).score.investScore == null && courseArrayList.get(i).score.examScore != null)) {
                    return false;
                }
            }
        }
        return true;
    }

    public static boolean iscourseexamMethodwithgrad(Course course){
        if(course.score!=null) {
            if ((course.cExamMethod.equals("考试") && course.score.examScore == null && course.score.investScore != null) || (course.cExamMethod.equals("考察") && course.score.investScore == null && course.score.examScore != null)) {
                return true;
            }
        }
        return false;
    }

    public static ArrayList<Student> caculateStudentAverageScore(ArrayList<Student> studentArrayList,ArrayList<Student> studentArrayList1){
        for (int i = 0; i < studentArrayList1.size(); i++) {
            int grade = 0;
            if(studentArrayList1.get(i).course.cExamMethod.equals("考试")){
                grade =(int)(studentArrayList1.get(i).course.score.examScore.finalScore * 0.7+ studentArrayList1.get(i).course.score.examScore.usualScore * 0.3);
            }
            else {
                grade = studentArrayList1.get(i).course.score.investScore.lastScore;
            }
            int count = 1;
            for (int j = 0; j < studentArrayList.size(); j++) {
                if(studentArrayList1.get(i).sid.equals(studentArrayList.get(j).sid) && !studentArrayList1.get(i).course.cname.equals(studentArrayList.get(j).course.cname)){
                    count++;
                    if(studentArrayList.get(j).course.cExamMethod.equals("考试")){
                        grade +=(int)(studentArrayList.get(j).course.score.examScore.finalScore * 0.7+ studentArrayList.get(j).course.score.examScore.usualScore * 0.3);
                    }
                    else {
                        grade += studentArrayList.get(j).course.score.investScore.lastScore;
                    }
                }
            }
            Student student = new Student(studentArrayList1.get(i).sid,studentArrayList1.get(i).sname,studentArrayList1.get(i).course);
            grade = grade / count;
            Course course = new Course();
            Score score = new Score();
            score.averagegrade = grade;
            course.score = score;
            student.course = course;
            studentArrayList1.set(i,student);
        }
        return studentArrayList1;
    }
    public static ArrayList<Course> caculateCourseAverageScore(ArrayList<Course> courseArrayList,ArrayList<Student> studentArrayList){
        ArrayList<Course> courseArrayList1 = new ArrayList<>();
        for (int i = 0; i < courseArrayList.size(); i++) {
            int grade = 0,grade1 = 0,grade2 = 0,count = 0;
            for (int j = 0; j < studentArrayList.size(); j++) {
                if(courseArrayList.get(i).cname.equals(studentArrayList.get(j).course.cname)){
                    count++;
                    if(studentArrayList.get(j).course.cExamMethod.equals("考试")){
                        grade +=(int)(studentArrayList.get(j).course.score.examScore.finalScore * 0.7+ studentArrayList.get(j).course.score.examScore.usualScore * 0.3);
                        grade1 +=studentArrayList.get(j).course.score.examScore.finalScore ;
                        grade2 +=studentArrayList.get(j).course.score.examScore.usualScore ;
                    }
                    else {
                        grade += studentArrayList.get(j).course.score.investScore.lastScore;
                    }
                }
            }
            if(count != 0){
                grade = grade / count;
                grade1 = grade1 / count;
                grade2 = grade2 / count;
            }
            Score score = courseArrayList.get(i).score;
            if(score != null) {
                score.averagegrade = grade;
                score.finalveragegrade = grade1;
                score.usualaveragegrade = grade2;
            }
            Course course = courseArrayList.get(i);
            course.score = score;
            courseArrayList1.add(course);
        }
        return courseArrayList1;
    }
    public static ArrayList<ClassStudent> caculateClassAverageScore(Student[] students,ArrayList<ClassStudent> classStudentArrayList){
        for (int j = 0; j < classStudentArrayList.size(); j++) {
            int cgrade = 0;
            int ccount = 0;
            for (int i = 0; i < students.length; i++) {
                String cid = students[i].sid.substring(0,6);
                if(cid.equals(classStudentArrayList.get(j).cid)){
                    ccount++;
                    cgrade+=students[i].course.score.averagegrade;
                }
            }
            ClassStudent classStudent1 = new ClassStudent();
            classStudent1.cid = classStudentArrayList.get(j).cid;
            if(ccount == 0){
                classStudent1.cgrade = 0;
            }
            else {
                classStudent1.cgrade = cgrade / ccount;
            }
            classStudentArrayList.set(j,classStudent1);
        }
        return classStudentArrayList;
    }
    public static ArrayList<Course> courseSort(ArrayList<Course> courseArrayList){
        Collator collator = Collator.getInstance(Locale.CHINESE);
        ArrayList<Course> courseArrayList1 = new ArrayList<>();
        String[] str = new String[courseArrayList.size()];
        for (int i = 0; i < courseArrayList.size(); i++) {
            str[i] = courseArrayList.get(i).cname;
        }
        Arrays.sort(str,collator);
        for (int i = 0; i < str.length; i++) {
            for (int j = 0; j < courseArrayList.size(); j++) {
                if(str[i].equals(courseArrayList.get(j).cname)){
                    courseArrayList1.add(courseArrayList.get(j));
                    break;
                }
            }
        }
        return courseArrayList1;
    }
    public static void printcourse(ArrayList<Course> courseArrayList){
        ArrayList<Course> courseArrayList2 = courseSort(courseArrayList);
        for (Course course : courseArrayList2) {
            if(course.score == null){
                System.out.println(course.cname + " has no grades yet");
            }
            else {
                if (course.cExamMethod.equals("考试")) {
                    System.out.println(course.cname + " " + course.score.usualaveragegrade + " " + course.score.finalveragegrade + " " + course.score.averagegrade);
                } else {
                    System.out.println(course.cname + " " + course.score.averagegrade + " " + course.score.averagegrade);
                }
            }
        }
    }
    public static void printclass(ArrayList<ClassStudent> classStudentArrayList){
        for (ClassStudent classStudent : classStudentArrayList) {
            System.out.println(classStudent.cid + " " + classStudent.cgrade);
        }
    }
    public static void printstudent(Student[] students){
        for (Student student : students) {
            System.out.println(student.sid + " " + student.sname + " " + student.course.score.averagegrade);
        }
    }
    public static boolean iscourse(String course,ArrayList<Course> courseArrayList){
        for (int i = 0; i < courseArrayList.size(); i++) {
            if(courseArrayList.get(i).cname.equals(course)){
                return true;
            }
        }
        return false;
    }
    public static int isexamMethodRight(ArrayList<Course> courseArrayList){
        for (int i = 0; i < courseArrayList.size(); i++) {
            if(courseArrayList.get(i).cCharacter.equals("必修") &&  courseArrayList.get(i).cExamMethod.equals("考察")){
                return i;
            }
        }
        return -1;
    }
    public static void isstudent(String sid,String cname,ArrayList<Student> studentArrayList){
        for (int i = 0; i < studentArrayList.size(); i++) {
            if(studentArrayList.get(i).sid.equals(sid)&&studentArrayList.get(i).course.cname.equals(cname)){
                flag1=1;
            }
            if(studentArrayList.get(i).sid.equals(sid)){
                flag2 =1;
            }
        }
    }
    public static boolean isgraderight(ArrayList<Student> studentArrayList){
        for (int i = 0; i < studentArrayList.size(); i++) {
            if(studentArrayList.get(i).course.cExamMethod.equals("考试")){
                if(studentArrayList.get(i).course.score.examScore.usualScore > 100 || studentArrayList.get(i).course.score.examScore.usualScore < 0 ||studentArrayList.get(i).course.score.examScore.finalScore < 0||studentArrayList.get(i).course.score.examScore.finalScore > 100){
                    return false;
                }
            }
            else {
                if(studentArrayList.get(i).course.score.investScore.lastScore < 0 || studentArrayList.get(i).course.score.investScore.lastScore > 100){
                    return false;
                }
            }
        }
        return true;
    }
}
class Student{
    String sid;
    String sname;
    Course course;
    public Student() {
    }
    public Student(String sid, String sname, Course course) {
        this.sid = sid;
        this.sname = sname;
        this.course = course;
    }
}
class Course{
    String cname;
    String cCharacter;
    String cExamMethod;
    Score score;
}
class Score{
    ExamScore examScore;
    InvestScore investScore;
    int averagegrade;
    int usualaveragegrade;
    int finalveragegrade;
}
class ExamScore{
    int usualScore;
    int finalScore;
}
class InvestScore{
    int lastScore;
}
class ClassStudent{
    int  cgrade;
    String cid;
}

SourceMonitor分析结果:

 

 本题设计了5个类,即学生类、课程类、成绩类、考试成绩类、考核成绩类,成绩类包含考试成绩类和考核成绩类,课程类包含成绩类,学生类包含课程类。课程信息和学生信息都用集合来存储。courseArrayList来存储不重复的课程信息,里面包含课程名称、课程性质、考核方式;courseArrayList1用来存储课程名和课程平均分;studentArrayList用来存储所有输入的学生信息(但课程名不一致),里面包含学号、姓名、课程名称、平时成绩(可选)、期末成绩;studentArrayList1用来存储不同学生的学生信息,里面包含学号、姓名、平均分;classStudentArrayList用来存储不同的班级号以及对应班级号的平均分。用Student[]类型的students来存储按学号排序后的学生信息,包含的信息跟studentArrayList1中的信息一致。

在Main类中定义的很多的函数用来简化代码。用isclassexist(ArrayList<ClassStudent> classStudentArrayList,String sid)来判断新输入的学生信息中的班级是否存在与班级集合中;isexamMethodwithgrad(ArrayList<Course> courseArrayList)来判断输入的成绩是否与考核方式一致,比如考核方式为考试则有考试成绩而无考察成绩,否则则有问题;用isexamMethodRight(ArrayList<Course> courseArrayList)函数来判断课程性质是否与考核方式一致;用isstudent(String sid,String cname,ArrayList<Student> studentArrayList)函数来判断输入的学生是否已经存在,是否输入相同的学生和相同的课程信息;用isgraderight(ArrayList<Student> studentArrayList)函数来判断输入的成绩是否正确(在0到100);用caculateStudentAverageScore()函数来计算学生的平均成绩;用caculateCourseAverageScore()函数来计算课程的平均成绩;用caculateClassAverageScore()函数来计算班级的平均成绩。

输入的时候用split(" ")函数将输入的字符串分隔开,通过判断字符串数组的长度来判断输入的是课程信息还是学生信息。、

在进行课程信息和学生信息输出时的排序时,用到了方法的重载。

三、采坑心得

1、第一次作业

7-7 判断三角形类型

输入三角形三条边,判断该三角形为什么类型的三角形。

输入格式:

在一行中输入三角形的三条边的值(实型数),可以用一个或多个空格或回车分隔,其中三条边的取值范围均为[1,200]。

 在这一题中主要是判断等腰直角三角形时出错,刚开始判断等腰直角三角形时我的代码如下:

else if(side1 == side2 || side1 == side3 || side2 == side3){
if(sideSqure1 == side1 * side1 || sideSqure2 == side2 * side2 || sideSqure3 == side3 * side3){
System.out.print("Isosceles right-angled triangle");
}

 这里判断时用的直接就是“==”号,即两边的平方和等于第三边的平方,结果判断错误,结果如下:

 后来考虑到等腰直角三角形的三条边不可能都为整数,于是便改变判断条件为:

 else if(side1 == side2 || side1 == side3 || side2 == side3){
            if(sideSqure1 - side1 * side1 < 0.000001 || sideSqure2 - side2 * side2 < 0.000001 || sideSqure3 - side3 * side3 < 0.000001){
                System.out.print("Isosceles right-angled triangle");
            }

 这里判断时用两边的平方和与第三边的平方的差值小于一个很小的数,结果正确,结果如下:

 

2、第二次作业

7-2 成绩计算-2-关联类

这题主要是第一次时没有注意测试用例的输出要求,没有计算平时成绩和期末成绩的平均分,结果如下:

 第二次加上了计算平时成绩和期末成绩的平均分,结果正确:

 

7-8 jmu-java-日期类的基本使用
  1. 给定一个日期,判定是否为合法日期。如果合法,判断该年是否闰年,该日期是当年第几天、当月第几天、当周第几天、。
  2. 给定起始日期与结束日期,判定日期是否合法且结束日期是否早于起始日期。如果均合法,输出结束日期与起始日期之间的相差的天数、月数、念书。

输入格式:

第一行输入一个日期字符串,格式为"YYYY-MM-dd"
第二行输入两个日期字符串,中间使用空格隔开。分别代表开始日期与结束日期。

输出格式:

如果第一行日期字符串非法,输出自定义的错误信息。
如果第一行日期有效,输出相关信息,如果是闰年要输出是闰年。
如果第二行两个日期,只要有一个无效。就输出相关错误信息。
如果第二行两个日期有效且结束日期不早于开始日期,输出相关信息。

该题主要是一开始的时候是错误用例测试失败,原因是我先将输入的字符串转换为数字再进行的格式判断,这可能会导致错误测试时输入的一些年、月、日并不是数字而导致不能调用Integer.parseInt,该代码如下:

import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String date1 = sc.nextLine();
        String date2 = sc.next();
        String date3 = sc.next();

        int day1 = Integer.parseInt(date1.substring(8));
        int weekday = differencedate(date1,"2023-09-18");//与2023-08-18相差的天数,用来计算当周第几天
        if(!isRightDate(date1)){
            System.out.println(date1 + "无效!");
        }
        else {
            if (isLeapYear(Integer.parseInt(date1.substring(0,4)))){
                System.out.println(date1 + "是闰年.");
            }
            if(date1.compareTo("2023-09-18") > 0) {
                System.out.println(date1 + "是当年第" + getdateNum(date1) + "天,当月第" + day1 + "天,当周第" + (weekday % 7 + 1) + "天.");
            }
            else {
                System.out.println(date1 + "是当年第" + getdateNum(date1) + "天,当月第" + day1 + "天,当周第" + ((7 - weekday % 7) % 7 + 1) + "天.");
            }
        }

        int year2 = Integer.parseInt(date2.substring(0,4));
        int month2 = Integer.parseInt(date2.substring(5,7));

        int year3 = Integer.parseInt(date3.substring(0,4));
        int month3 = Integer.parseInt(date3.substring(5,7));

        if(!(isRightDate(date2) && isRightDate(date3))){
            System.out.println(date2 + "或" + date3 + "中有不合法的日期.");
        }
        else {
            if(date2.compareTo(date3) > 0){
                System.out.println(date3 + "早于" + date2 + ",不合法!");
            }
            else {
                System.out.println(date3 + "与" + date2 + "之间相差" + differencedate(date2,date3) + "天,所在月份相差" +(month3 - month2) + ",所在年份相差" + (year3 - year2) + ".");
            }
        }
    }

    public static boolean isRightDate(String s){
        boolean stringfomat =s.matches("\\d{4}[-]\\d{2}[-]\\d{2}");
        if(!stringfomat){
            return false;
        }
        else {
            int year = Integer.parseInt(s.substring(0, 4));
            int month = Integer.parseInt(s.substring(5, 7));
            int day = Integer.parseInt(s.substring(8));
            if (month > 12 || month < 1) {
                return false;
            } else if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
                if (day <= 0 || day > 31) {
                    return false;
                }
            } else if (month == 4 || month == 6 || month == 9 || month == 11) {
                if (day <= 0 || day > 30) {
                    return false;
                }
            } else if (month == 2) {
                if (isLeapYear(year)) {
                    if (day <= 0 || day > 29) {
                        return false;
                    }
                } else {
                    if (day <= 0 || day > 28) {
                        return false;
                    }
                }
            }
        }
        return true;
    }

    public static boolean isLeapYear(int year){
        if(((year % 4 == 0 ) && (year % 100 != 0)) || (year % 400 == 0)){
            return true;
        }
        return false;
    }

    public static int getdateNum(String s){
        int year = Integer.parseInt(s.substring(0,4));
        int month = Integer.parseInt(s.substring(5,7));
        int day = Integer.parseInt(s.substring(8));
        int[] leapYearArr = {0,0,31,60,91,121,152,182,213,244,274,305,335,366};
        int[] commonYearArr = {0,0,31,59,90,120,151,181,212,243,273,304,334,365};
        if(isLeapYear(year)){
            return leapYearArr[month] + day;
        }
        else {
            return commonYearArr[month] + day;
        }
    }

    public static int differencedate(String s,String reference_s){
//        String reference_s = "2023-09-18";
        int reference_year = Integer.parseInt(reference_s.substring(0,4));

        int year = Integer.parseInt(s.substring(0,4));
        int differenceyear = Math.abs(reference_year - year);

        int num = 0;
        if(reference_s.compareTo(s) >= 0){
            for (int i = 0; i < differenceyear; i++) {
                if(isLeapYear(year + i)){
                    num += 366;
                }
                else {
                    num +=365;
                }
            }
            return num + getdateNum(reference_s) - getdateNum(s);
        }
        else {
            for (int i = 0; i < differenceyear; i++) {
                if(isLeapYear(reference_year + i)){
                    num += 366;
                }
                else {
                    num +=365;
                }
            }
            return num - getdateNum(reference_s) + getdateNum(s);
        }
    }
}

测试结果如下:

 

 改正后代码如下:

import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String date1 = sc.nextLine();
        String date2 = sc.next();
        String date3 = sc.next();
        
        if(!isRightDate(date1)){
            System.out.println(date1 + "无效!");
        }
        else {
            int day1 = Integer.parseInt(date1.substring(8));
            int weekday = differencedate(date1,"2023-09-18");//与2023-08-18相差的天数,用来计算当周第几天
            if (isLeapYear(Integer.parseInt(date1.substring(0,4)))){
                System.out.println(date1 + "是闰年.");
            }
            if(date1.compareTo("2023-09-18") > 0) {
                System.out.println(date1 + "是当年第" + getdateNum(date1) + "天,当月第" + day1 + "天,当周第" + (weekday % 7 + 1) + "天.");
            }
            else {
                System.out.println(date1 + "是当年第" + getdateNum(date1) + "天,当月第" + day1 + "天,当周第" + ((7 - weekday % 7) % 7 + 1) + "天.");
            }
        }

        if(!(isRightDate(date2) && isRightDate(date3))){
            System.out.println(date2 + "或" + date3 + "中有不合法的日期.");
        }
        else {
            int year2 = Integer.parseInt(date2.substring(0,4));
            int month2 = Integer.parseInt(date2.substring(5,7));

            int year3 = Integer.parseInt(date3.substring(0,4));
            int month3 = Integer.parseInt(date3.substring(5,7));
            if(date2.compareTo(date3) > 0){
                System.out.println(date3 + "早于" + date2 + ",不合法!");
            }
            else {
                System.out.println(date3 + "与" + date2 + "之间相差" + differencedate(date2,date3) + "天,所在月份相差" +(month3 - month2) + ",所在年份相差" + (year3 - year2) + ".");
            }
        }
    }

    public static boolean isRightDate(String s){

        char c1 = s.charAt(4);
        char c2 = s.charAt(7);

        boolean stringfomat =s.matches("\\d{4}[-]\\d{2}[-]\\d{2}");
        if(!stringfomat){
            return false;
        }
        else {
            int year = Integer.parseInt(s.substring(0, 4));
            int month = Integer.parseInt(s.substring(5, 7));
            int day = Integer.parseInt(s.substring(8));
            if (month > 12 || month < 1) {
                return false;
            } else if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
                if (day <= 0 || day > 31) {
                    return false;
                }
            } else if (month == 4 || month == 6 || month == 9 || month == 11) {
                if (day <= 0 || day > 30) {
                    return false;
                }
            } else if (month == 2) {
                if (isLeapYear(year)) {
                    if (day <= 0 || day > 29) {
                        return false;
                    }
                } else {
                    if (day <= 0 || day > 28) {
                        return false;
                    }
                }
            }
        }
        return true;
    }

    public static boolean isLeapYear(int year){
        if(((year % 4 == 0 ) && (year % 100 != 0)) || (year % 400 == 0)){
            return true;
        }
        return false;
    }

    public static int getdateNum(String s){
        int year = Integer.parseInt(s.substring(0,4));
        int month = Integer.parseInt(s.substring(5,7));
        int day = Integer.parseInt(s.substring(8));
        int[] leapYearArr = {0,0,31,60,91,121,152,182,213,244,274,305,335,366};
        int[] commonYearArr = {0,0,31,59,90,120,151,181,212,243,273,304,334,365};
        if(isLeapYear(year)){
            return leapYearArr[month] + day;
        }
        else {
            return commonYearArr[month] + day;
        }
    }

    public static int differencedate(String s,String reference_s){
//        String reference_s = "2023-09-18";
        int reference_year = Integer.parseInt(reference_s.substring(0,4));

        int year = Integer.parseInt(s.substring(0,4));
        int differenceyear = Math.abs(reference_year - year);

        int num = 0;
        if(reference_s.compareTo(s) >= 0){
            for (int i = 0; i < differenceyear; i++) {
                if(isLeapYear(year + i)){
                    num += 366;
                }
                else {
                    num +=365;
                }
            }
            return num + getdateNum(reference_s) - getdateNum(s);
        }
        else {
            for (int i = 0; i < differenceyear; i++) {
                if(isLeapYear(reference_year + i)){
                    num += 366;
                }
                else {
                    num +=365;
                }
            }
            return num - getdateNum(reference_s) + getdateNum(s);
        }
    }
}

 测试结果如下:

3、第三次作业

7-2 课程成绩统计程序-1

这题刚开始遇到的问题是输入时的问题,刚开始时输入是一个一个输入而非一行一行输入,判断是课程信息还是学生信息用的是正则表达式判断,当课程的考核方式与成绩不匹配时,就会出现问题,刚开始时的输入代码如下:

 Scanner sc = new Scanner(System.in);
        ArrayList<Course> courseArrayList = new ArrayList<>();//课程信息
        ArrayList<Student> studentArrayList = new ArrayList<>();
        ArrayList<Student> studentArrayList1 = new ArrayList<>();
        String s = sc.next();
        while(!s.equals("end")) {
            boolean isNumber = s.matches("\\d{8}");
            if(!isNumber){
                String coursename = s;
                String courseCharacter = sc.next();
                String courseExamMethod = sc.next();
                Course course1 = new Course();
                if(!iscourse(coursename,courseArrayList)) {
                    course1.setCname(coursename);
                    course1.setcCharacter(courseCharacter);
                    course1.setcExamMethod(courseExamMethod);
                    courseArrayList.add(course1);
                }
            }
            else{
                String sid = s;
                String sName = sc.next();
                String sCourseName = sc.next();
                Score score = new Score();
                ExamScore examScore = new ExamScore();
                InvestScore investScore = new InvestScore();
                Course course = new Course();
                int usualScore = 0;
                int finalScore = 0;
                int lastScore1 = 0;
                int temp = 0;
                for (int i = 0; i < courseArrayList.size(); i++) {
                    if(sCourseName.equals(courseArrayList.get(i).getCname())){
                        course.setCname(courseArrayList.get(i).getCname());
                        course.setcCharacter(courseArrayList.get(i).getcCharacter());
                        course.setcExamMethod(courseArrayList.get(i).getcExamMethod());
                        temp = i;
                        break;
                    }
                }
                if(course.getcExamMethod().equals("考试")){
                    usualScore = sc.nextInt();
                    finalScore = sc.nextInt();
                    examScore.setUsualScore(usualScore);
                    examScore.setFinalScore(finalScore);
                    score.setExamScore(examScore);
                }
                else {
                    lastScore1 = sc.nextInt();
                    investScore.setLastScore(lastScore1);
                    score.setInvestScore(investScore);
                }
                course.setScore(score);
                courseArrayList.set(temp,course);
                Student student = new Student(sid,sName,course);
                studentArrayList.add(student);
                if(!isstudent(sid,studentArrayList1)){
                    studentArrayList1.add(student);
                }
            }
            s = sc.next();
        }

 当输入的成绩与考核方式不匹配时,就会出现:

 并且会发生报错:

 改进后以行为一个字符串用nextLine()输入,用String[] str = s.split(" ")取出数据,判断字符串数组的长度来判断考核方式,这样可以有效避免输入错误,改进后输入部分代码为:

  int temp1 = -1;
        Scanner sc = new Scanner(System.in);
        ArrayList<Course> courseArrayList = new ArrayList<>();
        ArrayList<Student> studentArrayList = new ArrayList<>();
        ArrayList<Student> studentArrayList1 = new ArrayList<>();
        ArrayList<ClassStudent> classStudentArrayList = new ArrayList<>();
        String s = sc.nextLine();
        while (!s.equals("end")){
            String[] str = s.split(" ");
            if(str.length == 3){
                Course course1 = new Course();
                if(!iscourse(str[0],courseArrayList)){
                    course1.cname = str[0];
                    course1.cCharacter = str[1];
                    course1.cExamMethod = str[2];
                    courseArrayList.add(course1);
                }
            }
            else {
                Score score = new Score();
                Course course1 = new Course();
                InvestScore investScore = new InvestScore();
                ExamScore examScore = new ExamScore();
                course1.cname = str[2];
                int temp=-1;
                for (int i = 0; i < courseArrayList.size(); i++) {
                    if(courseArrayList.get(i).cname.equals(course1.cname)){
                        temp = i;
                        course1.cCharacter = courseArrayList.get(i).cCharacter;
                        course1.cExamMethod = courseArrayList.get(i).cExamMethod;
                        break;
                    }
                }
                if(str.length == 4){
                    investScore.lastScore = Integer.parseInt(str[3]);
                    score.investScore = investScore;
                }
                else {
                    examScore.usualScore = Integer.parseInt(str[3]);
                    examScore.finalScore = Integer.parseInt(str[4]);
                    score.examScore = examScore;
                }
                course1.score = score;
                if(temp==-1){
                    temp1 = 1;
                    System.out.println(str[2] + " does not exist");
                    continue;
                }else {
                    courseArrayList.set(temp, course1);
                }
                Student student = new Student(str[0],str[1],course1);
                isstudent(str[0],str[2],studentArrayList1);
                isstudent(str[0],str[2],studentArrayList);
                if(flag1!=1) {
                    studentArrayList.add(student);
                }
                if(flag2!=1){
                    studentArrayList1.add(student);
                }
                if(!isclassexist(classStudentArrayList,str[0])){
                    ClassStudent classStudent = new ClassStudent();
                    classStudent.cid = str[0].substring(0,6);
                    classStudentArrayList.add(classStudent);
                }
            }
            s = sc.nextLine();
        }

这是输入错误信息代码不会直接报错,结果如图:

 

四、主要困难以及改进建议

1、主要困难:在第二次作业题目7-8 jmu-java-日期类的基本使用中,在该题中计算两个日期差、以及当周第几天等都是自己写函数计算的,特别是计算当周第几天时,我用的方法是设计一个参考时间(2023-09-18),用来计算输入日期与该日期的差值来确定该日期的星期,由于早于该日期和晚于改日期的计算方法也不一样,所以这里造成了很大的困难。

改进方法:java中有一些日期类的方法可供调用,例如LocalDate类中of()、isAfter()、isBefore()、until()等,直接调用这些方法可能可以减少很多的代码量。

2、主要困难:在第三次作业题目7-2 课程成绩统计程序-1中,需要考虑到的情况很多,对于各种异常情况的输出也需要严格的把控,对于类的设计和类中属性的安排是个比较大的考验,输出时按课程名顺序输出时也不能用简单的字符串排序方法进行排序,这里都造成了较大的困难。

改进方法:多查找Java中是否有相应封装好的类和方法可供调用,以及设计一个好的类可以减少很多的代码量。

五、总结

通过这三次作业,首先我对Java有了一个基本的了解,明白了面向对象编程的部分原理,对Java中的几种数据类型有了更深刻的了解,明白了如何对String中的一些方法进行调用,如何字符串转数组,以及学会了正则表达式的运用,对Java中类有了更深的理解,对成员属性、方法、构造函数等有了更清晰的认识,也明白了Java跟C语言等间的差别。

但对于类和类中方法的设计我还有明显的不足之处,这方面还需要努力改进。