C#类和对象--习题(3)订餐系统(控制台)

时隔15天,看这代码很烂,就重新写了一份。–2022/8/8
「订单系统」https://www.aliyundrive.com/s/BKnSC6DTk7k 提取码: je23
点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。
任务描述
1、我要订餐
2、查看餐袋
3、签收订单
4、删除订单
5、我要点赞
6、退出系统

需求:
在这里插入图片描述
在这里插入图片描述

步骤一:
·创建项目:OrderingMgr
·创建类:OrderingSet,添加订单的6个属性
·创建类:Food,添加菜品3个属性
·创建类:OrderingUtil,添加方法initial()
·初始化3个菜品信息
·初始化两条订单信息

class OrderingSet
    {
    
    
        /// <summary>
        /// 订单类属性
        /// </summary>
        public string name;//订餐人姓名
        public string dishMesg;//菜品名以及份数
        public int time;//送餐日期      
        public string address;//送餐地址
        public int state;//订单状态,0:已预订;1:已完成       
        public double sumPrice;//订单总金额
        public OrderingSet()//无参构造
        {
    
    

        }
    }
 public class Food
    {
    
    
        public string name;//菜名
        public double price;//价格
        public int num;//点赞数

        public Food()//无参构造
        {
    
    

        }
        public Food(string name, double price, int num)
        {
    
    
            this.name = name;
            this.price = price;
            this.num = num;
        }
    }

初始化之前先创建两个数组保存数据

