首页 > 其他分享 >PTA7-8次PTA题目集以及期末考试总结

PTA7-8次PTA题目集以及期末考试总结

时间:2023-12-07 10:34:04浏览次数:40  
标签:layer String double PTA public 期末考试 PTA7 成绩 side

PTA7-8次PTA题目集以及期末考试总结

一、前言:

    本次博客介绍PTA第七次和第八次作业以及期末考试的总结。

      第七次题目有涉及到容器HashMap的检索与排序,其中还有特殊的HashMap来存储内容,同时还有多态的使用与学习,可以让你对多态有进一步的了       解,对于成绩的迭代二,其中需要重构类图,新增了一些类以及实现方法,熟练的运用类与类的接口来实现他们之间的排序来更好的解决问题,本次题目集的题目量比较少,难度并不高。       第八次题目涉及到了ArrayList的排序方法,以及for-each,同时还涉及到了自定义接口来使用,对于接口中各个方法的重写等,以及对于toStringequals方法的覆盖等程成绩统计程序-3在第二次基       础上修改了计算总成绩的方式,要求:修改类结构,将成绩类的继承关系改为组合关系,成绩信息由课程成绩类和分项成绩类组成,课程成绩类组合分项成绩类,分项成绩类由成绩分值和权重两个构成       期末考试主要考的还是类的继承和多态的关系以及一些接口的实现。于编程题部分,主要是让我们规范的构造类以确保代码具有一定的拓展性,确保后续的使用,其中还让我们使用到了接口用接口方法          来实现排序,题目不是很难,但是想要在有限的时间里完成选择题和编程大题还是有一点难度的。

二、程序设计与分析:

第七次作业:

 

7-3 课程成绩统计程序-2 分数 60

 

作者 蔡轲 单位 南昌航空大学

 

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

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


e724fa4193aa9ee32e78a68cd96fd6df_22401e04-c501-4b28-bb65-dabe39d374e7.png

心得体会:

 程序分析:

 

 

 

第八次作业:

 

7-2 课程成绩统计程序-3 分数 64

 

作者 蔡轲 单位 南昌航空大学

 

课程成绩统计程序-3在第二次的基础上修改了计算总成绩的方式,

要求:修改类结构,将成绩类的继承关系改为组合关系,成绩信息由课程成绩类和分项成绩类组成,课程成绩类组合分项成绩类,分项成绩类由成绩分值和权重两个属性构成。

完成课程成绩统计程序-2、3两次程序后,比较继承和组合关系的区别。思考一下哪一种关系运用上更灵活,更能够适应变更。

题目最后的参考类图未做修改,大家根据要求自行调整,以下内容加粗字体显示的内容为本次新增的内容。

某高校课程从性质上分为:必修课、选修课、实验课,从考核方式上分为:考试、考察、实验。

考试的总成绩由平时成绩、期末成绩分别乘以权重值得出,比如平时成绩权重0.3,期末成绩权重0.7,总成绩=平时成绩*0.3+期末成绩*0.7。

考察的总成绩直接等于期末成绩

实验的总成绩等于课程每次实验成绩乘以权重后累加而得。

课程权重值在录入课程信息时输入。(注意:所有分项成绩的权重之和应当等于1)

必修课的考核方式必须为考试,选修课可以选择考试、考察任一考核方式。实验课的成绩必须为实验。

1、输入:

包括课程、课程成绩两类信息。

课程信息包括:课程名称、课程性质、考核方式、分项成绩数量、每个分项成绩的权重。

考试课信息格式:课程名称+英文空格+课程性质+英文空格+考核方式+英文空格+平时成绩的权重+英文空格+期末成绩的权重

考察课信息格式:课程名称+英文空格+课程性质+英文空格+考核方式

实验课程信息格式:课程名称+英文空格+课程性质+英文空格+考核方式+英文空格+分项成绩数量n+英文空格+分项成绩1的权重+英文空格+。。。+英文空格+分项成绩n的权重

实验次数至少4次,不超过9次

课程性质输入项:必修、选修、实验

考核方式输入选项:考试、考察、实验

考试/考查课程成绩信息包括:学号、姓名、课程名称、平时成绩(可选)、期末成绩

考试/考查课程成绩信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+平时成绩+英文空格+期末成绩

实验课程成绩信息包括:学号、姓名、课程名称、每次成绩{在系列-2的基础上去掉了(实验次数),实验次数要和实验课程信息中输入的分项成绩数量保持一致}

