【IT168技术】 现实生活中,结账系统无处不在,屡见不鲜,各种结账系统 例如:订餐结账系统,超市购物结账系统,酒店客房结账系统等.其实结账原理都大同小异,即将所有购买项的价格都相加,当然 那些复杂的系统 所考虑的方面和功能就很多了. 我们这里不考虑.
那么,今天我们这里简单的写个基于C# winform 平台的水果店结账系统.
原理
这里用到了一个主窗体类和一个构造函数类(用于存取物品的属性). 还有一个写有物品属性的文本文件(目的是方便后期更改物品的价格,折扣等属性)
首先,通过FileStream 的OpenRead方法 来打开并读取文本文件, 然后调用 StreamReader来 读取FileStream的字符 并将里面的字节转换成字符串。具体FileStream 和 StreamReader的用法可以参考这里. 从文本里获取到物品的属性之后 将其存到一个具有物品属性的数据结构的泛型list里.
然后在各个物品按钮下调用 不同物品 其在泛型list里的索引也是不一样的. 然后在用一个整型 数组来存 每个物品按钮的点击次数,即为每个物品的购买次数,还用到一个泛型list 来装载每个物品的价格, 在计算总价的时候 遍历 相加, 得到一个总价.
这里还用到了一个优惠价,即每个物品都有不同的打折方式(代码里有详细注释), 用到了 一些简单的算法. 并且在结账的时候 自动计算 每项物品最终优惠了多少.
最后用总价-优惠价=最终我们应该支付的价格. 当然这里也实现了物品清空的功能.
界面设计
fruits.txt文本内容
代码如下
ProductAttribute.cs 类里的代码
1 using System;
2 using System.Collections.Generic; 3 using System.Linq;
4 using System.Text;
5
6 namespace 水果店结账系统
7 ...{
8 //这里用到了 一个构造函数 即方法与类同名 9 class ProductAttribute
10 ...{
11 //初始化各值
12 string name = "";
13 float price = 0;
14 int code1 = 0;15 int code2 = 0;
16 //构造方法
17 public ProductAttribute(string n, float p, int c1, int c2)
18 ...{
19 //实现ProductAttribute的数据结构 20 //里面可以传入如下参数21 name = n;
22 price = p;
23 code1 = c1;
24 code2 = c2;
25 }
26 //可以读取ProductAttribute里的Name 属性
27 public string Name28 ...{
29 get ...{ return name; }
30 }
31 //可以读取ProductAttribute里的Price 属性
32 public float Price33 ...{
34 get ...{ return price; }35 }
36 // 一个save方法 用于判断 不同的折扣方式 并返回一个减去的钱数
37 public float save(int n)38 ...{39 float m = 0; //m用于获取 打折后的 价格 符合的物品数量
40 switch (code1)
41 ...{
42 case 0: //code1为0 的时候 43 m = n; //买多少斤 最终价格还是 按多少斤算
44 break;
45 case 1: //code1为1的时候 有2种情况
46 if (code2 == 0) //code2为0 买1斤 第2斤免费 即买一送一 47 m = (float)((n / 2) + (n % 2)); //买1斤 第2斤免费 但买3斤 还是1斤免费 48 else if (code2 == 1) //code2为1 这里是买1斤 第2斤半价 即买2斤 1斤半的钱 买4斤 3斤的钱
49 m = (float)(1.5 * (n / 2) + (n % 2));
50 break;
51 case 2: //code1 为2的时候 也有2种方法
52 if (code2 == 0) //code1为2 code2 为0 买2斤 第3斤免费
53 m = (float)(n - (n / 3));
54 else if (code2 == 1) //code1为2 code2为1 即买2斤 第3斤半价
55 m = (float)(n - 0.5 * (n / 3));
56 break;
57 }
58
59 float save = (n - m) * price; //计算出一个最终的价格
60 return save; //返回省去的钱数
61 }
62 }
63 }
2 using System.Collections.Generic; 3 using System.Linq;
4 using System.Text;
5
6 namespace 水果店结账系统
7 ...{
8 //这里用到了 一个构造函数 即方法与类同名 9 class ProductAttribute
10 ...{
11 //初始化各值
12 string name = "";
13 float price = 0;
14 int code1 = 0;15 int code2 = 0;
16 //构造方法
17 public ProductAttribute(string n, float p, int c1, int c2)
18 ...{
19 //实现ProductAttribute的数据结构 20 //里面可以传入如下参数21 name = n;
22 price = p;
23 code1 = c1;
24 code2 = c2;
25 }
26 //可以读取ProductAttribute里的Name 属性
27 public string Name28 ...{
29 get ...{ return name; }
30 }
31 //可以读取ProductAttribute里的Price 属性
32 public float Price33 ...{
34 get ...{ return price; }35 }
36 // 一个save方法 用于判断 不同的折扣方式 并返回一个减去的钱数
37 public float save(int n)38 ...{39 float m = 0; //m用于获取 打折后的 价格 符合的物品数量
40 switch (code1)
41 ...{
42 case 0: //code1为0 的时候 43 m = n; //买多少斤 最终价格还是 按多少斤算
44 break;
45 case 1: //code1为1的时候 有2种情况
46 if (code2 == 0) //code2为0 买1斤 第2斤免费 即买一送一 47 m = (float)((n / 2) + (n % 2)); //买1斤 第2斤免费 但买3斤 还是1斤免费 48 else if (code2 == 1) //code2为1 这里是买1斤 第2斤半价 即买2斤 1斤半的钱 买4斤 3斤的钱
49 m = (float)(1.5 * (n / 2) + (n % 2));
50 break;
51 case 2: //code1 为2的时候 也有2种方法
52 if (code2 == 0) //code1为2 code2 为0 买2斤 第3斤免费
53 m = (float)(n - (n / 3));
54 else if (code2 == 1) //code1为2 code2为1 即买2斤 第3斤半价
55 m = (float)(n - 0.5 * (n / 3));
56 break;
57 }
58
59 float save = (n - m) * price; //计算出一个最终的价格
60 return save; //返回省去的钱数
61 }
62 }
63 }