//订单数组
OrderingSet[] orders = new OrderingSet[4];
//菜品数组
Food[] foods = new Food[3];
public void Initial()
  {
    
          
  //菜品信息      
  //1.实例化红烧带鱼对象,并为属性赋值
   Food food1 = new Food();
   food1.name = "红烧带鱼";
   food1.price = 38.0;
   food1.num = 0;
   //2.将红烧带鱼信息存在菜品数组中
   foods[0] = food1;

   //3.实例化鱼香肉丝对象,并为属性赋值
   Food food2 = new Food();
   food2.name = "鱼香肉丝";
   food2.price = 20.0;
   food2.num = 0;
   //将红烧带鱼信息存在菜品数组中
   foods[1] = food2;

   //实例化鱼香肉丝对象,并为属性赋值
   Food food3 = new Food();
   food3.name = "时令蔬菜";
   food3.price = 10.0;
   food3.num = 0;
   //将红烧带鱼信息存在菜品数组中
   foods[2] = food3;
               
   //订单信息
   //1.实例化订单对象(订餐人1),并未属性赋值
   OrderingSet order1 = new OrderingSet();
   order1.name = "张晴";
   order1.dishMesg = "红烧带鱼2份";
   order1.time = 3;
   order1.address = "天城路207号";
   order1.state = 1;
   order1.sumPrice = 76.0;
   //将订单信息放入数组中
    orders[0] = order1;

    //1.实例化订单对象(订餐人2),并未属性赋值
    OrderingSet order2 = new OrderingSet();
    order2.name = "张晴";
    order2.dishMesg = "鱼香肉丝2份";
    order2.time = 10;
    order2.address = "天城路207号";
    order2.state = 0;
    order2.sumPrice = 45.0;
    //将订单信息放入数组中
    orders[1] = order2;     

步骤二:编写程序人口,实现菜单显示和切换
·在类OrderingUtil中创建方法startMenu(),实现菜单切换
·编写类OrderStart,实现程序入口

//输入0返回菜单

void Return0()
  {
    
    
     Console.Write("输入0返回:");
     int a = int.Parse(Console.ReadLine());
     if (a == 0)
      {
    
    
       StartMenu();//返回开始菜单
      }
       else
       {
    
    
         Return0();
       }
    }

//开始菜单界面

public void StartMenu()
 {
    
    
  int choice = 0;
  try
     {
    
    //这里为了防止输入非整型导致程序失败退出
     Console.WriteLine("****************************");
     Console.WriteLine("1、我要订餐" + "\n" + "2、查看餐袋" + "\n" + "3、签收订单" + "\n" + "4、删除订单" + "\n" + "5、我要点赞" + "\n" + "6、退出系统");
     Console.WriteLine("****************************");
     Console.Write("请选择:");
     //这里要是用string类型就没必要用try了
     choice = int.Parse(Console.ReadLine());
      }
      catch (Exception)
         {
    
    
           Console.WriteLine("输入有误!请输入数字!");
           StartMenu();
         }
      switch (choice)
        {
    
    
          case 1:
           Console.WriteLine("***我要订餐***");
           Add();//添加方法
           Return0();//输入0返回菜单
           break;
          case 2:
           Console.WriteLine("***查看餐袋***");
           Display();
           Return0();
           break;
          case 3:
           Sign();
           break;
          case 4:
           delete();
           break;
          case 5:
           Praise();
           break;
          case 6:
           Console.WriteLine("谢谢使用,欢迎下次光临!");
           break;
          default:
           Console.WriteLine("输入有误!");
           StartMenu();
           break;
         }
   }

//OrderingStart类实现程序入口

class OrderingStart
{
    
    
   static void Main(string[] ages)
     {
    
    
      Console.WriteLine("欢迎使用“吃货联盟订单系统”");
      OrderingUtil util = new OrderingUtil();
      util.Initial();
      util.StartMenu();           
     }
}

在这里插入图片描述
步骤三:遍历系统已有菜单,并显示
·在类OrderingUtil中创建Display()
·根据状态值输出已完成或已预定

//查看餐袋功能

public void Display()
 {
    
    
  int flag = 0;
  Console.WriteLine("序号" + "\t" + "订餐人" + "\t" + "餐品信息" + "\t" + "送餐日期" + "\t" + "送餐地址" + "\t" + "总金额" + "\t    " + "订单状态");
  for (int i = 0; i < orders.Length; i++)
   {
    
    
    if (orders[i] != null)
     {
    
    
      flag = 1;
      //如果state为1,显示已完成
      if (orders[i].state == 1)
       {
    
    
         Console.WriteLine((i + 1) + "\t" + orders[i].name + "\t" + orders[i].dishMesg + "\t" + orders[i].time + "日\t\t" + orders[i].address + "\t" + orders[i].sumPrice + "元\t    " + "已完成");
       }
       //如果state为0,显示已预定
       else if (orders[i].state == 0)
        {
    
    
         Console.WriteLine((i + 1) + "\t" + orders[i].name + "\t" + orders[i].dishMesg + "\t" + orders[i].time + "日\t\t" + orders[i].address + "\t" + orders[i].sumPrice + "元\t    " + "已预定");
        }
       }
     }
     if (flag == 0)
       {
    
    
         Console.WriteLine("无订单!");
         Return0();
       }
 }

在这里插入图片描述
步骤四:增加一条订单信息,实现我要订餐
·接收菜品信息
·订单金额

//接收菜品信息

 public void DisplayFoods()
   {
    
    
     Console.WriteLine("序号\t" + "菜名\t\t" + "单价\t" + "点赞数");
     for (int i = 0; i < foods.Length; i++)
       {
    
    
         if (foods[i] != null)
          {
    
    
            Console.WriteLine((i + 1) + "\t" + foods[i].name + "\t" + foods[i].price + "\t" + foods[i].num);
          }
       }
   }

//规定送餐时间范围

void IsInTime(int time)
 {
    
    
  if (time < 10 || time > 20)
    {
    
    
     Console.Write("请输入送餐时间(送餐时间是10至20点间整点送餐):");
     time = int.Parse(Console.ReadLine());//时间
     IsInTime(time);
    }
 }

//添加订单

 void Add()
   {
    
    
    int order_quantity = 0;//订单数组下标0
    Console.Write("请输入姓名:");
    string name = Console.ReadLine();
    DisplayFoods();//显示食物列表
    Console.Write("请选择您要点的菜品编号:");
    int number = int.Parse(Console.ReadLine());//编号
    
    Console.Write("请选择您需要的份数:");
    int quantity = int.Parse(Console.ReadLine());//份数
    Console.Write("请输入送餐时间(送餐时间是10至20点间整点送餐):");
    int time = int.Parse(Console.ReadLine());//时间
    IsInTime(time);
    Console.Write("请输入送餐地址:");
    string address = Console.ReadLine();//地址
    Console.WriteLine("订单成功!");
    Console.Write("您订的是:" + foods[number - 1].name + quantity + "份");
    Console.Write("送餐时间:" + time + "点");
    double meals = foods[number - 1].price * quantity;//餐费
    ouble deliveryfee = 0.0;//送餐费          
    double total;//总费用           
    if (meals < 50)
      {
    
    
       deliveryfee = 5.0;
      }//判断:低于50元,多加配送费5元
    total = meals + deliveryfee;//计算总费用
    //将订单录入订单数组里面
    OrderingSet order3 = new OrderingSet();
    order3.name = name;
    order3.dishMesg = foods[number - 1].name + quantity + "份";
    order3.time = time;
    order3.address = address;
    order3.state = 0;
    order3.sumPrice = total;
     //遍历订单数组,找到空位置
     //数组开始有两条信息,遍历后order_quantity=2,
     //该下标无对应数组,刚好存第一条信息
    for (int i = 0; i < orders.Length; i++)
      {
    
    
       if (orders[i] != null)
         {
    
    
           order_quantity++;
         }
       }
      //最终录入数组中,
       orders[order_quantity] = order3;
       Console.WriteLine("餐费:" + meals + "元," + "送餐费" + deliveryfee + "," + "总计:" + total);
 }

在这里插入图片描述

步骤五:送餐后,将用户签收订单状态
·类OrderingUtil中创建方法Sign(),接收签收的订单号

//签收功能

void Sign()
  {
    
    
   Display();
   Console.WriteLine("请输入要签收的订单的序号:");
   int xuhao = int.Parse(Console.ReadLine());
   //数组下标是指定订单序号减一
   if (xuhao <= 0 || xuhao >= orders.Length)
     {
    
    //输入的序号应该在范围内
      Console.WriteLine("输入有误");
      Sign();
     }
    for (int i = 0; i < orders.Length; i++)
      {
    
    
       if (xuhao == (i + 1))
       {
    
    
         if (orders[xuhao - 1] == null)
          {
    
    
           Console.WriteLine("无该订单!");
           break;
           }
         if (orders[xuhao - 1].state == 0)
           {
    
    
            Console.WriteLine("签收成功!");
            orders[xuhao - 1].state = 1;
            break;
           }
         if (orders[xuhao - 1].state == 1)
           {
    
    
            Console.WriteLine("该订单已签收,无需重复操作");
            break;
           }
         }
      }
    Return0();
 }

在这里插入图片描述
步骤六:按照输入的订单号,删除已完成状态的订单
·类OrderingUtil中,创建方法Delete(),接收要删除的订单号
·删除后,该订单后的数据依次往前移一位

void delete()
  {
    
    
   Display();//显示订单
   Console.Write("请输入要删除的订单序号:");
   int xuhao = int.Parse(Console.ReadLine());
   int order_quantity = 0;//订单数量//再次调用又归为0
   //遍历订单数组,找到空位置
   //(无添加式的值)数组开始有两条信息,遍历后order_quantity=2,
   //(添加一次后的值)order_quantity=3,
   //(第二次添加)order_quantity=4,
 for (int i = 0; i < orders.Length; i++)
  {
    
    
   if (orders[i] != null)
   {
    
    
    order_quantity++;
   }
  }
if (xuhao > order_quantity || xuhao <= 0)
    {
    
    
     Console.WriteLine("未找到该订单!不执行删除!");
    }
else
 {
    
    
  for (int i = 0; i < orders.Length; i++)
  {
    
    
   if (i == (xuhao - 1) && orders[i] != null)
    {
    
    
     if (orders[xuhao - 1].state == 1)
      {
    
    
       orders[xuhao - 1] = null;
       Console.WriteLine("订单删除成功");
       //删除后,数组信息往前移
       for (int j = xuhao - 1; j < orders.Length - 1; j++)
        {
    
    
         orders[j] = orders[j + 1];
         orders[j + 1] = null;
        }
        break;
      }
      else if (orders[xuhao - 1].state == 0)
       {
    
    
        Console.WriteLine("您选择的订单还未签收,不能删除!");
       }
     }
   }
  }
     Return0();
}

在这里插入图片描述

步骤七:实现点赞功能
·显示菜品信息
·类OrderingUtil中,创建方法Praise()

//判断该是否存在对应该序号的菜品

 void isExitFoods(int xuhao)
   {
    
    
    int foods_quantity = 0;//菜品数量
    for (int i = 0; i < foods.Length; i++)
      {
    
    
       if (foods[i] != null)
         {
    
    
            foods_quantity++;
         }
      }
    if (xuhao > foods_quantity || xuhao <= 0)
       {
    
    
         Console.WriteLine("未找到该菜品信息!不执行点赞!");
       }
  }

//点赞功能

void Praise()
 {
    
    
    DisplayFoods();//显示菜品信息
    Console.Write("请选择您要点赞的菜品序号:");
    int xuhao = int.Parse(Console.ReadLine());
    isExitFoods(xuhao);//判断该是否存在对应该序号的菜品
    for (int i = 0; i < foods.Length; i++)
     {
    
    
       if (i == (xuhao - 1) && foods[i] != null)
       {
    
    
         foods[xuhao - 1].num++;
         Console.WriteLine("点赞成功!");
          break;
        }
     }
     Return0();
  }

在这里插入图片描述
老师布置的这个习题,基本算是对之前所学的一个综合运用吧。

猜你喜欢

转载自blog.csdn.net/weixin_44706943/article/details/125947475