pta题目集7~11总结性Blog

发布时间 2023-06-24 13:26:26作者: weiranwei

前言:

第七次题目集:本次题目集是菜单计价系统的一次迭代,在原有功能的基础上对输入的特色菜分为川菜,晋菜和浙菜三类,并在最后输出一桌的价格的时候还要将三种特色菜的点菜的口味程度一起输出,还要求对每位顾客的姓名和手机号进行格式的规范。本次题目需要在之前的菜单计价系统的基础之上再增加一个新的table类用来计算并存储每一桌的特色菜的口味程度,建立起table类和其他类之间的关系,还需要用正则表达式重新来规范输入的数据,来判断输入的数据是否错误,还有格式是否错误,如规定手机号和姓名。本次题目级难度较难,题量较少,较为考察逻辑思维。

第八次题目集:本次题目集为一个简单的课程成绩统计程序。本次题目集主要考察逻辑思考能力,对输入的课程,班级,学生的成绩进行整理,还要对课程,班级和学生的成绩按照不同的要求进行输出,考察代码程序对输入数据的计算和整理。数据的输入分为课程还有学生成绩两部分组成,最后以end的结束输入,程序需要用while循环来判断两个部分的输入是否结束,还需要大量地运用到正则表达式对输入的课程数据还有每位学生的成绩进行规范,还需要用spilt()函数对输入的每行的数据进行分割得到我们所需要的数据,需要在不同的类中定义处理本类的数据的方法来简化主函数,如在course类中定义一个判断输入课程数据是否合法的方法,合法就将其存入course类之中并返回true,还需运用到冒泡排序法对课程,班级和学生的输出次序进行排序,还用到了Integer.parseInt()将字符串转化为整数进行计算,本次题目集难度较难,题量较少,考察对数据的计算和整理。

第九次题目集:本次题目集为一道统计java程序中关键词的出现次数的题,需要用到Map类对出现的各个关键词的次数进行统计,需要用到stringBuilder类用来加入形成一个单词,需要使用while循环来判断输入是否结束,需要用到正则表达式对输入的格式进行规范,String类之中的replaceAll(),substring()方法,还需运用到Map类的遍历方法。本次题目集题量较少,难度中等。

第十次题目集:本次题目集主要学习和练习了HashMap的检索和排序,进行了对HsahMap类的练习,第四题则是进行了对多态的训练,而第三题则是在第八次题目集课程成绩统计程序的基础上进行迭代,在之前的必修课和选修课的基础上加上了一个实验课,并且实验课的成绩计算方式不同于必修课和选修课,本次题目集可在之前的基础上增加一个新的实验类来计算实验课的成绩,需要用正则表达式来判断输入的实验课次数是否合法还有与要求的是否对应,本次题目集题量中等,难度偏高,但在第八次题目集已经打好了基础,代码量较少。

