Java实现租车管理系统

时间:2022-09-22 22:02:19

需求:

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

功能设计:

在工程的包com.test02中,搭建4个类,分别是程序启动(carsysstart)、控制台(carconsole)、数据存储内存库(cardata_base)、系统的功能类(carfunction)

具体代码如下:

1.程序启动

?
1
2
3
4
5
6
7
8
9
10
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.控制台

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
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.数据存储内存库

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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.系统各功能类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
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方法就不要运行它。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/calculate23/article/details/80113890