首页 > 其他分享 >题目集1-3的总结

题目集1-3的总结

时间:2023-10-07 18:55:21浏览次数:36  
标签:总结 输出 题目 String int 菜品 java 输入

前言:

目前已经完成了一些关于Java的编程练习题,并且在逐渐掌握Java语言的基本知识和编程技巧。每个题目都涉及不同的知识点和概念,通过挑战自己解决问题,本人有效地学习和应用这些知识。对于复杂的题目集,确实需要更多的时间和精力来理解和解决。尽管如此,坚持练习,并解决各种难题会帮助提高编程能力和思维灵活性。当遇到困难时,还要记得寻求帮助和参考资料,以便更好地理解和掌握相关概念。

第一次作业有9道题目,题目数较多,但题目比较简单。也有部分题目有些许难度。例如7-7 判断三角形类型等,本次作业主要让我们理解关于Java面向对象编程的特点:1. 封装:将数据和操作封装在一个类中,通过定义公共接口来访问私有属性和方法,从而隐藏内部实现细节。2. 继承:可以通过继承创建新的子类,并从父类继承属性和方法。这样可以使代码更具有可重用性,并且建立了类之间的层次关系。3. 多态:同一种类型的对象,在不同情况下表现出不同的行为,提高了代码的灵活性和可扩展性。多态有静态多态(编译时确定)和动态多态(运行时确定)两种方式。4. 抽象:通过抽象类和接口来定义规范和协议。抽象类是对一组相关类的抽象描述,而接口则定义了一组某种意义上相关的方法。抽象能够使代码模块化、可扩展和易于维护。5. 类和对象:Java是一门面向对象的语言,所有的逻辑都是围绕类和对象展开的。类是一种模板或蓝图,用于创建对象。对象是类的实例,它们具有状态(属性)和行为(方法)。6. 强类型检查:在Java中,变量必须先声明并指定类型后才能使用。强类型检查可以减少潜在的bug,并提高代码的可读性。总体而言,面向对象编程是一种以对象为基本单位组织和管理代码的方法,具有代码复用、封装、灵活性、可维护性等优点。

第二次作业比较上次难度有所提升,具体表现为类的封装,例如第一题7-1 成绩计算-1-类、数组的基本运用,是经典的学生类的封装和运用,对于初学并且一知半解的我是不小的挑战。又比如7-6 GPS测绘中度分秒转换,这道题目主要考察的是对测绘中度分秒和小数点格式之间的转换。需要注意以下几个点:根据规则,将输入的度、分、秒进行计算,得到最终的结果。具体地,将第一个整数加上第二个整数除以60,并加上第三个浮点数除以3600,得到经度或纬度的小数值。在输出结果时,需要保留6位小数。可以使用Java提供的格式化功能来实现精确控制输出的小数位数。题目假设用户输入的数据都是合法的。因此,在代码实现中无需考虑错误处理机制,不必校验输入是否合法。这是一道数据转换题,只要按照给定的规则进行计算,然后需要通过适当的格式化输出。7-7 菜单计价程序-1考察的主要是Java面向对象编程的知识和能力。需要注意理解菜品类(Dish)的设计:菜品类包含了菜品名称(name)和单价(unit_price)两个属性。计算菜品价格的方法 getPrice(int portion),根据份额(portion)来计算不同份额下的菜品价格。 理解菜谱类(Menu)的设计:菜谱类包含一个菜品数组(dishs),用于保存所有菜品的信息。根据菜名在菜谱中查找菜品信息的方法 searchDish(String dishName),返回对应的菜品对象。 理解点菜记录类(Record)的设计:点菜记录类保存一道菜品记录,包含菜品对象(Dish)和份额(portion)。计价的方法 getPrice() 用于计算本条记录的价格,根据菜品对象和份额来计算不同份额下的菜品价格。理解订单类(Order)的设计:订单类保存用户点的所有菜品信息,包含一个记录数组(records)。添加一条菜品信息到订单中的方法 addARecord需要先通过菜谱找到对应的菜品对象,然后将这条记录添加到订单中。计算订单的总价的方法 getTotalPrice() 遍历所有记录,累加每条记录的价格。在实现过程中还需要注意以下点:菜谱类中的菜品数组(dishs)可以直接使用静态初始化,在初始化时创建 Dish 对象并设置属性。 菜名、输入份额应该进行合法性校验,确保输入数据是合法的。在7-8 jmu-java-日期类的基本使用,主要考察的是日期类的基本使用。需要注意输入格式:确保输入的日期字符串符合指定的格式"YYYY-MM-dd"。合法日期判断:需要根据年份、月份和日期来判断给定的日期是否为合法日期。闰年判断:如果日期合法,则需要判断该年份是否为闰年。计算是当年第几天:根据日期计算出给定日期是当年的第几天。计算当月第几天:根据日期计算出给定日期是当月的第几天。计算当周第几天:根据日期计算出给定日期是当周的第几天。结束日期早于起始日期判断:需要对结束日期是否早于起始日期进行判断。需要注意的地方包括:需要设计一个DateUtils工具类或者Date类来实现日期相关的操作;在判断日期时,需考虑到不同年份与月份的差异性;要增加异常处理机制,以捕获非法日期输入所引发的异常,并返回自定义的错误信息。

