# 在此我将向大家介绍常见的代码程序,这里向大家展示点菜程序的说明与代码制作。
// 点菜程序 // 定义一个菜品结构体,包含名称、价格和描述 // 定义一个菜单结构体,包含一个菜品切片和一个映射 // 定义一个菜单方法,用于添加一个菜品 // 定义一个菜单方法,用于删除一个菜品 // 定义一个菜单方法,用于修改一个菜品的信息 // 定义一个菜单方法,用于查询一个菜品的信息 // 定义一个菜单方法,用于显示所有菜品的信息 // 定义一个订单结构体,包含一个菜品切片和一个总价 // 定义一个订单方法,用于添加一个菜品 // 定义一个订单方法,用于删除一个菜品 // 定义一个订单方法,用于显示所有菜品的信息和总价 // 定义一个主函数,用于测试点菜程序的功能
package main
import (
"fmt"
"strings"
)
type Dish struct {
Name string // 名称
Price float64 // 价格
Desc string // 描述
}
type Menu struct {
Dishes []Dish // 菜品切片,用于存储和遍历菜品
Map map[string]int // 映射,用于快速查找菜品在切片中的索引,键为名称,值为索引
}
func (m *Menu) Add(d Dish) {
// 检查映射中是否已经存在该菜品的名称,如果存在,则提示重复添加,否则,追加到切片中,并更新映射
if _, ok := m.Map[d.Name]; ok {
fmt.Println("该菜品已经存在,无法重复添加")
} else {
m.Dishes = append(m.Dishes, d) // 追加到切片末尾
m.Map[d.Name] = len(m.Dishes) - 1 // 更新映射,名称对应的值为切片的最后一个索引
fmt.Println("添加成功")
}
}
func (m *Menu) Delete(name string) {
// 检查映射中是否存在该菜品的名称,如果不存在,则提示没有找到,否则,从切片中删除,并更新映射
if index, ok := m.Map[name]; !ok {
fmt.Println("没有找到该菜品")
} else {
m.Dishes = append(m.Dishes[:index], m.Dishes[index+1:]...) // 从切片中删除指定索引的元素
delete(m.Map, name) // 从映射中删除指定键的键值对
fmt.Println("删除成功")
}
}
func (m *Menu) Modify(d Dish) {
// 检查映射中是否存在该菜品的名称,如果不存在,则提示没有找到,否则,更新切片中的元素,并更新映射(如果名称发生了变化)
if index, ok := m.Map[d.Name]; !ok {
fmt.Println("没有找到该菜品")
} else {
oldName := m.Dishes[index].Name // 保存原来的名称
m.Dishes[index] = d // 更新切片中的元素为新的菜品信息
if oldName != d.Name { // 如果名称发生了变化
delete(m.Map, oldName) // 删除原来的键值对
m.Map[d.Name] = index // 添加新的键值对
}
fmt.Println("修改成功")
}
}
func (m *Menu) Query(name string) {
// 检查映射中是否存在该菜品的名称,如果不存在,则提示没有找到,否则,打印切片中对应索引的元素信息
if index, ok := m.Map[name]; !ok {
fmt.Println("没有找到该菜品")
} else {
d := m.Dishes[index] // 获取切片中对应索引的元素
fmt.Printf("名称:%s\n价格:%.2f\n描述:%s\n", d.Name, d.Price, d.Desc) // 打印菜品信息
}
}
func (m *Menu) Show() {
fmt.Println("菜单中共有", len(m.Dishes), "个菜品")
for _, d := range m.Dishes { // 遍历切片中的所有元素
fmt.Printf("名称:%s\n价格:%.2f\n描述:%s\n", d.Name, d.Price, d.Desc) // 打印菜品信息
}
}
type Order struct {
Dishes []Dish // 菜品切片,用于存储和遍历用户点的菜品
Total float64 // 总价,用于计算用户点的菜品的总金额
}
func (o *Order) Add(d Dish) {
// 追加到切片中,并更新总价
o.Dishes = append(o.Dishes, d) // 追加到切片末尾
o.Total += d.Price // 更新总价,加上菜品的价格
fmt.Println("添加成功")
}
func (o *Order) Delete(name string) {
// 遍历切片中的所有元素,查找是否有匹配的名称,如果有,则从切片中删除,并更新总价
found := false // 用于标记是否找到了匹配的名称
for i, d := range o.Dishes {
if d.Name == name { // 如果名称匹配
o.Dishes = append(o.Dishes[:i], o.Dishes[i+1:]...) // 从切片中删除指定索引的元素
o.Total -= d.Price // 更新总价,减去菜品的价格
fmt.Println("删除成功")
found = true // 标记为找到了
break // 跳出循环
}
}
if !found { // 如果没有找到匹配的名称
fmt.Println("没有找到该菜品")
}
}
func (o *Order) Show() {
fmt.Println("订单中共有", len(o.Dishes), "个菜品")
for _, d := range o.Dishes { // 遍历切片中的所有元素
fmt.Printf("名称:%s\n价格:%.2f\n描述:%s\n", d.Name, d.Price, d.Desc) // 打印菜品信息
}
fmt.Printf("总价:%.2f\n", o.Total) // 打印总价
}
func main() {
var m Menu // 创建一个菜单结构体实例
var o Order // 创建一个订单结构体实例
m.Map = make(map[string]int) // 初始化映射
// 添加一些测试数据到菜单中
m.Add(Dish{"宫保鸡丁", 18.00, "鸡肉、花生米、辣椒炒制而成"})
m.Add(Dish{"鱼香肉丝", 15.00, "猪肉、木耳、胡萝卜等炒制而成"})
m.Add(Dish{"水煮肉片", 22.00, "猪肉、豆芽、辣椒等煮制而成"})
m.Add(Dish{"麻婆豆腐", 12.00, "豆腐、肉末、辣椒等炒制而成"})
var choice int // 用于存储用户的选择
for { // 无限循环,直到用户选择退出
fmt.Println("欢迎使用点菜程序")
fmt.Println("1. 查看菜单")
fmt.Println("2. 点菜")
fmt.Println("3. 取消点菜")
fmt.Println("4. 查看订单")
fmt.Println("0. 退出程序")
fmt.Print("请输入您的选择:")
fmt.Scan(&choice) // 从标准输入读取用户的选择
var name string // 用于存储用户输入的菜品名称
switch choice { // 根据用户的选择执行不同的操作
case 1: // 查看菜单
m.Show() //