PTA一~三大作业的总结与分析

                                                                                                                                   前言:

在这三次pta大作业中,第一次大作业的题目量是最多的,但其难度是这三次中最低的,实际上是老师布置来让我们从C语言的模式慢慢转换成Java模式,考察的是Java的一些基本语法语句和实用数据的使用,根据之前学习的C语言知识可以完成第一次大作业,但第二题设了一个大坑,最后输出的数据需要是浮点数,但题目中未提及,结果好多次答案和实例一致却提交错误,第四题与第二题的坑一样,除第八题外,其余题都教会了我许多Java的知识点,而第八题是真无语,从接触到三角形到现在老师和我们讲判断三角形的条件是两边之和大于第三边,两边之减小于第三遍,然而我就这样改了多次算法结果都是运行错误,然后去网页百度答案才知道是(a*a+b*b<c*c+0.000001)||(c*c+b*b<a*a+0.000001)||(a*a+c*c<b*b+0.000001),希望老师可以讲下。

第二次大作业的话,难度是质的增长,即使题目量只有四道,但前两道难度极大,对于新手的我们极其“不友好”,后两体还行,考察日期计算和动态规划,前两道是考察设计点菜程序,而且两道是环环相扣的题,第二题是在第一道题上加功能,加上大家刚接触java,需要花大部分时间去学习Java知识,了解类的结构,熟悉类的写法。经过大量时间的钻研,第二次大作业艰难完成。

第三次大作业相较于第二次的难度略微增加,第一题是难度最大的,是在之前的点菜程序上再加功能,之后的六道可以从网上查找相关的知识点,对于初学Java的我感觉非常具有挑战,做题目前翻阅java课本以及在csdn网站上寻找其中相关数据格式、语法知识的使用,再进行不断地尝试编写代码和编译运行,最终解决了题目,而第一题因为我自身的原因未能达到满分。

设计与分析:

1.某饭店提供4种菜,每种菜品的基础价格如下:
西红柿炒蛋 15
清炒土豆丝 12
麻婆豆腐 12
油淋生菜 9

设计点菜计价程序,根据输入的订单,计算并输出总价格。
订单由一条或多条点菜记录组成,每条记录一行,最后以"end"结束
每条点菜记录包含:菜名、份额两个信息。
份额可选项包括:1、2、3,分别代表小、中、大份)

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

参考以下类的模板进行设计:
菜品类:对应菜谱上一道菜的信息。
Dish {
String name;//菜品名称
int unit_price; //单价
int getPrice(int portion)//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份)
}

菜谱类:对应菜谱,包含饭店提供的所有菜的信息。
Menu {
Dish[] dishs ;//菜品数组,保存所有菜品信息
Dish searthDish(String dishName)//根据菜名在菜谱中查找菜品信息,返回Dish对象。
}

点菜记录类:保存订单上的一道菜品记录
Record {
Dish d;//菜品
int portion;//份额(1/2/3代表小/中/大份)
int getPrice()//计价,计算本条记录的价格
}

订单类:保存用户点的所有菜的信息。
Order {
Record[] records;//保存订单上每一道的记录
int getTotalPrice()//计算订单的总价
Record addARecord(String dishName,int portion)
//添加一条菜品信息到订单中。
}

输入格式:

每条点菜记录的格式:
菜名+空格(英文)+份额
注:份额可输入(1/2/3), 1代表小份,2代表中份,3代表大份。
最后一条记录以“end”结束。

输出格式:

订单上所有菜品的总价(整数数值),每份菜
如果订单中包含不能识别的菜名,则在总价之前输出“** does not exist”,**是不能识别的菜名

输入样例:

在这里给出一组输入。例如:

麻婆豆腐 2
西红柿炒蛋 3
end
 

输出样例:

在这里给出相应的输出。例如:

48
 

输入样例1:

订单中包含不存在的菜品记录。例如:

麻婆豆腐 2
炒脆肚 2
西红柿炒蛋 3
end
 

输出样例1:

在这里给出相应的输出。例如:

炒脆肚 does not exist
48
代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args)
{
Order order = new Order();
Scanner in = new Scanner(System.in);
while(in.hasNext())
{
String dishName = in.next();
if(dishName.equals("end"))
{
break;
}
int portion = in.nextInt();
order.addARecord(dishName, portion);
}
in.close();
System.out.println(order.getTotalPrice());
}
}
class Dish
{
String name;//菜品名称
int unit_price; //单价
public Dish(String name,int price)
{
this.name = name;
this.unit_price = price;
}
public int getPrice(int portion)
{
//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份)
int price=0;
switch(portion)
{
case 1:
price=unit_price;
break;
case 2:
price=Math.round(unit_price*1.5f);
break;
case 3:
price=unit_price*2;
break;
default:
break;
}
return price;
}
}

class Menu
{
Dish[] dishs ;//菜品数组,保存所有菜品信息
public Menu(Dish[] dishs)
{
this.dishs = dishs;
}
public Dish searchDish(String dishName)
{
//根据菜名在菜谱中查找菜品信息,返回Dish对象。
for(Dish dish:dishs)
{
if(dish.name.equals(dishName))
{
return dish;
}
}
return null;
}
}

class Record
{
Dish d;//菜品
int portion;//份额(1/2/3代表小/中/大份)
public Record(Dish d,int portion)
{
this.d = d;
this.portion = portion;
}
public int getPrice()
{
//计价,计算本条记录的价格
if(d==null)
{
return 0;
}
else
{
return d.getPrice(portion);
}
}
}

class Order
{
Record[] records;//保存订单上每一道的记录
public Order()
{
records = new Record[0];
}
public Record addARecord(String dishName,int portion)
{
//添加一条菜品信息到订单中。
Record[] newRecords = new Record[records.length+1];
for(int i=0;i<records.length;i++)
{
newRecords[i] = records[i];
}
Menu menu = new Menu(new Dish[]{new Dish("西红柿炒蛋",15),new Dish("清炒土豆丝",12),new Dish("麻婆豆腐",12),new Dish("油淋生菜",9)});//注意这里的菜谱只包含了两道菜
Dish dish = menu.searchDish(dishName);
if(dish==null)
{
newRecords[records.length] = new Record(null,0);
System.out.println(dishName+" does not exist");
}
else
{
newRecords[records.length] = new Record(dish,portion);
}
records = newRecords;
return records[records.length-1];
}
public int getTotalPrice()
{
//计算订单的总价
int totalPrice = 0;
for(Record r:records)
{
totalPrice+=r.getPrice();
}
return totalPrice;
}
}

 

 

 设计这个简易的点菜程序设计了四个类,分别是菜品,菜单,订单,点菜记录,先在程序运行前输入菜品信息,在按照用户的点餐在储存好菜品信息的数组中一一比对,并储存在订餐的数组中,再计算数额。

心得:多面对对象,可以降低程序设计难度。

踩坑:四舍五入未调用Math函数,未在主程序中关闭程序,使之非0返回(in.close),声明函数时未使用void,未添加变量;未提前设置数组来储存菜品信息,无法在程序中找到储存的菜品信息,使得程序崩溃;

主要困难:设计时未理解啥是面向对象,不知如何使用类,构造类,如何在主程序里使用类;

改进方法:查找相关知识点,询问同学自身的知识盲区。

2.

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

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

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

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


订单分:点菜记录和删除信息。每一类信息都可包含一条或多条记录,每条记录一行。
点菜记录包含:序号、菜名、份额、份数。
份额可选项包括:1、2、3,分别代表小、中、大份。

删除记录格式:序号 delete

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

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

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

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)//根据序号查找一条记录
}
 

输入格式:

菜品记录格式:

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

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

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

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


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

输出格式:

按顺序输出每条订单记录的处理信息,

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

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

最后输出订单上所有菜品的总价(整数数值),

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

输入样例:

在这里给出一组输入。例如:

麻婆豆腐 12
油淋生菜 9
1 麻婆豆腐 2 2
2 油淋生菜 1 3
end
 

输出样例:

在这里给出相应的输出。例如:

1 麻婆豆腐 36
2 油淋生菜 27
63
 

输入样例1:

订单中包含删除记录。例如:

麻婆豆腐 12
油淋生菜 9
1 麻婆豆腐 2 2
2 油淋生菜 1 3
1 delete
end
 

输出样例1:

在这里给出相应的输出。例如:

1 麻婆豆腐 36
2 油淋生菜 27
27
 

输入样例2:

订单中包含不存在的菜品记录。例如:

麻婆豆腐 12
油淋生菜 9
1 麻婆豆腐 2 2
2 油淋生菜 1 3
3 麻辣鸡丝 1 2
end
 

输出样例2:

在这里给出相应的输出。例如:

1 麻婆豆腐 36
2 油淋生菜 27
麻辣鸡丝 does not exist
63
 

输入样例3:

订单中包含删除信息以及不存在的菜品记录。例如:

麻婆豆腐 12
油淋生菜 9
1 麻婆豆腐 2 2
2 油淋生菜 1 3
3 麻辣鸡丝 1 2
1 delete
7 delete
end
 

输出样例3:

在这里给出相应的输出。例如:

1 麻婆豆腐 36
2 油淋生菜 27
麻辣鸡丝 does not exist
delete error;
27
 

输入样例4:

订单中包含删除信息以及不存在的菜品记录。例如:

麻婆豆腐 12
油淋生菜 9
1 麻婆豆腐 2 2
2 油淋生菜 1 3
3 麻辣鸡丝 1 2
5 delete
7 delete
end
 

输出样例4:

在这里给出相应的输出。例如:

1 麻婆豆腐 36
2 油淋生菜 27
麻辣鸡丝 does not exist
delete error;
delete error;
63
代码:
import java.util.Scanner;
public class Main{
public static void main(String []args){
Scanner input = new Scanner(System.in);
Dish[] d=new Dish[1000];
Menu menu=new Menu();
Record[] R=new Record[1000];
Order order=new Order();
int i=0,t=0;
while(true)
{
String a=input.nextLine(); //输入信息
String[] b=a.split(" ");
if(a.equals("end"))
{
if(t==0) //输入菜单
{
System.out.println("0");
return ;
}
else
break;
}
else
{
if(b.length==2)
{
char result=b[0].charAt(0);
if(result>='0'&&result<='9')
{
order.records=R; //删除序号
order.delARecordByOrderNum(b[0],t);
}
else
{
for(int c=0;c<i;c++) //重复的菜品输入
{
if(b[0].equals(d[c].name))
d[c].unit_price=Integer.parseInt(b[1]);
}
d[i]=new Dish();//添加一道菜品信息
d[i].name=b[0];
d[i].unit_price=Integer.parseInt(b[1]);
i++;
}
}
if(b.length==4)
{
if(t==0) //输入菜单菜品
{
menu.dishes =d;
menu.count=i;
}
if(menu.searchDish(b[1])!=null)
{
R[t]=new Record();
R[t].d=menu.searchDish(b[1]); //输入菜品
}
else
{
System.out.println(b[1]+" does not exist"); //记录错误菜品名
continue;
}
R[t].orderNum=b[0]; //输入序号
R[t].portion=Integer.parseInt(b[2]); //输入份额
R[t].num=Integer.parseInt(b[3]); //输入份数
System.out.println(R[t].orderNum+" "+R[t].d.name+" "+R[t].getprice());
t++;
}
}
}
order.records=R;
System.out.print(order.getTotalPrice(t)); //输出总金额
}
//菜品类
public static class Dish
{
String name; //菜品名
int unit_price; //单价
public int getPrice(int portion)
{
double price=unit_price;
switch (portion)
{
case 1:
price=unit_price;
break;
case 2:
price=(int) Math.round(unit_price*1.5);
break;
case 3:
price=unit_price*2;
break;
default:
break;
}
return (int) price;
}
}
//菜单类
public static class Menu
{
Dish[] dishes; //菜品数组
int count;
public Dish searchDish(String dishName)
{
for(int i=0;i<count;i++)
{
if(dishName.equals(dishes[i].name))
{
return dishes[i];
}
}
return null;
}
}
//记录类
public static class Record
{
Dish d; //菜品
int portion,num; //份额
String orderNum; //序号
boolean bro;
public int getprice()
{
int price=d.getPrice(portion)*num;
return price;
}
}
//订单类
public static class Order
{
Record[] records; //菜品数组
public void delARecordByOrderNum(String orderNum1,int count)
{
int flag=0,i;
for(i=0;i<count;i++)
{
if(records[i].orderNum.equals(orderNum1))
{
records[i].bro=true;
flag=1;
}
}
if(flag==0)
{
System.out.println("delete error;");
}
}
public int getTotalPrice(int count)
{
int totalPrice=0;
for(int i=0;i<count;i++)
if(!records[i].bro)
totalPrice+=records[i].getprice();
return totalPrice;
}
}
}

 

 