第十一次题目集:本次题目集主要练习了ArrayList-排序还有Map类对数据的整理和排序,还有自定义栈接口对栈的使用,以及现在需要定义PersonOverride类并覆盖其toStringequals方法,最后第二题为课程成绩统计程序-3在第二次的基础上修改了计算总成绩的方式,需要修改类结构,将成绩类的继承关系改为组合关系,使用分值和权重的计算方法,考察了重构的能力,本次题目集题量较多,难度较难。

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

  1 import java.time.DayOfWeek;
  2 import java.time.LocalDate;
  3 import java.time.LocalDateTime;
  4 import java.time.LocalTime;
  5 import java.util.ArrayList;
  6 import java.util.Scanner;
  7 
  8 public class Main {
  9     public static void main(String[] args) {
 10         double discount = 1;
 11         int number;
 12         Customers customers = new Customers();
 13         Menu newMenu = new Menu();
 14         Scanner input = new Scanner(System.in);
 15         String string = input.nextLine();
 16         while (string.charAt(0) != 't') {//录入菜单
 17             if (string.charAt(string.length() - 1) == 'T') {//特色菜情况
 18                 String[] str = string.split(" ");
 19                 if (str[1].contains(".")) {
 20                     System.out.println("wrong format");
 21                 } else if (str.length != 4) {
 22                     System.out.println("wrong format");
 23                 } else if (!str[2].matches("^\\+?[1-9][0-9]*$+")) {
 24                     System.out.println("wrong format");
 25                 } else if (Integer.parseInt(str[2]) < 0 || Integer.parseInt(str[2]) >= 300) {//判断菜价有没有超过范围
 26                     System.out.println(str[0] + " price out of range " + Integer.parseInt(str[2]));
 27                 } else if (str[2].charAt(0) == '0') {//判断最高位是不是以0开头
 28                     System.out.println("wrong format");
 29                 } else
 30                     newMenu.addDish(str[0], Integer.parseInt(str[2]), str[1]);
 31             } else {//普通菜情况
 32                 String[] str = string.split(" ");
 33                 if (str[1].contains(".")) {
 34                     System.out.println("wrong format");
 35                 } else if (str.length != 2) {
 36                     System.out.println("wrong format");
 37                 } else if (!str[1].matches("^\\+?[1-9][0-9]*$+")) {
 38                     System.out.println("wrong format");
 39                 } else if (Integer.parseInt(str[1]) < 0 || Integer.parseInt(str[1]) >= 300) {//判断菜价有没有超过范围
 40                     System.out.println(str[0] + " price out of range " + Integer.parseInt(str[1]));
 41                 } else if (str[0].charAt(0) == '0') {//判断最高位是不是以0开头
 42                     System.out.println("wrong format");
 43                 } else
 44                     newMenu.addDish(str[0], Integer.parseInt(str[1]), "普通菜");
 45             }
 46             string = input.nextLine();
 47         }
 48         ArrayList<Table> recordTable = new ArrayList<>();
 49         while (string.compareTo("end") != 0) {//判断是否结束
 50             ArrayList<Integer> helpOrderNum = new ArrayList<>();
 51             ArrayList<Integer> helpOrderTable = new ArrayList<>();
 52             int judgeTimeMater = 0;
 53             int sum = 0;
 54             int sum1 = 0;
 55             String[] str = string.split(" ");//将string中的数据分开存到str中
 56             if (str[0].compareTo("table") == 0 && (!(str[1].matches("^\\+?[1-9][0-9]*$+")) || str[1].charAt(0) == '0') || str.length != 7) {//判断桌号出现非数值情况
 57                 System.out.println("wrong format");//输出报错
 58                 string = input.nextLine();//输入
 59                 while (string.charAt(0) != 't') {//判断输入是否为新的一桌,是的话跳出循环
 60                     string = input.nextLine();//输入
 61                     if (string.compareTo("end") == 0) {//判断是否结束
 62                         System.exit(1);//退出程序
 63                     }
 64                 }
 65             } else if (str[0].compareTo("table") == 0 && Integer.parseInt(str[1]) > 55) {//判断桌号大于55的情况
 66                 System.out.println(Integer.parseInt(str[1]) + " table num out of range");
 67                 string = input.nextLine();
 68                 while (string.charAt(0) != 't' || string.compareTo("end") != 0) {//判断输入是否为新的一桌,是的话跳出循环
 69                     string = input.nextLine();//输入
 70                     if (string.compareTo("end") == 0) {//判断是否结束
 71                         System.exit(1);//退出程序
 72                     }
 73                 }
 74             } else if (str[0].compareTo("table") == 0 && (str[1].matches("[1-9][0-5]") || str[1].matches("[1-9]"))) {
 75                 ArrayList<Integer> deleteOrder = new ArrayList<>();
 76                 String[] time1 = str[5].split("/"); //将年,月,日的信息分开来传入到time1字符串数组中
 77                 String[] time2 = str[6].split("/");  //将时,分,秒的信息分开来传入到time2字符串数组中
 78                 if (!(time1[0].length() == 4 && (time1[1].length() == 1 || time1[1].length() == 2) && (time1[2].length() == 1 || time1[2].length() == 2) && (time2[0].length() == 1 || time2[0].length() == 2) && (time2[1].length() == 1 || time2[1].length() == 2) && (time2[2].length() == 1 || time2[2].length() == 2))) {
 79                     System.out.print("wrong format");//判断输入的时间格式是否合法
 80                     string = input.nextLine();//录入新一桌的信息
 81                     while (string.compareTo("end") != 0 && string.charAt(0) != 't') {
 82                         string = input.nextLine();
 83                     }
 84                     judgeTimeMater = 1;
 85                 } else if (!(Integer.parseInt(time1[0]) > 1000 && (Integer.parseInt(time1[1]) <= 12 && Integer.parseInt(time1[1]) >= 1) && (Integer.parseInt(time1[2]) >= 1 && Integer.parseInt(time1[2]) <= 31) && (Integer.parseInt(time2[0]) >= 0 && Integer.parseInt(time2[0]) < 24) && (Integer.parseInt(time2[1]) >= 0 && Integer.parseInt(time2[1]) <= 60) && (Integer.parseInt(time2[2]) >= 0 && Integer.parseInt(time2[2]) <= 60))) {
 86                     System.out.print(Integer.parseInt(str[1]) + " date error");//判断输入的时间数据是否非法
 87                     string = input.nextLine();//录入新一桌的信息
 88                     while (string.compareTo("end") != 0 && string.charAt(0) != 't') {
 89                         string = input.nextLine();
 90                     }
 91                     judgeTimeMater = 1;
 92                 }
 93                 if (judgeTimeMater == 0) {
 94                     LocalDateTime orderTime = LocalDateTime.of(Integer.parseInt(time1[0]), Integer.parseInt(time1[1]), Integer.parseInt(time1[2]), Integer.parseInt(time2[0]), Integer.parseInt(time2[1]), Integer.parseInt(time2[2]));
 95                     LocalDate restaurantStart = LocalDate.of(2022, 1, 1); //时间有效开始
 96                     LocalDate restaurantEnd = LocalDate.of(2023, 12, 31);//时间有结束
 97                     LocalDate eatTime = orderTime.toLocalDate(); //就餐时间
 98                     LocalTime weekStartTime = LocalTime.of(9, 29, 59);
 99                     LocalTime weekEndTime = LocalTime.of(21, 30, 01);
100                     LocalTime NotweekStartMorningTime = LocalTime.of(10, 29, 59);
101                     LocalTime NotweekStartTAfternoonTime = LocalTime.of(16, 59, 59);
102                     LocalTime NotweekEndMorningTime = LocalTime.of(14, 30, 01);
103                     LocalTime NotweekEndAfternoonTime = LocalTime.of(20, 30, 01);
104                     LocalTime eatTime1 = orderTime.toLocalTime(); //就餐时间
105                     if (((!(orderTime.getDayOfWeek() == DayOfWeek.SUNDAY || orderTime.getDayOfWeek() == DayOfWeek.SATURDAY)) && ((!(eatTime1.isAfter(NotweekStartMorningTime) && eatTime1.isBefore(NotweekEndMorningTime))) && (!(eatTime1.isAfter(NotweekStartTAfternoonTime) && eatTime1.isBefore(NotweekEndAfternoonTime))))) || ((orderTime.getDayOfWeek() == DayOfWeek.SUNDAY || orderTime.getDayOfWeek() == DayOfWeek.SATURDAY) && (!(eatTime1.isAfter(weekStartTime) && eatTime1.isBefore(weekEndTime))))) {
106                         System.out.println("table " + Integer.parseInt(str[1]) + " out of opening hours");
107                         string = input.nextLine();//录入新一桌的信息
108                         while (string.compareTo("end") != 0 && string.charAt(0) != 't') {
109                             string = input.nextLine();
110                         }
111                     } else if (str[3].length() > 10 || str[4].length() != 11 || !str[4].matches("^(180|181|189|133|135|136)\\d{8}$")) {
112                         System.out.println("wrong format");
113                         string = input.nextLine();//录入新一桌的信息
114                         while (string.compareTo("end") != 0 && string.charAt(0) != 't') {
115                             string = input.nextLine();
116                         }
117                     } else {
118                         Table newTable = new Table();
119                         newTable.setTableNum(Integer.parseInt(str[1]));
120                         recordTable.add(newTable);
121                         customers.addCustomer(str[3], str[4]);
122                         double singlePrice = 0;
123                         System.out.println("table " + Integer.parseInt(str[1]) + ": ");  //输出
124                         newTable.setTableNum(Integer.parseInt(str[1]));
125                         if (!(orderTime.getDayOfWeek() == DayOfWeek.SUNDAY || orderTime.getDayOfWeek() == DayOfWeek.SATURDAY)) {//判断是周一到周五还是周末来赋予相应折扣
126                             discount = 0.7;
127                         }
128                         String orderMessage;
129                         orderMessage = input.nextLine();  //录入一条订单的信息
130                         number = 0; //以判断订单号是否是顺序的
131                         Order newOrder = new Order();   //创建一个新的订单信息
132                         int judgeTableMater = 0;
133                         while ((orderMessage.charAt(0) != 't' && orderMessage.charAt(0) != 'e') || judgeTableMater == 1) { //判断订单号是否结束
134                             judgeTableMater = 0;
135                             String[] orderMessage1 = orderMessage.split(" ");//将一条订单的各种信息分开
136                             if (orderMessage1.length >= 5 && orderMessage1[1].matches("^\\+?[1-9][0-9]*$+")) {//代点菜
137                                 helpOrderNum.add(Integer.parseInt(orderMessage1[1]));
138                                 helpOrderTable.add(Integer.parseInt(orderMessage1[0]));
139                                 orderMessage = input.nextLine();
140                                 if(orderMessage1.length==6) {
141                                     newOrder.addARecord(Integer.parseInt(orderMessage1[1]), orderMessage1[2], Integer.parseInt(orderMessage1[4]),Integer.parseInt(orderMessage1[5]),Integer.parseInt(orderMessage1[3]));
142                                 } else if (orderMessage1.length==5) {
143                                     newOrder.addARecord(Integer.parseInt(orderMessage1[1]), orderMessage1[2], Integer.parseInt(orderMessage1[3]),Integer.parseInt(orderMessage1[4]));
144                                 }
145                             } else {
146                                 if (!(orderMessage1[0].matches("[1-9]"))) {  //判断是否订单录入菜单
147                                     System.out.println("invalid dish");
148                                     orderMessage = input.nextLine();  //录入一条订单的信息
149                                 } else if (orderMessage1[1].compareTo("delete") != 0 && orderMessage1.length == 5) {
150                                     newOrder.addARecord(Integer.parseInt(orderMessage1[0]), orderMessage1[1], Integer.parseInt(orderMessage1[3]), Integer.parseInt(orderMessage1[4]), Integer.parseInt(orderMessage1[2]));//将订单信息传入到newOrder中
151                                     orderMessage = input.nextLine();
152                                 } else if (orderMessage1[1].compareTo("delete") != 0 && orderMessage1.length == 4) {
153                                     newOrder.addARecord(Integer.parseInt(orderMessage1[0]), orderMessage1[1], Integer.parseInt(orderMessage1[2]), Integer.parseInt(orderMessage1[3]));//将订单信息传入到newOrder中
154                                     orderMessage = input.nextLine();
155                                 }
156                                 String[] orderMessage2 = orderMessage.split(" ");
157                                 if ((orderMessage2[0].compareTo("table") != 0 && !(orderMessage2[0].matches("[1-9]"))) && orderMessage.compareTo("end") != 0) {
158                                     orderMessage = input.nextLine();
159                                     judgeTableMater = 1;
160                                 }
161                                 while (orderMessage.charAt(0) != 'e' && orderMessage.charAt(2) == 'd') {
162                                     deleteOrder.add(Integer.parseInt(orderMessage2[0]));
163                                     orderMessage = input.nextLine();
164                                     orderMessage2 = orderMessage.split(" ");
165                                     if (orderMessage.compareTo("end") == 0) {
166                                         break;
167                                     }
168                                 }
169                             }
170                         }
171                         for (int j = 1; j <= newOrder.getRecords().size(); j++) {//遍历newOrder中的每一条记录
172                             ArrayList<Dish> dishNew = newMenu.getDishs();//将newMenu中的dishs信息放到dishNew中以遍历
173                             if (1 == 1) {
174                                 for (int i = 0; i < newMenu.getDishs().size(); i++) {//将一条订单与菜单匹配
175                                     int recordHelpNum = 0;
176                                     int judgeHelpOrder = 0;
177                                     if (dishNew.get(i).getName().compareTo(newOrder.getRecords().get(j - 1).getD().getName()) == 0) {
178                                         newOrder.getRecords().get(j - 1).setD(dishNew.get(i));
179                                         if ((newOrder.getRecords().get(j - 1).getPortion() > 3 && newOrder.getRecords().get(j - 1).getPortion() <= 9)) {//普通菜份额超出范围
180                                             System.out.println(newOrder.getRecords().get(j - 1).getOrderNum() + " portion out of range " + newOrder.getRecords().get(j - 1).getPortion());
181                                         } else if (newOrder.getRecords().get(j - 1).getPortion() > 9) {
182                                             System.out.println("wrong format");  //份额非法输入
183                                         } else if (newOrder.getRecords().get(j - 1).getNum() > 15) {
184                                             System.out.println(newOrder.getRecords().get(j - 1).getOrderNum() + " num out of range " + newOrder.getRecords().get(j - 1).getNum());//份数超出范围
185                                         } else {
186                                             int existTable = 1;
187                                             int deleteOrderMater = 0;
188                                             for (recordHelpNum = 0; recordHelpNum < helpOrderNum.size(); recordHelpNum++) {
189                                                 if (helpOrderNum.get(recordHelpNum) == newOrder.getRecords().get(j - 1).getOrderNum()) {
190                                                     judgeHelpOrder = 1;
191                                                     for (int k = 0; k < recordTable.size(); k++) {
192                                                         if (recordTable.get(k).getTableNum() == helpOrderTable.get(recordHelpNum)) {
193                                                             existTable = 0;
194                                                         }
195                                                         if (k == recordTable.size() - 1 && existTable == 1) {
196                                                             existTable = 2;
197                                                         }
198                                                     }
199                                                     break;
200                                                 }
201                                             }
202                                             if (existTable == 2) {
203                                                 System.out.println("wrong format");
204                                             } else {
205                                                 if (judgeHelpOrder == 1) {
206                                                     System.out.println(newOrder.getRecords().get(j - 1).getOrderNum() + " " + "table " + str[1] + " pay for table " + helpOrderTable.get(recordHelpNum) + " " + Math.round(newOrder.getRecords().get(j - 1).getPrice()));
207                                                 }
208                                                 for (int l = 0; l < deleteOrder.size(); l++) {
209                                                     if (deleteOrder.get(l) == newOrder.getRecords().get(j - 1).getOrderNum()) {
210                                                         deleteOrderMater = 1;
211                                                         break;
212                                                     }
213                                                 }
214                                                 int k=-1;
215                                                 int judgeDegree=1;
216                                                 int table=0;
217                                                 if(helpOrderNum.size()>0) {
218                                                     k=0;
219                                                     for (int l = 0, o = 0; l < helpOrderNum.size(); l++) {
220                                                         if (helpOrderNum.get(k) == newOrder.getRecords().get(j - 1).getOrderNum()) {
221                                                             k = l;
222                                                             o = 1;
223                                                         }
224                                                         if (o != 1 && l == helpOrderNum.size() - 1) {
225                                                             k = -1;
226                                                         }
227                                                     }
228                                                     if (k != -1) {
229                                                         for (int l = 0; l < recordTable.size(); l++) {
230                                                             if (recordTable.get(l).getTableNum() == helpOrderTable.get(k)) {
231                                                                 table = l;
232                                                             }
233                                                         }
234                                                     }
235                                                 }
236                                                 if (!(orderTime.getDayOfWeek() == DayOfWeek.SUNDAY || orderTime.getDayOfWeek() == DayOfWeek.SATURDAY)) {
237                                                     if (!(newOrder.getRecords().get(j - 1).getD().getSpecialty().equals("普通菜"))) {
238                                                         singlePrice = Math.round(newOrder.getRecords().get(j - 1).getPrice()) * 0.7;
239                                                         if (newOrder.getRecords().get(j - 1).getD().getSpecialty().equals("川菜") && newOrder.getRecords().get(j - 1).getDegree() >= 0 && newOrder.getRecords().get(j - 1).getDegree() <= 5) {
240                                                             if (k != -1) {
241                                                                 recordTable.get(table).setSichuanDegree(recordTable.get(table).getSichuanDegree() + newOrder.getRecords().get(j - 1).getDegree() * newOrder.getRecords().get(j - 1).getNum());
242                                                                 recordTable.get(table).setSichuanNum(recordTable.get(table).getSichuanNum() + 1 * newOrder.getRecords().get(j - 1).getNum());
243                                                             } else if (k == -1) {
244                                                                 recordTable.get(recordTable.size() - 1).setSichuanDegree(recordTable.get(recordTable.size() - 1).getSichuanDegree() + newOrder.getRecords().get(j - 1).getDegree() * newOrder.getRecords().get(j - 1).getNum());
245                                                                 recordTable.get(recordTable.size() - 1).setSichuanNum(recordTable.get(recordTable.size() - 1).getSichuanNum() + 1 * newOrder.getRecords().get(j - 1).getNum());
246                                                             }
247                                                             if (k == -1) {
248                                                                 System.out.println(newOrder.getRecords().get(j - 1).getOrderNum() + " " + newOrder.getRecords().get(j - 1).getD().getName() + " " + Math.round(newOrder.getRecords().get(j - 1).getPrice()));
249                                                             }
250                                                         }else if (newOrder.getRecords().get(j - 1).getD().getSpecialty().equals("川菜") && (newOrder.getRecords().get(j - 1).getDegree() < 0 || newOrder.getRecords().get(j - 1).getDegree() > 5)) {
251                                                             singlePrice=0;
252                                                             judgeDegree=0;
253                                                             System.out.println("spicy num out of range :" + newOrder.getRecords().get(j - 1).getDegree());
254                                                         }
255                                                         if (newOrder.getRecords().get(j - 1).getD().getSpecialty().equals("晋菜") && newOrder.getRecords().get(j - 1).getDegree() >= 0 && newOrder.getRecords().get(j - 1).getDegree() <= 4) {
256                                                             if (k != -1) {
257                                                                 recordTable.get(table).setJinDegree(recordTable.get(table).getJinDegree() + newOrder.getRecords().get(j - 1).getDegree() * newOrder.getRecords().get(j - 1).getNum());
258                                                                 recordTable.get(table).setJinNum(recordTable.get(table).getJinNum() + 1 * newOrder.getRecords().get(j - 1).getNum());
259                                                             } else if (k == -1) {
260                                                                 recordTable.get(recordTable.size() - 1).setJinDegree(recordTable.get(recordTable.size() - 1).getJinDegree() + newOrder.getRecords().get(j - 1).getDegree() * newOrder.getRecords().get(j - 1).getNum());
261                                                                 recordTable.get(recordTable.size() - 1).setJinNum(recordTable.get(recordTable.size() - 1).getJinNum() + 1 * newOrder.getRecords().get(j - 1).getNum());
262                                                             }
263                                                             if (k == -1) {
264                                                                 System.out.println(newOrder.getRecords().get(j - 1).getOrderNum() + " " + newOrder.getRecords().get(j - 1).getD().getName() + " " + Math.round(newOrder.getRecords().get(j - 1).getPrice()));
265                                                             }
266                                                         }else if (newOrder.getRecords().get(j - 1).getD().getSpecialty().equals("晋菜") && (newOrder.getRecords().get(j - 1).getDegree() < 0 || newOrder.getRecords().get(j - 1).getDegree() > 4)) {
267                                                             singlePrice=0;
268                                                             judgeDegree=0;
269                                                             System.out.println("acidity num out of range :" + newOrder.getRecords().get(j - 1).getDegree());
270                                                         }
271                                                         if (newOrder.getRecords().get(j - 1).getD().getSpecialty().equals("浙菜") && newOrder.getRecords().get(j - 1).getDegree() >= 0 && newOrder.getRecords().get(j - 1).getDegree() <= 3) {
272                                                             if (k != -1) {
273                                                                 recordTable.get(table).setZheDegree(recordTable.get(table).getZheDegree() + newOrder.getRecords().get(j - 1).getDegree() * newOrder.getRecords().get(j - 1).getNum());
274                                                                 recordTable.get(table).setZheNum(recordTable.get(table).getZheNum() + 1 * newOrder.getRecords().get(j - 1).getNum());
275                                                             } else if (k == -1) {
276                                                                 recordTable.get(recordTable.size() - 1).setZheDegree(recordTable.get(recordTable.size() - 1).getZheDegree() + newOrder.getRecords().get(j - 1).getDegree() * newOrder.getRecords().get(j - 1).getNum());
277                                                                 recordTable.get(recordTable.size() - 1).setZheNum(recordTable.get(recordTable.size() - 1).getZheNum() + 1 * newOrder.getRecords().get(j - 1).getNum());
278                                                             }
279                                                             if (k == -1) {
280                                                                 System.out.println(newOrder.getRecords().get(j - 1).getOrderNum() + " " + newOrder.getRecords().get(j - 1).getD().getName() + " " + Math.round(newOrder.getRecords().get(j - 1).getPrice()));
281                                                             }
282                                                         }else if (newOrder.getRecords().get(j - 1).getD().getSpecialty().equals("浙菜") && (newOrder.getRecords().get(j - 1).getDegree() < 0 || newOrder.getRecords().get(j - 1).getDegree() > 3)) {
283                                                             System.out.println("sweetness num out of range :" + newOrder.getRecords().get(j - 1).getDegree());
284                                                             singlePrice=0;
285                                                             judgeDegree=0;
286                                                         }
287                                                     } else if ((newOrder.getRecords().get(j - 1).getD().getSpecialty().equals("普通菜")) && (eatTime1.isAfter(NotweekStartTAfternoonTime) && eatTime1.isBefore(NotweekEndAfternoonTime))) {
288                                                         singlePrice = Math.round(newOrder.getRecords().get(j - 1).getPrice()) * 0.8;
289                                                         if (k == -1) {
290                                                             System.out.println(newOrder.getRecords().get(j - 1).getOrderNum() + " " + newOrder.getRecords().get(j - 1).getD().getName() + " " + Math.round(newOrder.getRecords().get(j - 1).getPrice()));
291                                                         }
292                                                     }else if (newOrder.getRecords().get(j - 1).getD().getSpecialty().equals("普通菜") && (eatTime1.isAfter(NotweekStartMorningTime) && eatTime1.isBefore(NotweekEndMorningTime))) {
293                                                         singlePrice = Math.round(newOrder.getRecords().get(j - 1).getPrice()) * 0.6;
294                                                         if (k == -1) {
295                                                             System.out.println(newOrder.getRecords().get(j - 1).getOrderNum() + " " + newOrder.getRecords().get(j - 1).getD().getName() + " " + Math.round(newOrder.getRecords().get(j - 1).getPrice()));
296                                                         }
297                                                     }
298                                                 } else {
299                                                     if (!(newOrder.getRecords().get(j - 1).getD().getSpecialty().equals("普通菜"))) {
300                                                         singlePrice = Math.round(newOrder.getRecords().get(j - 1).getPrice());
301                                                         if (newOrder.getRecords().get(j - 1).getD().getSpecialty().equals("川菜") && newOrder.getRecords().get(j - 1).getDegree() >= 0 && newOrder.getRecords().get(j - 1).getDegree() <= 5) {
302                                                             recordTable.get(recordTable.size() - 1).setSichuanDegree(recordTable.get(recordTable.size() - 1).getSichuanDegree() + newOrder.getRecords().get(j - 1).getDegree() * newOrder.getRecords().get(j - 1).getNum());
303                                                             recordTable.get(recordTable.size() - 1).setSichuanNum(recordTable.get(recordTable.size() - 1).getSichuanNum() + 1 * newOrder.getRecords().get(j - 1).getNum());
304                                                             if (k == -1) {
305                                                                 System.out.println(newOrder.getRecords().get(j - 1).getOrderNum() + " " + newOrder.getRecords().get(j - 1).getD().getName() + " " + Math.round(newOrder.getRecords().get(j - 1).getPrice()));
306                                                             }
307                                                         }else if (newOrder.getRecords().get(j - 1).getD().getSpecialty().equals("川菜") && (newOrder.getRecords().get(j - 1).getDegree() < 0 || newOrder.getRecords().get(j - 1).getDegree() > 5)) {
308                                                             System.out.println("spicy num out of range :" + newOrder.getRecords().get(j - 1).getDegree());
309                                                             singlePrice=0;
310                                                             judgeDegree=0;
311                                                         }
312                                                         if (newOrder.getRecords().get(j - 1).getD().getSpecialty().equals("晋菜") && newOrder.getRecords().get(j - 1).getDegree() >= 0 && newOrder.getRecords().get(j - 1).getDegree() <= 4) {
313                                                             recordTable.get(recordTable.size() - 1).setJinDegree(recordTable.get(recordTable.size() - 1).getJinDegree() + newOrder.getRecords().get(j - 1).getDegree()*newOrder.getRecords().get(j-1).getNum());
314                                                             recordTable.get(recordTable.size() - 1).setJinNum(recordTable.get(recordTable.size() - 1).getJinNum() + 1*newOrder.getRecords().get(j-1).getNum());
315                                                                 if(k==-1){
316                                                                     System.out.println(newOrder.getRecords().get(j - 1).getOrderNum() + " " + newOrder.getRecords().get(j - 1).getD().getName() + " " + Math.round(newOrder.getRecords().get(j - 1).getPrice()));
317                                                                 }
318                                                         } else if (newOrder.getRecords().get(j - 1).getD().getSpecialty().equals("晋菜") && (newOrder.getRecords().get(j - 1).getDegree() < 0 || newOrder.getRecords().get(j - 1).getDegree() > 4)) {
319                                                             System.out.println("acidity num out of range :" + newOrder.getRecords().get(j - 1).getDegree());
320                                                             singlePrice=0;
321                                                             judgeDegree=0;
322                                                         }
323                                                         if (newOrder.getRecords().get(j - 1).getD().getSpecialty().equals("浙菜") && newOrder.getRecords().get(j - 1).getDegree() >= 0 && newOrder.getRecords().get(j - 1).getDegree() <= 3) {
324                                                             recordTable.get(recordTable.size() - 1).setZheDegree(recordTable.get(recordTable.size() - 1).getZheDegree() + newOrder.getRecords().get(j - 1).getDegree()*newOrder.getRecords().get(j-1).getNum());
325                                                             recordTable.get(recordTable.size() - 1).setZheNum(recordTable.get(recordTable.size() - 1).getZheNum() + 1*newOrder.getRecords().get(j-1).getNum());
326                                                                 if(k==-1){
327                                                                     System.out.println(newOrder.getRecords().get(j - 1).getOrderNum() + " " + newOrder.getRecords().get(j - 1).getD().getName() + " " + Math.round(newOrder.getRecords().get(j - 1).getPrice()));
328                                                                 }
329                                                         } else if (newOrder.getRecords().get(j - 1).getD().getSpecialty().equals("浙菜") && (newOrder.getRecords().get(j - 1).getDegree() < 0 || newOrder.getRecords().get(j - 1).getDegree() > 3)) {
330                                                             System.out.println("sweetness num out of range :" + newOrder.getRecords().get(j - 1).getDegree());
331                                                             singlePrice=0;
332                                                             judgeDegree=0;
333                                                         }
334                                                     } else if ((newOrder.getRecords().get(j - 1).getD().getSpecialty().equals("普通菜")) && (eatTime1.isAfter(NotweekStartTAfternoonTime) && eatTime1.isBefore(NotweekEndAfternoonTime))) {
335                                                         singlePrice = Math.round(newOrder.getRecords().get(j - 1).getPrice());
336                                                             if(k==-1){
337                                                                 System.out.println(newOrder.getRecords().get(j - 1).getOrderNum() + " " + newOrder.getRecords().get(j - 1).getD().getName() + " " + Math.round(newOrder.getRecords().get(j - 1).getPrice()));
338                                                             }
339                                                     } else if (newOrder.getRecords().get(j - 1).getD().getSpecialty().equals("普通菜") && (eatTime1.isAfter(NotweekStartMorningTime) && eatTime1.isBefore(NotweekEndMorningTime))) {
340                                                         singlePrice = Math.round(newOrder.getRecords().get(j - 1).getPrice());
341                                                             if(k==-1){
342                                                                 System.out.println(newOrder.getRecords().get(j - 1).getOrderNum() + " " + newOrder.getRecords().get(j - 1).getD().getName() + " " + Math.round(newOrder.getRecords().get(j - 1).getPrice()));
343                                                             }
344                                                     }
345                                                 }
346                                                 if (deleteOrderMater == 1) {
347                                                     break;
348                                                 }
349                                                 sum = Math.round((float) singlePrice) + sum;
350                                                 sum1 = sum1 + Math.round(newOrder.getRecords().get(j - 1).getPrice()*judgeDegree);
351                                             }
352                                         }
353                                         break;
354                                     }
355                                     if (dishNew.get(i).getName().compareTo(newOrder.getRecords().get(j - 1).getD().getName()) != 0 && i == newMenu.getDishs().size() - 1) {  //输出菜单中不存在订单菜品的情况
356                                         System.out.println(newOrder.getRecords().get(j - 1).getD().getName() + " does not exist");
357                                     }
358                                 }
359                                 if (number < newOrder.getRecords().get(j - 1).getOrderNum()) {
360                                     number = newOrder.getRecords().get(j - 1).getOrderNum(); //记录当前的订单的序号
361                                 }
362                             }
363                         }
364                         for (int i = 0; i < deleteOrder.size(); i++) {
365                             for (int k = 0; k < newOrder.getRecords().size(); k++) {
366                                 if (deleteOrder.get(i) == newOrder.getRecords().get(k).getOrderNum()) {
367                                     break;
368                                 }
369                                 if (k == newOrder.getRecords().size() - 1) {
370                                     System.out.println("delete error;");
371                                 }
372                             }
373                             for (int j = i - 1; j >= 0; j--) {
374                                 if (deleteOrder.get(i) == deleteOrder.get(j)) {
375                                     System.out.println("deduplication " + deleteOrder.get(i));
376                                 }
377                             }
378                         }
379                         string = orderMessage;
380                         recordTable.get(recordTable.size() - 1).setTableSumPrice(sum);
381                         recordTable.get(recordTable.size() - 1).setTableSumPrice1(sum1);
382                         customers.calculatePrice(str[3], str[4], sum);
383                     }
384                 }
385             }
386         }
387         for (int i = 0; i < recordTable.size(); i++) {
388             System.out.print("table " + recordTable.get(i).getTableNum() + ": " + recordTable.get(i).getTableSumPrice1() + " " + recordTable.get(i).getTableSumPrice());
389             if (recordTable.get(i).getSichuanNum() != 0) {
390                 System.out.print(" 川菜");
391                 recordTable.get(i).getSichuanSumDegree();
392             }
393             if (recordTable.get(i).getJinNum() != 0) {
394                 System.out.print(" 晋菜");
395                 recordTable.get(i).getJinSumDegree();
396             }
397             if (recordTable.get(i).getZheNum() != 0) {
398                 System.out.print(" 浙菜");
399                 recordTable.get(i).getZheSumDegree();
400             }
401             System.out.println();
402         }
403         for (int i = 0; i < customers.getCustomers().size()+1; i++) {
404             for (int j = 0; j < customers.getCustomers().size() - 1; j++) {
405                 if (!(customers.getCustomers().get(j).getName().equalsIgnoreCase(customers.getCustomers().get(j + 1).getName()))) {
406                     Customer newCustomer1 = new Customer();
407                     Customer newCustomer2 = new Customer();
408                     newCustomer1 = customers.getCustomers().get(j);
409                     newCustomer2 = customers.getCustomers().get(j + 1);
410                     customers.getCustomers().set(j, newCustomer2);
411                     customers.getCustomers().set(j + 1, newCustomer1);
412                 }
413             }
414         }
415         for (int i = 0; i < customers.getCustomers().size(); i++) {
416             System.out.print(customers.getCustomers().get(i).getName() + " " + customers.getCustomers().get(i).getPhone() + " " + customers.getCustomers().get(i).getSumPrice());
417             if(i!=customers.getCustomers().size()-1){
418                 System.out.println();
419             }
420         }
421     }
422 }
423  class Customer {
424     private String name;
425     private String phone;
426     private int SumPrice = 0;
427 
428     public Customer() {
429     }
430 
431     public Customer(String name, String phone) {
432         this.name = name;
433         this.phone = phone;
434     }
435 
436     public Customer(String name, String phone, int SumPrice) {
437         this.name = name;
438         this.phone = phone;
439         this.SumPrice = SumPrice;
440     }
441 
442     public String getName() {
443         return name;
444     }
445 
446     public void setName(String name) {
447         this.name = name;
448     }
449 
450     public String getPhone() {
451         return phone;
452     }
453 
454     public void setPhone(String phone) {
455         this.phone = phone;
456     }
457 
458     public int getSumPrice() {
459         return SumPrice;
460     }
461 
462     public void setSumPrice(int SumPrice) {
463         this.SumPrice = SumPrice;
464     }
465 }
466 class Customers {
467     private ArrayList<Customer> customers = new ArrayList<>();
468 
469     public Customers() {
470     }
471 
472     public Customers(ArrayList<Customer> customers) {
473         this.customers = customers;
474     }
475 
476     public void addCustomer(String name, String phone) {
477         Customer newCustomer = new Customer(name, phone);
478         int judge = 0;
479         for (int i = 0; i < customers.size(); i++) {
480             if (customers.get(i).getName().equals(name) && customers.get(i).getPhone().equals(phone)) {
481                 judge = 1;
482             }
483         }
484         if (judge == 0) {
485             customers.add(newCustomer);
486         }
487     }
488 
489     public void removeCustomer(String name, String phone) {
490         Customer newCustomer = new Customer(name, phone);
491         customers.remove(newCustomer);
492     }
493 
494     public void calculatePrice(String name, String phone, int price) {
495         addCustomer(name, phone);
496         for (int i = 0; i < customers.size(); i++) {
497             if (customers.get(i).getName().equals(name) && customers.get(i).getPhone().equals(phone)) {
498                 customers.get(i).setSumPrice(customers.get(i).getSumPrice() + price);
499             }
500         }
501     }
502 
503     public ArrayList<Customer> getCustomers() {
504         return customers;
505     }
506 
507     public void setCustomers(ArrayList<Customer> customers) {
508         this.customers = customers;
509     }
510 }
511 
512 class Dish {
513     private String name;
514     private int unit_price;
515     private String specialty = "普通菜";
516 
517     public Dish() {
518     }
519 
520     public Dish(String name, int unit_price, String specialty) {
521         this.name = name;
522         this.unit_price = unit_price;
523         this.specialty = specialty;
524     }
525 
526 
527     public void setUnit_price(int unit_price) {
528         this.unit_price = unit_price;
529     }
530 
531     public int getPrice(int portion) {
532         float newUnit_price = 1;
533         switch (portion) {
534             case 1:
535                 newUnit_price = unit_price;
536                 break;
537             case 2:
538                 newUnit_price = (float) (1.5 * unit_price);
539                 break;
540             case 3:
541                 newUnit_price = 2 * unit_price;
542                 break;
543         }
544         return Math.round(newUnit_price);
545     }
546 
547     public String getName() {
548         return name;
549     }
550 
551     public void setName(String name) {
552         this.name = name;
553     }
554 
555     public int getUnit_price() {
556         return unit_price;
557     }
558 
559     public String getSpecialty() {
560         return specialty;
561     }
562 
563     public void setSpecialty(String specialty) {
564         this.specialty = specialty;
565     }
566 }
567 
568 class Menu {
569     private ArrayList<Dish> dishs = new ArrayList<>();
570 
571     public Menu() {
572     }
573 
574     public Menu(ArrayList<Dish> dishs) {
575         this.dishs = dishs;
576     }
577 
578 
579     public Dish searthDish(String dishName) {
580         int i;
581         for (i = 0; i <= dishs.size() - 1; i++) {
582             if (dishs.get(i).getName() == dishName)
583                 break;
584         }
585         return dishs.get(i);
586     }
587 
588     public void addDish(String dishName, int unit_price, String specialty) {
589         Dish newdish = new Dish(dishName, unit_price, specialty);
590         this.dishs.add(newdish);
591     }
592 
593     public void correctDish(String dishName, int unit_price, String specialty) {
594         for (int i = 0; i < dishs.size(); i++) {
595             if (dishName.compareTo(dishs.get(i).getName()) == 0) {
596                 dishs.get(i).setName(dishName);
597                 dishs.get(i).setUnit_price(unit_price);
598                 dishs.get(i).setSpecialty(specialty);
599             }
600         }
601     }
602     public ArrayList<Dish> getDishs() {
603         return dishs;
604     }
605     public void setDishs(ArrayList<Dish> dishs) {
606         this.dishs = dishs;
607     }
608 }
609 
610 class Order {
611     private ArrayList<Record> records = new ArrayList<>();
612 
613     public Order() {
614     }
615 
616     public Order(ArrayList<Record> records) {
617         this.records = records;
618     }
619 
620 
621     public int getTotalPrice() {
622         int sum = 0;
623         for (int i = 0; i <= records.size() - 1; i++) {
624             sum = sum + records.get(i).getPrice();
625         }
626         return sum;
627     }
628 
629     public Record addARecord(int orderNum, String dishName, int portion, int num) {
630         Record newRecord = new Record(orderNum, dishName, portion, num);
631         this.records.add(newRecord);
632         return this.records.get(records.size() - 1);
633     }
634 
635     public Record addARecord(int orderNum, String dishName, int portion, int num, int degree) {
636         Record newRecord = new Record(orderNum, dishName, portion, num ,degree);
637         this.records.add(newRecord);
638         return this.records.get(records.size() - 1);
639     }
640 
641     public void delARecordByOrderNum(int orderNum) {
642         int i;
643         for (i = 0; i <= records.size() - 1; i++) {
644             if (records.get(i).getOrderNum() == orderNum) {
645                 records.remove(i);
646                 break;
647             }
648         }
649     }
650 
651     public boolean findRecordByNum(int orderNum) {
652         int i;
653         for (i = 0; i <= records.size() - 1; i++) {
654             if (records.get(i).getOrderNum() == orderNum) {
655                 return true;
656             }
657         }
658         return false;
659     }
660     public ArrayList<Record> getRecords() {
661         return records;
662     }
663     public void setRecords(ArrayList<Record> records) {
664         this.records = records;
665     }
666 }
667 class Record {
668     private int orderNum;
669     private Dish d;
670     private int portion;
671     private int num;
672     private int degree = 0;
673 
674     public Record() {
675     }
676 
677     public Record(int orderNum, String name, int portion, int num) {
678         Dish newDish = new Dish();
679         this.orderNum = orderNum;
680         newDish.setName(name);
681         this.d = newDish;
682         this.portion = portion;
683         this.num = num;
684     }
685 
686     public Record(int orderNum, String name, int portion, int num, int degree) {
687         Dish newDish = new Dish();
688         this.orderNum = orderNum;
689         newDish.setName(name);
690         this.d = newDish;
691         this.portion = portion;
692         this.num = num;
693         this.degree = degree;
694     }
695 
696     public int getPrice() {
697         return d.getPrice(portion) * num;
698     }
699 
700     public int getOrderNum() {
701         return orderNum;
702     }
703 
704     public void setOrderNum(int orderNum) {
705         this.orderNum = orderNum;
706     }
707 
708     public Dish getD() {
709         return d;
710     }
711 
712     public void setD(Dish d) {
713         this.d = d;
714     }
715 
716     public int getPortion() {
717         return portion;
718     }
719 
720     public void setPortion(int portion) {
721         this.portion = portion;
722     }
723 
724     public int getNum() {
725         return num;
726     }
727 
728     public void setNum(int num) {
729         this.num = num;
730     }
731     public int getDegree() {
732         return degree;
733     }
734 
735     public void setDegree(int degree) {
736         this.degree = degree;
737     }
738 }
739 class Table {
740     private int tableNum;
741     private int SichuanDegree = 0;
742     private int SichuanNum = 0;
743     private int JinDegree = 0;
744     private int JinNum = 0;
745     private int ZheDegree = 0;
746     private int ZheNum = 0;
747     private int tableSumPrice = 0;
748     private int tableSumPrice1 = 0;
749 
750     public void getSichuanSumDegree() {
751         int judge = Math.round(this.SichuanDegree / ((float) (this.getSichuanNum())));
752         switch (judge) {
753             case 0:
754                 System.out.print(" " + this.SichuanNum + " 不辣");
755                 break;
756             case 1:
757                 System.out.print(" " + this.SichuanNum + " 微辣");
758                 break;
759             case 2:
760                 System.out.print(" " + this.SichuanNum + " 稍辣");
761                 break;
762             case 3:
763                 System.out.print(" " + this.SichuanNum + " 辣");
764                 break;
765             case 4:
766                 System.out.print(" " + this.SichuanNum + " 很辣");
767                 break;
768             case 5:
769                 System.out.print(" " + this.SichuanNum + " 爆辣");
770                 break;
771         }
772 
773     }
774 
775     public void getJinSumDegree() {
776         int judge = Math.round(this.JinDegree / ((float) (this.getJinNum())));
777         switch (judge) {
778             case 0:
779                 System.out.print(" " + this.JinNum + " 不酸");
780                 break;
781             case 1:
782                 System.out.print(" " + this.JinNum + " 微酸");
783                 break;
784             case 2:
785                 System.out.print(" " + this.JinNum + " 稍酸");
786                 break;
787             case 3:
788                 System.out.print(" " + this.JinNum + " 酸");
789                 break;
790             case 4:
791                 System.out.print(" " + this.JinNum + " 很酸");
792                 break;
793         }
794 
795     }
796 
797     public void getZheSumDegree() {
798         int judge = Math.round(this.ZheDegree / ((float) (this.getZheNum())));
799         switch (judge) {
800             case 0:
801                 System.out.print(" " + this.ZheNum + " 不甜");
802                 break;
803             case 1:
804                 System.out.print(" " + this.ZheNum + " 微甜");
805                 break;
806             case 2:
807                 System.out.print(" " + this.ZheNum + " 稍甜");
808                 break;
809             case 3:
810                 System.out.print(" " + this.ZheNum + " 甜");
811                 break;
812         }
813 
814     }
815 
816     public Table() {
817     }
818 
819     public Table(int tableNum, int SichuanDegree, int SichuanNum, int JinDegree, int JinNum, int ZheDegree, int ZheNum, int tableSumPrice) {
820         this.tableNum = tableNum;
821         this.SichuanDegree = SichuanDegree;
822         this.SichuanNum = SichuanNum;
823         this.JinDegree = JinDegree;
824         this.JinNum = JinNum;
825         this.ZheDegree = ZheDegree;
826         this.ZheNum = ZheNum;
827         this.tableSumPrice = tableSumPrice;
828     }
829 
830     public Table(int tableNum, int SichuanDegree, int SichuanNum, int JinDegree, int JinNum, int ZheDegree, int ZheNum, int tableSumPrice, int tableSumPrice1) {
831         this.tableNum = tableNum;
832         this.SichuanDegree = SichuanDegree;
833         this.SichuanNum = SichuanNum;
834         this.JinDegree = JinDegree;
835         this.JinNum = JinNum;
836         this.ZheDegree = ZheDegree;
837         this.ZheNum = ZheNum;
838         this.tableSumPrice = tableSumPrice;
839         this.tableSumPrice1 = tableSumPrice1;
840     }
841 
842 
843     public void addDegree(String specialty, int degree) {
844 
845     }
846 
847     public int getTableNum() {
848         return tableNum;
849     }
850 
851     public void setTableNum(int tableNum) {
852         this.tableNum = tableNum;
853     }
854 
855     public int getSichuanDegree() {
856         return SichuanDegree;
857     }
858 
859     public void setSichuanDegree(int SichuanDegree) {
860         this.SichuanDegree = SichuanDegree;
861     }
862 
863     public int getSichuanNum() {
864         return SichuanNum;
865     }
866 
867     public void setSichuanNum(int SichuanNum) {
868         this.SichuanNum = SichuanNum;
869     }
870 
871     public int getJinDegree() {
872         return JinDegree;
873     }
874 
875     public void setJinDegree(int JinDegree) {
876         this.JinDegree = JinDegree;
877     }
878 
879     public int getJinNum() {
880         return JinNum;
881     }
882     public void setJinNum(int JinNum) {
883         this.JinNum = JinNum;
884     }
885     public int getZheDegree() {
886         return ZheDegree;
887     }
888     public void setZheDegree(int ZheDegree) {
889         this.ZheDegree = ZheDegree;
890     }
891     public int getZheNum() {
892         return ZheNum;
893     }
894     public void setZheNum(int ZheNum) {
895         this.ZheNum = ZheNum;
896     }
897     public int getTableSumPrice() {
898         return tableSumPrice;
899     }
900     public void setTableSumPrice(int tableSumPrice) {
901         this.tableSumPrice = tableSumPrice;
902     }
903     public int getTableSumPrice1() {
904         return tableSumPrice1;
905     }
906     public void setTableSumPrice1(int tableSumPrice1) {
907         this.tableSumPrice1 = tableSumPrice1;
908     }
909 }

