初中的时候,如果有一堆数据,根据装的容器不同,分为数组或者集合。有一段逻辑,根据是否判断还是循环执行,分为分支语句和循环语句...这些内容汇总起来,就是接下来的一个小项目
由于是第一个小项目,本次引导为:面向过程编写
一、需求讨论
1. 总体需求
开发一个"命令行版家庭收支记账软件"
程序启动后进入一个循环菜单,用户可以多次进行以下操作:
- 查看当前所有收支明细;
- 登记一笔收入;
- 登记一笔支出(需要检查余额是否足够);
- 退出软件(带二次确认)。
所有数据(余额、明细等)都保存在内存变量中,只在本次运行有效
2. 提取菜单需求
菜单UI如下

要求实现一个循环菜单,并根据用户交互,进行执行对应的程序
3. 提取收支明细需求
收支明细UI如下

收支明细,需要展示收入/输出,账户总金额,收支金额,收支说明
4. 提取登记收入需求
登记收入UI如下

进行用户交互,引导用户输入收入金额,收入说明,获取到的信息并存放到内存变量中
5. 提取登记支出需求
登记支出UI如下

进行用户交互,引导用户输入支出金额,支出说明,并需要检查余额是否足够,获取到的信息并更新到内存变量中
6. 提取退出软件需求
退出软件UI如下

当用户输入退出软件,再次进行确认是否要退出程序,进行二次确认
三思而后行
二、编写
1. 菜单
实现菜单UI内容,这里会引入一个key变量,记录用户输入的选项,进行程序交互
需求提出要实现循环菜单,这里引入一个loop变量,进行判断是否结束循环
go
package main
import "fmt"
func main() {
// 输入选项值
key := ""
// 是否退出
loop := false
// 一个程序不可能只用一次,进行多次,所以使用for循环
for {
fmt.Println("---------------------家庭收支记账软件---------------------")
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("-----------收支明细-----------")
case "2":
fmt.Println("-----------登记收入-----------")
case "3":
fmt.Println("-----------登记支出-----------")
case "4":
fmt.Println("-----------退出软件-----------")
loop = true
default:
fmt.Println("请输入正确选项")
}
// 如果退出,则结束循环
if loop {
break
}
}
}
2. 登记收入
先开发登记收入,后续展示就可以有数据进行展示
获取用户收入金额和收入说明,并更新变量
声明变量如下
go
// 定义账户余额
balance := 10000.0
// 定义收支金额
money := 0.0
// 描述
note := ""
// 收支详情
details := "收支\t账户金额\t收支金额\t说 明"
// 收支行为
flag := false
登记收入逻辑如下:
go
fmt.Println("-----------登记收入-----------")
fmt.Println("本次收入金额:")
fmt.Scanln(&money)
balance += money
fmt.Println("本次收入说明:")
fmt.Scanln(¬e)
details += fmt.Sprintf("\n收入\t%v\t%v\t%v", balance, money, note)
// 是否发生收支行为
flag = true
3. 收支明细
判断是否有收支行为,有收支行为进行打印收支详情
go
// 判断是否有收支行为
if flag {
fmt.Println(details)
} else {
fmt.Println("当前没有收支明细")
}
4. 登记支出
获取用户支出金额,并判断是否超出余额,更新变量
go
fmt.Println("本次支出金额:")
fmt.Scanln(&money)
// 判断支出是否超出
if money > balance {
fmt.Println("余额不足")
continue
}
fmt.Println("本次支出说明:")
fmt.Scanln(¬e)
// 更新账户余额
balance -= money
// 更新详情
details += fmt.Sprintf("\n支出\t%v\t%v\t%v", balance, money, note)
// 是否发生收支行为
flag = true
5. 退出软件
当用户选择退出选项,再次进行确认,并根据用户输入的选项,进行更新退出标识
go
fmt.Println("你确定要退出吗?y/n")
for {
fmt.Scanln(&choice)
if choice == "y" || choice == "n" {
break
}
fmt.Println("你的输入有误,你重新输入 y/n")
}
if choice == "y" {
loop = true
}
以上需求和开发都比较简单,主要练习小学和初中概念
附
整体代码如下:
go
package main
import "fmt"
func main() {
// 输入选项值
key := ""
// 是否退出
loop := false
// 定义账户余额
balance := 10000.0
// 定义收支金额
money := 0.0
// 描述
note := ""
// 收支详情
details := "收支\t账户金额\t收支金额\t说 明"
// 收支行为
flag := false
// 确定要退出吗
choice := ""
// 一个程序不可能只用一次,进行多次,所以使用for循环
for {
fmt.Println("---------------------家庭收支记账软件---------------------")
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.Println("本次收入金额:")
fmt.Scanln(&money)
balance += money
fmt.Println("本次收入说明:")
fmt.Scanln(¬e)
details += fmt.Sprintf("\n收入\t%v\t%v\t%v", balance, money, note)
// 是否发生收支行为
flag = true
case "3":
fmt.Println("-----------登记支出-----------")
fmt.Println("本次支出金额:")
fmt.Scanln(&money)
// 判断支出是否超出
if money > balance {
fmt.Println("余额不足")
continue
}
fmt.Println("本次支出说明:")
fmt.Scanln(¬e)
// 更新账户余额
balance -= money
// 更新详情
details += fmt.Sprintf("\n支出\t%v\t%v\t%v", balance, money, note)
// 是否发生收支行为
flag = true
case "4":
fmt.Println("-----------退出软件-----------")
fmt.Println("你确定要退出吗?y/n")
for {
fmt.Scanln(&choice)
if choice == "y" || choice == "n" {
break
}
fmt.Println("你的输入有误,你重新输入 y/n")
}
if choice == "y" {
loop = true
}
default:
fmt.Println("请输入正确选项")
}
// 如果退出,则结束循环
if loop {
break
}
}
}