需求:

完成一个和用户互动的租车管理系统,当中包括基础的增删改查,以及输出实时地热度排行榜!

功能设计:

在工程的包com.Test02中,搭建4个类,分别是程序启动(carSysStart)、控制台(carConsole)、数据存储内存库(carData_base)、系统的功能类(carFunction)

具体代码如下:

1.程序启动

package com.Test02;

public class carSysStart {
	public static void main(String[] args) {
		carConsole p=new carConsole();
		p.setP(100);
		p.getP().initBaseinfo();
		p.getInfo();
	}
}
2.控制台
package com.Test02;
import java.util.Scanner;

public class carConsole {
	private Scanner cin=new Scanner(System.in);
	private carFunction p;
	private boolean isBase=false;
	
	public static void Prompt(){  //声明静态方法,之后其他类调用也不用先new
		System.out.println("欢 迎 使 用自助车辆 管 理 系统");
		System.out.println("-------------------------------------");
		System.out.println("1. 新 增 车辆");
		System.out.println("2. 查 询 车辆");
		System.out.println("3. 删 除  车辆");
		System.out.println("4. 借 出 车辆");
		System.out.println("5. 归 还 车辆");
		System.out.println("6. 排          行");
		System.out.println("7. 退         出 ");
		System.out.print("--------------------------------------\n");
	}

	public void setP(int maxSize) {
		if(maxSize>0){
			this.p=new carFunction(maxSize);
			this.isBase=true;
		}
		else{
			System.out.println("对不起,您要申请的内存规模有误!");
		}
	}
	
	public carFunction getP(){
		return p;
	}

	public void getInfo(){
		if(isBase){
			Prompt();
			boolean isStart=true;
			while(isStart){
				System.out.println("请选择:");
				int choice=cin.nextInt();
				switch(choice){
				case 1:
					System.out.println("请输入新增车辆的名称:");
					p.car_Add(cin.next());
					break;
				case 2:
					p.car_book_Find();
					break;
				case 3:
					System.out.println("请输入要删除车辆的名字:");
					p.car_Delete(cin.next());
					break;
				case 4:
					System.out.println("请输入要借出的车辆名称:");
					String name=cin.next();
					System.out.println("请输入借出的日期:");
					String date=cin.next();
					p.car_lend(name, date);
					break;
				case 5:
					System.out.println("请输入要归还的车辆:");
					String name1=cin.next();
					System.out.println("请输入归还的日期:");
					String date1=cin.next();
					p.car_return(name1, date1);
					break;
				case 6:
					p.car_print_Rank();
					break;
				case 7:
					isStart=p.exit();
					System.out.println("借车系统退出成功!欢迎您下次继续使用本系统!");
					break;
				default:
					System.out.println("输入有误,请重新输入!");
					Prompt();
					break;
				}
			}			
		}
		else
			System.out.println("对不起,目前该系统的数据库程序员小哥还在拼命打造中!详情请联系工作人员...");
	}
}
3.数据存储内存库
package com.Test02;

public class carData_base {
	
	String[] name;
	String[] date;
	boolean[] isLoan;
	long[] loanSize;
	
	public carData_base(int maxSize) {
		this.name =new String[maxSize];
		this.date =new String[maxSize];
		this.isLoan =new boolean[maxSize];
		this.loanSize =new long[maxSize];
	}
	
}
4.系统各功能类
package com.Test02;
import java.util.*;
//import java.text.ParseException;
import java.text.SimpleDateFormat;

public class carFunction {
	carData_base car;
	
	public carFunction(int m){
		car=new carData_base(m);
	}
	
	public void initBaseinfo(){
		car.name[0] = "陆巡";
		car.isLoan[0] = true;
		car.date[0] = "2017-7-1";
		car.loanSize[0] = 30;

		car.name[1] = "霸道";
		car.isLoan[1] = false;
		car.loanSize[1] = 30;

		car.name[2] = "汉兰达";
		car.isLoan[2] = false;
		car.loanSize[2] = 30;
	}
	
