前三次pta作业总结

发布时间 2023-10-07 22:45:43作者: Blue_zzz

一、 前言

  关于java,是这个学期才开始接触,以前虽然经常听说面向对象,可是从来没有了解过,也没用过,所有现在刚开始接触还有点不习惯,因为之前只学过C,经常习惯性就面向过程编程去了,总是会忘记可以分成多个类。但总的来说对这门课还是很有兴趣的。接下来就正式谈谈这前三次作业。

第一次作业:

  第一次作业一共九道题,虽然题目多但是都挺简单的,就是一些比较基础的语法和库函数的使用什么的,每题的代码基本也都是十几二十多行,稍微多一点点的也就是最后一题判断三角形的,因为三角形种类多所以判断多。在第一次作业中学到的特别需要注意的是,在java中浮点型数判断有时用==判断不出来,需要用两个数相减小于一定的数值而认定二者近似相等,比如用 a-b的绝对值小于0.000001来近似a和b相等,好像是java内部什么语法的问题还是什么,具体的原因我也记不清了。

第二次作业:

  第二次作业题量跟第一次差不多,一共八道题,但是难度就比第一次大了,平均分估计只有80左右。比较重要的是学会了对象封装性,如何重载。还有java库中有关时间类的函数的使用,比如LocalDate,ChronoUnit等等。难度最大是菜单计价系列的题目,这题的通过率也是偏低的,详细的会在下面介绍。

第三次作业:

  第三次作业题量一下就减半了,一共四道题,但是难度也一下就加倍了。主要也是学了一些时间类函数的使用,了解了LocalDate类中of()、isAfter()、isBefore()、until()等方法的使用规则,了解了ChronoUnit类中DAYS、WEEKS、MONTHS等单位的用法。最难的是课程成绩统计的题目,光这一题就占了65分,估计总分平均分也就50左右,这题的通过率也是只有百分之三点多,到作业截止我也没过所有的测试点。详细的还是下面介绍。

  本次总结主要选用第一次作业的第七题,第二次作业的第七题、第八题以及第三次作业的第二题进行总结分析。

 

二、 设计与分析

 第一次作业:7-7   判断三角形类型

 1、题目

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

  输入格式:

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

  输出格式:

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

 2、源码

 1 import java.util.Scanner;
 2 
 3 public class Main {
 4     public static void main(String[] args){
 5         Scanner input = new Scanner(System.in);
 6         float s1 = input.nextFloat();
 7         float s2 = input.nextFloat();
 8         float s3 = input.nextFloat();
 9         if (s1 >= 1 && s1 <= 200 && s2 >= 1 && s2 <= 200 && s3 >=1 && s3<= 200) {
10             if (s1 + s2 > s3 && s1 + s3 > s2 && s2 +s3 > s1) {
11                 if (Math.abs(s1 - s2) < 0.00001 || Math.abs(s1 - s3) < 0.00001 || Math.abs(s2 - s3) < 0.00001) {
12                     if (Math.abs(s1 - s2) < 0.00001 && Math.abs(s2 - s3) < 0.00001) {
13                         System.out.println("Equilateral triangle");
14                         return;
15                     }
16                     if (Math.abs(s1*s1 + s2*s2 - s3*s3) < 0.00001 || Math.abs(s1*s1 + s3*s3 - s2*s2) < 0.00001 || Math.abs(s2*s2 + s3*s3 - s1*s1) < 0.00001) {
17                         System.out.println("Isosceles right-angled triangle");
18                         return;
19                     }
20                     System.out.println("Isosceles triangle");
21                     return;
22                 }
23                 else if (Math.abs(s1*s1 + s2*s2 - s3*s3) < 0.00001 || Math.abs(s1*s1 + s3*s3 - s2*s2) < 0.00001 || Math.abs(s2*s2 + s3*s3 - s1*s1) < 0.00001) {
24                     System.out.println("Right-angled triangle");
25                     return;
26                 }
27                 System.out.println("General triangle");
28                 return;
29             }
30             System.out.println("Not a triangle");
31             return;
32         }
33         System.out.println("Wrong Format");
34     }
35 }

 3、踩坑心得

  一开始有关等腰的测试点就是过不去,后来经过调试分析发现在java中浮点型数判断有时用==判断不出来,需要用两个数相减小于一定的数值而认定二者近似相等,比如用 a-b的绝对值小于0.0001来近似a和b相等,把比较两条边相等有关的判断全部用这种方式换一下就过了。

 