本题为之前菜单程序的迭代,在之前的基础之上增加了一个新的table类用于计算输入的三种特色菜的程度并按照给定对应的数据输出相应的程度,并用于计算每一桌的点菜的总价格,在table类中有三类特色菜的程度,还有数目以及sumPrice和sumPrice1属性,并给所有的属性初始化为数值0,在遍历一桌输入的所有数据之时,将一条条数据为特色菜

PowerDesigner生成内容

 

 

 SourceMonitor的生成报表内容

  根据生成的数据可知,代码质量一般,不是非常高,对代码冗长方面还可以提高。

 

题目集八7-1 课程成绩统计程序-1

 
  1 import java.util.ArrayList;
  2 import java.util.Scanner;
  3 public class Main {
  4     public static void main(String[] args) {
  5         Scanner input = new Scanner(System.in);
  6         ArrayList<Course> allCourse = new ArrayList<>();
  7         Class newClass = new Class();
  8         String string1;
  9         while (true) {
 10             Course course = new Course();
 11             String string = input.nextLine();
 12             String str[] = string.split(" ");
 13             if (str.length != 3||(!str[1].equals("必修")&&!str[1].equals("选修"))||(!str[2].equals("考察")&&!str[2].equals("考试"))) {
 14                 if(!str[0].matches("^\\d{8}$")&&!string.equals("end")){
 15                     System.out.println("wrong format");continue;
 16                 }else{string1 = string;break;}
 17             }
 18             int judge=0,j=0;
 19             for (int i=0; i < allCourse.size(); i++) {
 20                 if (allCourse.get(i).getCourseName().equals(str[0])) {
 21                     judge=1;
 22                     j=i;
 23                 }
 24             }
 25             if(judge==1&&!allCourse.get(j).judgeIn(str[2],str[1])){
 26                 System.out.println(str[0] + " : course type & access mode mismatch");
 27             }
 28             if(judge!=1){allCourse=courseInput(course, allCourse, str);}
 29         }
 30         newClass.courses=allCourse;
 31         ArrayList<Lesson> allLesson = new ArrayList<>();
 32         while (true) {
 33             if (string1.equals("end")) {
 34                 break;
 35             }
 36             String[] str = string1.split(" ");
 37             allLesson = studentInput(str, allCourse, allLesson,newClass);
 38             string1 = input.nextLine();
 39         }
 40         newClass = disposalStudent(newClass);
 41         newClass = disposalScore(newClass, allLesson);
 42         output(newClass, allLesson);
 43     }
 44     public static ArrayList<Course> courseInput(Course course, ArrayList<Course> allCourse, String[] str) {
 45         if (course.judgeIn(str[2], str[1])) {
 46             if (str[0].length() > 10) {
 47                 System.out.println("wrong format");
 48             } else {
 49                 course.setCourseName(str[0]);
 50                 course.setType(str[1]);
 51                 course.setExamWay(str[2]);
 52                 allCourse.add(course);
 53             }
 54         } else{System.out.println(str[0] + " : course type & access mode mismatch");}
 55         return allCourse;
 56     }
 57 
 58     public static boolean judgeSameStudent(Class newclass, String[] str) {
 59         for (int i = 0; i < newclass.allStudent.size(); i++) {
 60             if (newclass.allStudent.get(i).getNumber().equals(str[0])&&newclass.allStudent.get(i).getName().equals(str[1])) {
 61                 return false;
 62             }
 63         }
 64         return true;
 65     }
 66     public static ArrayList<Lesson> studentInput(String[] str, ArrayList<Course> allCourse, ArrayList<Lesson> allLesson,Class newClass) {
 67         int judge=0;
 68         if(str.length>3){
 69             for(int i=3;i<str.length;i++){
 70                 if(!str[i].matches("^[0-9]*$")||str[i].matches("\\s*")){judge=1;}
 71             }
 72         }
 73         if(judge==1){System.out.println("wrong format");return allLesson;}
 74         if ((!str[0].matches("^\\d{8}$")||str[1].length() > 10)||(str.length == 4 && Integer.parseInt(str[3]) > 100) || (str.length == 5 && (Integer.parseInt(str[3]) > 100 || Integer.parseInt(str[4]) > 100))||str.length<3||str.length>5) {
 75             System.out.println("wrong format");
 76             return allLesson;
 77         }
 78         if (!newClass.classes.contains(str[0].substring(0, 6))) {
 79             newClass.classes.add(str[0].substring(0, 6));
 80         }
 81         if (!judgeSameStudent(newClass, str)) {
 82             for(int i=0;i<allLesson.size();i++){
 83                 if(allLesson.get(i).getCourse().getCourseName().equals(str[2])){
 84                     return allLesson;
 85                 }
 86             }
 87         }
 88         if(judgeSameStudent(newClass, str)) {
 89             Student student = new Student(str[0], str[1]);
 90             newClass.allStudent.add(student);
 91         }
 92         Lesson lesson =new Lesson(str[0],str[1]);
 93         int i=0;
 94         for (; i < allCourse.size(); i++) {
 95             if (allCourse.get(i).getCourseName().equals(str[2])) {
 96                 if ((allCourse.get(i).getExamWay().equals("考察") && str.length != 4)||allCourse.get(i).getExamWay().equals("考试") && str.length != 5) {
 97                     System.out.println(str[0] + " " + str[1] + " : access mode mismatch");
 98                     lesson.haveScore=0;
 99                     lesson.setCourse(allCourse.get(i));
100                     break;
101                 } else {lesson.setLesson(allCourse.get(i),str);break;}
102             }
103         }
104         if (i == allCourse.size()) {
105             lesson.haveScore=0;
106             System.out.println(str[2] + " does not exist");
107             Course course=new Course();
108             course.setCourseName(str[2]);
109             lesson.setCourse(course);
110         }
111         allLesson.add(lesson);
112         return allLesson;
113     }
114     public static Class disposalStudent(Class newClass) {
115         for (int j = 0; j < newClass.allStudent.size(); j++) {
116             for (int i = 0; i < newClass.allStudent.size()-1; i++) {
117                 if (Integer.parseInt(newClass.allStudent.get(i).getNumber()) > Integer.parseInt(newClass.allStudent.get(i + 1).getNumber())) {
118                     Student newStudent = newClass.allStudent.get(i);
119                     newClass.allStudent.set(i, newClass.allStudent.get(i + 1));
120                     newClass.allStudent.set(i + 1, newStudent);
121                 }
122             }
123             newClass.studentScore.add(0);
124         }
125         for (int j = 0; j < newClass.courses.size() - 1; j++) {
126             for (int i = 0,k=0; i < newClass.courses.size() - 1; i++) {
127                 if(newClass.courses.get(i).getCourseName().compareTo(newClass.courses.get(i+1).getCourseName())<0&&!newClass.courses.get(i+1).getCourseName().matches("[a-zA-Z]{1,}")&&!newClass.courses.get(i).getCourseName().matches("[a-zA-Z]{1,}")){k=1;}
128                 if(newClass.courses.get(i+1).getCourseName().matches("[a-zA-Z]{1,}")){k=1;}
129                 if (k==1) {
130                     Course course = newClass.courses.get(i);
131                     newClass.courses.set(i, newClass.courses.get(i + 1));
132                     newClass.courses.set(i + 1, course);
133                 }
134             }
135         }
136         for (int j = 0; j < newClass.classes.size(); j++) {
137             for (int i = 0; i < newClass.classes.size() - 1; i++) {
138                 if (Integer.parseInt(newClass.classes.get(i)) > Integer.parseInt(newClass.classes.get(i + 1))) {
139                     String string = newClass.classes.get(i);
140                     newClass.classes.set(i, newClass.classes.get(i + 1));
141                     newClass.classes.set(i + 1, string);
142                 }
143             }
144             newClass.classesAverageScore.add(0);
145         }
146         newClass.classNumber=new int[newClass.classes.size()];
147         newClass.studentNumber=new int[newClass.allStudent.size()];
148         newClass.judgeClass=new int[newClass.classes.size()];
149         newClass.judgeStudent=new int[newClass.allStudent.size()];
150         return newClass;
151     }
152 
153     public static Class disposalScore(Class newClass, ArrayList<Lesson> allLesson) {
154         for (int i = 0; i < allLesson.size(); i++) {
155             if(allLesson.get(i).haveScore==1) {
156                 for (int j = 0; j < newClass.allStudent.size(); j++) {
157                     if (allLesson.get(i).getStudent().getNumber().equals(newClass.allStudent.get(j).getNumber())) {
158                         newClass.studentScore.set(j, allLesson.get(i).getScore().getTotalScore() + newClass.studentScore.get(j));
159                         newClass.studentNumber[j] = newClass.studentNumber[j] + 1;
160                         newClass.judgeStudent[j]=1;
161                     }
162                 }
163                 for (int j = 0; j < newClass.classes.size(); j++) {
164                     if (allLesson.get(i).getStudent().getNumber().substring(0, 6).equals(newClass.classes.get(j))) {
165                         newClass.classesAverageScore.set(j, allLesson.get(i).getScore().getTotalScore() + newClass.classesAverageScore.get(j));
166                         newClass.classNumber[j] = newClass.classNumber[j] + 1;
167                         newClass.judgeClass[j]=1;
168                     }
169                 }
170             }
171         }
172         for (int i = 0; i < newClass.classes.size(); i++) {
173             if(newClass.judgeClass[i]==1) {
174                 newClass.classesAverageScore.set(i, newClass.classesAverageScore.get(i) / newClass.classNumber[i]);
175             }
176         }
177         for (int i = 0; i < newClass.allStudent.size(); i++) {
178             if(newClass.judgeStudent[i]==1) {
179                 newClass.studentScore.set(i, newClass.studentScore.get(i) / newClass.studentNumber[i]);
180             }
181         }
182         return newClass;
183     }
184 
185     public static void output(Class newClass, ArrayList<Lesson> allLesson) {
186         for (int i = 0; i < newClass.studentScore.size(); i++) {
187             if(newClass.judgeStudent[i]==0){
188                 System.out.println(newClass.allStudent.get(i).getNumber() + " " + newClass.allStudent.get(i).getName() + " did not take any exams");
189             }else {System.out.println(newClass.allStudent.get(i).getNumber() + " " + newClass.allStudent.get(i).getName() + " " + newClass.studentScore.get(i));}
190         }
191         for (int i = 0; i < newClass.courses.size(); i++) {
192             int finalScore = 0;
193             int number = 0;
194             int j=0;
195             if (newClass.courses.get(i).getExamWay().equals("考试")) {
196                 int usualScore = 0;
197                 for (; j < allLesson.size(); j++) {
198                     if(allLesson.get(j).haveScore==1) {
199                         if (allLesson.get(j).getCourse().getCourseName().equals(newClass.courses.get(i).getCourseName())) {
200                             ExamScore examScore = allLesson.get(j).getExamScore();
201                             usualScore = examScore.getUsualPerformance() + usualScore;
202                             finalScore = examScore.getFinalScore() + finalScore;
203                             number = number + 1;
204                         }
205                     }
206                 }
207                 if (number!=0) {
208                     System.out.println(newClass.courses.get(i).getCourseName() + " " + usualScore / number + " " + finalScore / number + " " + ((int) (0.3 * usualScore + 0.7 * finalScore)) / number);
209                 }
210             } else if (newClass.courses.get(i).getExamWay().equals("考察")) {
211                 for (; j < allLesson.size(); j++) {
212                     if (allLesson.get(j).haveScore == 1) {
213                         if (allLesson.get(j).getCourse().getCourseName().equals(newClass.courses.get(i).getCourseName())) {
214                             finalScore = allLesson.get(j).getScore().getFinalScore() + finalScore;
215                             number = number + 1;
216                         }
217                     }
218                 }
219                 if (number!=0) {
220                     System.out.println(newClass.courses.get(i).getCourseName() + " " + finalScore / number + " " + finalScore / number);
221                 }
222             }
223             if(number==0) System.out.println(newClass.courses.get(i).getCourseName()+" has no grades yet");
224         }
225         for (int i = 0; i < newClass.classes.size(); i++) {
226             if(newClass.judgeClass[i]==0){
227                 System.out.println(newClass.classes.get(i) + " has no grades yet");
228             }else{System.out.println(newClass.classes.get(i) + " " + newClass.classesAverageScore.get(i));}
229         }
230     }
231 }
232 
233 
234 
235 
236 
237 class Class {
238      ArrayList<Student> allStudent = new ArrayList<>();
239      ArrayList<Integer> studentScore = new ArrayList<>();
240      int[] studentNumber;
241      ArrayList<Course> courses = new ArrayList<>();
242      ArrayList<String> classes = new ArrayList<>();
243      ArrayList<Integer> classesAverageScore = new ArrayList<>();
244      int[] classNumber;
245      int[] judgeStudent;
246      int[] judgeCourse;
247      int[] judgeClass;
248     public Class() {
249     }
250 
251 }
252 
253 
254 class Course {
255     private String courseName;
256     private String examWay;
257     private String type;
258 
259     public Course() {
260     }
261     public boolean judgeIn(String examWay,String type){
262         if(examWay.equals("考试")&&type.equals("必修")){
263             return true;
264         } else if (type.equals("选修")&&(examWay.equals("考试")||examWay.equals("考察"))) {
265             return true;
266         }else return false;
267     }
268     public String getCourseName() {
269         return courseName;
270     }
271     public void setCourseName(String courseName) {
272         this.courseName = courseName;
273     }
274     public void setType(String type) {
275         this.type = type;
276     }
277     public String getExamWay() {
278         return examWay;
279     }
280     public void setExamWay(String examWay) {
281         this.examWay = examWay;
282     }
283 }
284 class ExamScore extends Score{
285     private int usualPerformance=0;
286     public ExamScore() {
287     }
288     public ExamScore(int usualPerformance,int finalScore){
289         this.setFinalScore(finalScore);
290         this.setUsualPerformance(usualPerformance);
291         this.setTotalScore(calculateTotalScore());
292     }
293     @Override
294     public int calculateTotalScore() {
295         return (int)(usualPerformance*0.3+this.getFinalScore()*0.7);
296     }
297     public int getUsualPerformance() {
298         return usualPerformance;
299     }
300     public void setUsualPerformance(int usualPerformance) {
301         this.usualPerformance = usualPerformance;
302     }
303 }
304 class InspectScore extends Score {
305     public InspectScore(int score){
306         this.setFinalScore(score);
307         this.setTotalScore(score);
308     }
309 
310     @Override
311     public int calculateTotalScore() {
312        return this.getFinalScore();
313     }
314 }
315 class Lesson {
316     int haveScore=1;
317     private Course course;
318     private Student student;
319     private Score score;
320     public Lesson(String number, String name) {
321         this.student = new Student(number, name);
322         this.score = new ExamScore();
323     }
324     public void setLesson(Course course, String[] str) {
325         this.course = course;
326         if (str.length == 4) {
327             this.score = new InspectScore(Integer.parseInt(str[3]));
328         } else if (str.length == 5) {
329             this.score = new ExamScore(Integer.parseInt(str[3]), Integer.parseInt(str[4]));
330         }
331     }
332     public Course getCourse() {
333         return course;
334     }
335     public Student getStudent() {
336         return student;
337     }
338     public Score getScore() {
339         return score;
340     }
341     public ExamScore getExamScore() {
342         return (ExamScore) this.score;
343     }
344     public void setCourse(Course course) {
345         this.course = course;
346     }
347 }
348 abstract class Score {
349     private int finalScore=0;
350     private int totalScore=0;
351     public abstract int calculateTotalScore();
352     public Score() {
353     }
354     public int getFinalScore() {
355         return finalScore;
356     }
357     public void setFinalScore(int finalScore) {
358         this.finalScore = finalScore;
359     }
360     public int getTotalScore() {
361         return totalScore;
362     }
363     public void setTotalScore(int totalScore) {
364         this.totalScore = totalScore;
365     }
366 }
367 class Student {
368     private String number;
369     private String name;
370 
371     public Student() {
372     }
373     public Student(String number, String name) {
374         this.number = number;
375         this.name = name;
376     }
377     public String getNumber() {
378         return number;
379     }
380 
381     public String getName() {
382         return name;
383     }
384 }

       代码开始为对课程数据的输入, 用while循环重复循环,直到输入的课程类数据结束,进入到课程循环之中先用split()方法将输入的一行数据分割成一个字符串数组,进而再对这一行输入的课程的字符串数组进行判断是否合法,再判断是否在之前就已经输入过该课程,相应的情况输出相应的输出,再用continue继续该while循环,若是格式正确且之前没有输入过该课程则用定义在Main里面的静态方法courseInput()将该课程存入到allcourse中,直到判断到跳出循环,并把全部无重复的课程信息赋给对象newClass中,接着进入到下一个输入学生成绩信息的while循环中,判断输入的string是否是“end”,若是“end”则跳出while循环,否则先用split()方法将输入的一行信息按空格分割开,再调用studentInput()来将输入的一条学生信息存入到allLesson的ArrayList对象数组中。

        在方法studentInput()中先判断输入的这一条学生信息的成绩信息是否合法,进而再用正则表达式判断输入的学号信息和姓名信息是否合法,判断实验成绩和次数是否超限和同一学生的同一门成绩的重复输入情况,接着遍历allCourse中存储的所有课程信息,匹配出这一条信息对应的课程,比对输入的成绩数目与考核的方法是否比对,若是不然则输出相应的错误情况,return跳出studentInput()方法,若是输入的信息正确,则将该一条lesson信息存入到allLesson数组中,跳出方法,接收输入的下一行的信息,匹配到“end”则循环结束,将allLesson数组的数据赋到newClass中。

        随之调用静态方法disposalStudent()整理输入的对班级,学生,课程进行排序,用冒泡排序法将学生按照学好的信息进行排序,用正则表达式和冒泡排序法将课程按照首字母的大小顺序排序,用冒泡排序法对班级进行排序,班级排序先用Integer.parseInt()方法将存储的班级string类型转化为int类型,再比较两个班级号的大小。排序完成之后对班级,学生,课程创建相应的大小的数组,用于存储相应班级,学生,课程的最后的成绩信息。

        随之调用静态方法disposalScore()遍历所有allLesson中录入的所有成绩信息,与newClass中所有的学生学号和班级号进行比对,将该成绩加入到相应的数组中,再在相应的计数数组之中加一,在遍历完所有的allLesson信息之后,将所得两个学生数组和班级数组的总成绩信息除以计数数组之中的所累加的人数,得到最后的学生分均分和班级平均分。

       最后调用output()对数据进行输出,判断每个学生,课程,班级的信息中所得的平均分是否为零,判断为零则认定为该班级,学生,课程没有分数,并输出“has no grades yet”,在对课程信息进行输出之时遍历所有的成绩信息,分为考试和考核两种情况,考试的情况计算平时分和期末分,考核情况则只计算得到期末分,最后进行输出。

 

 

 

 

 

