小码哥杯java程序比赛复习(五)阶段综合练习

综合练习

一.项目背景介绍

   根据前面所学习的知识,编写一个控制台版的"嗒嗒租车系统"

   功能:

   1.展示所有可租车辆

   2.选择车型,租车量

   3.展示租车清单,包含:总金额,总载货量及其车型,总载人量及其车型

二.项目分析

   1.数据模型分析

   2.业务模型分析

   3.显示和流程分析

三.模块介绍

数据模型分析:

   1.通过对现实世界的事与物主要特征的分析,抽象,为信息系统的实施提供数据存取的数据结构以及相应的约束。

   2.数据结构组成:操作(方法),属性

   在这里,我们把车分为三种:只会载货的卡车,只好载人的汽车.既会载客又会载人。对于载客的,我们要去关注载客量;对于载货的,我们要去关注载货量;具备载客的和载货的,那么载客量和载货量我们都要去关注。那么我们如何用面向对象的思想来解决这个问题呢?

   在这里我们把载货量的车型简单的分为两种,一种是轻型:为5t以下的载货量;一种是重型:为2t-20t的载货量;载客的车型简单的也分为两种,一种是小客车:为5人以下的乘坐;一种是大客车:为10人以上的乘坐;既能载客和载货的汽车就同时有这两种属性。那么在这里我们如何利用面向对象的思想,把这些信息抽象出来,转换为我们的类呢?

业务模型分析

   1.设计应用程序之前,应该明确该应用程序必须执行哪些任务。

     租车用户:如何租车,如何选择车,租车天数,统计金额,载客载货量

   在前面的数据模型做完,车的数据类型就有了,那么现在的问题是:如何把用户所做的操作和车关系到一起呢?

   选车:把车的信息都遍历一遍,就可以加判断条件,通过让用户输入数字的方法来选车;

显示和流程分析

  1.显示:用户可以看到的信息提示界面;

  2.流程:显示信息的执行过程和步骤;

  3.嗒嗒租车系统中,要以命令行的方式显示提示信息和输出结果信息,要考虑其样式,用户输入的数据不同,信息该如何提示,如何处理并显示出结果,这部分知识囊括了显示与流程的内容。

  例:请选择车辆->请输入序号->输出总金额...

  程序实现,在这里实现时,楼主用了List集合,且看下面的程序代码:

package Dada;
//关于车的种类的父类,实现了很好的封装
public class Car {
	private String carName;   //车名
	protected double price;   //price后面子类会给予继承,所以用protected类型来表示
	public Car(String carName,double price){//父类的构造方法,用于对车名和租金进行初始化
		this.carName = carName;
		this.price = price;
	}
    //对父类中的属性设置setter,getter方法以及toString方法
	public String getCarName() {
		return carName;
	}
	public void setCarName(String carName) {
		this.carName = carName;
	}
	public double getPrice() {
		return price;
	}
	public void setPrice(double price) {
		this.price = price;
	}
	@Override
	public String toString() {
		return "Car [carName=" + carName + ", price=" + price + "]";
	}
}

package Dada;
//卡车类,继承父类中的属性和方法
public class TrunkCar extends Car{
	private double deadWeight;  //卡车类特有的属性载重量
	public TrunkCar(String carName,double price){ //卡车类的第一个构造方法
		super(carName,price);
	}
	
	public TrunkCar(String carName,double deadWeight,double price){//卡车类的第二个构造方法
		super(carName,price);
		this.deadWeight = deadWeight;
	}
	
	//在卡车类中设置setter和getter以及toString方法
	public double getDeadWeight() {
		return deadWeight;
	}

	public void setDeadWeight(double deadWeight) {
		this.deadWeight = deadWeight;
	}

	@Override
	public String toString() {
		return "卡车[载重=" + deadWeight +"   日租金(元): "+price +"]";
	}
	
}

package Dada;
//皮卡车类,继承父类cars
public class PickUpCar extends Car{
	private int busLoad; //皮卡车中特有的属性载重量和载客量
	private double deadWeight;
	public PickUpCar(String carName,double price){//皮卡车的第一个构造方法
		super(carName,price);
	}
	public PickUpCar(String carName,int busLoad,double deadWeight,double price){
		super(carName,price);
		this.busLoad = busLoad;
		this.deadWeight = deadWeight;
	}
	//为皮卡车的属性设置getter和setter方法以及toString方法
	public int getBusLoad() {
		return busLoad;
	}
	public void setBusLoad(int busLoad) {
		this.busLoad = busLoad;
	}
	public double getDeadWeight() {
		return deadWeight;
	}
	public void setDeadWeight(double deadWeight) {
		this.deadWeight = deadWeight;
	}
	@Override
	public String toString() {
		return "皮卡 [载人量=" + busLoad + ", 载重量=" + deadWeight
				+"   日租金(元): "+price + "]";
	}
	   
}

package Dada;
//和上面两个类同理,其特殊的属性为载人量
public class BusCar extends Car{
	private int busLoad;
	
	public BusCar(String carName,double price){
		super(carName,price);
	}
	
	public BusCar(String carName,int busLoad,double price){
		super(carName,price);
		this.busLoad = busLoad;
	}

	public int getBusLoad() {
		return busLoad;
	}

	public void setBusLoad(int busLoad) {
		this.busLoad = busLoad;
	}

	@Override
	public String toString() {
		return "客车 [载人量=" + busLoad +"   日租金(元): "+price +"]";
	}
	
}

