继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Java第二季答答租车系统

柠檬酸钠
关注TA
已关注
手记 3
粉丝 29
获赞 131

最近刚考完试,实在是闲得无聊,想起来好几个月没碰Java。第二季视频还有个作业,就顺手做了,中间出现了许多问题,特此整理出来分享一下

首先我需要生成汽车的类,刚开始我是这样写的

class Car {
    int site = 0;
    int price = 0;
    String name = "";
}

class Truck {
    int goods = 0;
    int price = 0;
    String name = "";
}

class PickUp {
    int goods = 0;
    int site = 0;
    int price = 0;
    String name = "";
}

后来生成时发现需要将所有的车存储在一个数组中,数组类型无法统一
我又改成了这样

public class Car {
  private int goods = 0;
  private int site = 0;
  private int price = 0;
  private String name = "";
  public Car(String name, int site, int goods, int price) {
      this.name = name;
      this.site = site;
      this.goods = goods;
      this.price = price;
  }
  public String getName() {
      return name;
  }
  public int getGoods() {
      return goods;
  }
  public int getSite() {
      return site;
  }
  public int getPrice() {
      return price;
  }
}

这样就不错了,然后我开始编写main函数


首先做了一个提示信息

欢迎来到答答租车系统。您是否要租车(非屌丝勿入)?(Y/N)

用到了Scanner的next方法,如果用户输入的是Y的话就继续执行,否则退出

import java.util.Scanner;

public class DadaCar {
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.println(" 欢迎来到答答租车系统。您是否要租车(非屌丝勿入)?(Y/N)");
    String bool = scanner.next();
    //判断是否继续
    if (Objects.equals(bool, "Y")) {
      //......
    }
    System.out.println("感谢使用本租车系统,欢迎下次光临!")
  }
}

然后呢我就继续往下写,首先需要一个初始化汽车信息的函数

import java.util.Scanner;

class DadaCar {
  public Car[] cars;
  private int[] idArr;
  public class DadaCar {
    public static void main(String[] args) {
      Scanner scanner = new Scanner(System.in);
      System.out.println(" 欢迎来到答答租车系统。您是否要租车(非屌丝勿入)?(Y/N)");
      String bool = scanner.next();
      //判断是否继续
      if (Objects.equals(bool, "Y")) {
        Car car = new DadaCar();
        car.initCar();
      }
      System.out.println("感谢使用本租车系统,欢迎下次光临!")
    }
  }
  private void initCar () {
    cars = new Car[]{
      new Car("屌丝专用轻型皮卡1", 2, 5, 800),
      new Car("屌丝专用轻型皮卡2", 2, 3, 500),
      new Car("屌丝专用重型皮卡", 2, 10, 1200),
      new Car("屌丝专用小轿车A3", 5, 0, 500),
      new Car("屌丝专用面包车T8", 8, 0, 900),
      new Car("屌丝专用小型货车", 0, 5, 500),
      new Car("屌丝专用大型货车", 0, 12, 1000)
    };
    idArr = new int[this.car.length];
  }
}

这里扯一句,idArr是存储每辆车租车数量的数组
恩,继续写,初始化完了之后呢需要输出一下,只需要定义一个输出函数就可以了

private void outCar () {
  System.out.println("当前共有"+this.cars.length+"辆车");
  System.out.println("id\t车名\t\t\t\t座位数\t载货量(t)\t价格(RMB/天)");
  int id = 0;
  for (Car car1 : this.cars) {
    id++;
    System.out.println(id + "\t" +
      car1.getName() + "\t" +
      car1.getSite() + "\t\t" +
      car1.getGoods() + "\t\t\t" +
      car1.getPrice());
  }
}

注:从此处开始多余代码将会被省略

当然在调用initCar之后我又调用了outCar函数,然后就可以开始让用户选择了
这时我发现我还要让用户选择Y/N,于是乎这家伙自然而然的就成为了一个函数,同时做了一些错误处理:即发现错误后回调自身以达到让用户重新选择

public boolean isNext (String msg) {
  Scanner scanner = new Scanner(System.in);
  System.out.print(msg + "(Y/N)  ");
  String bool = scanner.next().toUpperCase();
  switch (bool) {
    case "Y":
      return true;
    case "N":
      return false;
    default:
      return this.isNext("您的输入有误,请重试!");
  }
}

既然都封装了一个选择继续的,我当然就一口气把输入数字的也封装完了

import java.util.InputMismatchException;
//......
public int inputNum (String msg,int min,int max) {
  Scanner scanner = new Scanner(System.in);
  try {
    System.out.print(msg + " ");
    int num = scanner.nextInt();
    if (num > max  num < min) {
      return this.inputNum("输入错误,请重新输入:", min, max);
    } else {
      return num;
    }
  } catch (InputMismatchException e) {
    return this.inputNum("输入错误,请重新输入:",min,max);
  }
}

当然中间自然会出现许多错误,首先nextInt是输入数字的,如果输入其他的东西会抛出一个InputMismatchException异常,我使用了try...catch进行捕获,如果输入错误或者不在所规定的范围内,则使用递归进行提示

