小项目:收支记账和客户关系管理
一、收支记账
1、面向过程实现基本功能
功能1:完成可以显示主菜单,并且可以退出
package mainimport "fmt"func main() {//保存接收用户输入的选项key := ""//控制是否退出for循环loop := true//显示主菜单for {fmt.Println("--------------收支记账-----------------")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("----------------当前收支明细记录------------------")case "2":case "3":fmt.Println("登记支出")case "4":loop = falsedefault:fmt.Println("请输入正确的选项")}if !loop {break}}fmt.Println("退出记账收支软件的使用") }
功能2:显示明细和登记收入
变量details string来记录明细
记录余额(balance)、每次收支的金额(money), 每次收支的说明(note)
package mainimport "fmt"func main() {//保存接收用户输入的选项key := ""//控制是否退出for循环loop := true//定义账户的余额balance := 10000.0//每次收支的金额money := 0.0//每次收支的说明note := ""//收支的详情使用字符串来记录//当有收支时,只需要对details进行拼接处理即可details := "收支\t账户金额\t收支金额\t说 明"//显示主菜单for {fmt.Println("--------------收支记账-----------------")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("----------------当前收支明细记录------------------")fmt.Println(details)case "2":fmt.Println("本次收入金额:")fmt.Scanln(&money)balance += moneyfmt.Println("本次收入说明:")fmt.Scanln(¬e)details += fmt.Sprintf("\n收入\t%v\t%v\t%v\n", balance, money, note)case "3":fmt.Println("登记支出")case "4":loop = falsedefault:fmt.Println("请输入正确的选项")}if !loop {break}}fmt.Println("退出记账收支软件的使用") }
功能3:登记支出功能
package mainimport "fmt"func main() {//保存接收用户输入的选项key := ""//控制是否退出for循环loop := true//定义账户的余额balance := 10000.0//每次收支的金额money := 0.0//每次收支的说明note := ""//收支的详情使用字符串来记录//当有收支时,只需要对details进行拼接处理即可details := "收支\t账户金额\t收支金额\t说 明"//显示主菜单for {fmt.Println("--------------收支记账-----------------")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("----------------当前收支明细记录------------------")fmt.Println(details)case "2":fmt.Println("本次收入金额:")fmt.Scanln(&money)balance += moneyfmt.Println("本次收入说明:")fmt.Scanln(¬e)details += fmt.Sprintf("\n收入\t%v\t%v\t%v\n", balance, money, note)case "3":fmt.Println("本次支出金额:")fmt.Scanln(&money)if money > balance {fmt.Println("余额的金额不足")break}balance -= moneyfmt.Println("本次支出说明")fmt.Scanln(¬e)details += fmt.Sprintf("\n支出\t%v\t%v\t%v", balance, money, note)case "4":loop = falsedefault:fmt.Println("请输入正确的选项")}if !loop {break}}fmt.Println("退出记账收支软件的使用") }
项目代码实现改进:
(1)、用户输入4退出时,给出提示“确定要退出吗?y/n”,必须输入正确的y/n,否则循环输入指令,直到输入y或者n
(2)、当没有任何收支明细是,提示“当前没有收支明细...来一笔吧!”
(3)、在支出时,判断余额是否够,并给出相应的提示
package mainimport "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.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 += moneyfmt.Println("本次收入说明:")fmt.Scanln(¬e)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(¬e)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("退出记账收支软件的使用") }
2、面向对象实现基本功能
将面向过程的代码修改成面向对象的方法,编写myAccount.go ,并使用testMyAccount.go去完成测试。
把记账软件的功能,封装到一个结构体中,然后调用该结构体的方法,来实现记账,显示明细。
myAccount.go
package utilsimport "fmt"type MyAccount struct {//声明必须的字段//声明一个字段,保存接收用户输入的选项key string//声明一个字段,控制是否退出 forloop bool//定义账户的余额 []balance float64//每次收支的金额money float64//每次收支的说明note string//定义个字段,记录是否有收支的行为flag bool//收支的详情使用字符串来记录//当有收支时,只需要对 details 进行拼接处理即可details string }//编写要给工厂模式的构造方法,返回一个*MyAccount 实例 func NewMyAccount() *MyAccount {return &MyAccount{key: "",loop: true,balance: 10000.0,money: 0.0,note: "",flag: false,details: "收支\t 账户金额\t 收支金额\t 说 明",} }//将显示明细写成一个方法 func (this *MyAccount) showDetails() {fmt.Println("-----------------当前收支明细记录-----------------")if this.flag {fmt.Println(this.details)} else {fmt.Println("当前没有收支明细... 来一笔吧!")} }//将登记收入写成一个方法,和*MyAccount 绑定 func (this *MyAccount) 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 }//将登记支出写成一个方法,和*MyAccount 绑定 func (this *MyAccount) 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 }//将退出系统写成一个方法,和*MyAccount 绑定 func (this *MyAccount) 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 *MyAccount) MainMenu() {for {fmt.Println("\n-----------------家庭收支记账软件-----------------")fmt.Println(" 1 收支明细")fmt.Println(" 2 登记收入")fmt.Println(" 3 登记支出")fmt.Println(" 4 退出软件")fmt.Print("请选择(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}} }
testMyAccount.go
package mainimport ("accountManage/utils""fmt" )func main() {fmt.Println("面向对象的方式完成收支记账")utils.NewMyAccount().MainMenu() }
二、客户关系管理
customer.go
package modelimport "fmt"//声明一个Customer结构体,表示一个客户信息 type Customer struct {Id intName stringGender stringAge intPhone stringEmail string }//使用一个工厂模式,返回一个Customer实例 func NewCustomer(id int, name string, gender string, age int, phone string, email string) Customer {return Customer{Id: id,Name: name,Gender: gender,Age: age,Phone: phone,Email: email,} }func NewCustomer2(name string, gender string, age int, phone string, email string) Customer {return Customer{Name: name,Gender: gender,Age: age,Phone: phone,Email: email,} }//返回用户的信息 func (this Customer) GetInfo() string {info := fmt.Sprintf("%v\t%v\t%v\t%v\t%v\t%v\t", this.Id, this.Name, this.Gender, this.Age, this.Phone, this.Email)return info }
customerService.go
package serviceimport "customerManage/model"//该CustomerService,完成对Customer的操作,包括增删改查 type CustomerService struct {customers []model.Customer//声明一个字段,表示当前切片含有多少个客户//该字段后面还可以作为新客户的id+1customerNum int }//编写一个方法,可以返回*CustomerService func NewCustomerService() *CustomerService {//为了能够看到有客户在切片中,初始化一个客户customerService := &CustomerService{}customerService.customerNum = 1customer := model.NewCustomer(1, "张三", "男", 20, "112", "zs@163.com")customerService.customers = append(customerService.customers, customer)return customerService }//返回客户切片 func (this *CustomerService) List() []model.Customer {return this.customers }//添加客户到customers切片 func (this *CustomerService) Add(customer model.Customer) bool {//分配ID的规则:添加的顺序this.customerNum++customer.Id = this.customerNumthis.customers = append(this.customers, customer)return true }//根据ID删除客户(从切片中删除) func (this *CustomerService) Delete(id int) bool {index := this.FindById(id)if index == -1 {return false}this.customers = append(this.customers[:index], this.customers[index+1:]...)return true }//根据ID查找客户在切片中对应下标,如果没有该客户,返回-1 func (this *CustomerService) FindById(id int) int {index := -1//遍历this.customers切片for i := 0; i < len(this.customers); i++ {if this.customers[i].Id == id {index = i}}return index }
customerView.go
package mainimport ("customerManage/model""customerManage/service""fmt" )type customerView struct {//定义必要字段key string //接收用户输入loop bool //表示是否循环的显示主菜单customerService *service.CustomerService }//显示所有的客户信息 func (this *customerView) list() {//获取到当前所有的客户信息(在切片中)customers := this.customerService.List()//显示fmt.Println("----------------客户列表------------------")fmt.Println("编号\t姓名\t性别\t年龄\t电话\t邮箱")for i := 0; i < len(customers); i++ {fmt.Println(customers[i].GetInfo())}fmt.Printf("\n----------------客户列表完成---------------\n\n") }//得到用户的输入,信息构建新的客户,并完成添加 func (this *customerView) add() {fmt.Println("-------------------添加客户------------------")fmt.Println("姓名")name := ""fmt.Scanln(&name)fmt.Println("性别")gender := ""fmt.Scanln(&gender)fmt.Println("年龄")age := 0fmt.Scanln(&age)fmt.Println("电话")phone := ""fmt.Scanln(&phone)fmt.Println("邮件")email := ""fmt.Scanln(&email)//构建一个新的Customer实例//注意:id号,没有让用户输入,id是惟一的,需要系统分配customer := model.NewCustomer2(name, gender, age, phone, email)if this.customerService.Add(customer) {fmt.Println("---------------添加成功----------------")} else {fmt.Println("---------------添加失败----------------")} }//得到用户的输入ID,删除该ID对应的客户 func (this *customerView) delete() {fmt.Println("----------------删除客户-----------------")fmt.Println("请选择待删除客户编号(输入-1退出)")id := -1fmt.Scanln(&id)if id == -1 {return //放弃删除操作}fmt.Println("确认是否删除(Y/N):")choice := ""fmt.Scanln(&choice)if choice == "y" || choice == "Y" {if this.customerService.Delete(id) {fmt.Println("--------------删除成功-------------------")} else {fmt.Println("--------------删除失败,输入的ID号不存在-------------------")}}}//退出软件 func (this *customerView) exit() {fmt.Println("确认是否退出(Y/N):")for {fmt.Scanln(&this.key)if this.key == "Y" || this.key == "y" || this.key == "N" || this.key == "n" {break}fmt.Println("输入有误,确认是否退出(Y/N)")}if this.key == "Y" || this.key == "y" {this.loop = false} }func (cv *customerView) mainMenu() {for {fmt.Println("----------------客户信息管理软件---------------------")fmt.Println(" 1 添 加 客 户")fmt.Println(" 2 修 改 客 户")fmt.Println(" 3 删 除 客 户")fmt.Println(" 4 客 户 列 表")fmt.Println(" 5 退 出")fmt.Println("请选择(1-5): ")fmt.Scanln(&cv.key)switch cv.key {case "1":cv.add()case "2":fmt.Println("修 改 客 户")case "3":cv.delete()case "4":cv.list()case "5":cv.exit()default:fmt.Println("你的输入有误,请重新输入")}if !cv.loop {break}}fmt.Println("你退出了客户关系管理系统") }func main() {//在main函数中,创建一个customerView,并允许显示主菜单customerView := customerView{key: "",loop: true,}//完成对customerService结构体的customerService字段的初始化customerView.customerService = service.NewCustomerService()customerView.mainMenu() }
转载于:https://www.cnblogs.com/xidian2014/p/10666752.html
小项目:收支记账和客户关系管理相关推荐
- 使用CRM客户关系管理软件有哪些优势?
虽然客户关系管理软件越来越受到企业青睐,也是企业数字化转型,企业上云的软件之一,但是还是由部分老板不知道何为CRM软件,也并不清楚为什么企业要使用CRM客户关系管理软件? 下面 精诚软件 小编就简单说 ...
- 科研实习生 数据挖掘在陶瓷行业客户关系管理中的应用
1.数据挖掘的概念 各种研究机构由于观点和背景的不同,对数据挖掘都有不同的定义.可以从技术角度进行定义,也可以从商业角度进行定义. 1).技术上的定义 数据挖掘(DataMninig)就是从大量的.不 ...
- CRM 客户关系管理
引用:http://baike.baidu.com/view/648655.htm CRM(Customer Relationship Management)即客户关系管理.从字面上来看,是指企业用C ...
- 什么是运营型CRM客户关系管理软件
CRM中文名"客户关系管理",以"客户为中心"利用先进的互联网技术,不断挖掘.维护与客户的关系,从而提高企业收益.它既是公司的一种经营理念,也是为了提高收益开发 ...
- 戴尔为例 浅谈电子商务时代客户关系管理
计算机互联网技术的发展也为现代客户关系管理实现更完善的功能提供了可能性.精明的企业目前都在认真反省自己的CRM战略,并开始把CRM作为它们挽留客户的重要手段,希望凭借CRM的智能客户管理给企业带来忠实 ...
- oracle crm客户关系管理资料下载_悟空CRM:使用CRM系统进行客户关系管理的要点...
使用过CRM的用户都知道,在CRM系统中,完整的客户关系管理包括客户数据管理.销售阶段管理和客户分析管理.它能在有效的客户细分基础上帮助你进行差异化管理,合理分配工作时间.那具体怎么操作呢?作为企业管 ...
- 应用数据挖掘进行客户关系管理
转载自:http://www.itongji.cn/article/0F923E2013.html 在当今市场上,商业的成功离不开有效的客户关系管理(Customer Relationship Man ...
- 【转载】Kano模型在用户调研中的应用:客户关系管理工具调研实例
原文链接:http://www.alibuybuy.com/posts/77204.html 1.Kano模型简介 1.1 Kano模型起源:满意度的二维模式 著名市场营销学大师.美国西北大学教授菲利 ...
- 客户关系管理(CRM)是什么?
尽管CRM各路解释都有,但说白了CRM就是一种提高竞争力的手段: 为了争夺更多客户,深入分析客户及相关资料,不断提高客户满意度. 那么客户及相关资料是指什么呢? 一般说来就是围绕五块: 销售 市场营销 ...
- 信息系统项目管理重点:客户关系管理(CRM)
集成系统项目管理,适合在项目管理,系统管理,做企业信息化等岗位以及准备软考的人学习. 今天分享的是重点:客户关系管理(CRM) 客户关系管理(Customer Relationship Managem ...
最新文章
- 线程间通讯机制(提高篇)——深入浅出实现原理
- 消费升级,彩屏或将成为家电行业市场新风口
- hdfs中与file数组类似的数组_Chapter05 Java中的数组
- iOS 设置系统音量和监听系统音量变化
- Java打包后读文件和写文件操作方法
- Windows的空格预览神器 | QuickLook
- java加密算法之JWT篇
- SVN使用教程图文教程
- DirectX版本问题
- MIPS中lw指令运行时间最长
- 【转】上大数学系博士点
- 龙芯CPU频率为什么上不去?
- protobuf入门教程(四):repeated限定修饰符
- Unity 登录Ios GameCenter
- Docker compose 部署habor
- Java基础面试题简单总结
- word2vec模型训练保存加载及简单使用
- PHP 版 微信小程序商城 源码和搭建
- 准标准模式和标准模式之间的差别-1(旧文首发)
- 手机智能控制汽车系统作用详解
热门文章
- PMP-32项目成本管理
- 2019计算机考研学校排行,2019计算机考研:中国大学计算机学科排行榜
- 注册表怎么用计算机管理打开,如何打开注册表,详细教您如何打开电脑注册表管理器...
- 零基础云开发一个投票小程序
- *Php消息队列实现
- Quartus-II 13.1 详细安装、注册、配置步骤
- Altium Designer——usb信号线布线注意的问题——应使用差分布线
- 【目标跟踪论文阅读】Cooling-Shrinking Attack: Blinding the Tracker with Imperceptible Noises
- 华为笔试题-圣诞的祝福
- word怎么恢复保存前的文件,word文件恢复