实验课程信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+第一次实验成绩+...+英文空格+最后一次实验成绩

以上信息的相关约束:

1)成绩是整数,不包含小数部分,成绩的取值范围是【0,100】

2)学号由8位数字组成

3)姓名不超过10个字符

4)课程名称不超过10个字符

5)不特别输入班级信息,班级号是学号的前6位。

2、输出:

输出包含三个部分,包括学生所有课程总成绩的平均分、单门课程总成绩平均分、班级所有课程总成绩平均分。

为避免四舍五入误差,

计算单个成绩时,分项成绩乘以权重后要保留小数位,计算总成绩时,累加所有分项成绩的权重分以后,再去掉小数位。

学生总成绩/整个班/课程平均分的计算方法为累加所有符合条件的单个成绩,最后除以总数。

1)学生课程总成绩平均分按学号由低到高排序输出

格式:学号+英文空格+姓名+英文空格+总成绩平均分

如果某个学生没有任何成绩信息,输出:学号+英文空格+姓名+英文空格+"did not take any exams"

2)单门课程成绩按课程名称的字符顺序输出

课程成绩输出格式:课程名称+英文空格+总成绩平均分

如果某门课程没有任何成绩信息,输出:课程名称+英文空格+"has no grades yet"

3)班级所有课程总成绩平均分按班级由低到高排序输出

格式:班级号+英文空格+总成绩平均分

如果某个班级没有任何成绩信息,输出:班级名称+英文空格+ "has no grades yet"

异常情况:

1)如果解析某个成绩信息时,课程名称不在已输入的课程列表中,输出:学号+英文空格+姓名+英文空格+":"+课程名称+英文空格+"does not exist"

2)如果解析某个成绩信息时,输入的成绩数量和课程的考核方式不匹配,输出:学号+英文空格+姓名+英文空格+": access mode mismatch"

以上两种情况如果同时出现,按第一种情况输出结果。

3)如果解析某个课程信息时,输入的课程性质和课程的考核方式不匹配,输出:课程名称+" : course type & access mode mismatch"

4)格式错误以及其他信息异常如成绩超出范围等,均按格式错误处理,输出"wrong format"

5)若出现重复的课程/成绩信息,只保留第一个课程信息,忽略后面输入的。

6)如果解析实验课程信息时,输入的分项成绩数量值和分项成绩权重的个数不匹配,输出:课程名称+" : number of scores does not match"

7)如果解析考试课、实验课时,分项成绩权重值的总和不等于1,输出:课程名称+" : weight value error"

信息约束:

1)成绩平均分只取整数部分,小数部分丢弃

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

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

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.Collator;
import java.util.*;
import java.util.stream.Collectors;

class student_message{
    Class classes;
    Student students;
    Course courses;

    public student_message() {
    }

    public student_message(Class classes, Student students, Course courses) {
        this.classes = classes;
        this.students = students;
        this.courses = courses;
    }

}

class Class extends student_message{
     String classNum;
    HashMap<String, Student> students;

    Class(String classNum) {
        this.classNum = classNum;
    }

    public String get_ClassNum() {
        return classNum;
    }

}

class Student extends student_message{
     String name;
     String studentNum;

    Student(String name, String studentNum) {
        this.name = name;
        this.studentNum = studentNum;
    }

    public String getName() {
        return name;
    }

    public String getStudentNum() {
        return studentNum;
    }

}

class Course extends student_message {
     String className;
    int courseid1;
    int courseid2;
    ArrayList<Float> course_classProcess = new ArrayList<>();

    Course(String className, int courseid1, int courseid2) {
        this.className = className;
    }

    public String getClassName() {
        return className;
    }


}

class CourseSelection {
    Student student;
    Course course;
    Grade grade;
}

class Grade {
    ArrayList<Integer> grades = new ArrayList<>();
    ArrayList<Float> stuiate_grade = new ArrayList<>();
    public int getGrade() {
        float allGrades = 0;
        for (int i = 0; i < stuiate_grade.size(); i++) {
            allGrades += stuiate_grade.get(i) * grades.get(i);
        }
        return (int) allGrades;
    }
}



abstract class Print {
    abstract public void studentPrint(HashMap<String, Student> students, ArrayList<CourseSelection> courseSelections);

    abstract public void coursePrint(HashMap<String, Course> courses, ArrayList<CourseSelection> courseSelections);

    abstract public void classPrint(HashMap<String, Class> classes, ArrayList<CourseSelection> courseSelections);
}
class printer extends Print {
    public void studentPrint(HashMap<String, Student> students, ArrayList<CourseSelection> courseSelections) {
        Set<String> set = students.keySet();
        Object[] arr = set.toArray();
        Arrays.sort(arr);
        student_process(arr, courseSelections, students);
    }

    public void student_process(Object[] arr, ArrayList<CourseSelection> courseSelections, HashMap<String, Student> students) {
        for (Object key : arr) {
            int x = 0, y = 0, z = -1;
            for (CourseSelection courseSelection : courseSelections) {
                if (students.get(key).getStudentNum().equals(courseSelection.student.getStudentNum())) {
                    z = 0;
                    x += courseSelection.grade.getGrade();
                    y++;
                }
            }
            if (z == -1) {
                System.out.println(students.get(key).getStudentNum() + " " + students.get(key).getName() + " did not take any exams");
            }
            if (z == 0) {
                x = x / y;
                System.out.println(students.get(key).getStudentNum() + " " + students.get(key).getName() + " " + x);
            }
        }
    }

    public void coursePrint(HashMap<String, Course> courses, ArrayList<CourseSelection> courseSelections) {
        List<String> list = courses.keySet().stream().collect(Collectors.toList());
        Collections.sort(list, new SoftName());
        course_process(list, courseSelections, courses);
    }

    public void course_process(List<String> list, ArrayList<CourseSelection> courseSelections, HashMap<String, Course> courses) {
        for (String key : list) {
            int x = 0, y = 0, z = -1;
            for (CourseSelection courseSelection : courseSelections) {
                if (courses.get(key).getClassName().equals(courseSelection.course.getClassName())) {
                    z = 0;
                    x += courseSelection.grade.getGrade();
                    y++;
                }
            }
            if (z == -1) {
                System.out.println(courses.get(key).getClassName() + " has no grades yet");
            }
            if (z == 0) {
                x = x / y;
                System.out.println(courses.get(key).getClassName() + " " + x);
            }
        }
    }

    public void classPrint(HashMap<String, Class> classes, ArrayList<CourseSelection> courseSelections) {
        Set<String> set = classes.keySet();
        Object[] arr = set.toArray();
        Arrays.sort(arr);
        class_process(arr, courseSelections, classes);
    }

    public void class_process(Object[] arr, ArrayList<CourseSelection> courseSelections, HashMap<String, Class> classes) {
        for (Object key : arr) {
            int x = 0, y = 0, z = -1;
            for (CourseSelection courseSelection : courseSelections) {
                if (classes.get(key).students.containsKey(courseSelection.student.getStudentNum())) {
                    z = 0;
                    x += courseSelection.grade.getGrade();
                    y++;
                }
            }
            if (z == -1) {
                System.out.println(classes.get(key).get_ClassNum() + " has no grades yet");
            }
            if (z == 0) {
                x = x / y;
                System.out.println(classes.get(key).get_ClassNum() + " " + x);
            }
        }
    }

    static class SoftName implements Comparator<String> {
        public int compare(String name1, String name2) {
            Comparator<Object> compare = Collator.getInstance(Locale.CHINA);
            return compare.compare(name1, name2);
        }
    }
}
abstract class Course_Process{
    abstract public void input_process(String strs);

    abstract  public void Is_inputype(String[] inputs);
    abstract public void Is_inputmode(String[] inputs);
}
class ALL_print extends Course_Process{
    printer print;
    HashMap<String, student_message> stu = new HashMap<>();
    HashMap<String, Class> classes = new HashMap<>();
    HashMap<String, Student> students = new HashMap<>();
    HashMap<String, Course> courses = new HashMap<>();
    ArrayList<CourseSelection> courseSelections = new ArrayList<>();

    public void input_process(String strs) {
        String[] inputs = strs.split(" ");
        if (strs.matches("^(\\S{1,10})( )(必修|选修|实验)( )(考试|考察|实验)$") ||
                strs.matches("^(\\S{1,10})( )(必修|选修|实验)( )(考试|考察|实验)( )((0.(0)+[1-9]|0.[1-9][0-9]*)( )(0.(0)+[1-9]|0.[1-9][0-9]*)$)") ||
                strs.matches("^(\\S{1,10})( )(必修|选修|实验)( )(考试|考察|实验)( )([4-9])((( )(0.(0)+[1-9]|0.[1-9][0-9]*|1))*)(( )(0.(0)+[1-9]|0.[1-9][0-9]*))$")
        ) {
            Is_inputype(inputs);
        } else if (strs.matches("^([0-9]{8})( )(\\S{1,10})( )(\\S{1,10})( )([0-9]|[1-9][0-9]|100)$") ||
                strs.matches("^([0-9]{8})( )(\\S{1,10})( )(\\S{1,10})( )([0-9]|[1-9][0-9]|100)( )([0-9]|[1-9][0-9]|100)$") ||
                strs.matches("^([0-9]{8})( )(\\S{1,10})( )(\\S{1,10})( )((([0-9]|[1-9][0-9]|100)( ))*)([0-9]|[1-9][0-9]|100)$")
        ) {
            Is_inputmode(inputs);
        } else
            System.out.println("wrong format");
    }

    public void Is_inputype(String[] inputs) {
        if (courses.containsKey(inputs[0])) {
            return;
        }
        int i = 0, j = 0;
        if (inputs[1].equals("必修")) {
            i = 1;
        }
        if (inputs[1].equals("选修")) {
            i = 2;
        }
        if (inputs[1].equals("实验")) {
            i = 3;
        }
        if (inputs[2].equals("考试")) {
            j = 1;
        }
        if (inputs[2].equals("考察")) {
            j = 2;
        }
        if (inputs[2].equals("实验")) {
            j = 3;
        }
        if ((i == 1 && j != 1) || (i == 3 && j != 3) || (i != 3 && j == 3)) {
            System.out.println(inputs[0] + " : course type & access mode mismatch");
            return;
        }
        if ((j == 1 && inputs.length != 5) || (j == 2 && inputs.length != 3) || (j == 3 && inputs.length - 4 != Integer.parseInt(inputs[3]))) {
            System.out.println(inputs[0] + " : number of scores does not match");
            return;
        }
        if (j == 1 && Float.parseFloat(inputs[3]) + Float.parseFloat(inputs[4]) != 1) {
            System.out.println(inputs[0] + " : weight value error");
            return;
        }
        if (j == 3) {
            float value = 0;
            for (int k = 0; k < Integer.parseInt(inputs[3]); k++) {
                value += Float.parseFloat(inputs[4 + k]);
            }
            if (value > 1.001 || value < 0.999) {
                System.out.println(inputs[0] + " : weight value error");
                return;
            }
        }
        Course course = new Course(inputs[0], i, j);
        if (j == 1) {
            course.course_classProcess.add(Float.parseFloat(inputs[3]));
            course.course_classProcess.add(Float.parseFloat(inputs[4]));
        }
        if (j == 2)
            course.course_classProcess.add(1F);
        if (j == 3) {
            for (int k = 0; k < Integer.parseInt(inputs[3]); k++) {
                course.course_classProcess.add(Float.parseFloat(inputs[4 + k]));
            }
        }
        courses.put(inputs[0], course);
    }

    public void Is_inputmode(String[] inputs) {
        for (CourseSelection courseSelection : courseSelections) {
            if (courseSelection.student.getStudentNum().equals(inputs[0]) && courseSelection.student.getName().equals(inputs[1]) && courseSelection.course.getClassName().equals(inputs[2])) {
                return;
            }
        }
        Student student = new Student(inputs[1], inputs[0]);
        students.put(inputs[0], student);
        String classNum = inputs[0].substring(0, 6);
        if (!classes.containsKey(classNum)) {
            Class class_num = new Class(classNum);
            classes.put(classNum, class_num);
            classes.get(classNum).students = new HashMap<>();
        }
        classes.get(classNum).students.put(student.getStudentNum(), student);
        if (!courses.containsKey(inputs[2])) {
            System.out.println(inputs[2] + " does not exist");
            return;
        }
        if (inputs.length - 3 != courses.get(inputs[2]).course_classProcess.size()) {
            System.out.println(inputs[0] + " " + inputs[1] + " : access mode mismatch");
            return;
        }
        CourseSelection courseSelection = new CourseSelection();
        courseSelection.student = student;
        courseSelection.course = courses.get(inputs[2]);
        Grade grade = new Grade();
        for (int i = 0; i < inputs.length - 3; i++) {
            grade.grades.add(Integer.parseInt(inputs[3 + i]));
        }
        grade.stuiate_grade = courses.get(inputs[2]).course_classProcess;
        courseSelection.grade = grade;
        courseSelections.add(courseSelection);
    }
}

public class Main {
    static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    static ALL_print allprint = new ALL_print();

    public static void main(String[] args) throws IOException {
        allprint.print = new printer();
        end_printf();
    }

    public static void end_printf() throws IOException {
        for (; ; ) {
            String str = in.readLine();
            if (str.equals("end")) {
                allprint.print.studentPrint(allprint.students, allprint.courseSelections);
                allprint.print.coursePrint(allprint.courses, allprint.courseSelections);
                allprint.print.classPrint(allprint.classes, allprint.courseSelections);
                break;
            }
            allprint.input_process(str);
        }
    }
}

 

 期末考试:

7-1 立体图形问题 分数 10 作者 段喜龙 单位 南昌航空大学

编程求得正方体和正三棱锥的表面积和体积,要求必须体现扩展性(继承)和多态性。

类结构如下图所示(参考):

image.png
试编程完成如上类设计,主方法源码如下(可直接拷贝使用):

 
public static void main(String[] args) {
    // TODO Auto-generated method stub
    Scanner input = new Scanner(System.in);
    double side = input.nextDouble();
        
    display(new Cube(side));
    display(new RegularPyramid(side));
}

其中,display(Solid solid)方法为定义在Main类中的静态方法,作用为体现程序的多态性。

注:正三棱锥的体积计算公式为底面积*高/3。

输入格式:

输入一个实型数,分别作为正方体的边长和正三棱锥的边长。

输出格式:

分别输出正方体的表面积、体积以及正棱锥的表面积和体积。保留两位小数,建议使用String.format(“%.2f”,value)

进行小数位数控制。


输入样例:

在这里给出一组输入。例如:

2.5

输出样例:

在这里给出相应的输出。例如:

37.50
15.63
10.83
1.84

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner input=new Scanner(System.in);
        double side = input.nextDouble();
        display(new Cube(side));
        display(new RegularPyramid(side));

    }
    public  static void display(Solid solid){
        System.out.println(String.format("%.2f",solid.getarea()));
        System.out.println(String.format("%.2f",solid.getvolum()));
    }
}
abstract class Solid{
    abstract double getarea();
    abstract double getvolum();
}

class Cube extends Solid{

    double side;

    public Cube(double side) {
        this.side = side;
    }

    @Override
    double getarea() {
        double area=0;
        area=side*side*6;
        return area;
    }

    @Override
    double getvolum() {
        double volum=0;
        volum=side*side*side;
        return volum;
    }

}
class RegularPyramid extends Solid{
    double side;


    public RegularPyramid(double side) {
        this.side = side;
    }

    @Override
    double getarea() {
        double baseArea = (Math.sqrt(3) / 4) * side * side;
        double lateralArea = 3 * baseArea;  // 正三棱锥有三个等边三角形的侧面
        return baseArea + lateralArea;
    }

    @Override
    double getvolum() {
        return (Math.sqrt(2) / 12) * side * side * side ;
    }

}
7-2 魔方问题 分数 20 作者 段喜龙 单位 南昌航空大学

问题描述:本问题中的魔方有两种,一种是正方体魔方,一种是正三棱锥魔方,其中,正方体或正三棱锥魔方是由单元正方体或正三棱锥组成,单元正方体或正三棱锥的个数由阶数(即层数)决定,即魔方边长=阶数*单元边长。魔方如下图所示:

image.png


利用“立体图形”问题源码,实现如下功能:

魔方有三个属性:颜色,阶数,类型(正方体魔方、正三棱锥魔方),程序要求输出魔方的颜色、表面积和体积。参考设计类图如下所示:

image.png

主方法部分可参考如下源码(可拷贝直接使用):


 
public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner input = new Scanner(System.in);
        
        String color = input.next();
        int layer = input.nextInt();
        double side = input.nextDouble();        
        
        RubikCube cube1 = new SquareCube(color, layer,new Cube(side)); 
                
        color = input.next();
        layer = input.nextInt();
        side = input.nextDouble();
        
        RubikCube cube2 = new RegularPyramidCube(color, layer,new RegularPyramid(side));
        display(cube1);
        display(cube2);
    }
}

其中,display(RubikCube cube)方法为Main类中定义的静态方法,用户输出魔方的信息,用于体现多态性。

输入格式:

第一部分:正方体魔方颜色、阶数、单元正方体边长,以空格或回车分隔;

第二部分:正三棱锥魔方颜色、阶数、单元正三棱锥边长,以空格或回车分隔。

输出格式:

正方体魔方颜色

正方体魔方表面积

正方体魔方体积

正三棱锥魔方颜色

正三棱锥魔方表面积
正三棱锥魔方体积

注:小数点保留两位

输入样例:

在这里给出一组输入。例如:

red 3 4.5
black 4 2.1

输出样例:

在这里给出相应的输出。例如:

red
1093.50
2460.38
black
122.21
69.85

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner input = new Scanner(System.in);

        String color = input.next();
        int layer = input.nextInt();
        double side = input.nextDouble();

        RubikCube cube1 = new SquareCube(color, layer,new Cube(side));

        color = input.next();
        layer = input.nextInt();
        side = input.nextDouble();

        RubikCube cube2 = new RegularPyramidCube(color, layer,new RegularPyramid(side));
        display(cube1);
        display(cube2);
    }
    public  static void display(RubikCube rubikCube){
        System.out.println(rubikCube.color);
        System.out.println(String.format("%.2f",rubikCube.getarea()));
        System.out.println(String.format("%.2f",rubikCube.getvolum()));
    }
}
abstract class Solid{
    double side;
    abstract double getarea();
    abstract double getvolum();
}

class Cube extends Solid{

    double side;

    public Cube(double side) {
        this.side = side;
    }

    @Override
    double getarea() {
        double area=0;
        area=side*side*6;
        return area;
    }

    @Override
    double getvolum() {
        double volum=0;
        volum=side*side*side;
        return volum;
    }

}
class RegularPyramid extends Solid{
    double side;


    public RegularPyramid(double side) {
        this.side = side;
    }

    @Override
    double getarea() {
        double baseArea = (Math.sqrt(3) / 4) * side * side;
        double lateralArea = 3 * baseArea;  // 正三棱锥有三个等边三角形的侧面
        return baseArea + lateralArea;
    }

    @Override
    double getvolum() {
        return (Math.sqrt(2) / 12) * side * side * side ;
    }
}

abstract class RubikCube extends Solid{
    String color;
    int layer;
    Solid solid;


    public RubikCube(String color, int layer, Solid solid) {
        this.color = color;
        this.layer = layer;
        this.solid = solid;
    }

    abstract double getarea();
    abstract double getvolum();

    // 获取魔方颜色
    public String getColor() {
        return color;
    }


}

class SquareCube extends RubikCube{

    public SquareCube(String color, int layer, Solid solid) {
        super(color, layer, solid);
    }

    @Override
    double getarea() {
        return layer * layer * solid.getarea();
    }

    @Override
    double getvolum() {
        return layer * layer * layer * solid.getvolum();
    }
}

class RegularPyramidCube extends RubikCube{

    public RegularPyramidCube(String color, int layer, Solid solid) {
        super(color, layer, solid);
    }

    @Override
    double getarea() {
        return layer * layer * solid.getarea();
    }

    @Override
    double getvolum() {
        return layer * layer*layer * solid.getvolum();
    }
}
7-3 魔方排序问题 分数 20 作者 段喜龙 单位 南昌航空大学

在魔方问题的基础上,重构类设计,实现列表内魔方的排序功能(按照魔方的体积进行排序)。

提示:题目中RubikCube类要实现Comparable接口。

其中,Main类源码如下(可直接拷贝使用):

 
public class Main {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner input = new Scanner(System.in);
        
        String color;
        int layer;
        double side;
        RubikCube cube;
        
        ArrayList<RubikCube> list = new ArrayList<>();
        
        int choice = input.nextInt();
        
        while(choice != 0) {
            switch(choice) {
            case 1://SquareCube
                color = input.next();
                layer = input.nextInt();
                side = input.nextDouble();
                cube = new SquareCube(color, layer,new Cube(side)); 
                list.add(cube);
                break;
            case 2://RegularPyramidCube
                color = input.next();
                layer = input.nextInt();
                side = input.nextDouble();
                cube = new RegularPyramidCube(color, layer,new RegularPyramid(side)); 
                list.add(cube);
                break;
            }
            choice = input.nextInt();
        }
        
        list.sort(Comparator.naturalOrder());//正向排序
        
        for(int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i).getColor() + " " + 
        String.format("%.2f", list.get(i).getArea()) + " " + 
        String.format("%.2f", list.get(i).getVolume()) );
            System.out.println("");
        }            
    }    
}

输入格式:

输入魔方类型(1:正方体魔方;2:正三棱锥魔方;0:结束输入)

魔方颜色、魔方阶数、魔方单元正方体、正三棱锥边长

..循环..

输出格式:

按魔方体积升序输出列表中各魔方的信息(实型数均保留两位小数),输出样式参见输出样例。

输入样例:

在这里给出一组输入。例如:

1 blue 3 4.5
2 red 4 2.1
1 yellow 5 2.3
2 black 4 9.42
1 white 4 5.4423
0

输出样例:

在这里给出相应的输出。例如:

red 122.21 69.85
yellow 793.50 1520.88
blue 1093.50 2460.38
black 2459.14 6304.73
white 2843.39 10316.38

import java.util.Scanner;
import java.util.ArrayList;
import java.util.Comparator;
abstract class Solid{
    double side;
    abstract double getArea();
    abstract double getVolume();
}


class Cube extends Solid {
    private double side;

    public Cube(double side) {
        this.side = side;
    }

    @Override
    public double getArea() {
        return 6 * side * side;
    }

    @Override
    public double getVolume() {
        return side * side * side;
    }

}

class SquareCube extends RubikCube {
    public SquareCube(String color, int layer, Solid solid) {
        super(color, layer, solid);
    }

    @Override
    public double getArea() {
        return layer * layer * solid.getArea();
    }

    @Override
    public double getVolume() {
        return layer * layer * layer * solid.getVolume();
    }
}

class RegularPyramid extends Solid {
    private double side;

    public RegularPyramid(double side) {
        this.side = side;
    }

    @Override
    public double getArea() {
        double baseArea = (Math.sqrt(3) / 4) * side * side;
        double lateralArea = 3 * baseArea;  // 正三棱锥有三个等边三角形的侧面
        return baseArea + lateralArea;
    }

    @Override
    public double getVolume() {
        return (Math.sqrt(2) / 12) * side * side * side ;
    }
}

class RegularPyramidCube extends RubikCube {
    public RegularPyramidCube(String color, int layer, Solid solid) {
        super(color, layer, solid);
    }

    @Override
    public double getArea() {
        return layer * layer * solid.getArea();
    }

    @Override
    public double getVolume() {
        return layer * layer*layer * solid.getVolume();
    }

}

abstract class RubikCube implements Comparable<RubikCube> {
     String color;
     int layer;
    Solid solid;

    public RubikCube(String color, int layer, Solid solid) {
        this.color = color;
        this.layer = layer;
        this.solid = solid;
    }

    public String getColor() {
        return color;
    }

    public int getLayer() {
        return layer;
    }

    public abstract double getArea() ;

    public abstract double getVolume() ;

    @Override
    public int compareTo(RubikCube o) {
        return ((int)this.getVolume()*100 - (int)o.getVolume()*100);
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        String color;
        int layer;
        double side;
        RubikCube cube;

        ArrayList<RubikCube> list = new ArrayList<>();

        int choice = input.nextInt();

        while (choice != 0) {
            switch (choice) {
                case 1:// SquareCube
                    color = input.next();
                    layer = input.nextInt();
                    side = input.nextDouble();
                    cube = new SquareCube(color, layer, new Cube(side));
                    list.add(cube);
                    break;
                case 2:// RegularPyramidCube
                    color = input.next();
                    layer = input.nextInt();
                    side = input.nextDouble();
                    cube = new RegularPyramidCube(color, layer, new RegularPyramid(side));
                    list.add(cube);
                    break;
            }
            choice = input.nextInt();
        }

        list.sort(Comparator.naturalOrder());// 正向排序

        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i).getColor() + " " +
                    String.format("%.2f", list.get(i).getArea()) + " " +
                    String.format("%.2f", list.get(i).getVolume()));
            System.out.println("");
        }
    }
}//有一个测试点过不去。

三、总结