第二次作业:7-7  菜单计价程序-1

 1、题目

  某饭店提供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、源码

  面向过程源码(可以满分过):

 1 import java.util.Scanner;
 2 
 3 public class Main {
 4     public static void main(String[] args){
 5         Scanner input = new Scanner(System.in);
 6         String[] menu =new String[4];
 7         menu[0] = "西红柿炒蛋";
 8         menu[1] = "清炒土豆丝";
 9         menu[2] = "麻婆豆腐";
10         menu[3] = "油淋生菜";
11         String name;
12         int[] price = new int[4];
13         price[0] = 15;
14         price[1] = price[2] = 12;
15         price[3] = 9;
16         int flag = -1;
17         int totalPrice = 0;
18         while (true) {
19             name = input.next();
20             if(name.equals("end"))
21                 break;
22             if(name.equals(menu[0]))
23                 flag = 0;
24             else if(name.equals(menu[1]))
25                 flag = 1;
26             else if(name.equals(menu[2]))
27                 flag = 2;
28             else if(name.equals(menu[3]))
29                 flag = 3;
30             else
31                 flag = 4;
32             int portion = input.nextInt();
33             double[] multiple = new double[3];
34             multiple[0] = 1;
35             multiple[1] = 1.5;
36             multiple[2] = 2;
37             if (flag >= 0 && flag < 4)
38                 totalPrice += Math.round(multiple[portion-1] * price[flag]);
39             if (flag == 4)
40                 System.out.println(name+" does not exist");  
41         }
42         System.out.println(totalPrice);
43     }
44 }

  面向对象源码(部分测试点过不去):

 1 import java.util.Scanner;
 2 import java.util.Vector;
 3 
 4 public class Main {
 5     public static void main(String[] args) {
 6         Scanner input = new Scanner(System.in);
 7         //将所有菜名和对应单价存入菜谱中
 8         Menu menu = new Menu();
 9         menu.dishs = new Dish[5];
10         menu.dishs[0] = new Dish("西红柿炒蛋",15);
11         menu.dishs[1] = new Dish("清炒土豆丝",12);
12         menu.dishs[2] = new Dish("麻婆豆腐",12);
13         menu.dishs[3] = new Dish("油淋生菜",9);
14         menu.dishs[4] = new Dish("error",0);
15         Vector<String> notExist = new Vector<>();   //动态数组存不存在的菜名
16         Order order = new Order(); 
17         int num = 0;   //num用于记录存入了多少条订单
18         while (input.hasNextLine()) {
19             String line1 = input.nextLine();
20             if (line1.equals("end"))
21                 break;
22             String[] line2 = line1.split(" ");
23             String dishName = line2[0];
24             int portion = Integer.parseInt(line2[1]);
25             Dish dish = menu.searthDish(dishName);
26             if (dish.name.equals("error"))
27                 notExist.add(dishName);
28             else {
29                 order.addARecord(dish, portion);
30             }
31         }
32         for (int i=0;i<notExist.size();i++)
33             System.out.println(notExist.get(i) + " does not exist");
34         System.out.println(order.getTotalPrice());
35     }
36 }
37 
38 //菜品类:对应菜谱上一道菜的信息。
39 class Dish {  
40     String name; //菜品名称
41     int unit_price; //单价
42     Dish(String name, int unit_price) {
43         this.name = name;
44         this.unit_price = unit_price;
45     }
46     public int getPrice(int portion) { //计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份)
47         if (portion == 1)
48             return unit_price;
49         else if (portion == 2)
50             return (int)(unit_price * 1.5);
51         else
52             return unit_price * 2;
53     }
54 }
55 
56 //菜谱类:对应菜谱,包含饭店提供的所有菜的信息。
57 class Menu {
58     Dish[] dishs; //菜品数组,保存所有菜品信息
59     public Dish searthDish(String dishName) { //根据菜名在菜谱中查找菜品信息,返回Dish对象。
60         for (int i=0;i<4;i++)
61             if (dishs[i].name.equals(dishName))
62                 return dishs[i];
63         return dishs[4];
64     }
65 }
66 
67 //点菜记录类:保存订单上的一道菜品记录
68 class Record {
69     Dish d; //菜品
70     int portion; //份额(1/2/3代表小/中/大份)
71     Record (Dish d,int portion) {
72         this.d = d;
73         this.portion = portion;
74     }
75     public int getPrice() { //计价,计算本条记录的价格
76         return d.getPrice(portion);
77     }
78 }
79 
80 //订单类:保存用户点的所有菜的信息。
81 class Order {
82     Vector<Record> records = new Vector<>();   //动态数组保存订单上每一道的记录    
83     public int getTotalPrice() { //计算订单的总价
84         int sum = 0;
85         for (int i=0;i<records.size();i++)
86             sum += records.get(i).getPrice();
87         return sum;
88     }
89     public Record addARecord(Dish dish ,int portion) { //添加一条菜品信息到订单中    
90         Record record = new Record(dish,portion);
91         records.add(record);
92         return record;
93     }
94 }

 3、踩坑心得

  由于用面向对象的方法写一直有如下图中的测试点过不去,但是一直找不到原因,然后发现直接写面向过程的代码可以满分过,所以最后交了个面向过程的代码,但是面向过程的代码我还是贴出来,希望如果有大佬看见可以指点一下原因。

        

 

第二次作业:7-8  jmu-java-日期类的基本使用

 1、题目

  1. 给定一个日期,判定是否为合法日期。如果合法,判断该年是否闰年,该日期是当年第几天、当月第几天、当周第几天。
  2. 给定起始日期与结束日期,判定日期是否合法且结束日期是否早于起始日期。如果均合法,输出结束日期与起始日期之间的相差的天数、月数、年数。

  输入格式:

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

  输出格式:

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

 2、源码:

  1 import java.util.Scanner;
  2 import java.time.LocalDate;
  3 import java.time.DayOfWeek;
  4 import java.time.format.DateTimeFormatter;
  5 import java.time.format.DateTimeParseException;
  6 import java.time.temporal.ChronoUnit;
  7 
  8 class Date {
  9     public boolean judge_legal(String str) {
 10         if (!str.matches("^[0-9]{4}-[0-9]{2}-[0-9]{2}$"))
 11             return false;
 12         return true;
 13     }
 14 
 15     public boolean judgeEffecyive(String data, int year, int month, int day) {
 16         if (month > 12 || month < 1)
 17             return false;
 18         if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
 19             if (day < 1 || day > 31)
 20                 return false;
 21         }
 22         if (month == 4 || month == 6 || month == 9 || month == 11) {
 23             if (day < 1 || day > 30)
 24                 return false;
 25         }
 26         if (month == 2) {
 27             if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
 28                 if (day < 1 || day > 29)
 29                     return false;
 30             } else {
 31                 if (day < 1 || day > 28)
 32                     return false;
 33             }
 34         }
 35         if (year == 0 || month == 0 || day == 0)
 36             return false;
 37         return true;
 38     }
 39 
 40     public boolean judeg_Leapyear(LocalDate date) {
 41         return date.isLeapYear();
 42     }
 43 
 44     public int judge_Dayofyear(LocalDate date) {
 45         return date.getDayOfYear();
 46     }
 47 
 48     public int judge_Dayofmonth(LocalDate date) {
 49         return date.getDayOfMonth();
 50     }
 51 
 52     public int judge_Dayofweek(LocalDate date) {
 53         DayOfWeek dayOfWeek = date.getDayOfWeek();
 54         return dayOfWeek.getValue();
 55     }
 56 }
 57 
 58 public class Main {
 59     public static void main(String[] args) {
 60         Scanner input = new Scanner(System.in);
 61         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); // 定义日期时间格式
 62         Date date = new Date();
 63         // 输入第一个日期
 64         String strs1 = input.next();
 65         // 输入第二个日期
 66         String strs2 = input.next();
 67         // 输入第三个日期
 68         String strs3 = input.next();
 69         if (!date.judge_legal(strs1))
 70             System.out.println(strs1 + "无效!");
 71         else {
 72             int year1 = Integer.parseInt(strs1.substring(0, 4)); // 获取日期中的年份
 73             int month1 = Integer.parseInt(strs1.substring(5, 7)); // 获取日期中的月份
 74             int day1 = Integer.parseInt(strs1.substring(8, 10)); // 获取日期中的日
 75             if (!date.judgeEffecyive(strs1, year1, month1, day1))
 76                 System.out.println(strs1 + "无效!");
 77             else {
 78                 LocalDate date1 = LocalDate.parse(strs1, formatter); // 将输入日期的字符串形式转换为刚刚定义的日期时间格式
 79                 if (date.judeg_Leapyear(date1))
 80                     System.out.println(strs1 + "是闰年.");
 81                 System.out.println(strs1 + "是当年第" + date.judge_Dayofyear(date1) + "天,当月第" + date.judge_Dayofmonth(date1) + "天,当周第" + date.judge_Dayofweek(date1) + "天.");
 82             }
 83         }
 84         if (!date.judge_legal(strs2) || !date.judge_legal(strs3))
 85             System.out.println(strs2 + "或" + strs3 + "中有不合法的日期.");
 86         else {
 87             int year2 = Integer.parseInt(strs2.substring(0, 4)); // 获取日期中的年份
 88             int month2 = Integer.parseInt(strs2.substring(5, 7)); // 获取日期中的月份
 89             int day2 = Integer.parseInt(strs2.substring(8, 10)); // 获取日期中的日
 90             int year3 = Integer.parseInt(strs3.substring(0, 4)); // 获取日期中的年份
 91             int month3 = Integer.parseInt(strs3.substring(5, 7)); // 获取日期中的月份
 92             int day3 = Integer.parseInt(strs3.substring(8, 10)); // 获取日期中的日
 93             LocalDate date2 = LocalDate.parse(strs2, formatter);
 94             LocalDate date3 = LocalDate.parse(strs3, formatter);
 95             if (!date.judgeEffecyive(strs2, year2, month2, day2) || !date.judgeEffecyive(strs3, year3, month3, day3))
 96                 System.out.println(strs2 + "或" + strs3 + "中有不合法的日期.");
 97             else if (date2.isAfter(date3))
 98                 System.out.println(strs3 + "早于" + strs2 + ",不合法!");
 99             else {
100                 // 计算两个日期之间的天数差
101                 long daysBetween = ChronoUnit.DAYS.between(date2, date3);
102                 long yearsBetween = year3 - year2;
103                 long monthsBetween = month3 - month2;
104                 System.out.println(strs3 + "与" + strs2 + "之间相差" + daysBetween + "天,所在月份相差" + monthsBetween + ",所在年份相差"
105                         + yearsBetween + ".");
106             }
107         }
108     }
109 }

 3、踩坑心得

  一开始不知道有现成的相关的日期类函数可以直接用,所以判断是否为闰年、算某个日期是当年的第几天或者两个日期之间相差的天数什么的都是直接算的,后来经过了解之后,发现这些直接引用LocalDate和ChronoUnit有关函数就可以得出,方便很多。还有正则表达式的使用,学会以后可以方便很多的判断。

 

 第三次作业:7-2  课程成绩统计程序-1

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

 2、源码

  1 import java.text.Collator;
  2 import java.util.*;
  3 
  4 public class Main {
  5     public static void main(String[] args) {
  6         Scanner input = new Scanner(System.in);
  7         String input_record = input.nextLine();
  8         AnalysisInput analy=new AnalysisInput();
  9         while (!input_record.equals("end")) {
 10             analy.anaInput(input_record);//解析用户输入的每一行数据
 11             input_record = input.nextLine();
 12         }
 13         analy.ToSort();
 14         analy.studentScore();
 15         analy.CourseScore();
 16         analy.ClassScore();
 17     }
 18 }
 19 
 20 class AnalysisInput{
 21     private ArrayList<SelectCourse> selectCourses = new ArrayList<>();
 22     private ArrayList<Course> courses = new ArrayList<>();
 23     private ArrayList<Student> students = new ArrayList<>();
 24     private ArrayList<String> Class = new ArrayList<>();
 25     public void anaInput(String input){
 26         String []inputs=input.split(" ");
 27         if(JudgeLegal.legalInput(input)==1){//course输入
 28             //课程名称+英文空格+课程性质+英文空格+考核方式
 29             if(testCourse(inputs[0])!=null)return;
 30             else {
 31                 if(inputs[1].equals("必修") && (!inputs[2].equals("考试"))){
 32                     System.out.println(inputs[0]+" : course type & access mode mismatch");
 33                 }
 34                 else courses.add(new Course(inputs[0],inputs[1],inputs[2]));
 35             }
 36         }
 37         else if(JudgeLegal.legalInput(input)==2){//课程输入
 38             //学号+英文空格+姓名+英文空格+课程名称+英文空格+平时成绩+英文空格+期末成绩
 39             Student newStudent = new Student(inputs[0],inputs[1]);//设置学生
 40             if(!testStudent(newStudent.getNum()))students.add(newStudent);
 41             if(!testClass(inputs[0].substring(0,6))){
 42                 Class.add(inputs[0].substring(0,6));
 43             }
 44             if(testSelect(inputs[0],inputs[2]))return;
 45             Course findCourse = testCourse(inputs[2]);
 46             if(findCourse == null){
 47                 System.out.println(inputs[2]+" does not exist");
 48                 return;
 49             }
 50             else if(findCourse.getCheck_way().equals("考试")&&inputs.length!=5){
 51                 System.out.println(inputs[0]+' '+inputs[1]+" : access mode mismatch");
 52             }
 53             else if(findCourse.getCheck_way().equals("考察")&&inputs.length!=4){
 54                 System.out.println(inputs[0]+' '+inputs[1]+" : access mode mismatch");
 55             }
 56             else{
 57                 SelectCourse newSelectCourse=new SelectCourse();
 58                 newSelectCourse.setCourse(findCourse);//课程设置完成
 59                 Score score;//成绩设置
 60                 if(findCourse.getCheck_way().equals("考试")){
 61                     ExamScore examScore=new ExamScore();
 62                     examScore.setDailyScore(Integer.parseInt(inputs[3]));
 63                     examScore.setFinalScore(Integer.parseInt(inputs[4]));
 64                     score=examScore;
 65                 }
 66                 else {
 67                     NoExamScore noExamScore=new NoExamScore();
 68                     noExamScore.setFinalScore(Integer.parseInt(inputs[3]));
 69                     score=noExamScore;
 70                 }
 71                 newSelectCourse.setScore(score);//成绩设置完成
 72                 newSelectCourse.setStudent(newStudent);//学生设置完成
 73                 selectCourses.add(newSelectCourse);
 74             }
 75         }
 76         else System.out.println("wrong format");
 77     }
 78     private Course testCourse(String courseName) {
 79         for (Course course:courses) {
 80             if(course.getName().equals(courseName))return course;
 81         }
 82         return null;
 83     }
 84     private Boolean testStudent(String num) {
 85         for (Student student:students) {
 86             if(student.getNum().equals(num))return true;
 87         }
 88         return false;
 89     }
 90     private Boolean testClass(String classnum) {
 91         for (String cname:Class) {
 92             if(cname.equals(classnum))return true;
 93         }
 94         return false;
 95     }
 96 
 97     private Boolean testSelect(String ID,String cname){
 98         for (SelectCourse selectCourse:selectCourses){
 99             if(selectCourse.getStudent().getNum().equals(ID)&&selectCourse.getCourse().getName().equals(cname))return true;
100         }
101         return false;
102     }
103     public void studentScore(){
104         for (Student student:students){
105             double sum=0;
106             int count=0;
107             for (SelectCourse selectCourse:selectCourses){
108                 if (selectCourse.getStudent().getNum().equals(student.getNum()))
109                 {
110                     sum+=selectCourse.getScore().getTotalScore();
111                     count++;
112                 }
113             }
114             if(count==0) System.out.println(student.getNum()+' '+student.getName()+' '+"did not take any exams");
115             else System.out.println(student.getNum()+' '+student.getName()+' '+(int)(sum/count));
116         }
117     }
118     public void CourseScore(){
119         for (Course course:courses){
120             double sumDailyScore=0;
121             double sumFinalScore=0;
122             double sumTotalScore=0;
123             int count=0;
124             for(SelectCourse selectCourse:selectCourses){
125                 if(selectCourse.getCourse().getName().equals(course.getName())){
126                     count++;
127                     sumTotalScore+=selectCourse.getScore().getTotalScore();
128                     sumFinalScore+=selectCourse.getScore().getFinalScore();
129                     if(selectCourse.getCourse().getCheck_way().equals("考试")){
130                      sumDailyScore+=selectCourse.getScore().getDailyScore();
131                     }
132                 }
133             }
134             if (count==0) System.out.println(course.getName()+' '+"has no grades yet");
135             else if(course.getCheck_way().equals("考试"))System.out.println(course.getName()+' '+(int)(sumDailyScore/count)+' '+(int)(sumFinalScore/count)+' '+(int)(sumTotalScore/count));
136             else if(course.getCheck_way().equals("考察"))System.out.println(course.getName()+' '+(int)(sumFinalScore/count)+' '+(int)(sumTotalScore/count));
137         }
138     }
139     public void ClassScore(){
140         for (String classnum:Class){
141             double sum=0;
142             int count=0;
143             for (SelectCourse selectCourse:selectCourses){
144                 if(selectCourse.getStudent().getNum().substring(0,6).equals(classnum)){
145                     sum+=selectCourse.getScore().getTotalScore();
146                     count++;
147                 }
148             }
149             if(count==0) System.out.println(classnum+' '+"has no grades yet");
150             else System.out.println(classnum+' '+(int)(sum/count));
151         }
152     }
153     public void ToSort(){
154         Collections.sort(students, Comparator.comparing(Student::getNum));
155         courses.sort((x,y)->{
156             Collator instance = Collator.getInstance(Locale.CHINA);
157             return instance.compare(x.getName(), y.getName());
158         } );
159         Collections.sort(Class);
160     }
161 }
162 
163 abstract class Score{
164     double TotalScore;
165     public double getTotalScore() {
166         return TotalScore;
167     }
168     public void setTotalScore(int totalScore) {
169         TotalScore = totalScore;
170     }
171     public int getDailyScore() {
172         return 0;
173     }
174     public int getFinalScore() {
175         return 0;
176     }
177 }
178 
179 class ExamScore extends Score{
180     int DailyScore;
181     int FinalScore;
182     public double getTotalScore(){
183         return (0.3*this.getDailyScore()+0.7*this.getFinalScore());
184     }
185     public int getDailyScore() {
186         return DailyScore;
187     }
188     public void setDailyScore(int dailyScore) {
189         DailyScore = dailyScore;
190     }
191     public int getFinalScore() {
192         return FinalScore;
193     }
194     public void setFinalScore(int finalScore) {
195         FinalScore = finalScore;
196     }
197 }
198 class NoExamScore extends Score{
199     int FinalScore;
200     public double getTotalScore(){
201         return FinalScore;
202     }
203     public int getFinalScore() {
204         return FinalScore;
205     }
206     public void setFinalScore(int finalScore) {
207         FinalScore = finalScore;
208     }
209 }
210 
211 class Course{
212     String courseName;  //课程名称
213     String attribute;   //课程性质
214     String check_way;   //考核方式
215     public Course(String courseName, String attribute, String check_way) {
216         this.courseName = courseName;
217         this.attribute = attribute;
218         this.check_way = check_way;
219     }
220 
221     public String getName() {
222         return courseName;
223     }
224 
225     public void setName(String name) {
226         this.courseName = name;
227     }
228 
229     public String getAttribute() {
230         return attribute;
231     }
232 
233     public void setAttribute(String attribute) {
234         this.attribute = attribute;
235     }
236 
237     public String getCheck_way() {
238         return check_way;
239     }
240 
241     public void setCheck_way(String method) {
242         this.check_way = check_way;
243     }
244 }
245 
246 class Student{
247     String num;
248     String name;
249     public Student(String num, String name) {
250         this.num = num;
251         this.name = name;
252     }
253     public String getNum() {
254         return num;
255     }
256     public void setNum(String num) {
257         this.num = num;
258     }
259     public String getName() {
260         return name;
261     }
262     public void setName(String name) {
263         this.name = name;
264     }
265 }
266 
267 class SelectCourse{
268     Course course;
269     Student student;
270     Score score;
271     public Course getCourse() {
272         return course;
273     }
274     public void setCourse(Course course) {
275         this.course = course;
276     }
277     public Student getStudent() {
278         return student;
279     }
280     public void setStudent(Student student) {
281         this.student = student;
282     }
283     public Score getScore() {
284         return score;
285     }
286     public void setScore(Score score) {
287         this.score = score;
288     }
289 }
290 
291 class JudgeLegal {
292     static String ID_Legal = "[0-9]{8}";//学号为8个0-9的数字
293     static String stuName_Legal = "\\S{1,10}";//姓名为1到10个非空格(TAB)字符
294     static String score_Legal = "(\\d|[1-9]\\d|100)";  //成绩范围为0-100
295     static String courseName_Legal = "\\S{1,10}";//课程名称为1到10个非空格(TAB)字符
296     static String attribute = "(选修|必修)";   //课程性质
297     static String check_Way = "(考试|考察)";   //考核方式
298     //courseInput用于定义课程信息模式(正则表达式)
299     static String courseInput = courseName_Legal + " " + attribute + " " + check_Way;
300     //scoreInput用于定义成绩信息模式(正则表达式)
301     static String scoreInput = ID_Legal + " " + stuName_Legal + " " + courseName_Legal + " " +
302             score_Legal + "(\\s"+score_Legal+")?";
303     public static int legalInput(String str) {
304         if (legalCourse(str)) {
305             return 1;
306         }
307         if (legalScore(str)) {
308             return 2;
309         }
310         return 0;
311     }
312     private static boolean legalCourse(String str) {
313         return str.matches(courseInput);
314     }
315     private static boolean legalScore(String str) {
316         return str.matches(scoreInput);
317     }
318 }

 3、踩坑心得

  题目很长,内容很多很复杂,并且一环扣一环,每类之前关系都很紧密,所以一定要思维清晰,想清楚。不然很容易就乱了。

 

三、主要困难与总结

  主要困难:对java的api不够熟悉,导致很多可以直接调用的东西没用,自己花了大量时间去写过程。后期应仔细了解,更加去熟悉、更好的利用。还有就是自己写题目速度太慢,导致每次的难题几乎都是大概写完了就没时间优化了,还有部分测试点过不去也没时间改,应该提高自己的写题速度。

  总结:经过这三次的pta作业,我对Java有了很大进步,从以前的只会面向过程到现在可以顺利解析题目并面向对象编程,但是我的编程能力还是不太够,速度还是比较慢,思维不够敏捷,在后续的学习中,应该多去了解了解相关资料,并且多跟同学交流,看看别人是如何解题的。相信自己会进步很大。