在这里刚开始是有点小问题的,本来我的scanner是一个类变量,避免每次输入都需要实例化一个Scanner,但是发现如果一次输入有错误的话后面根本无法输入,最后只能使用这种方法。不知道哪位大神有更好的解决方案

接下来我就可以名正言顺的写汽车选择函数了
这里需要说明一点:在输出车时id是从1开始的,而在程序中id是从0开始的,所以要让id进行自减(很重要)

private boolean selectCar () {
  int id = this.inputNum("请输入id进行选车:",1,this.cars.length);
  id--;
  Car selectedCar = this.cars[id];
  int num = this.inputNum("请输入数量:",0, 1000);
  boolean bool = this.isNext("您选择了“" + selectedCar.getName()+ "”" + num + "辆,共" + (selectedCar.getPrice()*num) + "RMB/天,添加到购物车吗?");
  if (bool) {
    this.addCar(id,num);
  }
  return this.isNext("是否继续选车?");
}

这里大家看到我在最后返回了一个布尔值,这是为什么呢?
其实看一看main函数就知道了

public static void main(String[] args) {
  DadaCar car = new DadaCar();
  boolean bool = car.isNext("欢迎来到答答租车系统。\n" +
                            "您是否要租车(非屌丝勿入)?");
  if (bool) {
    car.initCar();
    car.outCar();
    boolean next;
    do {
      next = car.selectCar();
    } while (next);
  }
  System.out.println("感谢使用本租车系统,欢迎下次光临!");
}

在这里我巧妙的运用了do...while的特性:首先会执行一次,然后才会判断while内的条件。当返回值为true时,说明用户还要选车,那么我就再执行selectCar函数,返回false就退出

在上面的selectCar函数中,我调用了一个addCar的方法,那么现在就来实现它

private void addCar (int id,int num) {
    this.idArr[id] += num;
}

很简单的一个函数,不是吗?应该不需要我多解释了吧

那么接下来呢,如果用户选择车选完了,就要让他填写一下租车的时间
这个也是比较简单的,在上面提到的do...while后面直接调用封装好的inputNum方法就行

public class DadaCar {
  public Car[] cars;
  private int[] idArr;
  public int day = 0;
  public static void main(String[] args) {
    DadaCar car = new DadaCar();
    boolean bool = car.isNext("欢迎来到答答租车系统。\n" +
                              "您是否要租车(非屌丝勿入)?");
    if (bool) {
      car.initCar();
      car.outCar();
      boolean next;
      do {
        next = car.selectCar();
      } while (next);
      car.day = car.inputNum("请输入租车天数(最少1天,最多30天):",1,30);
    }
    System.out.println("感谢使用本租车系统,欢迎下次光临!");
  }
  //......
}

有人问为什么有个最多30天,就像上面选车的数量为啥有个最大1000的限制,其实这个可以随意改的。主要是因为封装输入数字函数时有一个最大最小限制,对这两个参数并没有做选填处理,所以就传了一个比较大的值,一般人也不会闲的没事干选1000辆车吧

写到这基本就完工了,最后再计算一下用户所交的钱,总座位数,还有总载货量之类的

private void sum () {
  int totalCar = 0;
  int totalMoneyPerDay = 0;
  int totalSite = 0;
  int totalGoods = 0;
  for (int i = 0; i < this.idArr.length; i++) {
    int num = this.idArr[i];
    totalCar += num;
    totalMoneyPerDay += this.cars[i].getPrice() * num;
    totalSite += this.cars[i].getSite() * num;
    totalGoods += this.cars[i].getGoods() * num;
  }
  int totalMoney = totalMoneyPerDay * this.day;
  System.out.println("您共选了"+totalCar+"辆车,需花费"+
                     totalMoneyPerDay +"RMB/天。您需要租车" + this.day +
                     "天,共" + totalMoney +
                     "元。以下是详单:");
  System.out.println("车名\t\t\t\t座位数\t载货量(t)\t租车数\t价格(RMB/天)\t总计");
  for (int i = 0; i < this.cars.length; i++) {
    int num = this.idArr[i];
    if (num != 0) {
      System.out.println(this.cars[i].getName()+"\t" +
                         this.cars[i].getSite() + "\t\t" +
                         this.cars[i].getGoods() + "\t\t\t" +
                         num + "\t\t" +
                         this.cars[i].getPrice() + "\t\t\t\t" +
                         this.cars[i].getPrice() + "RMB/天 * " +
                         this.day + "天 * " + num + "辆 = " +
                         this.cars[i].getPrice() * num * this.day + "RMB");
    }
  }
  if (this.isNext("您选择的车共可以载人" + totalSite +
                  "人,载物" + totalGoods +
                  "吨,是否现在支付?")) {
    System.out.println("正在跳转至支付界面,请稍后......");
  }
}

这个函数里用了相同的两次循环,想优化一下,但无从下手,求大神指点指点

最后的DadaCar类是这个样子的哦

package com.dadacar;

import java.util.InputMismatchException;
import java.util.Scanner;

public class DadaCar {
    public Car[] cars;
    private int[] idArr;
    public int day = 0;
    public static void main(String[] args) {
        DadaCar car = new DadaCar();
        boolean bool = car.isNext("欢迎来到答答租车系统。\n" +
                "您是否要租车(非屌丝勿入)?");
        if (bool) {
            car.initCar();
            car.outCar();
            boolean next;
            do {
                next = car.selectCar();
            } while (next);
            car.day = car.inputNum("请输入租车天数(最少1天,最多30天):",1,30);
            car.sum();
        }
        System.out.println("感谢使用本租车系统,欢迎下次光临!");
    }
    private void sum () {
        int totalCar = 0;
        int totalMoneyPerDay = 0;
        int totalSite = 0;
        int totalGoods = 0;
        for (int i = 0; i < this.idArr.length; i++) {
            int num = this.idArr[i];
            totalCar += num;
            totalMoneyPerDay += this.cars[i].getPrice() * num;
            totalSite += this.cars[i].getSite() * num;
            totalGoods += this.cars[i].getGoods() * num;
        }
        int totalMoney = totalMoneyPerDay * this.day;
        System.out.println("您共选了"+totalCar+"辆车,需花费"+
                totalMoneyPerDay +"RMB/天。您需要租车" + this.day +
                "天,共" + totalMoney +
                "元。以下是详单:");
        System.out.println("车名\t\t\t\t座位数\t载货量(t)\t租车数\t价格(RMB/天)\t总计");
        for (int i = 0; i < this.cars.length; i++) {
            int num = this.idArr[i];
            if (num != 0) {
                System.out.println(this.cars[i].getName()+"\t" +
                        this.cars[i].getSite() + "\t\t" +
                        this.cars[i].getGoods() + "\t\t\t" +
                        num + "\t\t" +
                        this.cars[i].getPrice() + "\t\t\t\t" +
                        this.cars[i].getPrice() + "RMB/天 * " +
                        this.day + "天 * " + num + "辆 = " +
                        this.cars[i].getPrice() * num * this.day + "RMB");
            }
        }
        if (this.isNext("您选择的车共可以载人" + totalSite +
                "人,载物" + totalGoods +
                "吨,是否现在支付?")) {
            System.out.println("正在跳转至支付界面,请稍后......");
        }
    }
    private void addCar (int id,int num) {
        this.idArr[id] += num;
    }

    public int inputNum (String msg,int min,int max) {
        Scanner scanner = new Scanner(System.in);
        try {
            System.out.print(msg + " ");
            int num = scanner.nextInt();
            if (num > max  num < min) {
                return this.inputNum("输入错误,请重新输入:", min, max);
            } else {
                return num;
            }
        } catch (InputMismatchException e) {
            return this.inputNum("输入错误,请重新输入:",min,max);
        }
    }
    public boolean isNext (String msg) {
        Scanner scanner = new Scanner(System.in);
        System.out.print(msg + "(Y/N)  ");
        String bool = scanner.next().toUpperCase();
        switch (bool) {
            case "Y":
                return true;
            case "N":
                return false;
            default:
                return this.isNext("您的输入有误,请重试!");
        }
    }

    private boolean selectCar () {

        int id = this.inputNum("请输入id进行选车:",1,this.cars.length);
        id--;
        Car selectedCar = this.cars[id];
        int num = this.inputNum("请输入数量:",0, 1000);
        boolean bool = this.isNext("您选择了“" + selectedCar.getName()+ "”" + num + "辆,共" + (selectedCar.getPrice()*num) + "RMB/天,添加到购物车吗?");
        if (bool) {
            this.addCar(id,num);
        }
        return this.isNext("是否继续选车?");
    }
    private void initCar () {
        cars = new Car[]{
            new Car("屌丝专用轻型皮卡1", 2, 5, 800),
            new Car("屌丝专用轻型皮卡2", 2, 3, 500),
            new Car("屌丝专用重型皮卡", 2, 10, 1200),
            new Car("屌丝专用小轿车A3", 5, 0, 500),
            new Car("屌丝专用面包车T8", 8, 0, 900),
            new Car("屌丝专用小型货车", 0, 5, 500),
            new Car("屌丝专用大型货车", 0, 12, 1000)
        };
        idArr = new int[this.cars.length];
    }
    private void outCar () {
        System.out.println("当前共有"+this.cars.length+"辆车");
        System.out.println("id\t车名\t\t\t\t座位数\t载货量(t)\t价格(RMB/天)");
        int id = 0;
        for (Car car1 : this.cars) {
            id++;
            System.out.println(id + "\t" +
                    car1.getName() + "\t" +
                    car1.getSite() + "\t\t" +
                    car1.getGoods() + "\t\t\t" +
                    car1.getPrice());
        }
    }

}

到这里呢,这个作业就算是做完了。如有不对的地方,欢迎各位大神指正

其实后来看了一下作业指导,老师说最好是使用三个类分别表示小轿车、货车和皮卡车,但是实在是太懒了,要改动的话应该需要改许多地方,最终还是没改

最后附上效果图
效果图
下载地址:戳我(密码:6506)

打开App,阅读手记
7人推荐
发表评论
随时随地看视频慕课网APP