项目开发流程说明
项目需求说明
使用java开发零钱通项目,完成收益入账,消费,查看明细,退出系统等功能。
项目的界面
化繁为简
1.先完成显示菜单, 并可以选择.
2.完成零钱通明细
3.完成收益入账.
4.完成消费
5.优化退出
项目代码实现
编写文件chapter08\src\com\zzw\smallchange\SmallChangeSys.java
完成基本功能(过程编译).
先用过程编程, 后面改成OOP版本, 体会OOP编程的好处.
1.先完成显示菜单, 并可以选择.
public class SmallChangeSys {
//化繁为简
//1.先完成显示菜单, 并可以选择菜单, 给出对应选择信息
public static void main(String[] args) {
//定义相关的变量
boolean loop = true;
Scanner scanner = new Scanner(System.in);
Integer key = 0;
do {
System.out.println("=================零钱通菜单=================");
System.out.println("\t\t\t\t1.零钱通明细");
System.out.println("\t\t\t\t2.收益入账");
System.out.println("\t\t\t\t3.消费");
System.out.println("\t\t\t\t4.退 出");
System.out.print("请选择(1-4): ");
key = scanner.nextInt();
//使用switch分支控制
switch (key) {
case 1:
System.out.println("零钱通明细");
break;
case 2:
System.out.println("收益入账");
break;
case 3:
System.out.println("消费");
break;
case 4:
loop = false;
System.out.println("退出系统");
break;
default:
System.out.println("输入错误, 请重新输入");
}
} while (loop);
}
}
2.完成零钱通明细
public class SmallChangeSys {
//化繁为简
//1.先完成显示菜单, 并可以选择菜单, 给出对应选择信息
public static void main(String[] args) {
//定义相关的变量
boolean loop = true;
Scanner scanner = new Scanner(System.in);
Integer key = 0;
//2.完成零钱通明细
//思路:(1)可以把收益入账和消费, 保存到数组
// (2)也可以使用对象
// (3)使用String拼接
String details = "=================零钱通明细=================";
do {
System.out.println("=================零钱通菜单=================");
System.out.println("\t\t\t\t1.零钱通明细");
System.out.println("\t\t\t\t2.收益入账");
System.out.println("\t\t\t\t3.消费");
System.out.println("\t\t\t\t4.退 出");
System.out.print("请选择(1-4): ");
key = scanner.nextInt();
//使用switch分支控制
switch (key) {
case 1:
System.out.println(details);
break;
case 2:
System.out.println("收益入账");
break;
case 3:
System.out.println("消费");
break;
case 4:
loop = false;
System.out.println("退出系统");
break;
default:
System.out.println("输入错误, 请重新输入");
}
} while (loop);
}
}
3.完成收益入账
public class SmallChangeSys {
//化繁为简
//1.先完成显示菜单, 并可以选择菜单, 给出对应选择信息
//2.完成零钱通明细
//3.完成收益入账
public static void main(String[] args) {
//定义相关的变量
boolean loop = true;
Scanner scanner = new Scanner(System.in);
String key = "";
//2.完成零钱通明细
//思路:(1)可以把收益入账和消费, 保存到数组
// (2)也可以使用对象
// (3)使用String拼接
String details = "=================零钱通明细=================";
//3.完成收益入账 完成功能驱动程序员增加新的变量和代码
//思路: 定义新的变量, 储存数据
double money = 0;//收益入账
double balance = 0;//余额
Date date = null;//date 是 java.util.Date 类型, 表示日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");//可以用于日期格式化的对象
do {
System.out.println("\n=================零钱通菜单=================");
System.out.println("\t\t\t\t1.零钱通明细");
System.out.println("\t\t\t\t2.收益入账");
System.out.println("\t\t\t\t3.消费");
System.out.println("\t\t\t\t4.退 出");
System.out.print("请选择(1-4): ");
key = scanner.next();
//使用switch分支控制
switch (key) {
case "1":
System.out.println(details);
break;
case "2":
System.out.print("收益入账金额: ");
money = scanner.nextDouble();
//money值的返回要校验一下, 一会完善
balance += money;
date = new Date();//获取当前日期
//拼接收益入账信息到details
details += "\n收益入账\t+" + money + "\t" + sdf.format(new Date()) + "\t余额:" + balance;
break;
case "3":
System.out.println("消费");
break;
case "4":
System.out.println("退出系统");
loop = false;
break;
default:
System.out.println("输入有误, 请重新输入");
}
} while (loop);
}
}
4.完成消费
public class SmallChangeSys {
//化繁为简
//1.先完成显示菜单, 并可以选择菜单, 给出对应选择信息
//2.完成零钱通明细
//3.完成收益入账
//4.完成消费
public static void main(String[] args) {
//定义相关的变量
boolean loop = true;
Scanner scanner = new Scanner(System.in);
String key = "";
//2.完成零钱通明细
//思路:(1)可以把收益入账和消费, 保存到数组
// (2)也可以使用对象
// (3)使用String拼接
String details = "=================零钱通明细=================";
//3.完成收益入账
//思路: 定义新的变量, 存储收益入账, 交易时间, 余额
double money = 0;//收益入账
double balance = 0;//余额
Date tradeTime = null;//交易时间 引自 java.util.date
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
//4.消费
//思路: 定义新的变量, 存储消费金额
double consumption = 0;//消费金额
String note = "";//消费说明
do {
System.out.println("\n=================零钱通菜单=================");
System.out.println("\t\t\t\t1.零钱通明细");
System.out.println("\t\t\t\t2.收益入账");
System.out.println("\t\t\t\t3.消费");
System.out.println("\t\t\t\t4.退 出");
System.out.print("请选择(1-4): ");
key = scanner.next();
//使用switch分支控制
switch (key) {
case "1":
System.out.println(details);
break;
case "2":
System.out.print("收益入账金额: ");
money = scanner.nextDouble();
balance += money;
tradeTime = new Date();
//拼接收益入账到details
details += "\n收益入账\t+" + money + "\t" + sdf.format(tradeTime) + "\t余额:" + balance;
break;
case "3":
System.out.print("消费金额: ");
consumption = scanner.nextDouble();
System.out.print("消费原因: ");
note = scanner.next();
//判断, 余额是否大于等于消费金额
balance -= consumption;
tradeTime = new Date();
//拼接消费信息到details
details += "\n" + note + "\t-" + consumption + "\t" + sdf.format(tradeTime) + "\t余额:" + balance;
break;
case "4":
System.out.println("退出系统");
loop = false;
break;
default:
System.out.println("输入有误, 请重新输入");
}
} while (loop);
}
}
项目代码改进
1.用户输入4退出时, 给出提示"你确定要退出吗?( y/n)", 必须输入正确的y/n, 否则循环输入指令,直到输入y 或者 n.
2.在收益入账和消费时, 判断金额是否合理, 并给出相应的提示.(过关斩将编程思想)
3.满一定额度的消费送积分, 每满二十元送一积分
public class SmallChangeSys {
//化繁为简
//1.先完成显示菜单, 并可以选择菜单, 给出对应选择信息
//2.完成零钱通明细
//3.完成收益入账
//4.完成消费
//5.用户输入4退出时, 给出提示"你确定要退出吗?( y/n)", 必须输入正确的y/n, 否则循环输入指令,直到输入y 或者 n.
//6.在收益入账和消费时, 判断金额是否合理, 并给出相应的提示.
//7.满一定额度的消费送积分, 每满二十元送一积分
//8.后台金额变量用long存储, 输入的double类型变量转为long类型 (long) (v * 100)
public static void main(String[] args) {
//定义相关的变量
boolean loop = true;
Scanner scanner = new Scanner(System.in);
String key = "";
Integer score = 0;
//2.完成零钱通明细
//思路:(1)可以把收益入账和消费, 保存到数组
// (2)也可以使用对象
// (3)使用String拼接
String details = "=================零钱通明细=================";
//3.完成收益入账
//思路: 定义新的变量, 存储收益入账, 交易时间, 余额
long money = 0;//收益入账
long balance = 0;//余额
Date tradeTime = null;//交易时间 引自 java.util.date
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
//4.消费
//思路: 定义新的变量, 存储消费金额
long consumption = 0;//消费金额
String note = "";//消费说明
do {
System.out.println("\n=================零钱通菜单=================");
System.out.println("\t\t\t\t1.零钱通明细");
System.out.println("\t\t\t\t2.收益入账");
System.out.println("\t\t\t\t3.消费");
System.out.println("\t\t\t\t4.退 出");
System.out.print("请选择(1-4): ");
key = scanner.next();
//使用switch分支控制
switch (key) {
case "1":
System.out.println(details);
break;
case "2":
System.out.print("收益入账金额: ");
money = (long) (scanner.nextDouble() * 100);
//做校验时, 要采用过五关斩六将的编程思想, 首先考虑不正确的情况
//不要考虑正确的情况, 否则变成了if-else嵌套
if (money <= 0) {//收益入账金额不能为0
System.out.println("收益入账金额应该大于0");
break;
}
//下面都是大于0的
balance += money;
tradeTime = new Date();
//拼接收益入账到details
details += "\n收益入账\t+" + ((double) money / 100) + "\t" + sdf.format(tradeTime) + "\t余额:" + ((double) balance / 100) + "\t积分:" + score;
break;
case "3":
while (true) {
System.out.print("消费金额: ");//如果消费金额格式不对, 一直要求输入正确的格式, 知道输入指定的格式
try {
consumption = (long) (scanner.nextDouble() * 100);
break;
} catch (Exception e) {
System.out.println("你应该输入消费金额");//输入的消费金额不对
scanner.next();//清空错误输入
}
}
//校验,过五关斩六将, 考虑不正确的情况
//判断, 如果消费金额<=0, 或者消费金额大于余额
if (consumption <= 0 || consumption > balance) {
System.out.println("消费金额要在 0-" + ((double) balance / 100) );
break;
}
System.out.print("消费原因: ");
note = scanner.next();
//每满二十元送一积分
long v = consumption / 2000;
score += (int) v;
balance -= consumption;
tradeTime = new Date();
//拼接消费信息到details
details += "\n" + note + "\t-" + ((double) consumption / 100) + "\t" + sdf.format(tradeTime) + "\t余额:" + ((double) balance / 100) + "\t积分:" + score;
break;
case "4":
//4.用户输入4退出时, 给出提示"你确定要退出吗?( y/n)", 必须输入正确的y/n, 否则循环输入指令,直到输入y 或者 n.
//思路分析
//(1)定义一个变量 choice, 接收用户的输入
//(2)使用 while+break, 来处理接收到的输入是 y 或 n
//(3)退出while后,再判断choice是y还是n, 再决定是否要退出
String choice = "";
while (true) {
System.out.print("你确定要退出吗?(y/n)");
choice = scanner.next();
if ("n".equals(choice) || "y".equals(choice)) {
break;
}
}
//当用户退出while后,再判断
if ("y".equals(choice)) {
loop = false;
}
break;
default:
System.out.println("输入有误, 请重新输入");
}
} while (loop);
}
}
3.将面向过程的代码修改成面向对象的方法, 编写src/com/zzw/smallchange/OOP/SmallChangeSysOOP.java
, 并使用SmallChangeSysApp.java
完成测试.