一、前言

  在第一次系列作业中,通过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的学习再上一个高度。