综合实战:超市收银系统

分析系统需求
超市提供的商品:笔记本电脑、手机、酱油、香蕉
商品在超市里面应该有:价格、数量、编号
这样就能抽象出来一个父类(ProductFather),包含价格(Price)、数量(Count)、编号(ID)

如果东西不够卖了,需要到仓库拿货物
仓库需要的功能:存储货物、提货、进货

超市卖东西时候需要一个收银的功能

抽象出一个商品的父类

class ProductFather{    public decimal Price    {        get;        set;    }    public double Count    {        get;        set;    }    public string ID    {        get;        set;    }    public ProductFather(string id, decimal price, double count)    {        this.ID = id;        this.Price = price;        this.Count = count;    }}

分别创建商品类继承于父类

class ShouJi:ProductFather{    public ShouJi(string id, decimal price, double count) : base(id, price, count)    {    }}

创建仓库类

class CangKu
{
//1.存储货物
//1.1 list相当于仓库,List<ProductFather>添加数据的集合,相当于将货架放到仓库,从而分门别类
List<List<ProductFather>> list = new List<List<ProductFather>>();

    /// <summary>    /// 想用户展示货物    /// </summary>    public void ShowPros()    {        foreach (var item in list)        {            Console.WriteLine("仓库有:" + item[0].Name + "," + "\t" + "有" + item.Count + "个," + "\t" + "每个" + item[0].Price + "元。");        }    }    /// <summary>    /// 创建仓库对象时,向仓库中添加货架    /// </summary>    //list[0] 存电脑  list[1]存手机 list[2]存酱油 list[3]存香蕉,这时候如果多,就能通过循环来完成    public CangKu()    {        list.Add(new List<ProductFather>());        list.Add(new List<ProductFather>());        list.Add(new List<ProductFather>());        list.Add(new List<ProductFather>());    }    /// <summary>    /// 进货    /// </summary>    /// <param name="strType">货物的类型</param>    /// <param name="count">货物的数量</param>    public void GetPros(string strType,int count)    {        for (int i = 0; i < count; i++)        {            switch (strType)            {                case "NoteBook": list[0].Add(new NoteBook(Guid.NewGuid().ToString(), 5000, "笔记本电脑"));                    break;                case "ShouJi":list[1].Add(new ShouJi(Guid.NewGuid().ToString(), 3000, "手机"));                    break;                case "JiangYou":list[2].Add(new JiangYou(Guid.NewGuid().ToString(), 10, "酱油"));                    break;                case "Banana":list[3].Add(new Banana(Guid.NewGuid().ToString(), 20, "香蕉"));                    break;            }        }    }    /// <summary>    /// 取货    /// </summary>    /// <param name="strType">货物的类型</param>    /// <param name="count">货物的数量</param>    //货物取出后,需要放哪?而且有可能会拿很多个所以返回ProductFather[]    public ProductFather[] QuPros(string strType, int count)    {        ProductFather[] pros = new ProductFather[count];        for (int i = 0; i < count; i++)        {            switch (strType)            {                case "NoteBook":                    if (list[0].Count == 0)                    {                        Console.WriteLine("没有电脑了!");                    }                    else                    {                        pros[i] = list[0][0];                        list[0].RemoveAt(0);                    }                    break;                case "ShouJi":                    if (list[1].Count == 0)                    {                        Console.WriteLine("没有手机了!");                    }                    else                    {                        pros[i] = list[1][0];                        list[1].RemoveAt(0);                    }                    break;                case "JiangYou":                    if (list[2].Count == 0)                    {                        Console.WriteLine("没有酱油了!");                    }                    else                    {                        pros[i] = list[2][0];                        list[2].RemoveAt(0);                    }                    break;                case "Banana":                    if (list[3].Count == 0)                    {                        Console.WriteLine("没有酱油了!");                    }                    else                    {                        pros[i] = list[3][0];                        list[3].RemoveAt(0);                    }                    break;            }        }        return pros;    }}

超市收银系统续
创建超市类

namespace 超市收银系统{class SuperMarket{    ////当用户进入超市后,仓库应该有东西,但是做完仓库类后依然没有货,创建仓库对象通过构造函数给予仓库货    CangKu ck = new CangKu();    /// <summary>    /// 创建超市对象的时候,给仓库的货架上导入货物    /// </summary>    public SuperMarket()    {        ck.GetPros("ShouJi", 1000);        ck.GetPros("NoteBook", 1000);        ck.GetPros("JiangYou", 1000);        ck.GetPros("banana", 1000);    }    /// <summary>    /// 跟客户交互的过程(问客户买什么)    /// </summary>    public void AskBuying()    {        Console.WriteLine("欢迎光临,请问您需要些什么");        Console.WriteLine("我们这里有笔记本电脑(NoteBook)、手机(ShouJi)、酱油(JiangYou)、香蕉(Banana)");        string strType = Console.ReadLine();        Console.WriteLine("您需要多少?");        int count = Convert.ToInt32(Console.ReadLine());        //去仓库取货        ProductFather[] pros = ck.QuPros(strType, count);        //取货后,计算价钱,写一个方法,计算总价钱        double realMoney = GetMoney(pros);        Console.WriteLine("您购买的商品,总价是{0}元", realMoney);                    //打折方式        Console.WriteLine("您购买的商品,总价是{0}元", realMoney);        Console.WriteLine("请选择你的打折方式 1--不打折 2--打九折 3--打85折 4--买300送50  5--买500送100");        string input = Console.ReadLine();    }    /// <summary>    /// 根据用户买的货物计算总价钱    /// </summary>    /// <param name="pros">用户购买的货物</param>    /// <returns></returns>    public double GetMoney(ProductFather[] pros)    {        //声明一个总价钱        double realMoney = 0;        for (int i = 0; i < pros.Length; i++)        {            //表示把这个集合当每个货物的价钱累加到总价上            realMoney += pros[i].Price;        }        return realMoney;    }}

}

打折方式的类创建
由于打折也是不固定没,没有可以直接实现的对象,所以这时就可以采用一个抽象类来实现
创建打折类的父类

namespace 超市收银系统{/// <summary>/// 打折的父类/// </summary>abstract class CalFather{    /// <summary>    /// 计算打折后应付多少钱    /// </summary>    /// <param name="realMoney">打折前应付的钱</param>    /// <returns>返回打折后的钱</returns>    public abstract double GetTotalMoney(double realMoney);}}

有了打折类父类之后,按照需求了解到,有三种打折模式1.不打折 2.按照折扣打折 3.买多少送多少。先创建一个不打折的类

namespace 超市收银系统{/// <summary>/// 不打折,该多少钱就是多少钱/// </summary>class CalNormal : CalFather{    public override double GetTotalMoney(double realMoney)    {        return realMoney;    }}}

然后在创建一个按照折扣率打折的类

namespace 超市收银系统{/// <summary>/// 按照折扣率打折/// </summary>class CalRate : CalFather{    /// <summary>    /// 折扣率,由于每天的折扣率都不一样,所以需要一个属性来存折扣率    /// </summary>    public double Rate    {        get;        set;    }    //当创建对象的时候传入折扣率    public CalRate(double reta)    {        this.Rate = reta;    }    public override double GetTotalMoney(double realMoney)    {        return realMoney * this.Rate;    }}}

最后创建一个买多少送多少的类

namespace 超市收银系统{/// <summary>/// 买M元 送N元/// </summary>class CalMN : CalFather{    //买多少送多少    public double M //买的钱    {        get;        set;    }    public double N  //送的钱    {        get;        set;    }    public CalMN(double m, double n) //通过构造函数把值赋值给属性    {        this.M = m;        this.N = n;    }    /// <summary>    /// 判断买多少钱(M)送多少钱(N)    /// </summary>    /// <param name="realMoney">买的多少钱</param>    /// <returns>返回送钱后的应该付多少钱</returns>    public override double GetTotalMoney(double realMoney)    {        if (realMoney >= this.M)        {            //此时存在一个问题,如果用户购买1000呢?送不送就得送两个100元。            //return realMoney - this.N;            //打折多少取决于有几个M,这样就拿到了几个M,由于realMoney是double类型,所以需要强转成int整数型            return realMoney - (int)(realMoney/this.M)*this.N;        }        else        {            return realMoney;        }    }}}

至此超市打折的步骤完成

这时候我们实际是不知道用户会选择哪种打折模式的,这时候就用到了简单工厂设计模式,根据用户输入来返回一个对象。
由于不确定用户的选择,所以也不能确定返回哪个子类,但是返回父类是肯定不会错的。
获取用户选择的打折模式,来给出价钱

class SuperMarket{    //当用户进入超市后,仓库应该有东西,但是做完仓库类后依然没有货,创建仓库对象通过构造函数给予仓库货    CangKu ck = new CangKu();    /// <summary>    /// 创建超市对象的时候,给仓库的货架上导入货物    /// </summary>    public SuperMarket()    {        ck.GetPros("ShouJi", 1000);        ck.GetPros("NoteBook", 1000);        ck.GetPros("JiangYou", 1000);        ck.GetPros("banana", 1000);    }    /// <summary>    /// 跟客户交互的过程(问客户买什么)    /// </summary>    public void AskBuying()    {        Console.WriteLine("欢迎光临,请问您需要些什么");        Console.WriteLine("我们这里有笔记本电脑(NoteBook)、手机(ShouJi)、酱油(JiangYou)、香蕉(Banana)");        string strType = Console.ReadLine();        Console.WriteLine("您需要多少?");        int count = Convert.ToInt32(Console.ReadLine());        //去仓库取货        ProductFather[] pros = ck.QuPros(strType, count);        //取货后,计算价钱,写一个方法,计算总价钱        double realMoney = GetMoney(pros);        //打折方式        Console.WriteLine("您购买的商品,总价是{0}元", realMoney);        Console.WriteLine("请选择你的打折方式 1--不打折 2--打九折 3--打85折 4--买300送50  5--买500送100");        string input = Console.ReadLine();        //通过简单工厂设计模式根据用户的输入获得一个打折对象        CalFather cal = GetCal(input);       double totalMoney = cal.GetTotalMoney(realMoney);        Console.WriteLine("打完折后,您应付{0}元", totalMoney);    }    /// <summary>    /// 根据用户选择的打折方式返回一个打折对象    /// </summary>    /// <param name="input">用户的选择</param>    /// <returns>返回父类的对象,但是里面装的是子类对象</returns>    public CalFather GetCal(string input)    {        CalFather cal = null;        switch (input)        {            case "1": cal = new CalNormal();                break;            case "2": cal = new CalRate(0.9);                break;            case "3": cal = new CalRate(0.85);                break;            case "4": cal = new CalMN(300, 50);                break;            case "5": cal = new CalMN(500, 100);                break;        }        return cal;    }    /// <summary>    /// 根据用户买的货物计算总价钱    /// </summary>    /// <param name="pros">用户购买的货物</param>    /// <returns></returns>    public double GetMoney(ProductFather[] pros)    {        //声明一个总价钱        double realMoney = 0;        for (int i = 0; i < pros.Length; i++)        {            //表示把这个集合当每个货物的价钱累加到总价上            realMoney += pros[i].Price;        }        return realMoney;    }}

当程序运行后,我们想看见这个超市有什么东西,多少钱,即展示货物,而展示货物的方法已经写在仓库类中,按理说应该在Main函数中创建仓库的对象,这个时候有一个问题,创建对象的时候仓库里面只有货架,而没有货物。货物是在创建超市对象时候才有的
在超市类最下面调用仓库类中的展示货物的函数,这样就不用再到Main函数中创建仓库对象

