1. 前言:这三次pta作业是以java程序编写菜单计价程序为主,第一次菜单计价主要是让我了解熟悉Java的基本程序,Java程序的类的创建,对象的创建和使用,方法的定义,方法的调用和值传递。第二次作业增加了菜单与订单两个类,考查了动态数组的使用。第三次作业考查了动态数组内元素的删除和时间的使用。第一次作业是Java程序的基础,题目较为简单。后两次作业增加了一些Java的知识点应用,题目难度一般。
2.设计与分析:
第一次菜单计价程序类图:

代码分析:各个类的无参构造:
Dish()
{
}
方法的构造:价格计算的方法构造:
int getPrice (int portion)
{
float
b1[]={1,1.5f,2};
if(unit_price*b1[portion-1]-(int)(unit_price*b1[portion-1])!=0)
return
(int)(unit_price*b1[portion-1]+1);
else
return (int)(unit_price*b1[portion-1]);
}
类的含参构造:
Dish(String name,int price)
{xian
this.name=name;
this.unit_price = price;
}
对象的创建:
Menu menu =new Menu();
Order order = new Order();
Dish d= new Dish("西红柿炒蛋",15);
第一次作业包含菜品类Dish,菜谱类Menu,点菜纪录类Record和订单类order。主类中创建了四样菜品的对象,各个类中含有类的无参和含参方法的构造。并且类中有新方法的创建和其他类中方法的调用。
第二次菜单计价程序的类图:

代码分析:
HashMap动态数组的包:
import java.util.HashMap;
动态数组的创建:
HashMap<String, Dish> map = new HashMap<String, Dish>();
菜单点菜的记录:
class Record {
int orderNum;
Dish d;
int sizeType;
int num;
public Record(int orderNum, Dish d, int sizeType, int num) {
this.orderNum = orderNum;
this.d = d;
this.sizeType = sizeType;
this.num = num;
}
public int getPrice() {
return d.getPrice(sizeType) * num;
}
}
判断点菜中是否有删除记录:
if (name.matches("\\d+"))
{
if (array.length == 2 && array[1].equals("delete")) {
int num = Integer.parseInt(array[0]);
Record r = order.findRecordByNum(num);
if (r != null) {
order.delARecordByOrderNum(num);
}
else {
System.out.println("delete error");
}
} else {
int orderNum = Integer.parseInt(array[0]);
String dishName = array[1];
int sizeType = Integer.parseInt(array[2]);
int num = Integer.parseInt(array[3]);
Dish d = menu.searchDish(dishName);
if (d == null) {
System.out.println(dishName + " does not exist");
continue;
}
Record r = order.addARecord(orderNum, d, sizeType, num);
System.out.println(r.orderNum + " " + r.d.name + " " + r.getPrice());
orderNum++;
}
}
增加菜单信息:
public Dish addDish(String name, int price)
{
Dish dish = new Dish();
dish.name = name;
dish.price = price;
map.put(name, dish);
return dish;
}
依据序号删除菜单记录:
public void delARecordByOrderNum(int orderNum) {
int pos = -1;
for (int i = 0; i < size; i++) {
if (records[i].orderNum == orderNum) {
pos = i;
break;
}
}
第二次作业较第一次基础Java程序设计增加了一些知识点,应用的HashMap的类包,
动态数组内元素的增加和删除,还对动态数组中元素的存在进行判断,增加了菜单和订单,
菜单的信息的增加与减少,菜单是否含有点菜进行判断。对客户点的所有点菜记录信息保存下来。
第三次菜单计价程序类图:

代码分析:
第三次所需的日期包:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
日期的格式:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH/mm/ss");
菜单增加的信息增多:
Record addARecord(int orderNum,String dishName,int portion,int quotation,int count,Menu menu){
Record newRecord = new Record();
newRecord.orderNum = orderNum;
newRecord.d=menu.dishs[menu.searchDish(dishName,count)];
newRecord.portion = portion;
newRecord.quotation = quotation;
System.out.println(newRecord.orderNum + " "+newRecord.d.name +" "+newRecord.getPrice());
return newRecord;
}
日期的判断和记录的类:
boolean isOpen() {
int weekday = time.getDayOfWeek().getValue();
if(weekday>0&&weekday<6) {
if(time.getHour()>=17&&time.getHour()<20)return true;
if(time.getHour()==20) {
if(time.getMinute()<=30)return true;
}
if(time.getHour()>10&&time.getHour()<14)return true;
if(time.getHour()==10){
if(time.getMinute()>=30)return true;
}
if(time.getHour()==14) {
if(time.getMinute()<=30)return true;
}
}
else {
if(time.getHour()>9&&time.getHour()<21)return true;
if(time.getHour()==9) {
if(time.getMinute()>=30)return true;
}
if(time.getHour()==21) {
if(time.getMinute()<=30)return true;
}
}
return false;
}
}
void getSum() {
int weekday = time.getDayOfWeek().getValue();
for(int i=0;i<order_count;i++) {
sum+=order.records[i].getPrice();
}
if(weekday>0&&weekday<6) {
if(time.getHour()>=17&&time.getHour()<20)sum=Math.round(sum*0.8);
if(time.getHour()==20) {
if(time.getMinute()<=30)sum=Math.round(sum*0.8);
}
if(time.getHour()>=10&&time.getHour()<14)sum=Math.round(sum*0.6);
if(time.getHour()==14) {
if(time.getMinute()<=30)sum=Math.round(sum*0.6);
}
}
}
静态桌子号的类的构造:
static class Table {
Order order = new Order();
int num;
int order_count=0;
LocalDateTime time ;
long sum=0;
void od(Menu menu,int menu_count,String str1,String str2,int portion,int quota){
if(str2.equals("delete")){
if(order.delARecordByOrderNum(Integer.parseInt(str1),order_count))
order_count--;
}
else {
if(menu.searchDish(str2,menu_count)!=-1){
order.records[order_count] = new Record();
order.records[order_count] = order.addARecord(Integer.parseInt(str1),str2,portion,quota,menu_count,menu);
order_count++;
}
else System.out.println(str2+" does not
exist");
}
}
第三次作业再一次增加了桌子号的标识,点菜记录和删除信息、代点菜信息。桌号标识包含两个信息:桌号、时间。代点菜信息包含:桌号序号菜品名称份额份数。代点菜是当前桌为另外一桌点菜,信息中的桌号是另一桌的桌号,带点菜的价格计算在当前这一桌。可以学习到Java程序设计中时间的使用。
采坑心得:
- 1. 第一次作业完成过程中,对Java程序设计的基本程序设计的掌握不够熟练,对各个类的创建,类中无参构造,含参构造,方法的构造和方法的调用不太理解,不会熟练掌握分类,类与方法的构造较少。对于菜单菜品的增加不会。
修改之前:
Dish d= new Dish("西红柿炒蛋",15);
Dish d1 = new Dish("清炒土豆丝",12);
Dish d2 = new Dish("麻婆豆腐",12);
Dish d3 = new Dish("油淋生菜",9);
修改之后:
Dish d= new Dish("西红柿炒蛋",15);
menu.add(d);
d = new Dish("清炒土豆丝",12);
menu.add(d);
d = new Dish("麻婆豆腐",12);
menu.add(d);
d = new Dish("油淋生菜",9);
menu.add(d);
- 2. 第二次作业完成过程中,未增加动态数组的类包,导致程序运行过程中动态数组无法识别报错。对订单记录的删除掌握不太熟练。
修改之前:
import java.util.Scanner;
public void delARecordByOrderNum(int orderNum) {
}
修改之后:
import java.util.Scanner;
import java.util.HashMap;
public void delARecordByOrderNum(int orderNum) {
int pos = -1;
for (int i = 0; i < size; i++) {
if (records[i].orderNum == orderNum) {
pos = i;
break;
}
}
- 3. 第三次作业完成过程中,没有掌握Java程序设计中时间的设置格式的方法,通过网上的知识点的学习才写出。并且对代点菜信息的逻辑和Java代码的编写不太明白。对类中所需创建的方法没有创建完整。
修改之前:
import java.util.Scanner;
static class Table {
修改之后:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
import java.util.Scanner;
static class Table {
Order order = new Order();
int num;
int order_count=0;
LocalDateTime time ;
long sum=0;
void od(Menu menu,int menu_count,String str1,String str2,int portion,int quota){
if(str2.equals("delete")){
if(order.delARecordByOrderNum(Integer.parseInt(str1),order_count))
order_count--;
}
else {
if(menu.searchDish(str2,menu_count)!=-1){
order.records[order_count] = new Record();
order.records[order_count] = order.addARecord(Integer.parseInt(str1),str2,portion,quota,menu_count,menu);
order_count++;
}
else System.out.println(str2+" does not
exist");
}
}
void getSum() {
int weekday = time.getDayOfWeek().getValue();
for(int i=0;i<order_count;i++) {
sum+=order.records[i].getPrice();
}
if(weekday>0&&weekday<6) {
if(time.getHour()>=17&&time.getHour()<20)sum=Math.round(sum*0.8);
if(time.getHour()==20) {
if(time.getMinute()<=30)sum=Math.round(sum*0.8);
}
if(time.getHour()>=10&&time.getHour()<14)sum=Math.round(sum*0.6);
if(time.getHour()==14) {
if(time.getMinute()<=30)sum=Math.round(sum*0.6);
}
}
}
boolean isOpen() {
int weekday = time.getDayOfWeek().getValue();
if(weekday>0&&weekday<6) {
if(time.getHour()>=17&&time.getHour()<20)return true;
if(time.getHour()==20) {
if(time.getMinute()<=30)return true;
}
if(time.getHour()>10&&time.getHour()<14)return true;
if(time.getHour()==10){
if(time.getMinute()>=30)return true;
}
if(time.getHour()==14) {
if(time.getMinute()<=30)return true;
}
}
else {
if(time.getHour()>9&&time.getHour()<21)return true;
if(time.getHour()==9) {
if(time.getMinute()>=30)return true;
}
if(time.getHour()==21) {
if(time.getMinute()<=30)return true;
}
}
return false;
}
}
}
- 4. 主要困难以及改进建议:
对于这三次pta作业的解题过程中,一开始对Java语言的程序设计的基础掌握不牢固,没有完全学通用Java语言的基础设计,对类与对象的基本定义和创建没有深入研究,导致第一次作业的程序设计所花费的时间较长。后面通过第一次菜单计价程序设计完全掌握了用Java语言编写基础的程序,对类与对象能熟练的掌握与使用。后面第二次增加了两个类,其中再次用到了Java语言中的动态数组,也学习到了两种动态数组的不同与区别,知道了动态数组中的元素可以增加与删除。在做第二次作业时,也花费了一些时间认真学习了两种动态数组,在作业中使用了更合适的动态数组。第三次作业完成过程更难,不同于前两次,第三次需要自行上网学习Date时间的使用,需完全掌握Java程序设计中时间类的固定的一些方法和调用。第三次作业中涉及到了代点菜单的逻辑,这也是第三次作业中的难点,其中包含了桌号和自家桌号和其他桌号。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
此第三次包的代码中包含了时间所需要的类包。
static class Table {
Order order = new Order();
int num;
int order_count=0;
LocalDateTime time ;
long sum=0;
void od(Menu menu,int menu_count,String str1,String str2,int portion,int quota){
if(str2.equals("delete")){
if(order.delARecordByOrderNum(Integer.parseInt(str1),order_count))
order_count--;
}
else {
if(menu.searchDish(str2,menu_count)!=-1){
order.records[order_count] = new Record();
order.records[order_count] = order.addARecord(Integer.parseInt(str1),str2,portion,quota,menu_count,menu);
order_count++;
}
else System.out.println(str2+" does not exist");
}
}
void getSum() {
int weekday = time.getDayOfWeek().getValue();
for(int i=0;i<order_count;i++) {
sum+=order.records[i].getPrice();
}
if(weekday>0&&weekday<6) {
if(time.getHour()>=17&&time.getHour()<20)sum=Math.round(sum*0.8);
if(time.getHour()==20) {
if(time.getMinute()<=30)sum=Math.round(sum*0.8);
}
if(time.getHour()>=10&&time.getHour()<14)sum=Math.round(sum*0.6);
if(time.getHour()==14) {
if(time.getMinute()<=30)sum=Math.round(sum*0.6);
}
}
}
boolean isOpen() {
int weekday = time.getDayOfWeek().getValue();
if(weekday>0&&weekday<6) {
if(time.getHour()>=17&&time.getHour()<20)return true;
if(time.getHour()==20) {
if(time.getMinute()<=30)return true;
}
if(time.getHour()>10&&time.getHour()<14)return true;
if(time.getHour()==10){
if(time.getMinute()>=30)return true;
}
if(time.getHour()==14) {
if(time.getMinute()<=30)return true;
}
}
else {
if(time.getHour()>9&&time.getHour()<21)return true;
if(time.getHour()==9) {
if(time.getMinute()>=30)return true;
}
if(time.getHour()==21) {
if(time.getMinute()<=30)return true;
}
}
return false;
}
}
}
此代码中不仅包含了静态的类Table,并且判断了时间。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH/mm/ss");
代码中定义了时间的输入所需的标准格式。
改进的建议:
简化类之间的关系,让自己的代码更加简洁,增加代码的可读性,在代码中多多增加注释,让代码能轻易的读懂
5. 总结:
在近几次的pta作业中,前三次菜单计价程序设计作业中,附加一些其他知识点,让我初步认识到java与上学期学的c语言的区别与相似之处,我感受到了较大的阻力。对类的理解,面向对象的思考,属性,方法等概念在被近几次大作业中得到了很好的消化,对于idea和eclipse的使用,比如调试,插件的安装与查找等技能,得到了很好的锻炼。现在可以做到以idea和eclipse调试独自解决代码出现的问题。我的毅力更是更上一层楼,多次有过放弃的想法,但是由于看着别人100,我在思考我也一定100,最终我都能坚持下去。java的学习相比C语言的学习,节奏更加的快,内容很充实,一环扣一环,很多问题通过百度可以解决。自身解决问题能力大大提升。我对自己的代码在之前的基础上进行了一定的更改,目的是增强自己代码的可读性和灵活性,让自己的代码更完善,通过更合理的分工以及数据的合理储存,让相应的类完成本该属于自己的工作,以及相应的数据放到合理的类中,以达到代码工作和数据处理的合理分配和储存。这几次的作业让我对Java中的面向对象思想更加深刻,对其有了更完善的了解,对于每个分出的类,其中的数据和方法做到谁的工作和数据,就放到对应的类中,这样能做到代码更清晰可读,在符合逻辑的基础上,对代码的更改完善也会变得更轻松简单,一旦发现问题,无论是逻辑上的出错还是编译时代码写错,都能能迅速发现和更改。同时为了完成该次作业. 但这几次的作业也同样让我认识到逻辑思维的严谨对一个程序来说有多么重要.在往后的pta作业中,我需充分读懂题目的要求,完全学会Java语言的基础和众多知识点,让自己编写代码的过程更加流畅,让自己的能力更强。