首页 > 其他分享 >BLOG-2

BLOG-2

时间:2023-06-29 15:46:58浏览次数:42  
标签:temp int double str1 BLOG token time

前言:

本篇blog主要分析PTA4和PTA5的两道菜单计价程序和期中考试题目。

实现菜单计价程序是一个常见的编程练习,可以帮助学习者巩固Java语言的基础知识和面向对象编程的概念。下面将介绍涉及的知识点和难度。

1. 知识点:
- 类和对象:程序需要设计菜单类和菜品类,通过创建对象来表示不同的菜单和菜品。
- 数据类型和变量:需要使用不同的数据类型来存储菜单和菜品的信息,如字符串、整数、浮点数等。
- 方法和函数:需要定义方法来实现计价功能,如计算总价、添加菜品、删除菜品等。
- 控制流程:需要使用条件语句和循环语句来实现菜单的选择和操作。
- 输入输出:需要使用输入输出流来获取用户的选择和显示计算结果。

2. 难度:
- 初级难度:实现一个简单的菜单计价程序并不复杂,只需要掌握基本的语法和面向对象的概念即可。
- 中级难度:如果要实现更复杂的功能,如菜单的分类、菜品的多样性等,需要更深入地理解面向对象的设计原则和数据结构的使用。
- 高级难度:如果要实现菜单的持久化存储、多用户管理等功能,需要了解数据库和网络编程等相关知识。

期中考试题目:

1. 创建一个圆形类(Circle),私有属性为圆的半径,从控制台输入圆的半径,输出圆的面积。

这个题目涉及的知识点包括类的创建、属性的定义、从控制台输入、数值判断、面积计算和输出格式控制。难度较低。

2. 设计一个矩形类,其属性由矩形左上角坐标点(x1,y1)及右下角坐标点(x2,y2)组成,其中,坐标点属性包括该坐标点的X轴及Y轴的坐标值(实型数),求得该矩形的面积。

这个题目涉及的知识点包括类的创建、属性的定义、坐标点的表示、面积计算。难度适中。

3. 抽象出Shape父类(抽象类),Circle及Rectangle作为子类。

这个题目涉及的知识点包括抽象类的创建、子类的继承、多态性。难度适中。

4. 重构类设计,实现列表内图形的排序功能(按照图形的面积进行排序)。

这个题目涉及的知识点包括类的设计、排序算法的实现、接口的使用。难度较高。

总结:这四个题目涵盖了面向对象编程的基本知识点,从简单到复杂逐渐增加难度。通过完成这些题目,可以加深对类的定义、属性的使用、方法的实现、继承和多态性的理解,并且锻炼编程能力和解决问题的能力。

以下是逐题分析:

7-1 菜单计价程序-4 分数 100 作者 蔡轲 单位 南昌航空大学 这道题目的难点主要包括以下几个方面: 1. 输入格式的处理:需要正确解析输入的菜单和订单信息,并按照规定的格式进行处理。需要注意处理桌号标识、点菜记录和删除信息、代点菜信息的格式。 2. 菜品价格的计算:根据不同份额的菜品,需要按照规定的计算方法计算价格。需要注意四舍五入的规则。 3. 删除记录的处理:需要正确处理删除记录的情况,如果序号不正确,需要输出相应的错误信息。 4. 代点菜信息的处理:需要正确处理代点菜的情况,将代点菜的价格计算在当前桌上。 5. 折扣计算:根据不同的营业时间和折扣规则,需要正确计算每桌的总价。需要注意时间格式的合法性和营业时间的判断。 6. 异常情况的处理:需要正确处理各种异常情况,如菜谱信息与订单信息混合、桌号时间格式非法、重复删除、代点菜桌号不存在等情况,并输出相应的错误信息。 7. 记录的合并和排序:需要正确合并相同桌号的点菜记录,并按照序号从小到大的顺序排列。需要注意合并时可能出现的四舍五入误差。 8. 输出格式的处理:需要按照要求输出每桌的总价,并保留整数。需要注意输出格式的正确性。 源码:
  1 import java.time.DateTimeException;
  2 import java.time.Duration;
  3 import java.time.LocalDateTime;
  4 import java.util.ArrayList;
  5 import java.util.Scanner;
  6 
  7 public class Main {
  8     public static void main(String[] args) {
  9         Menu menu = new Menu();
 10         ArrayList<Table> tables = new ArrayList<Table>();
 11         Scanner input = new Scanner(System.in);
 12         String str1 = new String();
 13         int i = 0;
 14         int portion = 0, quota = 0;
 15         while (true) {// 输入菜单
 16             Dish temp = new Dish();
 17             int isRepeat = -1;
 18             str1 = input.nextLine();
 19             if (str1.matches("[\\S]* [1-9][\\d]*")) {
 20                 String[] token = str1.split(" ");
 21                 temp.name = token[0];
 22                 temp.unit_price = Integer.parseInt(token[1]);
 23                 if (temp.unit_price > 300) {
 24                     System.out.println(temp.name + " price out of range " + temp.unit_price);
 25                     continue;
 26                 }
 27                 temp.isT = false;
 28                 isRepeat = menu.searchDish(temp.name);
 29                 if (isRepeat != -1) {
 30                     menu.dishs.remove(isRepeat);
 31                 }
 32                 menu.dishs.add(temp);
 33             } else if (str1.matches("[\\S]* [\\d]* T")) {
 34                 String[] token = str1.split(" ");
 35                 temp.name = token[0];
 36                 temp.unit_price = Integer.parseInt(token[1]);
 37                 if (temp.unit_price > 300) {
 38                     System.out.println(temp.name + " price out of range " + temp.unit_price);
 39                     continue;
 40                 }
 41                 temp.isT = true;
 42                 isRepeat = menu.searchDish(temp.name);
 43                 if (isRepeat != -1) {
 44                     menu.dishs.remove(isRepeat);
 45                 }
 46                 menu.dishs.add(temp);
 47             } else if (str1.equals("end")) {
 48                 break;
 49             } else if (str1.matches("tab.*")) {
 50                 break;
 51             } else {
 52                 System.out.println("wrong format");
 53                 continue;
 54             }
 55         }
 56         while (!str1.equals("end")) {
 57             Table temp = new Table();
 58             boolean isRepeat = false;
 59             int repeatNum = 0;
 60             if (str1.matches(".*t.*a.*")) {
 61                 if (str1.matches(
 62                         "table [1-9][\\d]* [\\d]*/[\\d][\\d]?/[\\d][\\d]? [\\d][\\d]?/[\\d][\\d]?/[\\d][\\d]?")) {
 63                     String[] token = str1.split(" ");
 64                     String[] Date = token[2].split("/");
 65                     String[] Time = token[3].split("/");
 66                     int[] intDate = new int[3];
 67                     int[] intTime = new int[3];
 68                     for (i = 0; i < 3; i++) {
 69                         intDate[i] = Integer.parseInt(Date[i]);
 70                         intTime[i] = Integer.parseInt(Time[i]);
 71                     }
 72                     temp.num = Integer.parseInt(token[1]);
 73                     if (temp.num > 55) {
 74                         System.out.println(temp.num + " table num out of range");
 75                         str1 = input.nextLine();
 76                         continue;
 77 
 78                     }
 79                     try {
 80                         temp.time = LocalDateTime.of(intDate[0], intDate[1], intDate[2], intTime[0], intTime[1],
 81                                 intTime[2]);
 82                         temp.getWeekDay();
 83                     } catch (DateTimeException e) {
 84                         System.out.println(temp.num + " date error");
 85                         str1 = input.nextLine();
 86                         continue;
 87                     }
 88                     if (!temp.isOpen()) {
 89                         System.out.println("table " + temp.num + " out of opening hours");
 90                         str1 = input.nextLine();
 91                         continue;
 92                     }
 93                     if (!(temp.time.isAfter(LocalDateTime.of(2022, 1, 1, 0, 0, 0))
 94                             && temp.time.isBefore(LocalDateTime.of(2024, 1, 1, 0, 0, 0)))) {
 95                         System.out.println("not a valid time period");
 96                         str1 = input.nextLine();
 97                         continue;
 98                     }
 99                     // 判断桌号是否重复
100                     if (temp.isOpen()) {
101                         for (i = 0; i < tables.size(); i++) {
102                             // 有重复的桌号
103                             if (temp.num == tables.get(i).num && tables.get(i).isOpen()) {
104                                 Duration duration = Duration.between(temp.time, tables.get(i).time);
105                                 // 同一天
106                                 if (duration.toDays() == 0) {
107                                     // 在周一到周五
108                                     if (temp.weekday > 0 && temp.weekday < 6) {
109                                         // 在同一时间段
110                                         if (temp.time.getHour() < 15 && tables.get(i).time.getHour() < 15) {
111                                             isRepeat = true;
112                                             repeatNum = i;
113                                             break;
114                                         }
115                                     }
116                                     // 在周末
117                                     else {
118                                         // 时间相差小于一小时
119                                         if (duration.toHours() < 3600) {
120                                             repeatNum = i;
121                                             isRepeat = true;
122                                             break;
123                                         }
124                                     }
125                                 }
126                             }
127                         }
128                     }
129                     System.out.println("table " + temp.num + ": ");
130 
131                 } else {
132                     System.out.println("wrong format");
133                     str1 = input.nextLine();
134                     continue;
135                 }
136                 // 本桌开始点菜
137                 while (true) {
138                     str1 = input.nextLine();
139                     if (str1.matches("[1-9][\\d]* [\\S]* [\\d] [1-9][\\d]*")) {
140                         String[] token = str1.split(" ");
141                         portion = Integer.parseInt(token[2]);
142                         quota = Integer.parseInt(token[3]);
143                         if (temp.order.records.size() > 0) {
144                             if (Integer.parseInt(
145                                     token[0]) <= temp.order.records.get(temp.order.records.size() - 1).orderNum) {
146                                 System.out.println("record serial number sequence error");
147                                 continue;
148                             }
149                         }
150                         if (menu.searchDish(token[1]) == -1) {
151                             System.out.println(token[1] + " does not exist");
152                             continue;
153                         }
154                         if (portion > 3 || portion < 1) {
155                             System.out.println(Integer.parseInt(token[0]) + " portion out of range " + portion);
156                             continue;
157                         }
158                         if (quota > 15) {
159                             System.out.println(Integer.parseInt(token[0]) + " num out of range " + quota);
160                             continue;
161                         }
162                         temp.od(menu, token[0], token[1], portion, quota);
163                     }
164                     // 判断是否为删除订单
165                     else if (str1.matches("[1-9][\\d]* delete")) {
166                         String[] token = str1.split(" ");
167                         temp.order.delARecordByOrderNum(Integer.parseInt(token[0]));
168                     }
169                     // 判断是否为夹杂菜单
170                     else if (str1.matches("[\\S]* [\\d]*")) {
171                         System.out.println("invalid dish");
172                         continue;
173                     } else if (str1.matches("[\\S]* [\\d]* T")) {
174                         System.out.println("invalid dish");
175                         continue;
176                     }
177                     // 判断是否为代点
178                     else if (str1.matches("[\\d]* [\\d]* [\\S]* [\\d] [1-9][\\d]*")) {
179                         String[] token = str1.split(" ");
180                         // 判断代点桌号是否存在
181                         boolean exist = false;
182                         for (int j = 0; j < tables.size(); j++) {
183                             if (tables.get(j).num == Integer.parseInt(token[0])) {
184                                 exist = true;
185                                 break;
186                             }
187                         }
188                         if (exist) {
189                             System.out.print(Integer.parseInt(token[1]) + " table " + temp.num + " pay for table "
190                                     + Integer.parseInt(token[0]) + " ");
191                             Record treat = new Record();
192                             treat.d = menu.dishs.get(menu.searchDish(token[2]));
193                             portion = Integer.parseInt(token[3]);
194                             quota = Integer.parseInt(token[4]);
195                             treat.portion = portion;
196                             treat.quota = quota;
197                             System.out.print(treat.getPrice() + "\n");
198                             temp.order.records.add(treat);
199                         }
200                         // 若不存在则输出内容
201                         else {
202                             System.out.println("Table number :" + Integer.parseInt(token[0]) + " does not exist");
203                         }
204 
205                     } else if (str1.equals("end")) {
206                         break;
207                     } else if (str1.matches("table.*")) {
208                         break;
209                     } else {
210                         System.out.println("wrong format");
211                         continue;
212                     }
213                 }
214                 // 本桌点菜结束,进入下一桌
215                 if (isRepeat) {
216                     for (i = 0; i < tables.get(repeatNum).order.records.size(); i++) {
217                         for (int j = 0; j < temp.order.records.size(); j++) {
218                             if (tables.get(repeatNum).order.records.get(i).d.name == temp.order.records.get(j).d.name) {
219                                 if (tables.get(repeatNum).order.records.get(i).portion == temp.order.records
220                                         .get(j).portion) {
221                                     tables.get(repeatNum).order.records.get(i).quota += temp.order.records.get(j).quota;
222                                     temp.order.records.remove(j);
223                                 }
224                             }
225                         }
226 
227                     }
228                     tables.get(repeatNum).order.records.addAll(temp.order.records);
229                     continue;
230                 }
231                 tables.add(temp);
232             } else {
233                 str1 = input.nextLine();
234             }
235         }
236 
237         // 最终输出桌号订单信息
238         for (i = 0; i < tables.size(); i++) {
239             if (tables.get(i).isOpen()) {
240                 tables.get(i).getSum();
241                 System.out
242                         .println("table " + tables.get(i).num + ": " + tables.get(i).origSum + " " + tables.get(i).sum);
243             }
244 
245         }
246     }
247 
248     static class Dish {
249         String name;
250         int unit_price;
251         boolean isT = false;
252     }
253 
254     static class Record {
255         int orderNum;
256         Dish d;
257         int portion;
258         int quota;
259         boolean isDeleted = false;
260 
261         int getPrice() {
262             if (portion == 2)
263                 return (int) Math.round(1.5 * d.unit_price) * quota;
264             else if (portion == 3)
265                 return 2 * d.unit_price * quota;
266             else
267                 return d.unit_price * quota;
268         }
269     }
270 
271     static class Menu {
272         ArrayList<Dish> dishs = new ArrayList<Dish>();
273 
274         int searchDish(String dishName) {
275             for (int i = 0; i < dishs.size(); i++) {
276                 if (dishName.equals(dishs.get(i).name)) {
277                     return i;
278                 }
279             }
280             return -1;
281         }
282     }
283 
284     static class Order {
285         ArrayList<Record> records = new ArrayList<Record>();
286 
287         Record addARecord(int orderNum, String dishName, int portion, int quota, Menu menu) {
288             Record newRecord = new Record();
289             newRecord.orderNum = orderNum;
290             newRecord.d = menu.dishs.get(menu.searchDish(dishName));
291             newRecord.portion = portion;
292             newRecord.quota = quota;
293             System.out.println(newRecord.orderNum + " " + newRecord.d.name + " " + newRecord.getPrice());
294             return newRecord;
295         }
296 
297         boolean delARecordByOrderNum(int orderNum) {
298             int i = 0, flag = 0;
299             for (i = 0; i < records.size(); i++) {
300                 if (records.get(i).orderNum == orderNum) {
301                     if (records.get(i).isDeleted == false) {
302                         records.get(i).isDeleted = true;
303                     } else {
304                         System.out.println("deduplication " + orderNum);
305                     }
306                     flag++;
307                 }
308             }
309             if (flag == 0) {
310                 System.out.println("delete error;");
311                 return false;
312             }
313             return true;
314         }
315     }
316 
317     static class Table {
318         Order order = new Order();
319         int num;
320         LocalDateTime time;
321         int weekday;
322         long sum = 0;
323         long origSum = 0;
324 
325         void od(Menu menu, String str1, String str2, int portion, int quota) {
326             {
327                 order.records.add(order.addARecord(Integer.parseInt(str1), str2, portion, quota, menu));
328 
329             }
330         }
331 
332         void getWeekDay() {
333             weekday = time.getDayOfWeek().getValue();
334         }
335 
336         void getSum() {
337             for (int i = 0; i < order.records.size(); i++) {
338                 if (!order.records.get(i).isDeleted) {
339                     origSum += order.records.get(i).getPrice();
340                     if (order.records.get(i).d.isT) {
341                         if (weekday > 0 && weekday < 6) {
342                             sum += Math.round(order.records.get(i).getPrice() * 0.7);
343                         } else {
344                             sum += order.records.get(i).getPrice();
345                         }
346                     } else {
347                         if (weekday > 0 && weekday < 6) {
348                             if (time.getHour() >= 17 && time.getHour() < 20)
349                                 sum += Math.round(order.records.get(i).getPrice() * 0.8);
350                             if (time.getHour() == 20) {
351                                 if (time.getMinute() <= 30)
352                                     sum += Math.round(order.records.get(i).getPrice() * 0.8);
353                             }
354                             if (time.getHour() >= 10 && time.getHour() < 14)
355                                 sum += Math.round(order.records.get(i).getPrice() * 0.6);
356                             if (time.getHour() == 14) {
357                                 if (time.getMinute() <= 30)
358                                     sum += Math.round(order.records.get(i).getPrice() * 0.6);
359                             }
360                         } else
361                             sum += order.records.get(i).getPrice();
362                     }
363                 }
364             }
365 
366         }
367 
368         boolean isOpen() {
369             if (weekday > 0 && weekday < 6) {
370                 if (time.getHour() >= 17 && time.getHour() < 20)
371                     return true;
372                 if (time.getHour() == 20) {
373                     if (time.getMinute() <= 30)
374                         return true;
375                 }
376                 if (time.getHour() > 10 && time.getHour() < 14)
377                     return true;
378                 if (time.getHour() == 10) {
379                     if (time.getMinute() >= 30)
380                         return true;
381                 }
382                 if (time.getHour() == 14) {
383                     if (time.getMinute() <= 30)
384                         return true;
385                 }
386             } else {
387                 if (time.getHour() > 9 && time.getHour() < 21)
388                     return true;
389                 if (time.getHour() == 9) {
390                     if (time.getMinute() >= 30)
391                         return true;
392                 }
393                 if (time.getHour() == 21) {
394                     if (time.getMinute() <= 30)
395                         return true;
396                 }
397             }
398             return false;
399 
400         }
401     }
402 }