  /// <summary>    /// 调用仓库展示货物的方法,这样就不用再去Main函数中创建仓库的对象    /// </summary>    public void ShowPros()    {        ck.ShowPros();    }

写完这里,我们的程序基本完成,在Main函数中创建超市对象并调用

class Program{    static void Main(string[] args)    {        //创建超市对象        SuperMarket sm = new SuperMarket();        //1.展示货物        sm.ShowPros();        //2.跟用户进行交互        sm.AskBuying();        Console.ReadKey();    }

最后超市完成购物后,会打印一个小票

public void AskBuying()    {        Console.WriteLine("欢迎光临,请问您需要些什么");        Console.WriteLine("我们这里有笔记本电脑(NoteBook)、手机(ShouJi)、酱油(JiangYou)、香蕉(Banana)");        string strType = Console.ReadLine();        Console.WriteLine("您需要多少?");        int count = Convert.ToInt32(Console.ReadLine());        //去仓库取货        ProductFather[] pros = ck.QuPros(strType, count);        //取货后,计算价钱,写一个方法,计算总价钱        double realMoney = GetMoney(pros);        //打折方式        Console.WriteLine("您购买的商品,总价是{0}元", realMoney);        Console.WriteLine("请选择你的打折方式 1--不打折 2--打九折 3--打85折 4--买300送50  5--买500送100");        string input = Console.ReadLine();        //通过简单工厂设计模式根据用户的输入获得一个打折对象        CalFather cal = GetCal(input);       double totalMoney = cal.GetTotalMoney(realMoney);        Console.WriteLine("打完折后,您应付{0}元", totalMoney);        Console.WriteLine("以下是您的购物信息");        foreach (var item in pros)        {            Console.WriteLine("货物:" + item.Name + "," + "\t" + "货物单价" + item.Price + "," + "\t" + "货物编号:" + item.ID);        }        Console.WriteLine("打完折后,您应付{0}元", totalMoney);    }

至此超市收银系统练习完成!!

©著作权归作者所有:来自51CTO博客作者lcjh的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. GitHub的注册,代码仓库的创建,用小乌龟上传代码(个人认为比较适合新
  2. GitHub 告别中文仓库刷榜/霸榜
  3. 重磅!Github 私有仓库免费开放
  4. DockerHub访问慢怎么破?自建个企业级镜像仓库试试!
  5. 10分钟搭建自己的Git仓库
  6. 2.docker容器管理、仓库管理、数据管理、数据卷备份恢复
  7. 从0开始搭建数据仓库(2):产品经理如何“玩转”Hive SQL
  8. linux-阿里云仓库搭建-搭建本地仓库-yum
  9. Git - 将Github仓库与本地仓库同步?

随机推荐

  1. Go Modules使用详解
  2. golang怎么编译
  3. golang怎么判断map是否为空
  4. go build和go install的区别
  5. golang循环有几种
  6. Go语言中处理json数据的方法
  7. golang怎么判断指针是否为空
  8. Go语言的内存模型介绍
  9. Golang交叉编译简述
  10. golang怎么判断套接字是否关闭