[go学习笔记.第十一章.项目案例] 1.家庭收支记账软件项目

2023/9/30 18:12:14

一.基本介绍

1.项目开发流程说明

2.项目需求说明

目标:

模拟实现一个基于文本界面的<<家庭记账软件>>

掌握初步的编程技巧和调试技巧

主要涉及以下知识点 :

(1).局部变量和基本数据类型

(2).循环语句

(3).分支语句

(4).简单的屏幕输出格式控制

(5).进阶:面向对象编程使用

需求说明

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

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

项目采用分级菜单方式,主菜单如下:

3.项目界面

(1).收支明细界面

(2).登记收入界面 

(3).登记支出界面 

 (4).退出界面

二.代码实现

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

功能1:   

        先完成可以显示主菜单,并且可以退出

思路分析: 

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

功能2:

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

思路分析:

        (1).因为需要显示明细,我们定义一个变量details来记录

        (2).还需要定义变量来记录余额(balance)、每次收支的金额(money),每次收支的说明(note)

功能 3:

        完成登记支出的功能

思路分析:

        登记支出的功能和登录收入的功能类似,做些修改即可

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

package main

import (
    "fmt"
)

func main() {
    //声明一个变量,保存接收用户输入的选项
    key := ""
    //声明一个变量,控制是否退出for
    loop := true
    //显示主菜单
    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("----------------当前收支明细------------------")
        case "2":
        case "3":
            fmt.Println("登记支出")
        case "4":
            loop = false
        default :
            fmt.Println("请输入正确的选项")       
        }

        if !loop {
            break
        }
    }

    fmt.Println("你退出了家庭收支记账软件的使用")
}

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

package main

import (
    "fmt"
)

func main() {
    //声明一个变量,保存接收用户输入的选项
    key := ""
    //声明一个变量,控制是否退出for
    loop := true
    //定义账户余额
    balance := 10000.0
    //每次收支的金额
    money := 0.0
    //每次收支的说明
    note := ""
    //收支的详情使用字符串来记录
    //当有收支时,只需要对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("----------------当前收支明细------------------")
            fmt.Println(details)
        case "2":
            fmt.Println("本次收入金额:")
            fmt.Scanln(&money)
            balance += money    //修改账户余额
            fmt.Println("本次收入说明:")
            fmt.Scanln(&note)
            //将这个收入情况,拼接到details变量
            //收入 11000 1000 有人发红包
            details += fmt.Sprintf("\n收入\t%v\t\t%v\t\t%v",balance, money, note)

        case "3":
            fmt.Println("登记支出")
        case "4":
            loop = false
        default :
            fmt.Println("请输入正确的选项") 
        }

        if !loop {
            break
        }
    }

    fmt.Println("你退出了家庭收支记账软件的使用")
}

功能 3:  完成登记支出的功能

package main

import (
    "fmt"
)

func main() {
    //声明一个变量,保存接收用户输入的选项
    key := ""
    //声明一个变量,控制是否退出for
    loop := true
    //定义账户余额
    balance := 10000.0
    //每次收支的金额
    money := 0.0
    //每次收支的说明
    note := ""
    //收支的详情使用字符串来记录
    //当有收支时,只需要对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("----------------当前收支明细------------------")
            fmt.Println(details)
        case "2":
            fmt.Println("本次收入金额:")
            fmt.Scanln(&money)
            balance += money    //修改账户余额
            fmt.Println("本次收入说明:")
            fmt.Scanln(&note)
            //将这个收入情况,拼接到details变量
            //收入 11000 1000 有人发红包
            details += fmt.Sprintf("\n收入\t%v\t\t%v\t\t%v",balance, money, note)
        case "3":
            fmt.Println("本次支出金额:")
            fmt.Scanln(&money)
            //这里需要做一个判断
            if money > balance {
                fmt.Println("支出的余额不足")
                break
            }
            balance -= money    //修改账户余额
            fmt.Println("本次支出说明:")
            fmt.Scanln(&note)
            //将这个支出情况,拼接到details变量
            //支出 11000 1000 吃中午饭
            details += fmt.Sprintf("\n支出\t%v\t\t%v\t\t%v",balance, money, note)
        case "4":
            loop = false
        default :
            fmt.Println("请输入正确的选项")  
        }

        if !loop {
            break
        }
    }

    fmt.Println("你退出了家庭收支记账软件的使用")
}

2.项目代码改进

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

(2).当没有任何收支明细时,提示”当前没有收支明细 … 来一笔吧!"