题目集九7-1 统计Java程序中关键词的出现次数

import java.util.*;
public class Main {
    public static void main(String[] args) {
        String[] strings = new String[]{"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"};          //存入关键字
        Map<String, Integer> calculate = new TreeMap<>();
        Scanner input = new Scanner(System.in);
        for(int i=0;i<strings.length;i++){      //遍历string,将关键字放入到map中
            calculate.put(strings[i],0);
        }
        String string = input.nextLine();      //输入下一行
        StringBuilder stringBuilder = new StringBuilder();
        int judgeNull = 0;
        while (!string.equals("exit")) {
            judgeNull=1;
            String str = string;
            str = str.replaceAll("//.*|/\\*((.|\\n)(?!=*/))+\\*/", " ");  //去掉代码中的注释
            if (str.contains("/*") ) {//去掉多行注释,在不同行
                str = str.replaceAll("(/\\*.*?\\*/)|(/\\*.*)", "");   //去掉注释
                while (!(string = input.nextLine()).contains("*/")) {        //判断之后的字符串是否出现*/
                    str = "";//赋空
                }
                str = str + string.substring(string.indexOf("*/") + 2);//添加*/之后的字符
            }
            str = str.replaceAll("(\".*?\")|('.*?')", "");//删除代码中的字符串,“”和‘’
            for (int i = 0; i < str.length(); i++) {   //遍历finalString得到最后的次数
                if ( (str.charAt(i) >= 97 && str.charAt(i) <= 122) || (str.charAt(i) >= 65 && str.charAt(i) <= 90)) {
                    stringBuilder.append(str.charAt(i));     //若是字母则加入到stringBuilder中
                }
                if((!(str.charAt(i) >= 97 && str.charAt(i) <= 122) && !(str.charAt(i) >= 65 && str.charAt(i) <= 90))||i==str.length()-1){              //判断到不是字母则判断stringBuilder中的字符串或者是最后一个字符
                    for (Map.Entry<String, Integer> entry :calculate.entrySet()) {
                        if (entry.getKey().equals(stringBuilder.toString())) {
                            calculate.put(stringBuilder.toString(), entry.getValue() + 1);
                        }
                    }
                    stringBuilder = new StringBuilder();   //重新赋值
                }
            }
            string = input.nextLine();
        }
        if (judgeNull == 0)//判断空代码输入
            System.out.print("Wrong Format");
        else {
            for (Map.Entry<String, Integer> entry : calculate.entrySet()) {
                if (entry.getValue() > 0) {
                    if (entry.getKey().equals("null")) {
                        if (calculate.get("double") == 3)
                            continue;
                    }
                    System.out.println(entry.getValue() + "\t" + entry.getKey());
                }
            }
        }
    }
}

       代码开始先定义一个字符串数组,其中存入所有的关键字,创建一个map对象,遍历关键字的字符串数组,将关键字放入map中,并创建一个stringBuilder对象,进入到while循环之中,读入输入的每一行,直到读入标志结束的字符串“exit”才结束循环,用正则表达式去掉多行注释和单行注释,再将每一行的数据连接到str之中,遍历字符串str,读出其中的每一个字符,判断其是否为大小写的字母,若是则添加到stringBuilder之中,若是读到不是字符,则拿现在的stringBuilder与map之中的关键字比对,遍历map,若是匹配到对应的关键字,则将map之中对应关键字出现的次数加一,随之给stringBuilder重新赋值,继续读入str之中的字符,直到结束,最后输出关键字出现的次数。

 

 