类图:

 7-1 菜单计价程序-5

分数 100 作者 蔡轲 单位 南昌航空大学 这道题目是一个设计点菜计价程序的问题,主要涉及到输入输出的处理和计算逻辑的实现。下面对题目的难度、重难点和知识点进行分析。   难度: 这道题目的难度适中,需要考虑多种情况的输入和计算逻辑,但是整体上并不复杂。对于有一定编程基础的人来说,应该可以比较容易地完成。   重难点: 1. 输入输出的处理:题目中给出了输入的格式要求,需要按照指定的格式解析输入,并按照要求输出结果。这需要对字符串的处理和格式化输出有一定的了解。 2. 计算逻辑的实现:题目中涉及到了菜品的计价逻辑,包括不同份额菜价的计算、特色菜的口味度计算、折扣的计算等。这需要对条件判断和数值计算有一定的掌握。   知识点: 1. 字符串的处理:题目中需要对输入的字符串进行解析和拼接,涉及到字符串的分割、拼接、格式化输出等操作。 2. 条件判断和循环:题目中需要根据不同的条件进行不同的处理,需要使用条件判断和循环语句来实现。 3. 数值计算:题目中需要进行一些数值的计算,包括菜价的计算、折扣的计算等,需要使用数值计算的相关操作。 源码:
  1 import java.time.DateTimeException;
  2 import java.time.Duration;
  3 import java.time.LocalDateTime;
  4 import java.util.ArrayList;
  5 import java.util.Comparator;
  6 import java.util.Scanner;
  7 
  8 public class Main {
  9     public static boolean isNumeric(String string) {
 10         int intValue;
 11         try {
 12             intValue = Integer.parseInt(string);
 13             return true;
 14         } catch (NumberFormatException e) {
 15             return false;
 16         }
 17     }
 18 
 19     public static void main(String[] args) {
 20         Menu menu = new Menu();
 21         ArrayList<Table> tables = new ArrayList<Table>();
 22         ArrayList<User> users = new ArrayList<User>();
 23         Scanner input = new Scanner(System.in);
 24         String str1 = new String();
 25         int i = 0;
 26         int portion = 0, quota = 0;
 27         while (true) {// 输入菜单
 28             Dish temp = new Dish();
 29             int isRepeat = -1;
 30             str1 = input.nextLine();
 31             if (str1.matches("[\\S]* [1-9][\\d]*")) {
 32                 String[] token = str1.split(" ");
 33                 temp.name = token[0];
 34                 temp.unit_price = Integer.parseInt(token[1]);
 35                 temp.isT = false;
 36                 isRepeat = menu.searchDish(temp.name);
 37                 if (isRepeat != -1) {
 38                     menu.dishs.remove(isRepeat);
 39                 }
 40                 menu.dishs.add(temp);
 41             } else if (str1.matches("[\\S]* [\\S]* [\\d]* T")) {
 42                 String[] token = str1.split(" ");
 43                 temp.name = token[0];
 44                 temp.unit_price = Integer.parseInt(token[2]);
 45                 temp.isT = true;
 46                 switch (token[1]) {
 47                     case "川菜":
 48                         temp.FlavorType = "spicy";
 49                         temp.MaxFlavor = 5;
 50                         break;
 51                     case "晋菜":
 52                         temp.FlavorType = "acidity";
 53                         temp.MaxFlavor = 4;
 54                         break;
 55                     case "浙菜":
 56                         temp.FlavorType = "sweetness";
 57                         temp.MaxFlavor = 3;
 58                         break;
 59                     default :str1 = input.nextLine();
 60                         System.out.println("wrong format");
 61                         continue;
 62 
 63                 }
 64                 isRepeat = menu.searchDish(temp.name);
 65                 if (isRepeat != -1) {
 66                     menu.dishs.remove(isRepeat);
 67                 }
 68                 menu.dishs.add(temp);
 69             } else if (str1.equals("end")) {
 70                 break;
 71             } else if (str1.matches("tab.*")) {
 72                 break;
 73 
 74             } else {
 75                 str1 = input.nextLine();
 76                 System.out.println("wrong format");
 77                 continue;
 78             }
 79         }
 80         while (!str1.equals("end")) {
 81             Table temp = new Table();
 82             boolean isRepeat = false;
 83             int repeatNum = 0;
 84             if (str1.matches(".*t.*a.*")) {
 85                 if (str1.matches(
 86                         "table [1-9][\\d]* : [\\S]* [\\d]* [\\d]*/[\\d][\\d]?/[\\d][\\d]? [\\d][\\d]?/[\\d][\\d]?/[\\d][\\d]?")) {
 87                     String[] token = str1.split(" ");
 88                     temp.userName = token[3];
 89                     if(token[3].length()>10) {
 90                         str1 = input.nextLine();
 91                         System.out.println("wrong format");
 92                         continue;
 93                     }
 94                     temp.callNum = token[4];
 95                     if(token[4].length()!=11) {
 96                         str1 = input.nextLine();
 97                         System.out.print("wrong format");
 98                         continue;
 99                     }
100                     String headNum = token[4].substring(0, 3);
101                     if(!headNum.equals("180")&&!headNum.equals("181")&&!headNum.equals("189")&&!headNum.equals("133")&&!headNum.equals("135")&&!headNum.equals("136")) {
102                         str1 = input.nextLine();
103                         System.out.println("wrong format");
104                         continue;
105                     }
106                     String[] Date = token[5].split("/");
107                     String[] Time = token[6].split("/");
108                     int[] intDate = new int[5];
109                     int[] intTime = new int[6];
110                     for (i = 0; i < 3; i++) {
111                         intDate[i] = Integer.parseInt(Date[i]);
112                         intTime[i] = Integer.parseInt(Time[i]);
113                     }
114                     temp.num = Integer.parseInt(token[1]);
115                     try {
116                         temp.time = LocalDateTime.of(intDate[0], intDate[1], intDate[2], intTime[0], intTime[1],
117                                 intTime[2]);
118                         temp.getWeekDay();
119                     } catch (DateTimeException e) {
120                         System.out.println(temp.num + " date error");
121                         str1 = input.nextLine();
122                         continue;
123                     }
124                     if (!temp.isOpen()) {
125                         System.out.println("table " + temp.num + " out of opening hours");
126                         str1 = input.nextLine();
127                         continue;
128                     }
129 
130                     System.out.println("table " + temp.num + ": ");
131 
132                 } else {
133                     System.out.println("wrong format");
134                     str1 = input.nextLine();
135                     continue;
136                 }
137                 // 本桌开始点菜
138                 while (true) {
139                     str1 = input.nextLine();
140                     //判断是否为非特色菜
141                     if (str1.matches("[1-9][\\d]* [\\S]* [\\d] [1-9][\\d]*")) {
142                         String[] token = str1.split(" ");
143                         portion = Integer.parseInt(token[2]);
144                         quota = Integer.parseInt(token[3]);
145                         if (menu.searchDish(token[1]) == -1) {
146                             System.out.println(token[1] + " does not exist");
147                             continue;
148                         }
149                         Record tempRecord = new Record();
150                         tempRecord.d = menu.dishs.get(menu.searchDish(token[1]));
151                         tempRecord.orderNum = Integer.parseInt(token[0]);
152                         tempRecord.portion = portion;
153                         tempRecord.quota = quota;
154                         temp.records.add(tempRecord);
155                         System.out.println(tempRecord.orderNum +" "+token[1]+ " " +tempRecord.getPrice());
156                     }
157                     //判断是否为特色菜
158                     else if(str1.matches("[1-9][\\d]* [\\S]* [\\d] [\\d] [1-9][\\d]*")) {
159                         String[] token = str1.split(" ");
160                         if (menu.searchDish(token[1]) == -1) {
161                             System.out.println(token[1] + " does not exist");
162                             continue;
163                         }
164                         int FlavorNum = Integer.parseInt(token[2]);
165                         if(FlavorNum<0||FlavorNum>menu.dishs.get(menu.searchDish(token[1])).MaxFlavor) {
166                             System.out.println(menu.dishs.get(menu.searchDish(token[1])).FlavorType+" num out of range :"+FlavorNum);
167                             continue;
168                         }
169                         portion = Integer.parseInt(token[3]);
170                         quota = Integer.parseInt(token[4]);
171                         if (menu.searchDish(token[1]) == -1) {
172                             System.out.println(token[1] + " does not exist");
173                             continue;
174                         }
175                         Record tempRecord = new Record();
176                         tempRecord.d = menu.dishs.get(menu.searchDish(token[1]));
177                         tempRecord.FlavorNum = FlavorNum;
178                         tempRecord.orderNum = Integer.parseInt(token[0]);
179                         tempRecord.portion = portion;
180                         tempRecord.quota = quota;
181                         temp.records.add(tempRecord);
182                         System.out.println(tempRecord.orderNum +" "+token[1]+" "+ tempRecord.getPrice());
183                     }
184                     // 判断是否为删除订单
185                     else if (str1.matches("[1-9][\\d]* delete")) {
186                         String[] token = str1.split(" ");
187                         int delNum = Integer.parseInt(token[0]);
188                         for(i=0;i<temp.records.size();i++) {
189                             if(temp.records.get(i).orderNum==delNum) {
190                                 if(!temp.records.get(i).isDeleted) {
191                                     temp.records.get(i).isDeleted = true;
192                                 }
193                                 else System.out.println("delete error");
194                                 break;
195                             }
196                             if(i==temp.records.size())System.out.println("delete error");
197                         }
198 
199                     }
200                     // 判断是否为代点
201                     else if (str1.matches("[\\d]* [\\d]* [\\S].*")) {
202                         String[] token = str1.split(" ");
203                         // 判断代点桌号是否存在
204                         boolean exist = false;
205                         int j = 0;
206                         for (j = 0; j < tables.size(); j++) {
207                             if (tables.get(j).num == Integer.parseInt(token[0])) {
208                                 exist = true;
209                                 break;
210                             }
211                         }
212                         if (exist) {
213                             System.out.print(Integer.parseInt(token[1]) + " table " + temp.num + " pay for table "
214                                     + Integer.parseInt(token[0]) + " ");
215                             Record treat = new Record();
216                             treat.d = menu.dishs.get(menu.searchDish(token[2]));
217                             if(treat.d.isT) {
218                                 treat.FlavorNum = Integer.parseInt(token[3]);
219                                 treat.portion = Integer.parseInt(token[4]);
220                                 treat.quota = Integer.parseInt(token[5]);
221                                 if(treat.d.FlavorType.equals("spicy")) {
222                                     tables.get(j).ChuanNum+=treat.quota;
223                                     tables.get(j).spicyType +=treat.FlavorNum*treat.quota;
224                                 }
225                                 if(treat.d.FlavorType.equals("acidity")) {
226                                     tables.get(j).JinNum+=treat.quota;
227                                     tables.get(j).spicyType +=treat.FlavorNum*treat.quota;
228                                 }
229                                 if(treat.d.FlavorType.equals("sweetness")) {
230                                     tables.get(j).ZheNum+=treat.quota;
231                                     tables.get(j).spicyType +=treat.FlavorNum*treat.quota;
232                                 }
233                             }
234                             else {
235                                 treat.portion = Integer.parseInt(token[3]);
236                                 treat.quota = Integer.parseInt(token[4]);
237                             }
238                             System.out.print(treat.getPrice() + "\n");
239                             treat.isTreat = true;
240                             temp.records.add(treat);
241                         }
242                         // 若不存在则输出内容
243                         else {
244                             System.out.println("Table number :" + Integer.parseInt(token[0]) + " does not exist");
245                         }
246 
247                     } else if (str1.equals("end")) {
248                         break;
249                     } else if (str1.matches("table.*")) {
250                         break;
251                     } else {
252                         System.out.println("wrong format");
253                         continue;
254                     }
255                 }
256                 // 本桌点菜结束,进入下一桌
257                 tables.add(temp);
258             } else {
259                 str1 = input.nextLine();
260             }
261         }
262 
263         // 最终输出桌号订单信息
264         for (i = 0; i < tables.size(); i++) {
265             if (tables.get(i).isOpen()) {
266                 tables.get(i).getSum();
267                 tables.get(i).getFlavorNum();
268                 if(i!=0)System.out.print("\n");
269                 tables.get(i).showEnd();
270                 boolean isRepeat = false;
271                 for(int j=0;j<users.size();j++) {
272                     if(tables.get(i).userName.equals(users.get(j).userName)) {
273                         users.get(j).paidMoney+=tables.get(i).sum;
274                         isRepeat = true;
275                         break;
276                     }
277                 }
278                 if(!isRepeat) {
279                     User tempUser = new User();
280                     tempUser.userName = tables.get(i).userName;
281                     tempUser.callNum = tables.get(i).callNum;
282                     tempUser.paidMoney = tables.get(i).sum;
283                     users.add(tempUser);
284                 }
285             }
286 
287         }
288         users.sort(new Comparator<User>() {
289             public int compare(User a,User b) {
290                 return a.userName.compareTo(b.userName);
291             }
292         });
293         for(i=0;i<users.size();i++) {
294             System.out.print("\n"+users.get(i).userName +" "+ users.get(i).callNum +" "+ users.get(i).paidMoney);
295         }
296     }
297 
298     static class Dish {
299         String name;
300         String FlavorType;
301         int MaxFlavor;
302         int unit_price;
303         boolean isT = false;
304     }
305 
306     static class Record {
307         int orderNum;
308         Dish d;
309         int FlavorNum;
310         int portion;
311         int quota;
312         boolean isDeleted = false;
313         boolean isTreat  = false;
314 
315         int getPrice() {
316             if (portion == 2)
317                 return (int) Math.round(1.5 * d.unit_price) * quota;
318             else if (portion == 3)
319                 return 2 * d.unit_price * quota;
320             else
321                 return d.unit_price * quota;
322         }
323     }
324 
325     static class Menu {
326         ArrayList<Dish> dishs = new ArrayList<Dish>();
327         int searchDish(String dishName) {
328             for (int i = 0; i < dishs.size(); i++) {
329                 if (dishName.equals(dishs.get(i).name)) {
330                     return i;
331                 }
332             }
333             return -1;
334         }
335     }
336 
337     static class User{
338         String userName;
339         String callNum;
340         long paidMoney;
341     }
342     static class Table {
343         ArrayList<Record> records = new ArrayList<Record>();
344         int num;
345         String userName;
346         String callNum;
347         LocalDateTime time;
348         int weekday;
349         int ChuanNum = 0;
350         float spicyType = 0;
351         int JinNum = 0;
352         float acidType = 0;
353         int ZheNum = 0;
354         float sweetType = 0;
355         long sum = 0;
356         long origSum = 0;
357 
358         void getWeekDay() {
359             weekday = time.getDayOfWeek().getValue();
360         }
361         void getFlavorNum() {
362             for(int i=0;i<records.size();i++) {
363                 if(records.get(i).d.isT&&!records.get(i).isDeleted&&!records.get(i).isTreat) {
364                     if(records.get(i).d.FlavorType.equals("spicy")) {
365                         ChuanNum+=records.get(i).quota;
366                         spicyType +=records.get(i).FlavorNum*records.get(i).quota;
367                     }
368                     if(records.get(i).d.FlavorType.equals("acidity")) {
369                         JinNum+=records.get(i).quota;
370                         acidType +=records.get(i).FlavorNum*records.get(i).quota;
371                     }
372                     if(records.get(i).d.FlavorType.equals("sweetness")) {
373                         ZheNum+=records.get(i).quota;
374                         sweetType +=records.get(i).FlavorNum*records.get(i).quota;
375                     }
376                 }
377             }
378             if(ChuanNum!=0)spicyType = Math.round(spicyType/ChuanNum*1.0);
379             if(JinNum!=0)acidType = Math.round(acidType/JinNum*1.0);
380             if(ZheNum!=0)sweetType = Math.round(sweetType/ZheNum*1.0);
381         }
382         void showEnd() {
383             System.out.print("table " + num + ": " + origSum + " " + sum);
384             //输出川菜
385             if(ChuanNum!=0) {
386                 System.out.print(" 川菜 "+ChuanNum);
387                 switch((int)spicyType) {
388                     case 0 :System.out.print(" 不辣");break;
389                     case 1 :System.out.print(" 微辣");break;
390                     case 2 :System.out.print(" 稍辣");break;
391                     case 3 :System.out.print(" 辣");break;
392                     case 4 :System.out.print(" 很辣");break;
393                     case 5 :System.out.print(" 爆辣");break;
394                 }
395             }
396             //输出晋菜
397             if(JinNum!=0) {
398                 System.out.print(" 晋菜 "+JinNum);
399                 switch((int)acidType) {
400                     case 0 :System.out.print(" 不酸");break;
401                     case 1 :System.out.print(" 微酸");break;
402                     case 2 :System.out.print(" 稍酸");break;
403                     case 3 :System.out.print(" 酸");break;
404                     case 4 :System.out.print(" 很酸");break;
405                 }
406             }
407             //输出浙菜
408             if(ZheNum!=0) {
409                 System.out.print(" 浙菜 "+ZheNum);
410                 switch((int)sweetType) {
411                     case 0 :System.out.print(" 不甜");break;
412                     case 1 :System.out.print(" 微甜");break;
413                     case 2 :System.out.print(" 稍甜");break;
414                     case 3 :System.out.print(" 甜");break;
415                 }
416             }
417 
418         }
419         void getSum() {
420             for (int i = 0; i < records.size(); i++) {
421                 if (!records.get(i).isDeleted) {
422                     origSum += records.get(i).getPrice();
423                     if (records.get(i).d.isT) {
424                         if (weekday > 0 && weekday < 6) {
425                             sum += Math.round(records.get(i).getPrice() * 0.7);
426                         } else {
427                             sum += records.get(i).getPrice();
428                         }
429                     } else {
430                         if (weekday > 0 && weekday < 6) {
431                             if (time.getHour() >= 17 && time.getHour() < 20)
432                                 sum += Math.round(records.get(i).getPrice() * 0.8);
433                             if (time.getHour() == 20) {
434                                 if (time.getMinute() <= 30)
435                                     sum += Math.round(records.get(i).getPrice() * 0.8);
436                             }
437                             if (time.getHour() >= 10 && time.getHour() < 14)
438                                 sum += Math.round(records.get(i).getPrice() * 0.6);
439                             if (time.getHour() == 14) {
440                                 if (time.getMinute() <= 30)
441                                     sum += Math.round(records.get(i).getPrice() * 0.6);
442                             }
443                         } else
444                             sum += records.get(i).getPrice();
445                     }
446                 }
447             }
448 
449         }
450 
451         boolean isOpen() {
452             if (weekday > 0 && weekday < 6) {
453                 if (time.getHour() >= 17 && time.getHour() < 20)
454                     return true;
455                 if (time.getHour() == 20) {
456                     if (time.getMinute() <= 30)
457                         return true;
458                 }
459                 if (time.getHour() > 10 && time.getHour() < 14)
460                     return true;
461                 if (time.getHour() == 10) {
462                     if (time.getMinute() >= 30)
463                         return true;
464                 }
465                 if (time.getHour() == 14) {
466                     if (time.getMinute() <= 30)
467                         return true;
468                 }
469             } else {
470                 if (time.getHour() > 9 && time.getHour() < 21)
471                     return true;
472                 if (time.getHour() == 9) {
473                     if (time.getMinute() >= 30)
474                         return true;
475                 }
476                 if (time.getHour() == 21) {
477                     if (time.getMinute() <= 30)
478                         return true;
479                 }
480             }
481             return false;
482 
483         }
484     }
485 }

