Golang收支記賬程序詳細編寫過程

1.項目開發流程

2.項目需求說明

模擬實現基於文本界面的《傢庭記賬軟件》

該軟件能夠記錄傢庭的收入,支出,並能夠打印收支明細表

3.項目的界面

4.項目代碼實現

實現基本功能(先使用面向過程,後面改成面向對象)

功能1:先完成可以顯示主菜單,並且可以退出

思路分析:

更加給出的界面完成,主菜單的顯示,當用戶輸入4時,就退出該程序

功能2:完成可以顯示明細和登記收入的功能

思路分析:

  • 因為需要顯示明細,我們定義一個變量details string 來記錄
  • 還需要定義變量來記錄餘額(balance),每次收支的金額(money),每次收支的說明(note)

代碼改進

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

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("-------傢庭收支記賬軟件---------")
		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("\n----------當前收支明細記錄-----------")
				if flag {
					fmt.Println(details)
				}else{
					fmt.Println("當前沒有收支明細...  來一筆吧!")
				}
				// fmt.Println(details)
			case "2":
				fmt.Println("本次收入金額:")
				fmt.Scanln(&money)
				balance += money // 修改賬戶餘額
				fmt.Println("本次收入說明:")
				fmt.Scanln(&note)
				// 將這個收入情況,拼接到details變量
				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(&note)
				details += fmt.Sprintf("\n支出\t%v\t%v\t%v",balance,money,note)
			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 {
			fmt.Println("你退出傢庭賬本")
			break;
		}
	}
}

將上面的代碼改成面向對象的方法,編寫myFamilyAccount.go,並使用testMyFamilyAccount.go去完成測試

思路分析

把記賬軟件的功能,封裝到一個結構體中,然後調用該結構體的方法,來實現記賬,顯示明細。結構體的名字FamilyAccount

在通過main方法中,創建一個結構體FamilyAccount實例,實現記賬即可。

// familyAccount.go

package utils 
import (
  "fmt"
)
type FamilyAccount struct{
	key string
	// 聲明一個字段,控制是否退出for
	loop bool
	// 定義賬戶的餘額 []
	balance float64
	// 每次收支的金額
	money float64
	// 每次收支的說明
	note string
	// 定義一個變量,記錄是否有收支的行為
	flag bool
	// 收支的詳情使用字符串來記錄
	//當有收支時,隻需要對details進行拼接處理即可
	details string
}
// 編寫一個工廠模式的構造方法,返回一個*FamilyAccount實例
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("\n----------當前收支明細記錄-----------")
	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變量
	this.details += fmt.Sprintf("\n收入\t%v\t%v\t%v",this.balance,this.money,this.note)
	this.flag = true 
}
// 登記支出方法
func (this *FamilyAccount) pay(){
	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%v",this.balance,this.money,this.note)
}
// 退出方法
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("-------傢庭收支記賬軟件---------")
		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;
		}
	}
}

// main.go

package main 
import (
  "go_code/familyaccount/utils"
)
func main(){
	fmt.Println("這個是面向對象的方式完成~~")
	utils.NewFamilyAccount().MainMenu() 
}

到此這篇關於Golang收支記賬程序詳細編寫過程的文章就介紹到這瞭,更多相關Golang收支記賬內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: