菜单计价1~3

(1)前言:

  pta三次的作业是循循渐进的,题量适中,要求跟课程学习Java基础知识,同时掌握面向对象的相关知识,能使用Java完成一些小的系统(菜单计价),由于是后面才写博客,所以感觉对前几次的题集有点模糊,题量都不大。

  1.)第一次作业主要是一些小的算法题难度低

  2.)第二次作业主要是在点菜1和点菜2其他的题参考价值不大,两道题不算难但是要打好框架,不然点菜3不好写

  3.)第三次作业点菜3的相比较前两次明显复杂很多,需要花点时间,难度偏大

  这里的话我主要还是分析一下三道点菜,以及第二次的一道算法题,其他的就不多赘述。。。。。。

  总体来说这几次作业还是对Java的学习有较大的帮助的,需要认真对待

(2)设计与分析:

  一.菜单计价程序1

  比较简单,先贴代码  

import java.util.Scanner;
public class Main {
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        Menu menu = new Menu();
        Order order = new Order();
        String s;       //初始菜名
        int portion;    //初始份数
        while(true){
            s = input.nextLine();
            String[] split = s.split(" "); //分割符操作
            String name = split[0];
            if(name.equals("end")) {
                break;
            }
            portion = Integer.parseInt(split[1]);
            Dish dish = menu.searthDish(name);
            if(dish==null){
                System.out.println(name+" does not exist");
            }
            else{
                order.addARecord(name,portion);//添加订单
            }
        }
        int sum=0;
        sum= order.getTotalPrice();;   //计算总和
        System.out.println(sum);
    }
}

class Menu {
    Dish d1=new Dish("西红柿炒蛋",15);
    Dish d2=new Dish("清炒土豆丝",12);
    Dish d3=new Dish("麻婆豆腐",12);
    Dish d4=new Dish("油淋生菜",9);

    Dish[] dishs= {d1,d2,d3,d4};
    public Dish searthDish(String dishName){
        for(int i=0;i<4;i++) {
            if (dishs[i].name.equals(dishName)) {
                return dishs[i];
            }
        }
        return null;
    }//根据菜名在菜谱中查找菜品信息,返回Dish对象。
}

class Dish {
    String name;//菜品名称
    int price; //单价
    public Dish(String name,int price){
       this.name = name;
        this.price = price;
    }
    public  int getPrice(int portion){
        if(portion==1) {
            return price;
        }
        else if(portion==2) {
            int Iprice = (int) (price*1.5);
            if(price-Iprice>=0.5){
                return Iprice+1;
            }
            else {
                return Iprice;
            }
        }
        else if(portion==3) {
            return price*2;
        }
        return 0;
    }//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份;
}

class Order {
    Record[] records = new Record[100];//保存订单上每一道的记录
    public int getTotalPrice() {
        int sum = 0;
        for(int i=0;i<records.length;i++) {
            if(records[i]!=null) {
                records[i].getPrice();
                sum+=records[i].getPrice();
            }
        }
        return sum;
    }
    public Record addARecord(String dishName,int portion){
        Menu menu = new Menu();
        Dish dish = menu.searthDish(dishName);
        Record record = new Record(dish,portion);
        for(int i=0;i<records.length;i++){
            if(records[i]==null){
                records[i] = record;
                break;
            }
        }
        return record;
    }
    //添加一条菜品信息到订单中。
}

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

  下面是类图

java 在pta java在pta怎么写_i++

   1.)分隔符操作:算是头一次用,其实菜单1可以不用分隔符操作的,但是之后的题目里没有它是不行的,所以为了架构更清晰,菜单1我也加入了分隔符操作,

  String [] split = s.split(" ");对于这个操作是定义一个叫split的字符串数组,分割的就是s这个字符串,他将分割得到的几个字符串存进数组里,方便我们对输入的信息判断,

  ""之间的就是我们要的分割字符,这意味着字符串之间以该字符进行分割,在这里我们需要空格作为分割符,获取订单的信息,分别是菜名和份额。

  2.)类型转换操作:portion = Integer.parseInt(split[1]);这里是因为分割得到的一定是字符,但是实际上它表示的是份额,这是个整数,所以需要进行类型转换,这里给出了

  Integer.parselnt就是字符类型转整数类型的前缀,相较于c语言,不是很好记,要多用。

  3.)逻辑思路:第一次太简单了,没有什么出错点,所以来梳理一遍整个的思路

  首先在Dish类里我们定义了菜品的所有属性,包括它的名字,份额,计算价格的方法,接着在Menu里写个Dish的数组,目的是存菜单上的菜品,题目里已经给了,直接存

  然后Record类,及菜品记录类,存下用户点的菜品的名字和对应的份额,这个相对于Dish多了一个用户输入的菜品份额,其实就是一个Dish 2.0,然后因为用户点的菜不止一个,

  所以我们用Order类保存所有的点菜记录,Order里开一个Record类的数组就行了,然后对应的在输入一条点菜记录的时候我们需要把它存进Record数组里,因此Order里需要一个

  方法addARecord来实现这个功能。那最后就是将Order种Record数组的菜品记录的价格进行求和,同样在Order里有一个计算总价的方法getTotalPrice来实现这一功能。

 

  Ps:)第一次菜单计价虽然简单,但是它让我们意识到了面向对象的真正内核:封装。事实上我们可以用c++(不是面向对象)直接完成这道题,但是当一个系统变得复杂,面向过程

  的代码不仅难以修改和维护,而且会让事情变得复杂难以琢磨,甚至眼花缭乱(比如菜单3,就很难完成了),所以,面向对象的重要性就体现出来了,我们看似再做一些无用功,

  其实是让代码变得结构清晰,各个功能独立且完善,这样在下一次进阶的点菜系统中就可以很轻松的完成修改,所以接受面向对象的思维是很重要的。

  

  二.菜单计价程序2 && dp算法

  1.菜单计价程序2

  代码如下:

import java.util.Scanner;
public class Main {
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        Menu menu = new Menu();
        Order order = new Order();
        Tranform tranform = new Tranform();
        String s;
        String name;
        int price;
        int portion;
        int id;
        int a;
        int dishsum;
        while(true){
            s = input.nextLine();
            String[] split = s.split(" "); //分割符操作
            if(split[0].equals("end")){
                break;
            }
            a = tranform.getsize(split);
            if(a==1){
                name = split[0];
                price = Integer.parseInt(split[1]);
                menu.addDish(name,price);
            }
            else if(a==2){
                id = Integer.parseInt(split[0]);
                name = split[1];
                portion = Integer.parseInt(split[2]);
                dishsum = Integer.parseInt(split[3]);
                Dish dish = menu.searthDish(name);
                if(dish==null){
                    System.out.println(name+" does not exist");
                }
                else{
                    System.out.println(id+" "+name+" "+dish.getprice(portion,dishsum));//输出单条订单的价格
                    order.addARecord(id,dish,portion,dishsum);//添加订单
                }
            }
            else if(a==3) {
                id = Integer.parseInt(split[0]);
                Record record = order.findRecordByNum(id);
                if (record == null) {
                    System.out.println("delete error");
                } else {
                    order.delARecordByOrderNum(id);
                }
            }
        }
        int sum=0;
        sum= order.getTotalPrice();   //计算总和
        System.out.println(sum);
    }
}

class Dish {
    String name;//菜品名称
    int price; //单价
    public Dish(String name,int price){
        this.name = name;
        this.price = price;
    }
    public  int getprice(int portion,int dishsum){
        if(portion==1) {
            return price*dishsum;
        }
        else if(portion==2) {
            int Iprice = (int) (price*1.5);
            if(price-Iprice>=0.5){
                return (Iprice+1)*dishsum;
            }
            else {
                return Iprice*dishsum;
            }
        }
        else if(portion==3) {
            return price*2*dishsum;
        }
        return 0;
    }//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份;
}