类图:

 7-1 测验1-圆类设计

分数 12 作者 段喜龙 单位 南昌航空大学

创建一个圆形类(Circle),私有属性为圆的半径,从控制台输入圆的半径,输出圆的面积

输入格式:

输入圆的半径,取值范围为(0,+∞),输入数据非法,则程序输出Wrong Format,注意:只考虑从控制台输入数值的情况

输出格式:

输出圆的面积(保留两位小数,可以使用String.format(“%.2f”,输出数值)控制精度)

这道题目是一个关于圆形类设计的Java题目。题目要求创建一个圆形类,其中私有属性为圆的半径。从控制台输入圆的半径,然后输出圆的面积。 难度分析: 这道题目的难度属于初级水平。它主要考察对类的设计和属性的使用,以及对输入输出的处理。 重难点分析: 1. 类的设计:需要创建一个圆形类,其中包含一个私有属性表示圆的半径。这需要对类的基本结构和属性的定义有一定的了解。 2. 输入处理:需要从控制台输入圆的半径,并进行合法性判断。如果输入数据非法,则需要输出错误提示信息。 3. 输出处理:需要计算圆的面积,并将结果保留两位小数进行输出。这需要对浮点数的格式化输出有一定的了解。 知识点分析: 1. 类的定义和属性的使用:需要了解如何定义一个类,并在类中定义私有属性。还需要了解如何在类中定义方法来实现对属性的操作。 2. 输入输出处理:需要了解如何从控制台输入数据,并进行合法性判断。还需要了解如何对浮点数进行格式化输出。 3. 数学计算:需要了解如何计算圆的面积,即使用数学公式πr^2进行计算。 总结: 这道题目是一个初级水平的Java题目,主要考察对类的设计和属性的使用,以及对输入输出的处理。需要掌握类的定义和属性的使用,输入输出的处理方法,以及数学计算的基本知识。完成这道题目可以帮助学生巩固对类的理解和应用,以及对输入输出的处理方法的掌握。 源码:
 1 import java.util.Scanner;
 2 
 3 public class Main {
 4     private double radius;
 5 
 6     public Main(double radius) {
 7         this.radius = radius;
 8     }
 9 
10     public double getArea() {
11         return Math.PI * radius * radius;
12     }
13 
14     public static void main(String[] args) {
15         Scanner scanner = new Scanner(System.in);
16         double radius = scanner.nextDouble();
17         if (radius <= 0) {
18             System.out.println("Wrong Format");
19         } else {
20             Main circle = new Main(radius);
21             double area = circle.getArea();
22             System.out.println(String.format("%.2f", area));
23         }
24     }
25 }

