当前位置: 首页 > news >正文

golang项目----家庭收支记账软件

家庭收支记账软件

    • 实现基本功能(先使用面向过程,后面改成面向对象)
      • 项目代码实现改进
    • 面向过程源码
    • 面向对象源码
      • utils包中
      • main包中

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

编写文件TestMyAccount.go完成基本功能

  • 功能一:先完成可以显示主菜单,并且可以退出
  • 功能二:完成可以显示明细和登记收入的功能
  • 功能三:完成登记支出的功能

项目代码实现改进

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

2,当没有任何收支明细时,提示"当前没有收支明细…"

3,在支出时,判断余额是否够,并给出相应的提示

4,将面向过程的代码修改成面向对象的方法,编写myFamilyAccount.go,并使用testMyFanillyAccount.go去完成测试

面向过程源码

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.Println("                      请选择(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      10000       血汗钱details += fmt.Sprintf("\n收入\t%v\t%v\t%v", balance, money, note)flag = truecase "3":fmt.Println("本次支出的金额:")fmt.Scanln(&money)//这里做一个必要的判断if money > balance {fmt.Println("余额不足")break}balance -= moneyfmt.Println("本次支出的说明:")fmt.Scanln(&note)details += fmt.Sprintf("\n支出\t%v\t%v\t%v", balance, money, note)flag = truecase "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("你退出了家庭记账软件的使用")}

面向对象源码

思路:

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

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

utils包中

package utils
import ("fmt"
)type FamilyAccount struct {//声明必须的字段//声明一个字段,保存接受用户输入的选项key string//声明一个字段,控制是否退出for循环loop bool//定义账户的金额balance float64//每次收支的金额money float64//每次收支的说明note string//定义一个变量,记录是否有收支行为flag bool//收支的详情使用字符串来记录//当有收支的时候,只需要对details进行拼接处理details string
}//编写一个工厂模式的构造方法,返回一个*FanilyAccount实例
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("-----------------当前收支明细记录----------------")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//收入    11000      10000       血汗钱this.details += fmt.Sprintf("\n收入\t%v\t%v\t%v", this.balance, this.money, this.note)flag = true
}//将支出写成一个方法
func (this *FamilyAccount) pay() {fmt.Println("本次支出的金额:")fmt.Scanln(&this.money)//这里做一个必要的判断if this.money > this.balance {fmt.Println("余额不足")//break}this.balance -= this.moneyfmt.Println("本次支出的说明:")fmt.Scanln(&this.note)this.details += fmt.Sprintf("\n支出\t%v\t%v\t%v", this.balance, this.money, this.note)this.flag = true
}//将退出写成一个方法
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("\n--------------------家庭收支记账软件------------------")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}fmt.Println("你退出了家庭记账软件的使用")}
}

main包中

package main
import ("go_code/Familycount/main"
)func main(){utils.NewFamilyAccount().MainMenu()
}

相关文章:

golang项目----家庭收支记账软件

家庭收支记账软件实现基本功能(先使用面向过程,后面改成面向对象)项目代码实现改进面向过程源码面向对象源码utils包中main包中实现基本功能(先使用面向过程,后面改成面向对象) 编写文件TestMyAccount.go完成基本功能 功能一:先完成可以显示…...

中国LNG市场投资机会研究

中国LNG市场投资机会研究中国LNG市场是一个具有巨大潜力和发展机遇的市场,尤其是在政府大力推动清洁能源发展的背景下,LNG市场投资机会正在不断扩大。首先,政府大力支持LNG市场的发展。政府实施的“十三五”规划将LNG作为清洁能源的重要来源&…...

Elasticsearch:索引数据是如何完成的

在我在之前的文章 “Elasticsearch:彻底理解 Elasticsearch 数据操作” 文章中,我详细地描述了如何索引数据到 Elasticsearch 中。在今天的文章中,我想更进一步来描述这个流程。 Elasticsearch 是一个非常强大和灵活的分布式数据系统&#x…...

处理器管理

处理器状态处理器管理是操作系统中重要组成部分,负责管理、调度和分配计算机系统的重要资源——处理器,并控制程序执行由于处理器管理是操作系统最核心的部分,无论是应用程序还是系统程序,最终都要在处理器上执行以实现其功能&…...

跟着我从零开始入门FPGA(一周入门系列)第五

5、同步和异步设计 前面已有铺垫,同步就是与时钟同步。 同步就是走正步,一二一,该迈哪个脚就迈那个脚,跑的快的要等着跑的慢的。 异步就是搞赛跑,各显神通,尽最大力量去跑,谁跑得快,…...

【第42天】Arrays.sort 与 Collections.sort 应用 | 整形数组与集合的排序

本文已收录于专栏🌸《Java入门一百练》🌸学习指引序、专栏前言一.sort函数二、【例题1】1、题目描述2、解题思路3、模板代码4、代码解析二、【例题1】1、题目描述2、解题思路3、模板代码4、代码解析三、推荐专栏序、专栏前言 本专栏开启,目的…...

