《Java从入门到放弃》JavaSE篇:综合练习——单身狗租赁系统(数

因为现在只学习了基本语法,所以在综合练习之前,先补充关于方法概念。

方法的作用:把一系列的代码放在一起,然后再取个别名。之后通过这个别名的调用,就相当于执行了这一系列的代码。

方法的语法:([]中的内容表示是可选的)

public返回值类型方法名(参数类型参数名[,参数类型参数2...]){//代码块//[return数据];}

方法的例子:

publicstaticvoidmain(String[]args){loop();//调用方法loop();//再次调用}/***方法功能:计算从1到20的和*static:表示静态,这个关键字在后面讲面向对象时来解释*void:表示没有返回值*/publicstaticvoidloop(){intnum=20;intsum=0;for(inti=1;i<=num;i++){sum+=i;}System.out.println("结果为:"+sum);}

方法就讲到这儿吧,下面开始今天的内容。

========================永远的分割线君========================

单身狗租赁系统功能分析:

因为还没有学习面向对象,所以我们所有的代码都写在单独的一个类文件中,然后再在main中调用。现阶段只需要知道这个语法,不用管概念。

第一步:搭建项目架构

创建SingleDogManager类,里面包含单身狗的数组和所有的功能方法:

publicclassSingleDogManager{//保存单身狗信息String[]id=newString[100];//编号String[]nickname=newString[100];//昵称int[]gender=newint[100];//性别:0.女1.男int[]state=newint[100];//状态:0.未借出1.已借出Date[]date=newDate[100];//借出日期:Date是日期类型(格式:'2017-03-1108:34:21')//显示主菜单publicvoidmainMenu(){}//查看publicvoidshow(){}//新增publicvoidadd(){}//删除publicvoiddelete(){}//借出publicvoidloan(){}//归还publicvoidrepay(){}}

第二步:编写主菜单功能

主菜单当然就是主要显示菜单用滴,在主菜单上选择功能可以调用对应的方法,在对应方法中应该可以返回主菜单。分析发现,在查看、新增、删除等方法中,执行完后都需要让用户返回主菜单,所以我们把返回主菜单再单独写一个方法。

publicclassSingleDogManager{//保存单身狗信息String[]id=newString[100];//编号String[]nickname=newString[100];//昵称int[]gender=newint[100];//性别:0.女1.男int[]state=newint[100];//状态:0.未借出1.已借出Date[]date=newDate[100];//借出日期:Date是日期类型(格式:'2017-03-1108:34:21')//因为在很多方法中都需要使用输入对象,所以定义到最外面,那么在每个方法中都可以使用了Scannerinput=newScanner(System.in);//显示主菜单publicvoidmainMenu(){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("======================");//注意,如果用户输入了1~6之外的数字,需要让他重新输入(还没学习异常,不考虑异常的情况)intnum=6;do{System.out.print("请选择:");num=input.nextInt();switch(num){case1:show();break;case2:add();break;case3:delete();break;case4:loan();break;case5:repay();break;case6:System.out.println("客官,下次再来玩哟~!");break;default:System.out.println("输入的啥玩意啊,我只认识1,2,3,4,5,6!!!");break;}}while(num>6||num<1);}//查看publicvoidshow(){System.out.println("======================");System.out.println("====>查看");System.out.println();goMainMenu();}//新增publicvoidadd(){System.out.println("======================");System.out.println("====>添加");System.out.println();goMainMenu();}//删除publicvoiddelete(){System.out.println("======================");System.out.println("====>删除");System.out.println();goMainMenu();}//借出publicvoidloan(){System.out.println("======================");System.out.println("====>借出");System.out.println();goMainMenu();}//归还publicvoidrepay(){System.out.println("======================");System.out.println("====>归还");System.out.println();goMainMenu();}//返回主菜单publicvoidgoMainMenu(){System.out.print("按任意键后回车返回主菜单:");Stringin=input.next();mainMenu();}}

在main中编写如下代码就可以测试运行效果了:

publicstaticvoidmain(String[]args){//创建一个管理对象SingleDogManagersdm=newSingleDogManager();//调用管理对象的主菜单方法sdm.mainMenu();}

结果:

经测试,项目框架已经搭建OK了。接下来就是一个一个实现功能了,一般软件在运行时都会有个初始化过程,我们这个项目可以在运行的时候就初始化一些单身狗信息(一个店开业时,总要有商品可以租售吧 – -)。所以可以再添加一个初始化方法。

//初始化信息publicvoidinit(){//第一只id[0]="3366";nickname[0]="旺财";gender[0]=1;state[0]=0;date[0]=null;//未借出时借出日期为空值//第二只id[1]="5142";nickname[1]="黑寡妇";gender[1]=0;state[1]=1;//Date(年,月,日),年是在1900年的基础上加,月的范围0-11,天的范围1-31date[1]=newDate(117,7,25);//第三只id[2]="9527";nickname[2]="小强";gender[2]=0;state[2]=0;date[2]=null;}

main方法修改,在调用主菜单之前,先初始化数据。

publicstaticvoidmain(String[]args){SingleDogManagersdm=newSingleDogManager();sdm.init();//初始化sdm.mainMenu();//执行主菜单方法}

第三步:编写查看功能

因为日期类型默认显示效果是“Wed Aug 30 10:37:43 CST 2017”这样滴,所以单独写个方法用来进行日期类型的输出

//查看publicvoidshow(){System.out.println("======================");System.out.println("====>查看");System.out.println();//查看时注意不要把数组中的空元素进行输出了System.out.println("编号\t昵称\t性别\t状态\t借出日期");System.out.println("===========================================");for(inti=0;i<id.length;i++){if(id[i]!=null){System.out.println(id[i]+"\t"+nickname[i]+"\t"+(gender[i]==0?"女":"男")+"\t"+(state[i]==0?"未借出":"已借出\t"+toDate(date[i])));}}System.out.println("===========================================");goMainMenu();}/***因为日期类型默认显示效果是“WedAug3010:37:43CST2017”这样滴*所以单独写个方法用来进行日期类型的输出*private表示该方法只能当前这个类的内部使用,具体作用后面会详细讲*@param输入日期类型的数据*@return返回'xxxx-xx-xx'格式的日期*/privateStringtoDate(Dated){SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd");returnsdf.format(d);}

注意:

在循环遍历数组元素时,记得把null元素过滤掉。

运行效果:

第四步:新增功能

新增数据两个要点:1.找到第一个空的位置,2.新增的数据肯定是未借出的,所以只需要输入昵称和性别即可(编号自动生成4位数)。

//新增publicvoidadd(){System.out.println("======================");System.out.println("====>添加");System.out.println();for(inti=0;i<id.length;i++){//找到第一个空的位置if(id[i]==null){id[i]=newID();//自动生成新编号System.out.print("请输入昵称:");nickname[i]=input.next();System.out.print("请选择性别(0.女|1.男):");gender[i]=input.nextInt();state[i]=0;//状态默认为0//添加完后记得退出循环break;}}System.out.println("添加完毕!");goMainMenu();}//生成新编号(不重复)privateStringnewID(){intnum=0;//保存随机生成的数字Stringno;//保存数字的字符串格式booleanbl;//是否需要重新生成//因为不知道要生成多少次,所以使用do...while循环do{bl=false;//默认不用重新生成Randomrandom=newRandom();//随机数生成对象num=random.nextInt(10000);//表示随机得到一个小于10000的整数no=String.format("%04d",num);//转换成字符串,如果不够4位,前面补0//判断是否与数组中的元素重复for(inti=0;i<id.length;i++){if(no.equals(id[i])){bl=true;//数据重复了,需要重新生成break;}}}while(bl);returnno;}

运行效果:

第五步:删除

删除时需要注意:1.已出租的不能删除,2.找不到的必须提示不存在

//删除publicvoiddelete(){System.out.println("======================");System.out.println("====>删除");System.out.println();System.out.print("请输入编号:");Stringno=input.next();inti;for(i=0;i<id.length;i++){if(id[i]!=null&&no.equals(id[i])){//要注意,已租出去的单身狗是不能删除的,必须归还后才能删除if(state[i]==1){System.out.println("该单身狗已租出还未归还,不能删除!");break;}//因为是通过编号来判断数据是否存在,所以只需要把id清空即可id[i]=null;//把字符串数组中对应的数据变成null就相当于删除了System.out.println("删除成功!");break;}}//如果循环完了都没找到这个编号的单身狗,则说明它不存在if(i==id.length){System.out.println("查无此狗!");}goMainMenu();}

运行效果:

已借出和不存在的数据,各位看官可以自己试试哈。

第六步:借出

出租的话,肯定是能让用户选择的,所以我们先显示出所有的单身狗,然后再让用户输入编号再借出。要注意:已借出的不能再次借出。按道理应该只显示出所有未出租的,这段代码和前面的查看非常类似,很多新手在这儿就会把前面的代码Copy过来再改改就继续用了。

但是!!!!!

我们可以使用重构代码的方式,把可以重复使用的代码单独放到一个方法用反复调用,千万不要改相似度太高的重复代码!!!!

============================================================

重构操作步骤:

1.选中你打算复制了去改的这一段代码,然后点右键,再根据图选择对应选项。

2.给方法取名

3.因为该方法需要按不同的需求显示不同的数据,所以加一个参数用来决定如果显示数据,同时修改一下代码

/***因为现在有两种情况,一种是显示所有,一种是显示所有未借出的*可惜我们还没有学习枚举类型,这儿就简单处理一下,加个整型参数*@paramdogState-1表示查询所有,0表示查询未借出*/privatevoidshowDog(intdogState){//查看时注意不要把数组中的空元素进行输出了System.out.println("编号\t昵称\t性别\t状态\t借出日期");System.out.println("===========================================");for(inti=0;i<id.length;i++){if(id[i]!=null){if(dogState==-1){System.out.println(id[i]+"\t"+nickname[i]+"\t"+(gender[i]==0?"女":"男")+"\t"+(state[i]==0?"未借出":"已借出\t"+toDate(date[i])));}elseif(state[i]==0){System.out.println(id[i]+"\t"+nickname[i]+"\t"+(gender[i]==0?"女":"男")+"\t未借出");}}}System.out.println("===========================================");}}

4. 修改查看方法中的代码,给方法传值-1

//查看publicvoidshow(){System.out.println("======================");System.out.println("====>查看");System.out.println();showDog(-1);//传值-1表示查询所有goMainMenu();}

============================================================

OK,我们继续完成借出的代码:

//借出publicvoidloan(){System.out.println("======================");System.out.println("====>借出");System.out.println();showDog(0);//显示所有未借出的单身狗System.out.print("请输入编号");Stringno=input.next();inti;for(i=0;i<id.length;i++){if(id[i]!=null&&no.equals(id[i])){//要注意,已租出去的单身狗是不能再次出租if(state[i]==1){System.out.println("该单身狗已租出!");break;}state[i]=1;//将状态改为1(已借出)date[i]=newDate();//将借出日期设置为当前日期System.out.println("借出完毕!");break;}}//如果循环完了都没找到这个编号的单身狗,则说明它不存在if(i==id.length){System.out.println("查无此狗!");}goMainMenu();}

运行效果:

第七步:归还

因为是给广大单身狗或单身猿们,所以我们都是免费出租(其实是懒,因为要计算租金又要多写好些代码 – -),哈哈哈!!!

归还和借出是刚好相反的操作,所以我们可以再次修改showDog的代码,让他可以传值1进去显示所有已借出的Dog。另外,因为和借出的功能非常类似,所以同样可以把借出中的相同代码重构成方法,然后再调用。

1.修改showDog()方法中的代码,再加上else部分,因为这儿只有三种状态,所以可以这样写,如果状态更多的话,那代码还可以优化:

if(dogState==-1){System.out.println(id[i]+"\t"+nickname[i]+"\t"+(gender[i]==0?"女":"男")+"\t"+(state[i]==0?"未借出":"已借出\t"+toDate(date[i])));}elseif(dogState==0&&state[i]==0){System.out.println(id[i]+"\t"+nickname[i]+"\t"+(gender[i]==0?"女":"男")+"\t未借出");}elseif(dogState==1&&state[i]==1){System.out.println(id[i]+"\t"+nickname[i]+"\t"+(gender[i]==0?"女":"男")+"\t已借出\t"+toDate(date[i]));}

2.重构借出的代码

/***根据不同的操作,改变Dog的状态*@paramdogState要改变的状态0.归还1.借出*/privatevoidchangeDogState(intdogState){System.out.print("请输入编号");Stringno=input.next();inti;for(i=0;i<id.length;i++){if(id[i]!=null&&no.equals(id[i])){if(dogState==1){//要注意,已租出去的单身狗是不能再次出租if(state[i]==1){System.out.println("该单身狗已租出!");break;}state[i]=1;//将状态改为1(已借出)date[i]=newDate();//将借出日期设置为当前日期System.out.println("借出完毕!");}else{//要注意,未租出的Dog是不能归还的if(state[i]==0){System.out.println("该单身狗未出租,不能归还!");break;}state[i]=0;//将状态改为0(未借出)date[i]=null;//将借出日期设置为空值System.out.println("归还完毕!");}break;}}//如果循环完了都没找到这个编号的单身狗,则说明它不存在if(i==id.length){System.out.println("查无此狗!");}}

3.借出和归还的代码:

//借出publicvoidloan(){System.out.println("======================");System.out.println("====>借出");System.out.println();showDog(0);//显示所有未借出的单身狗changeDogState(1);goMainMenu();}//归还publicvoidrepay(){System.out.println("======================");System.out.println("====>归还");System.out.println();showDog(1);//显示所有已借出的DogchangeDogState(0);//归还后状态改为0goMainMenu();}

运行效果:

OK,一个最精简版本的《单身狗租赁系统》到此就告一段落了,建议各位新手看官先自己尝试着实现,如果碰到问题了,再参考上面的代码(上面代码只是面向初学者,所有很多地方是不够严谨的,特此声明)。文章下面有参考源码。

如果有已经完成的看客,可以再尝试加些功能上去,比如计算租金,修改某个Dog的信息等。

“软件思维”博客地址:51CTO,博客园,感兴趣的小伙伴可以去看相关的其它博文。

有的旅行是为了拓宽眼界,浏览风景名胜。

《Java从入门到放弃》JavaSE篇:综合练习——单身狗租赁系统(数

相关文章:

你感兴趣的文章:

标签云: