写在前面
满打满算,学习韩老师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
大概功能是没问题了,哈哈哈,收工。