需求:
完成一个和用户互动的租车管理系统,当中包括基础的增删改查,以及输出实时地热度排行榜!
功能设计:
在工程的包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