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. Java IO详解(六)------序列化与反序列化(对象流)

    File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html Java IO 流的分类介绍:http://www.cnblogs.com/ysocea ...

  2. 【JAVAWEB学习笔记】03_JavaScript

    javascript简单介绍 ECMAScript 1.语法 2.变量:只能使用var定义,如果在函数的内容使用var定义,那么它是一个局部变量,如果没有使用var它是一个全局的.弱类型! 3.数据类 ...

  3. 【2017-05-21】WebForm跨页面传值取值、C#服务端跳转页面、 Button的OnClientClick属性、Js中getAttribute和超链接点击弹出警示框。

    一.跨页面传值和取值: 1.QueryString - url传值,地址传值 优缺点:不占用服务器内存:保密性差,传递长度有限. 通过跳转页面路径进行传值,方式: href="地址?key= ...

  4. OpenStack dashboard界面操作 实现登陆虚拟机并通信

    1.创建项目,点击"创建项目" (1).填写项目信息 (2).添加与之关联的项目成员 (3).点击"配额",为用户在平台上分配一个操作的空间,便于用户创建网络, ...

  5. LINUX 硬盘分区及文件系统

    一,top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. 1. 第一行是任务队列信息 2. 第二.三行为进程和CPU的信息 3. 第 ...

  6. js实现导航菜单栏随着屏幕的滚动进行滚动的效果

    $(window).scroll(function () { var $nav = $(".floatingMenu ul li"), length = $nav.length-1 ...

  7. JS组件系列——自己动手扩展BootstrapTable的treegrid功能

    前言:上篇  JS组件系列——自己动手封装bootstrap-treegrid组件 博主自己动手封装了下treegrid的功能,但毕竟那个组件只是一个单独针对树形表格做的,适用性还比较有限.关注博主的 ...

  8. markdown 基础语法

    markdown 基础 你好,我是markdown文档 介绍 Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式. 说的简单一点,mar ...

  9. [HDU1000] A + B Problem

    Problem Description Calculate A + B. Input Each line will contain two integers A and B. Process to e ...

  10. 学习笔记TF020:序列标注、手写小写字母OCR数据集、双向RNN

    序列标注(sequence labelling),输入序列每一帧预测一个类别.OCR(Optical Character Recognition 光学字符识别). MIT口语系统研究组Rob Kass ...