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操作 复式记账,来自百度百科的解释:复式记账法是以资产与权益平衡关系作为记账基础,对于每一笔经济业务,都要以相等的金额在两个或两个以上 ...
随机推荐
- Swoole编译安装步骤
Swoole扩展是按照php标准扩展构建的.使用phpize来生成php编译配置,./configure来做编译配置检测,make进行编译,make install进行安装. 请下载releases版 ...
- Bit Manipulation-leetcode
Bit Manipulation Find the Difference /* * Given two strings s and t which consist of only lowercase ...
- C++入门到理解之文件操作(文本文件的读写+二进制文件的读写)
原文地址http://www.javayihao.top/detail/168 一:概述 1.程序在运行中产生的数据都是临时数据,程序一旦运行结束会被释放,可以通过文件相关的操作将数据持久保存. 2. ...
- SpringCloud微服务(01):Eureka组件,管理服务注册与发现
本文源码:GitHub·点这里 || GitEE·点这里 一.Eureka基本架构 1.Eureka简介 Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,SpringCl ...
- 解析innodb中的MVCC
本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...
- 爬虫selenium中动作链接ActionChains
一.基本语法 生成一个动作actions=ActionChains(driver) 动作添加方法actions.方法 执行 actions.perform() 二.方法列表 click(on_elem ...
- 使用laravel-amdin调用文件上传阿里oss注意点
开发者工作中,项目代码开发提高效率,往往会使用一些github上面的一些扩展类,这里举例说明一下遇到的情况. 一.使用laravel-admin框架开发管理后台文件或者图片上传 情景:运营或者产品通过 ...
- IDEA中新建SpringBoot项目时提示:Artifact contains illegal characters
场景 一步一步教你在IEDA中快速搭建SpringBoot项目: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/87688277 ...
- zabbix监控服务
1.模板的重要 1.手动添加监控比较麻烦,监控项 -> 图形 -> 触发器. 问题: 1.例如: 100台服务器需要检查81端口 2.例如: 100台服务器81改成82 解决: 使用模 ...
- vue非父子关系之间通信传值
第一种方法: 通过给vue实例添加自定义属性 <!DOCTYPE html> <html> <head> <meta charset="utf-8& ...