class Menu {

    Dish[] dishs = new Dish[100];

    public Dish searthDish(String dishName){
        for(int i=0;i<dishs.length;i++) {
            if(dishs[i]!=null && dishs[i].name.equals(dishName)) {
                return dishs[i];
            }
        }
        return null;
    }//根据菜名在菜谱中查找菜品信息,返回Dish对象。
    public Dish addDish(String dishName,int price){
        Dish dish = new Dish(dishName,price);
        for(int i=0;i<dishs.length;i++){
            if(dishs[i]==null){
                dishs[i] = dish;
                break;
            }
        }
        return dish;
    }
}

class Order {
    Record[] records = new Record[100];//保存订单上每一道的记录
    public int getTotalPrice() {
        int sum = 0;
        for(int i=0;i<records.length;i++) {
            if(records[i]!=null) {
                records[i].getPrice();
                sum+=records[i].getPrice();
            }
        }
        return sum;
    }
    public Record addARecord(int id,Dish dish,int portion,int dishsum){
        //Menu menu = new Menu();
        //Dish dish = menu.searthDish(dishName);
        Record record = new Record(dish,portion,dishsum);
        records[id] = record;
        return record;
    }
    //添加一条菜品信息到订单中。
    public Record findRecordByNum(int id){
        return records[id];
    }
    public Record delARecordByOrderNum(int id){
        records[id]=null;
        return null;
    }
}

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

class Tranform {
    public int getsize(String[] split) {
        String id = split[0];
        String[] arr = {"1", "2", "3", "4", "5", "6", "7", "8", "9"};
        for (int i = 0; i < 9; i++) {
            if (id.substring(0, 1).equals(arr[i])) {
                String cd = split[1];
                if (cd.equals("delete")) {
                    return 3;
                } else {
                    return 2;
                }
            }
        }
        return 1;
    }
}

 下面是类图:

java 在pta java在pta怎么写_java 在pta_02

   1.)题目变化:在菜单计价1中,菜谱是已知的,一共四道菜,但是这一次的题,菜谱要从键盘输入,那么有一个问题:什么时候输入的是菜谱,什么时候是点菜记录?

  这是我们主要要考虑的问题。其次,用户可以进行删除某条订单的操作,我们要实现这一功能。

  2.)输入类型判断:可以看到在菜单计价2的代码中我们新增了Transform的类,这个类是转换的意思,也就是根据不同的输入转化成对应的数字,并根据它进行下一步的操作

  这个类的代码实现同样是通过分隔符来实现的,我们已经知道订单是有单号的,而菜谱输入没有,区别在于分割出的第一个字符串是不同的,菜谱的第一个字符串是一个菜名,

  也就是汉字,点菜记录的第一个字符串实际上是一个数字,所以我们可以获取字符串的首字符,若首字符的ASCII值是49到57之间就说明是个数字,我们返回2或者3,菜谱的情况返回1

  。因为有删除订单的操作,所以我们不知道返回2(订单),还是3(删除),所以要对第二个字符串进行判断,如果第二个字符串是delete那么就返回3,否则返回2。

  3.)遇到的问题:起初我是打算将分割到的第一个字符串转化成数字,对数字的范围进行判断,但是汉字不能转换为数字,所以会报错,这点需要注意。

 

  ps:)相比较于菜单1,其实变化不大,只要细心一点就可以,注意一下传参数时的非零返回就好,因为很难找,最好写的时候就注意,还有Transform的创建,这可以大大节省我们

  处理输入的数据的代码,也使代码逻辑更加清楚。

  2.小明走格子问题

  原题如下:

  从A点到B点有n个格子,小明现在要从A点到B点,小明吃了些东西,补充了一下体力,他可以一步迈一个格子,也可以一步迈两个格子,也可以一步迈3个格子,也可以一步迈4个格子。          

  请编写程序计算小明从A点到B点一共有多少种走法。

      分析:这就是一道斐波那契数列变式的问题,大多数人都能写出来,我之所以提这道题主要是因为它是一种最基础的dp算法,虽然和面向对象无关,但是算法方面的东西还是想提一下

  dp是什么?dp也叫动态规划,动态规划是运筹学的一个分支,是求解决策过程最优化的数学方法。利用各个阶段之间的关系,逐个求解,最终求得全局最优解,需要确认原问题与子问题、

  动态规划状态、边界状态、边界值状态、状态转移方程。对于这道题,小明到第n个台阶的走法等于到第(n-1)、(n-2)、(n-3)、(n-4)个台阶的走法之和

  所以状态转移方程就是a[i]=a[i-1]+a[i-2]+a[i-3]+a[i-4];

  有关dp,比较经典的还有背包问题,下面列出相关的c++实现供参考:

#include <iostream>
#include <algorithm>//为调用max函数 
using namespace std;
int n,v1;//n为物品数量,v1为背包大小 
int f[1005][1005];//n件物品放到容量为v1的背包里的最优解 
int v[1005];//物品体积数组
int w[1005];//物品价值数组 
int main()
{
    cin>>n>>v1;//输入物品数量,背包大小 
    for(int i=1;i<=n;i++){
        cin>>v[i]>>w[i];
    }
    for(int i=1;i<=n;i++){//读取物品 
        for(int j=1;j<=v1;j++){//背包容量逐渐增加 
            if(j<v[i])//如果背包容量小于物品体积 
            //则第i件物品无法装进去。
            //所以i的最优解与i-1件物品的最优解相同。
                f[i][j]=f[i-1][j]; 
            else 
            /*第i件物品可以装进去,则判断装与不装谁最优
            因为对所有物品只有装与不装 
             1,不装:不装的话与上面相同,f[i][j]=f[i-1][j];
            2,装;f[i][j]=f[i-1][j-v[i]]+w[i];
            f[i-1][j-v[i]]是在第i件物品之前的最优解,即i-1的最优解 ,
            "-v[i]"是因为需要为第i件物品空出空间,"+w[i]"是把第i件物品选中;  
            */ 
                f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i]);
        }
    }
    cout<<f[n][v1];
    /*对应上边 "int f[1005][1005];//n件物品放到容量为v1的背包里的最优解 ",
    f[n][v1]表示为"n件物品放到v1背包最优解"
    */ 
    return 0;
}

ps:JAVA实现的代码也差不多,因为不是面向对象的代码,所以就不写出来了,这题的分析算是我对算法的兴趣,仅作参考

 

三.菜单计价程序3

还是先放代码:

import java.util.Scanner;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;


