之前的文章尝试修改为1.1版,一直说我没有修改权限。很奇怪,程序明明是我自己写的也是我自己发布的。不管怎样,之前的程序有一些小瑕疵,主要在泛型的使用与Scanner的定义位置等。本次更新1.1版主程序。
package com.imooc;
/* 答答租车系统稳定版 v1.1 by Bambrow
* 该系统读取用户输入的一切内容,并给出相应提示,确保用户输入的内容准确。
* 对用户输入字符串或其他数据类型的情况,有相应的报错及提示重新输入的功能。
* 可让用户选择一次性租用多种车辆,并对每一车辆设置单独的租车数目与租车天数。
* 可修改代码的initCarList方法,任意添加新车辆,无需修改其他任何代码。
* 作者会继续进行维护和改进,可能以后会增加管理员系统。
* 可任意参考,转载请注明作者或保留该注释。
*/
// 导入包
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.stream.IntStream;
public class Demo {
private static Scanner input = new Scanner(System.in);
public static void main(String[] args) {
System.out.println("欢迎来到答答租车系统!");
List<Car> carList = initCarList(); // 为了保证随时添加与删除项目,使用List功能
for( ; ; ) { // 设置无条件循环
System.out.println("若您是租车客户,请输入1;"
+ "退出请输入0。");
int choice;
try{
choice = Integer.parseInt(getInput());
}catch(Exception e){
System.out.println("指令有误!请输入正确的指令。");
continue;
} // 确保输入的为数字,而不是别的字符
if(choice == 0) break; // 若输入0,结束循环
else if(choice == 1) {
rentCars(carList); // 若输入1,开始租车
System.out.println();
}
else{
System.out.println("指令有误!请输入正确的指令。");
continue;
} // 若输入其他数字,重新开始循环
}
System.out.println("感谢您使用答答租车系统!");
}
// 生成初始化的可租车列表
private static List<Car> initCarList() {
List<Car> carList = new ArrayList<Car>(); // 初始化List,确保每一项都是Car类
carList.add(new CarBus("小型客车", 500, 6));
carList.add(new CarBus("大型客车", 1000, 15));
carList.add(new CarTruck("小型货车", 400, 2));
carList.add(new CarTruck("大型货车", 800, 10));
carList.add(new CarPickup("小型皮卡", 500, 2, 1));
carList.add(new CarPickup("大型皮卡", 900, 4, 2));
return carList; // 添加完每一辆车后返回List
} // 可以随时使用carList.add添加新车辆,而无需修改其他任何代码
// 输出租车列表,用到了每一类中重写的toString方法
private static void printCarList(List<Car> carList) {
System.out.println("以下是可用车型:");
System.out.println("序号\t车型\t租金\t载客量\t载货量");
for(int i = 0; i < carList.size(); i++) {
System.out.println((i + 1) + "\t" + (carList.get(i)).toString());
}
}
// 客户选车功能,该功能无需用户提前输入租车的类型数目,因此全部使用无需预先确定长度的List功能
private static List<Car> selectCars(List<Car> carList) {
List<Integer> rentArray = new ArrayList<Integer>(); // 储存客户选过的序号
List<Car> selectCars = new ArrayList<Car>(); // 储存用户选过的车
System.out.println("请输入租车序号,以回车分隔。输入0结束输入:");
for( ; ; ) {
System.out.println("请输入车辆序号(1-" + carList.size() + "):");
boolean repeated = false;
int carNum;
try{
carNum = Integer.parseInt(getInput());
}catch(Exception e){
System.out.println("输入不正确!请输入正确的序号。");
continue;
} // 确保输入的为数字,而不是其他字符
if(carNum == 0) break; // 输入0,退出循环
else if(carNum > 0 && carNum <= carList.size()) { // 确保输入的数字在范围内
for(int i = 0; i < rentArray.size(); i++){
if(carNum == rentArray.get(i)) {
System.out.println("您已输入过该车型!请重新输入序号。");
repeated = true;
break; // 若输入的序号已经选择过,则输出选择重复信息并重新选择
}
}
if(!repeated) {
rentArray.add(carNum);
selectCars.add((Car) carList.get(carNum - 1));
} // 若输入的序号不重复,则加入选择的车辆列表
}
else{
System.out.println("输入不正确!请输入正确的序号。");
continue;
} // 确保输入的数字在范围内
}
return selectCars; // 返回选好的车辆List
}
// 读取租车数目功能
private static int rentCount() {
for( ; ; ) {
System.out.println("请输入租车数(1-50):");
int rentCount;
try{
rentCount = Integer.parseInt(getInput());
}catch(Exception e){
System.out.println("输入不正确!请输入正确的租车数。");
continue;
} // 确保输入的为数字,而不是其他字符
if(rentCount >= 1 && rentCount <= 50) return rentCount; // 输入正确
else System.out.println("输入不正确!请输入正确的租车数。"); // 输入不正确
}
}
// 对每一种选好的车辆,读取相应的租车数目
private static int[] rentNumArray(List<Car> carList) {
int[] rentNumArray = new int[carList.size()]; // 使用数组存储每一种车辆的数目
for(int i = 0; i < carList.size(); i++) {
System.out.println("请输入选定列表里,第" + (i+1) + "辆车的租车数量:");
rentNumArray[i] = rentCount(); // 调用读取租车数目方法
}
return rentNumArray; // 返回租车数目数组
}
// 读取租车天数功能
private static int rentDays() {
for( ; ; ) {
System.out.println("请输入租车天数(1-365):");
int rentDays;
try{
rentDays = Integer.parseInt(getInput());
}catch(Exception e){
System.out.println("输入不正确!请输入正确的租车天数。");
continue;
} // 确保输入的为数字,而不是其他字符
if(rentDays >= 1 && rentDays <= 365) return rentDays; // 输入正确
else System.out.println("输入不正确!请输入正确的租车天数。"); // 输入不正确
}
}
// 对每一种选好的车辆,读取相应的租车天数
private static int[] rentDayArray(List<Car> carList) {
int[] rentDayArray = new int[carList.size()]; // 使用数组存储每一种车辆的天数
for(int i = 0; i < carList.size(); i++) {
System.out.println("请输入选定列表里,第" + (i+1) + "辆车的租车天数:");
rentDayArray[i] = rentDays(); // 调用读取租车天数方法
}
return rentDayArray; // 返回租车天数数组
}
// 打印订单
private static void printOrder(List<Car> carList,
int[] rentNumArray, int[] rentDayArray) {
int[] rentSinglePriceTotal = new int[carList.size()];
int[] rentSinglePassTotal = new int[carList.size()];
int[] rentSingleCargoTotal = new int[carList.size()];
// 三个数组分别存储总价、总载客量与总载货量
System.out.println("以下是您的订单:");
System.out.println("序号\t车型\t租金\t载客量\t载货量"
+ "\t租用数量\t租用天数\t消费数额");
for(int i = 0; i < carList.size(); i++) {
rentSinglePriceTotal[i] = ((Car) carList.get(i)).getPrice()
* rentNumArray[i] * rentDayArray[i]; // 计算每一种车的总价
System.out.println((i + 1) + "\t" + (carList.get(i)).toString()
+ "\t" + rentNumArray[i] + "\t" + rentDayArray[i]
+ "\t" + rentSinglePriceTotal[i]);
try{
rentSinglePassTotal[i] =
((CarBus) carList.get(i)).getPassCapacity()
* rentNumArray[i];
}catch(Exception eCarBus){
try{
rentSinglePassTotal[i] =
((CarPickup) carList.get(i)).getPassCapacity()
* rentNumArray[i];
}catch(Exception eCarPickup){
rentSinglePassTotal[i] = 0;
}
} // 双重try嵌套,如果车辆有载客功能,则存储一天的总载客量,否则存储0
try{
rentSingleCargoTotal[i] =
((CarTruck) carList.get(i)).getCargoCapacity()
* rentNumArray[i];
}catch(Exception eCarTruck){
try{
rentSingleCargoTotal[i] =
((CarPickup) carList.get(i)).getCargoCapacity()
* rentNumArray[i];
}catch(Exception eCarPickup){
rentSingleCargoTotal[i] = 0;
}
} // 双重try嵌套,如果车辆有载货功能,则存储一天的总载货量,否则存储0
}
int rentTotal = IntStream.of(rentSinglePriceTotal).sum();
int passCapacityTotal = IntStream.of(rentSinglePassTotal).sum();
int cargoCapacityTotal = IntStream.of(rentSingleCargoTotal).sum();
// 将三个数组的值分别相加求和
System.out.println("总载客量(人/天):" + passCapacityTotal);
System.out.println("总载货量(人/天):" + cargoCapacityTotal);
System.out.println("订单总价(元):" + rentTotal); // 所有车的订单总价
}
// 读取用户输入方法
private static String getInput() {
try{
return input.next();
}catch (Exception e){
return null; // 确保用户输入了内容
}finally{
input.nextLine(); // 防止下次调用时出现读取错误
}
}
// 开始租车
private static void rentCars(List<Car> carList) {
printCarList(carList); // 打印现有的车辆列表
List<Car> selectCars = selectCars(carList); // 用户开始选车
System.out.println("这是您选定的租车列表:");
printCarList(selectCars); // 打印选定的车辆列表
int[] rentNumArray = rentNumArray(selectCars); // 用户对每一种车输入租车数量
int[] rentDayArray = rentDayArray(selectCars); // 用户对每一种车输入租车天数
printOrder(selectCars, rentNumArray, rentDayArray); // 打印最终订单
}
}
热门评论
兄弟 为什么我到最后租车天数输出内存地址,帮我看看呗
https://github.com/SuperHeroBats/zucheDemo
不错,如果把界面流程控制再美化一下就更好了。
用了list 还没学看不懂T T