C#学习日记04——简单超市收银系统

今天使用一直学习的抽象类等做了个简单的超市收银系统,不难,不过里面的逻辑要理清楚。
首先我们要知道我们要实现的功能。

超市一般有仓库,有收银台,有各种各样的商品,每一个商品都有Name,Price,Count等属性。我们可以写一个抽象父类,这样我们才能将每件商品属性设置一样。
新建一个ProduckFather类作为商品的父类 并将属性和构造函数写好,每次新建商品时写好参数就会方便很多

 abstract class ProduckFather    {        private string _name;        private double _price;        private int _count;        private string _id;        public string Name { get => _name; set => _name = value; }        public double Price { get => _price; set => _price = value; }        public int Count { get => _count; set => _count = value; }        public string Id { get => _id; set => _id = value; }        public ProduckFather(string name,double price,int count)        {            this.Name = name;            this.Price = price;            this.Count = count;        }    }```接下来创造自己的商品,这里只举Apple一个例子,不在重复代码```csharp class Apple:ProduckFather    {        public Apple(string name,double price,int count)            :base(name,price,count)        {                }    }

接下来就是仓库类了,这一部分是个重点,他要实现存储的功能,那么我们用什么来存储呢?
我们既要存不同种类的物品,数量也不会相同,首选是list(集合)或dictionary(键值对),问题是集合存储虽然容易,想要拿到固定的东西却比较复杂
list就相当于是一个大仓库,虽然什么东西都能存储,但是每次找东西都要翻半天,所以我们可以使集合中每一个元素都是一个集合,而且这个集合必须是父类类型的,不然无法装有其他类型的物品。

        //[0]Apple [1]Banana [2]Vivo [3]Oppo [4]Huaweu         //实现存储货物        List<List<ProduckFather>> list = new List<List<ProduckFather>>();    //建造一个仓库        //让每一个仓库摆满东西

代码中的list可以理解为仓库里摆满了货架,什么类型的物品就放在什么货架上。
仓库每次调用时里面必须要有货架,所以写成构造函数。

 public Cangku()        {            list.Add(new List<ProduckFather>());//苹果香蕉华为oppo和vivo            list.Add(new List<ProduckFather>());            list.Add(new List<ProduckFather>());            list.Add(new List<ProduckFather>());            list.Add(new List<ProduckFather>());        }

仓库还要有进货,出货,以及展示超市内物品的功能,这一部分代码不难,还请读者根据注释自行理解

/// <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 "Apple":list[0].Add(new Apple("Apple", 6000, 1));                        break;                    case "Banana":list[1].Add(new Banana("Banana",5,1));                        break;                    case "Vivo":list[2].Add(new Vivo("Vivo", 3000, 1));                        break;                    case "Oppo":list[3].Add(new Oppo("Oppo", 2500, 1));                        break;                    case "Huawei":list[4].Add(new Huawei("Huawei", 5000, 1));                        break;                    default:Console.WriteLine("你输入的有错误,请重新购买");                        break;                }            }        }        /// <summary>        /// 取货        /// </summary>        /// <param name="strType"></param>        /// <param name="count"></param>        public ProduckFather[] SetPros(string strType, int count)        {            ProduckFather[] pros = new ProduckFather[count];            for (int i = 0; i < count; i  )            {                switch (strType)                {                    case "Apple":                        if (list[0].Count > count)                        {                            pros[i] = list[0][0];//这里只是赋值的功能,并没有移除货物                            list[0].RemoveAt(0);//移除货物                            break;                        }                        else                         {                            Console.WriteLine("Apple货物不足!");                            break;                        }                    case "Banana":                        if (list[1].Count > count)                        {                            pros[i] = list[1][0];                            list[1].RemoveAt(0);                            break;                        }                        else {                            Console.WriteLine("Banana货物不足!");                            break;                        }                    case "Vivo":                        if (list[2].Count > count)                        {                            pros[i] = list[2][0];                            list[2].RemoveAt(0);                            break;                        }                        else {                            Console.WriteLine("Vivo产品不足!");                            break;                        }                    case "Oppo":                        if (list[3].Count > count)                        {                            pros[i] = list[3][0];                            list[3].RemoveAt(0);                            break;                        }                        else {                            Console.WriteLine("Oppo产品不足!");                            break;                        }                    case "Huawei":                        if (list[4].Count > count)                        {                            pros[i] = list[4][0];                            list[4].RemoveAt(0);                            break;                        }                        else                        {                            Console.WriteLine("Huawei产品不足!");                            break;                        }                    default:Console.WriteLine("没有您想要的物品!");                        break;                }            }            return pros;        }        /// <summary>        /// 展示超市物品        /// </summary>        public void ShowPros()//用遍历list来展示超市里的物品        {            foreach (var item in list)            {                Console.WriteLine("我们超市有:"   item[0].Name   "\t" "共有"  item.Count  "个,"   "\t"   "每个" item[0].Price "元");            }        }

仓库完结后,还有收银台的功能。
每次使用收银台时,必须有货物,所以写成构造函数保证仓库有货

         //每次引用时,需要进货        Cangku ck = new Cangku();//创建仓库对象        /// <summary>        /// 每次创建对象就进货        /// </summary>        public SuperMarket()        {            ck.GetPros("Apple", 100);//调用仓库类的进货函数进货            ck.GetPros("Banana", 1000);            ck.GetPros("Vivo", 150);            ck.GetPros("Oppo", 200);            ck.GetPros("Huawei", 500);        }

超市往往会有打折活动,一般这个活动分为两种例如:八折或者满300减50。活动往往是会变化的,所以写成抽象类
抽象类中提供一个打折方法。

abstract class CalFather    {        public abstract double Cal(double realmoney);    }

创建打折类CalRate

class CalRate : CalFather    {        double _rate;        public double Rate { get => _rate; set => _rate = value; }        public CalRate(double rate)        {            this.Rate = rate;        }        public override double Cal(double realmoney)        {            return realmoney * this.Rate;        }    }

满减类CalMN

 class CalMN : CalFather    {        double m;        double n;        public double M { get => m; set => m = value; }        public double N { get => n; set => n = value; }        public CalMN(double m,double n)        {            this.M = m;            this.N = n;        }        public override double Cal(double realmoney)        {            return realmoney - N * (realmoney % M);        }    }

这两块没有难点,自行理解
接下来与用户的交互重中之重,包含了计算用户货物的钱以及计算打折后的钱等。
不明白请看注释

 /// <summary>        /// 用顾客交互,询问需要什么        /// </summary>        public void SayWhat()        {            Console.WriteLine("您好您需要什么?");            string str = Console.ReadLine();            Console.WriteLine("您需要多少?");            int a = Convert.ToInt32(Console.ReadLine());            ProduckFather[] pros=  ck.SetPros(str, a);//将货物取出            double realmoney =  GetMoney(pros);   //计算真实价格            Console.WriteLine("您购买的物品是{0},数量是{1},价格是{2}", str, a,realmoney);//用户购买清单            Console.WriteLine("请选择您的打折方式:1--8折,2--满300送50  3--不打折");             int input= Input(); //用户输入,调用Input判断输入是否合规并返回int类型            CalFather cal = Money(input);//判断打折方法并,返回一个父类对象            double money= cal.Cal(realmoney);//调用打折虚方法并返回打折后的钱            Console.WriteLine("总共要花费{0}元", money);            XiaoPiao(pros, money);                   }        /// <summary>        /// 计算真实价格        /// </summary>        /// <param name="pros"></param>        /// <returns></returns>        public double GetMoney(ProduckFather[] pros)//遍历pros(相当于购物车)来计算价钱        {            double realmoney=0;            foreach (var item in pros)            {                realmoney  = item.Price;            }            return realmoney;        }        /// <summary>        /// 打折后的钱        /// </summary>        /// <param name="input"></param>        /// <returns></returns>        public CalFather Money(int input)//根据用户的选择来计算打折后的钱        {            CalFather cal = null;            switch (input)            {                case 1:cal = new CalRate(0.8);                             break;                case 2:cal = new CalMN(300, 50);                    break;                case 3:cal = new CalNo();                     break;            }            return cal;        }        public void ShowPros()        {            ck.ShowPros();        }        /// <summary>        /// 判断用户输入是否合理        /// </summary>        public int Input()  //判断用户输入的是否合规,不合规则一直输入        {            bool b = true;            int input;            while (b)            {                try                {                    input = Convert.ToInt32(Console.ReadLine());                    if (input <= 3 && input > 0)                    {                        return input;                    }                    else                    {                        b = true;                    }                }                catch                {                    Console.WriteLine("您输入的不正确,请重新输入:1--8折,2--满300送50  3--不打折");                }            }            return 0;                 }        //打印伪小票        public void XiaoPiao(ProduckFather[] pros, double money)        {            Console.WriteLine("***************发票***************");            foreach (var item in pros)            {                Console.WriteLine("本次您购买了"   item.Name   "\t"   "一共"   item.Count   "\t"   "件" );            }            Console.WriteLine("总花费了{0}元", money);            Console.WriteLine("请评价本次购买:1--满意 2--良好 3--不满意");            Console.ReadKey();            Console.WriteLine("感谢您的评价,祝您生活愉快!");        }    }

主函数:

              //创建超市对象            SupperMarket sp = new SupperMarket();            //展示超市货物            sp.ShowPros();            //跟用户交互           sp.SayWhat();

运行界面:

本系统还有部分尚不完善,是开源的,还可以实现进货的功能,以及try{}catch{}并没有加很多的异常判断,系统不算稳定,读者可以自行修改。

如果真有看到这里的,谢谢支持哈哈哈!

来源:https://www.icode9.com/content-1-865101.html

(0)

相关推荐

  • 傅里叶级数

    一.理论基础   任何周期函数都可以看成是不同振幅,不同相位的正弦波的叠加. 1. 三角函数系的正交性:    三角函数系:          三角函数系中任意两个不同的函数之积在[-π,π]上的积分 ...

  • Linq扩展方法

    如果要扩展LINQ查询方法集,只需要为IEnumerable<T>扩展方法. 第一种:扩展聚合方法,类似已有的Max.Min,可以给具体类型扩展,也可以给泛型扩展. using Syste ...

  • VB.net中动态构建Linq的Where子句

    Imports System.Linq.Expressions Imports System.Linq Imports System.Collections.Generic Class A     P ...

  • PTA 素数对猜想 C#版

    using System; using System.Collections.Generic; namespace Prime { class Program { static   void Main ...

  • 如何监管超市收银漏洞

    收银漏洞说白了就是收银员有这样那样的损公肥私(包括家人)行为,将本不属于自己的钱据为己有,超市方却又无法做到真正的控制.收银漏洞这样的行为放任下去,必将导致此超市内盗成风,所有有利益关系的人捆成一团, ...

  • 旺季到来,超市收银员注意事项(收藏)

      六个必须 必须按规定整齐着装. 必须发型规范.淡妆上岗.坐姿端庄. 必须精神饱满.主动热情.微笑待客. 必须文明礼貌.使用普通话,文明用语和唱收唱付. 必须保持款台干净整齐. 必须保持帐款一致. ...

  • 超市用什么收银软件哪个好?超市收银软件排行榜推荐

    超市用什么收银软件哪个好?超市收银软件免费版有哪些?现如今越来越多的人外出购物选择无卡支付,商家拥有一款好的收银软件是必不可少的,不仅可以解决找零问题,还可以提高交易效率,所以浏览器家园小编整理了一些 ...

  • 超市收银员亲身体验:不敢提醒戴口罩,危险更近了

    莱法州Idar-Oberstein加油站因为口罩要求造成一名20岁的年轻人被谋杀的事件在全国引起了恐慌.在柏林一家超市打工的25岁的女大学生Elif Inan早就感受到这种压力.在凶杀案发生之前,她就 ...

  • 超市收银员“捡”到一岁半宝宝,妈妈赶回后:买完菜忘记还有娃了

    不少女性刚生完孩子都会发现,自己出现短暂的记忆力衰退.反应迟钝等问题,比如:想去厨房拿东西,结果到了厨房就忘了自己要干什么,于是就被大家贴上了"一孕傻三年"这样的标签. 为什么说& ...

  • 芬兰童话!超市收银员成为最美、最幼齿总理

    鲁晓芙,财经作家,旅居欧洲,以荷比卢为基地,从事全欧洲投资并购业务. 中国经济已经国际化了,不了解欧洲,有时候,你就不了解中国. 欢迎关注:鲁晓芙看欧洲. 合作请联系微信:Xiaofu_Lu 芬兰日前 ...

  • 揭秘超市收银员舞弊的这15种手法,值得注意...

    揭秘超市收银员舞弊的这15种手法,值得注意...

  • 俄罗斯新年之前掀起购物狂潮 连锁店收银系统出现大范围瘫痪

    新年将至,俄罗斯人喜欢疯狂购物,试图把一年挣的钱在年底都花光.买电器,买汽车,买家具,当然还要购买大量的美酒佳肴,以便在新年钟声敲响之际大家能开怀畅饮,大快朵颐.然而,就在市民们疯狂购物大量采购的时候 ...

  • 生鲜收银系统有什么好方案

    数字经济时代,一切能够提升效率和体验的事物,都该被充分利用.AI(人工智能)技术的出现,已经升级了很多重复性的.机械式的工作,解放的生产力被用来创造更大的社会价值.就拿最贴近民生的生鲜行业举例,生鲜收 ...