go学习 day223 家庭记账软件

发布时间 2023-03-25 15:59:44作者: 六月OvO

面向过程

package main

import "fmt"

func main() {
	// 声明一个变量,保存用户的输入
	key := ""
	// 声明一个变量,查看是否退出程序
	var status bool = true
	// 账户余额
	var balance float64 = 100000.0
	// 每次收支金额
	var  money float64
	// 每次收支说明
	var note string
	// 收支详情使用字符串记录 当有收支时只需要拼接即可
	var details string = "收支\t\t账户金额\t\t收支金额\t\t说   明"
	// 记录是否支付
	flag := false
	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":
			if flag {
				fmt.Println("-------------------------当前账户的收支明细---------------------")
				fmt.Println(details)
			}	else {
				fmt.Println("还没有支出或收入,快来一笔吧!!!")
			}

		case "2":
			fmt.Println("本次收入金额: ")
			fmt.Scanln(&money)
			balance += money
			fmt.Println("收入说明: ")
			fmt.Scanln(&note)
			// 将收入情况,拼接到details变量
			details += fmt.Sprintf("\n收入\t\t%v\t\t%v\t\t\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\t%v\t\t%v\t\t\t%v",balance,money,note)
			flag = true
		case "4":
			var tmp = ""
			fmt.Println("你确定要退出吗?(y/n)")
			for  {
				fmt.Scanln(&tmp)
				if tmp == "y" || tmp == "n" {
					break
				}
				fmt.Println("你输入的有误,请重新输入(y/n)")
			}
			if tmp == "y" {
				status = false
			}

		default:
			fmt.Println("请输入正确的数。。。")
		}

		if status == false {
			fmt.Println("你退出了家庭记账软件的使用。。。。")
			break
		}

	}
	fmt.Println(" ")
}


面向对象

package utils

import "fmt"

type FamilyAccount struct {
	key string
	// 声明一个变量,查看是否退出程序
	status bool
	// 账户余额
	balance float64
	// 每次收支金额
	money float64
	// 每次收支说明
	note string
	// 收支详情使用字符串记录 当有收支时只需要拼接即可
	details string
	// 记录是否支付
	flag bool
}

// 编写给工厂模式的构造方法,返回一个*FamilyAccount实例
func NewFamilyAccount() *FamilyAccount {
	return &FamilyAccount{
		key: "",
		status: true,
		balance: 10000.0,
		money: 0.0,
		note: "",
		flag: false,
		details: "收支\t\t账户金额\t\t收支金额\t\t说   明",
	}
}

// 显示明细方法
func (f *FamilyAccount) ShowDetails()  {
	if f.flag {
		fmt.Println("-------------------------当前账户的收支明细---------------------")
		fmt.Println(f.details)
	}	else {
		fmt.Println("还没有支出或收入,快来一笔吧!!!")
	}
}

// 登记收入方法
func (f *FamilyAccount) Income()  {
	fmt.Println("本次收入金额: ")
	fmt.Scanln(&f.money)
	f.balance += f.money
	fmt.Println("收入说明: ")
	fmt.Scanln(&f.note)
	// 将收入情况,拼接到details变量
	f.details += fmt.Sprintf("\n收入\t\t%v\t\t%v\t\t\t%v",f.balance,f.money,f.note)
	f.flag = true
}

// 登记支出方法
func (f *FamilyAccount) Pay()  {
	fmt.Println("本次支出金额: ")
	fmt.Scanln(&f.money)
	if f.money > f.balance {
		fmt.Println("余额不足。。。")
		//return
	}
	f.balance -= f.money
	fmt.Println("支出说明: ")
	fmt.Scanln(&f.note)

	f.details += fmt.Sprintf("\n支出\t\t%v\t\t%v\t\t\t%v",f.balance,f.money,f.note)
	f.flag = true
}

// 退出方法
func (f *FamilyAccount) Logout()  {
	var tmp = ""
	fmt.Println("你确定要退出吗?(y/n)")
	for  {
		fmt.Scanln(&tmp)
		if tmp == "y" || tmp == "n" {
			break
		}
		fmt.Println("你输入的有误,请重新输入(y/n)")
	}
	if tmp == "y" {
		f.status = false
	}
}

// 给该结构体绑定相应的方法
// 显示主菜单
func (f *FamilyAccount) MainEenu()  {
	for  {
		fmt.Println("\n------------------------家庭收支记账软件-------------------------")
		fmt.Println("                         1 收支明细")
		fmt.Println("                         2 登记收入")
		fmt.Println("                         3 登记支出")
		fmt.Println("                         4 退   出")
		fmt.Println("请选择(1-4): ")
		fmt.Scanln(&f.key)

		switch f.key {
		case "1":
			f.ShowDetails()

		case "2":
			f.Income()

		case "3":
			f.Pay()

		case "4":
			f.Logout()

		default:
			fmt.Println("请输入正确的数。。。")
		}

		if f.status == false {
			fmt.Println("你退出了家庭记账软件的使用。。。。")
			break
		}

	}
}


在main函数调用

package main

import "day233/utils"

func main() {
	utils.NewFamilyAccount().MainEenu()

}