这几次的大作业让我受益很深,而期末考试又让我发现了我最大的不足之处,通过这几次的大作业,我对Java“一切皆类,面向对象”的特点有了更深层次的理解,懂得如何创建类与对象同时,学会了自己定义一些接口,我也明白了合理利用网络资源自学的重要性。值得一提的是,我发现学习面向对象语言时,我们必须要沉下心来,要学会思考,就算有的问题思考几个小时都可能解决不了,但只要你一直去思考并不断尝试就总是会想到解决方法,因为java中有很多类是可以更加方便地帮助我们解决问题,我们需要耐心的去寻找这类资源并学习,不能一味求快,急于求成,否则这样会事半功倍,严重可能会打消我们学习积极性。然后就是,经过这次的期末考试,我发现我学的并不扎实,还有好多地方存在不足,未来我还需要加倍努力,对不足之处加以弥补。

 

标签:layer,String,double,PTA,public,期末考试,PTA7,成绩,side
From: https://www.cnblogs.com/ll77-blog/p/17881081.html

相关文章

  • 题目集7-8 && 期末考试的总结性BLOG
    (一)前言:本篇将介绍本人在对于学校布置的两次PTA习题和期末考试习题的总结。对于第七次题目集来说,有涉及到容器HashMap的检索与排序,其中还有特殊的HashMap来存储内容,对于排序的方法也与接口有着一定的差别,同时还有多态的使用与学习,可以让你对多态有进一步的了解,对于成绩的迭代二,其......
  • PTA7-8总结
    21207106-xuesongPTA7-8及期末总结一、前言这次博客是主要对选课系列题目和期末题目总结,选课系列题目包括课程成绩统计程序-2、课程成绩统计程序-3,课程成绩系列题主要是考察对类的创建,怎么设计合适的类,类与类之间的关系,考察了封装,继承,依赖等。其次是考察对正则表达式判......
  • pta
    pta7-1-1查询子序列和对N个整数的序列,查询子序列和${\textstyle\sum_{k=i}^{j}A_{k}(1≤i,j≤N)}$输入格式:第1行,两个整数:N和Q,表示整数的个数和查询的次数,1≤N≤100000,0≤Q≤100000.第2行,N个用空格分开的整数x,│x│≤20000.第3至Q+2行,每行两个整数i和j,表示所求子序......
  • PTA-2023第十一次练习题目讲解
    PTA-2023第十一次练习题目6-17实验7_9_简单排序法一:冒泡排序上课学过好多好多次,讲解略过,代码有注释。voidbubbleSort(intdata[],intelementCount){for(inti=0;i<elementCount-1;i++)//第一层循环,控制找最大值的次数{for(intj=0;j<elementCount-......
  • PTA|C语言|数组练习题
    --------------------------------------------------------------------------------求最大值及其下标本题要求编写程序,找出给定的n个数中的最大值及其对应的最小下标(下标从0开始)。输入格式:输入在第一行中给出一个正整数n(1<n≤10)。第二行输入n个整数,用空格分开。输出格式:在一行......
  • 毁灭PTA
    毁灭PTA思路:一道比较简单的最小生成树的应用,因为他的边权存在负值,而我们又想要得到最大分数,事实上我们就只需要统计一下正数的总和以及我们在建树时候用到了多少正数边权就可以巧妙地解决这个问题代码:#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongco......
  • PTA 感染人数
    7-1感染人数作者 黄龙军单位 绍兴文理学院设某住宿区域是一个n×n的方阵,方阵中的每个小方格为一个房间,房间里可能住一个人,也可能空着。第一天,某些房间中住着的人得了一种高传染性的流感,以后每一天,得流感的人会使其邻居(住在其上、下、左、右方向存在的房间里面的人)传染上......
  • java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.LoopTag问题的解决
    问题描述问题解决将这个依赖:改成这个依赖:......
  • iptables 杂谈ACCEPT和RETURN
    iptables杂谈ACCEPT和RETURN这两个目标,确实比较模糊。目录iptables杂谈ACCEPT和RETURN实验结论实验这里是实验的情况:新建两个iptables的规则链,并且相连,如果是ACCEPT:-Nmy_rule_1-Nmy_rule_2-Amy_rule_1-jACCEPT-Amy_rule_2-jACCEPT-Aparental_ctrl_0-jmy_......
  • PTA-ch7b-5 : 最小工期
    最小工期一个项目由若干个任务组成,任务之间有先后依赖顺序。项目经理需要设置一系列里程碑,在每个里程碑节点处检查任务的完成情况,并启动后续的任务。现给定一个项目中各个任务之间的关系,请你计算出这个项目的最早完工时间。输入格式:首先第一行给出两个正整数:项目里程碑的数量N......