ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-02-25 09:01:58  阅读:212  来源: 互联网

标签:money fmt choice 记账 details Println 软件 收支


文章目录

项目开发流程

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

项目需求说明

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

界面设计

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

                    请选择(1-4):

代码实现

面向过程实现

  • 功能 1:先完成可以显示主菜单,并且可以退出

思路分析:
更加给出的界面完成,主菜单的显示, 当用户输入 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("你退出家庭记账软件的使用...")
    }
  • 功能 2:完成可以显示明细的功能

思路分析:
因为需要显示明细,我们定义一个变量 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("你退出家庭记账软件的使用...")
    }
  • 功能 3:完成登记收入和支出的功能

思路分析:
需要定义变量来记录余额(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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有