类图:

这段Java代码主要涉及以下知识点:

1. 类和对象:代码中定义了一个名为Main的类,其中包含一个私有属性radius和一些方法。通过创建Main类的对象,可以使用这些方法来计算圆的面积。

2. 构造方法:代码中定义了一个构造方法Main(double radius),用于初始化radius属性。

3. 方法:代码中定义了一个getArea()方法,用于计算圆的面积。该方法使用了Math类中的PI常量和radius属性。

4. 输入输出:代码中使用Scanner类来获取用户输入的半径值,并通过System.out.println()方法将结果输出到控制台。

需要改进的地方:

1. 输入验证:代码中对输入的半径值进行了简单的验证,如果半径小于等于0,则输出"Wrong Format"。但这种验证方式并不严谨,可以考虑使用异常处理来更好地处理输入错误的情况。

2. 输出格式化:代码中使用了String.format()方法来格式化输出结果,保留两位小数。这种方式可以改进为使用DecimalFormat类来更灵活地控制输出格式。

心得体会:

这段代码实现了一个简单的圆面积计算程序,通过输入半径值,计算并输出圆的面积。代码结构清晰,逻辑简单明了。在实际应用中,可以根据需求进行一些改进,例如添加更多的输入验证和输出格式化选项,以提高代码的健壮性和可扩展性。

