需求:
完成一個和用戶互動的租車管理系統,當中包括基礎的增刪改查,以及輸出實時地熱度排行榜!
功能設計:
在工程的包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方法就不要運行它。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。