(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.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 1000 有人发红包
            details += fmt.Sprintf("\n收入\t%v\t\t%v\t\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变量
            //支出 11000 1000 吃中午饭
            details += fmt.Sprintf("\n支出\t%v\t\t%v\t\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).将面向过程的代码修改成面向对象的方法,编写myFamilyAccount.go,并使用 testMyFamilyAccount.go 去完测试

思路分析:

        把记账软件的功能,封装到一个结构体中,然后调用该结构体的方法,来实现记账,显示明细。结构体的名字 FamilyAccount,在通过main方法中,创建一个结构体FamilyAccount实例,实现记账即可,码不需要重写,只需要重写组织一下

myFamilyAccount.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 : "",
        details : "收支\t账号余额\t收支金额\t说    明",
    }
}
//将显示明细写成一个方法
func (this *FamilyAccount) showDetails() {
    fmt.Println("----------------当前收支明细------------------")
    if this.flag {
        fmt.Println(this.details)
    } else {
        fmt.Println("当前没有收支明细,来一笔")
    }
}

//将登记收入写成一个方法,绑定到*FamilyAccount结构体
func (this *FamilyAccount) income()  {
    fmt.Println("本次收入金额:")
    fmt.Scanln(&this.money)
    this.balance += this.money  //修改账户余额
    fmt.Println("本次收入说明:")
    fmt.Scanln(&this.note)
    //将这个收入情况,拼接到details变量
    //收入 11000 1000 有人发红包
    this.details += fmt.Sprintf("\n收入\t%v\t\t%v\t\t%v", this.balance, this.money, this.note)
    this.flag = true
}

//将登记支出写成一个方法,绑定到*FamilyAccount结构体
func (this *FamilyAccount) pay()  {
    fmt.Println("本次支出金额:")
    fmt.Scanln(&this.money)
    //这里需要做一个判断
    if this.money > this.balance {
        fmt.Println("支出的余额不足")
    }
    this.balance -= this.money  //修改账户余额
    fmt.Println("本次支出说明:")
    fmt.Scanln(&this.note)
    //将这个支出情况,拼接到details变量
    //支出 11000 1000 吃中午饭
    this.details += fmt.Sprintf("\n支出\t%v\t\t%v\t\t%v", this.balance, this.money, this.note)
    this.flag = true
}

//将退出写成一个方法,绑定到*FamilyAccount结构体
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.go

package main

import (
    "fmt"
    "go_code/familyAccount/utils"
)

func main() {
    fmt.Println("面向对象方式实现")
    utils.NewFamilyAccount().MainMenu()
}

对项目的扩展功能:

        1.对上面的项目完成一个转账功能

        2.使用该软件前,有一个登录功能,只有输入正确的用户名,密码才能操作

 myFamilyAccount.go

package utils

import (
    "fmt"
)

type FamilyAccount struct {
    //声明必要的字段
    //声明一个字段,保存接收用户输入的选项
    key string
    //声明一个字段,控制是否退出for
    loop bool
    //定义账户余额
    balance float64
    //每次收支的金额
    money float64
    //每次收支的说明
    note string
    //定义一个字段,记录是否有收支的行为
    flag bool
    //收支的详情使用字符串来记录
    //当有收支时,只需要对details进行拼接处理即可
    details string

    //定义用户名
    name string
    //定义用户密码
    pwd string
} 

//编写一个工厂模式的构造方法,返回一个*FamilyAccount实例
func NewFamilyAccount() *FamilyAccount  {
    return &FamilyAccount {
        key : "",
        loop : true,
        balance : 10000.0,
        money : 0.0,
        note : "",
        details : "收支\t账号余额\t收支金额\t说    明",
    }
}

//将显示明细写成一个方法
func (this *FamilyAccount) showDetails() {
    fmt.Println("----------------当前收支明细------------------")
    if this.flag {
        fmt.Println(this.details)
    } else {
        fmt.Println("当前没有收支明细,来一笔")
    }
}

//将登记收入写成一个方法,绑定到*FamilyAccount结构体
func (this *FamilyAccount) income()  {
    fmt.Println("本次收入金额:")
    fmt.Scanln(&this.money)
    this.balance += this.money  //修改账户余额
    fmt.Println("本次收入说明:")
    fmt.Scanln(&this.note)
    //将这个收入情况,拼接到details变量
    //收入 11000 1000 有人发红包
    this.details += fmt.Sprintf("\n收入\t%v\t\t%v\t\t%v", this.balance, this.money, this.note)
    this.flag = true
}

//将登记支出写成一个方法,绑定到*FamilyAccount结构体
func (this *FamilyAccount) pay()  {
    fmt.Println("本次支出金额:")
    fmt.Scanln(&this.money)
    //这里需要做一个判断
    if this.money > this.balance {
        fmt.Println("支出的余额不足")
    }
    this.balance -= this.money  //修改账户余额
    fmt.Println("本次支出说明:")
    fmt.Scanln(&this.note)
    //将这个支出情况,拼接到details变量
    //支出 11000 1000 吃中午饭
    this.details += fmt.Sprintf("\n支出\t%v\t\t%v\t\t%v", this.balance, this.money, this.note)
    this.flag = true
}

//将退出写成一个方法,绑定到*FamilyAccount结构体
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
    }
}

//将判断用户登录写成一个方法,绑定到*FamilyAccount结构体
func (this *FamilyAccount) login() {
    for {
        fmt.Println("请输入用户名:")
        fmt.Scanln(&this.name)
        fmt.Println("请输入密码:")
        fmt.Scanln(&this.pwd)
        if this.name == "root" && this.pwd == "123456" {
            break 
        }
        fmt.Println("用户名或密码错误,请重新输入")
    }
}

//给结构体绑定方法
//显示主菜单
func (this *FamilyAccount) MainMenu() {
    this.login() 
    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("你退出了家庭收支记账软件的使用")
}

[上一节]go学习笔记.第十章.面向对象编程] 12.类型断言引出和基本使用

[下一节][go学习笔记.第十一章.项目案例] 2.客户信息管理系统 


http://www.jnnr.cn/a/110730.html

相关文章

机器学习吴恩达课程学习笔记 Part1——从机器学习概念到线性回归

机器学习——吴恩达课程学习笔记 Part1 文章目录机器学习——吴恩达课程学习笔记 Part1一、**Introduction****Welcome**什么是机器学习学习算法的类型&#xff1a;监督学习与无监督学习监督学习 Supervised learning无监督学习Unsupervised learning二、线性回归模型的表示代价…

TI毫米波雷达 IWR1642串口接收的4个字节数据如何解析为距离的?

本文编辑&#xff1a;调皮哥的小助理 本文题为自问自答&#xff0c;主要是为了帮助大家解决一个问题&#xff0c;避免大家百度搜索不到答案&#xff0c;而且我喜欢用知乎回答问题&#xff0c;所以在知乎自问自答&#xff0c;这样大家在百度搜索的时候也能够检索到知乎的回答。 …

Flutter 图表组件 charts_flutter_new

Flutter 图表插件 charts_flutter_new 前言 也许你的项目中需要一个图标的插件&#xff0c;比如显示会员的消费情况。 你可以看下 charts_flutter_new 这个插件是否合适。 可以通过这个预览网址查看 https://google.github.io/charts/flutter/gallery.html 内容很长我只截取了小…

计算机毕业设计 基于HTML+CSS+JavaScript响应式网站健身7页,适配手机端,响应式页面,页面精美,使用bootstrap 框架

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

mysql连接池和redis连接池

池化技术 池化技术能够减少资源对象的创建次数&#xff0c;提高程序的响应性能&#xff0c;特别是在高并发下这种提高更加明显。 使用池化技术缓存的资源对象有如下共同特点&#xff1a; 1. 对象创建时间长&#xff1b; 2. 对象创建需要大量资源&#xff1b; 3. 对象创建后可被…

浏览器:重绘(repaint)与回流/重排(reflow)

一、从上面这个图上&#xff0c;我们可以看到&#xff0c;浏览器渲染过程如下&#xff1a; 1、解析HTML&#xff0c;生成DOM树&#xff0c;解析CSS&#xff0c;生成CSSOM树 2、将DOM树和CSSOM树结合&#xff0c;生成渲染树(Render Tree) 3、Layout(回流):根据生成的渲染树&…

NX二次开发-使用NXOPEN C#向导模板做开发以及如何查看C#帮助文档写代码

今天是情人节,单身狗晚上闲着无聊,研究了一下NXOPEN C#开发, 我发现有UFUN C和NXOPEN C++的基础在转做NXOPEN C#开发,上手还是蛮快的,开发套路原理都是一样的。 在补充点C#的语法知识,基本上就可以去做项目了(当然了,我连C++都还没学明白,这里也只是兴趣爱好,现学现…

供应链平台 采购信息监控更新提醒

随着供应链的发展&#xff0c;为更好地了解企业上下游产品供需资讯&#xff0c;于是诞生了众多供应链平台提供供给和需求信息。如下图所示&#xff0c;一般可以按行业或地域关键词&#xff0c;查找本行业或本地区的供给采购信息。 但是在现有市场环境下&#xff0c;商业竞争被…

IDEA Maven Dependencies 问题汇总

目录 一、settings文件配置 1.国内Maven镜像仓库 2.settings文件 二、maven Dependencies有红色波浪线 1.maven配置问题解决方案 1.1 检查settings文件的配置路径是否正确 1.2检查Importing里面的配置 2.jar包丢失问题解决方案 2.1 移除POM中对应JAR包的配置&#xff0…

docker安装mysql同步数据到linux与docker容器卷

可以去dockerhub搜索mysql寻找命令 docker run -p 3310:3306 --name mysql57 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD123456 -d mysql:5.7 -e配置启动容器mysql 需要配置密码 -v 是绑定容器卷到linux 上 …

JavaSE入门必读篇——Java数组(详解)

文章目录数组的概念1.什么是数组呢&#xff1f;2.如何创建数组3.遍历数组4.扩展&#xff1a;快速批量初始化数组原理内存图1. 内存概述2.Java虚拟机的内存划分3.其存储方式图4.认识null二维数组二维数组初始化遍历二维数组数组常见异常1. 数组越界异常2. 数组空指针异常Java常用…

深度学习笔记(52) 知识蒸馏

知识蒸馏1. 简介2. 知识的表示与迁移3. 蒸馏温度T4. 知识蒸馏过程4.1. student loss4.2. distillation loss5. 背后的机理6. 应用场景7. 代码实现1. 简介 化学提及到蒸馏&#xff1a;加热液体汽化&#xff0c;再使蒸气液化&#xff0c;从而除去其中的杂质&#xff0c;获得所需…

单幅图像超分辨率综述

这篇论文从三个方面进行描述&#xff1a;网络结构的设计、损失函数、还有上采样的方式。 上采样可以选择预先上采样&#xff0c;虽然这会使整个网络在高维空间运行&#xff0c;但是可以使用尺度增强的策略&#xff0c;避免训练多个不同尺度因子的网络结构&#xff0c;相比较而…

Netty框架之HashedWheelTimer

Netty简介 Netty是由JBOSS提供的一个java开源框架&#xff0c;现为 Github上的独立项目。Netty提供异步的、事件驱动的网络应用程序框架和工具&#xff0c;用以快速开发高性能、高可靠性的网络服务器和客户端程序。Redis也是基于事件驱动框架开发的。 Netty 是一个吸收了多种…

【超详细,面向初学者】如何用Idea快速创建一个MyBatis项目?导入坐标-创建数据库-成功运行示例

1. 新建项目 首先在Idea中点击新建项目&#xff0c;在名称的位置随便起一个名字之后点击创建 然后你就能看到如下界面&#xff0c;当前的文件就是pom.xml配置文件 2. 在pom.xml导入坐标 在浏览器搜索Mybatis&#xff0c;进入Mybatis官方网站 直达官网 导入坐标&#xff0c…

网课搜题功能独立后台

网课搜题功能独立后台 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 题库&#xff1a;题库后台&#xff08;点击跳转&#xff0…

业务架构·应用架构·数据架构实战~业务驱动的应用架构设计

1、什么是应用架构 应用架构是一组应用系统及其交互关系的描述&#xff0c;其中的每个应用系统都是一个“逻辑功能组”&#xff0c;用于支撑业务功能、管理数据资产。 支撑业务架构中&#xff0c;具体业务功能、业务流程的要求。 支撑数据架构中&#xff0c;具体数据资产的操…

数组——算法专项刷题(二)

二、数组 数组题目中常用算法及思想&#xff1a;滑动窗口、双指针、前缀和。 注意点&#xff1a; 边界处理、辅助数据结构去重 2.1数组中和为3的个数 原题链接 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足i ! j、i ! k 且 j ! …

Zookeeper初步

目录 Zookeeper有什么作用&#xff1f; Zookeeper数据存储 Zookeeper常用api Zookeeper的节点类型 订阅与通知 版本号 Zookeeper有什么作用&#xff1f; 强一致性&#xff0c;排序&#xff0c;持久化 实现分布式同步锁 解决分布式系统中各类并发问题 Zookeeper数据存储…

神经网络NN

一、神经网络其实就是输入变量先后进行加权求和与非线性变换之后得到输出。神经网络分为前向传播和反向传播。 神经网络的工作原理&#xff1a; Ⅰ、前向传播&#xff1a;首先生成一个任意结构的神经网络&#xff0c;并且用一些字母来表达这些神经网络的参数&#xff0c;为了推…
最新文章