第三次作业体量不大,但是难度很高,对学习能力和编程能力的要求不小,尤其是7-2 课程成绩统计程序-1,对本人来说是不小的挑战。部分题目则是对上次题目提供新要求。

设计与分析:

7-1 成绩计算-1-类、数组的基本运用 分数 10 作者 蔡轲 单位 南昌航空大学

创建学生类,包含

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

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

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

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

注意:未用学生类对象封装数据的,本题计0分

import java.util.Scanner;
class Student {
    private final String stuId;
    private final String name;
    private final int chinese;
    private final int math;
    private final int physics;
    public Student(String stuId, String name, String chinese, String math, String physics) {
        this.stuId = stuId;
        this.name = name;
        this.chinese = Integer.parseInt(chinese);
        this.math = Integer.parseInt(math);
        this.physics = Integer.parseInt(physics);
    }
    public int sum() {
        return chinese + math + physics;
    }
    public double average() {
        return sum() / 3.0;
    }
    public String getStuId() {
        return stuId;
    }
    public String getName() {
        return name;
    }
}
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        Student[] students = new Student[5];
        for (int i = 0; i < 5; i++) {
            String stu = in.nextLine();
            String[] scan;
            scan = stu.split(" ");
            Student student = new Student(scan[0],scan[1],scan[2],scan[3],scan[4]);
            students[i] = student;
        }
        for (Student student : students) {
            int sum = student.sum();
            double average = student.average();
            System.out.printf("%s %s %d %.2f\n", student.getStuId(), student.getName(), sum, average);
        }
    }
}

 在这个问题中,主要考察的是类和数组的基本运用。需要注意以下几点:创建学生类:需要设计一个Student类,包含学号、姓名以及语文、数学、物理成绩等属性。

计算总分:在Student类中添加计算总分的方法,将语文、数学、物理成绩相加得到总分。计算平均分:在Student类中添加计算平均分的方法,将总分除以科目数量得到平均分。学生信息封装:根据输入格式,将每个学生的信息分别封装在一个Student对象中,并使用一个数组来保存这些学生对象。遍历数组输出结果:使用循环遍历数组,对每个学生对象调用计算总分和平均分的方法,并按照指定的格式输出结果。

7-2 成绩计算-2-关联类 分数 10 作者 蔡轲 单位 南昌航空大学

创建成绩类,包含:

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

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

创建学生类,包含:

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

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

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

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

浮点数保留小数的相关知识可参考:https://blog.csdn.net/huaishuming/article/details/17752365


注意:未用学生类对象封装数据的,本题计0分

输入格式:

依次输入3个学生的每门课成绩,每个学生成绩信息格式:

学号+英文空格+姓名+英文空格+课程名+英文空格+平时成绩+英文空格+期末成绩
注:3个学生的课程顺序可能会不一致

例如:
22201311 张琳 语文 70 80

22201311 张琳 数学 85 89

22201311 张琳 物理 75 83

22201312 黄昊 语文 66 78

22201312 黄昊 数学 76 82

22201312 黄昊 物理 83 82

22201313 李少辰 语文 86 76

22201313 李少辰 数学 78 76

22201313 李少辰 物理 87 76

输出格式:

3个学生信息,每个学生信息格式:

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

例如:


22201311 张琳 242 80.67

22201312 黄昊 234 78.00

22201313 李少辰 236 78.67

输入样例:

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

22201311 张琳 语文 70 80
22201311 张琳 数学 85 89
22201311 张琳 物理 75 83
22201312 黄昊 语文 66 78
22201312 黄昊 数学 76 82
22201312 黄昊 物理 83 82
22201313 李少辰 语文 86 76
22201313 李少辰 数学 78 76
22201313 李少辰 物理 87 76

输出样例:

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

22201311 张琳 242 76.67 84.00 80.67
22201312 黄昊 234 75.00 80.67 78.00
22201313 李少辰 236 83.67 76.00 78.67
 这里给出代码的类的封装部分:
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

class Score {
    private int attendanceScore;
    private int finalExamScore;

    public Score(int attendanceScore, int finalExamScore) {
        this.attendanceScore = attendanceScore;
        this.finalExamScore = finalExamScore;
    }

    public int calculateTotalScore() {
        return (int) (attendanceScore * 0.4 + finalExamScore * 0.6);
    }
}

class Student {
    private String studentId;
    private String name;
    private Map<String, Score> scores;

    public Student(String studentId, String name) {
        this.studentId = studentId;
        this.name = name;
        scores = new HashMap<>();
    }
    
    public void addScore(String course, Score score) {
        scores.put(course, score);
    }

    public int calculateTotalScore() {
        int totalScore = 0;
        for (Score score : scores.values()) {
            totalScore += score.calculateTotalScore();
        }
        return totalScore;
    }

    public double calculateAverageScore() {
        int totalScore = calculateTotalScore();
        int numCourses = scores.size();
        return Math.round((double) totalScore / numCourses * 100) / 100.0;
    }
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(studentId).append(" ").append(name);

        int totalScore = calculateTotalScore();
        double averageScore = calculateAverageScore();

        sb.append(" ").append(totalScore).append(" ").append(averageScore);
        return sb.toString();
    }
}

由于本题并没有做到完全正确,所以不做过多阐述,但是对于成绩类(Score),我们需要定义属性:平时成绩 (attendanceScore) 和期末成绩 (finalExamScore),并提供计算总成绩的方法 calculateTotalScore()。计算方法根据给定的规则进行计算。接下来是学生类(Student),它包含了学号 (studentId)、姓名 (name) 以及每门课程的成绩对象 (chineseScore, mathScore, physicsScore)。我们还需要提供两个方法:calculateTotalScore() 计算总分和 calculateAverageScore() 计算平均分。这些方法将调用各科目成绩对象中的计算总成绩方法。在主程序中,会按输入顺序依次创建三个学生对象,并输出每位学生的信息。

7-7 菜单计价程序-1 分数 30 作者 蔡轲 单位 南昌航空大学

某饭店提供4种菜,每种菜品的基础价格如下:
西红柿炒蛋 15
清炒土豆丝 12
麻婆豆腐 12
油淋生菜 9

设计点菜计价程序,根据输入的订单,计算并输出总价格。
订单由一条或多条点菜记录组成,每条记录一行,最后以"end"结束
每条点菜记录包含:菜名、份额两个信息。
份额可选项包括:1、2、3,分别代表小、中、大份)

不同份额菜价的计算方法:
小份菜的价格=菜品的基础价格。
中份菜的价格=菜品的基础价格1.5。
小份菜的价格=菜品的基础价格
2。
如果计算出现小数,按四舍五入的规则进行处理。

参考以下类的模板进行设计:
菜品类:对应菜谱上一道菜的信息。
Dish {
String name;//菜品名称
int unit_price; //单价
int getPrice(int portion)//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份)
}

菜谱类:对应菜谱,包含饭店提供的所有菜的信息。
Menu {
Dish[] dishs ;//菜品数组,保存所有菜品信息
Dish searthDish(String dishName)//根据菜名在菜谱中查找菜品信息,返回Dish对象。
}

点菜记录类:保存订单上的一道菜品记录
Record {
Dish d;//菜品
int portion;//份额(1/2/3代表小/中/大份)
int getPrice()//计价,计算本条记录的价格
}

