1) 模擬實現基於文本界面的《家庭記帳軟件》
2) 該軟件可以記錄家庭的收入、支出,並可以打印收支明細表oop
看代碼效果測試
功能 1: 先完成能夠顯示主菜單,而且 能夠退出
思路分析:
更加給出的界面完成,主菜單的顯示, 當用戶輸入 4 時,就退出該程序this
功能 2:完成能夠 顯示明細和 登記收入的功能code
1) 由於須要顯示明細,咱們定義一個變量 details string 來記錄
2) 還須要定義變量來記錄餘額(balance)、每次收支的金額(money), 每次收支的說明(note)對象
功能 3:完成了登記支出的功能
思路分析:
登記支出的功能和登陸收入的功能相似,作些修改便可字符串
package main import ( "fmt" ) func main() { //聲明一個變量,保存接收用戶輸入的選項 key := "" //聲明一個變量,控制是否退出for loop := true //定義帳戶的餘額 [] balance := 10000.0 //每次收支的金額 money := 0.0 //每次收支的說明 note := "" //定義個變量,記錄是否有收支的行爲 flag := false //收支的詳情使用字符串來記錄 //當有收支時,只須要對details 進行拼接處理便可 details := "收支\t帳戶金額\t收支金額\t說 明" //顯示這個主菜單 for { fmt.Println("\n-----------------家庭收支記帳軟件-----------------") fmt.Println(" 1 收支明細") fmt.Println(" 2 登記收入") fmt.Println(" 3 登記支出") fmt.Println(" 4 退出軟件") fmt.Print("請選擇(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 1000 有人發紅包 details += fmt.Sprintf("\n收入\t%v\t%v\t%v", balance, money, note) 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%v", balance, money, note) flag = true case "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("你退出家庭記帳軟件的使用...") }
1) 用戶輸入 4 退出時,給出提示"你肯定要退出嗎? y/n",必須輸入正確的 y/n ,不然循環輸入指令,直到輸入 y 或者 n
2) 當沒有任何收支明細時,提示 "當前沒有收支明細... 來一筆吧!"
3) 在支出時,判斷餘額是否夠,並給出相應的提示
4) 將 面 向 過 程 的 代 碼 修 改 成 面 向 對 象 的 方 法 , 編 寫 myFamilyAccount.go , 並 使 用testMyFamilyAccount.go 去完成測試string
思路分析:
把記帳軟件的功能,封裝到一個結構體中,而後調用該結構體的方法,來 實現記帳, 顯示明細。結構體的名字 FamilyAccount .
在經過在 main 方法中,建立一個結構體 FamilyAccount 實例,實現記帳便可.it
main.goclass
package main import ( "go_code/code/account/utils" "fmt" ) func main() { fmt.Println("面向對象的方式來完成.....") utils.NewMyFamilyAccount().MainMenu() }
myFamilyAccount.gotest
package utils import ( "fmt" ) type MyFamilyAccount struct { // 定義一個字段 loop bool // 用於接收用戶的輸入 key string // 記錄用戶的收入和支出狀況,該字符串會拼接 details string // 保存帳號的金額 balance float64 // 定義一個標識符 flag bool // 定義一個金額 money float64 // 聲明一個說明 note string } func NewMyFamilyAccount() *MyFamilyAccount { return &MyFamilyAccount{ loop : true, key : "", details : "收支\t帳戶金額\t收支金額\t說 明", balance : 10000.0, flag : false, money : 0.0, note : "", } } func (this *MyFamilyAccount) MainMenu() { for { // 1. 先輸出這個主菜單 fmt.Println("-----------------家庭收支記帳軟件-----------------") fmt.Println(" 1 收支明細") fmt.Println(" 2 登記收入") fmt.Println(" 3 登記支出") fmt.Println(" 4 退出") fmt.Print("請選擇(1-4):") fmt.Scanln(&this.key) // 使用switch switch (this.key) { case "1": this.showDetails() case "2": this.income() case "3": this.pay() case "4": this.loop = this.exit() default: fmt.Println("請輸入正確的選項...") } if !this.loop { break } } fmt.Println("你退出了軟件的使用。。。。") } //顯示收支明細的方法 func (this *MyFamilyAccount) showDetails() { // 增長我代碼。。 fmt.Println("-----------------當前收支明細記錄-----------------") if this.flag { fmt.Println(this.details) } else { fmt.Println("沒有任何收支明細") } } //登記收入 func (this *MyFamilyAccount) income() { fmt.Print("本次收入金額:") fmt.Scanln(&this.money) fmt.Print("本次收入說明:") fmt.Scanln(&this.note) this.balance += this.money this.details += fmt.Sprintf("\n收入\t%v\t%v\t%v", this.balance, this.money, this.note) this.flag = true } //登記支出 func (this *MyFamilyAccount) pay() { fmt.Print("本次支出金額:") fmt.Scanln(&this.money) fmt.Print("本次支出說明:") fmt.Scanln(&this.note) //判斷 if this.money > this.balance { fmt.Println("朋友,餘額不足 ...") return // 終止一個方法使用return } this.balance -= this.money this.details += fmt.Sprintf("\n支出\t%v\t%v\t%v", this.balance, this.money, this.note) this.flag = true } //退出 func (this *MyFamilyAccount) exit() bool { // 修改loop fmt.Println("肯定要退出嗎?y/n"); choice := "" //循環判斷,直到輸入y 或者 n for { fmt.Scanln(&choice) if choice == "y" || choice == "n" { break } fmt.Print("你的輸入有誤,請輸入y/n:") } if choice == "y" { return false } else { return true } }