前三次题目总结

发布时间 2023-10-07 23:20:30作者: 小鱼等雨停

前三次题目总结

一、前言

1.知识点

第一次作业目比较基础,主要包含输入与输出,以及一些简单的计算题目和判断类别,关键点及难点在于输入数据的格式使用是String还是double或者是float,其中double和float最容易混淆,主要在于所需的精确度;还有printf以及println输出的区别,看题目具体要求,有时候两个都可以使用,有时候不能。

第二次作业题目主要知识点就是要创建类,可能有的不止一个类,我们要进行创建及分析,再有就是新引入HashSet表的使用,这大大缩减了代码编译运行的时间,还有数组的应用。

第三次作业题目知识点是字符串的基本操作,如索引、切片等,以及对输入数据进行处理,还有就是boolean函数的应用。

2.题量

第一次作业题目一共有9道题,虽然比较多,但是写法都差不多。

第二次作业题目一共有8道题,跟第一次差不多。、

第三次作业题目只有4道题,但是难度变高。

3.难度

第一次作业题目难度一般,适合刚学习Java的学生进行入门练习,规范使用代码语言,并寻找输入输出的区别等,题目大差不差,都是进行输入后运算然后输出结果,但是要注意题目要求的输出格式以及保留的小数位数。

第二次作业题目相较第一次题目难度有所提升,大多是数据的处理分析,这就要求使用数组或者其他方法进行解决,所以我们要去学习新的知识才能把题目做到满分,但是还是循序渐进的,可以接受。

第二次作业题目难度较大,其中一题竟然高至65分,要求也比较多,但是两个日期的题目之间是有关联的,有相通的代码可以使用,要想第三次作业拿高分还是比较难的,要求前两次作业完全掌握了并且学习了新的知识。

二、设计与分析

因为第一次作业都比较简单,就不进行分析。

题目集2 7-1

题目要求:

创建学生类,包含

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

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

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

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

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

输入格式:

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

学号+英文空格+姓名+英文空格+语文成绩+英文空格+数学成绩+英文空格+物理成绩
例如:
22201311 张琳 80 80 80

22201312 黄昊 66 82 81

22201313 李少辰 77 76 80

22201314 袁婷 62 79 90

22201315 朱哲一 74 98 94

输出格式:

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

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

例如:

22201311 张琳 240 80.00

22201312 黄昊 229 76.33

22201313 李少辰 233 77.67

22201314 袁婷 231 77.00

22201315 朱哲一 266 88.67

输入样例:

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

22201311 张琳 80 80 80

22201312 黄昊 66 82 81

22201313 李少辰 77 76 80

22201314 袁婷 62 79 90

22201315 朱哲一 74 98 94

输出样例:

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

22201311 张琳 240 80.00

22201312 黄昊 229 76.33

22201313 李少辰 233 77.67

22201314 袁婷 231 77.00

22201315 朱哲一 266 88.67

代码如下:

import java.util.Scanner;

class Student {

private String ID;

private String name;

private int chinese;

private int math;

private int physics;

public Student(String ID, String name, int chinese, int math, int physics) {

this.ID = ID;

this.name = name;

this.chinese = chinese;

this.math = math;

this.physics = physics;

}

public String getID() {

return ID;

}

public String getName() {

return name;

}

public int getChineseScore() {

return chinese;

}

public int getMathScore() {

return math;

}

public int getPhysicsScore() {

return physics;

}

public int getTotalScore() {

return chinese + math + physics;

}

public double getAverageScore() {

return Math.round((getTotalScore() / 3.0)*100)/100.0;

}

}

public class Main {

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);

Student[] students = new Student[5];

for (int i = 0; i < 5; i++) {

String input = scanner.nextLine();

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

if (info.length == 5) {

String ID = info[0];

String name = info[1];

int chineseScore = Integer.parseInt(info[2]);

int mathScore = Integer.parseInt(info[3]);

int physicsScore = Integer.parseInt(info[4]);

students[i] = new Student(ID, name, chineseScore, mathScore, physicsScore);

} else {

students[i] = null;

}

}

for (Student student : students) {

if (student != null) {

System.out.println(student.getID() + " " + student.getName() + " " + student.getTotalScore() + " " + String.format("%.2f", student.getAverageScore()));

}

}

}

}

对应类图:

111

复杂度分析:

题目分析:

本题思路较明确,首先要先分好类,利用数组储存学生数据,再对成绩类进行分析计算,然后重新储存,要注意的是最终计算结果的小数部分保留,所以成绩的输入只能用String而不能用int,因此复杂度不高。

题目集2 7-2

题目要求:

创建成绩类,包含:

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

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

创建学生类,包含:

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

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

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

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

注意:未用学生类对象封装数据的,本题计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.Scanner;

class Score {

private int score1;

private int score2;

public Score(int score1, int score2) {

this.score1 = score1;

this.score2 = score2;

}

public int getTotalScore() {

return (int) (score1 * 0.4 + score2 * 0.6);

}

}

class Student {

private String id;

private String name;

private Score chinese;

private Score math;

private Score physics;

public Student(String id, String name, Score chinese, Score math, Score physics) {

this.id = id;

this.name = name;

this.chinese = chinese;

this.math = math;

this.physics = physics;

}

public double getTotalScore() {

return chinese.getTotalScore() + math.getTotalScore() + physics.getTotalScore();

}

public double getAverageScore() {

return getTotalScore() / 3;

}

}

public class Main {

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);

// 输入第一个学生信息

String student1Id = scanner.next();

String student1Name = scanner.next();

Score student1ChineseScore = new Score(scanner.nextInt(), scanner.nextInt());

Score student1MathScore = new Score(scanner.nextInt(), scanner.nextInt());

Score student1PhysicsScore = new Score(scanner.nextInt(), scanner.nextInt());

Student student1 = new Student(student1Id, student1Name, student1ChineseScore, student1MathScore, student1PhysicsScore);

// 输入第二个学生信息

String student2Id = scanner.next();

String student2Name = scanner.next();

Score student2ChineseScore = new Score(scanner.nextInt(), scanner.nextInt());

Score student2MathScore = new Score(scanner.nextInt(), scanner.nextInt());

Score student2PhysicsScore = new Score(scanner.nextInt(), scanner.nextInt());

Student student2 = new Student(student2Id, student2Name, student2ChineseScore, student2MathScore, student2PhysicsScore);

// 输入第三个学生信息

String student3Id = scanner.next();

String student3Name = scanner.next();

Score student3ChineseScore = new Score(scanner.nextInt(), scanner.nextInt());

Score student3MathScore = new Score(scanner.nextInt(), scanner.nextInt());

Score student3PhysicsScore = new Score(scanner.nextInt(), scanner.nextInt());

Student student3 = new Student(student3Id, student3Name, student3ChineseScore, student3MathScore, student3PhysicsScore);

// 计算并输出总分和平均分

double student1TotalScore = student1.getTotalScore();

double student1AverageScore = student1.getAverageScore();

double student2TotalScore = student2.getTotalScore();

double student2AverageScore = student2.getAverageScore();

double student3TotalScore = student3.getTotalScore();

double student3AverageScore = student3.getAverageScore();

System.out.printf("%.2f %.2f\n", student1TotalScore, student1AverageScore);

System.out.printf("%.2f %.2f\n", student2TotalScore, student2AverageScore);

System.out.printf("%.2f %.2f\n", student3TotalScore, student3AverageScore);

}

}

类图如下:

复杂度分析:

题目分析:

根据题目要求,需要创建两个类:Score成绩类和Student学生类。首先创建Score类,包含平时成绩和期末成绩两个属性,以及计算总成绩的方法getTotal;然后,创建Student类,包含学号、姓名和三门课程成绩(语文、数学和物理)三个属性。此外,该类还应包含计算总分和平均分的方法getTotalScore和getAverageScore;接下来,按输入格式依次读入3个学生的成绩信息,创建对应的Student对象,并调用相关方法计算总分和平均分;最后,按输出格式逐个输出3个学生的学号、姓名、总分和平均分。

题目集2 7-7

题目要求:

某饭店提供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) {

Menu menu = new Menu(new Dish[]{

new Dish("西红柿炒蛋", 15),

new Dish("清炒土豆丝", 12),

new Dish("麻婆豆腐", 12),

new Dish("油淋生菜", 9)

});

Order order = new Order();

String[] notFounds = new String[4];

int notFoundIndex = 0;

Scanner scanner = new Scanner(System.in);

while (scanner.hasNextLine()) {

String line = scanner.nextLine();

if ("end".equals(line)) {

break;

}

String[] lineArray = line.split(" ");

String dishName = lineArray[0];

int portion = Integer.parseInt(lineArray[1]);

Dish dish = menu.searchDish(dishName);

if (dish == null) {

notFounds[notFoundIndex++] = dishName;

} else {

order.addRecord(dish, portion);

}

}

for (int i = 0; i < notFoundIndex; i++) {

System.out.println(notFounds[i] + " does not exist");

}

System.out.println(order.getTotalPrice());

}

}

