家庭收支记账软件项目
下面代码分别用面向过程的思想实现,和面向对象思想的实现。
香港vps1.项目开发流程说明:
2.项目需求说明:
模拟实现基于文本界面的《家庭记账软件》;该软件能够记录家庭的收入,支出,并且能够打印收支明细表。
3.项目界面:
在控制台打印出如下界面,并且实现相应功能即可。
4.用面向过程的思想实现:
package mainimport (“fmt”)func main() {//声明一个变量,保存接收用户输入的选项key := “”//声明一个变量,控制是否退出forloop := 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.Print(“本次收入金额:”)fmt.Scanln(&money)balance += money // 修改账户余额fmt.Print(“本次收入说明:”)fmt.Scanln(¬e)//将这个收入情况,拼接到details变量//收入 11000 1000 有人发红包details += fmt.Sprintf(“\n收入 \t%v \t\t%v \t\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.Print(“你确定要退出吗? 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(“你退出家庭记账软件的使用…”)}
执行结果如下图所示:
5.用面向对象的思想实现:
首先,项目结构如下图:
在utils.go中,代码如下:
package utilsimport (“fmt”)type FamilyAccount struct {//声明必须的字段.//声明一个字段,保存接收用户输入的选项key string//声明一个字段,控制是否退出forloop 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(“—————–当前收支明细记录—————–“)if this.flag {fmt.Println(this.details)} else {fmt.Println(“当前没有收支明细… 来一笔吧!”)}}//将登记收入写成一个方法,和*FamilyAccount绑定func (this *FamilyAccount) income() {fmt.Print(“本次收入金额:”)fmt.Scanln(&this.money)this.balance += this.money // 修改账户余额fmt.Print(“本次收入说明:”)fmt.Scanln(&this.note)//将这个收入情况,拼接到details变量//收入 11000 1000 有人发红包this.details += fmt.Sprintf(“\n收入\t%v\t%v\t%v”, this.balance, this.money, this.note)this.flag = true}//将登记支出写成一个方法,和*FamilyAccount绑定func (this *FamilyAccount) pay() {fmt.Print(“本次支出金额:”)fmt.Scanln(&this.money)//这里需要做一个必要的判断if this.money > this.balance {fmt.Print(“余额的金额不足”)//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}//将退出系统写成一个方法,和*FamilyAccount绑定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.Print(“请选择(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 mainimport (“mytest/utils”)func main() {utils.NewFamilyAccount().MainMenu() //思路非常清晰}
功能也能实现,并且调用更简洁,执行效果如下图:
39073399