关于使用java语言进行零钱通的系统设计如下:
=========================================================================
设计有3个类
1) 钱包(wallet)类 : 其中含有的属性和函数如下
======== 属性
1) 余额(balance) double类型
2) 每次存入或支出金钱后的余额(surplus_balance) ArrayList类型
3)收入或支出的钱 (Money_Change) ArrayList类型
4)每次交易的时间 (Change_time) ArrayList类型
5)初始化时间,设置好要保存的时间格式
6)存入或支出金钱的次数 (subscript) int类型
======== 函数
1) 存入或支出钱 若支出钱时余额不足要提醒用户余额不足请及时充值
该函数还要求记录收入或消费时的时刻、收入或支出的钱、
每次交易后的额度
2)显示账户明细 将该账户中每次交易的额度、时间、每次所剩余额
显示出来
3)收益入账账单 将该账户中每次收益的额度和时间显示出来
4)消费账单 将该账户中每次消费的额度和时间显示出来
2) 菜单(Menu)类 :其中含有的属性和函数如下
========属性
1)菜单选择时所用的数字 (Menu_number)类
========函数
1)主菜单
2)账户明细菜单
3)根据主菜单提供的选项的选择服务
4)根据账户明细菜单的选项的选择服务
5)退出
3)应用实施(implement)类
========该类作为该零钱通的启动程序
=================================
所调用的包和类
1)java.util.Scanner 完成输入的操作
2)java.util.ArrayList 因为收入和支出可以是无限次的,所以要使用动态数组来记录每一次的交易
3)java.text.SimpleDateFormat 对于时间有格式要求,用来初始化时间
4)java.util.Date Date代表一个特定的瞬间,以毫秒级精度, 使用date()来获取系统的时间
=================================
代码如下:
========Menu类
import java.util.Scanner; public class Menu { // 菜单类 创建一个菜单 //包含 :(1) 菜单中选项的编号 // (2) 菜单的格式内容 // 输入 Scanner scanner = new Scanner(System.in); private int Menu_number; // 零钱通菜单 public void Show_Menu() { System.out.println("==========零钱通菜单=========="); System.out.println("\t 1 零钱通明细"); System.out.println("\t 2 收益入账"); System.out.println("\t 3 消费"); System.out.println("\t 4 返回主菜单"); System.out.println("\t 5 退出"); System.out.println("请选择(1 - 5)"); } // 系统菜单 public void Show_System_Menu() { System.out.println("===========主菜单============"); System.out.println("\t 1 存钱或支出"); System.out.println("\t 2 打开零钱通菜单"); System.out.println("\t 3 退出"); } //退出离开 public void exit() { System.out.println("请问你确定要离开吗?"); System.out.println("是的话输入数字0退出。"); System.out.println("不是的话输入数字1回到上一步菜单菜单"); // ? 该如何回到上一步呢 int number = scanner.nextInt(); switch(number) { case 0 : System.out.println("系统退出中。。。。。。。。。。"); System.exit(0); break; case 1 : return; //返回上一步 } } //选择程序 运用递归的思想 零钱通菜单 public void choice(int number, Wallet wallet) { switch(number) { case 1: wallet.Show_Account_details(); System.out.println("请进行你接下来的操作"); int s_number = scanner.nextInt(); choice(s_number, wallet); break; case 2: wallet.Show_Income_entry(); System.out.println("请进行你接下来的操作"); int s_number1 = scanner.nextInt(); choice(s_number1, wallet); break; case 3: wallet.Show_Consumption_expenditure(); System.out.println("请进行你接下来的操作"); int s_number2 = scanner.nextInt(); choice(s_number2, wallet); break; case 4: Show_System_Menu(); System.out.println("请进行你接下来的操作"); int s_number3 = scanner.nextInt(); choice_System(s_number3, wallet); break; case 5: exit(); System.out.println("请进行你接下来的操作"); int s_number4 = scanner.nextInt(); choice(s_number4, wallet); } } //选择程序 系统菜单 public void choice_System(int number, Wallet wallet) { switch(number) { case 1: wallet.change_balance(); System.out.println("请进行你接下来的操作"); int s_number = scanner.nextInt(); choice_System(s_number, wallet); break; case 2: Show_Menu(); int s_number2 = scanner.nextInt(); choice(s_number2, wallet); // 进入零钱通的选择了 break; case 3: exit(); System.out.println("请进行你接下来的操作"); int s_number3 = scanner.nextInt(); choice_System(s_number3, wallet); } } }
========Wallet类
import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Scanner; import java.util.Date; public class Wallet { Scanner scanner = new Scanner(System.in); // 余额及其所变换后的每个值 private double balance; private ArrayList surplus_balance = new ArrayList(); //每次变化后的余额 // 入账和支出 private ArrayList Money_Change = new ArrayList(); //下标 private int subscript = 0; // 金钱变换时间及其变化的时间 private SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒"); //格式化时间 private ArrayList Change_time = new ArrayList(); // 变化的时间 // 账户余额变动及其变动时间 // 若账户中余额不足 则提醒用户余额不足请及时充钱 public double change_balance() { //当前的时间 String time = sdf.format(new Date()); System.out.println("你冲入或支出的钱为多少?"); double money = scanner.nextDouble(); // 如果要消费支出且消费支出的钱多于用户的余额 则提醒该用户需要充钱了 if(money < 0 && Math.abs(money) > this.balance) { System.out.println("账户余额不足,请及时充值。"); System.out.println("返回主菜单 就输入 0"); System.out.println("充钱 就输入 1"); int a_number = scanner.nextInt(); switch(a_number) { case 0: Menu menu = new Menu(); menu.Show_System_Menu(); break; case 1: change_balance(); } } else { Money_Change.add(money); //将 改变的额度 保存 Change_time.add(time); //将此时的时间保存 balance += (double)Money_Change.get(subscript); //余额变增加或减少(强转为double类型) surplus_balance.add(balance); //增加或减少后的余额 subscript++; // 添加了一组数据 } return 1.0; // 随便返回一个值 } // 显示账户明细 public void Show_Account_details() { System.out.println("==========账户明细=========="); // 运用for循环把所有的账户更改信息显示出来 for (int i = 0; i < subscript; i++) { // 如果余额增加 Object change = Money_Change.get(i); if((double)change > 0) { System.out.println("收益入账:\t"+Money_Change.get(i)+"\t"+Change_time.get(i)+"\t余额为:"+surplus_balance.get(i)); } // 如果余额减少 else { System.out.println("支出消费:\t"+(double)Money_Change.get(i)+"\t"+Change_time.get(i)+"\t余额为:"+(double)surplus_balance.get(i)); } } } // 收益入账账单 public void Show_Income_entry() { System.out.println("以下为收益入账的账单"); // 如果余额增加 for (int i = 0; i < subscript; i++) { // 增加或减少的钱 Object add_Money = Money_Change.get(i); if((double)add_Money > 0) { System.out.println("收益入账:\t"+Money_Change.get(i)+"\t"+Change_time.get(i)); } // 如果余额减少 else continue; } } // 消费支出账单 public void Show_Consumption_expenditure() { System.out.println("以下为消费支出的账单"); // 如果余额减少 for (int i = 0; i < subscript; i++) { // 增加或减少的钱 Object reduce_Money = Money_Change.get(i); if((double)reduce_Money < 0) { System.out.println("消费支出:\t"+Money_Change.get(i)+"\t"+Change_time.get(i)); } // 如果余额减少 else continue; } } }
========implement类
import java.util.Scanner; public class implement { // 执行程序 public static void main(String[] args) { Menu menu = new Menu(); Wallet wallet = new Wallet(); Scanner input = new Scanner(System.in); menu.Show_System_Menu(); System.out.println("请选择你的操作。。。"); int number = input.nextInt(); menu.choice_System(number, wallet); } }
===================================
作者是一名大一学生,在编写程序时查找了大量资料,在此感谢诸多作者的指导。