家庭收支记账软件项目

项目需求说明

  1. 模拟实现基于文本界面的《家庭记账软件》
  2. 该软件能够记录家庭的收入、支出,并能够打印收支明细表

项目的界面

看代码效果

项目代码实现

实现基本功能(先使用面向过程,后面改成面向对象)

功能 1: 先完成可以显示主菜单,并且 可以退出

思路分析:

更加给出的界面完成,主菜单的显示, 当用户输入 4 时,就退出该程序

功能 2:完成可以 显示明细和 登记收入的功能

  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 去完成测试

思路分析:

把记账软件的功能,封装到一个结构体中,然后调用该结构体的方法,来 实现记账, 显示明细。结构体的名字 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-家庭收支记账软件例子的更多相关文章

  1. golang实战--家庭收支记账软件(面向过程)

    1.开发流程 2.目标 模拟实现一个基于文本界面的(家庭记账软件) : 初步掌握编程技巧和调试技巧: 主要包含以下知识点:局部变量和基本数据类型.循环语句.分支语句.简单屏幕格式输出.面向对象编程: ...

  2. Java项目之家庭收支记账软件

    模拟实现基于文本界面的家庭记账软件,该软件能够记录家庭的收入支出,并能够打印收支明细表. 项目采用分级菜单方式.主菜单如下: 假设家庭起始的生活基本金为10000元. 每次登记收入(菜单2)后,收入的 ...

  3. golang实战--家庭收支记账软件(面向对象)

    首先是具体的目录结构: 其中myAccount.go中调用utils包中的函数:utils.go实现记账软件的一些相应的功能: myAccount.go package main import ( & ...

  4. 61 C项目------家庭收支软件

    1,目标: ①模拟实现一个基于文本界面的<家庭收支软件> ②涉及知识点 局部变量和基本数据类型 循环语句 分支语句 简单的屏幕输出格式控制 2,需求说明: ①模拟实现基于文本界面的< ...

  5. android软件简约记账app开发day09-主页面模块,收支记账信息的展示

    android软件简约记账app开发day09-主页面模块,收支记账信息的展示 我们第一天已经绘制了记账条目的界面,也在主界面设置了LietView来展示记账条目,今天来实现记账后再主界面的展示效果 ...

  6. java使用dbutils工具类实现小程序 管家婆记账软件

    1.所需创建的包和 jar包 2.创建表结构  #生成一些表数据 ,,'交通银行','2016-03-02','家庭聚餐'); ,,'现金','2016-03-15','开工资了'); ,,'现金', ...

  7. 从记账软件看工具类APP的存量运营之道

    随着移动互联网的发展,APP的种类越来越多,一些工具类 APP 增长乏力,难以实现长期增长.只有提高用户留存时间,实现流量变现,才能在激烈的市场竞争中持续发展. 工具类APP的特点: 替代性很强: 用 ...

  8. “随手记”APP与已经发布的记账软件“鲨鱼记账”的差距

    我们使用并观察了“鲨鱼记账”APP,发现,我们的软件真的还有很多不足的地方.就功能这方面来说:“鲨鱼记账”APP有更多的收入.支出分类:就界面来说:“鲨鱼记账”APP有比我们优美太多的页面和背景.但是 ...

  9. 推荐一款复式记账软件——GnuCash

    本文需要搞清楚两个事情,第一,什么是复式记账:第二,GnuCash操作 复式记账,来自百度百科的解释:复式记账法是以资产与权益平衡关系作为记账基础,对于每一笔经济业务,都要以相等的金额在两个或两个以上 ...

随机推荐

  1. IT兄弟连 HTML5教程 HTML5表单 HTML5新增表单元素

    HTML5有一些新的表单元素:<datalist>.<keygen>.<output>.不是所有的浏览器都支持HTML5新的表单元素,但即使浏览器不支持该表单属性, ...

  2. Hyperledger Fabric相关文件解析

    1相关文件说明 这一部分涉及相关配置文件的解析, 网络的启动涉及到多个文件,本文按以下顺序进行分析: . ├── base │   ├── docker-compose-base.yaml #1 │  ...

  3. NFS深度解析及搭建同步NFS服务

    1.nfs 进程 [root@nfsserver ~]# ps -ef|egrep "nfs|rpc" rpcuser : ? :: rpc.statd -->检查文件一致性 ...

  4. 如何获取JVM堆转储文件

    堆转储是诊断与内存相关的问题(例如内存泄漏缓慢,垃圾回收问题和 java.lang.OutOfMemoryError.它们也是优化内存消耗的重要工具. 有很多很不错的的工具,例如Eclipse MAT ...

  5. Postman安装出错.NET Framework 4.5 failed to install

    正常情况下安装Postman不会出错,联网下载即可,这里的异常是因为环境不允许升级.NET4.5 解决方法:找到Postman的安装文件夹,将postman.exe启动发现可以使用 若没有安装过的文件 ...

  6. ASP.NET MVC教程八:_ViewStart.cshtml

    一.引言 _ViewStart.cshtml是在ASP.NET MVC 3.0及更高版本以后出现的,用Razor模板引擎新建项目后,Views目录下面会出现一个这样的文件: 打开_ViewStart. ...

  7. JavaScript动态加载script方式引用百度地图API 拓展---JavaScript的Promise

    上一篇博客JavaScript动态加载script方式引用百度地图API,Uncaught ReferenceError: BMap is not defined 这篇文章中我接触到一个新的单词:Pr ...

  8. 使用adb命令操控Android手机(adb命令)

    1) 手机连接电脑之前 首先,查看安卓手机是否已经连接上电脑 adb devices 让adb一直查找安卓设备,找到后才停止 adb wait-for-device 2) 手机连接电脑后的操作 2.0 ...

  9. Makefile 文件格式;makefile伪目标

    Makefile包含 目标文件.依赖文件.可运行命令三部分. 每部分的基本格式例如以下: test: prog.o  code.o gcc  -o  test   prog.o   code.o 当中 ...

  10. 学习笔记:Django开发网上教育平台(参考了慕课网的教学视频)

    第一步:进行环境的搭建(用到的IDE:pycharm  ,数据库为mysql.nacicat.编辑语言python3.7.以及自己配置的虚拟环境venvpy37) Django==2.2​ ​ 配置好 ...