第二题改变了菜品信息的储存方式,由之前的系统储存转变为用户自己储存,在之前的前提上加上删除信息的功能,保持之前的四个类,在order类里加上删除函数,在用户输入删除序号时,在储存好的菜品信息数组中查找匹配数组,如果找到则上事故,否则输出delete error。

增强了我对面向对象的熟悉度,体验到Java的便利,也了解Java的难度之大。

踩坑:在点份额的return price造成数据损失(应写成return (int) price); 该题目判断非法格式时,未使用split,不知如何对输入的信息进行分析;对格式的判断过于复杂且不够正确,使用了许多if语句,导致代码太长,对整个输入格式的考虑不周全,容易存在隐患。所以以后做类似非法格式判断的题目应该学习正则表达式用来判断输入格式的合法性,减少过多的代码,让整个程序都看起来简洁明了,注意输入格式字符的前后顺序;菜单类中未有这中菜时未返回null;储存的数组信息超出数组范围,

主要困难:不知道如何对输入的信息进行判断,是点餐呢?还是储存菜品信息?还是删除信息?还是结束点餐?不知道如何添加菜品信息;未理解类的使用,习惯性的想使用面向过程,但导致程序无法运行;使用了大量重复类型的方法,是否可用继承与多态的形式;

改进方法:在平时课程中来次简易的程序设计演示给同学看;

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+英文空格+桌号+“:”+英文空格+当前桌的总价

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

输入样例:

在这里给出一组输入。例如:

麻婆豆腐 12
油淋生菜 9
table 1 2023/3/22 12/2/3
1 麻婆豆腐 2 2
2 油淋生菜 1 3
end
 

输出样例:

在这里给出相应的输出。例如:

table 1: 
1 麻婆豆腐 36
2 油淋生菜 27
table 1: 38
 

输入样例1:

在这里给出一组输入。例如:

麻婆豆腐 12
油淋生菜 9
table 1 2023/3/22 17/0/0
1 麻婆豆腐 2 2
2 油淋生菜 1 3
1 delete
end
 

输出样例1:

在这里给出相应的输出。例如:

table 1: 
1 麻婆豆腐 36
2 油淋生菜 27
table 1: 22
 

输入样例2:

在这里给出一组输入。例如:

麻婆豆腐 12
油淋生菜 9
table 1 2023/3/22 16/59/59
1 麻婆豆腐 2 2
2 油淋生菜 1 3
1 delete
end
 

输出样例2:

在这里给出相应的输出。例如:

table 1: 
1 麻婆豆腐 36
2 油淋生菜 27
table 1 out of opening hours
 

输入样例3:

在这里给出一组输入。例如:

麻婆豆腐 12
油淋生菜 9
table 1 2022/12/5 15/03/02
1 麻婆豆腐 2 2
2 油淋生菜 1 3
3 麻辣鸡丝 1 2
5 delete
7 delete
table 2 2022/12/3 15/03/02
1 麻婆豆腐 2 2
2 油淋生菜 1 3
3 麻辣鸡丝 1 2
7 delete
end
 

输出样例3:

在这里给出相应的输出。例如:

table 1: 
1 麻婆豆腐 36
2 油淋生菜 27
麻辣鸡丝 does not exist
delete error;
delete error;
table 2: 
1 麻婆豆腐 36
2 油淋生菜 27
麻辣鸡丝 does not exist
delete error;
table 1 out of opening hours
table 2: 63
 

输入样例4:

在这里给出一组输入。例如:

麻婆豆腐 12
油淋生菜 9
table 1 2022/12/3 19/5/12
1 麻婆豆腐 2 2
2 油淋生菜 1 3
3 麻辣鸡丝 1 2
table 2 2022/12/3 15/03/02
1 麻婆豆腐 2 2
2 油淋生菜 1 3
3 麻辣鸡丝 1 2
1 4 麻婆豆腐 1 1
7 delete
end
 

