go-家庭收支記帳軟件例子

家庭收支記帳軟件項目

項目需求說明

1) 模擬實現基於文本界面的《家庭記帳軟件》
2) 該軟件可以記錄家庭的收入、支出,並可以打印收支明細表oop

項目的界面

看代碼效果測試

項目代碼實現

實現基本功能(先使用面向過程,後面改爲面向對象)

功能 1: 先完成能夠顯示主菜單,而且 能夠退出
思路分析:
更加給出的界面完成,主菜單的顯示, 當用戶輸入 4 時,就退出該程序this

功能 2:完成能夠 顯示明細和 登記收入的功能code

1) 由於須要顯示明細,咱們定義一個變量 details string 來記錄
2) 還須要定義變量來記錄餘額(balance)、每次收支的金額(money), 每次收支的說明(note)對象

功能 3:完成了登記支出的功能
思路分析:
登記支出的功能和登陸收入的功能相似,作些修改便可字符串

package main
import (
    "fmt"
)
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) 用戶輸入 4 退出時,給出提示"你肯定要退出嗎? y/n",必須輸入正確的 y/n ,不然循環輸入指令,直到輸入 y 或者 n
2) 當沒有任何收支明細時,提示 "當前沒有收支明細... 來一筆吧!"
3) 在支出時,判斷餘額是否夠,並給出相應的提示
4) 將 面 向 過 程 的 代 碼 修 改 成 面 向 對 象 的 方 法 , 編 寫 myFamilyAccount.go , 並 使 用testMyFamilyAccount.go 去完成測試string

思路分析:
把記帳軟件的功能,封裝到一個結構體中,而後調用該結構體的方法,來 實現記帳, 顯示明細。結構體的名字 FamilyAccount .
在經過在 main 方法中,建立一個結構體 FamilyAccount 實例,實現記帳便可.it

main.goclass

package main
import (
    "go_code/code/account/utils"
    "fmt"
)
func main() {
    fmt.Println("面向對象的方式來完成.....")
    utils.NewMyFamilyAccount().MainMenu()
}

myFamilyAccount.gotest

package utils
import (
    "fmt"
)

type MyFamilyAccount struct {

    // 定義一個字段
    loop bool
    // 用於接收用戶的輸入
    key string
    // 記錄用戶的收入和支出狀況,該字符串會拼接
    details string 
    // 保存帳號的金額
    balance float64
    // 定義一個標識符
    flag bool
    // 定義一個金額
    money float64
    // 聲明一個說明
    note string
}

func NewMyFamilyAccount() *MyFamilyAccount {
    return &MyFamilyAccount{
        loop : true,
        key : "",
        details : "收支\t帳戶金額\t收支金額\t說    明",
        balance : 10000.0,
        flag : false,
        money : 0.0,
        note : "",
    }
}

func (this *MyFamilyAccount) MainMenu() {

    for {
        // 1. 先輸出這個主菜單
        fmt.Println("-----------------家庭收支記帳軟件-----------------")
        fmt.Println("           1 收支明細")
        fmt.Println("           2 登記收入")
        fmt.Println("           3 登記支出")
        fmt.Println("           4 退出")
        fmt.Print("請選擇(1-4):")
        fmt.Scanln(&this.key)

        // 使用switch
        switch (this.key) {
        case "1":
            this.showDetails()
        case "2":
            this.income()
        case "3":
            this.pay()
        case "4":
            this.loop = this.exit()
        default:
            fmt.Println("請輸入正確的選項...")
        }
        if !this.loop {
            break
        }

    }
    fmt.Println("你退出了軟件的使用。。。。")
}

//顯示收支明細的方法
func (this *MyFamilyAccount) showDetails() {

    // 增長我代碼。。
    fmt.Println("-----------------當前收支明細記錄-----------------")
    if this.flag {
        fmt.Println(this.details)
    } else {
        fmt.Println("沒有任何收支明細")
    }
}

//登記收入
func (this *MyFamilyAccount) income() {

    fmt.Print("本次收入金額:")
    fmt.Scanln(&this.money)
    fmt.Print("本次收入說明:")
    fmt.Scanln(&this.note)
    this.balance += this.money
    this.details += fmt.Sprintf("\n收入\t%v\t%v\t%v", 
        this.balance, this.money, this.note)
    this.flag = true
}

//登記支出

func (this *MyFamilyAccount) pay() {

    fmt.Print("本次支出金額:")
    fmt.Scanln(&this.money)
    fmt.Print("本次支出說明:")
    fmt.Scanln(&this.note)
    
    //判斷
    if this.money > this.balance {
        fmt.Println("朋友,餘額不足 ...")
        return // 終止一個方法使用return
    } 
    this.balance -= this.money
    this.details += fmt.Sprintf("\n支出\t%v\t%v\t%v", 
        this.balance, this.money, this.note)
    this.flag = true
}

//退出

func (this *MyFamilyAccount) exit() bool {
    // 修改loop
    fmt.Println("肯定要退出嗎?y/n");
        
    choice := ""
    //循環判斷,直到輸入y 或者 n

    for {
        fmt.Scanln(&choice)
        if choice == "y" || choice == "n" {
            break
        }
        fmt.Print("你的輸入有誤,請輸入y/n:")
    }
    if choice == "y" {
        return false
    }  else {
        return true
    }
}
相關文章
相關標籤/搜索