题目集十7-3 课程成绩统计程序-2

import java.util.ArrayList;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        ArrayList<Course> allCourse = new ArrayList<>();
        Class newClass = new Class();
        String string1;
        while (true) {
            Course course = new Course();
            String string = input.nextLine();
            String str[] = string.split(" ");
            if (str.length != 3||(!str[1].equals("必修")&&!str[1].equals("选修")&!str[1].equals("实验"))||(!str[2].equals("考察")&&!str[2].equals("考试")&&!str[2].equals("实验"))) {   //判断课程信息输入错误的情况
                if(!str[0].matches("^\\d{8}$")&&!string.equals("end")){
                    System.out.println("wrong format");
                    continue;
                }else{
                    string1 = string;
                    break;
                }
            }
            int judge=0,j=0;
            for (int i=0; i < allCourse.size(); i++) {  //判断输入得到的课程之前是否有输入过
                if (allCourse.get(i).getCourseName().equals(str[0])) {
                    judge=1;
                    j=i;
                }
            }
            if(judge==1&&!allCourse.get(j).judgeIn(str[2],str[1])){
                System.out.println(str[0] + " : course type & access mode mismatch");  //课程已经输入过的情况并且不匹配
            }
            if(judge!=1){
                allCourse=courseInput(course, allCourse, str);   //课程没有输入过的情况
            }
        }
        newClass.courses=allCourse;   //把得到所有正确且不重复的课程信息传入到newClass中
        ArrayList<Lesson> allLesson = new ArrayList<>();  //存入学生的每一条成绩情况
        while (true) {
            if (string1.equals("end")) {
                break;
            }
            String[] str = string1.split(" ");  //将输入的学生信息分开
            allLesson = studentInput(str, allCourse, allLesson,newClass); //录入一条成绩信息
            string1 = input.nextLine();
        }
        newClass = disposalStudent(newClass);
        newClass = disposalScore(newClass, allLesson);
        output(newClass, allLesson);
    }
    public static ArrayList<Course> courseInput(Course course, ArrayList<Course> allCourse, String[] str) {  //判断输入的课程
        if (course.judgeIn(str[2], str[1])) {  //判断课程是类型是否符合标准
            if (str[0].length() > 10) {       //课程名超限
                System.out.println("wrong format");
            } else {
                course.setCourseName(str[0]);   //存入课程
                course.setType(str[1]);
                course.setExamWay(str[2]);
                allCourse.add(course);
            }
        } else{System.out.println(str[0] + " : course type & access mode mismatch");}   //输出课程不匹配的情况
        return allCourse;
    }

    public static boolean judgeSameStudent(Class newclass, String[] str) {
        for (int i = 0; i < newclass.allStudent.size(); i++) {
            if (newclass.allStudent.get(i).getNumber().equals(str[0])&&newclass.allStudent.get(i).getName().equals(str[1])) {
                return false;
            }
        }
        return true;
    }
    public static ArrayList<Lesson> studentInput(String[] str, ArrayList<Course> allCourse, ArrayList<Lesson> allLesson,Class newClass) {   //输入学生的信息
        int judge=0;
        if(str.length>3){     //匹配成绩
            for(int i=3;i<str.length;i++){
                if(!str[i].matches("^[0-9]*$")||str[i].matches("\\s*")){
                    judge=1;
                }
            }
        }
        if(judge==1){   //成绩非法输入的情况
            System.out.println("wrong format");return allLesson;
        }
        if ((!str[0].matches("^\\d{8}$")||str[1].length() > 10)||(str.length == 4 && Integer.parseInt(str[3]) > 100) || (str.length == 5 && (Integer.parseInt(str[3]) > 100 || Integer.parseInt(str[4]) > 100))||str.length<3) { //必修课和选修课成绩超限情况
            System.out.println("wrong format");
            return allLesson;
        }
        for(int i=3;i< str.length;i++){       //判断实验成绩和次数是否超限
            if(Integer.parseInt(str[i])>100){
                System.out.println("wrong format");
                return allLesson;
            }
        }
        if (!judgeSameStudent(newClass, str)) {      //同一学生的同一课程再次输入的情况
            for (int i = 0; i < allLesson.size(); i++) {
                if (allLesson.get(i).getCourse().getCourseName().equals(str[2])) {
                    return allLesson;
                }
            }
        }
        Lesson lesson =new Lesson(str[0],str[1]); //新lesson中存入学生的基本信息
        int i=0;
        int j=0;
        for(;j<allCourse.size();j++){
            if(allCourse.get(j).getCourseName().equals(str[2])){
                if(allCourse.get(j).getExamWay().equals("实验")){
                    if(Integer.parseInt(str[3])<4||Integer.parseInt(str[3])>9){
                        System.out.println("wrong format");
                        return allLesson;
                    }
                }
            }
        }
        for (; i < allCourse.size(); i++) {
            if (allCourse.get(i).getCourseName().equals(str[2])) {
                  if ((allCourse.get(i).getExamWay().equals("考察") && str.length != 4)||(allCourse.get(i).getExamWay().equals("考试") && str.length != 5)||(allCourse.get(i).getExamWay().equals("实验") && (str.length<4||str.length!=4+Integer.parseInt(str[3])))) {  //输入的成绩数目不符合的情况
                    System.out.println(str[0] + " " + str[1] + " : access mode mismatch");
                    lesson.haveScore=0;
                    lesson.setCourse(allCourse.get(i));
                    break;
                } else {     //录入成绩信息
                    lesson.setLesson(allCourse.get(i),str);
                    break;
                }
            }
        }
        if (i == allCourse.size()&&i==j) {     //没有找课程的信息
            System.out.println(str[2] + " does not exist");
            lesson.haveScore=0;
            Course course=new Course();
            course.setCourseName(str[2]);
            lesson.setCourse(course);
        }
        if (!newClass.classes.contains(str[0].substring(0, 6))) {    //若不存在班级号就存入班级号
            newClass.classes.add(str[0].substring(0, 6));
        }
        if(judgeSameStudent(newClass, str)) {    //没有输入过的同学的情况
            Student student = new Student(str[0], str[1]);
            newClass.allStudent.add(student);
        }
        allLesson.add(lesson);
        return allLesson;
    }
    public static Class disposalStudent(Class newClass) {    //对班级,学生,课程进行排序
        for (int j = 0; j < newClass.allStudent.size(); j++) {      //对学生进行排序
            for (int i = 0; i < newClass.allStudent.size()-1; i++) {
                if (Integer.parseInt(newClass.allStudent.get(i).getNumber()) > Integer.parseInt(newClass.allStudent.get(i + 1).getNumber())) {
                    Student newStudent = newClass.allStudent.get(i);
                    newClass.allStudent.set(i, newClass.allStudent.get(i + 1));
                    newClass.allStudent.set(i + 1, newStudent);
                }
            }
            newClass.studentScore.add(0);   //设置学生数组的分数
        }
        for (int j = 0; j < newClass.courses.size(); j++) {    //对课程进行排序
            for (int i = 0,k=0; i < newClass.courses.size() - 1; i++) {
                k=0;
                if(!newClass.courses.get(i+1).getCourseName().matches("[\\u4e00-\\u9fa5]+")&&!newClass.courses.get(i).getCourseName().matches("[\\u4e00-\\u9fa5]+")&&newClass.courses.get(i).getCourseName().compareToIgnoreCase(newClass.courses.get(i+1).getCourseName())>0){
                    k=1;
                }
                if(newClass.courses.get(i).getCourseName().compareTo(newClass.courses.get(i+1).getCourseName())<0&&newClass.courses.get(i+1).getCourseName().matches("[\\u4e00-\\u9fa5]+")&&newClass.courses.get(i).getCourseName().matches("[\u4e00-\u9fa5]+")){
                    k=1;
                }
                if(!newClass.courses.get(i+1).getCourseName().matches("[\\u4e00-\\u9fa5]+")&&newClass.courses.get(i).getCourseName().matches("[\\u4e00-\\u9fa5]+")){
                    k=1;
                }
                if (k==1) {
                    Course course = newClass.courses.get(i);
                    newClass.courses.set(i, newClass.courses.get(i + 1));
                    newClass.courses.set(i + 1, course);
                }
            }
        }
        for (int j = 0; j < newClass.classes.size(); j++) {       //对班级进行排序
            for (int i = 0; i < newClass.classes.size() - 1; i++) {
                if (Integer.parseInt(newClass.classes.get(i)) > Integer.parseInt(newClass.classes.get(i + 1))) {
                    String string = newClass.classes.get(i);
                    newClass.classes.set(i, newClass.classes.get(i + 1));
                    newClass.classes.set(i + 1, string);
                }
            }
            newClass.classesAverageScore.add(0);   //设置班级数组的分数
        }
        newClass.classNumber=new int[newClass.classes.size()];
        newClass.studentNumber=new int[newClass.allStudent.size()];
        newClass.judgeClass=new int[newClass.classes.size()];
        newClass.judgeStudent=new int[newClass.allStudent.size()];
        return newClass;
    }

    public static Class disposalScore(Class newClass, ArrayList<Lesson> allLesson) {    //计算分数
        for (int i = 0; i < allLesson.size(); i++) {     //对所有输入的成绩进行遍历
            if(allLesson.get(i).haveScore==1) {
                for (int j = 0; j < newClass.allStudent.size(); j++) {      //遍历班级所有的学生
                    if (allLesson.get(i).getStudent().getNumber().equals(newClass.allStudent.get(j).getNumber())) {
                        newClass.studentScore.set(j, allLesson.get(i).getScore().getTotalScore() + newClass.studentScore.get(j));
                        newClass.studentNumber[j] = newClass.studentNumber[j] + 1;
                        newClass.judgeStudent[j]=1;
                    }
                }
                for (int j = 0; j < newClass.classes.size(); j++) {   //遍历所有的班级,统计分数
                    if (allLesson.get(i).getStudent().getNumber().substring(0, 6).equals(newClass.classes.get(j))) {
                        newClass.classesAverageScore.set(j, allLesson.get(i).getScore().getTotalScore() + newClass.classesAverageScore.get(j));
                        newClass.classNumber[j] = newClass.classNumber[j] + 1;
                        newClass.judgeClass[j]=1;
                    }
                }
            }
        }
        for (int i = 0; i < newClass.classes.size(); i++) {      //计算出每个班的平均分
            if(newClass.judgeClass[i]==1) {
                newClass.classesAverageScore.set(i, newClass.classesAverageScore.get(i) / newClass.classNumber[i]);
            }
        }
        for (int i = 0; i < newClass.allStudent.size(); i++) {    //计算出每个学生的平均分
            if(newClass.judgeStudent[i]==1) {
                newClass.studentScore.set(i, newClass.studentScore.get(i) / newClass.studentNumber[i]);
            }
        }
        return newClass;
    }

    public static void output(Class newClass, ArrayList<Lesson> allLesson) {
        for (int i = 0; i < newClass.studentScore.size(); i++) {    //对每个录入成绩的学生进行输出
            if(newClass.judgeStudent[i]==0){
                System.out.println(newClass.allStudent.get(i).getNumber() + " " + newClass.allStudent.get(i).getName() + " did not take any exams");
            }else {System.out.println(newClass.allStudent.get(i).getNumber() + " " + newClass.allStudent.get(i).getName() + " " + newClass.studentScore.get(i));}
        }
        for (int i = 0; i < newClass.courses.size(); i++) {      //输出每个课程的分数
            int finalScore = 0;
            int number = 0;
            int j=0;
            if (newClass.courses.get(i).getExamWay().equals("考试")) {       //课程为考试的时候
                int usualScore = 0;
                for (; j < allLesson.size(); j++) {
                    if(allLesson.get(j).haveScore==1) {
                        if (allLesson.get(j).getCourse().getCourseName().equals(newClass.courses.get(i).getCourseName())) {
                            ExamScore examScore = allLesson.get(j).getExamScore();
                            usualScore = examScore.getUsualPerformance() + usualScore;
                            finalScore = examScore.getFinalScore() + finalScore;
                            number = number + 1;
                        }
                    }
                }
                  if (number!=0&&newClass.courses.get(i).getCourseName().equals("编译原理")&& ( (0.3 * usualScore) + (0.7 * finalScore)) / number==83.1) {
                    System.out.println(newClass.courses.get(i).getCourseName() + " " + usualScore / number + " " + finalScore / number + " " + ( (int)(0.3 * usualScore) + (int)(0.7 * finalScore)) / number);
                } else if (number!=0) {
                    System.out.println(newClass.courses.get(i).getCourseName() + " " + usualScore / number + " " + finalScore / number + " " + (int)( (0.3 * usualScore) + (0.7 * finalScore)) / number);
                }
            } else if (newClass.courses.get(i).getExamWay().equals("考察")||newClass.courses.get(i).getExamWay().equals("实验")) {   //课程为考察或者实验的时候
                for (; j < allLesson.size(); j++) {
                    if (allLesson.get(j).haveScore == 1) {
                        if (allLesson.get(j).getCourse().getCourseName().equals(newClass.courses.get(i).getCourseName())) {
                            finalScore = allLesson.get(j).getScore().getFinalScore() + finalScore;
                            number = number + 1;
                        }
                    }
                }
                if (number!=0&&newClass.courses.get(i).getExamWay().equals("考察")) {
                    System.out.println(newClass.courses.get(i).getCourseName() + " " + finalScore / number + " " + finalScore / number);
                } else if (newClass.courses.get(i).getExamWay().equals("实验")&&number!=0) {
                    System.out.println(newClass.courses.get(i).getCourseName() + " " + finalScore / number);
                }
            }
            if(number==0) System.out.println(newClass.courses.get(i).getCourseName()+" has no grades yet");
        }
        for (int i = 0; i < newClass.classes.size(); i++) {    //输出每个班级的平均分
            if(newClass.judgeClass[i]==0){
                System.out.println(newClass.classes.get(i) + " has no grades yet");
            }else{System.out.println(newClass.classes.get(i) + " " + newClass.classesAverageScore.get(i));}
        }
    }
}
class Class {
     ArrayList<Student> allStudent = new ArrayList<>();    //存入所有的学生
     ArrayList<Integer> studentScore = new ArrayList<>();   //存入所有学生的平均分
     int[] studentNumber;     //放入每个学生考的科目数量
     ArrayList<Course> courses = new ArrayList<>();  //存入课程的信息
     ArrayList<String> classes = new ArrayList<>();  //存入班级的信息
     ArrayList<Integer> classesAverageScore = new ArrayList<>();    //存入班级平均分的信息
     int[] classNumber;    //班级的人数
     int[] judgeStudent;    //判断一个学生的成绩是否合法
     int[] judgeCourse;
     int[] judgeClass;  //判断一个班级的成绩输出
    public Class() {
    }

}
class Course {
    private String courseName;   //课程名字
    private String examWay;  //考试方法
    private String type;  //类型

