本文实例为大家分享了C#实现简单超市收银系统的具体代码,供大家参考,具体内容如下
今天使用一直学习的抽象类等做了个简单的超市收银系统,不难,不过里面的逻辑要理清楚。
首先我们要知道我们要实现的功能。
超市一般有仓库,有收银台,有各种各样的商品,每一个商品都有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{}并没有加很多的异常判断,系统不算稳定,读者可以自行修改。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。