LeetCode第334场周赛

2023.2.26LeetCode第334场周赛 A. 左右元素和的差值 思路 前缀和后缀和 代码 class Solution { public:vector<int> leftRigthDifference(vector<int>& nums) {int n nums.size();vector<int> l(n), r(n), ans(n);for (int i 1; i < n; i )l[…...

基于深度学习的三维重建网络PatchMatchNet(三):PatchMatchNet配置及代码主要运行流程

目录 1.PatchMatchNet环境配置 2. PatchMatchNet的大致执行流程(eval.py) 2.1 深度图的保存...

【一天一门编程语言】设计一门编程语言,给出基础语法代码示例,SDK设计。

文章目录设计一门编程语言&#xff0c;给出基础语法代码示例&#xff0c;SDK设计。一、编程语言设计1.1 语言名称1.2 数据类型1.3 基本运算符1.4 控制语句二、SDK设计2.1 基础库2.2 第三方库三、例子用 Mango 这门语言实现斐波那契数列。基础语法代码示例SDK 设计使用 Mango 语…...

ubuntu 下 python 安装 venv

ubuntu 下 python 安装 venv1.首先&#xff0c;确保您的系统已安装 Python3 和 pip3&#xff0c;如果没有安装&#xff0c;可以使用以下命令安装&#xff1a;2. 接着&#xff0c;安装 virtualenv 包&#xff0c;使用以下命令&#xff1a;3.创建 Python 虚拟环境&#xff0c;使用…...

HTML#1快速入门

一. 简介HTML是一门语言, 所有的网页都是用HTML编写的HTML(Hyper Text Markup Language): 超文本(超越了文本限制,除了文字信息还可以定义图片,音频,视频等)标记语言(有标签构成的语言)W3C标准: 网页主要由三部分组成(1) 结构: HTML(2) 表现: CSS(3) 行为: JavaScript二. 快速入…...

【MySQL】事务隔离级别是怎么实现的?

事务隔离级别是怎么实现的&#xff1f; 四种隔离级别具体的实现方式 对于「读未提交」&#xff1a;直接读取最新的数据就好。对于「串行化」&#xff1a;通过加读写锁的方式来避免并行访问。对于「读提交」和「可重复读」&#xff1a;通过 Read View 来实现&#xff0c;主要区…...

JSP网上书店系统用myeclipse定制开发mysql数据库B/S模式java编程计算机网页

一、源码特点 JSP 网上书店系统 是一套完善的系统源码&#xff0c;对理解JSP java 编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。研究的基本内容是基于网上书店系 统&#xff0c;使用JSP作为页面开发工具。Web服务的运…...

配置 Haproxy 负载均衡群集

配置 haproxy 负载均衡群集 &#x1f3c6;荣誉认证&#xff1a;51CTO博客专家博主、TOP红人、明日之星&#xff1b;阿里云开发者社区专家博主、技术博主、星级博主。 &#x1f4bb;微信公众号&#xff1a;微笑的段嘉许 &#x1f4cc;本文由微笑的段嘉许原创&#xff01; &#…...

计算机网络笔记 | 第一章:计算机网络概述(1.1-1.4小节知识点整理)

从专栏将讲述有关于计算机网络相关知识点&#xff0c;如果有想学习Java的小伙伴可以点击下方连接查看专栏&#xff0c;还有JavaEE部分 本专栏地址&#xff08;持续更新中&#xff09;&#xff1a;&#x1f525;计算机网络 MyBatis&#xff1a;✍️MyBatis Java入门篇&#xff1…...

Flutter3引用原生播放器-Android篇

接上篇&#xff1a;Flutter3引用原生播放器-IOS(Swift)篇 安卓端原生播放器的接入思路与ios基本一致&#xff0c;所以本篇就不废话了&#xff0c;直接上代码&#xff1a; 创建插件VideoViewPlugin实现FlutterPlugin&#xff1a; package io.flutter.plugins.videoplayer;imp…...

SerenityOS 操作系统类 Unix 操作系统

创建于2018年的SerenityOS是一个类似Unix的操作系统&#xff0c;但是带有图形化界面&#xff0c;适合X86台式计算机&#xff0c;&#xff0c;其界面类似90 年代的Win98/NT。几乎由一个人完成额操作系统。这几天其Web浏览器通过了 Acid3 浏览器。 Kernel features 具有抢占式多…...

Bean作用域和生命周期

目录 Bean作用域的例子 作用域定义 Bean的六种作用域 设置作用域 Spring的执行过程和Bean的生命周期 Spring的主要执行流程 Bean的生命周期 在上篇博客中我们使用Spring存储和获取Bean,因此Bean是Spring中最重要的资源,今天这篇博客就深入了解Bean对象 Bean作用域的例子 …...

STM32笔记

目录 1.1. 预备阶段 1.2. 单片机介绍 2. 初识STM32 2.1. STM32 1.1. 预备阶段 1.2. 单片机介绍 1.2.1. 单片机是什么 单片微型计算机(Single Chip Microcomputer)简称为单片机&#xff08;Microcontrollers&#xff09;&#xff0c;也称为微控制单元(Microcontroller Uni…...

【论文阅读】基于LevelDB的分布式数据库研究

基于LevelDB的分布式数据库研究 基于LevelDB的分布式数据库的研究与实现 - 中国知网 (cnki.net) 实现了什么&#xff1f; 基于键值型NoSQL数据库LevelDB&#xff0c;并与数据一致性算法Raft、 数据分片和负载均衡相结合&#xff0c;设计并实现基于LevelDB的分布式数据库。 主要…...

SAP SD不完整日志配置实战:从字段识别到测试全流程(含避坑指南)

SAP SD不完整日志配置实战&#xff1a;从字段识别到测试全流程&#xff08;含避坑指南&#xff09; 在SAP SD模块的实施与运维过程中&#xff0c;确保销售凭证数据的完整性是保障业务流程顺畅运行的基础。不完整日志功能作为数据质量的"守门人"&#xff0c;能够有效预…...

OpenClaw隐私保护方案:百川2-13B量化模型本地处理敏感数据

OpenClaw隐私保护方案&#xff1a;百川2-13B量化模型本地处理敏感数据 1. 为什么我们需要本地化的隐私保护方案 去年我在处理一批客户调研数据时&#xff0c;曾不小心将包含身份证号的Excel表格上传到了某云端OCR服务。虽然及时删除了文件&#xff0c;但那种"数据已经不…...

3个核心功能彻底掌控微信聊天记录:WeChatMsg完全使用指南

3个核心功能彻底掌控微信聊天记录&#xff1a;WeChatMsg完全使用指南 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/We…...

华为NPU上跑大模型?手把手教你用vLLM-Ascend插件部署Qwen2

华为NPU实战&#xff1a;基于vLLM-Ascend插件的高效大模型部署指南 1. 环境准备与基础配置 在华为Ascend NPU上部署大模型&#xff0c;首先需要确保硬件和软件环境满足基本要求。Atlas 800I A2或Atlas A2 Training系列设备是当前官方推荐的选择&#xff0c;操作系统需为Linux发…...

JSON-C 安全编程:如何避免 JSON 相关的安全漏洞

JSON-C 安全编程&#xff1a;如何避免 JSON 相关的安全漏洞 【免费下载链接】json-c https://github.com/json-c/json-c is the official code repository for json-c. See the wiki for release tarballs for download. API docs at http://json-c.github.io/json-c/ 项目地…...

从零到一:在Windows系统上部署JDK11与Neo4j 4.3.5开发环境

1. 环境准备&#xff1a;JDK11与Neo4j 4.3.5的版本选择 刚开始接触Java和图数据库时&#xff0c;我踩过不少版本不兼容的坑。比如有一次装了最新版JDK17&#xff0c;结果Neo4j死活启动不了&#xff0c;折腾半天才发现是版本冲突。所以现在每次搭建环境&#xff0c;我都会先确认…...

回溯法与剪枝优化:高效求解n位逐位整除数的实战解析

1. 什么是n位逐位整除数&#xff1f; n位逐位整除数是一种特殊的数字序列&#xff0c;它满足从最高位开始&#xff0c;前k位组成的数字必须能被k整除&#xff08;k从1到n&#xff09;。举个例子&#xff0c;数字102450就是一个6位整除数&#xff1a; 第1位1能被1整除前2位10能被…...

OpenLdap部署

背景 很多开源软件支持Ldap,比如Jenkins、Grafana、Gitlab、Jumpserver等。其中Ldap只保留数据库和密码。权限控制在各个应用里去控制。 常用运维命令 # 创建 ou=people 组织单元 ldapadd -x -D "cn=admin,dc=lf,dc=org" -w "123456" <<EOF dn: …...

2026年全国青少年信息素养大赛算法应用主题赛(C++赛项初赛模拟题)

2026年全国青少年信息素养大赛算法应用主题赛&#xff08;C赛项初赛模拟题&#xff09; 一、单项选择题&#xff08;共 15 题&#xff0c;每题 5 分&#xff09; 1. 数组下标与长征物资 题目内容 你需要记录红军某运输队一周&#xff08;7 天&#xff09;的粮食消耗量&#x…...

基于FPGA与DDS IP核的线性调频信号优化设计

1. DDS技术核心原理与FPGA实现优势 直接数字频率合成&#xff08;DDS&#xff09;技术就像一台精密的数字式信号发生器&#xff0c;它通过相位累加器和波形查找表这两个核心部件来生成任意频率的波形。想象一下钟表的分针转动&#xff1a;相位累加器相当于记录分针位置的齿轮&…...