public class Main {
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        Menu menu = new Menu();
        Order order = new Order();
        Tranform tranform = new Tranform();
        Table table = new Table();
        Date date = new Date();
        String s;
        String name;
        int sum;
        int price;//单价
        int portion;//份额
        int id;//序号
        int a;
        int dishsum;//份数
        int tableid = 0; //桌号
        int lazy=0;//标记
        double zhekou=1.0;//折扣
        int help;//带点菜桌号
        while(true){
            s = input.nextLine();
            String[] split = s.split(" "); //分割符操作
            if(split[0].equals("end")){
                if(lazy>0){
                    if(zhekou==0){
                        table.arr[tableid]=-1;
                    }
                    else {
                        sum= order.getTotalPrice();
                        int sum_=(int)(sum*1.0*zhekou);
                        if(sum*1.0*zhekou-sum_>=0.5){
                            sum=sum_+1;
                        }
                        else{
                            sum=sum_;
                        }
                        table.arr[tableid] = sum;
                    }
                }
                break;
            }
            a = tranform.getsize(split);
            if(a==1){
                name = split[0];
                price = Integer.parseInt(split[1]);
                menu.addDish(name,price);
            }
            else if(a==4){
                lazy++;
                if(lazy>1){
                    sum= order.getTotalPrice();   //计算总和
                    if(zhekou==0){
                        table.arr[tableid]=-1;
                    }
                    else{
                        sum= order.getTotalPrice();
                        int sum_=(int)(sum*1.0*zhekou);
                        if(sum*1.0*zhekou-sum_>=0.5){
                            sum=sum_+1;
                        }
                        else{
                            sum=sum_;
                        }
                        table.arr[tableid] = sum;
                    }
                    order.dete();
                }
                tableid = Integer.parseInt(split[1]);
                zhekou=date.dateToWeek(split[2]);
                zhekou= date.dateToday(split[3],zhekou);
                System.out.println("table "+tableid+":");
            }
            else if(a==5){
                help= Integer.parseInt(split[0]);
                id = Integer.parseInt(split[1]);
                name = split[2];
                portion = Integer.parseInt(split[3]);
                dishsum = Integer.parseInt(split[4]);
                Dish dish = menu.searthDish(name);
                if(dish==null){
                    System.out.println(name+" does not exist");
                }
                else{
                    System.out.println(id+" table "+tableid+" pay for table "+help+" "+dish.getprice(portion,dishsum));//输出单条订单的价格//这里是带点菜不输出
                    order.addARecord(id,dish,portion,dishsum);//添加订单
                }
            }
            else if(a==2){
                id = Integer.parseInt(split[0]);
                name = split[1];
                portion = Integer.parseInt(split[2]);
                dishsum = Integer.parseInt(split[3]);
                Dish dish = menu.searthDish(name);
                if(dish==null){
                    System.out.println(name+" does not exist");
                }
                else{
                    System.out.println(id+" "+name+" "+dish.getprice(portion,dishsum));//输出单条订单的价格
                    order.addARecord(id,dish,portion,dishsum);//添加订单
                }
            }
            else if(a==3) {
                id = Integer.parseInt(split[0]);
                Record record = order.findRecordByNum(id);
                if (record == null) {
                    System.out.println("delete error");
                } else {
                    order.delARecordByOrderNum(id);
                }
            }
        }
        table.shuchu();
    }
}

class Date{
    public double dateToWeek(String datetime) {
        SimpleDateFormat f = new SimpleDateFormat("yyyy/MM/dd");
        int[] weekDays = {7,6,5,4,3,2,1};
        Calendar cal = Calendar.getInstance(); // 获得一个日历
        java.util.Date datet = null;
        try {
            datet = f.parse(datetime);
            cal.setTime(datet);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        int w = cal.get(Calendar.DAY_OF_WEEK) - 1; // 指示一个星期中的某天。
        if (w < 0)
            w = 0;
        if(weekDays[w]>5){
            return 1.0;
        }
        return 0.8;
    }
    public double dateToday(String daytime,double zhekou){
        String[] split = daytime.split("/");
        int p= Integer.parseInt(split[0]);
        int p1= Integer.parseInt(split[1]);
        int p2= Integer.parseInt(split[2]);
        if(zhekou==1.0){
            if(p==9){
                if(p1>=30){
                    return zhekou*1.0;
                }
                return 0;
            }
            else if(p==21){
                if(p1<=29){
                    return 1.0*zhekou;
                }
                else if(p1==30){
                    if(p2==0){
                        return 1.0*zhekou;
                    }
                    return 0;
                }
                return 0;
            }
            else if(p2>=10 && p<=20){
                return 1.0*zhekou;
            }
            return 0;
        }
        else if(zhekou==0.8){
            if(p==20){
                if(p1<=29){
                    return 1.0*zhekou;
                }
                else if(p1==30){
                    if(p2==0){
                        return 1.0*zhekou;
                    }
                    return 0;
                }
                return 0;
            }
            else if(p>=17 && p<=19){
                return 1.0*zhekou;
            }
            if(p==10){
                if(p1>=30){
                    return zhekou*0.75;
                }
                return 0;
            }
            else if(p==14){
                if(p1<=29){
                    return 0.75*zhekou;
                }
                else if(p1==30){
                    if(p2==0){
                        return 0.75*zhekou;
                    }
                    return 0;
                }
                return 0;
            }
            else if(p2>=9 && p<=13){
                return 0.75*zhekou;
            }
            return 0;
        }
        return 0;
    }
}

class Dish {
    String name;//菜品名称
    int price; //单价
    public Dish(String name,int price){
        this.name = name;
        this.price = price;
    }
    public  int getprice(int portion,int dishsum){
        if(portion==1) {
            return price*dishsum;
        }
        else if(portion==2) {
            int Iprice = (int) (price*1.5);
            if(price-Iprice>=0.5){
                return (Iprice+1)*dishsum;
            }
            else {
                return Iprice*dishsum;
            }
        }
        else if(portion==3) {
            return price*2*dishsum;
        }
        return 0;
    }//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份;
}

class Menu {
    Dish[] dishs = new Dish[100];

