18、做中学 | 初升高 | 考场一 | 面向过程-家庭收支记账软件

初中的时候,如果有一堆数据,根据装的容器不同,分为数组或者集合。有一段逻辑,根据是否判断还是循环执行,分为分支语句和循环语句...这些内容汇总起来,就是接下来的一个小项目
由于是第一个小项目,本次引导为:面向过程编写

一、需求讨论

1. 总体需求

开发一个"命令行版家庭收支记账软件"

程序启动后进入一个循环菜单,用户可以多次进行以下操作:

  1. 查看当前所有收支明细;
  2. 登记一笔收入;
  3. 登记一笔支出(需要检查余额是否足够);
  4. 退出软件(带二次确认)。

所有数据(余额、明细等)都保存在内存变量中,只在本次运行有效

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(&note)
			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(&note)

			// 更新账户余额
			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(&note)
			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(&note)

			// 更新账户余额
			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
		}
	}

}
相关推荐
wear工程师7 分钟前
ThreadLocal 在线程池里为什么会串数据:别只会答内存泄漏
java·后端
Iruoyaoxh7 分钟前
栈和队列~
java·开发语言
Hrain-AI15 分钟前
2026 企业 AI 编程智能体实战:Codex 与 Claude Code
开发语言·人工智能·kotlin
whyfail39 分钟前
前端学 Spring Boot(2):一次点击,如何穿过整个后端?
前端·spring boot·后端
wdfk_prog41 分钟前
嵌入式面试真题第 13 题:单硬件 Timer 下的高精度多路软件定时器架构设计
c语言·开发语言·面试·职场和发展·嵌入式
oort1231 小时前
吃上了自家的细糠,还挺丝滑,用起来手感还行,OortCloud发布新版AI编程平台,下载 OortCodex,Token多,免费薅
大数据·开发语言·人工智能·ai编程
slandarer1 小时前
MATLAB | 泰勒图绘制,支持各种角度范围
开发语言·数学建模·matlab·nature·顶刊·泰勒图
mct1231 小时前
c++ iconv 字符utf-8转换gb2312失败
开发语言·c++
程序员cxuan3 小时前
Loop 还没玩明白,Graph Engineering 又火了。
人工智能·后端·程序员
Marst Code3 小时前
Python 3.9 已停止维护!从 3.9 到 3.14 全版本深度对比,生产环境该选哪个?
开发语言·python