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操作 复式记账,来自百度百科的解释:复式记账法是以资产与权益平衡关系作为记账基础,对于每一笔经济业务,都要以相等的金额在两个或两个以上 ...
随机推荐
- Java操作数据库——在JDBC里使用事务
Java操作数据库——在JDBC里使用事务 摘要:本文主要学习了如何在JDBC里使用事务. 使用Connection的事务控制方法 当JDBC程序向数据库获得一个Connection对象时,默认情况下 ...
- JavaScript 赋值
JavaScript 赋值运算符 赋值运算符向 JavaScript 变量赋值. 运算符 例子 等同于 = x = y x = y += x += y x = x + y -= x -= y x = ...
- Python3爬取豆瓣网电影信息
# -*- coding:utf-8 -*- """ 一个简单的Python爬虫, 用于抓取豆瓣电影Top前250的电影的名称 Language: Python3.6 ...
- JS基础语法---Date对象中常见的方法
创建实例对象 var dt = new Date(); //当前的时间---当前的服务器 console.log(dt); var dt = new Date("2017-08-12&quo ...
- Spring Boot 2 发布与调用REST服务
开发环境:IntelliJ IDEA 2019.2.2Spring Boot版本:2.1.8 一.发布REST服务 1.IDEA新建一个名称为rest-server的Spring Boot项目 2.新 ...
- Ubuntu16.04 安装 JDK
1.到Oracle官网下载 地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html ...
- JS关于日期格式转换的问题
写Js时,有个地方用到日期,要求是yyyy--MM--dd的格式,于是想到了format函数,下面介绍了时间函数的定义,和调用前引入函数和如何格式化自己想要的日期格式. //当前时间 var Time ...
- How to recover a skipped tablespace after an incomplete recovery? (Doc ID 1561645.1)
How to recover a skipped tablespace after an incomplete recovery? (Doc ID 1561645.1) APPLIES TO: Ora ...
- Django—开发具体流程
1.创建Django项目 [root@localhost ~]# django-admin startproject 项目名 [root@localhost ~]# django-admin star ...
- 一个版本烧录过程中记录:fdisk、mkfs.ext4、make_ext4fs、img2simg、simg2img
关键词:dd.fdisk.mkfs.ext4.make_ext4fs.img2simg.simg2img等等. 一个典型的嵌入式系统是由uboot+kernel+rootfs组成的,其中uboot和k ...