    public Dish searthDish(String dishName){
        for(int i=0;i<dishs.length;i++) {
            if(dishs[i]!=null && dishs[i].name.equals(dishName)) {
                return dishs[i];
            }
        }
        return null;
    }//根据菜名在菜谱中查找菜品信息,返回Dish对象。
    public Dish addDish(String dishName,int price){
        Dish dish = new Dish(dishName,price);
        for(int i=0;i<dishs.length;i++){
            if(dishs[i]==null){
                dishs[i] = dish;
                break;
            }
        }
        return dish;
    }
}

class Order {
    Record[] records = new Record[100];//保存订单上每一道的记录
    public int getTotalPrice() {
        int sum = 0;
        for(int i=0;i<records.length;i++) {
            if(records[i]!=null) {
                records[i].getPrice();
                sum+=records[i].getPrice();
            }
        }
        return sum;
    }
    public Record addARecord(int id, Dish dish, int portion, int dishsum){
        //Menu menu = new Menu();
        //Dish dish = menu.searthDish(dishName);
        Record record = new Record(dish,portion,dishsum);
        records[id] = record;
        return record;
    }
    //添加一条菜品信息到订单中。
    public Record findRecordByNum(int id){
        return records[id];
    }
    public Record delARecordByOrderNum(int id){
        records[id]=null;
        return null;
    }
    public void dete(){
        for(int i=0;i<records.length;i++) {
            if(records[i]!=null) {
                records[i]=null;
            }
        }
    }
}

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

class Table {
    int arr[] = new int[100];
    public void shuchu(){
        for(int i=0;i<arr.length;i++) {
            if(arr[i] ==-1) {
                System.out.println("table "+i+" out of opening hours");
            }
            else if(arr[i]!=0){
                System.out.println("table "+i+": "+arr[i]);
            }
        }
    }
}

下面是类图:

java 在pta java在pta怎么写_System_03

 

  1.)题目变化:相对前两次的菜单计价程序,这次的题目明显复杂许多,在菜单计价程序2的基础上,添加了桌号,也就是说订单不再是只对一个用户,而是对若干桌的顾客,而且桌号的条件下

  还有代点菜的功能,另一方面,添加了时间的概念,也就是说饭店有固定的开放时间和对应的折扣,这里的内容其实是比较复杂的,最后我们也不再是输出单个的总价,而是要按照

  点菜的桌号顺序依次输出每一桌的总价。

  2.)判断一个日期是星期几的功能暂时我们自己是不会的,但是Java已经给好了相关的时间类及其方法,不必自己研究一个新的写法

  3.)理清逻辑:首先桌号的出现使得我们的Transform类需要再加两种判断,一种是桌号信息的输入,另一种是代点菜信息的输入,判断不难,分割的第一个字符串如果是table,就是桌号信息

  的输入,如果第一个字符串是数字,并且第二个分割的字符串是table那么就是代点菜信息的输入,接着新建的Table类里需要有一个arr数组,存放这一桌的总价,如果是-1就表示超出了营业时间

  ,不计算价格,至于日期类就不说了,判断是否是周末以及计算折扣的类。在这些之中处理table信息是最复杂的,我们需要知道哪一部分的订单时这一桌的,因此我在Mian里写了一种特殊的

  方法来解决这一问题,比较偏向算法,没有进一步地封装,算是一点需要改进的地方。

 

