其他分享
首页 > 其他分享> > [GO语言基础] Go项目实战:实现家庭收支记账软件(十八)家庭收支记账软件

[GO语言基础] Go项目实战:实现家庭收支记账软件(十八)家庭收支记账软件

作者:互联网

文章目录

项目开发流程

  1. 需求分析 (30%)
  2. 软件设计 (20%)
  3. coding & testing (20%)
  4. 上线发布
  5. 后期运维

项目需求说明

  1. 模拟实现基于文本界面的《家庭记账软件》
  2. 该软件能够记录家庭的收入、支出,并能够打印收支明细表

界面设计

-----------------家庭收支记账软件-----------------    
                    1 收支明细      
                    2 登记收入   
                    3 登记支出    
                    4 退出软件    

                    请选择(1-4):

代码实现

面向过程实现

思路分析:
更加给出的界面完成,主菜单的显示, 当用户输入 4 时,就退出该程序

    func main() {
        //声明一个变量,保存接收用户输入的选项
        key := ""
        //声明一个变量,控制是否退出for
        loop := true

        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" :

                case "2" :

                case "3" :

                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 {
                break 
            }
        }
        fmt.Println("你退出家庭记账软件的使用...")
    }

思路分析:
因为需要显示明细,我们定义一个变量 details string 来记录

    func main() {
        //声明一个变量,保存接收用户输入的选项
        key := ""
        //声明一个变量,控制是否退出for
        loop := true

        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" :
                
                case "3" :

                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 {
                break 
            }
        }
        fmt.Println("你退出家庭记账软件的使用...")
    }

思路分析:
需要定义变量来记录余额(balance)、每次收支的金额(money), 每次收支的说明(note)

    func main() {
        //声明一个变量,保存接收用户输入的选项
        key := ""
        //声明一个变量,控制是否退出for
        loop := 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.Println("本次收入金额:")
                    fmt.Scanln(&money)
                    balance += money // 修改账户余额
                    fmt.Println("本次收入说明:")
                    fmt.Scanln(&note)
                    //将这个收入情况,拼接到details变量
                    //收入    11000           1000            有人发红包
                    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)
                    flag = true
                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 {
                break 
            }
        }
        fmt.Println("你退出家庭记账软件的使用...")
    }

面向对象实现

思路分析:

  1. 把记账软件的功能,封装到一个结构体中,然后调用该结构体的方法,来实现记账,显示明细。结构体的名字 FamilyAccount.
    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("-----------------当前收支明细记录-----------------")
        if this.flag {
            fmt.Println(this.details)
        } else {
            fmt.Println("当前没有收支明细... 来一笔吧!")
        }
    } 

    //将登记收入写成一个方法,和*FamilyAccount绑定
    func (this *FamilyAccount) income() {
        
        fmt.Println("本次收入金额:")
        fmt.Scanln(&this.money)
        this.balance += this.money // 修改账户余额
        fmt.Println("本次收入说明:")
        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.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)
        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 
            }

        }
    }

2.在通过在 main 方法中,创建一个结构体 FamilyAccount 实例,实现记账即可.

package main
    import (
        "familyaccount/utils"
        "fmt"
    )
    func main() {
        utils.NewFamilyAccount().MainMenu()
    }

标签:money,fmt,choice,记账,details,Println,软件,收支
来源: https://blog.csdn.net/weixin_54707168/article/details/114006221