订单类:保存用户点的所有菜的信息。
Order {
Record[] records;//保存订单上每一道的记录
int getTotalPrice()//计算订单的总价
Record addARecord(String dishName,int portion)
//添加一条菜品信息到订单中。
}

输入格式:

每条点菜记录的格式:
菜名+空格(英文)+份额
注:份额可输入(1/2/3), 1代表小份,2代表中份,3代表大份。
最后一条记录以“end”结束。

输出格式:

订单上所有菜品的总价(整数数值),每份菜
如果订单中包含不能识别的菜名,则在总价之前输出“** does not exist”,**是不能识别的菜名

输入样例:

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

麻婆豆腐 2
西红柿炒蛋 3
end

输出样例:

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

48

输入样例1:

订单中包含不存在的菜品记录。例如:

麻婆豆腐 2
炒脆肚 2
西红柿炒蛋 3
end

输出样例1:

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

炒脆肚 does not exist
48
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String dish;
        String[] menu = new String[]{"清炒土豆丝", "西红柿炒蛋", "油淋生菜", "麻婆豆腐"};
        int price = 0;
        int portion;
        while (true) {
            int count = 0;
            dish = in.next();
            if (dish.equals("end")) {
                break;
            }
            portion = in.nextInt();
            if (dish.equals(menu[1])) {
                count = 1;
                if (portion == 1) {
                    price = price + 15;
                }
                if (portion == 2) {
                    price = price + 23;
                }
                if (portion == 3) {
                    price = price + 30;
                }
            }  if (dish.equals(menu[0])) {
                count = 1;
                if (portion == 1) {
                    price = price + 12;
                }
                if (portion == 2) {
                    price = price + 18;
                }
                if (portion == 3) {
                    price = price + 24;
                }
            }  if (dish.equals(menu[3])) {
                count = 1;
                if (portion == 1) {
                    price = price + 12;
                }
                if (portion == 2) {
                    price = price + 18;
                }
                if (portion == 3) {
                    price = price + 24;
                }
            }  if (dish.equals(menu[2])) {
                count = 1;
                if (portion == 1) {
                    price = price + 9;
                }
                if (portion == 2) {
                    price = price + 14;
                }
                if (portion == 3) {
                    price = price + 18;
                }
            }
            if (count == 0) {
                System.out.println(dish + " does not exist");
            }
        }
        System.out.println(price);
    }
}

我们需要设计并实现以下几个类:Dish(菜品类)、Menu(菜谱类)、Record(点菜记录类)以及Order(订单类)。其中,Dish类表示一道菜品的信息,Menu类包含了饭店提供的所有菜的信息,Record类用于保存订单上的一道菜品记录,而Order类则可以保存用户点的所有菜的信息。首先,让我们从最底层的菜品类Dish开始实现。根据参考模板,Dish类应该包含两个属性:name(菜品名称)和unit_price(单价),还应该有一个方法getPrice(int portion),用于计算不同份额的菜品价格。这里注意要按照题目要求进行四舍五入。接下来是菜谱类Menu,它应该包含一个Dish数组dishs,用于保存所有菜品信息。另外,还需要一个方法searthDish(String dishName),用于根据菜名在菜谱中查找对应的菜品信息,并返回Dish对象。然后是点菜记录类Record,它应该有两个属性:d(菜品)和portion(份额)。此外,还需要一个方法getPrice(),用于计算本条记录的价格。最后是订单类Order,它应该有一个Record数组records,用于保存订单上的每一道菜品记录。此外,还需要一个方法getTotalPrice(),用于计算订单的总价。另外,还需要一个方法addARecord(String dishName, int portion),用于添加一条菜品信息到订单中。

 

7-2 课程成绩统计程序-1 分数 65 作者 蔡轲 单位 南昌航空大学

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

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

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

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

1、输入:

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

课程信息包括:课程名称、课程性质、考核方式(可选,如果性质是必修课,考核方式可以没有)三个数据项。

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

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

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

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

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

以上信息的相关约束:

1)平时成绩和期末成绩的权重默认为0.3、0.7

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

3)学号由8位数字组成

4)姓名不超过10个字符

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

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

2、输出:

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

为避免误差,平均分的计算方法为累加所有符合条件的单个成绩,最后除以总数。

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

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

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

