【java】小練習--零錢通

文章目錄

  • 前言
  • 一、項目開發流程說明
  • 二、功能實現
    • 2.1 菜單
    • 2.2 零錢通明細
    • 2.3 零錢通收益
    • 2.4 零錢通消費
    • 2.5 零錢通退出確認
    • 2.6 零錢通金額校驗
    • 2.7 完整代碼
  • 三、零錢通OOP版

前言

本文是我跟著B站韓順平老師的 Java 教程學習時動手實現“零錢通”項目的學習筆記,主要用于記錄自己的學習過程,方便復習和鞏固

一、項目開發流程說明

  1. 項目需求說明

使用java開發零錢通項目,可以完成收益入賬,消費,查看明細,退出系統等功能

  1. 項目界面

在這里插入圖片描述

  1. 項目代碼實現

編寫文件 SmallChangeSys.java 完成基本功能(過程編程)

我們先使用過程編程,后面改成OOP版本

  1. 項目代碼實現改進

在實現零錢通的基本功能后,我們還需要對項目代碼進行改進,例如:

(1)用戶輸入4退出時,給出提示信息“你確定要退出嗎?y/n”,必須輸入正確的 y/n,否則循環輸入指令,直到輸入 y 或者 n

(2)在 收益入賬 和 消費 時,判斷金額是否合理,并給出相應的提示

(3)將面向過程的代碼修改成面向對象的方法,編寫 SmallChangeSysOOP.java類,并使用 SmallChangeSysApp.java 完成測試

二、功能實現

2.1 菜單

我們首先先完成 【顯示菜單,并可以選擇】

img

思路:

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 零錢通收益

img

首先需要定義三個變量

  1. 接收入賬的金額
  2. 入賬的時間
  3. 余額

入賬的時間我們這里用Date類型,但是由于默認的日期格式是國外的風格

img

所以我們還需要定義一個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"); // 可以用于日期格式化

然后完成零錢通收益的功能

  1. 接收用戶輸入的入賬金額并做檢驗(校驗部分我們后面再實現)
  2. 獲取當前日期
  3. 拼接到 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 = "";

然后完成零錢通消費的功能

  1. 接收用戶輸入的消費金額和消費原因(校驗部分我們后面再實現)
  2. 對用戶輸入的金額進行校驗
  3. 獲取當前日期
  4. 拼接到 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中的相關方法,使用零錢通的功能,二者關系如下:

img

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();}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/82422.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82422.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/82422.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

人工智能數學基礎實驗(四):最大似然估計的-AI 模型訓練與參數優化

一、實驗目的 理解最大似然估計&#xff08;MLE&#xff09;原理&#xff1a;掌握通過最大化數據出現概率估計模型參數的核心思想。實現 MLE 與 AI 模型結合&#xff1a;使用 MLE 手動估計樸素貝葉斯模型參數&#xff0c;并與 Scikit-learn 內置模型對比&#xff0c;深入理解參…

我的第1個爬蟲程序——豆瓣Top250爬蟲的詳細步驟指南

我的第1個爬蟲程序——豆瓣Top250爬蟲的詳細步驟指南 一、創建隔離開發環境 1. 使用虛擬環境&#xff08;推薦venv&#xff09; # 在項目目錄打開終端執行 python -m venv douban_env # 創建虛擬環境 source douban_env/bin/activate # Linux/macOS激活 douban_env\Scri…

STM32八股【11】-----Linux Bootloader (U-Boot)

參考U-Boot U-Boot是什么 嵌入式Linux系統需要一個bootloader來加載系統 U-boot就是一個通用開源的嵌入式Linux bootloader 主要實現的功能&#xff1a; 初始化硬件資源&#xff08;如內存、串口、存儲器等&#xff09;從存儲介質加載Linux內核到內存中傳遞啟動參數給內核啟…

【設計模式】責任鏈+模板+工程模式使用模板

前言 方便寫出優雅&#xff0c;解耦&#xff0c;高內聚&#xff0c;高復用的代碼。 Demo // 1. 定義驗證器接口&#xff08;責任鏈模式&#xff09; public interface Validator {Validator setNext(Validator next);boolean validate(Data data); }// 2. 創建抽象驗證器&am…

Unity3D仿星露谷物語開發49之創建云杉樹

1、目標 創建一顆既可以生長又可以砍伐的云杉樹&#xff0c;這個和之前創建橡樹類似。 2、創建云杉樹預制體 創建新物體命名為CropTreeBlueSpruce&#xff0c;并且添加Box Collider 2D和Crop組件。 在CropTreeBlueSpruce下創建子物體命名為CropSprite&#xff0c;添加3個組件…

【C#】消息隊列的使用

在C#中使用消息隊列&#xff0c;通常是指使用微軟的Message Queuing (MSMQ)技術。MSMQ提供了一種異步通信協議&#xff0c;允許應用程序通過暫時存儲要發送到目的地的消息來相互通信。 安裝MSMQ 首先&#xff0c;確保你的開發機器和部署服務器上都安裝了MSMQ。可以通過“控制…

IP-guard發布新版本4.87.2241.0

IP-guard發布新版本4.87.2241.0 新版本下載地址: https://www.tec-development.com/down/IPguard/Release/V4/IPguard4.87.2241.0.zip?s=901D45ADB22CBBFE5C612DC40AFD6BFB1551A9CD54EF418D5E86BBD256813867 新版本升級地址:

【Linux 服務器磁盤映像備份與恢復實戰指南】虛擬機備份,物理機上云都可以用這套方案!

Linux 服務器磁盤映像備份與恢復實戰指南 背景 在服務器運維中&#xff0c;磁盤健康度下降可能導致數據丟失風險&#xff0c;特別是在未配置 RAID 的情況下。針對這種情況&#xff0c;備份磁盤數據并恢復到新設備是確保數據安全的關鍵。本文記錄了使用 dd 命令通過 NFS 實現全…

深入理解 Linux 的 set、env 和 printenv 命令

在 Linux 和類 Unix 系統中&#xff0c;環境變量是配置和管理 Shell 及進程行為的核心機制。set、env 和 printenv 是與環境變量交互的三個重要命令&#xff0c;每個命令都有其獨特的功能和用途。本文將詳細探討這三個命令的區別&#xff0c;幫助大家更好地理解和使用這些命令。…

icexmoon-tree

icexmoon-tree 一個輕量級的 Java 工具庫&#xff0c;提供樹形結構操作功能。 安裝 <dependency><groupId>cn.icexmoon</groupId><artifactId>icexmoon-tree</artifactId><version>1.0.0</version> </dependency>使用 構建…

機器學習在智能水泥基復合材料中的應用與實踐

“機器學習在智能水泥基復合材料中的應用與實踐” 課程 內容 機器學習基礎模型與復合材料研究融合 機器學習在復合材料中的應用概述機器學習用于復合材料研究的流程復合材料數據收集與數據預處理 實例&#xff1a;數據的收集和預處理 復合材料機器學習特征工程與選擇 實例&a…

微軟 Build 2025:開啟 AI 智能體時代的產業革命

在 2025 年 5 月 19 日的微軟 Build 開發者大會上&#xff0c;薩提亞?納德拉以 "我們已進入 AI 智能體時代" 的宣言&#xff0c;正式拉開了人工智能發展的新紀元。這場匯聚了奧特曼、黃仁勛、馬斯克三位科技領袖的盛會&#xff0c;不僅發布了 50 余項創新產品&#…

[Java惡補day6] 15. 三數之和

給你一個整數數組 nums &#xff0c;判斷是否存在三元組 [nums[i], nums[j], nums[k]] 滿足 i ! j、i ! k 且 j ! k &#xff0c;同時還滿足 nums[i] nums[j] nums[k] 0 。請你返回所有和為 0 且不重復的三元組。 注意&#xff1a;答案中不可以包含重復的三元組。 示例 1&a…

《黃帝內經》數學建模與形式化表征方式的重構

黃帝內經的數學概括&#xff1a;《黃帝內經》數學建模與形式化表征方式的重構 摘要&#xff1a;《黃帝內經》通過現代數學理論如動力系統、代數拓撲和隨機過程&#xff0c;被重構為一個形式化的人體健康模型。該模型包括陰陽動力學的微分幾何、五行代數的李群結構、經絡拓撲與同…

理論篇五:如何優化Webpack的打包速度

優化 Webpack 打包速度是提升前端開發效率的關鍵。以下是 10 種核心優化策略,涵蓋開發和生產環境,附帶具體配置和實測效果對比: 一、縮小文件搜索范圍 1. 指定解析路徑(Resolve) resolve: {extensions: [.js, .jsx],

[Windows] 游戲常用運行庫- Game Runtime Libraries Package(6.2.25.0409)

游戲常用運行庫 合集 整合了許多游戲會用到的運行庫&#xff0c;支持 Windows XP – Windows 11 系統&#xff0c;并且支持自動檢測系統勾選推薦的運行庫&#xff0c;方便快捷。 本版特點&#xff1a; By&#xff1a;mefcl 整合常見最新游戲所需運行庫 根據系統自動勾選推薦…

JDK8中的 Stream流式編程用法優化(工具類在文章最后)

Java從JDK8起提供了Stream流這個功能&#xff0c;于是項目里出現了大量基于Stream流的寫法。隨著項目的進行&#xff0c;慢慢的代碼中鋪天蓋地的都是下面的寫法&#xff1a; List<User> userList null;if (condition) {userList new ArrayList<>();userList.add(…

uni-app學習筆記十二-vue3中組件傳值(對象傳值)

一.單對象傳值 父組件定義對象的值 <template><view><UserInfo :obj"userinfo"></UserInfo></view> </template><script setup>import {ref} from "vue"const userinfo ref({name:"蛛兒",avatar:&…

UV-python環境管理工具 入門教程

在學習使用 MCP 的時候接觸到了 UV 這個環境管理工具&#xff0c;經過對比&#xff0c;發現它在諸多方面比 venv、conda 等工具更為出色&#xff0c;因此整理了這份簡單的入門學習筆記&#xff0c;希望能幫助大家快速上手。 介紹 UV 是一款集 Python 版本管理、虛擬環境創建與…

【漫話機器學習系列】277.梯度裁剪(Gradient Clipping)

【深度學習】什么是梯度裁剪&#xff08;Gradient Clipping&#xff09;&#xff1f;一張圖徹底搞懂&#xff01; 在訓練深度神經網絡&#xff0c;尤其是 RNN、LSTM、Transformer 這類深層結構時&#xff0c;你是否遇到過以下情況&#xff1a; 模型 loss 突然變成 NaN&#xf…