JAVA编程练习(二)
今天我为了巩固之前的java基础知识的学习,再次进行实战演习,编写了一个小小的java控制台程序,主要是运用java面向对象的思想来完成这个小项目。
一、项目背景介绍
根据所学知识,编写一个控制台板的"答答租车系统"
功能:
1.展示所有可租车辆
2.可以选择车型和租车量
3.展示租车清单,包含:总金额、总载货量及其车型、总人量及车型
二、项目分析
(1)数据模型分析
1、通过对现实世界的事与物主要特征的分析、抽象,为信息系统的实施提供数据存取的数据结构以及相应的约束。
2、这个数据结构组成:操作(方法)、属性
在这个答答租车系统中呢,车可以分为三大类,客车(载客量)、货车(载货量)、皮卡(载客量、载货量),如下图所示:
由于皮卡既有载客量又有载货量,这个类型与另外两种车型都不一样,那么我们该如何解决这个问题呢?
我通过创建两个接口,一个是关于载客的,另一个是关于载货的来解决。这样,就可以每种类型的车连接不同的接口来实现载客、载货的功能。
我再创建一个抽象类Car来表示这三种车型的父类,其中租金和车名每种车型都是具备的,所以直接在父类Car中定义租金和车名。
然后,分别将三种类型的车转化为三个类,Coach(客车)、Truck(货车)、Pika(皮卡车)。其中Coach定义载客量,Truck定义载货量,而Pika则定义了载客量和载货量。
最后创建一个Main主类来调用各个类,来完成整个项目的控制流。
(2)业务模型分析
1、在设计应用程序之前,应该明确该应用程序必须执行哪些任务。
分析业务需求是应用程序开发中最重要的步骤之一。
确认业务需求的目的在于创建一个同时满足零售商和消费者需要的解决方案。
2、答答租车系统中,只需要考虑消费者业务需求即可。
可以看出,在这个答答租车系统中,我们只需要考虑考虑消费者业务需求,因为只是一个小系统,用户需求也非常简单:我们要考虑如何选车,租车天数是多少,租车的统计金额是多少,租车的载客量和载货量是多少。
(3)显示和流程分析
1、显示:用户可以看到的信息提示界面。
2、流程:显示信息的执行过程、步骤。
3、答答租车系统中,要以命令行的方式显示提示信息,要考虑其样式,用户输入的数据不同,信息该如何提示、如何处理并显示出结果,等等。
我在这个系统的显示流程设定为:
是否租车?--->列出可租车辆信息--->租车数量--->租车序号--->租车天数--->输出租车信息
三、项目源代码
根据上述的对答答租车系统的分析,我用java代码实现了此项目,并且已经测试完毕。以下将给大家分享我的源代码,如果有错误的地方请指出来告诉我,O(∩_∩)O谢谢
注:由于这个系统是以本人目前的学习进度来编写的,主要是用来巩固之前的学习知识,肯定有很多需要改进的地方(以后我自己也会对这个程序进行改进),大牛们请勿喷!
1、Car抽象类
1 /* 2 * 所有汽车的抽象父类 3 */ 4 public abstract class Car { 5 public String name;//汽车名称 6 public int rent;//租金 7 8 9 //各个属性的get和set方法 10 public String getName() { 11 return name; 12 } 13 public void setName(String name) { 14 this.name = name; 15 } 16 public int getRent() { 17 return rent; 18 } 19 public void setRent(int rent) { 20 this.rent = rent; 21 } 22 23 }
2、Coach(客车)、Truck(货车)、Pika(皮卡)三个类
1 /* 2 * 客车类,只能载客 3 */ 4 public class Coach extends Car implements ICarryPer{ 5 private int per;//封装载客量 6 7 //含参构造函数 8 public Coach(String name,int rent,int per){ 9 super();//调用父类构造函数 10 this.name=name; 11 this.rent=rent; 12 this.per=per; 13 } 14 15 @Override 16 public int GetPer() { 17 // TODO Auto-generated method stub 18 return per; 19 } 20 21 @Override 22 public void SetPer(int per) { 23 // TODO Auto-generated method stub 24 this.per=per; 25 } 26 //重写,方便输出对象信息 27 @Override 28 public String toString() { 29 return name+" "+rent+"/天"+" "+"载人:"+per+"人"; 30 } 31 32 }
1 /* 2 * 货车,只能载货 3 */ 4 public class Truck extends Car implements ICargo{ 5 private float cargo;//封装载货量 6 7 //含参构造函数 8 public Truck(String name,int rent,float cargo){ 9 super();//调用父类构造函数 10 this.name=name; 11 this.rent=rent; 12 this.cargo=cargo; 13 } 14 @Override 15 public float GetCargo() { 16 // TODO Auto-generated method stub 17 return cargo; 18 } 19 20 @Override 21 public void SetCargo(float cargo) { 22 // TODO Auto-generated method stub 23 this.cargo=cargo; 24 } 25 26 27 //重写,方便输出对象信息 28 @Override 29 public String toString() { 30 return name+" "+rent+"/天"+" "+"载货:"+cargo+"吨"; 31 } 32 33 }
1 /* 2 * 皮卡车,既能载货又能载车 3 */ 4 public class Pika extends Car implements ICargo,ICarryPer{ 5 private int per;//封装载客量 6 private float cargo;//封装载货量 7 8 9 //含参构造函数 10 public Pika(String name,int rent,int per,float cargo){ 11 super();//调用父类构造函数 12 this.name=name; 13 this.rent=rent; 14 this.cargo=cargo; 15 this.per=per; 16 } 17 @Override 18 public int GetPer() { 19 // TODO Auto-generated method stub 20 return per; 21 } 22 23 @Override 24 public void SetPer(int per) { 25 // TODO Auto-generated method stub 26 this.per=per; 27 } 28 29 @Override 30 public float GetCargo() { 31 // TODO Auto-generated method stub 32 return cargo; 33 } 34 35 @Override 36 public void SetCargo(float cargo) { 37 // TODO Auto-generated method stub 38 this.cargo=cargo; 39 } 40 41 //重写,方便输出对象信息 42 @Override 43 public String toString() { 44 return name+" "+rent+"/天"+" "+"载人:"+per+"人"+"|载货:"+cargo+"吨"; 45 } 46 47 }
3、ICargo(载货量)和 ICarryPer(载客量)接口
1 /* 2 * 载货的接口 3 */ 4 public interface ICargo { 5 public float GetCargo();//获得载货量 6 public void SetCargo(float cargo);//设置载货量 7 }
1 /* 2 * 载客的接口 3 */ 4 public interface ICarryPer { 5 public int GetPer();//获得载客量 6 public void SetPer(int per);//设置载客量 7 }
4、Main(主类)
1 import java.util.Scanner; 2 3 /** 4 * 项目说明: 编写一个控制台板的"答答租车系统" 功能: 1.展示所有可租车辆 2.可以选择车型和租车量 5 * 3.展示租车清单,包含:总金额、总载货量及其车型、总人量及车型 6 * 7 * @author hysum 8 * 9 */ 10 public class Main { 11 static Scanner in = new Scanner(System.in);// 获取用户键盘输入 12 13 /* 14 * 用于输出所有车信息的函数 15 */ 16 private static Car[] ArraysCar() { 17 // 创建一个数组来保存车辆信息 18 Car[] Acar = { (Coach) new Coach("奥迪A4", 500, 4), (Coach) new Coach("马自达6", 400, 4), 19 (Coach) new Coach("金龙5", 800, 20), (Truck) new Truck("松花江", 400, 4.0f), 20 (Truck) new Truck("依维柯", 1000, 20.0f), (Pika) new Pika("皮卡雪6", 450, 4, 2.0f) }; 21 System.out.println("序号 汽车名称 租金 容量"); 22 // 用for循环输出数组 23 for (int i = 0; i < Acar.length; i++) { 24 System.out.println((i + 1) + ". " + Acar[i].toString()); 25 } 26 return Acar; 27 } 28 29 /* 30 * 用于打印账单 31 */ 32 private static void PrintCash(Car[] car, int[] array, int day) { 33 System.out.println("您的账单:"); 34 System.out.println("***可载人的车有:"); 35 int rent = 0;// 用于保存租金总数 36 // for循环遍历输出 37 int num = 0;// 用于保存载人总数 38 for (int i = 0; i < array.length; i++) { 39 40 // if判断类型是否能载人 41 if (car[array[i]] instanceof Coach) { 42 Coach c = (Coach) car[array[i] - 1]; 43 System.out.print(c.getName() + " "); 44 num += c.GetPer(); 45 46 } else if (car[array[i]] instanceof Pika) { 47 Pika p = (Pika) car[array[i] - 1]; 48 System.out.print(p.getName() + " "); 49 num += p.GetPer(); 50 51 } 52 rent += car[array[i] - 1].getRent() * day; 53 } 54 if (num > 0) { 55 System.out.println("共载人:" + num + "人"); 56 } else { 57 System.out.println("您没有选择可以载人的车型"); 58 } 59 System.out.println("***可载货的车有:"); 60 // for循环遍历输出 61 int sum = 0;// 用于保存载货总数 62 for (int i = 0; i < array.length; i++) { 63 64 // if判断类型是否能载货 65 if (car[array[i]] instanceof Truck) { 66 Truck t = (Truck) car[array[i] - 1]; 67 System.out.print(t.getName() + " "); 68 sum += t.GetCargo(); 69 70 } else if (car[array[i]] instanceof Pika) { 71 Pika p = (Pika) car[array[i] - 1]; 72 System.out.print(p.getName() + " "); 73 sum += p.GetCargo(); 74 } 75 76 } 77 if (sum > 0) { 78 System.out.println("共载货:" + num + "吨"); 79 } else { 80 System.out.println("您没有选择可以载货的车型"); 81 } 82 System.out.println("***租车总价格:" + rent + "元"); 83 } 84 85 /* 86 * 用来判断输入字符的合法性(是否是数值) 87 */ 88 private static int JudeInter(String s) { 89 try { 90 return Integer.parseInt(s); 91 } catch (NumberFormatException e) { 92 93 return 0; 94 } 95 96 } 97 98 /* 99 * 主函数,用于整个流程控制 100 */ 101 public static void main(String[] args) { 102 // TODO Auto-generated method stub 103 System.out.println("欢迎使用答答租车系统:"); 104 ok: // 使用一个标号方便用break跳出循环 105 while (true) { 106 System.out.println("您是否要租车:1是 0否"); 107 // 判断是否租车 108 String select = in.next(); 109 if (select.equals("1")) {// 如果选择是,进入系统 110 System.out.println("您可租车的类型及其价目表:"); 111 Car[] Acar = ArraysCar();// 输出所有车的信息的函数,并返回一个数组 112 while (true) { 113 System.out.println("请输入您要租车的数量:"); 114 String s = in.next();// i变量用来接收序号 115 try { 116 int j = Integer.parseInt(s);// 将字符串转化为数值类型 117 // 判断j是否合理 118 if (j >= 1 && j <= 6) { 119 int[] Array = new int[j];// 创建一个数组用来保存序号 120 for (int i = 1; i <= j; i++) { 121 System.out.println("请输入第" + i + "辆车的序号:"); 122 String order = in.next(); 123 // 判断输入序号的合法性 124 if (JudeInter(order) >= 1 && JudeInter(order) <= 6) {// 如果合法 125 Array[i - 1] = JudeInter(order); 126 127 } else {// 不合法 128 System.out.println("异常:您输入的不是整数或者不合法!请重新输入!"); 129 i--; 130 } 131 132 } 133 while (true) { 134 System.out.println("请输入您要租车的天数:"); 135 // 判断输入合法性 136 String day = in.next(); 137 if (JudeInter(day) > 0) { 138 PrintCash(Acar, Array, JudeInter(day));// 打印账单 139 System.out.println("谢谢您的惠顾,欢迎下次光临!!"); 140 in.close(); 141 break ok;// 跳出多重循环 142 } else { 143 System.out.println("异常:您输入的不是整数或者不合法!请重新输入!"); 144 continue; 145 } 146 147 } 148 } else { 149 System.out.println("异常:您输入的序列号超出范围!请重新输入!"); 150 continue; 151 } 152 153 } catch (NumberFormatException e) { 154 System.out.println("异常:您输入的不是整数!请重新输入!"); 155 continue; 156 } 157 158 } 159 160 } 161 if (select.equals("0")) {// 如果选择否,退出循环 162 System.out.println("退出系统!"); 163 in.close(); 164 break; 165 } else {// 如果输入以外的字符时 166 System.out.println("您输入的格式不对,请重新输入!"); 167 } 168 } 169 170 } 171 172 }
四、运行结果
这个程序会随今后学习的深入来一步步改进的(需要改进的地方欢迎指出),我自己测试没有问题,如果有我没有注意到的错误,请在下面留言~~谢谢(>ω・* )ノ