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)设计与分析

第一次作业

7-1 菜单计价程序-5
题目

本题在菜单计价程序-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 }
View Code

 

 

 

 分析如下:

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

参考类图:


image.png

输入样例1:

仅有课程。例如:

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

输出样例1:

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

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

输入样例2:

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

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

输出样例2:

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

20201103 张三 34
java 20 40 34
202011 34
 

输入样例3:

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

java 选修 考察
20201103 张三 java 40
end
 

输出样例3:

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

20201103 张三 40
java 40 40
202011 40
 

输入样例4:

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

java 必修 考试
20201103 张三 java 20
end
 

输出样例4:

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

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

输入样例5:

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

java 必修 考察
20201103 张三 java 40
end
 

输出样例5:

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

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

输入样例6:

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

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

输出样例6:

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

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

输入样例7:

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

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

输出样例7:

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

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

输入样例8:

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

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

输出样例8:

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

wrong format
数据结构 has no grades yet
 

输入样例9:

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

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

输出样例9:

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

20201102 王五 60
20201103 李四 87
20201205 李四 70
20201211 张三 75
java 60 60
数据结构 70 70
数据库 70 78 75
形式与政治 80 90 87
202011 73
202012 72

代码展示:
  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 }
View Code

类图如下:

 

 

分析如下:

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 }
View Code

 

 

 分析如下:

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 }
View Code

类图如下:

 

 

 

 分析如下:

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

参考类图(与第一次相同,其余内容自行补充):


e724fa4193aa9ee32e78a68cd96fd6df_22401e04-c501-4b28-bb65-dabe39d374e7.png

 

输入样例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 }
View Code

类图如下:

 

 

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

参考类图(与第一次相同,其余内容自行补充):

fdada4ca193119ee30531ab82ffebbfa_9dbcf4e8-1627-4cf6-8764-cccf44947e2a.png

输入样例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 }
View Code

 

 

 

分析如下:

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作业进行练习,驱动学生去提高

自己的代码能力,在我看来这是不错的一种方式,但问题是学生的确能够认识到自己存在问题,但无法解决自己的问题,甚至不知道问题出在哪里。在一次

作业以后,学生会慢慢忘记上次题目中出现过问题,这个问题始终无法解决。就比如在后几次作业中总会出现几个测试点无法通过,下次作业碰到这个测试点

仍然无法通过,所以我还是希望老师在题目集关闭后能够在课堂上讲解一下题目集中大家错误比较多的题目,以便学生更正自己的错误。对于教学方法,我认为

在课堂上边讲边练是一种十分高效的学习方法,看着书本上的代码,远没有自己敲代码记忆深刻,在敲代码的过程中能认识到自己许多错误。就比如雨刷这个例子,

我在课堂上跟着老师敲了一遍,记忆十分深刻,后续老师布置的题目,也迎刃而解。

 

 

 

 

 

 

 

 

 

 

 

 

 

 
posted @ 2023-06-27 10:25  轩轩轩轩轩X  阅读(88)  评论(0)    收藏  举报