2)单门课程成绩平均分分为三个分值:平时成绩平均分(可选)、期末考试平均分、总成绩平均分,按课程名称的字符顺序输出

格式:课程名称+英文空格+平时成绩平均分+英文空格+期末考试平均分+英文空格+总成绩平均分

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

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

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

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

异常情况:

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

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

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

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

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

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

信息约束:

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

参考类图:


image.png

输入样例1:

仅有课程。例如:

java 必修 考试
数据结构 选修 考试
形式与政治 选修 考察
end

输出样例1:

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

java has no grades yet
数据结构 has no grades yet
形式与政治 has no grades yet

输入样例2:

单门考试课程 单个学生。例如:

java 必修 考试
20201103 张三 java 20 40
end

输出样例2:

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

20201103 张三 34
java 20 40 34
202011 34

输入样例3:

单门考察课程 单个学生。例如:

java 选修 考察
20201103 张三 java 40
end

输出样例3:

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

20201103 张三 40
java 40 40
202011 40

输入样例4:

考试课程 单个学生 不匹配的考核方式。例如:

java 必修 考试
20201103 张三 java 20
end

输出样例4:

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

20201103 张三 : access mode mismatch
20201103 张三 did not take any exams
java has no grades yet
202011 has no grades yet

输入样例5:

单门课程,单个学生,课程类型与考核类型不匹配。例如:

java 必修 考察
20201103 张三 java 40
end

输出样例5:

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

java : course type & access mode mismatch
java does not exist
20201103 张三 did not take any exams
202011 has no grades yet

输入样例6:

单门课程,多个学生。例如:

java 选修 考察
20201103 李四 java 60
20201104 王五 java 60
20201101 张三 java 40
end

输出样例6:

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

20201101 张三 40
20201103 李四 60
20201104 王五 60
java 53 53
202011 53

输入样例7:

单门课程,单个学生,课程类型与考核类型不匹配。例如:

形式与政治 必修 考试
数据库 选修 考试
java 选修 考察
数据结构 选修 考察
20201103 李四 数据结构 70
20201103 李四 形式与政治 80 90
20201103 李四 java 60
20201103 李四 数据库 70 78
end

输出样例7:

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

20201103 李四 73
java 60 60
数据结构 70 70
数据库 70 78 75
形式与政治 80 90 87
202011 73

输入样例8:

单门课程,单个学生,成绩越界。例如:

数据结构 选修 考察
20201103 李四 数据结构 101
end

输出样例8:

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

wrong format
数据结构 has no grades yet

输入样例9:

多门课程,多个学生,多个成绩。例如:

形式与政治 必修 考试
数据库 选修 考试
java 选修 考察
数据结构 选修 考察
20201205 李四 数据结构 70
20201103 李四 形式与政治 80 90
20201102 王五 java 60
20201211 张三 数据库 70 78
end

输出样例9:

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

20201102 王五 60
20201103 李四 87
20201205 李四 70
20201211 张三 75
java 60 60
数据结构 70 70
数据库 70 78 75
形式与政治 80 90 87
202011 73
202012 72
import java.util.*;
class Grade{
    private final String studentId;
    private final String name;
    private final String courseName;

    public Grade(int studentId, String name, String courseName, int ignoredUsualScore, int ignoredFinalScore){
        this.studentId = String.valueOf(studentId);
        this.name = name;
        this.courseName = courseName;
    }

    public String getCourseName(){
        return this.courseName;
    }

    public String getName() {
        return name;
    }

    public String getStudentId() {
        return studentId;
    }

    public Integer getTotalScore(Object[] ignoredCourseList) {
        return null;
    }
}

class ScoreCalculator{

