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基础——编程练习(二)的更多相关文章

  1. 6、50道JAVA基础编程练习题跟答案

    50道JAVA基础编程练习题 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 程序分析 ...

  2. MQ java 基础编程

    MQ java 基础编程 编写人:邬文俊 编写时间 : 2006-2-16 联系邮件 : wenjunwu430@gmail.com 前言 通过 2 个多星期对 MQ 学习,在 partner 丁 & ...

  3. 50道JAVA基础编程练习题

    50道JAVA基础编程练习题 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 程序分析 ...

  4. 50道JAVA基础编程练习题 - 题目

    50道JAVA基础编程练习题[1]题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? [2]题目:判断 ...

  5. java基础语法(二)--单列模式

    java基础语法(二)--单列模式 /** * 功能:单列模式 * @author Administrator * */ public class SingletonTest { public sta ...

  6. [Java并发编程(二)] 线程池 FixedThreadPool、CachedThreadPool、ForkJoinPool?为后台任务选择合适的 Java executors

    [Java并发编程(二)] 线程池 FixedThreadPool.CachedThreadPool.ForkJoinPool?为后台任务选择合适的 Java executors ... 摘要 Jav ...

  7. java基础解析系列(二)---Integer

    java基础解析系列(二)---Integer 前言:本系列的主题是平时容易疏忽的知识点,只有基础扎实,在编码的时候才能更注重规范和性能,在出现bug的时候,才能处理更加从容. 目录 java基础解析 ...

  8. Java基础拾遗(二)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76358523冷血之心的博客) 马上就要秋招了,新的一轮笔试面试马上 ...

  9. java基础知识点补充---二维数组

    #java基础知识点补充---二维数组 首先定义一个二维数组 int[][] ns={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12}, {13,14,15,16} }; 实现遍 ...

随机推荐

  1. 局域网内部署 Docker Registry

    在局域网内部署 Docker Registry 可以极大的提升平时 pull.push 镜像的速度,从而缩短自动化操作的过程.同时也可以缓解带宽不足的问题,真是一举多得.本文将从创建单机的 Docke ...

  2. MySQL 主从复制与读写分离概念及架构分析 (转)

    1.MySQL主从复制入门 首先,我们看一个图: 影响MySQL-A数据库的操作,在数据库执行后,都会写入本地的日志系统A中. 假设,实时的将变化了的日志系统中的数据库事件操作,在MYSQL-A的33 ...

  3. javase基础回顾(四) 自定义注解与反射

    本篇文章将从元注解.自定义注解的格式.自定义注解与反射结合的简单范例.以及自定义注解的应用来说一说java中的自定义注解. 一.元注解 元注解也就是注解其他注解(自定义注解)的java原生的注解,Ja ...

  4. jQuery中易混淆知识点总结(持续更新)

    find()与children() <body> <ul class="level-1"> <li class="item-i"& ...

  5. [原创]首次SDN比赛的记录-部分

    SDN大赛环境搭建和第一大题实现 由于物理设备不足的原因,故用虚拟机实现Floodlight控制器,openvswitch(以下简称:OVS)和mininet各种要用到的SDN环境的搭建.下面将给出它 ...

  6. ELK菜鸟手记 (四) - 利用filebeat和不同端口把不同服务器上的log4j日志传输到同一台ELK服务器

    1. 问题描述  我们需要将不同服务器(如Web Server)上的log4j日志传输到同一台ELK服务器,介于公司服务器资源紧张(^_^) 2. 我们需要用到filebeat 什么是filebeat ...

  7. 支付宝支付-常用支付API详解(查询、退款、提现等)

    所有的接口支持沙盒环境的测试 1.前言 前面几篇文件详细介绍了 支付宝提现.扫码支付.条码支付.Wap支付.App支付 支付宝支付-提现到个人支付宝 支付宝支付-扫码支付 支付宝支付-刷卡支付(条码支 ...

  8. ajax传数组到后台,后台springmvc接收数组参数

    var   ids= new Array();  $("input[class='detailCheck']:checked").each(function(i,k){   var ...

  9. zepto源码分析系列

    如果你也开发移动端web,如果你也用zepto,应该值得你看看.有问题请留言. Zepto源码分析-架构 Zepto源码分析-zepto(DOM)模块 Zepto源码分析-callbacks模块 Ze ...

  10. 传统平面广告已OUT出局,VR全景异军突起——VR全景智慧城市

    VR,近两年异军突起的"黑科技".从1935年斯坦利·温鲍姆首次在小说中描述VR眼镜,到如今PC头盔.VR分体机以及VR一体机的相继问世,VR自身已从虚拟走向现实.而当硬件迭代逐步 ...