Golang收支记账程序详细编写过程

目录
  • 1.项目开发流程
  • 2.项目需求说明
  • 3.项目的界面
  • 4.项目代码实现

1.项目开发流程

2.项目需求说明

模拟实现基于文本界面的《家庭记账软件》

该软件能够记录家庭的收入,支出,并能够打印收支明细表

3.项目的界面

4.项目代码实现

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

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

思路分析:

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

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

思路分析:

  • 因为需要显示明细,我们定义一个变量details string 来记录
  • 还需要定义变量来记录余额(balance),每次收支的金额(money),每次收支的说明(note)

代码改进

用户输入4退出时,给出提示“你确定要退出吗?y/n”,必须输入正确的y/n,否则循环输入指令,直到输入y或者n

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("-------家庭收支记账软件---------")
		fmt.Println("                    1.收支明细")
		fmt.Println("                    2.登记收入")
		fmt.Println("                    3.登记支出")
		fmt.Println("                    4.退出软件")
		fmt.Println("请选择(1-4):")
		fmt.Scanln(&key)
		switch key{
			case "1":
				fmt.Println("\n----------当前收支明细记录-----------")
				if flag {
					fmt.Println(details)
				}else{
					fmt.Println("当前没有收支明细...  来一笔吧!")
				}
				// fmt.Println(details)
			case "2":
				fmt.Println("本次收入金额:")
				fmt.Scanln(&money)
				balance += money // 修改账户余额
				fmt.Println("本次收入说明:")
				fmt.Scanln(&note)
				// 将这个收入情况,拼接到details变量
				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)
			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 {
			fmt.Println("你退出家庭账本")
			break;
		}
	}
}

将上面的代码改成面向对象的方法,编写myFamilyAccount.go,并使用testMyFamilyAccount.go去完成测试

思路分析

把记账软件的功能,封装到一个结构体中,然后调用该结构体的方法,来实现记账,显示明细。结构体的名字FamilyAccount

在通过main方法中,创建一个结构体FamilyAccount实例,实现记账即可。

// familyAccount.go

package utils
import (
  "fmt"
)
type FamilyAccount struct{
	key string
	// 声明一个字段,控制是否退出for
	loop bool
	// 定义账户的余额 []
	balance float64
	// 每次收支的金额
	money float64
	// 每次收支的说明
	note string
	// 定义一个变量,记录是否有收支的行为
	flag bool
	// 收支的详情使用字符串来记录
	//当有收支时,只需要对details进行拼接处理即可
	details string
}
// 编写一个工厂模式的构造方法,返回一个*FamilyAccount实例
func NewFamilyAccount() *FamilyAccount{
	return &FamilyAccount{
		key:"",
		loop:true,
		balance:10000.0,
		money:0.0,
		note:"",
		flag:false,
		details:"收入\t账户金额\t收入金额\t说  明"
	}
}
// 显示明细方法
func (this *FamilyAccount) showDetails(){
	fmt.Println("\n----------当前收支明细记录-----------")
	if this.flag {
		fmt.Println(this.details)
	}else{
		fmt.Println("当前没有收支明细...  来一笔吧!")
	}
}
// 登记收入方法
func (this *FamilyAccount) income(){
	fmt.Println("本次收入金额:")
	fmt.Scanln(&this.money)
	this.balance += this.money // 修改账户余额
	fmt.Println("本次收入说明:")
	fmt.Scanln(&this.note)
	// 将这个收入情况,拼接到details变量
	this.details += fmt.Sprintf("\n收入\t%v\t%v\t%v",this.balance,this.money,this.note)
	this.flag = true
}
// 登记支出方法
func (this *FamilyAccount) pay(){
	fmt.Println("登记支出金额:")
	fmt.Scanln(&this.money)
	// 这里需要做一个必要的判断
	if this.money > this.balance{
		fmt.Println("余额的金额不足")
		break
	}
	this.balance -= this.money
	fmt.Println("本次支出说明:")
	fmt.Scanln(&this.note)
	this.details += fmt.Sprintf("\n支出\t%v\t%v\t%v",this.balance,this.money,this.note)
}
// 退出方法
func (this *FamilyAccount) exit(){
	fmt.Println("你确定要退出吗?y/n")
	choice := ""
	for{
		fmt.Scanln(&choice)
		if choice == "y" || choice == "n"{
			break
		}
		fmt.Println("你的输入有误,请重新输入y/n")
	}
	if choice == "y"{
		this.loop =  false
	}
}
//给该结构体绑定相应的方法
// 显示主菜单
func (this  *FamilyAccount) MainMenu(){
	for {
		fmt.Println("-------家庭收支记账软件---------")
		fmt.Println("                    1.收支明细")
		fmt.Println("                    2.登记收入")
		fmt.Println("                    3.登记支出")
		fmt.Println("                    4.退出软件")
		fmt.Println("请选择(1-4):")
		fmt.Scanln(&this.key)
		switch this.key{
			case "1":
				this.showDetails()
			case "2":
				 this.income()
			case "3":
				 this.pay()
			case "4":
				this.exit()
			default :
			    fmt.Println("请输入正确的选项..")
		}
		if !this.loop {
			break;
		}
	}
}

