golang项目01_家庭记账本

该博客介绍了如何将一个简单的家庭收支记账软件从面向过程的代码重构为面向对象的代码。通过定义一个名为`FamilyAccount`的结构体,实现了记账、显示收支明细、登记收入和支出以及退出程序等功能。在主方法中创建结构体实例并调用相应方法完成操作,提高了代码的组织性和可维护性。
摘要由CSDN通过智能技术生成

1—家庭收支记账软件项目

项目基本实现代码(运用面向过程)


//家庭收支软件
package main

import "fmt"

func main(){
	var key int
	balance := 10000.0
	money := 0.0
	var flag bool = true
	detail := "收支 \t账户金额 \t收入金额 \t说明"
	note :=""
	for{
	fmt.Println("-------------------家庭记账本-------------------")
	fmt.Println("                  1 收支明细")
	fmt.Println("                  2 登记收入")
	fmt.Println("                  3 登记支出")
	fmt.Println("                  4 退出")
	fmt.Print("请选择(1~4):")
	fmt.Scanf("%d",&key)
	switch key{
	case 1:
		fmt.Println("-------------------当前收支明细-------------------")
		fmt.Println(detail)
	case 2:
		fmt.Println("登记收入")
		fmt.Println("输入收入金额:")
		fmt.Scanf("%f",&money)
		balance += money
		fmt.Println("收入金额原因:")
		fmt.Scanf("%s",&note)
		moneyInput := fmt.Sprintf("\n收入 \t%v \t%v \t%v",balance,money,note)
		detail += moneyInput
		fmt.Println(detail)
	case 3:
		fmt.Println("登记支出")
		fmt.Println("输入支出金额:")
		fmt.Scanf("%f",&money)
		balance -= money
		fmt.Println("支出金额原因:")
		fmt.Scanf("%s",&note)
		moneyInput := fmt.Sprintf("\n收入 \t%v \t%v \t%v",balance,money,note)
		detail += moneyInput
		fmt.Println(detail)
	case 4:
		flag = false
	default:
		fmt.Println("输入有错误····")
		}
		if !flag{
			break
		}
	}
	fmt.Println("你已经退出")
}

将面向过程转变为面向对象:

思路分析:

将记账软件的功能封装到一个结构体中,然后进行调用,来实现记账、显示明细。结构体的名称为FamilyAccount

再通过再main中的方法,创建一个结构日实例,实现记账即可

代码实现:

代码不需要重新写,只需要组织一下就能实现面向对象;

代码演示:

结构体包:
package utils
import (
	"fmt"
)
type familyAccout struct {
	key int
	balance float64
	note string
	flag bool
	used bool
	money float64
	detail string
}
func NewFamiluAccount() *familyAccout{
	return &familyAccout{
		key : 0,
		balance: 10000,
		note : "",
		flag : true,
		used : false,
		detail:"收支 \t账户金额 \t收入金额 \t说明",
	}
}

func (this *familyAccout)MainMeniu(){
	for{//使用的是this这一个结构体的字段,所以所有的字段需要加一个"this."
		fmt.Println("-------------------家庭记账本-------------------")
		fmt.Println("                  1 收支明细")
		fmt.Println("                  2 登记收入")
		fmt.Println("                  3 登记支出")
		fmt.Println("                  4 退出")
		fmt.Print("请选择(1~4):")
		fmt.Scanf("%d",&this.key)
		switch this.key{
		case 1://登记明细功能
			this.appearance()
		case 2:
			this.income()
		case 3:
			this.output()
		case 4:
			this.exit()
		default :
			fmt.Println("输入有误···")
		}
	}
}

func (this *familyAccout)appearance(){
	if !this.used{
		fmt.Println("您还没有进行一次登记或者支出,来一次登记或者支出吧~")
	}else {
		fmt.Println("-------------------当前收支明细-------------------")
		fmt.Println(this.detail)
	}
}

func (this *familyAccout) income(){
	fmt.Println("登记收入")
	fmt.Println("输入收入金额:")
	fmt.Scanf("%f",&this.money)
	this.balance += this.money
	fmt.Println("收入金额原因:")
	fmt.Scanf("%s",&this.note)
	moneyInput := fmt.Sprintf("\n收入 \t%v \t%v \t%v",this.balance,this.money,this.note)
	this.detail += moneyInput
	fmt.Println(this.detail)
	this.used = true
}

func (this *familyAccout) output() {
	fmt.Println("登记支出")
	fmt.Println("输入支出金额:")
	fmt.Scanf("%f",&this.money)
	if this.money>this.balance{
		fmt.Println("支出金额大于总资产····")
		return
	}
	this.balance -= this.money
	fmt.Println("支出金额原因:")
	fmt.Scanf("%s",&this.note)
	moneyInput := fmt.Sprintf("\n收入 \t%v \t%v \t%v",this.balance,this.money,this.note)
	this.detail += moneyInput
	fmt.Println(this.detail)
	this.used = true
}

func (this *familyAccout)exit(){
	fmt.Println("是否真的退出???(y/n)")
	choice := ""
	for{
		fmt.Scanln(&choice)
		if(choice=="y"||choice=="n"){
			break;
		}else{
			fmt.Println("输入有误,请重新输入------(y/n)--------")
		}

		if(choice == "y"){
			this.flag = false
		}
	}

}
主方法包
package main

import (
	"go_code/familyAccount/utils"
)
func main(){
	family := utils.NewFamiluAccount()
	family.MainMeniu()
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值