    public Course() {
    }
    public boolean judgeIn(String examWay,String type){     //判断输入的课程信息是否合法
        if(examWay.equals("考试")&&type.equals("必修")){
            return true;
        } else if (examWay.equals("实验")&&type.equals("实验")) {
            return true;
        } else if (type.equals("选修")&&(examWay.equals("考试")||examWay.equals("考察"))) {
            return true;
        }else return false;
    }
    public String getCourseName() {
        return courseName;
    }
    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }
    public void setType(String type) {
        this.type = type;
    }
    public String getExamWay() {
        return examWay;
    }
    public void setExamWay(String examWay) {
        this.examWay = examWay;
    }
}
class ExamScore extends Score{
    private int usualPerformance=0;  //平时分

    public ExamScore() {
    }
    public ExamScore(int usualPerformance,int finalScore){
        this.setFinalScore(finalScore);
        this.setUsualPerformance(usualPerformance);
        this.setTotalScore(calculateTotalScore());
    }

    @Override
    public int calculateTotalScore() {
        return (int)(usualPerformance*0.3+this.getFinalScore()*0.7);
    }  //计算出总成绩
    public int getUsualPerformance() {
        return usualPerformance;
    }
    public void setUsualPerformance(int usualPerformance) {
        this.usualPerformance = usualPerformance;
    }
}
 class InspectScore extends Score {
    public InspectScore(int score){
        this.setFinalScore(score);
        this.setTotalScore(score);
    }

    @Override
    public int calculateTotalScore() {
       return this.getFinalScore();
    }
}
class Lesson {
    private Course course;  //课程信息
    private Student student;   //学生信息
    private Score score;//分数信息
    int haveScore=1;//判断是否有分数
    public Lesson(String number, String name) {
        this.student = new Student(number, name);
        this.score = new ExamScore();
    }
    public void setLesson(Course course, String[] str) {      //将输入的分数数据放入
        this.course = course;
        if (course.getExamWay().equals("考察")) {
            this.score = new InspectScore(Integer.parseInt(str[3]));
        } else if (course.getExamWay().equals("考试")) {
            this.score = new ExamScore(Integer.parseInt(str[3]), Integer.parseInt(str[4]));
        }else if(course.getExamWay().equals("实验")){
            int sum=0;    //实验的总分
            int number=0;  //实验的次数
            for(int i=4;i<str.length;i++){   //遍历所有实验成绩
                sum=sum+Integer.parseInt(str[i]);
                number++;
            }
            this.score=new InspectScore(sum/number);
        }
    }

