一、前言
在第一次系列作业中,通过Java类的使用来编写程序。进行了普通点菜系统的设计,第一次点菜系统比较简易,第二次增加了加入菜单菜品的功能,第三次增加时间,折扣和桌位等元素。
知识点: Java中输入一般是通过Scanner类来实现的:具体步骤如下:
(1)创建Scanner对象,接受从控制台输入 Scanner input=new Scanner(System.in);
(2) 接受String类型 String str=input.next();
(3)接受int类型 int n=input.nextInt();
(4)输出结果 System.out.println(str); System.out.println(n);
条件语句
1.if:
①单条件语句:
if( 条件判断语句 ){
当条件判断语句为true,就执行该代码块,为false就不执行
}
②双条件语句:
if(条件判断语句){
功能语句1,当条件满足时执行该代码块
}else{
功能语句2,当条件不满足时执行该代码块
}
③多条件语句:
if(条件判断语句1){
功能语句1,当条件1满足时执行该代码块
}else if(条件判断2){
功能语句2,当条件2满足时执行该代码块
}else if(条件判断3){
功能语句3,当条件3满足时执行该代码块
}else{
当所有条件都不满足时执行该代码块
}
2.switch:
switch(变量){
case 值1:
功能语句1;
break;
case 值2:
功能语句2;
break;
case 值3:
功能语句3;
break;
default:
功能语句default;
break;
}
Java中的类
类可以看成是创建Java对象的模板。
一个类可以包含以下类型变量:
局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
类变量:类变量也声明在类中,方法体之外,但必须声明为static类型。
(备注:循环语句,String用法,数组等知识点说明过多,此处不详细展开)
题量和难度:
第一次的九道编程题,题量虽然大,但是较为容易,在判断三角形类型这道题中,数据较多,且需要使用Math函数,写起来很简单但比较繁琐。
第二次的四道编程题,题量适中,难度偏难,算是系列题目的开端(也是折磨了无数人)。
第三次的七道编程题,题量多,第一题是系列题的延续,难度较高,后续六题较易(个人感觉还是很难)。
二、设计与分析
设计点菜计价程序,根据输入的信息,计算并输出总价格。
输入内容按先后顺序包括两部分:菜单、订单,最后以"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+英文空格+桌号+“:”+英文空格+当前桌的总价
本次题目不考虑其他错误情况,如:桌号、菜单订单顺序颠倒、不符合格式的输入、序号重复等,在本系列的后续作业中会做要求。
题目集2(7-1)
SourceMonitor报表:
Metrics Details For File 'Main.java'
--------------------------------------------------------------------------------------------
Parameter Value
========= =====
Project Directory C:\Users\平安\IdeaProjects\untitled4\src\
Project Name 报表
Checkpoint Name Baseline
File Name Main.java
Lines 67
Statements 34
Percent Branch Statements 44.1
Method Call Statements 8
Percent Lines with Comments 0.0
Classes and Interfaces 1
Methods per Class 1.00
Average Statements per Method 31.00
Line Number of Most Complex Method 3
Name of Most Complex Method Main.main()
Maximum Complexity 16
Line Number of Deepest Block 28
Maximum Block Depth 5
Average Block Depth 3.44
Average Complexity 16.00
--------------------------------------------------------------------------------------------
Most Complex Methods in 1 Class(es): Complexity, Statements, Max Depth, Calls
Main.main() 16, 31, 5, 8
--------------------------------------------------------------------------------------------
Block Depth Statements
0 2
1 1
2 5
3 7
4 10
5 9
6 0
7 0
8 0
9+ 0
--------------------------------------------------------------------------------------------

类图

(7-2)
SourceMonitor报表:
Metrics Details For File 'Main.java'
--------------------------------------------------------------------------------------------
Parameter Value
========= =====
Project Directory C:\Users\平安\IdeaProjects\untitled5\src\
Project Name 报表3
Checkpoint Name Baseline
File Name Main.java
Lines 134
Statements 111
Percent Branch Statements 21.6
Method Call Statements 23
Percent Lines with Comments 0.0
Classes and Interfaces 5
Methods per Class 2.00
Average Statements per Method 8.40
Line Number of Most Complex Method 4
Name of Most Complex Method Main.main()
Maximum Complexity 7
Line Number of Deepest Block 24
Maximum Block Depth 5
Average Block Depth 2.40
Average Complexity 2.90
--------------------------------------------------------------------------------------------
Most Complex Methods in 5 Class(es): Complexity, Statements, Max Depth, Calls
Dish.Dish() 1, 2, 2, 0
Dish.getPrice() 3, 13, 4, 1
Main.main() 7, 25, 5, 15
Menu.addDish() 1, 2, 2, 0
Menu.searchDish() 3, 5, 3, 1
Order.addARecord() 3, 7, 3, 4
Order.delARecordByOrderNum() 5, 9, 4, 1
Order.getTotalPrice() 2, 4, 3, 1
Record.getPrice() 3, 13, 4, 0
Record.Record() 1, 4, 2, 0
--------------------------------------------------------------------------------------------
Block Depth Statements
0 6
1 21
2 36
3 22
4 23
5 3
6 0
7 0
8 0
9+ 0
--------------------------------------------------------------------------------------------

类图:

题目集3(7-1)
(备注:没做出来,不会)
三、采坑心得
题目集2的第一第二题属于比较困难的题目,在初做第一题的时候选择了面向过程来编写,虽然侥幸做出,但对第二题有明显的反作用,第二题需要使用类来解决分块处理功能。题目集3的第一题也属于系列题目,但功能更加复杂,目前水平有限。题目集1的7-7 判断三角形类型这道题中应注意包含关系,判断的向后顺序,等边直角三角形是特殊的直角三角形,等边三角形就是特殊的等腰三角形。题目集2的7-3需要判断平年,闰年二月份的区别。
四、改进建议
多用类,分模块来进行,体会面向对象的思想,把功能划分给不同的对象,分工合作,多使用一些特殊函数来帮助解决问题,能更有效的解决系列题目所要求的问题。
五、总结
第一次作业使我了解到java的对判断、循环等基本语法,第二次作业,第三次作业让我对java的类有了基本的认识、知道如何去创建一个方法,然后就是必须得从C语言面向过程的思想上一步一步转到面向对象上来,学会并沿用面向对象的思想,将Java的学习再上一个高度。