    public static double calculateAverage(List<Integer> scores){
        int sum = 0;
        for (int score : scores) {
            sum += score;
        }
        return (double)sum / scores.size();
    }
}

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

        Object[] courseList = new ArrayList<>().toArray(new Object[0]);
        List<Grade> gradeList = new ArrayList<>();

        while(scanner.hasNext()){
            String input = scanner.nextLine();
            if(input.equals("end")) break;

            String[] arr = input.split(" ");


            if(arr.length == 3){
                try {
                    courseList.wait();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }

            else if(arr.length == 6){
                Grade grade = new Grade(Integer.parseInt(arr[0]), arr[1], arr[2], Integer.parseInt(arr[3]), Integer.parseInt(arr[4]));
                gradeList.add(grade);
            }
        }

        Map<String, Double> averageMap = new HashMap<>();
        Map<String, Integer> countMap = new HashMap<>();
        for (Grade grade : gradeList) {
            String stuId = grade.getStudentId();

            if (!countMap.containsKey(stuId)) {
                countMap.put(stuId, 1);
            } else {
                countMap.put(stuId, countMap.get(stuId) + 1);
            }

            if (!averageMap.containsKey(stuId)){
                averageMap.put(stuId, (double) grade.getTotalScore(courseList));
            }else{
                averageMap.put(stuId, averageMap.get(stuId)+grade.getTotalScore(courseList));
            }
        }

        for (String stuId : averageMap.keySet()) {
            int totalCount = countMap.getOrDefault(stuId, 0);
            double totalScore = averageMap.getOrDefault(stuId, 0.0);

            if(totalCount == 0){
                System.out.println(stuId+" "+ "did not take any exams");
            }else{
                String name = findStudentNameById(gradeList, stuId); // 根据学号查询姓名
                double averageScore = totalScore / totalCount;

                System.out.println(stuId + " " + name + " " + (int)Math.round(averageScore));
            }
        }

        Map<String, List<Integer>> courseAverageMap = new TreeMap<>();

        for (Grade grade : gradeList) {
            String courseName = grade.getCourseName();

            List<Integer> scores;

            if (!courseAverageMap.containsKey(courseName)){
                scores = new ArrayList<>();
            }else {
                scores = courseAverageMap.get(courseName);
            }

            scores.add(grade.getTotalScore(courseList));

            courseAverageMap.put(courseName, scores);
        }


        for (String courseName : courseAverageMap.keySet()) {
            List<Integer> scores = courseAverageMap.get(courseName);

            if(scores.isEmpty()){
                System.out.println(courseName + " has no grades yet");
                continue;
            }

            double usualAverage = ScoreCalculator.calculateAverage(scores.subList(0,scores.size() -1));
            double finalAverage = ScoreCalculator.calculateAverage(scores);
            int totalAverage = (int)ScoreCalculator.calculateAverage(scores);

            System.out.println(courseName+ " "+ Math.round(usualAverage)+ " "+ Math.round(finalAverage)+ " "+totalAverage);


        }
        List<String> classNumberList = new ArrayList<>();

        for (Grade grade : gradeList) {
            String stuId = grade.getStudentId();
            if (!classNumberList.contains(stuId.substring(0,6))){
                classNumberList.add(stuId.substring(0,6));

            }
        }


        Map<String, List<Integer>> classAvgMap = new TreeMap<>();

        for(String classNum: classNumberList){
            List <Integer> scoresPerClass = new ArrayList<>();

            for (Grade grade : gradeList) {

                if(grade.getStudentId().substring(0,6).equals(classNum)){
                    scoresPerClass.add(grade.getTotalScore(courseList));
                }
            }
            if(!scoresPerClass.isEmpty()){
                classAvgMap.put(classNum, scoresPerClass);
            }
        }

        for (String classNum : classAvgMap.keySet()) {

            List<Integer> scoresPerClass = classAvgMap.get(classNum);

            double avgAllScoresOfTheClass=0;
            for (Integer perClass : scoresPerClass) {
                avgAllScoresOfTheClass += perClass;

            }


            if(avgAllScoresOfTheClass== 0 ){
                System.out.println(classNum+" has no grades yet");
            }else{
                System.out.println(classNum+ " "+ (int)(avgAllScoresOfTheClass/scoresPerClass.size()));
            }
        }
    }

    private static String findStudentNameById(List<Grade> gradeList, String studentId) {
        for(Grade grade:gradeList){
            if(grade.getStudentId().equals(studentId)){
                return grade.getName();
            }
        }
        return "";
    }
Course类:用于存储课程信息,包括课程名称、课程性质和考核方式。Grade类:用于存储学生成绩信息,包括学号、姓名、课程名称、平时成绩和期末成绩。Student类:用于存储学生信息,包括学号和姓名。
ScoreCalculator类:用于计算总成绩和平均分。该类应包含一个静态方法来计算总成绩,以及一个实例方法来计算平均分。Classroom类:用于存储班级信息,包括班级编号。