class Menu {

private Dish[] dishs;

Menu(Dish[] dishes) {

this.dishs = dishes;

}

Dish searchDish(String dishName) {

for (Dish dish : dishs) {

if (dish.getName().equals(dishName)) {

return dish;

}

}

return null;

}

}

class Dish {

String name;

int unit_price;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getUnit_Price() {

return unit_price;

}

public void setUnitPrice(int unit_price) {

this.unit_price = unit_price;

}

public Dish(String name, int unitPrice) {

this.name = name;

this.unit_price = unitPrice;

}

int getPrice(int portion) {

float[] b = {1, 1.5f, 2};

return Math.round((unit_price * b[portion - 1]));

}

}

class Record {

Dish dish;

int portion;

public Dish getDish() {

return dish;

}

public void setDish(Dish dish) {

this.dish = dish;

}

public int getPortion() {

return portion;

}

public void setPortion(int portion) {

this.portion = portion;

}

public Record(Dish dish, int portion) {

this.dish = dish;

this.portion = portion;

}

int getPrice() {

return dish.getPrice(portion);

}

}

class Order {

private Record[] records = new Record[100];

private int recordCount = 0;

int getTotalPrice() {

int money = 0;

for (int i = 0; i < recordCount; i++) {

money += records[i].getPrice();

}

return money;

}

Record addRecord(Dish dish, int portion) {

Record record = new Record(dish, portion);

records[recordCount++] = record;

return record;

}

}

对应类图:

复杂度分析:

题目分析:

该题需要创建四个类,首先,创建一个Dish类表示每道菜品,包含菜名和基础价格。该类还应提供一个方法getPrice根据份额计算菜品价格;接下来,创建一个Menu类表示菜谱,包含一个Dish数组保存所有菜品的信息,并提供一个方法searchDish用于根据菜名查找对应的菜品;然后,创建一个Record类表示订单上的一道菜品记录,包含一个Dish对象和份额。该类还应提供一个方法getPrice计算本条记录的价格。最后,创建一个Order类表示订单,包含一个Record数组保存订单上的每一道菜品记录。该类还应提供一个方法getTotalPrice计算订单的总价,并提供一个方法addRecord用于添加一条菜品记录到订单中。

题目集3 7-2

题目如下:

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

考试的总成绩由平时成绩、期末成绩分别乘以权重值得出,比如平时成绩权重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的7-8,当时因为小数保留不正确导致一直没有满分,直到把所有的double改成float,printf改成println才全部正确。还有年份题目的输入格式,有的要求格式要按照"YYYY-MM-dd"的显示输入,但有的题目就没有这个要求,按照"YYYY-M-d"的格式输入也可以,这时候就要在解析日期字符串LocalDate函数当中再次区别,以达到题目需要的结果。

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

我认为我遇到的主要困难是对于代码的理解与设计不清,有时候完成了代码也没有报错,可以输入数据,但是输出要不然就报错,要不然就是输出的结果不正确,但是我又不清楚该怎么去修改,导致题目答案一直是部分正确或者全部错误,我认为这跟我没有掌握java代码的编写有很大关系。

对于改进,我认为我应该再多多练习编写代码,多学习新的知识,不只是从课堂学习,更要从网上、书上去学习。对于老师的建议,我希望老师能够讲解一下pta中难度比较大的题目。

五、总结

通过这三次的pta作业,我对Java语言的严谨性有了更深刻的认识,Java不像C语言,它的语法会更加严谨。这三次作业难度循序渐进,第一次是基础题,让我们先接触一下Java的输入和输出,到第二次作业就要求创建更多的类,用数组来解决问题,到第三次作业,要求会更加高,对数据输入要求有规范,以及处理和输出,都有严格的要求。经过这三次的练习,让我看到自己代码方面的不足,日后要多加练习,不能松懈,争取下次能够更好的完成作业。