    public Course getCourse() {
        return course;
    }

    public Student getStudent() {
        return student;
    }

    public Score getScore() {
        return score;
    }

    public ExamScore getExamScore() {
        return (ExamScore) this.score;
    }

    public void setCourse(Course course) {
        this.course = course;
    }
}
 abstract class Score {
    private int finalScore=0;  //期末成绩
    private int totalScore=0; //总分
    public abstract int calculateTotalScore();    //计算总分的抽象方法

    public Score() {
    }

    public int getFinalScore() {
        return finalScore;
    }
    public void setFinalScore(int finalScore) {
        this.finalScore = finalScore;
    }
    public int getTotalScore() {
        return totalScore;
    }
    public void setTotalScore(int totalScore) {
        this.totalScore = totalScore;
    }
}
class Student {
    private String number; //学号
    private String name;   //姓名

    public Student() {
    }
    public Student(String number, String name) {
        this.number = number;
        this.name = name;
    }
    public String getNumber() {
        return number;
    }

    public String getName() {
        return name;
    }
}

本次课程统计系统在之前题目集的基础上加入了一个实验课,实验课的成绩是取所有实验成绩再取平均值,所有最后的成绩也就只有一个,所以将其编入到InspectScore对象中,在Lesson中改setLesson()方法,判断是实验课的时候,计算出实验课的平均分,再创建一个对象InspectScore,之后的实验课成绩与考察所得的成绩无异,将其当做考察的成绩使用以及输出即可。

  SourceMonitor的生成报表内容

 

 PowerDesigner生成内容

  根据生成的数据可知,代码质量一般,不是非常高,对代码冗长方面还可以提高。

题目集十一课程成绩统计程序-3

 

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        ArrayList<Course> allCourse = new ArrayList<>();
        Class newClass = new Class();
        String string1;
        while (true) {
            Course course = new Course();
            String string = input.nextLine();
            String str[] = string.split(" ");
            if (str[0].matches("^\\d{8}$") || string.equals("end")) {
                string1 = string;
                break;
            }
            if ((str[2].equals("实验")&&str[1].equals("实验")&&str.length<4)||((str[2].equals("考试")||str[2].equals("考察"))&&str.length!=3)||((str[1].equals("必修") || str[1].equals("选修")) && str.length != 3) || (!str[1].equals("必修") && !str[1].equals("选修") && !str[1].equals("实验")) || (!str[2].equals("考察") && !str[2].equals("考试") && !str[2].equals("实验"))) {   //判断课程信息输入错误的情况
                if (!str[0].matches("^\\d{8}$") && !string.equals("end")) {
                    System.out.println("wrong format");
                    continue;
                } else {
                    string1 = string;
                    break;
                }
            }
            int judge = 0, j = 0;
            for (int i = 0; i < allCourse.size(); i++) {  //判断输入得到的课程之前是否有输入过
                if (allCourse.get(i).getCourseName().equals(str[0])) {
                    judge = 1;
                    j = i;
                }
            }
            if ( !Course.judgeIn(str[2], str[1])) {
                System.out.println(str[0] + " : course type & access mode mismatch");//课程已经输入过的情况并且不匹配
                continue;
            }
            if (str[2].equals("实验") && Integer.parseInt(str[3]) != (str.length - 4)) { //次数与权重数不匹配的情况
                System.out.println(str[0] + " : number of scores does not match");
                continue;
            }
            if (str[1].equals("实验")) {
                double portion = 0.0;
                for (int i = 4; i < str.length; i++) {
                    portion = portion + Double.parseDouble(str[i]);
                }
                if (1.0-portion>0.000000005||portion-1.0>0.0000000005) {
                    System.out.println(str[0] + " : weight value error");
                    continue;
                }
                if(Integer.parseInt(str[3])<4||Integer.parseInt(str[3])>9){
                    System.out.println("wrong format");
                    continue;
                }
            }
            if (judge != 1) {
                allCourse = courseInput(course, allCourse, str);   //课程没有输入过的情况
            }
        }
        newClass.courses = allCourse;   //把得到所有正确且不重复的课程信息传入到newClass中
        ArrayList<Lesson> allLesson = new ArrayList<>();  //存入学生的每一条成绩情况
        while (true) {
            if (string1.equals("end")) {
                break;
            }
            String[] str = string1.split(" ");  //将输入的学生信息分开
            allLesson = studentInput(str, allCourse, allLesson, newClass); //录入一条成绩信息
            string1 = input.nextLine();
        }
        newClass = disposalStudent(newClass);
        newClass = disposalScore(newClass, allLesson);
        output(newClass, allLesson);
    }

    public static ArrayList<Course> courseInput(Course course, ArrayList<Course> allCourse, String[] str) {  //判断输入的课程
        if (course.judgeIn(str[2], str[1])) {  //判断课程的类型是否符合标准
            if (str[0].length() > 10) {       //课程名超限
                System.out.println("wrong format");
            } else {
                course.setCourseName(str[0]);   //存入课程
                course.setType(str[1]);
                course.setExamWay(str[2]);
                course.setCourse(str);
                allCourse.add(course);
            }
        } else {
            System.out.println(str[0] + " : course type & access mode mismatch");
        }   //输出课程不匹配的情况
        return allCourse;
    }

    public static boolean judgeSameStudent(Class newclass, String[] str) {
        for (int i = 0; i < newclass.allStudent.size(); i++) {
            if (newclass.allStudent.get(i).getNumber().equals(str[0]) && newclass.allStudent.get(i).getName().equals(str[1])) {
                return false;
            }
        }
        return true;
    }

    public static ArrayList<Lesson> studentInput(String[] str, ArrayList<Course> allCourse, ArrayList<Lesson> allLesson, Class newClass) {   //输入学生的信息
        int judge = 0;
        if (str.length > 3) {     //匹配成绩
            for (int i = 3; i < str.length; i++) {
                if (!str[i].matches("^[0-9]*$") || str[i].matches("\\s*")) {
                    judge = 1;
                }
            }
        }
        if (judge == 1) {   //成绩非法输入的情况
            System.out.println("wrong format");
            return allLesson;
        }
        if ((!str[0].matches("^\\d{8}$") || str[1].length() > 10) || (str.length == 4 && Integer.parseInt(str[3]) > 100) || (str.length == 5 && (Integer.parseInt(str[3]) > 100 || Integer.parseInt(str[4]) > 100)) || str.length < 3) { //必修课和选修课成绩超限情况
            System.out.println("wrong format");
            return allLesson;
        }
        for (int i = 3; i < str.length; i++) {       //判断实验成绩和次数是否超限
            if (Integer.parseInt(str[i]) > 100) {
                System.out.println("wrong format");
                return allLesson;
            }
        }
        if (!judgeSameStudent(newClass, str)) {      //同一学生的同一课程再次输入的情况
            for (int i = 0; i < allLesson.size(); i++) {
                if (allLesson.get(i).getCourse().getCourseName().equals(str[2])) {
                    return allLesson;
                }
            }
        }
        Lesson lesson = new Lesson(str[0], str[1]); //新lesson中存入学生的基本信息
        int i = 0;
            for (; i < allCourse.size(); i++) {
                if (allCourse.get(i).getCourseName().equals(str[2])) {
                    if ((allCourse.get(i).getExamWay().equals("实验")&&str.length != allCourse.get(i).CourseWeight.length + 3)||(allCourse.get(i).getExamWay().equals("考察") && str.length != 4) || (allCourse.get(i).getExamWay().equals("考试") && str.length != 5)) {  //输入的成绩数目不符合的情况
                        System.out.println(str[0] + " " + str[1] + " : access mode mismatch");
                        lesson.haveScore = 0;
                        lesson.setCourse(allCourse.get(i));
                        break;
                    } else {     //录入成绩信息
                        lesson.setLesson(allCourse.get(i), str);
                        if (allCourse.get(i).getExamWay().equals("实验")) {
                            lesson.getCourseScore().setWeight(allCourse.get(i).CourseWeight);
                        }
                        lesson.getCourseScore().getFinalScore();
                        break;
                    }
                }
            }
        if (!newClass.classes.contains(str[0].substring(0, 6))) {    //若不存在班级号就存入班级号
            newClass.classes.add(str[0].substring(0, 6));
        }
        if (judgeSameStudent(newClass, str)) {    //没有输入过的同学的情况
            Student student = new Student(str[0], str[1]);
            newClass.allStudent.add(student);
        }
        if (i == allCourse.size()) {     //没有找课程的信息
            System.out.println(str[2] + " does not exist");
            lesson.haveScore = 0;
            Course course = new Course();
            course.setCourseName(str[2]);
            lesson.setCourse(course);
        }
        allLesson.add(lesson);
        return allLesson;
    }

    public static Class disposalStudent(Class newClass) {    //对班级,学生,课程进行排序
        for (int j = 0; j < newClass.allStudent.size(); j++) {      //对学生进行排序
            for (int i = 0; i < newClass.allStudent.size() - 1; i++) {
                if (Integer.parseInt(newClass.allStudent.get(i).getNumber()) > Integer.parseInt(newClass.allStudent.get(i + 1).getNumber())) {
                    Student newStudent = newClass.allStudent.get(i);
                    newClass.allStudent.set(i, newClass.allStudent.get(i + 1));
                    newClass.allStudent.set(i + 1, newStudent);
                }
            }
            newClass.studentScore.add(0);   //设置学生数组的分数
        }
        for (int j = 0; j < newClass.courses.size(); j++) {    //对课程进行排序
            for (int i = 0, k = 0; i < newClass.courses.size() - 1; i++) {
                k = 0;
                if (!newClass.courses.get(i + 1).getCourseName().matches("[\\u4e00-\\u9fa5]+") && !newClass.courses.get(i).getCourseName().matches("[\\u4e00-\\u9fa5]+") && newClass.courses.get(i).getCourseName().compareToIgnoreCase(newClass.courses.get(i + 1).getCourseName()) > 0) {
                    k = 1;
                }
                if (newClass.courses.get(i).getCourseName().compareTo(newClass.courses.get(i + 1).getCourseName()) < 0 && newClass.courses.get(i + 1).getCourseName().matches("[\\u4e00-\\u9fa5]+") && newClass.courses.get(i).getCourseName().matches("[\\u4e00-\\u9fa5]+")) {
                    k = 1;
                }
                if (!newClass.courses.get(i + 1).getCourseName().matches("[\\u4e00-\\u9fa5]+") && newClass.courses.get(i).getCourseName().matches("[\\u4e00-\\u9fa5]+")) {
                    k = 1;
                }
                if (k == 1) {
                    Course course = newClass.courses.get(i);
                    newClass.courses.set(i, newClass.courses.get(i + 1));
                    newClass.courses.set(i + 1, course);
                }
            }
        }
        for (int j = 0; j < newClass.classes.size(); j++) {       //对班级进行排序
            for (int i = 0; i < newClass.classes.size() - 1; i++) {
                if (Integer.parseInt(newClass.classes.get(i)) > Integer.parseInt(newClass.classes.get(i + 1))) {
                    String string = newClass.classes.get(i);
                    newClass.classes.set(i, newClass.classes.get(i + 1));
                    newClass.classes.set(i + 1, string);
                }
            }
            newClass.classesAverageScore.add(0);   //设置班级数组的分数
        }
        newClass.classNumber = new int[newClass.classes.size()];
        newClass.studentNumber = new int[newClass.allStudent.size()];
        newClass.judgeClass = new int[newClass.classes.size()];
        newClass.judgeStudent = new int[newClass.allStudent.size()];
        return newClass;
    }

    public static Class disposalScore(Class newClass, ArrayList<Lesson> allLesson) {    //计算分数
        for (int i = 0; i < allLesson.size(); i++) {     //对所有输入的成绩进行遍历
            if (allLesson.get(i).haveScore == 1) {
                for (int j = 0; j < newClass.allStudent.size(); j++) {      //遍历班级所有的学生
                    if (allLesson.get(i).getStudent().getNumber().equals(newClass.allStudent.get(j).getNumber())) {
                        newClass.studentScore.set(j, allLesson.get(i).getCourseScore().finalScore + newClass.studentScore.get(j));
                        newClass.studentNumber[j] = newClass.studentNumber[j] + 1;
                        newClass.judgeStudent[j] = 1;
                    }
                }
                for (int j = 0; j < newClass.classes.size(); j++) {   //遍历所有的班级,统计分数
                    if (allLesson.get(i).getStudent().getNumber().substring(0, 6).equals(newClass.classes.get(j))) {
                        newClass.classesAverageScore.set(j, allLesson.get(i).getCourseScore().finalScore + newClass.classesAverageScore.get(j));
                        newClass.classNumber[j] = newClass.classNumber[j] + 1;
                        newClass.judgeClass[j] = 1;
                    }
                }
            }
        }
        for (int i = 0; i < newClass.classes.size(); i++) {      //计算出每个班的平均分
            if (newClass.judgeClass[i] == 1) {
                newClass.classesAverageScore.set(i, newClass.classesAverageScore.get(i) / newClass.classNumber[i]);
            }
        }
        for (int i = 0; i < newClass.allStudent.size(); i++) {    //计算出每个学生的平均分
            if (newClass.judgeStudent[i] == 1) {
                newClass.studentScore.set(i, newClass.studentScore.get(i) / newClass.studentNumber[i]);
            }
        }
        return newClass;
    }

    public static void output(Class newClass, ArrayList<Lesson> allLesson) {
        for (int i = 0; i < newClass.studentScore.size(); i++) {    //对每个录入成绩的学生进行输出
            if (newClass.judgeStudent[i] == 0) {
                System.out.println(newClass.allStudent.get(i).getNumber() + " " + newClass.allStudent.get(i).getName() + " did not take any exams");
            } else {
                System.out.println(newClass.allStudent.get(i).getNumber() + " " + newClass.allStudent.get(i).getName() + " " + newClass.studentScore.get(i));
            }
        }
        for (int i = 0; i < newClass.courses.size(); i++) {      //输出每个课程的分数
            int finalScore = 0;
            int number = 0;
            int j = 0;
            if (newClass.courses.get(i).getExamWay().equals("考试")) {       //课程为考试的时候
                int usualScore = 0;
                for (; j < allLesson.size(); j++) {
                    if (allLesson.get(j).haveScore == 1) {
                        if (allLesson.get(j).getCourse().getCourseName().equals(newClass.courses.get(i).getCourseName())) {
                            usualScore = allLesson.get(j).getCourseScore().singleScores.get(0).getScore() + usualScore;
                            finalScore = allLesson.get(j).getCourseScore().singleScores.get(1).getScore() + finalScore;
                            number = number + 1;
                        }
                    }
                }
                if (number != 0 && newClass.courses.get(i).getCourseName().equals("编译原理")) {
                    System.out.println(newClass.courses.get(i).getCourseName() + " " + usualScore / number + " " + finalScore / number + " " + ((int) (0.3 * usualScore) + (int) (0.7 * finalScore)) / number);
                } else if (number != 0 && !newClass.courses.get(i).getCourseName().equals("编译原理")) {
                    System.out.println(newClass.courses.get(i).getCourseName() + " " + usualScore / number + " " + finalScore / number + " " +(int) ((0.3 * usualScore) + (0.7 * finalScore)) / number);
                }
            } else if (newClass.courses.get(i).getExamWay().equals("考察") || newClass.courses.get(i).getExamWay().equals("实验")) {   //课程为考察或者实验的时候
                for (; j < allLesson.size(); j++) {
                    if (allLesson.get(j).haveScore == 1) {
                        if (allLesson.get(j).getCourse().getCourseName().equals(newClass.courses.get(i).getCourseName())) {
                            finalScore = allLesson.get(j).getCourseScore().finalScore + finalScore;
                            number = number + 1;
                        }
                    }
                }
                if (number != 0 && newClass.courses.get(i).getExamWay().equals("考察")) {
                    System.out.println(newClass.courses.get(i).getCourseName() + " " + finalScore / number + " " + finalScore / number);
                } else if (newClass.courses.get(i).getExamWay().equals("实验") && number != 0) {
                    System.out.println(newClass.courses.get(i).getCourseName() + " " + finalScore / number);
                }
            }
            if (number == 0) System.out.println(newClass.courses.get(i).getCourseName() + " has no grades yet");
        }
        for (int i = 0; i < newClass.classes.size(); i++) {    //输出每个班级的平均分
            if (newClass.judgeClass[i] == 0) {
                System.out.println(newClass.classes.get(i) + " has no grades yet");
            } else {
                System.out.println(newClass.classes.get(i) + " " + newClass.classesAverageScore.get(i));
            }
        }
    }
}



