• 项目需求:

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

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

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

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


代码实现:该代码的主体是for循环嵌套一个switch结构,需要注意的是当switch判断输入4时,简单的break只能跳出switch结构,因此我们需要

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 = false
			default:
				fmt.Println("请输入正确的选项..")
		}
		if !loop {
			break
		}
	}
	fmt.Println("你以退出家庭收支软件的使用...")
}

,声明一个loop,默认为true,当判断输入为4时,将loop改为false。运行后报错cannot convert 1 (untyped int constant) to type string,经检查代码后和查看语法后发现case后的值为表达式类型,而不能是数值


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

思路分析:1)因为需要显示明细,我们要定义一个字符串变量 details string 来显示明细,该字符  串会不断地拼接

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

代码实现:

//定义账户余额
balance := 10000.0
//每次收支金额
money := 0.0
//每次收之说明
note := ""
//收支的详细情况用字符串来记录,当有收支时只需将details进行拼接处理
details := "收支\t账户金额\t收支金额\t说    明"
case "1":
	fmt.Println("-----------------当前收支明细记录-----------------")
	fmt.Println(details)
case "2":
	fmt.Println("本次收入金额:")
	fmt.Scanln(&money)
	balance += money
	fmt.Println("本次收入说明:")
	fmt.Scanln(¬e)
	details += fmt.Sprintf("\n收入\t%v\t\t%v\t\t%v", balance, money, note)
  • 功能 3: 完成了登记支出的功能

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

case "3":
    fmt.Println("本次支出金额:")
    fmt.Scanln(&money)
    if money > balance{
    	fmt.Println("余额不足")
    	break
    }
    balance -= money
    fmt.Println("本次支出说明:")
    fmt.Scanln(¬e)
    details += fmt.Sprintf("\n支出\t%v\t\t%v\t\t%v", balance, money, note)

项目代码改进

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

思路分析:定义一个choice变量接收输入的y/n,使用for循环,当条件满足时退出

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
	}
  • 定义一个变量,记录是否有收支的行为当没有任何收支明细时,提示 " 当前没有收支明细 ... 来一笔吧 !"

思路分析:当遇到此类问题时,可以,也叫做标识符,初始化为false,当有收支行为时改变为true

//定义一个变量,记录是否有收支的行为
flag := false
case "1":
	fmt.Println("-----------------当前收支明细记录-----------------")
	if flag {
		fmt.Println(details)
	}else{
		fmt.Println("当前没有收支明细...来一笔吧!")
	}