package Dada;

import java.util.HashSet;
import java.util.Scanner;

public class DaDaRent {
	private static Scanner sn = new Scanner(System.in);
	//主方法
	public static void main(String[] args) {
		System.out.println("欢迎来到嗒嗒租车系统!");
		boolean quit =false;
		while(!quit){//如果quit不为真;while(x)表示的是,如果x为true,则继续执行
			System.out.println("租车请输入数字'1',退出系统请输入数字'0'");
			
			switch(inputCommand()){
			case 0:
				quit =true;
				break;
			case 1:
				rentCars();
				break;
			default:
				System.out.println("命令输入错误!请根据提示输入命令值!");
				break;
			}
		}
		
		sn.close(); //因为Scanner也是一种输入流,在用完后需要对其进行关闭
		System.out.println("退出系统~");
	}
									
	private static void rentCars(){
		//可选车型初始化
		Car[] carList = initCarList();
		//打印可选车型信息
		printCarList(carList);
		//输入租车数量
		int rentCount = setRentCount();
		//选择具体车型
		Car[] selectCars = selectCars(carList,rentCount);
		//输入租车天数
		int days = sentRentDays();
		//打印账单
		printBill(selectCars,days);
	}
	/*将可选择的车型进行初始化,这里使用类数组的方式
	 * 这里应用到了多态->即用编译的对象指向了初始化的对象
	 * 在这里应用的是每个子类特有的构造方法进行初始化
	 */
	private static Car[] initCarList(){
		Car[] carList = new Car[5];
		carList[0] = new TrunkCar("轻型货车",5,500);
		carList[1] = new TrunkCar("重型货车",10,800);
		carList[2] = new BusCar("小汽车",4,400);
		carList[3] = new BusCar("大客车",20,1500);
		carList[4] = new PickUpCar("皮卡",4,8,1000);
		return carList;
	}
	
	private static void printCarList(Car[] carList){
		System.out.println("可选车型一览表:");
		System.out.println("编号\t车型\t日租金(元)\t载客量(人)\t载重量(顿)");
		for(int i=0;i<carList.length;i++){
			//这里对每个子类的信息的toString方法进行输出
			System.out.println((i+1)+"\t"+carList[i].toString());
		}
	}
	private static int setRentCount(){
		int rentCount = 0;
		do{
			System.out.println("请输入租车的数量(1-100):");
			rentCount = inputCommand();
		}while(!(rentCount>0&&rentCount<=100));
		//当carNo>0且carNo<=carList.length为假时,执行循环体
		return rentCount;
	}
	
	private static Car[] selectCars(Car[] carList,int rentCount){
		System.out.println("请输入每辆车的编号:");
		Car[] selectCars = new Car[rentCount];
		int carNo = 0;
		for(int i=0;i<rentCount;i++){
			do{
				System.out.println("第"+(i+1)+"辆车的编号(1-"+carList.length+"):");
				carNo = inputCommand();
			}while(!(carNo>0&&carNo<=carList.length));
		//当carNo>0且carNo<=carList.length为假时,执行循环体
			selectCars[i] = carList[carNo-1];
		}
		return selectCars;
	}
	
	public static int sentRentDays(){
		int days = 0;
		do{
			System.out.println("请输入租车的天数(1-365):");
			days = inputCommand();
		}while(!(days>0 && days<=365));
		return days;
	}
	
	private static void printBill(Car[] selectCars,int days){
		System.out.println("账单:---------");
		System.out.println("租用车辆数量:"+selectCars.length);
		System.out.println("租用天数:"+days);
		
		//计算选择车辆的总载客数,载重量,总租用金额,车型名称
		HashSet<String> carNames = new HashSet<String>();
		int sumBusLoad = 0;//总载客量
		double sumDeadWeight = 0;//总载重量
		double sumPrice = 0;//总租金
		
		for(Car car:selectCars){//foreach遍历selectCars中的对象,将其访问的对象赋值给car 
			carNames.add(car.getCarName());
			sumPrice +=car.getPrice();
			if(car instanceof BusCar)//如果car是 buscar的父类对象,那么进行强制转换,因为得到载重量和得到载人数的方法都在各自的类中!
				sumBusLoad +=((BusCar)car).getBusLoad();
			if(car instanceof TrunkCar)
				sumDeadWeight +=((TrunkCar)car).getDeadWeight();
			if(car instanceof PickUpCar){
				sumBusLoad +=((PickUpCar)car).getBusLoad();
				sumDeadWeight += ((PickUpCar)car).getDeadWeight();
			}
		}
		System.out.println("总载客数(人):"+sumBusLoad);
		System.out.println("总载重量(吨):"+sumDeadWeight);
		System.out.println("总租用金额(元):"+sumPrice*days);
		System.out.println("租用车辆型号:"+carNames.toString());
		System.out.println("------------------------");
	}
	/*定义输入的方法:这里用了异常捕获方法,之所以要用这样的方法,
	     是为了防止输入时对其输入字母而与前面设定的int型变量不合导致报错,
	    使用捕获机制很好的避免了这样一种情况
	*/
	private static int inputCommand(){
		try{
		return sn.nextInt();
		}catch(Exception e){
			sn = new Scanner(System.in);
			return -1;
		}
	}
	
}

       自感觉基本功能都已经实现,欢迎拍砖~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

精神抖擞王大鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值