(3)采坑心得:

  主要还是对菜单计价程序3分析一下:

  1.日期判断的类有点小问题,不是很精确,有的时候会出错,下面附一张运行结果的图:

java 在pta java在pta怎么写_字符串_04

 

  分析:最后一行本来应该输出table 2: 75,但是却显示超出营业时间,所以日期类其实是有点问题的,我暂时还没有去改正,因为时网上参考的代码不好修改,以后会尝试修改好

 

  2.题目要求了要四舍五入,最开始没有注意,导致错误:

  分析:解决的思路各有不同,我的想法是先对单价乘份额后用一个整数保存它的整数部分 ,然后比较整数部分和它本身的差值是否小于0.5,若小于则取其整数部分,否则取整数部分加1 

  3.分析具体时间段的方法太繁杂,且不宜阅读和修改,下面是该方法的代码:  

public double dateToday(String daytime,double zhekou){
        String[] split = daytime.split("/");
        int p= Integer.parseInt(split[0]);
        int p1= Integer.parseInt(split[1]);
        int p2= Integer.parseInt(split[2]);
        if(zhekou==1.0){
            if(p==9){
                if(p1>=30){
                    return zhekou*1.0;
                }
                return 0;
            }
            else if(p==21){
                if(p1<=29){
                    return 1.0*zhekou;
                }
                else if(p1==30){
                    if(p2==0){
                        return 1.0*zhekou;
                    }
                    return 0;
                }
                return 0;
            }
            else if(p2>=10 && p<=20){
                return 1.0*zhekou;
            }
            return 0;
        }
        else if(zhekou==0.8){
            if(p==20){
                if(p1<=29){
                    return 1.0*zhekou;
                }
                else if(p1==30){
                    if(p2==0){
                        return 1.0*zhekou;
                    }
                    return 0;
                }
                return 0;
            }
            else if(p>=17 && p<=19){
                return 1.0*zhekou;
            }
            if(p==10){
                if(p1>=30){
                    return zhekou*0.75;
                }
                return 0;
            }
            else if(p==14){
                if(p1<=29){
                    return 0.75*zhekou;
                }
                else if(p1==30){
                    if(p2==0){
                        return 0.75*zhekou;
                    }
                    return 0;
                }
                return 0;
            }
            else if(p2>=9 && p<=13){
                return 0.75*zhekou;
            }
            return 0;
        }
        return 0;
    }

  分析:if语句太多太杂,非常绕,我自己写完也要花点时间爱知道自己写的是什么,主要是没有注释,所以应该在这种代码段里添加注释,方便修改和阅读   

(4)主要困难以及改进建议:

  1.主要困难:

  其实总的来说三次题目都不算很难,我觉得最多的还是Java里有许多简洁的操作对实现代码有帮助,需要一边写一边去查阅资料,不能心急,其次就是非零返回的问题,主要出现在将订单记录

  和桌号记录存进数组里,以及查找一条菜品是否存在的处理上,最后就是要细心吧,因为测试点很多,要保证一个系统的完善就要非常细致。

  2.改进建议:

  1.修改日期类,使其更加准确,并加入注释方便阅读和以后的修改。

  2.主函数里定义了许多变量用来处理每一桌的信息的分割和储存,这部分代码有改进的较大空间,可以将代码封装性加强。

  3.一个完善的系统应该可以加入保护信息或者反馈错误的功能,可以自己尝试实现。

(5)总结:

  这三次的题目,使我逐渐地掌握了Java面向对象的基本知识,同时在这段时间的学习中也培养了自己独立思考和查阅知识的能力,这些小的系统也让我知道了面向对象在处理复杂事物上的能力,

  因为写项目和写算法是截然不同的,以前我只喜欢算法,说以学习面向对象的时候是有些排斥的,但是写完这三次题目后我已经能够很好地接受面向对象的思想了。