一、 前言
关于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、题目
- 给定一个日期,判定是否为合法日期。如果合法,判断该年是否闰年,该日期是当年第几天、当月第几天、当周第几天。
- 给定起始日期与结束日期,判定日期是否合法且结束日期是否早于起始日期。如果均合法,输出结束日期与起始日期之间的相差的天数、月数、年数。
输入格式:
第一行输入一个日期字符串,格式为"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有了很大进步,从以前的只会面向过程到现在可以顺利解析题目并面向对象编程,但是我的编程能力还是不太够,速度还是比较慢,思维不够敏捷,在后续的学习中,应该多去了解了解相关资料,并且多跟同学交流,看看别人是如何解题的。相信自己会进步很大。