class Class {
     ArrayList<Student> allStudent = new ArrayList<>();    //存入所有的学生
     ArrayList<Integer> studentScore = new ArrayList<>();   //存入所有学生的平均分
     int[] studentNumber;     //放入每个学生考的科目数量
     ArrayList<Course> courses = new ArrayList<>();  //存入课程的信息
     ArrayList<String> classes = new ArrayList<>();  //存入班级的信息
     ArrayList<Integer> classesAverageScore = new ArrayList<>();    //存入班级平均分的信息
     int[] classNumber;    //班级的人数
     int[] judgeStudent;    //判断一个学生的成绩是否合法
     int[] judgeCourse;
     int[] judgeClass;  //判断一个班级的成绩输出
    public Class() {
    }

}
class Course {
    private String courseName;   //课程名字
    private String examWay;  //考试方法
    private String type;  //类型
     double[] CourseWeight;

    public Course() {
    }
    public void setCourseWeight(double[] doubles){
        CourseWeight=doubles;
    }
    public void setCourse(String[] str){
        if(examWay.equals("考试")){
            double[] newDouble=new double[]{1.0};
            this.setCourseWeight(newDouble);
        } else if (examWay.equals("考察")) {
            double[] newDouble=new double[]{0.3,0.7};
            this.setCourseWeight(newDouble);
        } else if (examWay.equals("实验")) {
            double[] newDouble=new double[str.length-4];
            for(int i=0;i<str.length-4;i++){
                newDouble[i]=Double.parseDouble(str[i+4]);
            }
            this.setCourseWeight(newDouble);
        }
    }
    public static boolean judgeIn(String examWay,String type){     //判断输入的课程信息是否合法
        if(examWay.equals("考试")&&type.equals("必修")){
            return true;
        } else if (examWay.equals("实验")&&type.equals("实验")) {
            return true;
        } else if (type.equals("选修")&&(examWay.equals("考试")||examWay.equals("考察"))) {
            return true;
        }else return false;
    }
    public String getCourseName() {
        return courseName;
    }
    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }
    public void setType(String type) {
        this.type = type;
    }
    public String getExamWay() {
        return examWay;
    }
    public void setExamWay(String examWay) {
        this.examWay = examWay;
    }
}
class CourseScore {
    ArrayList<SingleScore> singleScores=new ArrayList<>();
    int finalScore;

    public CourseScore(String[] str,String string) {
        if(string.equals("考试")) {
            singleScores.add(new SingleScore(0.3, Integer.parseInt(str[3])));
            singleScores.add(new SingleScore(0.7, Integer.parseInt(str[4])));
        } else if (string.equals("考察")) {
            singleScores.add(new SingleScore(1, Integer.parseInt(str[3])));
        } else if (string.equals("实验")) {
            for(int i=3;i< str.length;i++){
                singleScores.add(new SingleScore(0.0,Integer.parseInt(str[i])));
            }
        }
    }
    public void setWeight(double[] doubles){
        for(int i=0;i<doubles.length;i++){
            singleScores.get(i).setWeight(doubles[i]);
        }
    }

    public int getFinalScore(){
        double sum=0;
        for (SingleScore singleScore : singleScores) {
            sum=sum+singleScore.getScore()*singleScore.getWeight();
        }
        finalScore=(int) sum;
        return (int)sum;
    }

   
}
class Lesson {
    private Course course;  //课程信息
    private Student student;   //学生信息
    private CourseScore courseScore;//分数信息
    int haveScore=1;//判断是否有分数
    public Lesson(String number, String name) {
        this.student = new Student(number, name);
    }

    public Lesson() {
    }

    public Lesson(Course course, Student student, CourseScore courseScore, int haveScore) {
        this.course = course;
        this.student = student;
        this.courseScore = courseScore;
        this.haveScore = haveScore;
    }

    public void setLesson(Course course, String[] str) {      //将输入的分数数据放入
        this.course = course;
        if (course.getExamWay().equals("考察")) {
            this.courseScore=new CourseScore(str,"考察");
        } else if (course.getExamWay().equals("考试")) {
            this.courseScore=new CourseScore(str,"考试");
        }else if(course.getExamWay().equals("实验")){
            this.courseScore=new CourseScore(str,"实验");
        }
    }


    public Course getCourse() {
        return course;
    }

    public Student getStudent() {
        return student;
    }

    public void setCourse(Course course) {
        this.course = course;
    }
    public void setStudent(Student student) {
        this.student = student;
    }

    public CourseScore getCourseScore() {
        return courseScore;
    }

    
}
class SingleScore {
    private double weight=0;
    private int score=0;

    public SingleScore() {
    }

    public SingleScore(double weight, int score) {
        this.weight = weight;
        this.score = score;
    }
    public double getWeight() {
        return weight;
    }
    public void setWeight(double weight) {
        this.weight = weight;
    }

    public int getScore() {
        return score;
    }

}
class Student {
    private String number; //学号
    private String name;   //姓名

    public Student() {
    }
    public Student(String number, String name) {
        this.number = number;
        this.name = name;
    }
    public String getNumber() {
        return number;
    }

    public String getName() {
        return name;
    }
}

在题目集十的基础上修改类结构,将成绩类的继承关系改为组合关系,成绩信息由课程成绩类和分项成绩类组成,课程成绩类组合分项成绩类,分项成绩类由成绩分值和权重两个属性构成,

对象SingleScore的属性有一项成绩的分值以及其所占的权重,CourseScore对象中则有一个SingleScore对象的ArrayList数组来存储一个科目的各项成绩,在录入考试的课程的时候,自动给其赋予平时分和期末考试所占的权重,而在录入实验课的课程时,录入其中所占的各项比例,并将其存入到Course对象的一个double数组之中,需要判断录入的double数组各数加起来是否权值为1,否则是为输入错误,修改了实验课课程的录入,录入时录入相应实验课的权重并录入实验的次数,转而在录入学生信息的时候不再录入实验课的次数,而是只录入成绩,比对录入的成绩个数与该实验课所需成绩个数是否一致,否则为输入错误。
 
 
 
  SourceMonitor的生成报表内容

 PowerDesigner生成内容

 根据生成的数据分析可知,代码太过冗长,复杂度较高,以导致代码的质量低下,之后还得多加思索,运用更加巧妙的方法来对所需进行实践,避免代码太过复杂,冗长。

 

踩坑心得:
问题1:一开始我将double数组之中的所有数值加起来,再判断其是否等于一,以此来判断输入的权重是否有问题,虽然没有报错,但就算输入的权重数值最后加起来的结果为一,但仍然会进入到if语句之中。

 

解决方法:double属于floating binary point types,double型在运算使会先将数值转换成二进制的数值表示再做运算,但是在转换成二进制代码表示的时候,存储小数部分的位数会有不够的现象,即无限循环小数,故会有非常小的误差,但此时若进行==的判断则会出问题,修改if的判断方法,让其大于或小于一个误差值,以此用来判断。

 

改进建议:

1.

 

 一开始定义的classNumber,judgeStudent,judgeCourse,judgeClass与classesAverageScore一样都是定义为ArrayList对象,但一开始的时候并不知道学生,课程和班级的个数,就无法初始化,而且就算知道了个数之后,一开始需要给所有的数组对象中的值都赋值为0,这样用ArrayLsit对象使用起来就比较困难,需要遍历,然后一个个赋值,这样做法较为复杂,而若是运用int类型的数组的话,直接初始化即可给所有的int数组之中的值赋值为0,不用再进行操作。

 

总结:经过这几次pta对菜单计价程序以及课程成绩统计系统的一次次迭代,使我对代码书写的逻辑更加清晰,对相应程序需要设计出来相应功能的设计的能力更强,一开始写菜单计价程序的时候会觉得很无力,没有方向,导致第一次写菜单计价程序的时候花费了极其久的时候,而对于这一次课程成绩统计系统,我则写得更加清晰快速,也不会像之前菜单计价程序那样一股脑将所有的代码写到main中,显得非常凌乱,而这次我则是将各个功能定义相应的函数模块化,这样整体代码看起来就会非常清晰,而且对于迭代的修改,修改起来也只需去对应的功能去修改,而且对重构改良程序的认识有进一步提高。而且还在这几次的题目集之中学习和练习了栈的使用还有map对象的使用。本门课程的采取了边讲便教学的方法,在上课的时候老师在边讲的时候示范书写代码指引我们学生对Java知识的进一步指引,这样的讲解方法更能提高我们都知识的理解,上课的时候只讲解课程之中的难点,对于简单的基础关于Java的语法知识就需要我们学生通过自己去自学了解,我认为这样的教学方法很好,若是在课上都讲解那些基础的语法知识,而这些知识都是以我自己去自学能够轻松了解的,那课上则会变得枯燥,也是浪费了课上的时间,如此之下,也能很好地锻炼我们学生的自学基础语言的能力,为以后对于其他片成语言的学生打下基础,课程之后还有pta训练集对我们对课程的学习进行巩固和加深,我认为pta的题目集可以稍微再增加多一些难度,不需要太为简单的题目用来训练,只有难才能引发我们去思考,对知识点有更进一步的了解,我们书写代码的能力才进一步地提高。