// main.go

package main
import (
  "go_code/familyaccount/utils"
)
func main(){
	fmt.Println("这个是面向对象的方式完成~~")
	utils.NewFamilyAccount().MainMenu()
}

到此这篇关于Golang收支记账程序详细编写过程的文章就介绍到这了,更多相关Golang收支记账内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • golang实现微信小程序商城后台系统(moshopserver)

    golang和c/c++比起来是一门新的语言,一直想学,网上搜集了一些资料,有些人说很容易上手,确实是这样,和C/C++比起来,少了很多乱七八糟的语法.学一门新的语言,最好的方法就是动手写一些东西,最近小程序也比较火,也想学一下,网络上搜索的一些开源项目,基本上没有golang实现的,大部分都是nodejs和java写的,那么我就来实现一个golang版的吧,一石二鸟. 开发小程序前后端都需要开发,自己的前端经验很少,搜索了一些开源代码,有一个小程序项目让人眼前一亮,Nideshop,界面做的不

  • Golang通过小程序获取微信openid的方法示例

    为什么要获取小程序的 openid 在开发微信小程序的过程中,小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系.那么这个用户身份标识就是 openid. 小程序获取 openid 的流程 那么小程序获取 openid 的流程具体如下,这里我简化了一下,因为我们只需要获取到 openid 即可,具体可以参考 这里 我们需要在小程序中调用 wx.login() 获取 code 码,然后将这个 code 码发送给后端,后端带着这个 code 码和 app

  • Golang收支记账程序详细编写过程

    目录 1.项目开发流程 2.项目需求说明 3.项目的界面 4.项目代码实现 1.项目开发流程 2.项目需求说明 模拟实现基于文本界面的<家庭记账软件> 该软件能够记录家庭的收入,支出,并能够打印收支明细表 3.项目的界面 4.项目代码实现 实现基本功能(先使用面向过程,后面改成面向对象) 功能1:先完成可以显示主菜单,并且可以退出 思路分析: 更加给出的界面完成,主菜单的显示,当用户输入4时,就退出该程序 功能2:完成可以显示明细和登记收入的功能 思路分析: 因为需要显示明细,我们定义一个变量

  • Go-家庭收支记账软件项目实现

    目录 项目开发流程说明 项目需求说明 项目的界面 项目代码实现 实现基本功能(先使用面向过程,后面改成面向对象) 功能 1:先完成可以显示主菜单,并且可以退出 功能 2:完成可以显示明细和登记收入的功能 功能 3:完成了登记支出的功能 项目代码实现改进 对项目的扩展功能的练习 项目开发流程说明 项目需求说明 模拟实现基于文本界面的<家庭记账软件>该软件能够记录家庭的收入.支出,并能够打印收支明细表 项目的界面 项目代码实现 实现基本功能(先使用面向过程,后面改成面向对象) 功能 1:先完成可以

  • Java项目--家庭收支记录程序

    目录 一.项目需求及流程说明 1.需求说明 2.流程说明 项目阶段1 项目阶段2 项目阶段3 二.完整源代码及工具类 1.源代码 2.工具类 三.程序部分运行结果展示 总结 一.项目需求及流程说明 本项目学习目标: 1.模拟实现一个基于文本界面(程序控制台)的<家庭收支记录程序> 2.掌握初步的编程技巧和调试技巧 3.灵活运用基础知识 1.需求说明 模拟实现一个基于文本界面(程序控制台)的<家庭收支记录程序>,该程序能够记录家庭的收入.支出,并能够打印收支明细表. 项目采用分级菜单

  • 嵌入式C程序优质编写全面教程规范

    目录 摘要: 1. 简介 2. C语言特性 2.1处处都是陷阱 2.1.1 无心之过 2.1.2 数组下标 2.1.3 容易被忽略的break关键字 2.1.4 意想不到的八进制 2.1.5 指针加减运算 2.1.6 关键字sizeof 2.1.7 增量运算符’++’和减量运算符’—‘ 2.1.8 逻辑与’&&’和逻辑或’||’的陷阱 2.1.9 结构体的填充 2.2 不可轻视的优先级 2.3 隐式转换 3. 编译器 3.1 不能简单的认为是个工具 3.2 不能依赖编译器的语义检查 3.2

  • 世界著名程序SpringMVC完整过程

    目录 SpringMVC程序实现 一.什么是 MVC MVC 工作流程 二.什么是 SpringMVC SpringMVC 的特点 三.开发环境准备 四.动手实现 Hello world 1. 创建工程 2. 引入依赖 3. 配置 web.xml 3. 配置 spring 配置文件 4. 编写请求控制器 5. 编写页面文件 6. 启动项目 SpringMVC程序实现 一.什么是 MVC MVC 其实是一种架构思想,将软件按照模型.视图.控制器来划分. M:是指 Model,就是模型层,指工程中的

  • 安全脚本程序的编写 V1.0第1/3页

    基本思路: 为每一个功能写一个独立的程序,程序页 尽可能少的让客户了解你的服务器端信息 不要用"客户应该这么写"这个思路想问题 尽可能多的想到不可能发生的事情  1.关于交互式动态网页可能存在的问题 1.1 form类型的交互 1.1.1 概念介绍 在我们和浏览者进行交互时,最常用到的就是form(post/get/put方法),虽然非常方便,但是很多问题也是因他而起. form表单中input标志 用来接受用户输入的信息,例如:用户名.密码.email等.如果你没有对用户输入进行很好

  • mpvue+vuex搭建小程序详细教程(完整步骤)

    本文介绍了mpvue+vuex搭建小程序详细教程(完整步骤),分享给大家,具体如下: 源码 mpvue-vuex-demo 构成 1.采用mpvue 官方脚手架搭建项目底层结构 2.采用Fly.js 作为http请求库 3.引入mpvue-router-patach,以便在mpvue小程序中能使用vue-router的写法 目录结构 ├── src // 我们的项目的源码编写文件 │ ├── components // 组件目录 │ ├── common //静态资源 │ │ └── font

  • Golang实现AES对称加密的过程详解

    AES加密 AES对称加密简介 AES是一个对称密码,旨在取代DES成为广泛使用的标准.是美国联邦政府采用的一种区块加密标准. AES对称加密过程 加密解密算法的输入是一个128位分组.这些分组被描述成4×4的字节方阵,这个分组被复制到数组中,并在加密和解密的每一阶段都被修改.在字节方阵中,每一格都是一个字,包含了4字节.在矩阵中字是按列排序的. 加密由N轮构成,轮数依赖于密钥长度:16字节密钥对应10轮,24字节密钥对应12轮,32字节对应14轮. AES加密模式 1.电码本模式(Electr

  • 如何理解PHP程序执行的过程原理

    概述 Web环境我们假设为Apache.在编译PHP的时候,为了能够让Apache支持PHP,我们会生成一个mod_php5.so的模块.Apache加载这个模块,在url访问.php文件的时候,就会转给mod_php5.so模块来处理. 这个就是我们常说的SAPI.英文名字是:Server Application Programming Interface.SAPI其实是一个统称,其下有 ISAPI,CLI SAPI,CGI等.有了它,就可以很容易的跟其他东西交互,比如APACHE,IIS,C

随机推荐