在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化优势就是功能模块化,易读性和后期维护性强

posted @ 2022-10-25 21:40  hanor  阅读(126)  评论(0编辑  收藏  举报