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 }

四、运行结果

  

  


  这个程序会随今后学习的深入来一步步改进的(需要改进的地方欢迎指出),我自己测试没有问题,如果有我没有注意到的错误,请在下面留言~~谢谢(>ω・* )ノ

转载于:https://www.cnblogs.com/hysum/p/7106197.html

JAVA基础——编程练习(二)相关推荐

  1. java编程基础素数实验报告,JAVA 基础编程练习题1 (输出素数)

    JAVA 基础编程练习题1 (输出素数) JAVA 基础编程练习题1 (输出素数) 题目:判断 101-200 之间有多少个素数,并输出所有素数. 程序分析:判断素数的方法:用一个数分别去除 2 到 ...

  2. java并发编程(二十一)----(JUC集合)CopyOnWriteArraySet和ConcurrentSkipListSet介绍

    转载自  java并发编程(二十一)----(JUC集合)CopyOnWriteArraySet和ConcurrentSkipListSet介绍 这一节我们来接着介绍JUC集合:CopyOnWrite ...

  3. 实体类 接口_Java 语言基础编程题 (二维数组, 五子棋游戏, 实体类和接口)

    原文:Java 语言基础编程题 (二维数组, 五子棋游戏, 实体类和接口, 视频讲解) 这里分享三道编程题, 下面是我个人的视频讲解 二维数组, 五子棋游戏, 实体类和接口_哔哩哔哩 (゜-゜)つロ ...

  4. 实验一 java基础编程(预习报告)

    面向对象--Java实验报告 实验一:Java基础编程 实验一 java基础编程(预习报告) <center> <strong>姓名:</strong> <u ...

  5. java mq编程_MQ java 基础编程

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

  6. Java基础知识(二)(Object类的常用方法、日期时间类、System类、StringBuilder类、包装类、Collection集合、Iterator迭代器、泛型、list集Set接口...)

    文章目录 Java基础知识(二) 1.Object类的常用方法 1.1 toString方法 1.2 equals方法 1.3 Objects类 2.日期时间类 2.1 Date类 2.2 DateF ...

  7. Java基础编程及思维导图整理

    我把Java基础编程及思维导图整理的超级详细,小白都能看懂 Java基础编程及其思维导图 目录: Java学习导图 一.Java基本语法 1.关键字与标识符 2.变量分类 3.运算符 4.流程控制 二 ...

  8. Java基础编程及思维导图

    java基础编程及其思维导图 感谢尚硅谷宋红康老师 java学习导图 一.java基本语法 1.关键字与标识符 2.变量分类 3.运算符 4.流程控制 二.数组 1.数组概述 2.一维数组 3.二维数 ...

  9. Java基础编程练习50题(转载)

    JAVA基础编程练习50题 本文对50道经典的java程序题进行详细解说,对于初学者可以跳过一些逻辑性太强的题目,比如第一题用到了方法的递归,初学者可能不理解,最好先看那些有if.for.while可 ...

  10. java基础编程练习题--兔子生兔子问题

    java基础编程练习题--兔子生兔子问题 题目要求 题目分析 java代码示例 输出结果 题目要求 现有一对兔子,每一对兔子每个月都会生一对小兔子,小兔子在月龄达到第三个月开始每个月就可以生一对,兔子 ...

最新文章

  1. python12306抢票犯法_Python实例 2-12306抢票(一) 登陆
  2. 非等高cell实战(01)-- 实现微博页面
  3. 合肥市电力大数据应用工程技术研究中心成立
  4. 170 道 Python 爬虫面试题(2019 版)
  5. android 粒子动画火焰,canvas粒子火焰跟随动画特效
  6. java怎么设置命令行参数_java 命令行参数
  7. VC++ 进度条更新方案
  8. 素数在c语言中怎么表示,请问素数怎么样表示
  9. delphi之鼠标模拟
  10. ios正式包ipa,发布苹果应用商店App Store
  11. 数据库设计中的概念、逻辑、物理结构设计辨析
  12. java LPT1_com1/lpt1/prn/nul 木马后门处理方法集合
  13. 如何在html 中添加ppt文件,如何在ppt中插入网页
  14. 什么是5G LAN 5G LAN商用爆发推动5G创新应用 提速数字转型新引擎
  15. 潜在语义分析(LSA)
  16. Android 科大讯飞开发相关
  17. github 首页 html,GitHub - merrier/github-html-preview: 一个可以直接预览html页面的chrome插件...
  18. java 实现macd算法_java尝试编写macd,试验顶背离底背离
  19. [单片机框架] [kv_sys] 实现一个简易KV键值系统(升级版)
  20. numpy提取某行(列)或某几行(列)

热门文章

  1. ubuntu终端下快捷键,字体放大缩小等【逐渐完善篇】
  2. 特征工程用java或python,机器学习-特征工程-Feature generation 和 Feature selection(示例代码)...
  3. 变频器lpm故障码是什么_什么是变频器软故障,如何解决?
  4. 树状数组基础原理与模板
  5. 阿德莱德大学计算机科学学士收费,2017阿德莱德大学研究生学费
  6. find命令过滤 no such_运维老手常用的linux命令操作
  7. 用python编制一个的类_常见面试题整理--Python概念篇
  8. django文档_如何在django官方文档中快速找到需要的内容
  9. php悬浮图片,在JS中如何实现图片居中悬浮效果
  10. 路径总和Python解法