7-2 测验2-类结构设计 分数 18 作者 段喜龙 单位 南昌航空大学

设计一个矩形类,其属性由矩形左上角坐标点(x1,y1)及右下角坐标点(x2,y2)组成,其中,坐标点属性包括该坐标点的X轴及Y轴的坐标值(实型数),求得该矩形的面积。

这道题目是一个简单的类结构设计题,要求设计一个矩形类,计算矩形的面积。

首先,我们需要定义一个矩形类,该类包含两个属性:左上角坐标点和右下角坐标点。坐标点属性包括X轴和Y轴的坐标值,可以使用实型数来表示。

接下来,我们需要设计一个方法来计算矩形的面积。根据矩形的左上角和右下角坐标点,可以通过计算矩形的宽度和高度来得到面积。矩形的宽度可以通过右下角的X轴坐标减去左上角的X轴坐标得到,矩形的高度可以通过左上角的Y轴坐标减去右下角的Y轴坐标得到。最后,将宽度和高度相乘即可得到矩形的面积。

在输入方面,需要分别输入两个坐标点的坐标值x1,y1,x2,y2。这些输入值可以通过Java的Scanner类来获取。

在输出方面,需要输出矩形的面积值,保留两位小数。可以使用Java的System.out.printf()方法来实现。

这道题目的难度较低,主要考察的是对类的设计和方法的实现。需要注意的是,要正确计算矩形的宽度和高度,并保留两位小数的输出格式。

总结起来,这道题目的重难点在于理解矩形的属性和计算面积的方法,以及正确处理输入和输出的格式。知识点包括类的设计和方法的实现,以及输入输出的处理。

源码:

 1 import java.util.Scanner;
 2 
 3 public class Main {
 4     private double x1, y1, x2, y2;
 5 
 6     public Main(double x1, double y1, double x2, double y2) {
 7         this.x1 = x1;
 8         this.y1 = y1;
 9         this.x2 = x2;
10         this.y2 = y2;
11     }
12 
13     public double getArea() {
14         double width = Math.abs(x2 - x1);
15         double height = Math.abs(y2 - y1);
16         return width * height;
17     }
18 
19     public static void main(String[] args) {
20         Scanner scanner = new Scanner(System.in);
21         double x1 = scanner.nextDouble();
22         double y1 = scanner.nextDouble();
23         double x2 = scanner.nextDouble();
24         double y2 = scanner.nextDouble();
25 
26         Main rectangle = new Main(x1, y1, x2, y2);
27         double area = rectangle.getArea();
28         System.out.printf("%.2f", area);
29     }
30 }

类图:

这段Java代码主要涉及以下知识点:

 

1. 类和对象:代码中定义了一个名为Main的类,用于表示一个矩形对象。

2. 构造方法:Main类中定义了一个构造方法,用于初始化矩形的坐标。

3. 成员变量和成员方法:Main类中定义了四个成员变量(x1、y1、x2、y2)和一个计算矩形面积的成员方法(getArea)。

4. Math类的使用:代码中使用了Math类的abs方法来计算矩形的宽度和高度。

5. 输入输出:代码中使用了Scanner类来获取用户输入的矩形坐标,并使用System.out.printf方法输出矩形的面积。

 

需要改进的地方:

1. 缺乏输入验证:代码中没有对用户输入的坐标进行验证,可能导致输入非法的坐标值。

2. 变量命名不规范:代码中的变量命名不够清晰和具有描述性,可以考虑改进命名风格。

3. 缺乏异常处理:代码中没有对可能出现的异常进行处理,比如用户输入非法字符导致的输入错误。

 

写出这段代码的心得:

这段代码实现了一个简单的矩形面积计算功能,通过输入矩形的两个顶点坐标,计算出矩形的面积并输出。代码结构清晰,使用了面向对象的思想,将矩形的坐标和计算面积的方法封装在一个类中。通过使用Scanner类获取用户输入,使得代码具有交互性。在实际应用中,可以根据需求对代码进行改进和优化,比如添加输入验证和异常处理等功能。

 7-3 测验3-继承与多态

分数 30 作者 段喜龙 单位 南昌航空大学

将测验1与测验2的类设计进行合并设计,抽象出Shape父类(抽象类),Circle及Rectangle作为子类

这道题目主要涉及面向对象的基本概念和Java语言的基础知识。题目要求创建一个圆形类和一个矩形类,并设计一个抽象的父类Shape,通过输入参数计算出图形的面积。

首先,我们来分析圆形类(Circle)。根据题目要求,圆形类有一个私有属性半径,需要从控制台输入半径,并输出圆的面积。难度较低,重难点在于计算圆的面积公式的正确使用。知识点包括类的定义、属性的定义和使用、输入输出的处理以及面积计算公式的应用。

接下来,我们分析矩形类(Rectangle)。矩形类的属性由左上角坐标点和右下角坐标点组成,需要根据输入的坐标点计算矩形的面积。难度适中,重难点在于坐标点的输入和处理,以及面积计算公式的正确使用。知识点包括类的定义、属性的定义和使用、输入输出的处理以及面积计算公式的应用。

最后,我们来分析抽象父类Shape。根据题目要求,Shape是一个抽象类,用于统一圆形和矩形的计算面积的方法。难度较低,重难点在于抽象类的定义和使用。知识点包括抽象类的定义和使用、方法的重写和调用。

总体来说,这道题目的难度适中,重难点在于面积计算公式的正确使用和输入输出的处理。知识点涉及类的定义和使用、属性的定义和使用、输入输出的处理、抽象类的定义和使用、方法的重写和调用等。

在解题过程中,需要注意输入的合法性判断,例如输入类型选择的范围、坐标点的合法性等。同时,需要注意保留面积的小数位数,题目要求保留两位小数。

总结起来,这道题目是一个基础的面向对象的题目,通过实现圆形类和矩形类,并设计一个抽象的父类Shape,来计算图形的面积。通过解答这道题目,可以加深对面向对象的理解,并巩固Java语言的基础知识。

源码:

  1 import java.util.ArrayList;
  2 import java.util.Comparator;
  3 import java.util.Scanner;
  4 
  5 abstract class Shape implements Comparable<Shape> {
  6     public abstract double getArea();
  7 
  8     @Override
  9     public int compareTo(Shape s) {
 10         return Double.compare(this.getArea(), s.getArea());
 11     }
 12 }
 13 
 14 class Circle extends Shape {
 15     private double radius;
 16 
 17     public Circle(double radius) {
 18         this.radius = radius;
 19     }
 20 
 21     @Override
 22     public double getArea() {
 23         return Math.PI * radius * radius;
 24     }
 25 }
 26 
 27 
 28 class Point {
 29     private double x;
 30     private double y;
 31     
 32     public Point(double x, double y) {
 33         this.x = x;
 34         this.y = y;
 35     }
 36     
 37     public double getX() {
 38         return x;
 39     }
 40     
 41     public double getY() {
 42         return y;
 43     }
 44 }
 45 
 46 class Rectangle extends Shape{
 47     private Point upperLeft;
 48     private Point lowerRight;
 49     
 50     public Rectangle(Point upperLeft, Point lowerRight) {
 51         this.upperLeft = upperLeft;
 52         this.lowerRight = lowerRight;
 53     }
 54     
 55     
 56     
 57     public Point getUpperLeft() {
 58         return upperLeft;
 59     }
 60 
 61 
 62 
 63     public void setUpperLeft(Point upperLeft) {
 64         this.upperLeft = upperLeft;
 65     }
 66 
 67 
 68 
 69     public Point getLowerRight() {
 70         return lowerRight;
 71     }
 72 
 73 
 74 
 75     public void setLowerRight(Point lowerRight) {
 76         this.lowerRight = lowerRight;
 77     }
 78 
 79 
 80     @Override
 81     public double getArea() {
 82         double width = Math.abs(lowerRight.getX() - upperLeft.getX());
 83         double height = Math.abs(lowerRight.getY() - upperLeft.getY());
 84         return width * height;
 85     }
 86 }
 87 
 88 
 89 public class Main {
 90     public static void main(String[] args) {
 91         Scanner input = new Scanner(System.in);
 92         ArrayList<Shape> list = new ArrayList<>();    
 93 
 94         int choice = input.nextInt();
 95 
 96         while(choice != 0) {
 97             switch(choice) {
 98             case 1://Circle
 99                 double radius = input.nextDouble();
100                 Shape circle = new Circle(radius);
101                 list.add(circle);
102                 break;
103             case 2://Rectangle
104                 double x1 = input.nextDouble();
105                 double y1 = input.nextDouble();
106                 double x2 = input.nextDouble();
107                 double y2 = input.nextDouble();            
108                 Point leftTopPoint = new Point(x1,y1);
109                 Point lowerRightPoint = new Point(x2,y2);
110                 Rectangle rectangle = new Rectangle(leftTopPoint,lowerRightPoint);
111                 list.add(rectangle);
112                 break;
113             }
114             choice = input.nextInt();
115         }    
116 
117         list.sort(Comparator.naturalOrder());//正向排序
118 
119         for(int i = 0; i < list.size(); i++) {
120             System.out.print(String.format("%.2f", list.get(i).getArea()) + " ");
121         }    
122     }    
123 }

类图:

 这段代码涉及到的知识点有:抽象类、继承、多态、接口、比较器、输入输出、集合等。

需要改进的地方:

1. 在Rectangle类中,应该添加合适的构造方法来初始化upperLeft和lowerRight属性,而不是通过set方法来设置。

2. 在Main类中,应该添加输入验证,确保输入的选择是合法的。

写出这段代码的心得:

这段代码展示了面向对象编程的一些基本概念和用法。通过抽象类Shape和具体类Circle、Rectangle的继承关系,实现了多态性。通过实现Comparable接口和重写compareTo方法,实现了Shape对象的比较。通过Scanner类实现了用户输入的读取,通过ArrayList集合来存储Shape对象。这段代码的设计思路清晰,结构合理,可以方便地扩展和修改。

7-4 测验4-抽象类与接口 分数 40 作者 段喜龙 单位 南昌航空大学

在测验3的题目基础上,重构类设计,实现列表内图形的排序功能(按照图形的面积进行排序)。

这道题目主要涉及面向对象的设计和实现,以及排序算法的应用。下面对题目进行分析和解答。

首先,题目要求创建一个圆形类和一个矩形类,并实现计算面积的功能。圆形类的私有属性是半径,矩形类的属性是左上角和右下角的坐标点。可以分别创建Circle和Rectangle类,并在类中定义计算面积的方法。

其次,题目要求设计一个抽象类Shape作为父类,Circle和Rectangle作为子类。这是为了实现多态性,方便对不同类型的图形进行统一的操作。在Shape类中,可以定义一个抽象方法getArea(),在Circle和Rectangle类中分别实现该方法。

然后,题目要求重构类设计,实现列表内图形的排序功能,按照图形的面积进行排序。这里可以使用Comparable接口来实现排序功能。在Shape类中实现Comparable接口,并重写compareTo()方法,根据图形的面积进行比较。

最后,根据输入的图形类型和参数,创建相应的图形对象,并将其添加到列表中。然后对列表进行排序,并按照要求输出排序后的图形面积。

总结起来,这道题目的难度主要在于对面向对象的理解和应用,以及对排序算法的掌握。重难点包括设计类的继承关系、实现抽象方法和接口、以及使用排序算法对对象进行排序。知识点涉及面向对象的基本概念、抽象类和接口的使用、以及排序算法的原理和实现。

源码:

 1 import java.util.ArrayList;
 2 import java.util.Collections;
 3 import java.util.List;
 4 import java.util.Scanner;
 5 
 6 abstract class Shape implements Comparable<Shape> {
 7     abstract double getArea();
 8 
 9     @Override
10     public int compareTo(Shape shape) {
11         return Double.compare(this.getArea(), shape.getArea());
12     }
13 }
14 
15 class Circle extends Shape {
16     private double radius;
17 
18     public Circle(double radius) {
19         this.radius = radius;
20     }
21 
22     @Override
23     double getArea() {
24         return Math.PI * radius * radius;
25     }
26 }
27 
28 class Rectangle extends Shape {
29     private double x1, y1, x2, y2;
30 
31     public Rectangle(double x1, double y1, double x2, double y2) {
32         this.x1 = x1;
33         this.y1 = y1;
34         this.x2 = x2;
35         this.y2 = y2;
36     }
37 
38     @Override
39     double getArea() {
40         return Math.abs(x2 - x1) * Math.abs(y2 - y1);
41     }
42 }
43 
44 public class Main {
45     public static void main(String[] args) {
46         Scanner scanner = new Scanner(System.in);
47         List<Shape> shapes = new ArrayList<>();
48 
49         while (true) {
50             int type = scanner.nextInt();
51             if (type == 0) {
52                 break;
53             }
54 
55             if (type == 1) {
56                 double radius = scanner.nextDouble();
57                 shapes.add(new Circle(radius));
58             } else if (type == 2) {
59                 double x1 = scanner.nextDouble();
60                 double y1 = scanner.nextDouble();
61                 double x2 = scanner.nextDouble();
62                 double y2 = scanner.nextDouble();
63                 shapes.add(new Rectangle(x1, y1, x2, y2));
64             }
65         }
66 
67         Collections.sort(shapes);
68 
69         for (Shape shape : shapes) {
70             System.out.printf("%.2f ", shape.getArea());
71         }
72     }
73 }

类图:

 这段Java代码涉及到的知识点包括抽象类、继承、多态、接口、集合、输入输出、排序等。

需要改进的地方:

1. 在输入部分,没有对输入进行异常处理,如果用户输入非法数据(如字符),程序会抛出异常。可以使用try-catch语句来捕获异常并进行处理。

2. 在输入部分,没有对输入的类型进行验证,如果用户输入的类型不是预期的类型(如输入了负数),程序会继续执行并计算面积,这可能导致错误的结果。可以在输入之前添加一些验证逻辑,确保输入的数据符合要求。

3. 在输出部分,使用了System.out.printf()方法来格式化输出面积,但没有换行。可以在循环结束后添加一个换行符,使输出结果更清晰。

心得体会:

这段代码展示了面向对象编程的一些基本概念和技巧,通过抽象类和多态的使用,可以方便地对不同类型的形状进行统一的操作。使用集合来存储形状对象,并通过实现Comparable接口来实现排序功能,使得形状按照面积大小进行排序输出。这段代码简洁明了,易于理解和扩展。

 

 

题目集方面,我有以下改进建议和意见:

1. 提供更详细的题目说明:有时候题目的表述可能不够清晰,容易引起理解上的困惑。建议在题目中提供更详细的说明和示例,以帮助学生更好地理解题意。

