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{}并没有加很多的异常判断,系统不算稳定,读者可以自行修改。
如果真有看到这里的,谢谢支持哈哈哈!