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",¬e)
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",¬e)
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()
}