go-家庭收支记账软件例子
家庭收支记账软件项目
项目需求说明
- 模拟实现基于文本界面的《家庭记账软件》
- 该软件能够记录家庭的收入、支出,并能够打印收支明细表
项目的界面
看代码效果
项目代码实现
实现基本功能(先使用面向过程,后面改成面向对象)
功能 1: 先完成可以显示主菜单,并且 可以退出
思路分析:
更加给出的界面完成,主菜单的显示, 当用户输入 4 时,就退出该程序
功能 2:完成可以 显示明细和 登记收入的功能
- 因为需要显示明细,我们定义一个变量 details string 来记录
- 还需要定义变量来记录余额(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(¬e)
//将这个收入情况,拼接到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(¬e)
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("你退出家庭记账软件的使用...")
}
项目代码实现改进
- 用户输入 4 退出时,给出提示"你确定要退出吗? y/n",必须输入正确的 y/n ,否则循环输入指令,直到输入 y 或者 n
- 当没有任何收支明细时,提示 "当前没有收支明细... 来一笔吧!"
- 在支出时,判断余额是否够,并给出相应的提示
- 将 面 向 过 程 的 代 码 修 改 成 面 向 对 象 的 方 法 , 编 写 myFamilyAccount.go , 并 使 用testMyFamilyAccount.go 去完成测试
思路分析:
把记账软件的功能,封装到一个结构体中,然后调用该结构体的方法,来 实现记账, 显示明细。结构体的名字 FamilyAccount .
在通过在 main 方法中,创建一个结构体 FamilyAccount 实例,实现记账即可.
main.go
package main
import (
"go_code/code/account/utils"
"fmt"
)
func main() {
fmt.Println("面向对象的方式来完成.....")
utils.NewMyFamilyAccount().MainMenu()
}
myFamilyAccount.go
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
}
}
go-家庭收支记账软件例子的更多相关文章
- golang实战--家庭收支记账软件(面向过程)
1.开发流程 2.目标 模拟实现一个基于文本界面的(家庭记账软件) : 初步掌握编程技巧和调试技巧: 主要包含以下知识点:局部变量和基本数据类型.循环语句.分支语句.简单屏幕格式输出.面向对象编程: ...
- Java项目之家庭收支记账软件
模拟实现基于文本界面的家庭记账软件,该软件能够记录家庭的收入支出,并能够打印收支明细表. 项目采用分级菜单方式.主菜单如下: 假设家庭起始的生活基本金为10000元. 每次登记收入(菜单2)后,收入的 ...
- golang实战--家庭收支记账软件(面向对象)
首先是具体的目录结构: 其中myAccount.go中调用utils包中的函数:utils.go实现记账软件的一些相应的功能: myAccount.go package main import ( & ...
- 61 C项目------家庭收支软件
1,目标: ①模拟实现一个基于文本界面的<家庭收支软件> ②涉及知识点 局部变量和基本数据类型 循环语句 分支语句 简单的屏幕输出格式控制 2,需求说明: ①模拟实现基于文本界面的< ...
- android软件简约记账app开发day09-主页面模块,收支记账信息的展示
android软件简约记账app开发day09-主页面模块,收支记账信息的展示 我们第一天已经绘制了记账条目的界面,也在主界面设置了LietView来展示记账条目,今天来实现记账后再主界面的展示效果 ...
- java使用dbutils工具类实现小程序 管家婆记账软件
1.所需创建的包和 jar包 2.创建表结构 #生成一些表数据 ,,'交通银行','2016-03-02','家庭聚餐'); ,,'现金','2016-03-15','开工资了'); ,,'现金', ...
- 从记账软件看工具类APP的存量运营之道
随着移动互联网的发展,APP的种类越来越多,一些工具类 APP 增长乏力,难以实现长期增长.只有提高用户留存时间,实现流量变现,才能在激烈的市场竞争中持续发展. 工具类APP的特点: 替代性很强: 用 ...
- “随手记”APP与已经发布的记账软件“鲨鱼记账”的差距
我们使用并观察了“鲨鱼记账”APP,发现,我们的软件真的还有很多不足的地方.就功能这方面来说:“鲨鱼记账”APP有更多的收入.支出分类:就界面来说:“鲨鱼记账”APP有比我们优美太多的页面和背景.但是 ...
- 推荐一款复式记账软件——GnuCash
本文需要搞清楚两个事情,第一,什么是复式记账:第二,GnuCash操作 复式记账,来自百度百科的解释:复式记账法是以资产与权益平衡关系作为记账基础,对于每一笔经济业务,都要以相等的金额在两个或两个以上 ...
随机推荐
- js 运算的内置函数
// 一.Math.round()作用:四舍五入返回整数.(返回参数+0.5后,向下取整) // Math.round(5.57) //返回6 // Math.round(2.4) //返回2 // ...
- C语言程序设计100例之(21):折半查找
例21 折半查找 问题描述 顺序查找是一种最简单和最基本的检索方法.其基本思想是:从检索表的一端(如表中第一个记录或最后一个记录)开始,逐个进行记录的关键字和给定值的比较.若某个记录的关键字和给定值 ...
- Java实现自定义注解开发
Java实现自定义注解开发 一直都对注解开发挺好奇的,最近终于有时间自己实践了一把,记录一下 万一后期会用到呢 哈哈哈 首先我们了解一下自定义注解的标准示例,注解类使用 @interface 关键字修 ...
- fjnu2019第二次友谊赛 F题
### 题目链接 ### 题目大意: 一开始手上有 z 个钱币,有 n 天抉择,m 种投资方案,在每天中可以选择任意种投资方案.任意次地花费 x 个钱币(手上的钱币数不能为负),使得在 n 天结束后, ...
- 【xAsset框架】HFS 轻量级HTTP Server快速入门指南
一.引子 最近马三有幸参与开发了一个简易轻量的Unity资源管理框架 xAsset ,xasset 提供了一种使用资源路径的简单的方式来加载资源,简化了Unity项目资源打包,更新,加载,和回收的作业 ...
- SpringBoot打包为war包,并在tomcat中运行
先看一下我创建的最简单的项目吧. controller类 @RestController public class TestController { @RequestMapping("ind ...
- Kubernetes的ConfigMap对象使用
ConfigMap和Secret几乎一样,只是Secret会用base64加密,创建方式也可以彩yaml或者文件方式 下面演示一下通过文件创建configmap 创建配置文件my.yaml name: ...
- 1.1选择select
一.核心(Core) 1.1选择 1.1.1 d3.select(selector) 选择第一个与指定字符串selector匹配的元素,如果没有就返回空. 例如: <table> &l ...
- Android8.1 源码修改之通过黑名单屏蔽系统短信功能和来电功能
前言 之前写过一篇Android6.0 的屏蔽系统短信功能和来电功能,具体看这里 同样的最近有个新需求,需要将8.1 设备的来电功能和短信功能都屏蔽掉,特殊产品就是特殊定制,那就开始吧. 屏蔽短信功能 ...
- SQL Server(MSSQLSERVER) 请求失败或服务未及时响应,有关详细信息,请参见事件日志或其他的适用的错误日志。
转自:https://www.fengjunzi.com/blog-25573.html 问题 有时候sqlserver无法启动了,原因是mssqlserver服务没有启动,当你手动启动时,又出现服务 ...