输出样例4:

在这里给出相应的输出。例如:

table 1: 
1 麻婆豆腐 36
2 油淋生菜 27
麻辣鸡丝 does not exist
table 2: 
1 麻婆豆腐 36
2 油淋生菜 27
麻辣鸡丝 does not exist
4 table 2 pay for table 1 12
delete error;
table 1: 63
table 2: 75
代码:

import java.util.Scanner;
public class Main{
public static void main(String []args){
Scanner input = new Scanner(System.in);
Dish[] d=new Dish[1000];
Menu menu=new Menu();
Record[] R=new Record[1000];
Order order=new Order();
int i=0,t=0;
while(true)
{
String a=input.nextLine(); //输入信息
String[] b=a.split(" ");
if(a.equals("end"))
{
if(t==0) //输入菜单
{
System.out.println("0");
return ;
}
else
break;
}
else
{
if(b.length==2)
{
char result=b[0].charAt(0);
if(result>='0'&&result<='9')
{
order.records=R; //删除序号
order.delARecordByOrderNum(b[0],t);
}
else
{
for(int c=0;c<i;c++) //重复的菜品输入
{
if(b[0].equals(d[c].name))
d[c].unit_price=Integer.parseInt(b[1]);
}
d[i]=new Dish();//添加一道菜品信息
d[i].name=b[0];
d[i].unit_price=Integer.parseInt(b[1]);
i++;
}
}
if(b.length==4)
{
if(t==0) //输入菜单菜品
{
menu.dishes =d;
menu.count=i;
}
if(menu.searchDish(b[1])!=null)
{
R[t]=new Record();
R[t].d=menu.searchDish(b[1]); //输入菜品
}
else
{
System.out.println(b[1]+" does not exist"); //记录错误菜品名
continue;
}
R[t].orderNum=b[0]; //输入序号
R[t].portion=Integer.parseInt(b[2]); //输入份额
R[t].num=Integer.parseInt(b[3]); //输入份数
System.out.println(R[t].orderNum+" "+R[t].d.name+" "+R[t].getprice());
t++;
}
}
}
order.records=R;
System.out.print(table 1 out of opening hours); //输出总金额
}
//菜品类
public static class Dish
{
String name; //菜品名
int unit_price; //单价
public int getPrice(int portion)
{
double price=unit_price;
switch (portion)
{
case 1:
price=unit_price;
break;
case 2:
price=(int) Math.round(unit_price*1.5);
break;
case 3:
price=unit_price*2;
break;
default:
break;
}
return (int) price;
}
}
//菜单类
public static class Menu
{
Dish[] dishes; //菜品数组
int count;
public Dish searchDish(String dishName)
{
for(int i=0;i<count;i++)
{
if(dishName.equals(dishes[i].name))
{
return dishes[i];
}
}
return null;
}
}
//记录类
public static class Record
{
Dish d; //菜品
int portion,num; //份额
String orderNum; //序号
boolean bro;
public int getprice()
{
int price=d.getPrice(portion)*num;
return price;
}
}
//订单类
public static class Order
{
Record[] records; //菜品数组
public void delARecordByOrderNum(String orderNum1,int count)
{
int flag=0,i;
for(i=0;i<count;i++)
{
if(records[i].orderNum.equals(orderNum1))
{
records[i].bro=true;
flag=1;
}
}
if(flag==0)
{
System.out.println("delete error;");
}
}
public int getTotalPrice(int count)
{
int totalPrice=0;
for(int i=0;i<count;i++)
if(!records[i].bro)
totalPrice+=records[i].getprice();
return totalPrice;
}
}
}

 

 

该题在前两道题的基础上加上了相应桌号的点餐记录,要输出相应的桌号的价格,还可以代点菜信息,可以帮别的桌代付部分费用,代点菜是当前桌为另外一桌点菜,信息中的桌号是另一桌的桌号,带点菜的价格计算在当前这一桌,无疑增加了题目难度,这题我被卡了多个测试点,导致本题未达到满分。

踩坑:用大量ifelse去判断输入的日期对应的星期数,但还是出错,让程序超时,也让程序更加僵硬,对加功能有更大的困难。也用if去判断输入时间是否在营业时间范围内,计算复杂,使读者难以理解;输出桌次信息,未使用table类,使用for循环依次输出,增加了代码的复杂度,所需判断的次数几何式增加,使得代码杂乱无章;关门时间是9点半而不是9点,因为题目错误,致使在这个测试点卡住了好久,使得干劲下降;输出数据格式未加上一个因为空格,虽然结果和测试样例一致却一直过不了这个测试样例;

见解:希望出题目给学生做时,教师可以先自己做一遍,在做的同时找出题目漏洞,完善题目本身,不要因为题目本身错误使得学生解题难度大大提升,浪费了大量时间,影响学生的其他课程学习。

主要苦难:不知道如何创建table这个类,不知道里面要包含什么信息;不知道如何表示多桌菜的点餐记录和输出的价格表示;不知道如何表示代付;桌号以下的所有记录都是本桌的记录,直至下一个桌号标识,不理解如何用代码实现;

                                                                                                                                 总结

在学习Java编程语言的过程中,实验是非常重要的一部分。通过实验,我们可以巩固自己的理论知识,掌握编程技能,并且更好地理解编程语言的工作原理和应用场景。在本次Java实验中,我学到了很多知识,也遇到了不少问题,在此总结一下我的心得体会。首先,Java实验的难度逐渐增加,需要有较强的自学能力。尤其是对于没有编程基础或者只有简单编程基础的同学来说,可能会需要更多的时间和精力去学习。因此,我们需要充分利用教材和网络资源,多找一些相关的案例和练习来巩固自己的基础,才能更好地完成实验任务。其次,Java实验中需要注意代码规范和注释。在编写代码时,我们不仅要注重代码的功能和效率,还要注重代码的结构和美观度。良好的代码风格和清晰的注释可以让我们更好地理解代码,并帮助其他人阅读和修改我们的代码,提高代码的可维护性。再次,Java实验中需要多进行代码测试和调试va实验对于我们来说是一个锻炼编程能力的好机会。通过实验,我们可以更深入地理解Java语言的特性、语法以及面向对象的思想。在编写代码后,我们需要对代码进行充分的测试,确保程序的正确性和稳定性。测试是一个漫长而耗时的过程,需要有充分的耐心和细心。当程序出现问题时,我们需要仔细排查错误并及时进行修正,同时记录下来问题的原因和解决方法,以备后续使用。最后,Java实验中需要养成良好的编程习惯。编程是一项需要不断积累和提升的技能,养成良好的编程习惯可以让我们更好地掌握这项技能。例如,我们应该注重代码的复用和封装,设计合理的类和方法结构;我们还要注意保护数据的安全性,避免不必要的数据泄露和损坏。总之,Java实验也是一个检验自己学习成果的好机会。在实验中,我们需要独立思考并编写代码,这让我们有机会将所学的知识应用到实际问题中,并得到及时反馈。通过实践,在巩固自己的基础知识、提高编程能力的同时,也可以更好地了解Java编程语言的特点和应用场景。在此过程中,我们需要不断地学习和思考,探索更好的编程方法和实现方式,不断改进自己的编程水平。

对我自己而言,多熟悉主程序和类的使用,了解如何增加类,使用类,多学习JAVA本身中有哪些便利的函数可供使用者使用,使制作JAVA程序时能达到事半功倍的效果。

建议:希望老师每次在布置大作业的时候能够自己做一遍,确保每道题目的数据是符合题目本身,也希望老师在每次大作业结束时能够根据题目的通过率,如果通过率过低,老师能够相应的讲解该道题的解决方案不一定是给出该道题的完整代码,针对性的给出关键代码讲解给学生听,让学生在课后能够自主思考,在老师讲解的前提下完成已结束的大作业中未完成的部分(除了上述,老师其他方面几乎全能语速适中,语气温和课堂氛围融洽,偶尔与学生一起开玩笑激发同学的好学心,将java这文本身有些无趣的课程变得生动有趣)

 

 

posted @ 2023-04-01 23:01  十八岁软硬兼吃  阅读(196)  评论(0)    收藏  举报