在JAVA环境下实现零钱通功能
在JAVA环境下实现零钱通功能
项目需求说明
使用Java开发零钱通项目,可以完成收益入账,消费,查看明细,退出系统等功能
项目界面
A. 定义相关的变量
a. 定义一个boolean类型的变量,变量名为loop,来判断菜单是否循环显示
b. 定义一个Scanner类型的变量,变量名为scanner,实现输入功能
c. 定义一个String类型的变量,变量名为key,初始化为空,来实现用户的需求或者选择
boolean loop = true;
Scanner scanner = new Scanner(System.in);
String key = "";
B. 界面显示
需用用到do-while来循环显示菜单
a.代码如下
do {
System.out.println("\n---------零钱通菜单---------");
System.out.println("\t\t\t1 零钱通明细");
System.out.println("\t\t\t2 收益入账");
System.out.println("\t\t\t3 消费");
System.out.println("\t\t\t4 退\t\t\t出");
System.out.print("请选择(1-4):");
//后面就是写选择功能代码
}while(loop);
项目功能
功能分为:
1、零钱通明细
2、收益入账
3、消费
4、退出
5、输入有误
实现选择功能是通过switch来实现的,使用到key变量来判断用户选择的功能
key = "1",实现零钱通明细
key = "2",实现收益入帐
key = "3",实现消费
key = "4",实现退出零钱通
功能1:零钱通明细
思路:
(1)可以把收益入账和消费,保存到数组
(2)可以使用对象
(3)简单的话可以使用String拼接
在此也是使用第三种思路
代码如下:
String details = "-------------零钱通明细--------------";
System.out.println(details);
break;
功能2:收益入账
1、定义新的变量
a.定义一个double类型的变量,变量名为money,来记录用户输入的金额
b.定义一个double类型的变量,变量名为balance,来记录用户的余额
c.定义一个java.util.Date类型的变量,变量名为date 来表示时间
d.定义一个java.text.SimpleDateFormat类型的变量,变量名为sdf 可以用于日期格式化
代码如下:
double money = 0;
double balance =0;
Date date = null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
2、功能实现
a.先输出“收益入账金额:”,并且用户输入收益入账金额
b.再来判断输入的金额是否满足要求,进行校验
c.如果金额不满足大于零则会提示“收益入账金额 需要 大于 0”,并且退出该功能
d.如果满足要求则会把收益入账金额记录在余额中,并且获取当前时间
e.最后拼接收益入账信息到 details 并且退出该功能
代码如下:
System.out.print("收益入账金额:");
money = scanner.nextDouble();
if (money <= 0 ) {
System.out.println("收益入账金额 需要 大于 0");
break;
}
balance += money;
date = new Date();
details +="\n收益入账\t+" + money + "\t" +sdf.format(date) + "\t" + balance;
break;
功能3:消费
1、定义新变量
定义一个String类型的变量,变量名为node,来保存消费原因
代码如下:
String note = "";
2、功能实现
a.先输出“消费金额:”,并且用户输入消费金额
b.再来判断输入的金额是否满足要求,进行校验
c.如果金额不满足大于零或者小于余额则会提示“你的消费金额 需要在 0-余额”,并且退出该功能
d.如果满足要求则会在输出“消费说明:”,用户输入消费说明,并且把余额减去消费金额,并且获取当前时间
e.最后拼接收益入账信息到 details 并且退出该功能
代码如下:
System.out.print("消费金额:");
money = scanner.nextDouble();
if (money <= 0 || money > balance ) {
System.out.println("你的消费金额 需要在 0-" + balance);
break;
}
System.out.print("消费说明:");
note = scanner.next();
balance -= money;
date = new Date();
details +="\n" + note + "\t-" + money + "\t" +sdf.format(date) + "\t" + balance;
break;
功能4:退出
1、定义新的变量
定义一个String类型的变量,变量名为choice,接受用户的输入
代码如下:
String choice = "";
2、功能实现:用户输入4退出时,给出提示“你确定要退出吗? y/n”,必须输入正确的y/n,否则循环输入指令,直到输入y 或者 n
a.用while要求用户必须输入y/n,否则就一直循环
b.退出while后,在判断choice是y还是n,就可以决定是否退出
c.建议一段代码,完成一个小功能,尽量不要混在一起
代码如下:
while (true) {
System.out.println("你确定要退出吗? y/n");
choice = scanner.next();
if ("y".equals(choice) || "n".equals(choice)) {
break;
}
}
if (choice.equals("y")) {
loop = false;
}
break;
功能5:输入有误
当用户输入数据有误会提示用户“选择有误,请重新选择”
代码如下:
System.out.println("选择有误,请重新选择");
项目代码
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class SmallChangeSys {
// 化繁为简
// 1、先完成显示菜单,并可以选择菜单,给出对应提示
// 2、 完成零钱通明细
// 3、 完成收益入账
// 4、 消费
// 5、 退出
// 6、 用户输入4退出时,给出提示“你确定要退出吗? y/n”,必须输入正确的y/n,否则循环输入指令,直到输入y 或者 n
// 7、 在收益入账和消费时,判断金额是否合理,并给出相应的提示
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"); // 可以用于日期格式化
// 4. 消费
// 定义新变量,保存消费的原因
String note = "";
do {
System.out.println("\n---------零钱通菜单---------");
System.out.println("\t\t\t1 零钱通明细");
System.out.println("\t\t\t2 收益入账");
System.out.println("\t\t\t3 消费");
System.out.println("\t\t\t4 退\t\t\t出");
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 的值范围应该校验
// 思路:编程思想
// 找出不正确的金额条件,然后给出提示即可,就直接break
if (money <= 0 ) {
System.out.println("收益入账金额 需要 大于 0");
break;
}
balance += money;
date = new Date(); //获取当前日期
// 拼接收益入账信息到 details
details +="\n收益入账\t+" + money + "\t" +sdf.format(date) + "\t" + balance;
break;
case "3" :
System.out.print("消费金额:");
money = scanner.nextDouble();
// 找出金额不正确的情况
if (money <= 0 || money > balance ) {
System.out.println("你的消费金额 需要在 0-" + balance);
break;
}
System.out.print("消费说明:");
note = scanner.next();
balance -= money;
date = new Date(); //获取当前日期
// 拼接消费信息到 details
details +="\n" + note + "\t-" + money + "\t" +sdf.format(date) + "\t" + balance;
break;
case "4" :
// 用户输入4退出时,给出提示“你确定要退出吗? y/n”,必须输入正确的y/n,否则循环输入指令,直到输入y 或者 n
// 思路分析
// (1) 定义一个变量 choice,接受用户的输入
//(2)使用while + break,来处理接收到的输入时y 或者 n
// (3) 退出while后,在判断choice是y还是n,就可以决定是否退出
// (4) 建议一段代码,完成一个小功能,尽量不要混在一起
String choice = "";
while (true) { // 要求用户必须输入y/n,否则就一直循环
System.out.println("你确定要退出吗? y/n");
choice = scanner.next();
if ("y".equals(choice) || "n".equals(choice)) {
break;
}
}
// 当用户退出while ,进行判断
if (choice.equals("y")) {
loop = false;
}
break;
default:
System.out.println("选择有误,请重新选择");
}
}while(loop);
System.out.println("------退出了零钱通------");
}
}
项目升级版(OOP版)
创建一个SmallChangeSysOOP类,该类是完成零钱通的各个功能的类,将各个功能对应一个方法
功能实现如上
SmallChangeSysOOP类代码如下
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class SmallChangeSysOOP {
// 定义相关的变量
boolean loop = true;
Scanner scanner = new Scanner(System.in);
String key = "";
String details = "-------------零钱通明细--------------";
double money = 0; //金额
double balance =0; //余额
Date date = null; // date 是 java.util.Date 类型,表示日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); // 可以用于日期格式化
String note = ""; // 保存消费的原因
// 先完成显示菜单,并可以选择
public void mainMenu() {
do {
System.out.println("\n---------零钱通菜单---------");
System.out.println("\t\t\t1 零钱通明细");
System.out.println("\t\t\t2 收益入账");
System.out.println("\t\t\t3 消费");
System.out.println("\t\t\t4 退\t\t\t出");
System.out.print("请选择(1-4):");
key = scanner.next();
// 使用switch 分支控制
switch (key) {
case "1" :
this.detail();
break;
case "2" :
this.income();
break;
case "3" :
this.pay();
break;
case "4" :
this.exit();
break;
default:
System.out.println("选择有误,请重新选择");
}
}while(loop);
}
// 2、 完成零钱通明细
public void detail() {
System.out.println(details);
}
// 3、 完成收益入账
public void income() {
System.out.print("收益入账金额:");
money = scanner.nextDouble(); // money 的值范围应该校验
// 思路:编程思想
// 找出不正确的金额条件,然后给出提示即可,就直接return
if (money <= 0 ) {
System.out.println("收益入账金额 需要 大于 0");
return; //退出方法,不再执行后面的代码
}
balance += money;
date = new Date(); //获取当前日期
// 拼接收益入账信息到 details
details +="\n收益入账\t+" + money + "\t" +sdf.format(date) + "\t" + balance;
}
// 4、 消费
public void pay() {
System.out.print("消费金额:");
money = scanner.nextDouble();
// 找出金额不正确的情况
if (money <= 0 || money > balance ) {
System.out.println("你的消费金额 需要在 0-" + balance);
return;
}
System.out.print("消费说明:");
note = scanner.next();
balance -= money;
date = new Date(); //获取当前日期
// 拼接消费信息到 details
details +="\n" + note + "\t-" + money + "\t" +sdf.format(date) + "\t" + balance;
}
// 5、 退出
public void exit() {
// 用户输入4退出时,给出提示“你确定要退出吗? y/n”,必须输入正确的y/n,否则循环输入指令,直到输入y 或者 n
// 思路分析
// (1) 定义一个变量 choice,接受用户的输入
//(2)使用while + break,来处理接收到的输入时y 或者 n
// (3) 退出while后,在判断choice是y还是n,就可以决定是否退出
// (4) 建议一段代码,完成一个小功能,尽量不要混在一起
String choice = "";
while (true) { // 要求用户必须输入y/n,否则就一直循环
System.out.println("你确定要退出吗? y/n");
choice = scanner.next();
if ("y".equals(choice) || "n".equals(choice)) {
break;
}
}
// 当用户退出while ,进行判断
if (choice.equals("y")) {
loop = false;
}
}
}
创建一个SmallChangeSysApp类,该类是测试零钱通各个功能 这里我们直接调用 SmallChangeSysOOP 对象,显示主菜单即可
代码如下
public class SmallChangeSysApp {
public static void main(String[] args) {
new SmallChangeSysOOP().mainMenu();
}
}
OOP化优势就是功能模块化,易读性和后期维护性强