采坑心得:

7-2 长度质量计量单位换算 分数 5 作者 蔡轲 单位 南昌航空大学

长度、质量的计量有多重不同的计算体系,有标准的国际单位制:千克与米,也有各个国家自己的计量方法如:磅、英寸;

1磅等于0.45359237千克,1英寸等于0.0254米,请编写程序实现国际单位制与英制之间的换算。

输入格式:

两个浮点数,以空格分隔,第一个是质量(以千克为单位)、第二个是长度(以米为单位)。例如:0.45359237 0.0254。

输出格式:

两个浮点数,以空格分隔,第一个是质量(以磅为单位)、第二个是长度(以英寸为单位)。例如:1.0 1.0。

错误点列举:

 本次提交代码:

import java.util.Scanner;

public class Main
{
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        double M = in.nextDouble();//质量
        double L = in.nextDouble();//长度
        double A;//以磅为单位的质量
        double B;//以英寸为单位的长度
        A = M/0.45359237;
        B = L/0.0254;
        System.out.print(A+" "+B );
    }
}

可以注意输出格式要求是两个浮点数,以空格分隔,第一个是质量(以磅为单位)、第二个是长度(以英寸为单位)。例如:1.0 1.0。

作出修改:

import java.util.Scanner;

public class Main
{
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        double M = in.nextDouble();//质量
        double L = in.nextDouble();//长度
        double A;//以磅为单位的质量
        double B;//以英寸为单位的长度
        A = M/0.45359237;
        B = L/0.0254;
        System.out.print((float)A+" "+(float)B );
    }
}

 又如:

7-7 判断三角形类型 分数 20 作者 段喜龙 单位 南昌航空大学

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

输入格式:

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

输出格式:

(1)如果输入数据非法,则输出“Wrong Format”;
(2)如果输入数据合法,但三条边不能构成三角形,则输出“Not a triangle”;
(3)如果输入数据合法且能够成等边三角形,则输出“Equilateral triangle”;
(3)如果输入数据合法且能够成等腰直角三角形,则输出“Isosceles right-angled triangle”;
(5)如果输入数据合法且能够成等腰三角形,则输出“Isosceles triangle”;
(6)如果输入数据合法且能够成直角三角形,则输出“Right-angled triangle”;
(7)如果输入数据合法且能够成一般三角形,则输出“General triangle”。

 

 多次测试都会出现以上情况。

import java.util.Scanner;

public class Main
{
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);
        double a = in.nextDouble();//边
        double b = in.nextDouble();//边
        double c = in.nextDouble();//边
        boolean x =false;
        if(a<1||a>200||b<1||b>200||c<1||c>200){
            x = true;
            
        }
        
        if(x){
            System.out.println("Wrong Format");
        } else if (a+b<=c||a+c<=b||b+c<=a) {
            System.out.println("Not a triangle");
        } else if (a==b||a==c||b==c)
        {
            if(a==b&&b==c)
            {
                System.out.println("Equilateral triangle");
            }
            else if((a*a+b*b<c*c&&a*a+b*b>c*c)||(a*a+c*c<b*b&&a*a+c*c>b*b)||(c*c+b*b<a*a&&c*c+b*b>a*a))
            {
                System.out.println("Isosceles right-angled triangle");
            }
            else
            {
                System.out.println("Isosceles triangle");
            }
        }
            else if((a*a+b*b==c*c)||(c*c+b*b==a*a)||(a*a+c*c==b*b))
            {
                System.out.println("Right-angled triangle");
            }else
            {
                System.out.println("General triangle");
            }

    }


}

可以看出等腰直角三角形的判断代码并没有考虑边存在小数的情况。

做出调整:

else if((a*a+b*b<c*c+0.001&&a*a+b*b>c*c-0.001)||(a*a+c*c<b*b+0.001&&a*a+c*c>b*b-0.001)||(c*c+b*b<a*a+0.001&&c*c+b*b>a*a-0.001))
            {
                System.out.println("Isosceles right-angled triangle");
            }       

 主要困难及改进建议:

对题目的理解不够深刻,时常出现错误出现时需要耗费大量时间修改,到最后才回归题干的情况。对类的操作不太熟悉导致做相关题目时候畏手畏脚,耗费大量的时间。不认识一些库函数导致做题目时耗费大量时间编写,是极其不效率的。改进建议:多了解可以直接供调用的库函数,节省编写代码的时间,提高效率。

总结:

通过此次的题目集的学习做出以下总结:对类的封装正则表达式等新概念以及新知识的掌握还是不够熟练,希望在接下来的学习中能更好的理解并且熟练地运用,希望加下来的学习更加的系统全面,以应对以后的各种难点。

                                                                                                                   

 

标签:总结,输出,题目,String,int,菜品,java,输入
From: https://www.cnblogs.com/ZhiHaoZhou/p/17745989.html

相关文章

  • 南昌航空大学题目集1~3总结
    (1)前言:第一次题目集主要让我们熟悉了Java的语法,格式,以及简单的应用方式,难度比较简单,但是相对的题量比较大,在对于当时初学Java的我们来说还是要认真对待的。第二次题目集在第一次题目集的难度上提升较大,但是还是在自学有关知识后还是可以处理的,学习了浮点数保......
  • 题目集1-3总结
    一、前言在过去的几周里,我投入了大量的时间和精力来研究和发展针对题目集1到3的解决方案。从第一次的题目集简单的逻辑以及输入、计算、输出到面向对象类的设计、类和数组的应用,学习了hashmap/hashset,封装性等等。  整体来看,这一阶段的题目涵盖了广泛的主题,包括数据结构、......
  • 2023-2024-1 20231306《计算机基础与程序设计》第二周学习总结
    这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第二周作业这个作业的目标数字化、信息安全、自学教材计算机科学概论第1章和《C语言程序设计》第1章并完成云班课测试作业正文https://i.cnblogs.co......
  • 2023-2024-1 学号20231329 《计算机基础与程序设计》第2周学习总结
    这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP这个作业的要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK02这个作业的目标计算机科学概论第1章并完成云班课测试《C语言程序设计》第1章并完成云班课测试作业正......
  • 2023-2024-1 20231320 《计算机基础与程序设计》第二周学习总结
    2023-2024-120231320《计算机基础与程序设计》第二周学习总结作业信息这个作业属于哪个课程<班级的链接>(2023-2024-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(2022-2023-1计算机基础与程序设计第一周作业)这个作业的目标<自学《计算机基础与......
  • ControlNet-trt优化总结2:使用TRT-API从零构建ControlNet网络
    ControlNet-trt优化总结2:使用TRT-API从零构建ControlNet网络在上节讲到,可以通过手动搭建trt网络的方式来重新构造controlnet网络,这样可以避免onnx中间转换过程中的精度损失,也可避免onnx中间转化时的算子被拆解的细碎的情况,对于不支持的算子,也可通过添加插件的方式添加不支持的算......
  • 面对对象程序设计PTA题目集1~3的总结
    7-1身体质量指数(BMI)测算体重是反映和衡量一个人健康状况的重要标志之一,过胖和过瘦都不利于健康,BMI(身体质量指数)计算方法:体重(以千克为单位)除以身高(以米为单位)的平方。中国成人正常的BMI应在18.5-24之间,如果小于18.5为体重不足,如果大于等于24为超重,大于等于28为肥胖。请编写程序,测......
  • java基础知识总结,javaweb参考资料大全
    Java基础知识总结写代码:1,明确需求。我要做什么?2,分析思路。我要怎么做?1,2,3。3,确定步骤。每一个思路部分用到哪些语句,方法,和对象。4,代码实现。用具体的java语言代码把思路体现出来。 学习新技术的四点:1,该技术是什么?2,该技术有什么特点(使用注意):3,该技术怎么使用。demo4,该技术什么时......
  • 大三每日总结
    软考相关笔记  ......
  • 23种设计模式的图示总结概述(创建型模式和结构型模式)
    1、创建型模式1、简单工厂模式根据不同的需求(条件),创建出来不同的对象;2、工厂方法模式简单地说,就是不同的工厂分别制作不同的产品,这样能够避免上面的工厂出问题,全体待工的情况;3、抽象工厂模式出现新的概念——产品等级结构、产品族;不同的产品有不同的抽象产品,不同的工厂......