7、8、9、10、11次java作业总结
1.第一部分
(1)前言
这五次次作业的整体难度较上次而言有所降低,题目集1有一道题目,这题和第六次题目集菜单计价程序-4同属第四次作业菜单计价程序-3的两个不同迭代分支,有了前几次作业的经验,这次作业不再毫无头绪,难度也稍微降低。题目集2同样只有一道题目,这道题的整体难度并不高,和前几次的菜单计价程序题有许多相似之处,但对细节的要求十分严格,不能只盯着测试点看,需要不断试错,找出程序的漏洞。题目集3只有一道题目,这题主要考察了Map和String的使用,难度不算太大,对细节的要求比较高。题目集4共有四道题目,第一第二题考察了HashMap的检索和排序,难度不高,但需要对HaspMap的用法有一定的了解。第三题是题目集2的的一次迭代,主要添加了一些细节。难度不算太大,但要得到满分有些困难。第四题主要考察对多态的理解和运用,难度不高。题目集5共有5道题目,第一题考察ArrayList,第三四五题考察JAVA的基本语法,第二题是题目集4中第三题的迭代,在上次的基础上改变了类与类之间的关系,整体难度不大。
(2)设计与分析
第一次作业
本题在菜单计价程序-3的基础上增加了部分内容,增加的内容用加粗字体标识。
注意不是菜单计价程序-4,本题和菜单计价程序-4同属菜单计价程序-3的两个不同迭代分支。
设计点菜计价程序,根据输入的信息,计算并输出总价格。
输入内容按先后顺序包括两部分:菜单、订单,最后以"end"结束。
菜单由一条或多条菜品记录组成,每条记录一行
每条菜品记录包含:菜名、基础价格 三个信息。
订单分:桌号标识、点菜记录和删除信息、代点菜信息。每一类信息都可包含一条或多条记录,每条记录一行或多行。
桌号标识独占一行,包含两个信息:桌号、时间。
桌号以下的所有记录都是本桌的记录,直至下一个桌号标识。
点菜记录包含:序号、菜名、份额、份数。份额可选项包括:1、2、3,分别代表小、中、大份。
不同份额菜价的计算方法:小份菜的价格=菜品的基础价格。中份菜的价格=菜品的基础价格1.5。小份菜的价格=菜品的基础价格2。如果计算出现小数,按四舍五入的规则进行处理。
删除记录格式:序号 delete
标识删除对应序号的那条点菜记录。
如果序号不对,输出"delete error"
代点菜信息包含:桌号 序号 菜品名称 口味度 份额 份数
代点菜是当前桌为另外一桌点菜,信息中的桌号是另一桌的桌号,带点菜的价格计算在当前这一桌。
程序最后按输入的先后顺序依次输出每一桌的总价(注意:由于有代点菜的功能,总价不一定等于当前桌上的菜的价格之和)。
每桌的总价等于那一桌所有菜的价格之和乘以折扣。如存在小数,按四舍五入规则计算,保留整数。
折扣的计算方法(注:以下时间段均按闭区间计算):
周一至周五营业时间与折扣:晚上(17:00-20:30)8折,周一至周五中午(10:30--14:30)6折,其余时间不营业。
周末全价,营业时间:9:30-21:30
如果下单时间不在营业范围内,输出"table " + t.tableNum + " out of opening hours"
参考以下类的模板进行设计:菜品类:对应菜谱上一道菜的信息。
Dish {
String name;//菜品名称
int unit_price; //单价
int getPrice(int portion)//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份) }
菜谱类:对应菜谱,包含饭店提供的所有菜的信息。
Menu {
Dish[] dishs ;//菜品数组,保存所有菜品信息
Dish searthDish(String dishName)//根据菜名在菜谱中查找菜品信息,返回Dish对象。
Dish addDish(String dishName,int unit_price)//添加一道菜品信息
}
点菜记录类:保存订单上的一道菜品记录
Record {
int orderNum;//序号\\
Dish d;//菜品\\
int portion;//份额(1/2/3代表小/中/大份)\\
int getPrice()//计价,计算本条记录的价格\\
}
订单类:保存用户点的所有菜的信息。
Order {
Record[] records;//保存订单上每一道的记录
int getTotalPrice()//计算订单的总价
Record addARecord(int orderNum,String dishName,int portion,int num)//添加一条菜品信息到订单中。
delARecordByOrderNum(int orderNum)//根据序号删除一条记录
findRecordByNum(int orderNum)//根据序号查找一条记录
}
### 输入格式:
桌号标识格式:table + 序号 +英文空格+ 日期(格式:YYYY/MM/DD)+英文空格+ 时间(24小时制格式: HH/MM/SS)
菜品记录格式:
菜名+英文空格+基础价格
如果有多条相同的菜名的记录,菜品的基础价格以最后一条记录为准。
点菜记录格式:序号+英文空格+菜名+英文空格+份额+英文空格+份数注:份额可输入(1/2/3), 1代表小份,2代表中份,3代表大份。
删除记录格式:序号 +英文空格+delete
代点菜信息包含:桌号+英文空格+序号+英文空格+菜品名称+英文空格+份额+英文空格+分数
最后一条记录以“end”结束。
### 输出格式:
按输入顺序输出每一桌的订单记录处理信息,包括:
1、桌号,格式:table+英文空格+桌号+”:”
2、按顺序输出当前这一桌每条订单记录的处理信息,
每条点菜记录输出:序号+英文空格+菜名+英文空格+价格。其中的价格等于对应记录的菜品\*份数,序号是之前输入的订单记录的序号。如果订单中包含不能识别的菜名,则输出“\*\* does not exist”,\*\*是不能识别的菜名
如果删除记录的序号不存在,则输出“delete error”
最后按输入顺序一次输出每一桌所有菜品的总价(整数数值)格式:table+英文空格+桌号+“:”+英文空格+当前桌的总价
以上为菜单计价系列-3的题目要求,加粗的部分是有调整的内容。本次课题相比菜单计价系列-3新增要求如下:
1、菜单输入时增加特色菜,特色菜的输入格式:菜品名+英文空格+口味类型+英文空格+基础价格+"T"
例如:麻婆豆腐 川菜 9 T
菜价的计算方法:
周一至周五 7折, 周末全价。
特色菜的口味类型:川菜、晋菜、浙菜
川菜增加辣度值:辣度0-5级;对应辣度水平为:不辣、微辣、稍辣、辣、很辣、爆辣;
晋菜增加酸度值,酸度0-4级;对应酸度水平为:不酸、微酸、稍酸、酸、很酸;
浙菜增加甜度值,甜度0-3级;对应酸度水平为:不甜、微甜、稍甜、甜;
例如:麻婆豆腐 川菜 9 T
输入订单记录时如果是特色菜,添加口味度(辣/酸/甜度)值,格式为:序号+英文空格+菜名+英文空格+口味度值+英文空格+份额+英文空格+份数
例如:1 麻婆豆腐 4 1 9
单条信息在处理时,如果口味度超过正常范围,输出"spicy/acidity/sweetness num out of range : "+口味度值,spicy/acidity/sweetness(辣度/酸度/甜度)根据菜品类型择一输出,例如:
acidity num out of range : 5
输出一桌的信息时,按辣、酸、甜度的顺序依次输出本桌菜各种口味的口味度水平,如果没有某个类型的菜,对应的口味(辣/酸/甜)度不输出,只输出已点的菜的口味度。口味度水平由口味度平均值确定,口味度平均值只综合对应口味菜系的菜计算,不做所有菜的平均。比如,某桌菜点了3份川菜,辣度分别是1、3、5;还有4份晋菜,酸度分别是,1、1、2、2,辣度平均值为3、酸度平均值四舍五入为2,甜度没有,不输出。
一桌信息的输出格式:table+英文空格+桌号+:+英文空格+当前桌的原始总价+英文空格+当前桌的计算折扣后总价+英文空格+"川菜"+数量+辣度+英文空格+"晋菜"+数量+酸度+英文空格+"浙菜"+数量+甜度。
如果整桌菜没有特色菜,则只输出table的基本信息,格式如下:
table+英文空格+桌号+:+英文空格+当前桌的原始总价+英文空格+当前桌的计算折扣后总价+英文空格
例如:table 1: 60 36 川菜 2 爆辣 浙菜 1 微甜
计算口味度时要累计本桌各类菜系所有记录的口味度总和(每条记录的口味度乘以菜的份数),再除以对应菜系菜的总份数,最后四舍五入。
注:本题要考虑代点菜的情况,当前桌点的菜要加上被其他桌代点的菜综合计算口味度平均值。
2、考虑客户订多桌菜的情况,输入时桌号时,增加用户的信息:
格式:table+英文空格+桌号+英文空格+":"+英文空格+客户姓名+英文空格+手机号+日期(格式:YYYY/MM/DD)+英文空格+ 时间(24小时制格式: HH/MM/SS)
例如:table 1 : tom 13670008181 2023/5/1 21/30/00
约束条件:客户姓名不超过10个字符,手机号11位,前三位必须是180、181、189、133、135、136其中之一。
输出结果时,先按要求输出每一桌的信息,最后按字母顺序依次输出每位客户需要支付的金额。不考虑各桌时间段的问题,同一个客户的所有table金额都要累加。
输出用户支付金额格式:
用户姓名+英文空格+手机号+英文空格+支付金额
注意:不同的四舍五入顺序可能会造成误差,请按以下步骤累计一桌菜的菜价:
计算每条记录的菜价:将每份菜的单价按份额进行四舍五入运算后,乘以份数计算多份的价格,然后乘以折扣,再进行四舍五入,得到本条记录的最终支付价格。
将所有记录的菜价累加得到整桌菜的价格。
输入格式:
桌号标识格式:table + 序号 +英文空格+ 日期(格式:YYYY/MM/DD)+英文空格+ 时间(24小时制格式: HH/MM/SS)
菜品记录格式:
菜名+口味类型+英文空格+基础价格
如果有多条相同的菜名的记录,菜品的基础价格以最后一条记录为准。
点菜记录格式:序号+英文空格+菜名+英文空格+辣/酸/甜度值+英文空格+份额+英文空格+份数 注:份额可输入(1/2/3), 1代表小份,2代表中份,3代表大份。辣/酸/甜度取值范围见题目中说明。
删除记录格式:序号 +英文空格+delete
代点菜信息包含:桌号+英文空格+序号+英文空格+菜品名称**+英文空格+辣/酸/甜度值+**英文空格+份额+英文空格+分数
最后一条记录以“end”结束。
输出格式:
按输入顺序输出每一桌的订单记录处理信息,包括:
1、桌号,格式:table+英文空格+桌号+“:”+英文空格
2、按顺序输出当前这一桌每条订单记录的处理信息,
每条点菜记录输出:序号+英文空格+菜名+英文空格+价格。其中的价格等于对应记录的菜品\*份数,序号是之前输入的订单记录的序号。如果订单中包含不能识别的菜名,则输出“\*\* does not exist”,\*\*是不能识别的菜名
如果删除记录的序号不存在,则输出“delete error”
之后按输入顺序一次输出每一桌所有菜品的价格(整数数值),
格式:table+英文空格+桌号+“:”+英文空格+当前桌的计算折扣后总价+英文空格+辣度平均值+英文空格+酸度平均值+英文空格+甜度平均值+英文空格
最后按拼音顺序输出每位客户(不考虑客户同名或拼音相同的情况)的支付金额,格式: 用户姓名+英文空格+手机号+英文空格+支付总金额,按输入顺序排列。
输入样例1:
桌号时间超出营业范围。例如:
麻婆豆腐 川菜 12 T
油淋生菜 9
麻辣鸡丝 10
table 1 : tom 13605054400 2023/5/1 21/30/00
1 麻婆豆腐 3 1 2
2 油淋生菜 2 1
3 麻婆豆腐 2 3 2
end
输出样例1:
在这里给出相应的输出。例如:
table 1 out of opening hours
输入样例2:
一种口味的菜品。例如:
麻婆豆腐 川菜 12 T
油淋生菜 9
麻辣鸡丝 10
table 1 : tom 13605054400 2023/5/1 20/30/00
1 麻婆豆腐 2 1 2
2 油淋生菜 2 1
3 麻婆豆腐 2 3 2
end
输出样例2:
在这里给出相应的输出。例如:
table 1: 
1 麻婆豆腐 24
2 油淋生菜 14
3 麻婆豆腐 48
table 1: 86 62 川菜 4 稍辣
tom 13605054400 62
输入样例3:
辣度值超出范围。例如:
麻婆豆腐 川菜 12 T
油淋生菜 9
麻辣鸡丝 10
table 1 : tom 13605054400 2023/5/1 18/30/00
1 麻婆豆腐 6 1 2
2 油淋生菜 1 1
3 麻婆豆腐 5 3 2
end
输出样例3:
在这里给出相应的输出。例如:
table 1: 
spicy num out of range :6
2 油淋生菜 9
3 麻婆豆腐 48
table 1: 57 41 川菜 2 爆辣
tom 13605054400 41
输入样例4:
同一用户对应多桌菜。例如:
麻婆豆腐 川菜 12 T
油淋生菜 9
麻辣鸡丝 10
table 1 : tom 13605054400 2023/5/1 18/30/00
1 麻婆豆腐 1 1 2
2 油淋生菜 1 1
3 麻婆豆腐 2 2 2
table 2 : tom 13605054400 2023/5/6 18/30/00
1 麻婆豆腐 2 1 2
2 麻辣鸡丝 2 2
3 麻婆豆腐 2 1 1
end
输出样例4:
在这里给出相应的输出。例如:
table 1: 
1 麻婆豆腐 24
2 油淋生菜 9
3 麻婆豆腐 36
table 2: 
1 麻婆豆腐 24
2 麻辣鸡丝 30
3 麻婆豆腐 12
table 1: 69 49 川菜 4 稍辣
table 2: 66 66 川菜 3 稍辣
tom 13605054400 115
输入样例5:
多用户多桌菜。例如:
东坡肉 浙菜 25 T
油淋生菜 9
蜜汁灌藕 浙菜 10 T
刀削面 晋菜 10 T
醋浇羊肉 晋菜 30 T
麻婆豆腐 川菜 12 T
麻辣鸡丝 川菜 15 T
table 1 : tom 13605054400 2023/5/6 12/30/00
1 醋浇羊肉 4 1 1
3 刀削面 1 1 3
2 东坡肉 3 2 1
4 麻辣鸡丝 2 1 1
table 2 : jerry 18100334566 2023/5/1 12/30/00
1 醋浇羊肉 1 1 2
3 麻婆豆腐 2 2 1
4 麻辣鸡丝 2 3 3
table 3 : jerry 18100334566 2023/5/1 12/30/00
1 醋浇羊肉 2 1 1
3 蜜汁灌藕 1 1 2
2 东坡肉 2 2 1
4 麻辣鸡丝 5 1 1
end
输出样例5:
在这里给出相应的输出。例如:
table 1: 
1 醋浇羊肉 30
3 刀削面 30
2 东坡肉 38
4 麻辣鸡丝 15
table 2: 
1 醋浇羊肉 60
3 麻婆豆腐 18
4 麻辣鸡丝 90
table 3: 
1 醋浇羊肉 30
3 蜜汁灌藕 20
2 东坡肉 38
4 麻辣鸡丝 15
table 1: 113 113 川菜 1 稍辣 晋菜 4 稍酸 浙菜 1 甜
table 2: 168 118 川菜 4 稍辣 晋菜 2 微酸
table 3: 103 73 川菜 1 爆辣 晋菜 1 稍酸 浙菜 3 微甜
jerry 18100334566 191
tom 13605054400 113
输入样例6:
多用户多桌菜含代点菜。例如:
东坡肉 浙菜 25 T
油淋生菜 9
蜜汁灌藕 浙菜 10 T
刀削面 晋菜 10 T
醋浇羊肉 晋菜 30 T
麻婆豆腐 川菜 12 T
麻辣鸡丝 川菜 15 T
table 1 : tom 13605054400 2023/5/6 12/30/00
1 醋浇羊肉 4 1 1
3 刀削面 1 1 3
2 东坡肉 3 2 1
4 麻辣鸡丝 2 1 1
table 2 : jerry 18100334566 2023/5/1 12/30/00
1 1 醋浇羊肉 0 1 2
3 麻婆豆腐 2 2 1
4 麻辣鸡丝 2 3 3
table 3 : lucy 18957348763 2023/5/1 12/30/00
1 醋浇羊肉 2 1 1
3 蜜汁灌藕 1 1 2
2 东坡肉 2 2 1
4 麻辣鸡丝 5 1 1
end
输出样例6:
在这里给出相应的输出。例如:
table 1: 
1 醋浇羊肉 30
3 刀削面 30
2 东坡肉 38
4 麻辣鸡丝 15
table 2: 
1 table 2 pay for table 1 60
3 麻婆豆腐 18
4 麻辣鸡丝 90
table 3: 
1 醋浇羊肉 30
3 蜜汁灌藕 20
2 东坡肉 38
4 麻辣鸡丝 15
table 1: 113 113 川菜 1 稍辣 晋菜 6 微酸 浙菜 1 甜
table 2: 168 118 川菜 4 稍辣
table 3: 103 73 川菜 1 爆辣 晋菜 1 稍酸 浙菜 3 微甜
jerry 18100334566 118
lucy 18957348763 73
tom 13605054400 113
输入样例7:
错误的菜品记录和桌号记录,用户丢弃。例如:
东坡肉 25 T
油淋生菜 9
table 1 : tom 136050540 2023/5/1 12/30/00
2 东坡肉 3 2 1
end
输出样例7:
在这里给出相应的输出。例如:
wrong format
wrong format
代码展示:
 
1 import java.util.Scanner; 2 import java.util.ArrayList; 3 import java.util.Calendar; 4 public class Main{ 5 public static void main(String args[]) { 6 int i = 0,j = 0,k = 0,f = 0,g =0,s,a = 0,b = 0,c = 0,flag = 0,flag1 = 0,flag2 = 0,flag3 = 0,flag4 = 0; 7 int dishNum = 0,discountPrice = 0; 8 int average =0; 9 Scanner input = new Scanner(System.in); 10 ArrayList<String> inputs = new ArrayList<>(); 11 ArrayList<Customer> customers = new ArrayList<>(); 12 int[] flags = new int[100]; 13 double[] discount = new double[100]; 14 double[] Specialdiscount = new double[100]; 15 for(i = 0;i<100;i++) { 16 flags[i] = 0; 17 } 18 i = 0; 19 String in = input.nextLine(); 20 while(!in.equals("end")) { 21 inputs.add(in); 22 in = input.nextLine(); 23 } 24 inputs.add(in);//输入信息 25 Menu menu = new Menu(); 26 ArrayList<Table> tables = new ArrayList<>(); 27 while(!inputs.get(i).contains("table")) { 28 String[] dish = inputs.get(i).split(" ");//创建菜单 29 if(inputs.get(i).matches(".+\\s[\\d]+")) { 30 int price = Integer.parseInt(dish[1]); 31 menu.addDish(dish[0],price);//菜名和单价,往菜单里加一道菜 32 } 33 else if(inputs.get(i).matches(".+\\s.{2}\\s[\\d]+\\sT")){ 34 int price = Integer.parseInt(dish[2]); 35 menu.addSpecialDish(dish[0],dish[1],price); 36 } 37 else System.out.println("wrong format"); 38 i++; 39 } 40 int d = menu.dishs.size(); 41 42 for(b = d - 1;b > 0;b--) { 43 for(c = b-1;c >= 0;c--) { 44 if(menu.dishs.get(b).name.equals(menu.dishs.get(c).name)) { 45 menu.dishs.remove(c); 46 } 47 } 48 } 49 while(!inputs.get(i).contains("end")) { 50 if(inputs.get(i).contains("table")) { 51 if(inputs.get(i).matches("table\\s.+\\s\\:\\s[\\w]{1,10}" 52 + "\\s(180|181|189|133|135|136)[\\d]{8}" 53 + "\\s[1-9][\\d]{3}/[\\d]{1,2}/[\\d]{1,2}\\s" 54 + "[\\d]{1,2}/[\\d]{1,2}/[\\d]{1,2}")) 55 { 56 String[] tableInfo =inputs.get(i).split(" ");//创建桌子 57 int num = Integer.parseInt(tableInfo[1]); 58 String[] date = tableInfo[5].split("/");//时间 59 String[] time = tableInfo[6].split("/");//时间 60 int[] Date = new int[date.length]; 61 int[] Time = new int[time.length]; 62 for(k = 0;k < date.length;k++) 63 Date[k] = Integer.parseInt(date[k]); 64 for(k = 0;k < time.length;k++) 65 Time[k] = Integer.parseInt(time[k]); 66 Table table = new Table(tableInfo[1],tableInfo[3],tableInfo[4],tableInfo[5],tableInfo[6]); 67 tables.add(table); 68 j++;//桌子数增加 69 flag = 1; 70 a = 0; 71 if(Table.weekday(Date[0],Date[1],Date[2]) >= 1&& 72 Table.weekday(Date[0],Date[1],Date[2]) <= 5) { 73 Specialdiscount[j-1] = 0.7; 74 if((Time[0] >= 17&&Time[0]<=19)||(Time[0] == 20&&Time[1] <= 29)|| 75 (Time[0] == 20&&Time[1] == 30&&Time[2] == 0)) { 76 discount[j-1] = 0.8; 77 System.out.println("table "+num+": "); 78 } 79 else if((Time[0] >= 11&&Time[0] <= 13)|| 80 ((Time[0] == 10||Time[0] == 14)&&Time[1] <= 29)|| 81 ((Time[0] == 10||Time[0] == 14)&&Time[1] == 30&&Time[2] == 0)) { 82 discount[j-1] = 0.6; 83 System.out.println("table "+num+": "); 84 } 85 else { 86 System.out.println("table " + num + " out of opening hours"); 87 flags[f] = 1; 88 } 89 90 } 91 else if(Table.weekday(Date[0],Date[1],Date[2]) == 6|| 92 Table.weekday(Date[0],Date[1],Date[2]) == 7) { 93 Specialdiscount[j-1] = 1; 94 if((Time[0] >= 10&&Time[0] <= 20)) { 95 discount[j-1] = 1; 96 System.out.println("table "+num+": "); 97 } 98 else if(((Time[0] == 10||Time[0] == 21)&&Time[1] <= 29)|| 99 ((Time[0] == 10||Time[0] == 21)&&Time[1] == 30&&Time[2]==0)){ 100 discount[j-1] = 1; 101 System.out.println("table "+num+": "); 102 } 103 else { 104 System.out.println("table " + num + " out of opening hours"); 105 flags[f] = 1; 106 } 107 } 108 f++; 109 } 110 else {System.out.println("wrong format"); 111 flag = 0; 112 } 113 114 } 115 else if(flag == 1&&flags[f-1]==0){ 116 if(inputs.get(i).contains("delete")) { 117 String[] deletes = inputs.get(i).split(" "); 118 int num = Integer.parseInt(deletes[0]); 119 if(tables.get(j-1).getOrder().findRecordByNum(num)){//找到该记录 120 tables.get(j-1).getOrder().delARecordByOrderNum(num); 121 } 122 else { 123 System.out.println("delete error"); 124 } 125 } 126 else { 127 String[] dishInfo =inputs.get(i).split(" ");//存入一条点菜记录 128 if(dishInfo.length == 4) { 129 int Num = Integer.parseInt(dishInfo[0]);//点菜序号 130 int portion = Integer.parseInt(dishInfo[2]);//份量 131 int number = Integer.parseInt(dishInfo[3]);//份数 132 133 if(menu.searthDish(dishInfo[1]) != -1) {//该菜品存在 134 tables.get(j-1).getOrder().addARecord(Num, 135 menu.dishs.get(menu.searthDish(dishInfo[1])),portion,number,discount[j-1]);//添加一条菜品信息 136 137 System.out.println(tables.get(j-1).getOrder().records.get(a).orderNum//输出订单信息 138 +" "+tables.get(j-1).getOrder().records.get(a).d.name+" "+ 139 tables.get(j-1).getOrder().records.get(a).getPrice()); 140 a++; 141 } 142 else System.out.println(dishInfo[1]+" does not exist"); 143 } 144 else if(dishInfo.length == 5) { 145 int Num = Integer.parseInt(dishInfo[0]);//点菜序号 146 int lever = Integer.parseInt(dishInfo[2]);//口味度 147 int portion = Integer.parseInt(dishInfo[3]);//份量 148 int number = Integer.parseInt(dishInfo[4]);//份数 149 if(menu.searthDish(dishInfo[1]) != -1) {//该菜品存在 150 if((menu.checkType(dishInfo[1]).equals("川菜") 151 &&(lever<=5&&lever>=0))|| 152 (menu.checkType(dishInfo[1]).equals("晋菜") 153 &&(lever<=4&&lever>=0))|| 154 (menu.checkType(dishInfo[1]).equals("浙菜") 155 &&(lever<=3&&lever>=0))) { 156 tables.get(j-1).getOrder().addARecord(Num, 157 menu.dishs.get(menu.searthDish(dishInfo[1])),lever,portion,number,Specialdiscount[j-1]);//添加一条菜品信息 158 System.out.println(tables.get(j-1).getOrder().records.get(a).orderNum//输出订单信息 159 +" "+tables.get(j-1).getOrder().records.get(a).d.name+" "+ 160 tables.get(j-1).getOrder().records.get(a).getPrice()); 161 a++; 162 } 163 else { 164 if(menu.checkType(dishInfo[1]).equals("川菜") 165 &&!(lever<=5&&lever>=0)){ 166 System.out.println("spicy num out of range :"+lever); 167 } 168 else if(menu.checkType(dishInfo[1]).equals("晋菜") 169 &&!(lever<=4&&lever>=0)) { 170 System.out.println("acidity num out of range :"+lever); 171 } 172 else if(menu.checkType(dishInfo[1]).equals("浙菜") 173 &&!(lever<=3&&lever>=0)) { 174 System.out.println("sweetness num out of range :"+lever); 175 } 176 } 177 } 178 else System.out.println(dishInfo[1]+" does not exist"); 179 180 } 181 else {//代点菜 182 int subTableNum = Integer.parseInt(dishInfo[0]); 183 int Num = Integer.parseInt(dishInfo[1]);//点菜序号 184 int lever = Integer.parseInt(dishInfo[3]);//口味度 185 int portion = Integer.parseInt(dishInfo[4]);//份量 186 int number = Integer.parseInt(dishInfo[5]);//份数 187 int subOrder = 0; 188 for(s = 0;s < tables.size();s++) { 189 if(tables.get(s).tableNum.equals(dishInfo[0])) { 190 subOrder = s; 191 } 192 } 193 if(menu.searthDish(dishInfo[2]) != -1) {//该菜品存在 194 if((menu.checkType(dishInfo[2]).equals("川菜") 195 &&(lever<=5&&lever>=0))|| 196 (menu.checkType(dishInfo[2]).equals("晋菜") 197 &&(lever<=4&&lever>=0))|| 198 (menu.checkType(dishInfo[2]).equals("浙菜") 199 &&(lever<=3&&lever>=0))) { 200 tables.get(subOrder).getOrder().addARecord(Num, 201 menu.dishs.get(menu.searthDish(dishInfo[2])),lever,portion,number,Specialdiscount[j-1],1);//添加一条菜品信息 202 tables.get(j-1).getOrder().addARecord(1,Num, 203 menu.dishs.get(menu.searthDish(dishInfo[2])),lever,portion,number,Specialdiscount[j-1]);//添加一条菜品信息 204 205 System.out.println(Num+" table "+tables.get(j-1).tableNum+" pay for table "+subTableNum+" "+ 206 tables.get(j-1).getOrder().records.get(a).getPrice()); 207 a++; 208 } 209 else { 210 if(menu.checkType(dishInfo[1]).equals("川菜") 211 &&!(lever<=5&&lever>=0)){ 212 System.out.println("spicy num out of range :"+lever); 213 } 214 else if(menu.checkType(dishInfo[1]).equals("晋菜") 215 &&!(lever<=4&&lever>=0)) { 216 System.out.println("acidity num out of range :"+lever); 217 } 218 else if(menu.checkType(dishInfo[1]).equals("浙菜") 219 &&!(lever<=3&&lever>=0)) { 220 System.out.println("sweetness num out of range :"+lever); 221 } 222 } 223 } 224 else System.out.println(dishInfo[2]+" does not exist"); 225 // } 226 } 227 } 228 } 229 i++; 230 } 231 232 for(i = 0;i < tables.size();i++) { 233 if(flags[i] == 0) { 234 235 System.out.print("table "+tables.get(i).tableNum+": "+ 236 tables.get(i).getOrder().getTotalPrice()+" "+ 237 tables.get(i).getOrder().getDiscountTotalPrice()); 238 if(tables.get(i).getOrder().getDishNum("川菜") != 0) { 239 average = (int)(tables.get(i).getOrder().getAverageLever("川菜")/ 240 tables.get(i).getOrder().getDishNum("川菜") +0.5); 241 System.out.print(" 川菜 "+(int)tables.get(i).getOrder().getDishNum("川菜")); 242 if(average == 0) 243 System.out.print(" 不辣"); 244 else if(average == 1) 245 System.out.print(" 微辣"); 246 else if(average == 2) 247 System.out.print(" 稍辣"); 248 else if(average == 3) 249 System.out.print(" 辣"); 250 else if(average == 4) 251 System.out.print(" 很辣"); 252 else if(average == 5) 253 System.out.print(" 爆辣"); 254 } 255 if(tables.get(i).getOrder().getDishNum("晋菜") != 0) { 256 average = (int)(tables.get(i).getOrder().getAverageLever("晋菜")/ 257 tables.get(i).getOrder().getDishNum("晋菜") +0.5); 258 System.out.print(" 晋菜 "+(int)tables.get(i).getOrder().getDishNum("晋菜")); 259 260 if(average == 0) 261 System.out.print(" 不酸"); 262 else if(average == 1) 263 System.out.print(" 微酸"); 264 else if(average == 2) 265 System.out.print(" 稍酸"); 266 else if(average == 3) 267 System.out.print(" 酸"); 268 else if(average == 4) 269 System.out.print(" 很酸"); 270 } 271 if(tables.get(i).getOrder().getDishNum("浙菜") != 0) { 272 average = (int)(tables.get(i).getOrder().getAverageLever("浙菜")/ 273 tables.get(i).getOrder().getDishNum("浙菜") +0.5); 274 System.out.print(" 浙菜 "+(int)tables.get(i).getOrder().getDishNum("浙菜")); 275 276 if(average == 0) 277 System.out.print(" 不甜"); 278 else if(average == 1) 279 System.out.print(" 微甜"); 280 else if(average == 2) 281 System.out.print(" 稍甜"); 282 else if(average == 3) 283 System.out.print(" 甜"); 284 } 285 System.out.print("\n"); 286 } 287 288 } 289 for(i = 0;i < tables.size();i++){ 290 for(j = 0;j < i;j++){ 291 if(tables.get(i).customerName.equals(tables.get(j).customerName)) break;} 292 if(i==j) { 293 Customer customer = new Customer(tables.get(i).customerName,tables.get(i).number); 294 customers.add(customer); 295 } 296 } 297 for(i = 0;i < customers.size();i++) { 298 for(j = 0;j < tables.size();j++) { 299 if(customers.get(i).name.equals(tables.get(j).customerName)) { 300 customers.get(i).TotalPrice = customers.get(i).TotalPrice + 301 tables.get(j).getOrder().getDiscountTotalPrice(); 302 } 303 } 304 } 305 String Cname = " "; 306 String Cnumber = " "; 307 int Tprice = 0; 308 for(i = 0;i < customers.size()-1;i++) { 309 for(j = 0;j < customers.size() - i - 1;j++) { 310 if(customers.get(j).name.compareToIgnoreCase(customers.get(j+1).name) > 0) { 311 Cname = customers.get(j).name; 312 customers.get(j).name = customers.get(j+1).name; 313 customers.get(j+1).name = Cname; 314 Cnumber = customers.get(j).number; 315 customers.get(j).number = customers.get(j+1).number; 316 customers.get(j+1).number = Cnumber; 317 Tprice = customers.get(j).TotalPrice; 318 customers.get(j).TotalPrice = customers.get(j+1).TotalPrice; 319 customers.get(j+1).TotalPrice = Tprice; 320 } 321 322 } 323 } 324 for(i = 0;i < customers.size();i++) { 325 if(flags[i] == 0) { 326 System.out.println(customers.get(i).name+" "+ 327 customers.get(i).number+" "+customers.get(i).TotalPrice); 328 } 329 } 330 331 } 332 333 } 334 class Customer{ 335 String name; 336 String number; 337 // Table[] table = new Table[100]; 338 int TotalPrice = 0; 339 public Customer() { 340 341 } 342 public Customer(String name,String number) { 343 this.name = name; 344 this.number = number; 345 346 } 347 } 348 class Table{ 349 String tableNum;//桌子序号 350 String customerName; 351 String number; 352 String date; 353 String time; 354 Order order = new Order(); 355 356 public Table(){ 357 358 } 359 public Table(String tableNum,String customerName,String number,String date,String time){ 360 this.tableNum = tableNum; 361 this.customerName = customerName; 362 this.number = number; 363 this.date = date; 364 this.time = time; 365 } 366 Order getOrder() { 367 // order = new Order(); 368 return this.order; 369 } 370 public static int weekday(int year, int month, int day){ 371 Calendar cal = Calendar.getInstance(); 372 //月份要减一,在西方周日是一周的第1天(日期也需要减一) 373 cal.set(year,month-1,day-1); 374 return cal.get(Calendar.DAY_OF_WEEK); 375 } 376 } 377 class Dish{ 378 String name;//菜名 379 String type = " ";//菜系 380 int unit_price = 0;//菜品单价 381 public Dish(){ 382 383 } 384 public Dish(String name,int unit_price){ 385 this.name = name; 386 this.unit_price = unit_price; 387 } 388 public Dish(String name,String type,int unit_price) { 389 this.name = name; 390 this.type = type; 391 this.unit_price = unit_price; 392 } 393 public String getName(){ 394 return name; 395 } 396 public void setName(String name){ 397 this.name = name; 398 } 399 public String getType(){ 400 return type; 401 } 402 public int getPrice(int portion){ 403 int price = 0; 404 if(portion == 1){ 405 price = (int)unit_price; 406 } 407 else if(portion == 2){ 408 price = (int)(1.5*unit_price+0.5); 409 } 410 else if(portion == 3){ 411 price = (int)(2*unit_price); 412 } 413 return price; 414 } 415 416 } 417 class Menu{ 418 ArrayList<Dish> dishs = new ArrayList<>(); 419 public Menu(){ 420 421 } 422 int i = 0; 423 int searthDish(String dishName){ 424 for(i = 0;i < dishs.size();i++) 425 if((dishs.get(i).name).equals(dishName)){ 426 break; 427 } 428 if(i < dishs.size()) 429 return i; 430 else return -1; 431 } 432 String checkType(String dishName) { 433 for(i = 0;i < dishs.size();i++) 434 if((dishs.get(i).name).equals(dishName)){ 435 break; 436 } 437 return dishs.get(i).type; 438 } 439 void addDish(String dishName,int unit_price){ 440 Dish dish = new Dish(dishName,unit_price); 441 dishs.add(dish); 442 } 443 void addSpecialDish(String dishName,String type,int unit_price) { 444 Dish dish = new Dish(dishName,type,unit_price); 445 dishs.add(dish); 446 } 447 } 448 class Record{ 449 int orderNum;//序号 450 Dish d;//菜品 451 int lever = 0;//口味度 452 int portion;//份额 453 int num;//份数 454 double discount; 455 int flag = 0; 456 int sign = 0; 457 int sign2 = 0; 458 public Record(){ 459 460 } 461 public Record(int orderNum,Dish d,int portion,int num,double discount){ 462 this.orderNum = orderNum; 463 this.d = d; 464 this.portion = portion; 465 this.num = num; 466 this.discount = discount; 467 } 468 public Record(int orderNum,Dish d,int lever,int portion,int num,double discount){ 469 this.orderNum = orderNum; 470 this.d = d; 471 this.lever = lever; 472 this.portion = portion; 473 this.num = num; 474 this.discount = discount; 475 } 476 public Record(int orderNum,Dish d,int lever,int portion,int num,double discount,int sign){ 477 this.orderNum = orderNum; 478 this.d = d; 479 this.lever = lever; 480 this.portion = portion; 481 this.num = num; 482 this.discount = discount; 483 this.sign = sign; 484 } 485 public Record(int sign2,int orderNum,Dish d,int lever,int portion,int num,double discount){ 486 this.sign2 = sign2; 487 this.orderNum = orderNum; 488 this.d = d; 489 this.lever = lever; 490 this.portion = portion; 491 this.num = num; 492 this.discount = discount; 493 } 494 495 int getPrice(){//计价,计算本条记录的价格 496 return d.getPrice(portion)*num; 497 } 498 int getDiscountPrice() { 499 return (int)(d.getPrice(portion)*num*discount+0.5); 500 } 501 public void showRecord() { 502 503 System.out.println(orderNum+" "+d.name+" "+getPrice()); 504 } 505 int getLever() { 506 return num * lever; 507 } 508 } 509 510 class Order { 511 int totalprice = 0; 512 int total; 513 int Lever = 0; 514 double dishNum = 0; 515 int i = 0,k = 0,a= 0,b = 0; 516 ArrayList<Record> records = new ArrayList<>(); 517 int getTotalPrice(){//计算订单的总价 518 totalprice = 0; 519 for(i = 0;i < records.size();i++) { 520 if(records.get(i).sign == 0) { 521 a = records.get(i).getPrice(); 522 totalprice += a; 523 } 524 } 525 return totalprice; 526 } 527 int getDiscountTotalPrice() { 528 totalprice = 0; 529 for(i = 0;i < records.size();i++) { 530 if(records.get(i).sign == 0) { 531 a = records.get(i).getDiscountPrice(); 532 totalprice += a; 533 } 534 } 535 return totalprice; 536 } 537 int getAverageLever(String type) {//输出指定菜系的口味值 538 Lever = 0; 539 if(type.equals("川菜")) 540 for(i = 0;i < records.size();i++) { 541 if(records.get(i).sign2 == 0) { 542 if(records.get(i).d.type.equals(type)) 543 Lever = Lever + records.get(i).getLever(); 544 } 545 } 546 else if(type.equals("晋菜")) { 547 for(i = 0;i < records.size();i++) { 548 if(records.get(i).sign2 == 0) { 549 if(records.get(i).d.type.equals(type)) 550 Lever = Lever + records.get(i).getLever(); 551 } 552 } 553 } 554 else if(type.equals("浙菜")) { 555 for(i = 0;i < records.size();i++) { 556 if(records.get(i).sign2 == 0) { 557 if(records.get(i).d.type.equals(type)) 558 Lever = Lever + records.get(i).getLever(); 559 } 560 } 561 } 562 return Lever; 563 } 564 double getDishNum(String type) {//输出指定菜系的总份数 565 dishNum = 0; 566 if(type.equals("川菜")) { 567 for(i = 0;i < records.size();i++) { 568 if(records.get(i).sign2 == 0) { 569 if(records.get(i).d.type.equals(type)) 570 dishNum = dishNum + records.get(i).num; 571 } 572 } 573 } 574 if(type.equals("晋菜")) { 575 for(i = 0;i < records.size();i++) { 576 if(records.get(i).sign2 == 0) { 577 if(records.get(i).d.type.equals(type)) 578 dishNum = dishNum + records.get(i).num; 579 } 580 } 581 } 582 if(type.equals("浙菜")) { 583 for(i = 0;i < records.size();i++) { 584 if(records.get(i).sign2 == 0) { 585 if(records.get(i).d.type.equals(type)) 586 dishNum = dishNum + records.get(i).num; 587 } 588 } 589 } 590 return dishNum; 591 592 } 593 594 void addARecord(int orderNum,Dish d,int portion,int num,double discount){ 595 596 Record record = new Record(orderNum,d,portion,num,discount); 597 records.add(record); 598 }//添加一条菜品信息到订单中。 599 void addARecord(int orderNum,Dish d,int lever,int portion,int num,double discount){ 600 601 Record record = new Record(orderNum,d,lever,portion,num,discount); 602 records.add(record); 603 }//添加一条菜品信息到订单中。 604 void addARecord(int orderNum,Dish d,int lever,int portion,int num,double discount,int sign){ 605 606 Record record = new Record(orderNum,d,lever,portion,num,discount,sign); 607 records.add(record); 608 }//添加一条菜品信息到订单中。 609 void addARecord(int sign2,int orderNum,Dish d,int lever,int portion,int num,double discount){ 610 611 Record record = new Record(sign2,orderNum,d,lever,portion,num,discount); 612 records.add(record); 613 }//添加一条菜品信息到订单中。 614 615 void delARecordByOrderNum(int orderNum){ 616 records.remove(orderNum-1); 617 }//根据序号删除一条记录 618 619 boolean findRecordByNum(int orderNum){//根据序号查找一条记录 620 for(i = 0;i < records.size();i++) 621 if(records.get(i).orderNum == orderNum){ 622 break; 623 } 624 if(i == records.size()) { 625 return false; 626 } 627 else return true; 628 } 629 }




分析如下:
1.本题和第六次题目集菜单计价程序-4同属第四次作业菜单计价程序-3的两个不同迭代分支,他在菜单计价程序-3的基础上新增了许多内容。
2.这道题的难度依旧很高,但总体上来说有了上次题目集中菜单计价程序-4的经验,我认为难度有所下降。
3.由于题目中可能出现的情况有很多种,所以使用了大量的if-else语句,使得程序结构变得十分冗长复杂。
4.从UML图中可以看出各类之间存在大量的依赖关系,有很强的耦合性。
第二次作业
7-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)成绩平均分只取整数部分,小数部分丢弃
参考类图:

输入样例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
代码展示:
 
1 import java.util.ArrayList; 2 import java.util.Scanner; 3 import java.util.Collections; 4 import java.text.Collator; 5 import java.util.Comparator; 6 import java.util.Locale; 7 8 public class Main { 9 public static void main(String[] args) { 10 Scanner input = new Scanner(System.in); 11 ArrayList<String> inputs = new ArrayList<>(); 12 13 String info = input.nextLine(); 14 while(!info.equals("end")){ 15 inputs.add(info); 16 info = input.nextLine(); 17 } 18 inputs.add(info); 19 ArrayList<Course> courses = new ArrayList<>(); 20 ArrayList<Class1> classes = new ArrayList<>(); 21 ArrayList<Student> stu = new ArrayList<>(); 22 ArrayList<Selection> selections = new ArrayList<>(); 23 24 int i,j,k,n,m; 25 for(i = 0;!inputs.get(i).equals("end");i++) { 26 String[] Info = inputs.get(i).split(" "); 27 if (inputs.get(i).matches(".{1,10}\\s(((必修|选修)\\s(考试|考察))|(必修))")) { 28 if (inputs.get(i).contains("必修")) { 29 30 if (inputs.get(i).contains("考察")) { 31 System.out.println(Info[0] + " : course type & access mode mismatch"); 32 } else { 33 if (courses.size() == 0) { 34 Course course = new Course(Info[0], Info[1], "考试"); 35 courses.add(course); 36 } else { 37 for (j = 0; j < courses.size(); j++) { 38 if (courses.get(j).getLessonName().equals(Info[0])) { 39 break; 40 } 41 } 42 if (j == courses.size()) { 43 Course course = new Course(Info[0], Info[1], "考试"); 44 courses.add(course); 45 } 46 } 47 } 48 49 } else if (inputs.get(i).contains("选修")) { 50 51 if (courses.size() == 0) { 52 Course course = new Course(Info[0], Info[1], Info[2]); 53 courses.add(course); 54 } else { 55 for (j = 0; j < courses.size(); j++) { 56 if (courses.get(j).getLessonName().equals(Info[0])) { 57 break; 58 } 59 } 60 if (j == courses.size()) { 61 Course course = new Course(Info[0], Info[1],Info[2]); 62 courses.add(course); 63 } 64 } 65 66 } 67 } 68 else if(inputs.get(i).matches("[\\d]{8}(\\s([\\u4e00-\\u9fa5]|[\\w]){1,10}){2}(\\s([\\d]{1,2}|100)){1,2}")) { 69 70 for (j = 0; j < classes.size(); j++) { 71 if (classes.get(j).getNum().equals(Info[0].substring(0, 6))) { 72 break;//找到了 73 } 74 } 75 if (j == classes.size()) {//班级不存在 76 Class1 class1 = new Class1(Info[0].substring(0, 6)); 77 classes.add(class1); 78 } 79 for (k = 0; k < classes.get(j).students.size(); k++) { 80 if (classes.get(j).students.get(k).getId().equals(Info[0])) { 81 break;//学生存在 82 } 83 } 84 if (k == classes.get(j).students.size()) {//学生不存在 85 Student student = new Student(Info[0], Info[1]); 86 classes.get(j).students.add(student); 87 stu.add(student); 88 } 89 if (Info.length == 4) {//选修考察 90 91 int flag = 0; 92 for (n = 0; n < courses.size(); n++) { 93 if (courses.get(n).getLessonName().equals(Info[2])) { 94 break; 95 } 96 } 97 if (n == courses.size()) { 98 System.out.println(Info[2] + " does not exist"); 99 flag = 1; 100 } 101 if (courses.size() > 0) { 102 if (flag == 0) { 103 if (courses.get(n).getTestWay().equals("考察")) { 104 for (m = 0; m < selections.size(); m++) { 105 if (selections.get(m).getStudent().getId().equals(classes.get(j).students.get(k).getId()) 106 && selections.get(m).getCourse().getLessonName().equals(courses.get(n).getLessonName())) { 107 break; 108 } 109 } 110 if (m == selections.size()) { 111 int fGrade = Integer.parseInt(Info[3]); 112 Score examine = new Examine(fGrade); 113 Selection selection = new Selection(courses.get(n), classes.get(j).students.get(k), examine); 114 selections.add(selection); 115 } 116 } else { 117 System.out.println(classes.get(j).students.get(k).getId() + " " + 118 classes.get(j).students.get(k).getName() + " : " + "access mode mismatch"); 119 } 120 } 121 } 122 } else if (Info.length == 5) {//考试 123 124 int flag = 0; 125 for (n = 0; n < courses.size(); n++) { 126 if (courses.get(n).getLessonName().equals(Info[2])) { 127 break; 128 } 129 } 130 if (n == courses.size()) { 131 System.out.println(Info[2] + " does not exist"); 132 flag = 1; 133 } 134 if (courses.size() > 0) { 135 if(flag == 0) { 136 if (!courses.get(n).getTestWay().equals("考察")) { 137 for (m = 0; m < selections.size(); m++) { 138 if (selections.get(m).getStudent().getId().equals(classes.get(j).students.get(k).getId()) 139 && selections.get(m).getCourse().getLessonName().equals(courses.get(n).getLessonName())) { 140 break; 141 } 142 } 143 if (m == selections.size()) { 144 int uGrade = Integer.parseInt(Info[3]); 145 int fGrade = Integer.parseInt(Info[4]); 146 Score examScore = new ExamScore(uGrade, fGrade); 147 Selection selection = new Selection(courses.get(n), classes.get(j).students.get(k), examScore); 148 selections.add(selection); 149 } 150 } else { 151 System.out.println(classes.get(j).students.get(k).getId() + " " + 152 classes.get(j).students.get(k).getName() + " : " + "access mode mismatch"); 153 } 154 } 155 } 156 } 157 } 158 else System.out.println("wrong format"); 159 } 160 //排序 161 ArrayList<Integer> averScore = new ArrayList<>(); 162 ArrayList<Integer> gradeSize = new ArrayList<>(); 163 for(i = 0;i < stu.size();i++){ 164 averScore.add(stu.get(i).getAverageScore()); 165 166 gradeSize.add(stu.get(i).grades.size()); 167 } 168 for(i = 0;i < stu.size()-1;i++){ 169 String t; 170 int t1; 171 for(j = 0;j < stu.size()-1-i;j++) { 172 if(stu.get(j + 1).getIntId() < stu.get(j).getIntId()){ 173 t = stu.get(j+1).getId(); 174 stu.get(j+1).setId(stu.get(j).getId()); 175 stu.get(j).setId(t); 176 t = stu.get(j+1).getName(); 177 stu.get(j+1).setName(stu.get(j).getName()); 178 stu.get(j).setName(t); 179 t1 = averScore.get(j+1); 180 averScore.set(j+1,averScore.get(j)); 181 averScore.set(j,t1); 182 t1 = gradeSize.get(j+1); 183 gradeSize.set(j+1,gradeSize.get(j)); 184 gradeSize.set(j,t1); 185 } 186 } 187 } 188 ArrayList<Integer> averUgrade = new ArrayList<>(); 189 ArrayList<Integer> averFgrade = new ArrayList<>(); 190 ArrayList<Integer> averGrade = new ArrayList<>(); 191 Collections.sort(courses); 192 for(i = 0;i < courses.size();i++){ 193 averUgrade.add(courses.get(i).getAverageUrades()); 194 averFgrade.add(courses.get(i).getAverageFrades()); 195 averGrade.add(courses.get(i).getAverageScore()); 196 } 197 for(i = 0;i < stu.size();i++){ 198 System.out.print(stu.get(i).getId()+" "+stu.get(i).getName()+" "); 199 if(gradeSize.get(i)!= 0) { 200 System.out.println(averScore.get(i)); 201 } 202 else System.out.println("did not take any exams"); 203 } 204 for(i = 0;i < courses.size();i++) { 205 System.out.print(courses.get(i).getLessonName() + " "); 206 if (courses.get(i).grades.size() != 0) { 207 if (!courses.get(i).getTestWay().equals("考察")) { 208 System.out.print(averUgrade.get(i) + " "); 209 210 System.out.print(averFgrade.get(i) + " "); 211 } else 212 System.out.print(averFgrade.get(i) + " "); 213 214 System.out.println(averGrade.get(i)); 215 } 216 else System.out.println("has no grades yet"); 217 } 218 ArrayList<Integer> classScore = new ArrayList<>(); 219 for(i = 0;i < classes.size();i++){ 220 classScore.add(classes.get(i).getClassScore()); 221 } 222 for(i = 0;i < classes.size()-1;i++){ 223 String t; 224 int t1; 225 for(j = 0;j < classes.size()-1-i;j++){ 226 if(classes.get(j+1).getIntNum() < classes.get(j).getIntNum()){ 227 t = classes.get(j+1).getNum(); 228 classes.get(j+1).setNum( classes.get(j).getNum()); 229 classes.get(j).setNum(t); 230 t1 = classScore.get(j+1); 231 classScore.set(j+1,classScore.get(j)); 232 classScore.set(j,t1); 233 } 234 } 235 } 236 for(i = 0;i < classes.size();i++){ 237 System.out.print(classes.get(i).getNum()+" "); 238 if(classScore.get(i) != 0) 239 System.out.println(classScore.get(i)); 240 else System.out.println("has no grades yet"); 241 } 242 } 243 } 244 abstract class Score { 245 private int Fgrade; 246 private int Ugrade; 247 public Score(int fgrade) { 248 Fgrade = fgrade; 249 } 250 public Score(int ugrade, int fgrade) { 251 super(); 252 Ugrade = ugrade; 253 Fgrade = fgrade; 254 } 255 public abstract int getScore(); 256 public int getUgrade() { 257 return Ugrade; 258 } 259 public int getFgrade() { 260 return Fgrade; 261 } 262 } 263 class Examine extends Score{ 264 public Examine(int fgrade){ 265 super(fgrade); 266 } 267 @Override 268 public int getScore(){ 269 return (int)( this.getFgrade()); 270 } 271 } 272 class ExamScore extends Score{ 273 public ExamScore(int ugrade, int fgrade) { 274 super(ugrade, fgrade); 275 } 276 @Override 277 public int getScore(){ 278 return (int)(this.getUgrade()*0.3 + this.getFgrade()*0.7); 279 } 280 } 281 class Course implements Comparable<Course> { 282 private String lessonName; 283 private String lessonAttribute; 284 private String testWay; 285 286 ArrayList<Integer> grades = new ArrayList<>(); 287 ArrayList<Integer> Ugrades = new ArrayList<>(); 288 ArrayList<Integer> Fgrades = new ArrayList<>(); 289 public Course(String lessonName) { 290 super(); 291 this.lessonName = lessonName; 292 } 293 public Course(String lessonName, String lessonAttribute, String testWay) { 294 super(); 295 this.lessonName = lessonName; 296 this.lessonAttribute = lessonAttribute; 297 this.testWay = testWay; 298 } 299 public String getLessonName() {return lessonName;} 300 public String getLessonAttribute() { 301 return lessonAttribute; 302 } 303 public String getTestWay() { 304 return testWay; 305 } 306 public int getAverageScore() { 307 int total = 0; 308 for(int i = 0;i < grades.size();i++){ 309 total = total + grades.get(i); 310 } 311 if(grades.size() != 0) 312 return total/grades.size(); 313 else return 0; 314 } 315 public int getAverageUrades() { 316 int total = 0; 317 for(int i = 0;i < Ugrades.size();i++){ 318 total = total + Ugrades.get(i); 319 } 320 if(Ugrades.size() != 0) 321 return total/Ugrades.size(); 322 else return 0; 323 } 324 public int getAverageFrades() { 325 int total = 0; 326 for(int i = 0;i < Fgrades.size();i++){ 327 total = total + Fgrades.get(i); 328 } 329 if(Fgrades.size() != 0) 330 return total/Fgrades.size(); 331 else return 0; 332 } 333 @Override 334 public int compareTo(Course cou) { 335 Comparator<Object> com = Collator.getInstance(Locale.CHINA); 336 return ((Collator) com).compare(this.lessonName,cou.getLessonName()); 337 } 338 } 339 class Class1 { 340 private String num; 341 ArrayList<Student> students = new ArrayList<>(); 342 public Class1(String num) { 343 this.num = num; 344 } 345 public String getNum() { 346 return num; 347 } 348 public void setNum(String num){ 349 this.num = num; 350 } 351 public int getIntNum(){ 352 return Integer.parseInt(num); 353 } 354 public int getClassScore(){ 355 int total = 0; 356 for(int i = 0;i < this.students.size();i++){ 357 total = total +this.students.get(i).getAverageScore(); 358 } 359 if(this.students.size() == 0){ 360 return 0; 361 } 362 else return total/this.students.size(); 363 } 364 } 365 class Selection { 366 private Course course; 367 private Student student; 368 private Score score; 369 public Selection(Course course, Student student, Score score) { 370 this.course = course; 371 this.student = student; 372 this.score = score; 373 this.student.grades.add(score.getScore()); 374 this.course.grades.add(score.getScore()); 375 if(!course.getTestWay().equals("考察")){ 376 this.course.Ugrades.add(score.getUgrade()); 377 this.course.Fgrades.add(score.getFgrade()); 378 } 379 else { 380 this.course.Fgrades.add(score.getFgrade()); 381 } 382 } 383 public Course getCourse() { 384 return course; 385 } 386 public Student getStudent() { 387 return student; 388 } 389 public Score getScore() { 390 return score; 391 } 392 } 393 class Student { 394 private String id; 395 private String name; 396 ArrayList<Integer> grades = new ArrayList<>(); 397 private int averScore; 398 public Student(String id,String name) { 399 this.id = id; 400 this.name = name; 401 } 402 public String getName() { 403 return name; 404 } 405 public void setName(String name) { 406 this.name = name; 407 } 408 public String getId() { 409 return id; 410 } 411 public int getIntId(){ 412 return Integer.parseInt(id); 413 } 414 public void setId(String id) { 415 this.id = id; 416 } 417 public int getAverageScore() { 418 int total = 0; 419 for(int i = 0;i < grades.size();i++){ 420 total = total + grades.get(i); 421 } 422 if(grades.size() != 0) { 423 this.averScore = total / grades.size(); 424 return averScore; 425 } 426 else return 0; 427 } 428 }
类图如下:


分析如下:
1.该题上前几次的菜单计价程序题有许多相似之处,我用了同样的处理信息的方式来处理这道题,从图中可以看出
这段代码的耦合性很强,原因是我使用了大量的if-else语句,这也是我需要改进的地方。
2.有了前几次的教训和经验,我不再轻视题目,我首先寻找这次题目和上次题目的共同点,这样让我有了更加清晰的
思路。
3.本题同样设计了许多的类,题目还提供了参考类图,我先是大致理解各个类的作用,编写他们的属性和方法,再着重
分析各类之间的关系。
4.此外,这道题代码长度限制很严格,只有16kb,所以在做题的过程中需要十分注重对内存大小的管理和分配。
第三次作业
7-1 统计java程序中关键词的出现次数
题目如下:
编写程序统计一个输入的Java源码中关键字(区分大小写)出现的次数。说明如下:
- Java中共有53个关键字(自行百度)
- 从键盘输入一段源码,统计这段源码中出现的关键字的数量
- 注释中出现的关键字不用统计
- 字符串中出现的关键字不用统计
- 统计出的关键字及数量按照关键字升序进行排序输出
- 未输入源码则认为输入非法
输入格式:
输入Java源码字符串,可以一行或多行,以exit行作为结束标志
输出格式:
- 当未输入源码时,程序输出Wrong Format
- 当没有统计数据时,输出为空
- 当有统计数据时,关键字按照升序排列,每行输出一个关键字及数量,格式为数量\t关键字
输入样例:
在这里给出一组输入。例如:
//Test public method
public HashMap(int initialCapacity) {
        this(initialCapacity, DEFAULT_LOAD_FACTOR);
    }
    public HashMap(int initialCapacity, float loadFactor) {
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal initial capacity: " +
                                               initialCapacity);
        if (initialCapacity > MAXIMUM_CAPACITY)
            initialCapacity = MAXIMUM_CAPACITY;
        if (loadFactor <= 0 || Float.isNaN(loadFactor))
            throw new IllegalArgumentException("Illegal load factor: " +
                                               loadFactor);
        this.loadFactor = loadFactor;
        this.threshold = tableSizeFor(initialCapacity);
    }
exit
输出样例:
在这里给出相应的输出。例如:
1	float
3	if
2	int
2	new
2	public
3	this
2	throw
代码展示:
 
1 import java.util.ArrayList; 2 import java.util.HashMap; 3 import java.util.Scanner; 4 import java.util.Map; 5 public class Main { 6 public static void main(String[] args) { 7 Map<String,Integer> map = new HashMap<>(); 8 String[] key = {"abstract","assert","boolean","break","byte","case","catch","char","class","const","continue","default","do","double","else","enum","extends","false","final","finally","float","for","goto","if","implements","import","instanceof","int","interface","long","native","new","null","package","private","protected","public","return","short","static","strictfp","super","switch","synchronized","this","throw","throws","transient","true","try","void","volatile","while" 9 }; 10 Scanner in = new Scanner(System.in); 11 ArrayList<String> inputs = new ArrayList<>(); 12 String str = in.nextLine(); 13 int i,j,k,n; 14 while(!str.equals("exit")) { 15 inputs.add(str); 16 str = in.nextLine(); 17 } 18 for (i = 0; i < inputs.size(); i++) { 19 inputs.set(i, inputs.get(i).replaceAll("\".*\"", " ")); 20 inputs.set(i, inputs.get(i).replaceAll("//.*", " ")); 21 } 22 ArrayList<Integer> sta = new ArrayList<>(); 23 ArrayList<Integer> end = new ArrayList<>(); 24 for(i = 0;i < inputs.size();i++){ 25 if(inputs.get(i).contains("/*")) 26 sta.add(i); 27 if(inputs.get(i).contains("*/")) 28 end.add(i); 29 } 30 for(i = 0;i < sta.size();i++){ 31 for(j = sta.get(i);j <= end.get(i);j++) 32 inputs.set(j," "); 33 } 34 if(inputs.size() > 0 ) { 35 for (i = 0; i < inputs.size(); i++){ 36 inputs.set(i, inputs.get(i).replace("=", "1")); 37 inputs.set(i, inputs.get(i).replaceAll("\\W", " ")); 38 } 39 ArrayList<String> afsp = new ArrayList<>(); 40 for(i = 0;i < inputs.size();i++){ 41 String[] a = inputs.get(i).split(" +"); 42 for(String s : a) 43 afsp.add(s); 44 } 45 for(j = 0; j< key.length;j++) { 46 n = 0; 47 for (i = 0; i < afsp.size(); i++) { 48 if(key[j].equals(afsp.get(i))) 49 n++; 50 } 51 map.put(key[j],n); 52 } 53 for(j = 0;j < key.length;j++){ 54 if(map.get(key[j]) != 0) 55 System.out.println(map.get(key[j])+"\t"+key[j]); 56 } 57 } else System.out.println("Wrong Format"); 58 } 59 }


分析如下:
1.由于要求使用Map并且规定了代码行数,而我对Map的使用还不够熟练,所以这题对我来说有点难度。
2.根据老师在课堂上提供的思路,用replace和repalceAll这两个方法将没用的字符转换为空格字符,然后使用split这个方法将字符串
根据空格分割,存入字符串数组中。
3.将关键字存入到Map中当作key,关键词出现的次数当作value,最后使用Map的方法输出。
第四次作业
第一题
7-1 容器-HashMap-检索
题目如下:
输入多个学生的成绩信息,包括:学号、姓名、成绩。
学号是每个学生的唯一识别号,互不相同。
姓名可能会存在重复。
使用HashMap存储学生信息,并实现根据学号的检索功能
输入格式:
输入多个学生的成绩信息,每个学生的成绩信息格式:学号+英文空格+姓名+英文空格+成绩
以“end”为输入结束标志
end之后输入某个学号,执行程序输出该生的详细信息
输出格式:
输出查询到的学生信息格式:学号+英文空格+姓名+英文空格+成绩
如果没有查询到,则输出:"The student "+查询的学号+" does not exist"
输入样例1:
在这里给出一组输入。例如:
20201107 张少军 83
20201116 李四 78
20201118 郑觉先 80
end
20201116
输出样例1:
在这里给出相应的输出。例如:
20201116 李四 78
输入样例2:
在这里给出一组输入。例如:
20201107 张少军 83
20201116 李四 78
20201118 郑觉先 80
end
20202316
输出样例2:
在这里给出相应的输出。例如:
The student 20202316 does not exist
代码展示:
 
1 import java.util.*; 2 3 public class Main { 4 public static void main(String[] args) { 5 Map<Student,String> map = new HashMap<>(); 6 Scanner input = new Scanner(System.in); 7 String in = input.nextLine(); 8 while(!in.equals("end")){ 9 String[] Info = in.split(" "); 10 Student stu = new Student(Info[0],Info[1]); 11 map.put(stu,Info[2]); 12 in = input.nextLine(); 13 } 14 String id = input.nextLine(); 15 Set<Student> set = map.keySet(); 16 int flag = 0; 17 for(Student stus : set){ 18 if(stus.getId().equals(id)){ 19 flag = 1; 20 System.out.println(stus.getId()+" "+stus.getName()+" "+map.get(stus)); 21 break; 22 } 23 } 24 if(flag == 0){ 25 System.out.println("The student "+id+" does not exist"); 26 } 27 28 } 29 } 30 class Student { 31 String id; 32 String name; 33 public Student(){ 34 35 } 36 public Student(String id, String name) { 37 this.id = id; 38 this.name = name; 39 } 40 public String getId() { 41 return id; 42 } 43 public String getName() { 44 return name; 45 } 46 public void setId(String id) { 47 this.id = id; 48 } 49 public void setName(String name) { 50 this.name = name; 51 } 52 }
类图如下:


分析如下:
1、这次题目要求使用HashMap来存储学生信息,于是我创建一个学生类,在主类中创建一个以学生类为key,int类为
value的HashMap,再利用set遍历map。
第二题
7-3 课程成绩统计程序-2
课程成绩统计程序-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)成绩平均分只取整数部分,小数部分丢弃
参考类图(与第一次相同,其余内容自行补充):

输入样例1:
在这里给出一组输入。例如:
java 实验 实验
20201103 张三 java 4 70 80 90
end
输出样例1:
在这里给出相应的输出。例如:
20201103 张三 : access mode mismatch
20201103 张三 did not take any exams
java has no grades yet
202011 has no grades yet
输入样例2:
在这里给出一组输入。例如:
java 实验 实验
20201103 张三 java 3 70 80 90
end
输出样例2:
在这里给出相应的输出。例如:
wrong format
java has no grades yet
输入样例3:
在这里给出一组输入。例如:
java 必修 实验
20201103 张三 java 3 70 80 90 100
end
输出样例3:
在这里给出相应的输出。例如:
java : course type & access mode mismatch
wrong format
输入样例4:
在这里给出一组输入。例如:
java 必修 实验
20201103 张三 java 4 70 80 90 105
end
输出样例4:
在这里给出相应的输出。例如:
java : course type & access mode mismatch
wrong format
输入样例5:
在这里给出一组输入。例如:
java 选修 考察
C语言 选修 考察
java实验 实验 实验
编译原理 必修 考试
20201101 王五 C语言 76
20201216 李四 C语言 78
20201307 张少军 编译原理 82 84
20201103 张三 java实验 4 70 80 90 100
20201118 郑觉先 java 80
20201328 刘和宇 java 77
20201220 朱重九 java实验 4 60 60 80 80
20201132 王萍 C语言 40
20201302 李梦涵 C语言 68
20201325 崔瑾 编译原理 80 84
20201213 黄红 java 82
20201209 赵仙芝 java 76
end
输出样例5:
在这里给出相应的输出。例如:
20201101 王五 76
20201103 张三 85
20201118 郑觉先 80
20201132 王萍 40
20201209 赵仙芝 76
20201213 黄红 82
20201216 李四 78
20201220 朱重九 70
20201302 李梦涵 68
20201307 张少军 83
20201325 崔瑾 82
20201328 刘和宇 77
C语言 65 65
java 78 78
java实验 77
编译原理 81 84 82
202011 70
202012 76
202013 77
代码展示:
 
1 import java.util.ArrayList; 2 import java.util.Scanner; 3 import java.util.Collections; 4 import java.text.Collator; 5 import java.util.Comparator; 6 import java.util.Locale; 7 8 public class Main { 9 10 public static void main(String[] args) { 11 Scanner input = new Scanner(System.in); 12 ArrayList<String> inputs = new ArrayList<>(); 13 14 String info = input.nextLine(); 15 while(!info.equals("end")){ 16 inputs.add(info); 17 info = input.nextLine(); 18 } 19 inputs.add(info); 20 ArrayList<Course> courses = new ArrayList<>(); 21 ArrayList<Class1> classes = new ArrayList<>(); 22 ArrayList<Student> stu = new ArrayList<>(); 23 ArrayList<Selection> selections = new ArrayList<>(); 24 25 int i,j,k,n,m,q; 26 for(i = 0;!inputs.get(i).equals("end");i++) { 27 String[] Info = inputs.get(i).split(" "); 28 if (inputs.get(i).matches(".{1,10}\\s(((必修|选修|实验)\\s(考试|考察|实验))|(必修))")) { 29 if (inputs.get(i).contains("必修")) { 30 31 if (inputs.get(i).contains("考察")||inputs.get(i).contains("实验")) { 32 System.out.println(Info[0] + " : course type & access mode mismatch"); 33 } else { 34 if (courses.size() == 0) { 35 Course course = new Course(Info[0], Info[1], "考试"); 36 courses.add(course); 37 } else { 38 for (j = 0; j < courses.size(); j++) { 39 if (courses.get(j).getLessonName().equals(Info[0])) { 40 break; 41 } 42 } 43 if (j == courses.size()) { 44 Course course = new Course(Info[0], Info[1], "考试"); 45 courses.add(course); 46 } 47 } 48 } 49 } else if (inputs.get(i).contains("选修")) { 50 if (inputs.get(i).contains("实验")) { 51 System.out.println(Info[0] + " : course type & access mode mismatch"); 52 }else{ 53 if (courses.size() == 0) { 54 Course course = new Course(Info[0], Info[1], Info[2]); 55 courses.add(course); 56 } else { 57 for (j = 0; j < courses.size(); j++) { 58 if (courses.get(j).getLessonName().equals(Info[0])) { 59 break; 60 } 61 } 62 if (j == courses.size()) { 63 Course course = new Course(Info[0], Info[1], Info[2]); 64 courses.add(course); 65 } 66 } 67 } 68 } 69 else if(inputs.get(i).contains("实验")){ 70 if(inputs.get(i).contains("考试")||inputs.get(i).contains("考察")){ 71 System.out.println(Info[0] + " : course type & access mode mismatch"); 72 } 73 else { 74 if (courses.size() == 0) { 75 Course course = new Course(Info[0], Info[1], Info[2]); 76 courses.add(course); 77 } else { 78 for (j = 0; j < courses.size(); j++) { 79 if (courses.get(j).getLessonName().equals(Info[0])) { 80 break; 81 } 82 } 83 if (j == courses.size()) { 84 Course course = new Course(Info[0], Info[1], Info[2]); 85 courses.add(course); 86 } 87 } 88 } 89 } 90 } 91 else if(inputs.get(i).matches("[\\d]{8}(\\s([\\u4e00-\\u9fa5]|[\\w]){1,10}){2}(\\s([\\d]{1,2}|100)){1,2}")) { 92 for (j = 0; j < classes.size(); j++) { 93 if (classes.get(j).getNum().equals(Info[0].substring(0, 6))) { 94 break;//找到了 95 } 96 } 97 if (j == classes.size()) {//班级不存在 98 Class1 class1 = new Class1(Info[0].substring(0, 6)); 99 classes.add(class1); 100 } 101 for (k = 0; k < classes.get(j).students.size(); k++) { 102 if (classes.get(j).students.get(k).getId().equals(Info[0])) { 103 break;//学生存在 104 } 105 } 106 if (k == classes.get(j).students.size()) {//学生不存在 107 Student student = new Student(Info[0], Info[1]); 108 classes.get(j).students.add(student); 109 stu.add(student); 110 } 111 if (Info.length == 4) {//选修考察 112 113 int flag = 0; 114 for (n = 0; n < courses.size(); n++) { 115 if (courses.get(n).getLessonName().equals(Info[2])) { 116 break; 117 } 118 } 119 if (n == courses.size()) { 120 System.out.println(Info[2] + " does not exist"); 121 flag = 1; 122 } 123 if (courses.size() > 0) { 124 if (flag == 0) { 125 if (courses.get(n).getTestWay().equals("考察")) { 126 for (m = 0; m < selections.size(); m++) { 127 if (selections.get(m).getStudent().getId().equals(classes.get(j).students.get(k).getId()) 128 && selections.get(m).getCourse().getLessonName().equals(courses.get(n).getLessonName())) { 129 break; 130 } 131 } 132 if (m == selections.size()) { 133 int fGrade = Integer.parseInt(Info[3]); 134 Score examine = new Examine(fGrade); 135 Selection selection = new Selection(courses.get(n), classes.get(j).students.get(k), examine); 136 selections.add(selection); 137 } 138 } 139 else if(courses.get(n).getTestWay().equals("实验")&&(Integer.parseInt(Info[3])<4||Integer.parseInt(Info[3])>9)){ 140 classes.remove(classes.size()-1); 141 stu.remove(stu.size()-1); 142 System.out.println("wrong format"); 143 } 144 else{ 145 System.out.println(classes.get(j).students.get(k).getId() + " " + 146 classes.get(j).students.get(k).getName() + " : " + "access mode mismatch"); 147 } 148 } 149 } 150 } else if (Info.length == 5) {//考试 151 152 int flag = 0; 153 for (n = 0; n < courses.size(); n++) { 154 if (courses.get(n).getLessonName().equals(Info[2])) { 155 break; 156 } 157 } 158 if (n == courses.size()) { 159 System.out.println(Info[2] + " does not exist"); 160 flag = 1; 161 } 162 if (courses.size() > 0) { 163 if(flag == 0) { 164 if (courses.get(n).getTestWay().equals("考试")) { 165 for (m = 0; m < selections.size(); m++) { 166 if (selections.get(m).getStudent().getId().equals(classes.get(j).students.get(k).getId()) 167 && selections.get(m).getCourse().getLessonName().equals(courses.get(n).getLessonName())) { 168 break; 169 } 170 } 171 if (m == selections.size()) { 172 int uGrade = Integer.parseInt(Info[3]); 173 int fGrade = Integer.parseInt(Info[4]); 174 Score examScore = new ExamScore(uGrade, fGrade); 175 Selection selection = new Selection(courses.get(n), classes.get(j).students.get(k), examScore); 176 selections.add(selection); 177 } 178 } else if(courses.get(n).getTestWay().equals("实验")&&(Integer.parseInt(Info[3])<4||Integer.parseInt(Info[3])>9)){ 179 classes.remove(classes.size()-1); 180 stu.remove(stu.size()-1); 181 System.out.println("wrong format"); 182 } 183 else { 184 System.out.println(classes.get(j).students.get(k).getId() + " " + 185 classes.get(j).students.get(k).getName() + " : " + "access mode mismatch"); 186 } 187 } 188 } 189 } 190 } 191 else if (inputs.get(i).matches 192 ("[\\d]{8}(\\s([\\u4e00-\\u9fa5]|[\\w]){1,10}){2}\\s[4-9](\\s([\\d]{1,2}|100))+")){ 193 for (j = 0; j < classes.size(); j++) { 194 if (classes.get(j).getNum().equals(Info[0].substring(0, 6))) { 195 break;//找到了 196 } 197 } 198 if (j == classes.size()) {//班级不存在 199 Class1 class1 = new Class1(Info[0].substring(0, 6)); 200 classes.add(class1); 201 } 202 for (k = 0; k < classes.get(j).students.size(); k++) { 203 if (classes.get(j).students.get(k).getId().equals(Info[0])) { 204 break;//学生存在 205 } 206 } 207 if (k == classes.get(j).students.size()) {//学生不存在 208 Student student = new Student(Info[0], Info[1]); 209 classes.get(j).students.add(student); 210 stu.add(student); 211 } 212 int flag = 0; 213 int testScores = 0; 214 for (n = 0; n < courses.size(); n++) { 215 if (courses.get(n).getLessonName().equals(Info[2])) { 216 break; 217 } 218 } 219 if (n == courses.size()) { 220 System.out.println(Info[2] + " does not exist"); 221 flag = 1; 222 } 223 if (courses.size() > 0) { 224 if(flag == 0) { 225 if(!courses.get(n).getTestWay().equals("实验")){ 226 classes.remove(classes.size()-1); 227 stu.remove(stu.size()-1); 228 System.out.println("wrong format"); 229 } 230 else{ 231 if (courses.get(n).getTestWay().equals("实验")&&Info.length - 4== Integer.parseInt(Info[3])) { 232 for (m = 0; m < selections.size(); m++) { 233 if (selections.get(m).getStudent().getId().equals(classes.get(j).students.get(k).getId()) 234 && selections.get(m).getCourse().getLessonName().equals(courses.get(n).getLessonName())) { 235 break; 236 } 237 } 238 if (m == selections.size()) { 239 for(q = 4;q < Info.length;q++) 240 testScores = testScores + Integer.parseInt(Info[q]); 241 Score testScore = new TestScore(testScores,Integer.parseInt(Info[3])); 242 Selection selection = new Selection(courses.get(n), classes.get(j).students.get(k), testScore); 243 selections.add(selection); 244 } 245 } else { 246 System.out.println(classes.get(j).students.get(k).getId() + " " + 247 classes.get(j).students.get(k).getName() + " : " + "access mode mismatch"); 248 } 249 } 250 } 251 } 252 } 253 else System.out.println("wrong format"); 254 } 255 //排序 256 ArrayList<Integer> averScore = new ArrayList<>(); 257 ArrayList<Integer> gradeSize = new ArrayList<>(); 258 for(i = 0;i < stu.size();i++){ 259 averScore.add(stu.get(i).getAverageScore()); 260 261 gradeSize.add(stu.get(i).grades.size()); 262 } 263 264 for(i = 0;i < stu.size()-1;i++){ 265 String temp; 266 int tp; 267 for(j = 0;j < stu.size()-1-i;j++) { 268 if(stu.get(j + 1).getIntId() < stu.get(j).getIntId()){ 269 temp = stu.get(j+1).getId(); 270 stu.get(j+1).setId(stu.get(j).getId()); 271 stu.get(j).setId(temp); 272 temp = stu.get(j+1).getName(); 273 stu.get(j+1).setName(stu.get(j).getName()); 274 stu.get(j).setName(temp); 275 tp = averScore.get(j+1); 276 averScore.set(j+1,averScore.get(j)); 277 averScore.set(j,tp); 278 tp = gradeSize.get(j+1); 279 gradeSize.set(j+1,gradeSize.get(j)); 280 gradeSize.set(j,tp); 281 } 282 } 283 } 284 ArrayList<Integer> averUgrade = new ArrayList<>(); 285 ArrayList<Integer> averFgrade = new ArrayList<>(); 286 ArrayList<Integer> averGrade = new ArrayList<>(); 287 Collections.sort(courses); 288 for(i = 0;i < courses.size();i++){ 289 averUgrade.add(courses.get(i).getAverageUrades()); 290 averFgrade.add(courses.get(i).getAverageFrades()); 291 averGrade.add(courses.get(i).getAverageScore()); 292 } 293 for(i = 0;i < stu.size();i++){ 294 System.out.print(stu.get(i).getId()+" "+stu.get(i).getName()+" "); 295 if(gradeSize.get(i)!= 0) { 296 System.out.println(averScore.get(i)); 297 } 298 else System.out.println("did not take any exams"); 299 } 300 for(i = 0;i < courses.size();i++) { 301 System.out.print(courses.get(i).getLessonName() + " "); 302 if (courses.get(i).grades.size() != 0) { 303 if (courses.get(i).getTestWay().equals("考试")) { 304 System.out.print(averUgrade.get(i) + " "); 305 306 System.out.print(averFgrade.get(i) + " "); 307 } else if(courses.get(i).getTestWay().equals("考察")) 308 System.out.print(averFgrade.get(i) + " "); 309 310 System.out.println(averGrade.get(i)); 311 } 312 else System.out.println("has no grades yet"); 313 } 314 ArrayList<Integer> classScore = new ArrayList<>(); 315 for(i = 0;i < classes.size();i++){ 316 classScore.add(classes.get(i).getClassScore()); 317 } 318 for(i = 0;i < classes.size()-1;i++){ 319 String temp; 320 int tp; 321 for(j = 0;j < classes.size()-1-i;j++){ 322 if(classes.get(j+1).getIntNum() < classes.get(j).getIntNum()){ 323 temp = classes.get(j+1).getNum(); 324 classes.get(j+1).setNum( classes.get(j).getNum()); 325 classes.get(j).setNum(temp); 326 tp = classScore.get(j+1); 327 classScore.set(j+1,classScore.get(j)); 328 classScore.set(j,tp); 329 } 330 } 331 } 332 for(i = 0;i < classes.size();i++){ 333 System.out.print(classes.get(i).getNum()+" "); 334 if(classScore.get(i) != 0) 335 System.out.println(classScore.get(i)); 336 else System.out.println("has no grades yet"); 337 } 338 } 339 } 340 abstract class Score { 341 private int Fgrade; 342 private int Ugrade; 343 public Score(int fgrade) { 344 Fgrade = fgrade; 345 } 346 public Score(int ugrade, int fgrade) { 347 super(); 348 Ugrade = ugrade; 349 Fgrade = fgrade; 350 } 351 public abstract int getScore(); 352 public int getUgrade() { 353 return Ugrade; 354 } 355 public int getFgrade() { 356 return Fgrade; 357 } 358 } 359 class Examine extends Score{ 360 public Examine(int fgrade){ 361 super(fgrade); 362 } 363 @Override 364 public int getScore(){ 365 return (int)( this.getFgrade()); 366 } 367 } 368 class ExamScore extends Score{ 369 public ExamScore(int ugrade, int fgrade) { 370 super(ugrade, fgrade); 371 } 372 @Override 373 public int getScore(){ 374 return (int)(this.getUgrade()*0.3 + this.getFgrade()*0.7); 375 } 376 } 377 class TestScore extends Score{ 378 379 public TestScore(int testScores,int num){ 380 super(testScores,num); 381 } 382 @Override 383 public int getScore(){ 384 if(this.getFgrade() != 0) 385 return this.getUgrade()/this.getFgrade(); 386 else return 0; 387 } 388 } 389 class Course implements Comparable<Course> { 390 private String lessonName; 391 private String lessonAttribute; 392 private String testWay; 393 394 ArrayList<Integer> grades = new ArrayList<>(); 395 ArrayList<Integer> Ugrades = new ArrayList<>(); 396 ArrayList<Integer> Fgrades = new ArrayList<>(); 397 public Course(String lessonName) { 398 super(); 399 this.lessonName = lessonName; 400 } 401 public Course(String lessonName, String lessonAttribute, String testWay) { 402 super(); 403 this.lessonName = lessonName; 404 this.lessonAttribute = lessonAttribute; 405 this.testWay = testWay; 406 } 407 public String getLessonName() {return lessonName;} 408 public String getLessonAttribute() { 409 return lessonAttribute; 410 } 411 public String getTestWay() { 412 return testWay; 413 } 414 public int getAverageScore() { 415 int total = 0; 416 for(int i = 0;i < grades.size();i++){ 417 total = total + grades.get(i); 418 } 419 if(grades.size() != 0) 420 return total/grades.size(); 421 else return 0; 422 } 423 public int getAverageUrades() { 424 int total = 0; 425 for(int i = 0;i < Ugrades.size();i++){ 426 total = total + Ugrades.get(i); 427 } 428 if(Ugrades.size() != 0) 429 return total/Ugrades.size(); 430 else return 0; 431 } 432 public int getAverageFrades() { 433 int total = 0; 434 for(int i = 0;i < Fgrades.size();i++){ 435 total = total + Fgrades.get(i); 436 } 437 if(Fgrades.size() != 0) 438 return total/Fgrades.size(); 439 else return 0; 440 } 441 @Override 442 public int compareTo(Course cou) { 443 Comparator<Object> com = Collator.getInstance(Locale.CHINA); 444 return ((Collator) com).compare(this.lessonName,cou.getLessonName()); 445 } 446 } 447 class Class1 { 448 private String num; 449 ArrayList<Student> students = new ArrayList<>(); 450 public Class1(String num) { 451 this.num = num; 452 } 453 public String getNum() { 454 return num; 455 } 456 public void setNum(String num){ 457 this.num = num; 458 } 459 public int getIntNum(){ 460 return Integer.parseInt(num); 461 } 462 public int getClassScore(){ 463 int total = 0; 464 for(int i = 0;i < this.students.size();i++){ 465 total = total +this.students.get(i).getAverageScore(); 466 } 467 if(this.students.size() == 0){ 468 return 0; 469 } 470 else return total/this.students.size(); 471 } 472 } 473 class Selection { 474 private Course course; 475 private Student student; 476 private Score score; 477 public Selection(Course course, Student student, Score score) { 478 this.course = course; 479 this.student = student; 480 this.score = score; 481 this.student.grades.add(score.getScore()); 482 this.course.grades.add(score.getScore()); 483 if(course.getTestWay().equals("考试")){ 484 this.course.Ugrades.add(score.getUgrade()); 485 this.course.Fgrades.add(score.getFgrade()); 486 } 487 else if(course.getTestWay().equals("考察")){ 488 this.course.Fgrades.add(score.getFgrade()); 489 } 490 } 491 public Course getCourse() { 492 return course; 493 } 494 public Student getStudent() { 495 return student; 496 } 497 public Score getScore() { 498 return score; 499 } 500 } 501 class Student { 502 private String id; 503 private String name; 504 ArrayList<Integer> grades = new ArrayList<>(); 505 private int averScore; 506 public Student(String id,String name) { 507 this.id = id; 508 this.name = name; 509 } 510 public String getName() { 511 return name; 512 } 513 public void setName(String name) { 514 this.name = name; 515 } 516 public String getId() { 517 return id; 518 } 519 public int getIntId(){ 520 return Integer.parseInt(id); 521 } 522 public void setId(String id) { 523 this.id = id; 524 } 525 public int getAverageScore() { 526 int total = 0; 527 for(int i = 0;i < grades.size();i++){ 528 total = total + grades.get(i); 529 } 530 if(grades.size() != 0) { 531 this.averScore = total / grades.size(); 532 return averScore; 533 } 534 else return 0; 535 } 536 }
类图如下:


 分析如下:
1.该题是上次作业的课程成绩统计程序题的迭代,所以根据上次做的题目来解决这题就十分轻松。
2.在上次题目的基础上添加一个实验类课程即可,整体难度不大,但容易忽略一些细节,导致无法得到满分。
第五次作业
第一题
7-2 课程成绩统计程序-3
题目如下:
课程成绩统计程序-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)成绩平均分只取整数部分,小数部分丢弃
参考类图(与第一次相同,其余内容自行补充):

输入样例1:
在这里给出一组输入。例如:
java 实验 实验 4 0.2 0.3 0.2 0.3
end
输出样例1:
在这里给出相应的输出。例如:
java has no grades yet
输入样例2:
在这里给出一组输入。例如:
java 实验 实验 4 0.2 0.3 0.2
end
输出样例2:
在这里给出相应的输出。例如:
java : number of scores does not match
输入样例3:
在这里给出一组输入。例如:
java 实验 实验 4 0.2 0.3 0.2 0.1
end
输出样例3:
在这里给出相应的输出。例如:
java : weight value error
输入样例4:
在这里给出一组输入。例如:
java 实验 实验 4 0.2 0.3 0.2 0.3
20201116 张三 java 70 80 90 100
end
输出样例4:
在这里给出相应的输出。例如:
20201116 张三 86
java 86
202011 86
输入样例5:
在这里给出一组输入。例如:
java 实验 实验 4 0.2 0.3 0.2 0.3
20201116 张三 java 70 80 90 100 80
end
输出样例5:
在这里给出相应的输出。例如:
20201116 张三 : access mode mismatch
20201116 张三 did not take any exams
java has no grades yet
202011 has no grades yet
代码展示:
 
1 import java.util.ArrayList; 2 import java.util.Collections; 3 import java.util.Scanner; 4 import java.text.Collator; 5 import java.util.Comparator; 6 import java.util.Locale; 7 public class Main { 8 public static void main(String[] args) { 9 Scanner input = new Scanner(System.in); 10 ArrayList<String> inputs = new ArrayList<>(); 11 12 String info = input.nextLine(); 13 while(!info.equals("end")){ 14 inputs.add(info); 15 info = input.nextLine(); 16 } 17 inputs.add(info); 18 ArrayList<Course> courses = new ArrayList<>(); 19 ArrayList<Class1> classes = new ArrayList<>(); 20 ArrayList<Student> stu = new ArrayList<>(); 21 ArrayList<Selection> selections = new ArrayList<>(); 22 ArrayList<WeightScore> weightScores = new ArrayList<>(); 23 int i,j,k,n,m,q; 24 double sum = 0; 25 int flag1 = 0; 26 for(i = 0;!inputs.get(i).equals("end");i++) { 27 ArrayList<Double> weights = new ArrayList<>(); 28 ArrayList<Integer> grades = new ArrayList<>(); 29 String[] Info = inputs.get(i).split(" "); 30 if (inputs.get(i).matches("([\\u4e00-\\u9fa5]|[\\w]){1,10}\\s(必修|选修|实验)" + 31 "\\s((考试(\\s0\\.[\\d]*[1-9]){2})|(考察)|(实验\\s[4-9](\\s0\\.[\\d]*[1-9])*))")) { 32 if (Info[1].equals("必修")) { 33 flag1 = 0; 34 sum = 0; 35 if (Info[2].equals("考察")||Info[2].equals("实验")) { 36 System.out.println(Info[0] + " : course type & access mode mismatch"); 37 flag1 = 1; 38 } 39 if(flag1 == 0){ 40 for(j = 3;j < Info.length;j++){ 41 sum += Double.parseDouble(Info[j]); 42 } 43 if(Math.abs(sum - 1) > 0.0000001 ){ 44 System.out.println(Info[0]+" : weight value error"); 45 flag1 = 1; 46 } 47 } 48 if (flag1 == 0){ 49 if (courses.size() == 0) { 50 Course course = new Course(Info[0], Info[1], "考试"); 51 course.weight.add(Double.parseDouble(Info[3])); 52 course.weight.add(Double.parseDouble(Info[4])); 53 courses.add(course); 54 } else { 55 for (j = 0; j < courses.size(); j++) { 56 if (courses.get(j).getLessonName().equals(Info[0])) { 57 break; 58 } 59 } 60 if (j == courses.size()) { 61 Course course = new Course(Info[0], Info[1], "考试"); 62 course.weight.add(Double.parseDouble(Info[3])); 63 course.weight.add(Double.parseDouble(Info[4])); 64 courses.add(course); 65 } 66 } 67 } 68 } else if (Info[1].equals("选修")) { 69 if (Info[2].equals("实验")) { 70 System.out.println(Info[0] + " : course type & access mode mismatch"); 71 }else{ 72 if (courses.size() == 0) { 73 Course course = new Course(Info[0], Info[1], Info[2]); 74 course.weight.add(1.0); 75 courses.add(course); 76 } else { 77 for (j = 0; j < courses.size(); j++) { 78 if (courses.get(j).getLessonName().equals(Info[0])) { 79 break; 80 } 81 } 82 if (j == courses.size()) { 83 Course course = new Course(Info[0], Info[1], Info[2]); 84 course.weight.add(1.0); 85 courses.add(course); 86 } 87 } 88 } 89 } 90 else if(Info[1].equals("实验")){ 91 flag1 = 0; 92 sum = 0; 93 if(Info[2].equals("考试")||Info[2].equals("考察")){ 94 System.out.println(Info[0] + " : course type & access mode mismatch"); 95 flag1 = 1; 96 } 97 if(flag1 == 0) { 98 if (Info.length - 4 != Integer.parseInt(Info[3])) { 99 System.out.println(Info[0] + " : number of scores does not match"); 100 flag1 = 1; 101 } 102 } 103 if(flag1 == 0) { 104 for (j = 4; j < Info.length; j++) { 105 sum += Double.parseDouble(Info[j]); 106 } 107 if (Math.abs(sum - 1) > 0.0000001 ) { 108 System.out.println(Info[0] + " : weight value error"); 109 flag1 = 1; 110 } 111 } 112 if(flag1 == 0){ 113 if (courses.size() == 0) { 114 Course course = new Course(Info[0], Info[1], Info[2]); 115 for(j = 4;j < Info.length;j++){ 116 course.weight.add(Double.parseDouble(Info[j]));//把权重当作课程的属性 117 } 118 courses.add(course); 119 } else { 120 for (j = 0; j < courses.size(); j++) { 121 if (courses.get(j).getLessonName().equals(Info[0])) { 122 break; 123 } 124 } 125 if (j == courses.size()) { 126 Course course = new Course(Info[0], Info[1], Info[2]); 127 for(j = 4;j < Info.length;j++){ 128 course.weight.add(Double.parseDouble(Info[j])); 129 } 130 courses.add(course); 131 } 132 } 133 } 134 } 135 } 136 else if(inputs.get(i).matches("[\\d]{8}(\\s([\\u4e00-\\u9fa5]|[\\w]){1,10}){2}(\\s([\\d]{1,2}|100)){1,2}")) { 137 for (j = 0; j < classes.size(); j++) { 138 if (classes.get(j).getNum().equals(Info[0].substring(0, 6))) { 139 break;//找到了 140 } 141 } 142 if (j == classes.size()) {//班级不存在 143 Class1 class1 = new Class1(Info[0].substring(0, 6)); 144 classes.add(class1); 145 } 146 for (k = 0; k < classes.get(j).students.size(); k++) { 147 if (classes.get(j).students.get(k).getId().equals(Info[0])) { 148 break;//学生存在 149 } 150 } 151 if (k == classes.get(j).students.size()) {//学生不存在 152 Student student = new Student(Info[0], Info[1]); 153 classes.get(j).students.add(student); 154 stu.add(student); 155 } 156 if (Info.length == 4) {//选修考察 157 158 int flag = 0; 159 for (n = 0; n < courses.size(); n++) { 160 if (courses.get(n).getLessonName().equals(Info[2])) { 161 break; 162 } 163 } 164 if (n == courses.size()) { 165 System.out.println(Info[2] + " does not exist"); 166 flag = 1; 167 } 168 if (courses.size() > 0) { 169 if (flag == 0) { 170 if (courses.get(n).getTestWay().equals("考察")) { 171 for (m = 0; m < selections.size(); m++) { 172 if (selections.get(m).getStudent().getId().equals(classes.get(j).students.get(k).getId()) 173 && selections.get(m).getCourse().getLessonName().equals(courses.get(n).getLessonName())) { 174 break; 175 } 176 } 177 if (m == selections.size()) { 178 WeightScore Wscore = new WeightScore(courses.get(n).weight); 179 Wscore.Cscores.add(Integer.parseInt(Info[3])); 180 Score examine = new Score(Wscore); 181 Selection selection = new Selection(courses.get(n), classes.get(j).students.get(k),examine); 182 selections.add(selection); 183 } 184 } 185 else{ 186 System.out.println(classes.get(j).students.get(k).getId() + " " + 187 classes.get(j).students.get(k).getName() + " : " + "access mode mismatch"); 188 } 189 } 190 } 191 } else if (Info.length == 5) {//考试 192 int flag = 0; 193 for (n = 0; n < courses.size(); n++) { 194 if (courses.get(n).getLessonName().equals(Info[2])) { 195 break; 196 } 197 } 198 if (n == courses.size()) { 199 System.out.println(Info[2] + " does not exist"); 200 flag = 1; 201 } 202 if (courses.size() > 0) { 203 if(flag == 0) { 204 if (courses.get(n).getTestWay().equals("考试")) { 205 for (m = 0; m < selections.size(); m++) { 206 if (selections.get(m).getStudent().getId().equals(classes.get(j).students.get(k).getId()) 207 && selections.get(m).getCourse().getLessonName().equals(courses.get(n).getLessonName())) { 208 break; 209 } 210 } 211 if (m == selections.size()) { 212 WeightScore Wscore = new WeightScore(courses.get(n).weight); 213 Wscore.Cscores.add(Integer.parseInt(Info[3])); 214 Wscore.Cscores.add(Integer.parseInt(Info[4])); 215 Score examScore = new Score(Wscore); 216 Selection selection = new Selection(courses.get(n), classes.get(j).students.get(k), examScore); 217 selections.add(selection); 218 } 219 } 220 else { 221 System.out.println(classes.get(j).students.get(k).getId() + " " + 222 classes.get(j).students.get(k).getName() + " : " + "access mode mismatch"); 223 } 224 } 225 } 226 } 227 } 228 else if (inputs.get(i).matches 229 ("[\\d]{8}(\\s([\\u4e00-\\u9fa5]|[\\w]){1,10}){2}(\\s([\\d]{1,2}|100))*")){ 230 for (j = 0; j < classes.size(); j++) { 231 if (classes.get(j).getNum().equals(Info[0].substring(0, 6))) { 232 break;//找到了 233 } 234 } 235 if (j == classes.size()) {//班级不存在 236 Class1 class1 = new Class1(Info[0].substring(0, 6)); 237 classes.add(class1); 238 } 239 for (k = 0; k < classes.get(j).students.size(); k++) { 240 if (classes.get(j).students.get(k).getId().equals(Info[0])) { 241 break;//学生存在 242 } 243 } 244 if (k == classes.get(j).students.size()) {//学生不存在 245 Student student = new Student(Info[0], Info[1]); 246 classes.get(j).students.add(student); 247 stu.add(student); 248 } 249 int flag = 0; 250 int testScores = 0; 251 for (n = 0; n < courses.size(); n++) { 252 if (courses.get(n).getLessonName().equals(Info[2])) { 253 break; 254 } 255 } 256 if (n == courses.size()) { 257 System.out.println(Info[2] + " does not exist"); 258 flag = 1; 259 } 260 if (courses.size() > 0) { 261 if(flag == 0) { 262 if (courses.get(n).getTestWay().equals("实验")&&Info.length - 3 == courses.get(n).weight.size()) { 263 for (m = 0; m < selections.size(); m++) { 264 if (selections.get(m).getStudent().getId().equals(classes.get(j).students.get(k).getId()) 265 && selections.get(m).getCourse().getLessonName().equals(courses.get(n).getLessonName())) { 266 break; 267 } 268 } 269 if (m == selections.size()) { 270 WeightScore Wscore = new WeightScore(courses.get(n).weight); 271 for(q = 3;q < Info.length;q++) 272 Wscore.Cscores.add(Integer.parseInt(Info[q])); 273 Score testScore = new Score(Wscore); 274 Selection selection = new Selection(courses.get(n), classes.get(j).students.get(k), testScore); 275 selections.add(selection); 276 } 277 } else { 278 System.out.println(classes.get(j).students.get(k).getId() + " " + 279 classes.get(j).students.get(k).getName() + " : " + "access mode mismatch"); 280 } 281 } 282 } 283 } 284 else System.out.println("wrong format"); 285 } 286 287 //排序 288 ArrayList<Integer> averScore = new ArrayList<>(); 289 ArrayList<Integer> gradeSize = new ArrayList<>(); 290 for(i = 0;i < stu.size();i++){ 291 averScore.add(stu.get(i).getAverageScore()); 292 gradeSize.add(stu.get(i).grades.size()); 293 } 294 295 for(i = 0;i < stu.size()-1;i++){ 296 String temp; 297 int tp; 298 for(j = 0;j < stu.size()-1-i;j++) { 299 if(stu.get(j + 1).getIntId() < stu.get(j).getIntId()){ 300 temp = stu.get(j+1).getId(); 301 stu.get(j+1).setId(stu.get(j).getId()); 302 stu.get(j).setId(temp); 303 temp = stu.get(j+1).getName(); 304 stu.get(j+1).setName(stu.get(j).getName()); 305 stu.get(j).setName(temp); 306 tp = averScore.get(j+1); 307 averScore.set(j+1,averScore.get(j)); 308 averScore.set(j,tp); 309 tp = gradeSize.get(j+1); 310 gradeSize.set(j+1,gradeSize.get(j)); 311 gradeSize.set(j,tp); 312 } 313 } 314 } 315 ArrayList<Integer> averGrade = new ArrayList<>(); 316 Collections.sort(courses); 317 for(i = 0;i < courses.size();i++){ 318 averGrade.add(courses.get(i).getAverageScore()); 319 } 320 for(i = 0;i < stu.size();i++){ 321 System.out.print(stu.get(i).getId()+" "+stu.get(i).getName()+" "); 322 if(gradeSize.get(i)!= 0) { 323 System.out.println(averScore.get(i)); 324 } 325 else System.out.println("did not take any exams"); 326 } 327 for(i = 0;i < courses.size();i++) { 328 System.out.print(courses.get(i).getLessonName() + " "); 329 if (courses.get(i).grades.size() != 0) { 330 System.out.println(averGrade.get(i)); 331 } 332 else System.out.println("has no grades yet"); 333 } 334 ArrayList<Integer> classScore = new ArrayList<>(); 335 for(i = 0;i < classes.size();i++){ 336 classScore.add(classes.get(i).getClassScore()); 337 } 338 for(i = 0;i < classes.size()-1;i++){ 339 String temp; 340 int tp; 341 for(j = 0;j < classes.size()-1-i;j++){ 342 if(classes.get(j+1).getIntNum() < classes.get(j).getIntNum()){ 343 temp = classes.get(j+1).getNum(); 344 classes.get(j+1).setNum( classes.get(j).getNum()); 345 classes.get(j).setNum(temp); 346 tp = classScore.get(j+1); 347 classScore.set(j+1,classScore.get(j)); 348 classScore.set(j,tp); 349 } 350 } 351 } 352 for(i = 0;i < classes.size();i++){ 353 System.out.print(classes.get(i).getNum()+" "); 354 if(classScore.get(i) != 0) 355 System.out.println(classScore.get(i)); 356 else System.out.println("has no grades yet"); 357 } 358 // for(i = 0;i < courses.size();i++) { 359 // System.out.println(courses.get(i).getLessonName()); 360 // System.out.println(courses.get(i).getLessonAttribute()); 361 // } 362 } 363 } 364 class WeightScore { 365 ArrayList<Integer> Cscores = new ArrayList<>(); 366 ArrayList<Double> weights = new ArrayList<>(); 367 public WeightScore() { 368 } 369 public WeightScore(ArrayList<Double> weights) { 370 this.weights = weights; 371 } 372 public WeightScore(ArrayList<Integer> cscores, ArrayList<Double> weights) { 373 Cscores = cscores; 374 this.weights = weights; 375 } 376 } 377 class Score { 378 private WeightScore weightScore; 379 public Score(WeightScore weightScore){ 380 this.weightScore = weightScore; 381 } 382 public int getScore(){ 383 double totalScore = 0; 384 for(int i = 0;i < weightScore.weights.size();i++){ 385 totalScore += weightScore.weights.get(i) * weightScore.Cscores.get(i); 386 } 387 return (int)totalScore; 388 } 389 } 390 class Selection { 391 private Course course; 392 private Student student; 393 private Score score; 394 public Selection(Course course, Student student, Score score) { 395 this.course = course; 396 this.student = student; 397 this.score = score; 398 this.student.grades.add(score.getScore()); 399 this.course.grades.add(score.getScore()); 400 } 401 public Course getCourse() { 402 return course; 403 } 404 public Student getStudent() { 405 return student; 406 } 407 public Score getScore() { 408 return score; 409 } 410 } 411 class Student { 412 private String id; 413 private String name; 414 ArrayList<Integer> grades = new ArrayList<>(); 415 416 private int averScore; 417 public Student(String id,String name) { 418 this.id = id; 419 this.name = name; 420 } 421 public String getName() { 422 return name; 423 } 424 425 public void setName(String name) { 426 this.name = name; 427 } 428 public String getId() { 429 return id; 430 } 431 public int getIntId(){ 432 return Integer.parseInt(id); 433 } 434 public void setId(String id) { 435 this.id = id; 436 } 437 public int getAverageScore() { 438 int total = 0; 439 for(int i = 0;i < grades.size();i++){ 440 total = total + grades.get(i); 441 } 442 if(grades.size() != 0) { 443 this.averScore = total / grades.size(); 444 return averScore; 445 } 446 else return 0; 447 } 448 } 449 class Course implements Comparable<Course> { 450 private String lessonName; 451 private String lessonAttribute;//课程属性 452 private String testWay;//必修课可以没有 453 454 ArrayList<Integer> grades = new ArrayList<>(); 455 ArrayList<Double> weight = new ArrayList<>(); 456 public Course(String lessonName) { 457 super(); 458 this.lessonName = lessonName; 459 } 460 public Course(String lessonName, String lessonAttribute, String testWay) { 461 super(); 462 this.lessonName = lessonName; 463 this.lessonAttribute = lessonAttribute; 464 this.testWay = testWay; 465 } 466 467 public String getLessonName() {return lessonName;} 468 public String getLessonAttribute() { 469 return lessonAttribute; 470 } 471 public String getTestWay() { 472 return testWay; 473 } 474 public int getAverageScore() { 475 int total = 0; 476 for(int i = 0;i < grades.size();i++){ 477 total = total + grades.get(i); 478 } 479 if(grades.size() != 0) 480 return total/grades.size(); 481 else return 0; 482 } 483 @Override 484 public int compareTo(Course cou) { 485 Comparator<Object> com = Collator.getInstance(Locale.CHINA); 486 return ((Collator) com).compare(this.lessonName,cou.getLessonName()); //升序 487 } 488 } 489 class Class1 { 490 private String num;//班号 491 ArrayList<Student> students = new ArrayList<>(); 492 public Class1(String num) { 493 this.num = num; 494 } 495 public String getNum() { 496 return num; 497 } 498 public void setNum(String num){ 499 this.num = num; 500 } 501 502 public int getIntNum(){ 503 return Integer.parseInt(num); 504 } 505 public int getClassScore(){ 506 int total = 0; 507 for(int i = 0;i < this.students.size();i++){ 508 total = total +this.students.get(i).getAverageScore(); 509 } 510 return total/this.students.size(); 511 } 512 }


分析如下:
1.该题为课程成绩统计程序-2的迭代,该题在上次题目的基础上改变了类间的关联关系,将继承关系改为了组合关系。
2.从类图和分析图可以看出来,这次题目的复杂度其实不高,有了上次题目的基础,这题就不算难题了。
3.这题比较注重细节,想要拿到满分十分困难,对学生找错误的能力有很高的要求。
(3)踩坑心得
第七次作业
7-1 菜单计价程序-5
分析如下:
由于在这题出现之前,我已经做过了菜单计价程序-3和菜单计价程序-4,所以即使看到这么长的题目也觉得没什么。
而且有了前两次的教训,我打起了十二分精神来应对这题。由于这题是菜单计价程序-3的迭代,所以我打算先根据菜单
计价程序-3编写,然后再根据菜单计价程序-5添加额外的东西。有了前两次的踩坑经验,这次题目终于有了头绪,最后
得到了83分

第八次作业
7-1 课程成绩统计程序-1
分析如下:
这次作业在逻辑上和上次题目有许多相似之处,但仍然有许多坑
这次的坑主要是正则表达式
修改前:


起初我以为在正则表的式中"."可以代表汉字,后来才明白"."可以代表任意字符,所以他无法代表汉字,后来才意识到这一点,
于是我上网搜索,这才得知汉字有特有的表达方式。
修改后:


起初没有注意到这道题的代码长度限制,于是在命名方面十分随意,导致代码的长度超出限制

后来为了减少代码长度,不得已删除了许多注释,缩减了许多名字的长度。
例如:
修改前:

修改后:

缩短了这个数组的名字长度
第九次作业
7-1 统计Java程序中关键词的出现次数
分析如下:
改进前:
起初我想要将一些没用的数学符号转化成空格,于是我采取了最笨的方法,一个一个换,但成绩不理想


改进后


直接使用正则表达式中的\\W代表所有的除了字母和数字外的字符。
第十次作业
7-3 课程成绩统计程序-2
分析如下:
这题是上次作业的迭代,只需要添加一些简单的东西即可。
但我认为这次题目的测试点过少,导致许多人虽然没有注意到一些错误的点仍然能够得到满分。
例如:
当输入

会输出

然而按照题目要求,java课是实验,而实验课的实验次数只能是4~9否则一律输出wrong format。
正确输出

第十一次作业
7-2 课程成绩统计程序-3
改进前:


改进之前我没有意识到double型的计算并不精准,不能直接用等号判断是否等于1,在一次测试中我让程序输出每次的sum值,
当我输入0.2,0.3,0.3,0.2时他们的和sum输出1.00000002,这才意识到这里有问题。
改进后:


在意识到这点错误后,我进行了修改将 sum != 1改成了 Math.abs(sum - 1) > 0.0000001。
(4)改进建议:
7-3 课程成绩统计程序-3
还是要多注重语法细节,很多时候总是会忘记一些十分重要的语法细节,比如忘记double型的数字计算不精确,
还有就是对一些常用类型的方法运用不够熟练。
7-1 统计Java程序中关键词的出现次数
需要加强对常用类型的认识和理解,对ArrayList和String运用不够熟练,不如不了解ArrayList型如何用set方法修改内容,不知道如何使用String类型的replace和
repalceAll方法替换字符串的特定字符。
7-1 菜单计价程序-5
应该注重对正则表式的运用和掌握,在这几次作业中能明显感受到正则表的式的作用十分强大,相信在之后的学习中,
正则表达式的使用将越来越频繁,但在这几次作业中我也认识到自己对正则表达使得掌握和理解还不够,特别是在匹配
长语句的时候。
7-1课程成绩统计程序-1
需要加深对类间关系的理解和认识,这次题目提供了类图给我们参考,要求我们根据类图编写程序,但看到题目给的类图后,
我发现我更加没有头绪了,我对题目给出的描述的理解和对类图的理解无法一一对应,但在我的认真思索下,我最终看懂了
这个类图的真正含义,捋清楚了各个类间的关系。
(5)总结
经过这几周的学习,我对面向对象编程有了更加深入的了解和认识,这几周不光学习了书本上的内容比如javaFx,还学习了许多课本外的
东西比如Stack,Queue和Map。除此之外,还进行了翻转课堂互动。在这几周的学习中,我学习了许多东西。(1)我学会了如何使用接口,
在课堂上,老师让我们写过一些和接口有关的题目,在这几次作业中,也出现了很多接口,我也通过作业的练习掌握了这一重要内容,其中
Comparable接口尤为重要,在几次练习过后,我也掌握了。(2)我学会了如何和使用javaFX,首先需要让自己的IDE能够运行javaFX的代码,
起初我使用的是Eclipse,但要让这个IDE能够运行javaFX的代码十分困难,所以我转向了idea这款软件,无需安装其他东西,就能运行javaFx的
代码。经过了实验和翻转课堂,我也基本掌握了javaFX的使用。(3)Stack,Queue,Map,在后几周的学习中,我们主要学习这一部分书本上没有
的内容,所以我学习这部分内容的主要途径是老师讲解和网络资源,老师并不要求我们掌握这部分的内部原理,只需要我们能够基本掌握如何使用
就行,完成了老师布置的课堂作业和PTA上的编程题后,我也逐步掌握了这部分内容。
2.第二部分
我认为这门课程的教学模式和教学理念等大体上来说都是不错的,但仍然存在许多不足。在教学过程中,主要是用PTA作业进行练习,驱动学生去提高
自己的代码能力,在我看来这是不错的一种方式,但问题是学生的确能够认识到自己存在问题,但无法解决自己的问题,甚至不知道问题出在哪里。在一次
作业以后,学生会慢慢忘记上次题目中出现过问题,这个问题始终无法解决。就比如在后几次作业中总会出现几个测试点无法通过,下次作业碰到这个测试点
仍然无法通过,所以我还是希望老师在题目集关闭后能够在课堂上讲解一下题目集中大家错误比较多的题目,以便学生更正自己的错误。对于教学方法,我认为
在课堂上边讲边练是一种十分高效的学习方法,看着书本上的代码,远没有自己敲代码记忆深刻,在敲代码的过程中能认识到自己许多错误。就比如雨刷这个例子,
我在课堂上跟着老师敲了一遍,记忆十分深刻,后续老师布置的题目,也迎刃而解。
  
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号