第十二章 Golang家庭收支记账软件项目

news2024/11/17 19:29:47

1.项目开发流程

在这里插入图片描述

2.项目需求说明

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

3.项目的界面

在这里插入图片描述

在这里插入图片描述

4.项目代码实现

实现基本功能(先使用面向过程,后面改成面向对象)
功能1:先完成可以显示主菜单,并且可以退出
思路分析:
更加给出的界面完成,主菜单的显示,当用户输入4时,就退出该程序
功能2:完成可以显示明细和登记收入的功能
思路分析:

  1. 因为需要显示明细,我们定义一个变量details string 来记录
  2. 还需要定义变量来记录余额(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() 
}

感谢大家观看,我们下次见

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/70480.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Shell 脚本速成】10、Shell 流程控制 while 循环

目录 一、while 介绍 1.1 while 语法 二、while 与 shell 运算 2.1 比较运算 2.2 逻辑运算 2.3 文件类型判断 2.4 特殊条件 三、while 与循环控制语句 3.1 sleep 语句 3.2 break 3.3 continue 四、while 嵌套其他语句 4.1 while 嵌套 if 4.2 while 嵌套 for 4.…

XSKY星晨天合-后台开发岗

一面 TCP与UDP区别UDP的优点(实时性好,占用资源低,无需三次握手较少被黑客利用的机会)UDP增加哪些功能可以实现更可靠、更稳定、且保证有序(超时重传、滑动窗口流量控制、序号/确认序号,面试官提到了kcp&a…

使用HTML制作静态宠物网站——蓝色版爱宠之家(HTML+CSS)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

【ES6】阮一峰ES6学习(六) Proxy(一)

Proxy1. 前言2. 使用1. get()方法2. set()方法未完待续1. 前言 es6中全新设计了一个叫Proxy的类型,Proxy这个词的原意是代理,用在这里表示由它来”代理“某些操作,可以译为”代理器“,Proxy就是专门为对象设置访问代理器的&#…

【1775. 通过最少操作次数使数组的和相等】

来源:力扣(LeetCode) 描述: 给你两个长度可能不等的整数数组 nums1 和 nums2 。两个数组中的所有值都在 1 到 6 之间(包含 1 和 6)。 每次操作中,你可以选择 任意 数组中的任意一个整数&…

1978-2021年全国GDP平减指数计算模板

全国GDP平减指数计算公式可以给定基期,自动计算平减指数! 1、时间区间:1978-2021年 2、计算说明:GDP平减指数名义GDP/实际GDP 实际GDP又称不变价GDP,名义GDP就是公布的数字,它没有考虑通货膨胀因素。 给…

【Unity】UnityWebRequest学习——Unity中的HTTP网络通信

目录UnityWebRequest 简介HTTP网络通信流程HTTP 三点注意事项HTTP请求HTTP响应例子使用Unity内置的UnityWebRequest类进行HTTP请求(GET)使用BestHTTP插件进行HTTP请求(GET)使用Unity内置的UnityWebRequest类进行HTTP请求&#xff…

主成分分析/因子分析与线性映射

数据降维,包括主成分分析PCA和因子分析FA,都离不开特征值和特征向量。今天先不细说特征值和特征向量,先说一说理解数据降维的一个关键概念,线性映射。 看到csdn里很多文章讲特征值与特征向量时,都会先讲讲线性映射&am…

绿色荧光试剂Fluorescein Tyramide,荧光素酪胺,210236-90-1

CAS编号为210236-90-1的化学试剂其英文名为Fluorescein Tyramide,其中文名称为荧光素酪胺,它是一种绿色荧光染料。 该荧光试剂的分子量是495.49 ,分子式为C29H21NO7。该试剂质量控制为95%,试剂的储存条件为: -20℃长期…

维二糖-聚乙二醇-酰基,Cellobiose-PEG-Hydrazide,酰基-PEG-纤维二糖

维二糖-聚乙二醇-酰基,Cellobiose-PEG-Hydrazide,酰基-PEG-纤维二糖 中文名称:纤维二糖-酰基 英文名称:Cellobiose-Hydrazide 别称:生物素修饰纤维二糖,生物素-纤维二糖 酰基(acyl group),是…

[附源码]计算机毕业设计框架的资产管理系统设计与实现Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Linux学习笔记——初识Linux

01、初识Linux 1.1、操作系统概述 1、学习目标: 了解操作系统的作用了解常见的操作系统 2、硬件和软件 我们所熟知的计算机是由硬件和软件组成的。 硬件:计算机系统中由电子、机械和光电元件等组成的各种物理装置的总称。(看的见、摸得…

基于jsp+mysql+SSM动物园门票预订网站系统-计算机毕业设计

项目介绍 现代化动物园管理系统日趋复杂,传统的以手工方式为主的管理操作模式,局限性日趋突显:宣传手段单一,管理效率低,系统采用了jsp的mvc框架,SSM(springMvcspringMybatis)框架进行开发,本系统使用mysql,独立运行,…

保姆级 | Python设置py2和py3共存

0x00 前言 在使用一些 python 脚本时,有些库只能用 python2.X 版本进行使用,而有些脚本却需要 python3.X 版本进行。如果不能在一个主机中设置 py2 和 py3 共存,那么会对自身的工作造成极大的不便。 0x01 环境说明 python-2.7.18python-3.11…

ATTCK-T1592-001-收集受害者主机信息-硬件

0X01 基础信息 具体信息详情ATT&CK编号T1592-001所属战术阶段侦察操作系统windows10 企业版 LTSC创建时间2022年11月7日监测平台火绒安全、火绒剑、sysmon 0X02技术原理 在入侵受害者之前,攻击者可能会收集有关受害者主机硬件的信息,这些信息可以在…

作为测试开发岗的面试官,我都是怎么选人的?

最近一段时间面试了不少人,主要是一些测试开发岗,中高级的初级的也都有;也有一些偏业务测试岗的候选人。总结出了一些方法论,或者说更多的是个人作为面试官所遵守的一套面试准则。 1.什么是面试? 面试不仅仅是你问我…

什么是数字签名?(数字签名与信息摘要又有什么关系?)

在上一篇博文【什么是信息摘要】结尾我给出了一个结论:“看来单纯的信息摘要技术还不能保证信息的完整性,即不能确定信息是否被篡改”,由此并引出了“数字签名”的概念。上一篇博文的地址在下面,没看的小伙伴可以看一下&#xff0…

CSDN第13次竞赛题解与总结

前言 2022/12/7 CSDN第13次竞赛「人民邮电出版社 & CSDN」联合主办。 本次奖品为《计算之魂》: 系统地讲解了计算机科学的精髓,不仅有助于了解计算机科学,更有助于了解 IT 产业的技术特点、培养一些特殊的思维方式、掌握信息时代特殊的…

开源web自定义表单有哪几个特点?

目前,市场正在蓬勃发展中,作为企业,采用传统表单的弊端也逐渐显现出来,面临比较大的问题就是办公效率得不到提升。在各行各业正积极筹备朝着数字化方向转型的背景下,采用开源web自定义表单可以弥补传统表单弊端&#x…

windows系统“彻底”隐藏任务栏

项目概况及目标 因某项目所需,要实现win10系统上任务栏的“彻底”隐藏。此处任务栏隐藏要求无键盘操作无法唤出。 方案一、任务栏设置 我们都知道,在任务栏设置中可以通过更改自动隐藏任务栏选项来实现任务栏的隐藏显示。 但是该方案的隐藏会在鼠标经…