文章目錄
- 前言
- 一、項目開發流程說明
- 二、功能實現
- 2.1 菜單
- 2.2 零錢通明細
- 2.3 零錢通收益
- 2.4 零錢通消費
- 2.5 零錢通退出確認
- 2.6 零錢通金額校驗
- 2.7 完整代碼
- 三、零錢通OOP版
前言
本文是我跟著B站韓順平老師的 Java 教程學習時動手實現“零錢通”項目的學習筆記,主要用于記錄自己的學習過程,方便復習和鞏固
一、項目開發流程說明
- 項目需求說明
使用java開發零錢通項目,可以完成收益入賬,消費,查看明細,退出系統等功能
- 項目界面
- 項目代碼實現
編寫文件 SmallChangeSys.java 完成基本功能(過程編程)
我們先使用過程編程,后面改成OOP版本
- 項目代碼實現改進
在實現零錢通的基本功能后,我們還需要對項目代碼進行改進,例如:
(1)用戶輸入4退出時,給出提示信息“你確定要退出嗎?y/n”,必須輸入正確的 y/n,否則循環輸入指令,直到輸入 y 或者 n
(2)在 收益入賬 和 消費 時,判斷金額是否合理,并給出相應的提示
(3)將面向過程的代碼修改成面向對象的方法,編寫 SmallChangeSysOOP.java類,并使用 SmallChangeSysApp.java 完成測試
二、功能實現
2.1 菜單
我們首先先完成 【顯示菜單,并可以選擇】
思路:
1)打印菜單,因為我們希望用戶選擇菜單的某個選項之后還可以繼續選擇其他選項,所以我們使用do-while將菜單包起來,并定義一個布爾類型的變量 loop,默認為true,作為循環的條件
2)打印菜單后,用戶應該是可以選擇選項的,所以我們需要定義Scanner,用Scanner對象來接收用戶輸入的數據,并用 String 類型的變量 key 用來接收用戶輸入的字符串
3)用戶輸入選擇之后,我們需要判斷用戶的選擇,并完成相應的功能。我們這里使用 switch-case
當用戶輸入“退出”的對應的選項后,需要退出循環,所以我們需要將 loop 變量的值改為 false
package smallchange;import java.util.Scanner;public class SmallChangeSys {//1.先完成顯示菜單,并可以選擇菜單,給出對應的提示public static void main(String[] args) {//定義相關變量boolean loop = true;Scanner scanner = new Scanner(System.in);String key = "";do{System.out.println("-------------零錢通菜單--------------");System.out.println("\t\t\t1 零錢通明細");System.out.println("\t\t\t2 收益入賬");System.out.println("\t\t\t3 消費");System.out.println("\t\t\t4 退 出");System.out.print("請選擇(1-4):");key = scanner.next();//使用 switch 分支控制switch (key) {case "1":System.out.println("顯示零錢通明細");break;case "2":System.out.println("收益入賬");break;case "3":System.out.println("消費");break;case "4":System.out.println("退出");loop = false;break;default:System.out.println("選擇有誤,請重新輸入");}}while(loop);System.out.println("--------已退出零錢通項目---------");}
}
2.2 零錢通明細
接下來我們來完成零錢通明細,下面的三種方式都可以:
(1)可以把收益入賬和消費,保存到數組
(2)可以使用對象
(3)可以使用String拼接
我們這里使用第三種方式
//在main方法中定義details變量
String details = "-------------零錢通明細--------------";//...
case "1":System.out.println(details);break;
2.3 零錢通收益
首先需要定義三個變量
- 接收入賬的金額
- 入賬的時間
- 余額
入賬的時間我們這里用Date類型,但是由于默認的日期格式是國外的風格
所以我們還需要定義一個SimpleDateFormat對象,到時候用來把我們得到的日期格式化
double money = 0; // 入賬金額
double balance = 0; // 余額
Date date = null; // date 是 java.util.Date類型,表示日期
double money = 0;SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); // 可以用于日期格式化
然后完成零錢通收益的功能
- 接收用戶輸入的入賬金額并做檢驗(校驗部分我們后面再實現)
- 獲取當前日期
- 拼接到 details 字符串中
case "2":System.out.print("收益入賬金額:");money = scanner.nextDouble();//money 的值范圍應該校驗//...balance += money;//拼接收益入賬信息到 detailsdate = new Date(); // 獲取當前日期details += "\n收益入賬\t+" + money + "\t" + sdf.format(date) + "\t余額:" + balance;break;
2.4 零錢通消費
消費部分需要定義一個新變量,用來保存消費的原因
String note = "";
然后完成零錢通消費的功能
- 接收用戶輸入的消費金額和消費原因(校驗部分我們后面再實現)
- 對用戶輸入的金額進行校驗
- 獲取當前日期
- 拼接到 details 字符串中
case "3":System.out.print("消費金額:");money = scanner.nextDouble();System.out.print("消費說明:");note = scanner.next();//money 的值范圍應該校驗//...balance -= money;date = new Date();details += "\n" + note + "\t-" + money + "\t" + sdf.format(date) + "\t余額:" + balance;break;
2.5 零錢通退出確認
用戶輸入 4 退出時,給出提示信息“你確定要退出嗎?y/n”,必須輸入正確的 y/n,否則循環輸入指令,直到輸入 y 或者 n
思路分析
(1)定義一個變量 choice
(2)使用 while(true) 無限循環,直到輸入正確的 y 或 n 才break退出循環
(3)退出循環后,再判斷 choice 是 y 還是 n ,就可以決定是否退出
case "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("y".equals(choice)) {loop = false;
}
break;
2.6 零錢通金額校驗
在收益入賬消費時,判斷金額是否合理,并給出相應的提示
思路: 找出不正確的金額,然后給出提示
校驗收益金額是否合理:
//輸入收益金額后,校驗金額
if(money <= 0) {System.out.println("收益入賬失敗,收益金額需要大于 0");break;
}
校驗消費金額是否合理:
//輸入消費金額后,校驗金額
if(money <= 0 || money > balance) {System.out.println("你的消費金額應該在 0~" + balance);break;
}
2.7 完整代碼
package smallchange;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;public class SmallChangeSys {//1.先完成顯示菜單,并可以選擇菜單,給出對應的提示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 退 出");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 的值范圍應該校驗//思路:找出不正確的金額,然后給出提示if(money <= 0) {System.out.println("收益入賬失敗,收益金額需要大于 0");break;}balance += money;//拼接收益入賬信息到 detailsdate = new Date(); // 獲取當前日期details += "\n收益入賬\t+" + money + "\t" + sdf.format(date) + "\t余額:" + balance;break;case "3":System.out.print("消費金額:");money = scanner.nextDouble();System.out.print("消費說明:");note = scanner.next();//money 的值范圍應該校驗//思路:找出不正確的金額,然后給出提示if(money <= 0 || money > balance) {System.out.println("你的消費金額應該在 0~" + balance);break;}balance -= money;date = new Date();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(true) 無限循環,直到輸入正確的 y 或 n 才break退出循環
// (3)退出循環后,再判斷 choice 是 y 還是 n ,就可以決定是否退出String choice = "";while(true) { // 要求用戶必須輸入 y/n ,否則就一直循環System.out.println("你確定要退出嗎?y/n");choice = scanner.next();if("y".equals(choice) || "n".equals(choice)) {break;}}//當用戶退出while后,進行判斷if("y".equals(choice)) {loop = false;}break;default:System.out.println("選擇有誤,請重新輸入");}}while(loop);System.out.println("--------已退出零錢通項目---------");}
}
三、零錢通OOP版
將面向過程的代碼修改成面向對象的方法,編寫 SmallChangeSysOOP.java類,并使用 SmallChangeSysApp.java 完成測試
SmallChangeSysOOP.java類主要用于完成零錢通的各個功能,而SmallChangeSysApp.java 通過調用SmallChangeSysOOP.java中的相關方法,使用零錢通的功能,二者關系如下:
SmallChangeSysOOP.java 類中代碼如下:
package smallchange.oop;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;/*** 該類是完成零錢通的各個功能的類* 使用OOP(面向對象編程)* 將各個功能對應一個方法*/
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 退 出");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);}//完成零錢通明細public void detail() {System.out.println(details);}//完成收益入賬public void income() {System.out.print("收益入賬金額:");money = scanner.nextDouble();//money 的值范圍應該校驗//思路:找出不正確的金額,然后給出提示if(money <= 0) {System.out.println("收益入賬失敗,收益金額需要大于 0");return;}balance += money;//拼接收益入賬信息到 detailsdate = new Date(); // 獲取當前日期details += "\n收益入賬\t+" + money + "\t" + sdf.format(date) + "\t余額:" + balance;}//消費public void pay() {System.out.print("消費金額:");money = scanner.nextDouble();System.out.print("消費說明:");note = scanner.next();//money 的值范圍應該校驗//思路:找出不正確的金額,然后給出提示if(money <= 0 || money > balance) {System.out.println("你的消費金額應該在 0~" + balance);return;}balance -= money;date = new Date();details += "\n" + note + "\t-" + money + "\t" + sdf.format(date) + "\t余額:" + balance;}//退出public void exit() {String choice = "";while(true) { // 要求用戶必須輸入 y/n ,否則就一直循環System.out.println("你確定要退出嗎?y/n");choice = scanner.next();if("y".equals(choice) || "n".equals(choice)) {break;}}//當用戶退出while后,進行判斷if("y".equals(choice)) {loop = false;}}
}
SmallChangeSysApp.java 中的代碼如下
package smallchange.oop;/*** 這里我們直接調用 SmallChangeSysOOP 對象,顯示主菜單即可*/
public class smallChangeSysApp {public static void main(String[] args) {smallChangeSysOOP smallChangeSysOOP = new smallChangeSysOOP();smallChangeSysOOP.mainMenu();}
}