JAVA基础——编程练习(二)
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抽象类
/*
* 所有汽车的抽象父类
*/
public abstract class Car {
public String name;//汽车名称
public int rent;//租金 //各个属性的get和set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getRent() {
return rent;
}
public void setRent(int rent) {
this.rent = rent;
} }
2、Coach(客车)、Truck(货车)、Pika(皮卡)三个类
/*
* 客车类,只能载客
*/
public class Coach extends Car implements ICarryPer{
private int per;//封装载客量 //含参构造函数
public Coach(String name,int rent,int per){
super();//调用父类构造函数
this.name=name;
this.rent=rent;
this.per=per;
} @Override
public int GetPer() {
// TODO Auto-generated method stub
return per;
} @Override
public void SetPer(int per) {
// TODO Auto-generated method stub
this.per=per;
}
//重写,方便输出对象信息
@Override
public String toString() {
return name+" "+rent+"/天"+" "+"载人:"+per+"人";
} }
/*
* 货车,只能载货
*/
public class Truck extends Car implements ICargo{
private float cargo;//封装载货量 //含参构造函数
public Truck(String name,int rent,float cargo){
super();//调用父类构造函数
this.name=name;
this.rent=rent;
this.cargo=cargo;
}
@Override
public float GetCargo() {
// TODO Auto-generated method stub
return cargo;
} @Override
public void SetCargo(float cargo) {
// TODO Auto-generated method stub
this.cargo=cargo;
} //重写,方便输出对象信息
@Override
public String toString() {
return name+" "+rent+"/天"+" "+"载货:"+cargo+"吨";
} }
/*
* 皮卡车,既能载货又能载车
*/
public class Pika extends Car implements ICargo,ICarryPer{
private int per;//封装载客量
private float cargo;//封装载货量 //含参构造函数
public Pika(String name,int rent,int per,float cargo){
super();//调用父类构造函数
this.name=name;
this.rent=rent;
this.cargo=cargo;
this.per=per;
}
@Override
public int GetPer() {
// TODO Auto-generated method stub
return per;
} @Override
public void SetPer(int per) {
// TODO Auto-generated method stub
this.per=per;
} @Override
public float GetCargo() {
// TODO Auto-generated method stub
return cargo;
} @Override
public void SetCargo(float cargo) {
// TODO Auto-generated method stub
this.cargo=cargo;
} //重写,方便输出对象信息
@Override
public String toString() {
return name+" "+rent+"/天"+" "+"载人:"+per+"人"+"|载货:"+cargo+"吨";
} }
3、ICargo(载货量)和 ICarryPer(载客量)接口
/*
* 载货的接口
*/
public interface ICargo {
public float GetCargo();//获得载货量
public void SetCargo(float cargo);//设置载货量
}
/*
* 载客的接口
*/
public interface ICarryPer {
public int GetPer();//获得载客量
public void SetPer(int per);//设置载客量
}
4、Main(主类)
import java.util.Scanner; /**
* 项目说明: 编写一个控制台板的"答答租车系统" 功能: 1.展示所有可租车辆 2.可以选择车型和租车量
* 3.展示租车清单,包含:总金额、总载货量及其车型、总人量及车型
*
* @author hysum
*
*/
public class Main {
static Scanner in = new Scanner(System.in);// 获取用户键盘输入 /*
* 用于输出所有车信息的函数
*/
private static Car[] ArraysCar() {
// 创建一个数组来保存车辆信息
Car[] Acar = { (Coach) new Coach("奥迪A4", 500, 4), (Coach) new Coach("马自达6", 400, 4),
(Coach) new Coach("金龙5", 800, 20), (Truck) new Truck("松花江", 400, 4.0f),
(Truck) new Truck("依维柯", 1000, 20.0f), (Pika) new Pika("皮卡雪6", 450, 4, 2.0f) };
System.out.println("序号 汽车名称 租金 容量");
// 用for循环输出数组
for (int i = 0; i < Acar.length; i++) {
System.out.println((i + 1) + ". " + Acar[i].toString());
}
return Acar;
} /*
* 用于打印账单
*/
private static void PrintCash(Car[] car, int[] array, int day) {
System.out.println("您的账单:");
System.out.println("***可载人的车有:");
int rent = 0;// 用于保存租金总数
// for循环遍历输出
int num = 0;// 用于保存载人总数
for (int i = 0; i < array.length; i++) { // if判断类型是否能载人
if (car[array[i]] instanceof Coach) {
Coach c = (Coach) car[array[i] - 1];
System.out.print(c.getName() + " ");
num += c.GetPer(); } else if (car[array[i]] instanceof Pika) {
Pika p = (Pika) car[array[i] - 1];
System.out.print(p.getName() + " ");
num += p.GetPer(); }
rent += car[array[i] - 1].getRent() * day;
}
if (num > 0) {
System.out.println("共载人:" + num + "人");
} else {
System.out.println("您没有选择可以载人的车型");
}
System.out.println("***可载货的车有:");
// for循环遍历输出
int sum = 0;// 用于保存载货总数
for (int i = 0; i < array.length; i++) { // if判断类型是否能载货
if (car[array[i]] instanceof Truck) {
Truck t = (Truck) car[array[i] - 1];
System.out.print(t.getName() + " ");
sum += t.GetCargo(); } else if (car[array[i]] instanceof Pika) {
Pika p = (Pika) car[array[i] - 1];
System.out.print(p.getName() + " ");
sum += p.GetCargo();
} }
if (sum > 0) {
System.out.println("共载货:" + num + "吨");
} else {
System.out.println("您没有选择可以载货的车型");
}
System.out.println("***租车总价格:" + rent + "元");
} /*
* 用来判断输入字符的合法性(是否是数值)
*/
private static int JudeInter(String s) {
try {
return Integer.parseInt(s);
} catch (NumberFormatException e) { return 0;
} } /*
* 主函数,用于整个流程控制
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("欢迎使用答答租车系统:");
ok: // 使用一个标号方便用break跳出循环
while (true) {
System.out.println("您是否要租车:1是 0否");
// 判断是否租车
String select = in.next();
if (select.equals("1")) {// 如果选择是,进入系统
System.out.println("您可租车的类型及其价目表:");
Car[] Acar = ArraysCar();// 输出所有车的信息的函数,并返回一个数组
while (true) {
System.out.println("请输入您要租车的数量:");
String s = in.next();// i变量用来接收序号
try {
int j = Integer.parseInt(s);// 将字符串转化为数值类型
// 判断j是否合理
if (j >= 1 && j <= 6) {
int[] Array = new int[j];// 创建一个数组用来保存序号
for (int i = 1; i <= j; i++) {
System.out.println("请输入第" + i + "辆车的序号:");
String order = in.next();
// 判断输入序号的合法性
if (JudeInter(order) >= 1 && JudeInter(order) <= 6) {// 如果合法
Array[i - 1] = JudeInter(order); } else {// 不合法
System.out.println("异常:您输入的不是整数或者不合法!请重新输入!");
i--;
} }
while (true) {
System.out.println("请输入您要租车的天数:");
// 判断输入合法性
String day = in.next();
if (JudeInter(day) > 0) {
PrintCash(Acar, Array, JudeInter(day));// 打印账单
System.out.println("谢谢您的惠顾,欢迎下次光临!!");
in.close();
break ok;// 跳出多重循环
} else {
System.out.println("异常:您输入的不是整数或者不合法!请重新输入!");
continue;
} }
} else {
System.out.println("异常:您输入的序列号超出范围!请重新输入!");
continue;
} } catch (NumberFormatException e) {
System.out.println("异常:您输入的不是整数!请重新输入!");
continue;
} } }
if (select.equals("0")) {// 如果选择否,退出循环
System.out.println("退出系统!");
in.close();
break;
} else {// 如果输入以外的字符时
System.out.println("您输入的格式不对,请重新输入!");
}
} } }
四、运行结果
这个程序会随今后学习的深入来一步步改进的(需要改进的地方欢迎指出),我自己测试没有问题,如果有我没有注意到的错误,请在下面留言~~谢谢(>ω・* )ノ
JAVA基础——编程练习(二)的更多相关文章
- 6、50道JAVA基础编程练习题跟答案
50道JAVA基础编程练习题 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 程序分析 ...
- MQ java 基础编程
MQ java 基础编程 编写人:邬文俊 编写时间 : 2006-2-16 联系邮件 : wenjunwu430@gmail.com 前言 通过 2 个多星期对 MQ 学习,在 partner 丁 & ...
- 50道JAVA基础编程练习题
50道JAVA基础编程练习题 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 程序分析 ...
- 50道JAVA基础编程练习题 - 题目
50道JAVA基础编程练习题[1]题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? [2]题目:判断 ...
- java基础语法(二)--单列模式
java基础语法(二)--单列模式 /** * 功能:单列模式 * @author Administrator * */ public class SingletonTest { public sta ...
- [Java并发编程(二)] 线程池 FixedThreadPool、CachedThreadPool、ForkJoinPool?为后台任务选择合适的 Java executors
[Java并发编程(二)] 线程池 FixedThreadPool.CachedThreadPool.ForkJoinPool?为后台任务选择合适的 Java executors ... 摘要 Jav ...
- java基础解析系列(二)---Integer
java基础解析系列(二)---Integer 前言:本系列的主题是平时容易疏忽的知识点,只有基础扎实,在编码的时候才能更注重规范和性能,在出现bug的时候,才能处理更加从容. 目录 java基础解析 ...
- Java基础拾遗(二)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76358523冷血之心的博客) 马上就要秋招了,新的一轮笔试面试马上 ...
- java基础知识点补充---二维数组
#java基础知识点补充---二维数组 首先定义一个二维数组 int[][] ns={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12}, {13,14,15,16} }; 实现遍 ...
随机推荐
- 让人恼火的经历——手机H5网页被注入广告
你的网站是否在尾部出现了让人恼火的广告? 这次我算是遇到了这些流氓的广告.那么就让我们一步步攻克这些恼火的广告吧. 问题描述 某一天下午开始,我们制作的网站就开始被各种广告注入,类似上图这种. 还有在 ...
- iframe 父子页面方法调用
在写代码的时候经常会用到将一个网页嵌入到另一个网页中,w3c也规定了一个标签<iframe>,这个标签本身就支持跨域,而且所有的浏览器都支持 iframe具有以下属性: 1.framebo ...
- 开涛spring3(6.1) - AOP 之 6.1 AOP基础
6.1.1 AOP是什么 考虑这样一个问题:需要对系统中的某些业务做日志记录,比如支付系统中的支付业务需要记录支付相关日志,对于支付系统可能相当复杂,比如可能有自己的支付系统,也可能引入第三方支付平 ...
- Java反射机制剖析(三)-简单谈谈动态代理
通过Java反射机制剖析(一)和Java反射机制剖析(二)的学习,已经对反射有了一定的了解,这一篇通过动态代理的例子来进一步学习反射机制. 1. 代理模式 代理模式就是为其他对象提供一种代理来 ...
- 默认路由、RIPv2、OSPF、EIGRP配置(全网全通)
1:默认路由 遇到问题:给r2配置向右的单项默认路由,通过PC1去ping主机PC2,一直显示Request timed out, 解决方法:r2配置如下: r2(config)#ip route 0 ...
- 图解Git命令
上面的四条命令在工作目录.暂存目录(也叫做索引)和仓库之间复制文件. ·git add files把当前文件放入暂存区域. ·git commit 给暂存区域生成快照并提交. ·git reset - ...
- 小小白的python之路------python基础01
1. 不说python是啥了,百度一堆.,还是说说我学了啥 我说的是python3.5,其他的自己看着办 这个是下载链接啊,自己玩 https://www.python.org/ 我下载完成,使用py ...
- sublime text 快捷收集
1. 文件快速导航: 这是sublime上面很好用的功能之一,ctrl+p可以调出窗口,菜单上的解释是gotoanythings ,确实如其所言,调出窗口后,直接输入关键字,可以在已打开的项目文件夹中 ...
- 链表插入和删除,判断链表是否为空,求链表长度算法的,链表排序算法演示——C语言描述
关于数据结构等的学习,以及学习算法的感想感悟,听了郝斌老师的数据结构课程,其中他也提到了学习数据结构的或者算法的一些个人见解,我觉的很好,对我的帮助也是很大,算法本就是令人头疼的问题,因为自己并没有学 ...
- mysql数据导入方法
1. 通过mysql-workbench的Data Import/Restore功能 1) 有的命令不支持,比如LOAD DATA LOCAL INFILE 2) 好处是可以和DB的模 ...