首页 > 其他分享 >PTA题目集4~6的总结

PTA题目集4~6的总结

时间:2023-04-29 17:55:23浏览次数:51  
标签:总结 dishs 题目 桌号 PTA 空格 序号 菜品 Dish

1.前言

  • 题目集4

      题目集4题目量适中,整体难度中偏易

       题目7-1要求厘清类与类间的关系,能对题目所给的要求作出准确的设计,难度中偏上

       题目7-2~7-7考察基本的算法,对Java中集合框架的使用以及对LocalDate类的使用,总体上难度偏易

  • 题目集5

         题目集5题目量适中,整体难度偏易

         题目7-1,7-3,7-4考察对正则表达式的使用,难度偏易

       题目7-2考察基本的算法(冒泡排序)

       题目7-5,7-6以两种不同的聚合结构重写日期问题,但由于给出了类图,只需根据类图完成算法填空即可,难度中偏易。

  • 题目集6

       题目集6只有一题,题目量少但难度较高

       题目7-1是对题目集4中的计价程序进行迭代,增加了 桌号、菜单订单顺序颠倒、不符合格式的输入、序号重复等各种输入错误情况

2.设计与分析

  OOP训练集4

      7-1菜单计价程序-3

      设计点菜计价程序,根据输入的信息,计算并输出总价格。

 

      输入内容按先后顺序包括两部分:菜单、订单,最后以"end"结束。

 

      菜单由一条或多条菜品记录组成,每条记录一行

 

      每条菜品记录包含:菜名、基础价格 两个信息。

 

      订单分:桌号标识、点菜记录和删除信息、代点菜信息。每一类信息都可包含一条或多条记录,每条记录一行或多行。

 

      桌号标识独占一行,包含两个信息:桌号、时间。

 

      桌号以下的所有记录都是本桌的记录,直至下一个桌号标识。

 

      点菜记录包含:序号、菜名、份额、份数。份额可选项包括:1、2、3,分别代表小、中、大份。

 

      不同份额菜价的计算方法:小份菜的价格=菜品的基础价格。中份菜的价格=菜品的基础价格1.5。小份菜的价格=菜品的基础价格2。如果计算出现小数,按四舍五入的规则进行处理。

 

      删除记录格式:序号 delete

 

      标识删除对应序号的那条点菜记录。

 

      如果序号不对,输出"delete error"

 

      代点菜信息包含:桌号 序号 菜品名称 份额 分数

 

      代点菜是当前桌为另外一桌点菜,信息中的桌号是另一桌的桌号,带点菜的价格计算在当前这一桌。

 

      程序最后按输入的先后顺序依次输出每一桌的总价(注意:由于有代点菜的功能,总价不一定等于当前桌上的菜的价格之和)。

 

      每桌的总价等于那一桌所有菜的价格之和乘以折扣。如存在小数,按四舍五入规则计算,保留整数。

 

      折扣的计算方法(注:以下时间段均按闭区间计算):

 

      周一至周五营业时间与折扣:晚上(17:00-20:30)8折,周一至周五中午(10:30--14:30)6折,其余时间不营业。

 

      周末全价,营业时间:9:30-21:30

 

      如果下单时间不在营业范围内,输出"table " + t.tableNum + " out of opening hours"

 

      参考以下类的模板进行设计:菜品类:对应菜谱上一道菜的信息。

 

      Dish {

 

      String name;//菜品名称

 

      int unit_price; //单价

 

      int getPrice(int portion)//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份) }

 

      菜谱类:对应菜谱,包含饭店提供的所有菜的信息。

 

      Menu {

 

      Dish\[\] dishs ;//菜品数组,保存所有菜品信息

 

      Dish searthDish(String dishName)//根据菜名在菜谱中查找菜品信息,返回Dish对象。

 

      Dish addDish(String dishName,int unit_price)//添加一道菜品信息

 

      }

 

      点菜记录类:保存订单上的一道菜品记录

 

      Record {

 

      int orderNum;//序号\\

 

      Dish d;//菜品\\

 

      int portion;//份额(1/2/3代表小/中/大份)\\

 

      int getPrice()//计价,计算本条记录的价格\\

 

      }

 

      订单类:保存用户点的所有菜的信息。

 

      Order {

 

      Record\[\] records;//保存订单上每一道的记录

 

      int getTotalPrice()//计算订单的总价

 

      Record addARecord(int orderNum,String dishName,int portion,int num)//添加一条菜品信息到订单中。

 

      delARecordByOrderNum(int orderNum)//根据序号删除一条记录

 

      findRecordByNum(int orderNum)//根据序号查找一条记录

 

      }

 

      ### 输入格式:

 

      桌号标识格式:table + 序号 +英文空格+ 日期(格式:YYYY/MM/DD)+英文空格+ 时间(24小时制格式: HH/MM/SS)

 

      菜品记录格式:

 

      菜名+英文空格+基础价格

 

      如果有多条相同的菜名的记录,菜品的基础价格以最后一条记录为准。

 

      点菜记录格式:序号+英文空格+菜名+英文空格+份额+英文空格+份数注:份额可输入(1/2/3), 1代表小份,2代表中份,3代表大份。

 

      删除记录格式:序号 +英文空格+delete

 

      代点菜信息包含:桌号+英文空格+序号+英文空格+菜品名称+英文空格+份额+英文空格+分数

 

      最后一条记录以“end”结束。

 

      ### 输出格式:

 

      按输入顺序输出每一桌的订单记录处理信息,包括:

 

      1、桌号,格式:table+英文空格+桌号+”:”

 

      2、按顺序输出当前这一桌每条订单记录的处理信息,

 

      每条点菜记录输出:序号+英文空格+菜名+英文空格+价格。其中的价格等于对应记录的菜品\*份数,序号是之前输入的订单记录的序号。如果订单中包含不能识别的菜名,则输出“\*\* does not                          exist”,\*\*是不能识别的菜名

 

      如果删除记录的序号不存在,则输出“delete error”

 

      最后按输入顺序一次输出每一桌所有菜品的总价(整数数值)格式:table+英文空格+桌号+“:”+英文空格+当前桌的总价

 

      本次题目不考虑其他错误情况,如:桌号、菜单订单顺序颠倒、不符合格式的输入、序号重复等,在本系列的后续作业中会做要求。

 

  输入格式:

 

      桌号标识格式:table + 序号 +英文空格+ 日期(格式:YYYY/MM/DD)+英文空格+ 时间(24小时制格式: HH/MM/SS)

 

      菜品记录格式:

 

      菜名+英文空格+基础价格

 

      如果有多条相同的菜名的记录,菜品的基础价格以最后一条记录为准。

 

      点菜记录格式:序号+英文空格+菜名+英文空格+份额+英文空格+份数注:份额可输入(1/2/3), 1代表小份,2代表中份,3代表大份。

 

      删除记录格式:序号 +英文空格+delete

 

      代点菜信息包含:桌号+英文空格+序号+英文空格+菜品名称+英文空格+份额+英文空格+分数

 

      最后一条记录以“end”结束。

 

  输出格式:

 

      按输入顺序输出每一桌的订单记录处理信息,包括:

 

      1、桌号,格式:table+英文空格+桌号+“:”

 

      2、按顺序输出当前这一桌每条订单记录的处理信息,

 

      每条点菜记录输出:序号+英文空格+菜名+英文空格+价格。其中的价格等于对应记录的菜品\*份数,序号是之前输入的订单记录的序号。如果订单中包含不能识别的菜名,则输出“\*\* does not                           exist”,\*\*是不能识别的菜名

 

      如果删除记录的序号不存在,则输出“delete error”

 

      最后按输入顺序一次输出每一桌所有菜品的总价(整数数值)格式:table+英文空格+桌号+“:”+英文空格+当前桌的总价

 

        本次题目不考虑其他错误情况,如:桌号、菜单订单顺序颠倒、不符合格式的输入、序号重复等,在本系列的后续作业中会做要求。

    解题步骤

             这道题目我先按题目要求写了一些必要的类如Dish Order Record等,在写Menu类时想到菜单应该只有一张,所以我把菜单用单例模式来处理

        菜单类的源码如下:

 1 package MenuPricing;
 2 
 3 public class Menu {
 4     private static Menu menu = null;
 5     private Dish[] dishs = {};
 6     
 7     private Menu() {
 8     
 9     }
10     
11     public static Menu getMenu() {
12         if(menu == null)
13             menu = new Menu();
14         return menu;
15     }
16     
17     public Dish[] getDishs() {
18         return dishs;
19     }
20 
21     public void setDishs(Dish[] dishs) {
22         this.dishs = dishs;
23     }
24     
25     public Dish searthDish(String dishName) {
26         for(Dish i: dishs) {
27             if(i.getName().equals(dishName))
28                 return i;
29         }
30         return null;
31     }
32     
33     public void changeMenu(String dishName , int price ) {
34         for(int i = 0 ; i < this.dishs.length ; i++) {
35             if(dishName.equals(this.dishs[i].getName())) {
36                 dishs[i] = new Dish( dishName, price);
37             }
38         }
39     }
40     
41     public Dish addDish(String dishName,int unit_price) {
42         Dish dish = new Dish(dishName , unit_price);
43         Dish[] newdishs = new Dish[this.dishs.length+1];
44         for(int i = 0 ; i < this.dishs.length ; i++) {
45             newdishs[i] = this.dishs[i];
46         }
47         newdishs[this.dishs.length] = dish;
48         this.dishs = newdishs ;
49         return dish;
50     }
51     
52     public Dish addDish(String dishName,int unit_price,boolean special) {
53         Dish dish = new Dish(dishName , unit_price , true);
54         if(this.searthDish(dishName).getName().equals(dishName)) {
55             for(int i = 0 ; i < this.dishs.length ; i++) {
56                 if(this.dishs[i].getName().equals(dishName)) {
57                     this.dishs[i].setUnit_price(unit_price);
58                     this.dishs[i].setSpecial(special);
59                 }
60             }
61         }
62         else {
63             Dish[] newdishs = new Dish[this.dishs.length+1];
64             for(int i = 0 ; i < this.dishs.length ; i++) {
65                 newdishs[i] = this.dishs[i];
66             }
67             newdishs[this.dishs.length] = dish;
68             this.dishs = newdishs ;
69         }
70         
71         return dish;
72     }
73 }

        这里单例用的是懒汉式并没有通过加锁等方式确保线程安全。

 

        最终再玩成主方法的编写

        由于该题目需要根据不同的用户输入来处理数据所以要对文本进行正确处理我这里采用但是使用Spring中的split方法切割字符串接着对切割后的字符串进行处理。

   OOP训练集5

      7-5 日期问题面向对象设计(聚合一)

      

 给出了类图,让我们根据类图实现相应功能

  由于给出了类图,我们只需完成相应类中的方法编写以及主方法的写法即可完成解答,以下是我写的代码所生成的类图

  

       7-6 日期问题面向对象设计(聚合二)

         

         该题目所完成的相应功能与上一题相同,但其中的类与类简单关系不同,只需再上一题的基础上更改类的关系,修改相应的代码即可完成解答

          下面是根据我写的代码生成的类图:

 

     OOP训练集6

    7-1 菜单计价程序-4

      该题目是对训练集4中的第一题进行迭代升级新增了桌号、菜单订单顺序颠倒、不符合格式的输入、序号重复等错误输入情况,要求对用户的输入进行更精准的判断,新增了特色菜的功能考验了原                   先代码的可拓展性。

      解题步骤,根据新增的特色菜功能对Dish类进行修改,新增boolean类型属性special用于记录是否该菜品为特色菜

              Dish类的类图如下:

 

                   

      然后根据特色菜的功能修改菜价的计算方式,这样算是完成了特色菜的功能

      然后处理桌号、菜单订单顺序颠倒、不符合格式的输入、序号重复等错误,在Main类中新增一些方法处理相应错误

      最终类图如下:

 

 

3.踩坑心得

  在做菜单计价程序写Menu类时,要写一个方法根据传进来的菜品名称改变菜单信息,此时要将菜品名称与菜单中的菜品名称一 一比对,一开始我使用的是“ == ”判断,但运行后发现不行,要改为equals判断,原因是==是判断两个变量或实例是不是指向同一个内存空间,equals是判断两个变量或实例所指向的内存空间的值是不是相同,简单来说是==是指对内存地址进行比较 , equals()是对字符串的内容进行比较。

  后来还查了一下compareTo()的原理,它获取的字符串(也可以是其他对象)的长度,然后作ASCII码的减法,可以判断返回的数值是否为零判断是否相等。

 

4.改进建议

  对用户输入数据的处理方法不够成熟,应该改为用正则表达式去匹配,这样可以更精准的匹配到用户的操作,更准确的判断是否用户输入有误。

 

   写代码前应该先做设计,想好程序结构再开始写。这样可以避免应程序结构的问题反复修改代码。

5.总结

    通过这三次的实验掌握了基本的聚合,依赖等类间关系的使用,熟悉了powerdesingner的运用,练习了正则表达式的使用,理解了“==”,equals(),compareTo()的区别。

    

    这三次的题目集还让我充分意识到自己的许多不足

      1.写代码前应先想整个程序的结构,想清楚再写,不然结构一错基本要全部重写

      2.写代码时一定要写注释,要不然昨天写的代码第二天就不知道那个方法的用处

           3.不要过分的高估自己的能力,提前写完,要不然等到最后几天开始写就来不及了

 

标签:总结,dishs,题目,桌号,PTA,空格,序号,菜品,Dish
From: https://www.cnblogs.com/cbyblogs/p/17359435.html

相关文章

  • Java题目集4~6的总结
    1.前言第四次作业主要涉及的知识点有通过查询JavaAPI文档,了解Scanner类中nextLine()等方法、String类中split()等方法、Integer类中parseInt()等方法的用法,了解LocalDate类中of()、isAfter()、isBefore()、until()等方法的使用规则,了解ChronoUnit类中DAYS、WEEKS、MONTHS等单位......
  • Codeforces Round 854 补题总结
    CodeforcesRound854补题总结前言昨天做这套题很不顺,今天补完题大概总结一下。总结RecentActions按题意模拟即可,考虑到前\(n\)个数一定始终在后\(m\)个数的前面,所以说当当前队列中如果没有出现\(x\)而在第\(i\)轮放进了\(x\),那么当前在队首的编号小于\(n\)的数......
  • oo第二次博客总结
      目录1.前言2.设计与分析3.踩坑心得4.改进建议5.总结一:前言题目集四:1,菜单计价程序-32,有重复的数据3,去掉重复的数据4.单词的统计与排序5.面向对象编程(封装性)6.GPS测绘中度分秒转换7.判断两个日期的先后,计算间隔天数、周数.题目集五:1.正则表达式训练-QQ号校......
  • pta第二部分总结oop训练集05-06
    (1)前言训练集05:(题量适中,难度适中)7-5:多个类的互相调用对于日期类的整体优化,聚合初体验。7-6:对7-5的优化,加强聚合训练。训练集06:(题量少,难度大)7-1:多需求的实现。(完成的不好,编程能力还不够)(2)设计与分析7-5:类图: 源码:importjava.util.Scanner;publicclassMain{......
  • 集训总结
    集训总结前言“吹散记忆的蒲公英,散落碧空;回望过往的风景,尤存风味。”离开初中生活,总会幻想回到过去,回到以前的老师同学身边,羞怯而带有稚气。结束了本蒟蒻的第一次NOIP,第一次自己在外地参加集训。内心却也充满无法言表的激动。而今总结半个月的回忆,内心充满了话,却不知从何开......
  • 题目集4-6
     第二次blog作业1.前言作为一个java和面向对象的初学者,在写题目这方面确实是处处碰壁,但学习最重要的是坚持,希望我能够坚持下去。对于这三次的题目集,就难度而言是比较难的,难在一些测试点需要经过深层次的思考,还要通过大量的测试测试出来,必须承认的是考到的一些知识在题目中都有......
  • IPv6地址总结
    一、IPv6特点地址空间更大,地址长度128位,更便于路由汇总;无需NAT;保留单播,组播,新加入的任意播取代广播;二、IPv6地址分类1.单播地址:和IPv4一样单播地址:除FF00::/8之外的全部IPv6地址可以在启用IPv6接口下自动生成(1)链路本地地址(Link-LocalAddress)链路本地地址是自动生成的,链路本地地......
  • 1.3 关于双指针的一些总结
    这篇内容主要是针对双指针的一些总结,方法比较巧妙,主要核心原理就是:有一个快指针fast、一个慢指针slow,slow指针主要作用就是存储真正的数组(也就是处理之后的结果),fast是辅助寻找元素,然后往slow里面放。典型例题:描述:给你一个数组nums 和一个值val,你需要原地移除所有数值等于......
  • PTA题集4-6总结
    一,前言题集四主要考察了arraylist数组的运用,面向对象的封装性,运用数组高效率去重以及运用数组的一些自带方法解决问题,题量较小,除了7-1之外,其它题目难度较低。除此之外,7-6要求我们自主学习Scanner类中nextLine()等方法、String类中split()等方法、Integer类中parseInt()等方法的用......
  • 分类模型的性能评估指标总结
    机器学习中所用模型的好坏需要通过一些量化的指标来评估。对于分类模型,是通过:1)精度(Accuracy);2)准确率(Precision);3)召回率(Recall);4)F1分数;5)ROC(Receiveroperatingcharacteristiccurve)曲线;6)AUC(AreaUnderCurve)曲线来实现的。二分类模型对于二分类问题,通常将两个类别称为正类和负类。......