Go-家庭收支記賬軟件項(xiàng)目實(shí)現(xiàn)
項(xiàng)目開發(fā)流程說明
項(xiàng)目需求說明
模擬實(shí)現(xiàn)基于文本界面的《家庭記賬軟件》該軟件能夠記錄家庭的收入、支出,并能夠打印收支明細(xì)表
項(xiàng)目的界面
項(xiàng)目代碼實(shí)現(xiàn)
實(shí)現(xiàn)基本功能(先使用面向過程,后面改成面向?qū)ο?
功能 1:先完成可以顯示主菜單,并且可以退出
思路分析:
根據(jù)給出的界面完成,主菜單的顯示, 當(dāng)用戶輸入 4時(shí),就退出該程序
走代碼:
package main import "fmt" func main(){ key := "" loop := true for{ fmt.Println("-------------------家庭收支記賬軟件-------------------") fmt.Println(" 1 收支明細(xì)") fmt.Println(" 2 登記收入") fmt.Println(" 3 登記支出") fmt.Println(" 4 退出軟件") fmt.Print("請(qǐng)選擇(1-4):") fmt.Scanln(&key) switch key { case "1": fmt.Println("-------------------當(dāng)前收支明細(xì)-------------------") case "2": fmt.Println(" 登記收入") case "3": fmt.Println(" 登記支出") case "4": loop = false default: fmt.Println("請(qǐng)輸入正確的選項(xiàng)!") } if !loop{ break } } fmt.Println("退出該軟件!") }
功能 2:完成可以顯示明細(xì)和登記收入的功能
思路分析:
因?yàn)樾枰@示明細(xì),我們定義一個(gè)變量 details string 來記錄還需要定義變量來記錄余額(balance)、每次收支的金額(money), 每次收支的說明(note)
package main import "fmt" func main() { key := "" loop := true balance := 10000.0 money := 0.0 note := "" details := "收支\t賬戶金額\t收支金額\t說 明" for { fmt.Println("-------------------家庭收支記賬軟件-------------------") fmt.Println(" 1 收支明細(xì)") fmt.Println(" 2 登記收入") fmt.Println(" 3 登記支出") fmt.Println(" 4 退出軟件") fmt.Print("請(qǐng)選擇(1-4):") fmt.Scanln(&key) switch key { case "1": fmt.Println("-------------------當(dāng)前收支明細(xì)-------------------") fmt.Println(details) case "2": fmt.Println("本次收入金額:") fmt.Scanln(&money) balance += money fmt.Println("本次收入說明") fmt.Scanln(¬e) details += fmt.Sprintf("\n收入\t %v \t %v \t \t %v", balance, money, note) fmt.Println(" 登記收入") case "3": fmt.Println(" 登記支出") case "4": loop = false default: fmt.Println("請(qǐng)輸入正確的選項(xiàng)!") } if !loop { break } } fmt.Println("退出該軟件!") }
功能 3:完成了登記支出的功能
思路分析:
登記支出的功能和登錄收入的功能類似,做些修改即可
走代碼:
package main import "fmt" loop:=true balance := 10000.0 money := 0.0 note := "" details := "收支\t賬戶金額\t收支金額\t說 明" for { fmt.Println("-------------------家庭收支記賬軟件-------------------") fmt.Println(" 1 收支明細(xì)") fmt.Println(" 2 登記收入") fmt.Println(" 3 登記支出") fmt.Println(" 4 退出軟件") fmt.Print("請(qǐng)選擇(1-4):") fmt.Scanln(&key) switch key { case "1": fmt.Println("-------------------當(dāng)前收支明細(xì)-------------------") fmt.Println(details) case "2": fmt.Println("本次收入金額:") fmt.Scanln(&money) balance += money fmt.Println("本次收入說明") fmt.Scanln(¬e) details += fmt.Sprintf("\n收入\t %v \t %v \t \t %v", balance, money, note) fmt.Println(" 登記收入") case "3": fmt.Println("本次支出金額:") fmt.Scanln(&money) balance -= money fmt.Println("本次支出說明") fmt.Scanln(¬e) details += fmt.Sprintf("\n支出\t %v \t %v \t \t %v", balance, money, note) fmt.Println(" 登記支出") case "4": loop = false default: fmt.Println("請(qǐng)輸入正確的選項(xiàng)!") } if !loop { break } } fmt.Println("退出該軟件!")
項(xiàng)目代碼實(shí)現(xiàn)改進(jìn)
#### 12.4.2 項(xiàng)目代碼實(shí)現(xiàn)改進(jìn) 1) 用戶輸入 4 退出時(shí),給出提示"你確定要退出嗎? y/n",必須輸入正確的 y/n ,否則循環(huán)輸入指 令,直到輸入 y 或者 n  2) 當(dāng)沒有任何收支明細(xì)時(shí),提示 "當(dāng)前沒有收支明細(xì)... 來一筆吧!"  3) 在支出時(shí),判斷余額是否夠,并給出相應(yīng)的提示  ````go package main import "fmt" func main() { key := "" loop := true balance := 10000.0 money := 0.0 note := "" flag := false details := "收支\t賬戶金額\t收支金額\t說 明" for { fmt.Println("-------------------家庭收支記賬軟件-------------------") fmt.Println(" 1 收支明細(xì)") fmt.Println(" 2 登記收入") fmt.Println(" 3 登記支出") fmt.Println(" 4 退出軟件") fmt.Print("請(qǐng)選擇(1-4):") fmt.Scanln(&key) switch key { case "1": fmt.Println("-------------------當(dāng)前收支明細(xì)-------------------") if flag { fmt.Println(details) } else { fmt.Println("當(dāng)前沒有明細(xì),來一筆吧!") } fmt.Println(details) case "2": fmt.Println("本次收入金額:") fmt.Scanln(&money) balance += money fmt.Println("本次收入說明") fmt.Scanln(¬e) details += fmt.Sprintf("\n收入\t %v \t %v \t \t %v", balance, money, note) fmt.Println(" 登記收入") flag = true case "3": fmt.Println("本次支出金額:") fmt.Scanln(&money) if money>balance{ fmt.Println("余額的金額不足!") break } balance -= money fmt.Println("本次支出說明") fmt.Scanln(¬e) details += fmt.Sprintf("\n支出\t %v \t %v \t \t %v", balance, money, note) fmt.Println(" 登記支出") flag = true case "4": fmt.Println("你確定要退出嗎?y/n") choice := "" for { fmt.Scanln(&choice) if choice == "y" || choice == "n" { break } fmt.Println("你的輸入有誤,請(qǐng)重新輸入y/n") } if choice == "y" { loop = false } default: fmt.Println("請(qǐng)輸入正確的選項(xiàng)!") } if !loop { break } } fmt.Println("退出該軟件!") }
將 面 向 過 程 的 代 碼 修 改 成 面 向 對(duì) 象 的 方 法 , 編 寫 myFamilyAccount.go , 并 使 用 testMyFamilyAccount.go 去完成測試
思路分析:
把記賬軟件的功能,封裝到一個(gè)結(jié)構(gòu)體中,然后調(diào)用該結(jié)構(gòu)體的方法,來實(shí)現(xiàn)記賬,顯示明細(xì)。
結(jié)構(gòu)體的名字 FamilyAccount .
在通過在 main方法中,創(chuàng)建一個(gè)結(jié)構(gòu)體 FamilyAccount 實(shí)例,實(shí)現(xiàn)記賬即可.
model
package model import "fmt" type FamilyAccount struct { key string loop bool money float64 balance float64 note string flag bool details string } func NewFamilyAccount() *FamilyAccount { return &FamilyAccount{ key: "", loop: true, money: 0.0, balance: 0.0, note: "", flag: false, details: "收支\t賬戶金額\t收支金額\t說 明", } } func (this *FamilyAccount) showDetails() { fmt.Println("-------------------當(dāng)前收支明細(xì)-------------------") if this.flag { fmt.Println(this.details) } else { fmt.Println("當(dāng)前沒有明細(xì),來一筆吧!") } fmt.Println(this.details) } func (this *FamilyAccount) income() { fmt.Println("本次收入金額:") fmt.Scanln(&this.money) this.balance += this.money fmt.Println("本次收入說明") fmt.Scanln(&this.note) this.details += fmt.Sprintf("\n收入\t %v \t %v \t \t %v", this.balance, this.money, this.note) fmt.Println(" 登記收入") this.flag = true } func (this *FamilyAccount) outcome() { fmt.Println("本次支出金額:") fmt.Scanln(&this.money) if this.money > this.balance { fmt.Println("余額的金額不足!") //break } this.balance -= this.money fmt.Println("本次支出說明") fmt.Scanln(&this.note) this.details += fmt.Sprintf("\n支出\t %v \t %v \t \t %v", this.balance, this.money, this.note) fmt.Println(" 登記支出") this.flag = true } func(this *FamilyAccount)exit(){ fmt.Println("你確定要退出嗎?y/n") choice := "" for { fmt.Scanln(&choice) if choice == "y" || choice == "n" { break } fmt.Println("你的輸入有誤,請(qǐng)重新輸入y/n") } if choice == "y" { this.loop = false } } func (this *FamilyAccount) MainMenu() { for { fmt.Println("-------------------家庭收支記賬軟件-------------------") fmt.Println(" 1 收支明細(xì)") fmt.Println(" 2 登記收入") fmt.Println(" 3 登記支出") fmt.Println(" 4 退出軟件") fmt.Print("請(qǐng)選擇(1-4):") fmt.Scanln(&this.key) switch this.key{ case"1": this.showDetails() case"2": this.income() case"3": this.outcome() case"4": this.exit() default: fmt.Println("請(qǐng)輸入正確選項(xiàng)..") } if!this.loop{ break } } }
main
package main import ( "fmt" "go_code/go_code/chapter12/model" ) func main() { fmt.Println("面向?qū)ο?) model.NewFamilyAccount().MainMenu() }
對(duì)項(xiàng)目的擴(kuò)展功能的練習(xí)
- 對(duì)上面的項(xiàng)目完成一個(gè)轉(zhuǎn)賬功能
- 在使用該軟件前,有一個(gè)登錄功能,只有輸入正確的用戶名和密碼才能操作.
model
package model import "fmt" type User struct { Username string Pwd string key string loop bool money float64 balance float64 note string flag bool details string } func NewUser() *User { return &User{ key: "", loop: true, money: 0.0, balance: 0.0, note: "", flag: false, details: "收支\t賬戶金額\t收支金額\t說 明", Pwd:"666666", Username: "tianyi1", } } func (this *User) showDetails() { fmt.Println("-------------------當(dāng)前收支明細(xì)-------------------") if this.flag { fmt.Println(this.details) } else { fmt.Println("當(dāng)前沒有明細(xì),來一筆吧!") } } func (this *User) income() { fmt.Println("本次收入金額:") fmt.Scanln(&this.money) this.balance += this.money fmt.Println("本次收入說明") fmt.Scanln(&this.note) this.details += fmt.Sprintf("\n收入\t %v \t %v \t \t %v", this.balance, this.money, this.note) fmt.Println(" 登記收入") this.flag = true } func (this *User) outcome() { fmt.Println("本次支出金額:") fmt.Scanln(&this.money) if this.money > this.balance { fmt.Println("余額的金額不足!") //break } this.balance -= this.money fmt.Println("本次支出說明") fmt.Scanln(&this.note) this.details += fmt.Sprintf("\n支出\t %v \t %v \t \t %v", this.balance, this.money, this.note) fmt.Println(" 登記支出") this.flag = true } func (this *User) exit() { fmt.Println("你確定要退出嗎?y/n") choice := "" for { fmt.Scanln(&choice) if choice == "y" || choice == "n" { break } fmt.Println("你的輸入有誤,請(qǐng)重新輸入y/n") } if choice == "y" { this.loop = false } } func (user *User) Login(username string, pwd string) { for { fmt.Println("請(qǐng)輸入用戶名") fmt.Scanln(&user.Username) if username !=user.Username { fmt.Println("輸入的用戶名不正確,請(qǐng)重新輸入:") user.Login("", "") } else { break } } for { fmt.Println("請(qǐng)輸入密碼") fmt.Scanln(&user.Pwd) if pwd!= user.Pwd { fmt.Println("輸入的密碼不正確,請(qǐng)重新輸入:") } else { fmt.Println("恭喜您,進(jìn)入系統(tǒng)!") user.MainMenu() } } } //將轉(zhuǎn)賬寫成一個(gè)方法 func (user *User)Transfer(){ fmt.Println("------------------------轉(zhuǎn)賬功能-------------------") fmt.Println("本次轉(zhuǎn)賬金額:") fmt.Scanln(&user.money) if user.money>user.balance{ fmt.Println("你的余額不足") } user.balance -=user.money fmt.Println("本次轉(zhuǎn)賬說明:") fmt.Scanln(&user.note) user.details+=fmt.Sprintf("\n轉(zhuǎn)賬\t %v \t %v \t \t %v",user.balance, user.money, user.note) } func (user *User) MainMenu() { for { fmt.Println("-------------------家庭收支記賬軟件-------------------") fmt.Printf("用戶%v已登錄\n", user.Username) fmt.Println(" 1 收支明細(xì)") fmt.Println(" 2 登記收入") fmt.Println(" 3 登記支出") fmt.Println(" 4 選擇轉(zhuǎn)賬") fmt.Println(" 5 退出軟件") fmt.Print("請(qǐng)選擇(1-5):") fmt.Scanln(&user.key) switch user.key { case "1": user.showDetails() case "2": user.income() case "3": user.outcome() case "4": user.Transfer() case "5": user.exit() default: fmt.Println("請(qǐng)輸入正確選項(xiàng)..") } if !user.loop { break } } }
main
package main import ( "fmt" "go_code/go_code/chapter12/model" ) func main() { fmt.Println("這個(gè)是面向?qū)ο蟮姆绞酵瓿?.\n") //調(diào)用登錄頁面Showcode model.NewUser().Login("tianyi1","666666") }
以上就是Go-家庭收支記賬軟件項(xiàng)目實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于Go項(xiàng)目實(shí)現(xiàn)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
golang實(shí)現(xiàn)循環(huán)隊(duì)列的示例代碼
循環(huán)隊(duì)列是一種使用固定大小的數(shù)組來實(shí)現(xiàn)隊(duì)列的數(shù)據(jù)結(jié)構(gòu),本文主要介紹了golang實(shí)現(xiàn)循環(huán)隊(duì)列的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07golang使用excelize庫操作excel文件的方法詳解
Excelize是Go語言編寫的用于操作Office Excel文檔基礎(chǔ)庫,基于ECMA-376,ISO/IEC 29500國際標(biāo)準(zhǔn),下面這篇文章主要給大家介紹了關(guān)于golang使用excelize庫操作excel文件的相關(guān)資料,需要的朋友可以參考下2022-11-11淺析如何利用Go的plugin機(jī)制實(shí)現(xiàn)熱更新
熱更新,或稱熱重載或動(dòng)態(tài)更新,是一種軟件更新技術(shù),允許程序在運(yùn)行時(shí),不停機(jī)更新代碼或資源,本文主要來討論下GO語言是否可以利用plugin機(jī)制實(shí)現(xiàn)熱更新,感興趣的可以了解下2024-04-04Go調(diào)度器學(xué)習(xí)之協(xié)作與搶占詳解
如果某個(gè)G執(zhí)行時(shí)間過長,其他的G如何才能被正常調(diào)度,這就引出了接下來的話題:協(xié)作與搶占。本文將通過一些示例為大家詳細(xì)講講調(diào)度器中協(xié)作與搶占的相關(guān)知識(shí),需要的可以參考一下2023-04-04golang 歸并排序,快速排序,堆排序的實(shí)現(xiàn)
本文主要介紹了golang 歸并排序,快速排序,堆排序的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01