	public void returnMain(){
		Scanner cin =new Scanner(System.in);
		System.out.println("*********************");
		System.out.print("输入0返回:");
		if (cin.nextInt() == 0){
			carConsole.Prompt();
		} else {
			System.out.println("输入错误, 异常终止!");
			System.exit(0);
		}
	}
	
	/*
	 * 汽车系统的功能类
	 * 1.增加车辆信息
	 * 2.删除车辆信息
	 * 3.改动车辆信息(包括借出、归还)
	 * 4.查询车辆信息
	 * */
	public void car_Add(String name){
		for (int i = 0; i < car.name.length; i++) {
			if(car.name[i]==null){
				car.name[i]=name;
				car.date[i]=null;
				car.isLoan[i]=false;
				car.loanSize[i]=0;
				System.out.println("新增车辆"+"\""+name+"\""+"成功!");
				break;
			}
		}
		returnMain();
	}
	
	public void car_Delete(String name){
		
		//功能:删除目前在库中的所有名字与name相同的车辆信息
		//具体思路两个游标:i表示当前要操作(覆盖,查询)的下标,j表示之后可以往前移动的元素下标;  时间复杂度  ≈ O(n)
		
		boolean isYes=false,flag=false;
		for (int i = 0,j = 0; i < car.name.length; i++) {
			if(car.name[i]==null){
				break;
			}
			else if(isYes){
				if(car.isLoan[j] && name.equals(car.name[j])){
					System.out.println("\""+name+"\""+"处于借出状态,不能删除!正在查找其他符合要求的车辆...");
				}
				car.name[i]=null;
				car.date[i]=null;
				car.isLoan[i]=false;
				car.loanSize[i]=0;
			}
			else if(name.equals(car.name[i]) && !car.isLoan[i]){
				j=j==0?i+1:j+1;
				flag=true;
				while(j<car.name.length && car.name[j]!=null && name.equals(car.name[j]) && !car.isLoan[j])
					j++;
				if(j<car.name.length && car.name[j]!=null){
					car.name[i]=car.name[j];
					car.date[i]=car.date[j];
					car.loanSize[i]=car.loanSize[j];
					car.isLoan[i]=car.isLoan[j];
					System.out.println("删除"+"\""+name+"\""+"成功!");
				}
				else{
					isYes=true;
					i--;
				}
			}
			else if(car.isLoan[i] && name.equals(car.name[i])){
				System.out.println("\""+name+"\""+"处于借出状态,不能删除!正在查找其他符合要求的车辆...");
			}
		}
		if(!flag){
			System.out.println("库中没有您要删除的车辆信息!");
		}
		returnMain();
	}
	
	public void car_book_Find(){
		System.out.println("-----------> 查看---------->\n");
		System.out.println("序号\t状 态\t名称\t\t借出日期");
		for (int i = 0; i < car.name.length; i++) {
			if (car.name[i] == null) {
				break;
			} else if (car.isLoan[i] == true) {
				System.out.println((i + 1) + "\t已借出\t" + car.name[i] + "\t\t"
						+ car.date[i]);
			} else if (car.isLoan[i] == false) {
				System.out.println((i + 1) + "\t可 借\t" + car.name[i]);
			}
		}
		returnMain();
	}
	
	public void car_print_Rank(){
		String[] Name=new String[car.name.length];
		long[] loanSize=new long[car.name.length];
		int i;

		for (i = 0; i < car.name.length; i++) { //copyArray
			if(car.name[i]==null){
				break;
			}
			else{
				Name[i]=car.name[i];
				loanSize[i]=car.loanSize[i];
			}
		}
		
		System.out.println("名次\t\t名称\t\t热度");
		for (int j = 0,flag; j < i; j++) {  //选择排序+打印排行榜
			flag=j;
			for (int j2 = j+1; j2 < i; j2++) {
				if(loanSize[flag]<loanSize[j2]){
					flag=j2;
				}
			}
			if(flag!=j){ //swap
				String temps = Name[flag];
				long tempi = loanSize[flag];
				Name[flag] = Name[j];
				loanSize[flag] = loanSize[j];
				Name[j] = temps;
				loanSize[j] = tempi;
			}
			System.out.println((j+1)+"\t\t"+Name[j]+"\t\t"+loanSize[j]);
		}
		returnMain();
	}
	
	/*
	 * 借出和归还一些情况探讨
	 * 1.库中有多辆符合要求的车辆。
	 * 解决:默认借出第一辆符合要求的车
	 * 2.库中有多辆正在借出的同名车。(不知道还哪辆) 
	 * 解决:
	 * 1.用户输入的时候输入借车的日期。
	 * 2.默认归还第一辆找到的车。以下采用第二种
	 * */
	public void car_lend(String name,String date){
		boolean isYes=false,flag=false;
		for (int i = 0; i < car.name.length; i++) {
			if(car.name[i]==null){
				break;
			}
			else if(name.equals(car.name[i])){
				flag=true;
				if(car.isLoan[i]){
					System.out.println("对不起,"+"\""+name+"\""+"已外借,正在为您查询其他同类型车辆,请稍后...");
				}
				else{
					car.isLoan[i]=true;
					car.date[i]=date;
					isYes=true;
					System.out.println("恭喜您!"+"\""+name+"\""+"借出成功!");
					break;
				}
			}
		}
		if(!flag){
			System.out.println("对不起,库中尚未有"+"\""+name+"\""+"的信息!");
		}
		else if(!isYes){
			System.out.println("对不起,目前库中的所有"+"\""+name+"\""+"车辆都已外借!");
		}
		returnMain();
	}
	
	public void car_return(String name,String date){
		boolean isYes=false,flag=false;
		long Time=-1;
		for (int i = 0; i < car.name.length; i++) {
			if(car.name[i]==null){
				break;
			}
			else if(name.equals(car.name[i]) && car.isLoan[i]){
				isYes=true;
				flag=true;
				SimpleDateFormat sj=new SimpleDateFormat("yyyy-MM-dd");
				try{
					Date d1=sj.parse(car.date[i]);
					Date d2=sj.parse(date);
					Time=(d2.getTime()-d1.getTime())/(24*60*60*1000);
				}catch(Exception e){
					System.out.println("计算时间时发生异常");
				}finally{
					if(Time!=-1){
						System.out.println("您借出了"+Time+"天!");
						car.isLoan[i]=false;
						car.loanSize[i]+=Time;
						car.date[i]=null;
					}
				}
				break;
			}
			else if(name.equals(car.name[i]) && !car.isLoan[i]){
				isYes=true;
			}
		}
		if(isYes){
			if(!flag){
				System.out.println("本车库的所有"+"\""+name+"\""+"车辆均已归还,请您核对下输入的信息是否有误!");
			}
		}
		else{
			System.out.println("对不起,系统中尚未对"+"\""+name+"\""+"车辆的备案,请联系后台人员核实信息!");
		}
		returnMain();
	}
	
	public boolean exit(){
		return false;
	}
}

总结:

对于面向对象的学习在这两天有更近一步的学习,学会了封装类中的成员,其实就是将其权限设为私有,然后设置接口即声明一个对其操作的方法以及得到它的方法。在系统的编码中遇到以下几点问题需要改进自己:1.类似于C/C++中的结构体排序的内容,Java也有sort的自定义排序compare的方法,本来思路是想直接用集合的sort类排序,奈何不会用这个compare,就调转船头改用选择排序了,日后还是要把这块内容掌握的;2.时间的计算Java中也有对应的DATE类,不过自己只是粗略学了计算两个日期的差的运算(用声明的格式将string转为Date,然后利用getTime计算1970年1月1号到所设日期的差值,注意的点是单位是毫秒,要得到天数还要进行单位转化,并且返回的类型是long);3.Java中有try..catch..finally..捕捉异常,这点是之前没学过的,在转化时间的时候为了防止异常终止程序,将其放在try中执行!4.还有一个类中如果没有main方法就不要运行它。