廈門市同安區(qū)建設局公開網站網站優(yōu)化軟件
家庭收支記賬軟件
- 實現基本功能(先使用面向過程,后面改成面向對象)
- 項目代碼實現改進
- 面向過程源碼
- 面向對象源碼
- utils包中
- main包中
實現基本功能(先使用面向過程,后面改成面向對象)
編寫文件TestMyAccount.go完成基本功能
- 功能一:先完成可以顯示主菜單,并且可以退出
- 功能二:完成可以顯示明細和登記收入的功能
- 功能三:完成登記支出的功能
項目代碼實現改進
1,用戶輸入4退出時,給出提示“你確定要退出嗎y/n”,必須輸入正確的y/n,否則循環(huán)輸入指令,知道輸入y或者n
2,當沒有任何收支明細時,提示"當前沒有收支明細…"
3,在支出時,判斷余額是否夠,并給出相應的提示
4,將面向過程的代碼修改成面向對象的方法,編寫myFamilyAccount.go,并使用testMyFanillyAccount.go去完成測試
面向過程源碼
package main
import ("fmt"
)func main() {//聲明一個變量,保存接受用戶輸入的選項key := ""//聲明一個變量,控制是否退出for循環(huán)loop := true//定義賬戶的金額balance := 10000.0//每次收支的金額money := 0.0//每次收支的說明note := ""//定義一個變量,記錄是否有收支行為flag := false//收支的詳情使用字符串來記錄//當有收支的時候,只需要對details進行拼接處理details := "收支\t賬戶余額\t收支金額\t說 明"//循環(huán)顯示菜單for{fmt.Println("\n--------------------家庭收支記賬軟件------------------")fmt.Println(" 1 收支明細")fmt.Println(" 2 登記收入")fmt.Println(" 3 登記支出")fmt.Println(" 4 退出軟件")fmt.Println(" 請選擇(1-4):")fmt.Scanln(&key) switch key {case "1":fmt.Println("-----------------當前收支明細記錄----------------")if flag {fmt.Println(details)} else {fmt.Println("你的卡里沒錢錢,存一筆吧")}case "2":fmt.Println("本次收入的金額:")fmt.Scanln(&money)balance += money //修改賬戶余額fmt.Println("本次收入說明:")fmt.Scanln(¬e)//將這個收入的情況,拼接到details//收入 11000 10000 血汗錢details += fmt.Sprintf("\n收入\t%v\t%v\t%v", balance, money, note)flag = truecase "3":fmt.Println("本次支出的金額:")fmt.Scanln(&money)//這里做一個必要的判斷if money > balance {fmt.Println("余額不足")break}balance -= moneyfmt.Println("本次支出的說明:")fmt.Scanln(¬e)details += fmt.Sprintf("\n支出\t%v\t%v\t%v", balance, money, note)flag = truecase "4":fmt.Println("你確定要退出嗎? y/n")choice := ""for {fmt.Scanln(&choice)if choice == "y" || choice == "n" {break}fmt.Println("你的輸入有誤,請重新輸入 y/n")}if choice == "y" {loop = false}default :fmt.Println("請輸入正確的選項")}if !loop {break}}fmt.Println("你退出了家庭記賬軟件的使用")}
面向對象源碼
思路:
把記賬軟件的功能,封裝到一個結構體中,然后調用該結構體的方法,來實現記賬,顯示明細
再通過在main方法中,創(chuàng)建一個結構體FamilyAccount實例,實現記賬即可
utils包中
package utils
import ("fmt"
)type FamilyAccount struct {//聲明必須的字段//聲明一個字段,保存接受用戶輸入的選項key string//聲明一個字段,控制是否退出for循環(huán)loop bool//定義賬戶的金額balance float64//每次收支的金額money float64//每次收支的說明note string//定義一個變量,記錄是否有收支行為flag bool//收支的詳情使用字符串來記錄//當有收支的時候,只需要對details進行拼接處理details string
}//編寫一個工廠模式的構造方法,返回一個*FanilyAccount實例
func NewFamilyAccount() *FamilyAccount {return &FamilyAccount{key :"",loop : true,balance : 10000.0,money: 0.0,note : "",flag :false,details : "收支\t賬戶余額\t收支金額\t說 明"}
}//將顯示明細寫成一個方法
func (this *FamilyAccount) showDetails() {fmt.Println("-----------------當前收支明細記錄----------------")if this.flag {fmt.Println(this.details)} else {fmt.Println("你的卡里沒錢錢,存一筆吧")}
}//將登記收入寫成一個方法
func (this *FamilyAccount) income() {fmt.Println("本次收入的金額:")fmt.Scanln(&this.money)this.balance += this.money //修改賬戶余額fmt.Println("本次收入說明:")fmt.Scanln(&this.note)//將這個收入的情況,拼接到details//收入 11000 10000 血汗錢this.details += fmt.Sprintf("\n收入\t%v\t%v\t%v", this.balance, this.money, this.note)flag = true
}//將支出寫成一個方法
func (this *FamilyAccount) pay() {fmt.Println("本次支出的金額:")fmt.Scanln(&this.money)//這里做一個必要的判斷if this.money > this.balance {fmt.Println("余額不足")//break}this.balance -= this.moneyfmt.Println("本次支出的說明:")fmt.Scanln(&this.note)this.details += fmt.Sprintf("\n支出\t%v\t%v\t%v", this.balance, this.money, this.note)this.flag = true
}//將退出寫成一個方法
func (this *FamilyAccount) exit() {fmt.Println("你確定要退出嗎? y/n")choice := ""for {fmt.Scanln(&choice)if choice == "y" || choice == "n" {break}fmt.Println("你的輸入有誤,請重新輸入 y/n")}if choice == "y" {this.loop = false}}//給該結構體綁定相應的方法
//顯示主菜單
func (this *FamilyAccount) MainMenu() {for{fmt.Println("\n--------------------家庭收支記賬軟件------------------")fmt.Println(" 1 收支明細")fmt.Println(" 2 登記收入")fmt.Println(" 3 登記支出")fmt.Println(" 4 退出軟件")fmt.Println(" 請選擇(1-4):")fmt.Scanln(&this.key) switch this.key {case "1":this.showDetails()case "2":this.income()case "3":this.pay()case "4":this.exit()default :fmt.Println("請輸入正確的選項")}if !this.loop {break}fmt.Println("你退出了家庭記賬軟件的使用")}
}
main包中
package main
import ("go_code/Familycount/main"
)func main(){utils.NewFamilyAccount().MainMenu()
}