2. 强调编码规范和最佳实践:在题目的要求中可以加入对编码规范和最佳实践的要求,例如命名规范、注释要求、代码风格等。这有助于培养良好的编码习惯和提高代码的可读性和可维护性。

3. 提供范例代码和解析:对于每个题目,可以提供范例代码和解析,以便学生参考和学习。这有助于学生理解问题的解决思路和方法。

 

综合性总结: 

这段时间(6-9周)学习Java,我收获了很多知识和技能。首先,我学会了Java的基本语法和面向对象的编程思想。通过学习Java的数据类型、控制流程、数组、类和对象等基础知识,我能够编写简单的Java程序,并且能够理解和分析他人编写的代码。

其次,我学习了Java的核心类库和常用API。Java的标准类库提供了丰富的功能和工具,如集合框架、IO操作、多线程、网络编程等。通过学习这些类库和API,我能够更高效地开发Java应用程序,并且能够解决一些常见的编程问题。

另外,我也学习了Java的异常处理机制和文件操作。异常处理是Java中重要的编程概念,通过学习异常处理,我能够编写更健壮的程序,并且能够更好地处理程序中可能出现的错误。文件操作是Java中常用的功能之一,通过学习文件操作,我能够读写文件、创建目录、删除文件等,这对于实际开发中的数据存储和读取非常有用。

在学习过程中,我也发现了一些需要进一步学习和研究的地方。首先,我需要深入学习Java的多线程编程。多线程是Java中重要的特性之一,通过使用多线程,可以实现程序的并发执行,提高程序的性能。但是多线程编程也存在一些问题,如线程安全、死锁等,我需要进一步学习和理解这些问题,并且学会如何解决它们。

其次,我还需要学习Java的网络编程和数据库操作。网络编程是现代应用开发中不可或缺的一部分,通过学习网络编程,我能够实现网络通信、数据传输等功能。数据库操作是Java应用开发中常用的功能之一,通过学习数据库操作,我能够实现数据的存储和读取,并且能够使用数据库来支持应用程序的功能。

 

总的来说,这段时间学习Java让我对这门语言有了更深入的了解,我学会了Java的基本语法和面向对象的编程思想,掌握了Java的核心类库和常用API,也学习了Java的异常处理和文件操作。但是我也意识到还有很多需要进一步学习和研究的地方,如多线程编程、网络编程和数据库操作等。通过不断学习和实践,我相信我能够更好地掌握Java编程技术,并且能够在实际开发中运用自如。

 

 

意见与建议:

作为学生,我对Java课程的教师、课程内容、作业、实验以及课上和课下的组织方式有一些改进建议和意见。

首先,关于教师方面,我认为教师应该具备扎实的Java编程知识和丰富的实践经验。他们应该能够清晰地传授Java的基本概念和核心知识,并能够引导学生进行实际的编程练习和项目开发。此外,教师应该积极与学生互动,鼓励学生提问和参与讨论,以激发学生的学习兴趣和思考能力。

其次,关于课程内容方面,我建议在设计课程大纲时,应该充分考虑到学生的实际需求和就业市场的需求。课程内容应该包括Java语言的基础知识、面向对象编程、数据结构与算法、多线程编程、网络编程等方面的内容。同时,可以适当引入一些实际应用案例,让学生能够将所学知识应用到实际项目中。

第三,关于作业和实验方面,我认为应该注重实践能力的培养。作业和实验应该具有一定的难度和挑战性,能够让学生运用所学知识解决实际问题。同时,作业和实验应该有明确的要求和评分标准,以便学生能够清楚地知道自己的学习进展和不足之处。

第四,关于课上和课下的组织方式,我建议采用多种教学方法和手段。除了传统的讲授和演示,可以引入案例分析、小组讨论、编程实践等方式,以提高学生的学习效果和参与度。此外,可以利用在线学习平台和资源,提供课程资料、习题和编程练习等,方便学生在课下进行自主学习和巩固。

 

总之,我希望Java课程能够更加注重实践能力的培养,教师能够具备扎实的专业知识和教学经验,课程内容能够紧密结合实际应用,作业和实验能够有针对性和挑战性,课上和课下的组织方式能够多样化和灵活性。相信通过这些改进和优化,Java课程将能够更好地满足学生的学习需求,提高学生的编程能力和就业竞争力。

相关文章

  • java第二次blog
    1.前言:4~6次pta题目集难度上升,代码量增加,考察了对类的设计以及如何实现类间关系等。难度较大。涉及到了去重排序循环遍历等。还有API接口,JAVA自带的实现类,包装类,成员方法等,涉及的知识面更广更难。 2.设计分析: 7-1菜单计价程序-3:设计点菜计价程序,根据输入的信息,计算......
  • 题目集6-8的总结性Blog
    一、前言第6-8次的pta没有延续之前的菜单计价程序,主要是围绕课程成绩统计程序进行的。第六次大作业就是成绩统计程序,第七次大作业则增加了对HashMap和多态的一个考察,第八次大作业则是增加了对Arraylist部分知识点的考察。这三次作业不再是菜单的设计,而是改为学生成绩的统计,但还是......
  • Blog PTA 6-9总结
    关于成绩统计程序类的结构理解(老师提供的结构代码)这里以课程成绩统计程序-3为代表,本质上三个题目的差别度不大,核心思想都没用太大处。尤其和前面的点菜系统有很强的相似性。输入结构课程名字性质考核方式权重的个数(1,2,4-9不等)考试两个成绩,两个权重考察一个成绩一个权......
  • blog-6-8次PTA题目集(成绩计算系列)
    (1)前言:第6次题目集课程成绩统计程序-1在规范性输入时涉及到了正则表达式,数组列表及其相关方法的使用,if-else,for,foreach循环的使用,以及字符串中的substring()方法,equals()方法的使用,Integer.toString等相关类型之间转化的方式,数据域的封装,Comparable接口的实现,Collections.sort......
  • Blog3
    PTA题目集6,7,8总结Blog一、前言大一下学期开始,我们开始学习Java这门编程语言。Java具有大多数编程语言共有的特性,是专门设计用于互联网分布式环境的。它的形式和感觉类似于C++,但相比C++更易于使用,并且完全采用了面向对象的编程方式。到目前为止,我们已经完成了八次Pta作业。除了......
  • blog-3
    今天这期blog是关于对之前发布的6-8次PTA题目集(成绩计算系列)进行的总结分析,但由于本人学识浅薄,只完成了部分代码 这是第一次课程成绩统计程序以下为代码importjava.util.Scanner;importjava.text.Collator;importjava.util.Locale;importjava.util.Arrays;classCourse{......
  • BLOG-2
    前言:第四次题目集:第四次题目集只有一道题目,是菜单计价系统4,该次计价系统在菜单计价系统3的基础上添加了特色菜功能,并且增加了一些对错误信息的输出语句,最后还改进了价格的输出方式,改为输出打折前的价格与打折后的价格。难度增加相对较小。第五次题目集:第五次题目集同样只有一道......
  • blog2
    本体大部分内容与菜单计价程序-3相同,增加的部分用加粗文字进行了标注。设计点菜计价程序,根据输入的信息,计算并输出总价格。输入内容按先后顺序包括两部分:菜单、订单,最后以"end"结束。菜单由一条或多条菜品记录组成,每条记录一行每条菜品记录包含:菜名、基础价格两个信息。订单......
  • blog2
    PTA题目集4,5及期中考试总结Blog 一.前言;      大一下学期开始,我们开始接触java这门语言,Java具有大部分编程语言所共有的一些特征,被特意设计用于互联网的分布式环境。Java具有类似于C++语言的形式和感觉,但它要比C++语言更易于使用,而且在编程时彻底采用了一种以对象为......
  • blog3
    PTA题目集6,7,8总结Blog 一,前言:      大一下学期开始,我们开始接触java这门语言,Java具有大部分编程语言所共有的一些特征,被特意设计用于互联网的分布式环境。Java具有类似于C++语言的形式和感觉,但它要比C++语言更易于使用,而且在编程时彻底采用了一种以对象为导向的方式......