JAVA基础——编程练习(二)

时间:2023-03-09 20:03:45
JAVA基础——编程练习(二)

JAVA编程练习(二)

今天我为了巩固之前的java基础知识的学习,再次进行实战演习,编写了一个小小的java控制台程序,主要是运用java面向对象的思想来完成这个小项目。

一、项目背景介绍

  根据所学知识,编写一个控制台板的"答答租车系统"
     功能:
   1.展示所有可租车辆
   2.可以选择车型和租车量
   3.展示租车清单,包含:总金额、总载货量及其车型、总人量及车型

二、项目分析

(1)数据模型分析

  1、通过对现实世界的事与物主要特征的分析、抽象,为信息系统的实施提供数据存取的数据结构以及相应的约束。

  2、这个数据结构组成:操作(方法)、属性

  在这个答答租车系统中呢,车可以分为三大类,客车(载客量)、货车(载货量)、皮卡(载客量、载货量),如下图所示:

  JAVA基础——编程练习(二)

  由于皮卡既有载客量又有载货量,这个类型与另外两种车型都不一样,那么我们该如何解决这个问题呢?

  我通过创建两个接口,一个是关于载客的,另一个是关于载货的来解决。这样,就可以每种类型的车连接不同的接口来实现载客、载货的功能。

  我再创建一个抽象类Car来表示这三种车型的父类,其中租金和车名每种车型都是具备的,所以直接在父类Car中定义租金和车名。

  然后,分别将三种类型的车转化为三个类,Coach(客车)、Truck(货车)、Pika(皮卡车)。其中Coach定义载客量,Truck定义载货量,而Pika则定义了载客量和载货量。

  最后创建一个Main主类来调用各个类,来完成整个项目的控制流。

(2)业务模型分析

  1、在设计应用程序之前,应该明确该应用程序必须执行哪些任务。

    分析业务需求是应用程序开发中最重要的步骤之一。

    确认业务需求的目的在于创建一个同时满足零售商和消费者需要的解决方案。

  2、答答租车系统中,只需要考虑消费者业务需求即可。

    JAVA基础——编程练习(二)

    可以看出,在这个答答租车系统中,我们只需要考虑考虑消费者业务需求,因为只是一个小系统,用户需求也非常简单:我们要考虑如何选车,租车天数是多少,租车的统计金额是多少,租车的载客量和载货量是多少。

(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基础——编程练习(二)

  JAVA基础——编程练习(二)


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