Java 零钱通项目

 写在前面

满打满算,学习韩老师Java视频已经有一个月了,现在也算碰到了第三个案例,因为我是先做,再看视频解析,前面几个案例写得还是挺磕磕绊绊的。经过这么长时间,这个案例做得还挺顺利的,所在这里记录一下,写个博客。说到这了,也给我心爱的韩老师打个广告吧。韩老师的视频是真的很细,同时我也在准备软考,大致看了一下韩老师后面的内容,感觉如果认真学完,基础比较牢靠,软考还是比较容易的。同时我也了解到我之前学得是多么地粗糙,基础太差了,以至于软考把握不是很大,如果有机会我还是很想好好补补基础知识。

一、简介 

此项目为零钱通,使用Java实现零钱通的一些基本功能。基本功能模块有四个,零钱通明细,收益入账、消费支出、退出。拟打算设计三个类,一个类实现测试,一个类实现功能模块,一个类利用对象数组储存数据。

二、储存数据类的实现(class Turnover

一个用户,零钱通里面的数据流只有流水,采用一个对象代表一条流水。成员变量有流水类型(收益/消费),流水,余额。流水类型当中收益用1表示,0表示无数据,-1代表消费

int type;     //流水类型
double income;     //流水
double balance;     //余额

接下来就是构造函数,构造函数可以用idea的alt+ins快速插入构造函数。

 public Turnover(int type, double income, double balance) {      //构造函数
        this.type = type;
        this.income = income;
        this.balance = balance;
    }

然后再写一条语句,便于把数据组合起来打印在界面上。

public String toString() {
        if(type == 1){
            return "收益" + "\t+" + income + "\t余额:" + balance;
        }else if(type == -1){
            return "支出" + "\t+" + income + "\t余额:" + balance;
        }
        return "您此数据输入有误";
    }

到这里,储存数据的类就设计好了,还是挺简单的。

三、功能类的实现(包括界面的打印)

1、初始化

利用数据储存的类实例化一个对象数组,数组大小为10,代表最多可以记录十条流水,并在构造函数里面对数组进行初始化,将流水类型设置为0。

private double balance;
    Turnover turnover[] = new Turnover[10];     //最多储存10个数据

    public Account(double balance) {        //初始化
        for (int i = 0; i < turnover.length; i++) {
            turnover[i] = new Turnover(0,0.0,0.0);
        }
        this.balance = balance;
    }

2、主函数

先利用一个标题打印函数,快速打印一个有点像样子的标题,函数如下。

 public void printtitle(String string){      //打印标题
        for (int i = 0; i < 10; i++) {
            System.out.print("-");
        }
        System.out.print(string);
        for (int i = 0; i < 10; i++) {
            System.out.print("-");
        }
        System.out.println("");
    }

再打印一个界面出来

printtitle("零钱通菜单");

System.out.println("\t\t" + "1 零钱通明细");     //界面打印
System.out.println("\t\t2 收益入账");
System.out.println("\t\t3 消费支出");
System.out.println("\t\t4 退出");

然后再定义一个模块变量module,获取用户输入的模块

int module;     //输入模块,模块1明细,模块2收益,模块3支出,模块4退出
System.out.print("请选择(1-4):");
module = scanner.nextInt();

由用户输入的模块选择进入哪一个分支,利用递归调用间接实现退出功能。

if(module == 4){
   return;
}else if(module == 1){      //打印流水
   print(turnover);
   this.initialize();
}else if(module == 2 || module ==3){        //记录流水
   insert(module);
   this.initialize();
}else{
   System.out.println("您输入的有误");
   this.initialize();
}

3、零钱通明细(打印流水)

这部分主要是将数组里面的数据打印出来,调用数据储存类里面的toString方法就行了。

public void print(Turnover turnover[]){     //打印流水
        printtitle("零钱通明细");
        for (int i = 0; i < turnover.length; i++) {
            if(turnover[i].type == 1 || turnover[i].type == -1){
                System.out.println(turnover[i].toString());
            }else{
                break;
            }
        }
    }

4、消费、收益(插入流水)

这部分是最复制的一部分,大概流程是找到插入的位置,并获取用户当前余额,利用流水计算出余额,如果数组满了,还要将数组整体往前移一个位置,空出最后一个位置供插入。弄完这个差不多收工了睡觉了,哈哈哈哈,就不多说了,直接放代码。

public void insert(int module){      //插入流水
        double income = 0;
        double balance = 0;
        int i = 0;
        if(turnover[0].type == 0){      //获取计入流水前余额,并用i记录插入位置
            balance = this.balance;
        }else{
            for (i = 0; i < turnover.length; i++) {
                if(turnover[i].type == 0){
                    break;
                }
            }
            balance = turnover[i - 1].balance;
        }

        if(module == 2){        //income流水获取
            printtitle("收益入账");
            System.out.print("请输入收益:");
            income = scanner.nextDouble();
            balance += income;
        }else if(module == 3){
            printtitle("消费支出");
            System.out.print("请输入支出:");
            income = scanner.nextDouble();
            balance -= income;
            income = -income;
        }

        if(i == turnover.length){       //如果流水数据已满,则删除第一个数据
            for (int j = 0; j < i - 1 ; j++) {
                turnover[j] = turnover[j + 1];
            }
            i = turnover.length - 1;
        }

        if(module == 2) turnover[i].type = 1;       //录入数组
        if(module == 3) turnover[i].type = -1;
        turnover[i].income = income;
        turnover[i].balance = balance;
    }

三、测试类

最后一部分就是测试一下这个类了,代码及界面如下。

public class ChangPass {
    public static void main(String[] args) {
        Account account = new Account(5);
        account.initialize();
    }
}

----------零钱通菜单----------
        1 零钱通明细
        2 收益入账
        3 消费支出
        4 退出
请选择(1-4):

输入2结果为:

----------收益入账----------
请输入收益:

再次输入45返回菜单,返回菜单后输入1查看明细结果为:

----------零钱通明细----------
收益    +45.0    余额:50.0

大概功能是没问题了,哈哈哈,收工。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

软考准备ing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值