目录
一. 实验目的
二. 系统设计
三. 设计步骤
四. 系统功能展示和调试
五. 实验总结
六. 附录:完整源代码
一. 实验目的
本实验旨在通过编程实现一个药店销售统计系统,包括药品信息管理、销售记录管理、库存警告及用户交互界面等功能。通过此系统,药店可以方便地管理药品库存、记录销售情况,并提供实时的库存警告,帮助药店提高管理效率和服务质量。
二. 系统设计
1.该系统设计了两个结构体,如下所示:
药品信息结构(Medicine):包括药品ID、名称、价格和库存量。
销售记录结构体(SaleRecord)包括销售的药品ID、销售数量、销售总价和销售时间。
2. 全局变量:
药品信息数组(medicine)和销售记录数组(salerecord),分别用于存储药品信息和销售记录。
药品数量(medicinecount)和销售记录数量(salecount)用于跟踪数组中实际存储的条目数。
管理员密码(password)用于验证管理员身份。
3 . 详细设计:
1)药品管理:
添加药品功能(AddMedicine):根据用户输入的药品ID、名称、价格和库存量,将药品信息添加到药品信息数组中。
删除药品功能(DeleteMedicine):根据用户输入的药品ID,从药品信息数组中删除对应的药品信息。
2)销售记录:
购买药品功能(BuyMedicine):根据用户输入的药品ID和购买数量,更新药品库存,并创建销售记录。
3)库存警告:
库存警告功能(warn):遍历药品信息数组,检查哪些药品库存量不足(例如,库存量为0或低于5),并输出警告信息。
4)管理员操作:
管理员通过输入密码进行登录,登录成功之后就可以进入管理员操作界面,实现包括添加药品、删除药品、查看销售记录、查看库存警告和退出等功能。
5)用户交互:
提供查看所有药品、查询药品、购买药品、退出以及管理员入口等功能选项。
三. 设计步骤
1)首先定义好数据结构和一些必要的全局变量。
2)接着根据所要实现的功能,完成菜单界面设计以及各个功能模块的设计。包括添加药品、删除药品、购买药品、库存警告、管理员操作和用户交互等。
3)编写主函数,在主函数中初始化药店的信息,并提供交互界面供用户使用。
4)测试,运行并调试程序。
该系统的主要设计流程图如下所示:
四. 系统功能展示和调试
进入药店的销售管理系统界面如图所示:
接着进行相关查看药品操作,可以在主函数中自行初始化药店药品信息,或者进入管理员操作入口,进行相关的药品管理。
在知道了有哪些药品之后,客户就可以进行对应的药品购买:
最后,可以进行管理员操作系统界面,输入对应的管理员进入密码,这个也可以根据实际情况来进行设置:
由于我们上面已经进行了一个药品的购买,下面我们来看看是否药店系统中是否已经生成了药品的销售记录:
如上所示,当我们查看销售记录的时候,就可以得到相关的购买时间,购买数量和价格等等信息。
最后退出系统界面:
五. 实验总结
本实验通过编程实现了一个完整的药店销售统计系统,涵盖了药品信息管理、销售记录管理、库存警告和用户交互等多个方面。通过此系统,药店可以方便地管理药品库存和销售情况,提高管理效率。在实验过程中,我深入理解了结构体、数组、函数、循环和条件判断等编程概念,并掌握了许多程序调试技巧。此外,本次实验还锻炼了我的逻辑思维能力和问题解决能力,为我后续的学习和工作打下了坚实的基础。
六. 附录:完整源代码
//实现药店的销售统计系统,并设计一定的交互系统
#include<stdio.h>
#include<string.h>
#include<time.h>#define MAXSIZE 100
//首先定义药品的信息结构体
typedef struct Medicine {int id; //药品的idchar name[MAXSIZE]; //药品的名称float price; //药品的价格int inventory; //药品的库存
}Medicine;//接着定义药品销售记录的结构体
typedef struct SaleRecord {int Medicineid; //记录销售药品的id编号int num; //记录销售药品总共的销售数量int PriceSum; //记录卖出药品的销售总价char time[80]; //用来记录卖出的时间
}SaleRecord;//函数声明
void NowTime(char* buffer, size_t size);
void AddMedicine(int id, const char name[], float price, int inventory);
void DeleteMedicine(int id);
void SearchMedicine(int id);
void BuyMedicine(int id, int num);
void choice1(); //菜单1
void choice2(); //菜单2
void Allsee();
void warn();
void list();//定义两个全局变量来作为信息库存储药品和药品的销售记录
Medicine medicine[10]; //这里最多销售10种药品,可自行修改数量
SaleRecord salerecord[MAXSIZE];
int medicinecount = 0; //记录实际药品个数
int salecount = 0; //用来记录实际销售单个数
char password[MAXSIZE] = "123123123"; //设置一个密码,供管理员登录管理员操作界面int main() {AddMedicine(1, "阿司匹林", 3200, 20);AddMedicine(2, "布洛芬", 200, 50);AddMedicine(3, "板蓝根颗粒", 15, 500);AddMedicine(4, "九九感冒灵", 20, 200);while (1) {int num; //用来接收用户所输入的操作编号choice1();scanf("%d", &num);switch (num) {case 1:Allsee();break;case 2: int num1;printf("请输入您要进行查询的药品编号:\n");scanf("%d", &num1);SearchMedicine(num1);break;case 3:int num2, num3;printf("请输入您要购买药品的编号以及所要购买的数量(中间用空格隔开):\n");scanf("%d %d", &num2, &num3);BuyMedicine(num2, num3);break;case 4:return 0;case 10:char pass[MAXSIZE];printf("请输入管理员密码:\n");scanf("%s", &pass);if ((strcmp(pass, password)) != 0) {printf("输入密码错误!");}else {while (1) {int num4; //用来接收管理员所输入的操作choice2();scanf("%d", &num4);switch (num4) {case 1:int id1;char name1[MAXSIZE];float price1;int inventory1;printf("请输入您要添加的药品编号:\n");scanf("%d", &id1);printf("请输入您要添加的药品名称:\n");scanf("%s", &name1);printf("请输入该药品的价格:\n");scanf("%f", &price1);printf("请输入要添加的数量:\n");scanf("%d", &inventory1);AddMedicine(id1, name1, price1, inventory1);break;case 2:int num5;printf("请输入要删除药品的编号:\n");scanf("%d", &num5);DeleteMedicine(num5);break;case 3:list();break;case 4:warn();break;case 5:return 0;}}}}}
}//定义一个AddMedicine函数用来添加药品信息到信息库当中
void AddMedicine(int id,const char name[],float price,int inventory) {if (medicinecount <10) { //当药品种数没有超过最大种数,就添加信息到信息库当中去int flag = 0;int number;for (int i = 0; i < medicinecount; i++) { //看添加的药品编号是否已经存在if (medicine[i].id == id) {flag = 1;number = i;}}if(flag==1) {medicine[number].id = id;strcpy(medicine[number].name, name);medicine[number].price = price;medicine[number].inventory = inventory;}else {medicine[medicinecount].id = id;strcpy(medicine[medicinecount].name,name);medicine[medicinecount].price = price;medicine[medicinecount].inventory = inventory;medicinecount++;}}else {printf("药品种数已达最大值,不能再进行添加!");}
}//定义一个DeleteMedicine函数来删除信息库中某一个药品
void DeleteMedicine(int id) {for (int i = 0; i < medicinecount; i++) {if (medicine[i].id == id) {medicine[i].id = 0; //id为0的药品是没有,这步操作相当于删除了该药品strcpy(medicine[i].name,"\0");medicine[i].price = 0;medicine[i].inventory = 0;break;}}
}//定义一个SearchMedicine函数来查看药品信息库中的药品信息
void SearchMedicine(int id) {for (int i = 0; i < medicinecount; i++) {if (medicine[i].id == id) {printf("该药品名称为:%s\n", medicine[i].name);printf("该药品的价格为:%.2f 元\n", medicine[i].price);printf("该药品现在的库存量为:%d 件\n", medicine[i].inventory);break;}else if(i==medicinecount-1){printf("没有id为%d的商品\n", id);}}
}//定义一个函数BuyMedicine来处理客户的购买需求
void BuyMedicine(int id,int num) {float price = 0;SaleRecord newrecord; //创建一个新销售记录for (int i = 0; i < medicinecount; i++) { //查找那个要购买的药if (medicine[i].id == id){if (medicine[i].inventory >= num) {medicine[i].inventory -= num;price =num * medicine[i].price;printf("恭喜您,购买成功,请付款%f元\n", price);break;}else {printf("当前药品已经没有这么多的库存,仅剩%d件", medicine[i].inventory);return;}}}if (price == 0) {printf("没有该药品\n");return;}newrecord.Medicineid = id;newrecord.num = num;newrecord.PriceSum = price;char timebuffer[80];NowTime(timebuffer, sizeof(timebuffer));strcpy(newrecord.time, timebuffer);salerecord[salecount++] = newrecord;
}void NowTime(char* buffer,size_t size) {time_t nowtime;// 使用time函数获取当前时间 time(&nowtime);// 声明一个tm结构体指针来接收本地时间 struct tm* timeinfo;// 使用localtime函数将rawtime转换为本地时间,并存储在timeinfo中 timeinfo = localtime(&nowtime);// 使用strftime函数将时间格式化为YYYY-MM-DD HH:MM:SS格式,并存储在buffer中 strftime(buffer, size, "%Y-%m-%d %H:%M:%S", timeinfo);
}//定义一个菜单界面供用户交互
void choice1() {printf("**********欢迎来到本药店**********\n");printf("******* 1.查看本店所有药品 ******\n");printf("******* 2.药品的查询 ********\n");printf("******* 3.购买药品 ********\n");printf("******* 4.退出 ********\n");printf("**********很高兴为您服务**********\n");printf("******** 10.管理员操作入口 ********\n");printf("请输入您想要进行的操作(非管理员请勿进行10号操作哦):\n");
}//定义另外一个菜单来供管理员操作
void choice2() {printf("\n");printf("您好,管理员\n");printf("***** 1.进行药品的添加 *****\n");printf("***** 2.进行药品的删除 *****\n");printf("***** 3.查看销售记录 *****\n");printf("***** 4.查看库存不足的药品 *\n");printf("***** 5.退出 *****\n");printf("****************************\n");printf("请输入您要进行的操作:\n");
}//定义一个函数供用户查看现有的所有药品
void Allsee() {printf("本店所有药品如下所示:\n");for (int i = 0; i < medicinecount; i++) {printf("%s,该药品编号为%d\n", medicine[i].name,medicine[i].id);}
}//定义一个函数warn供管理员查看哪些药品已经无库存或者将要无库存
void warn() {int flag = 0;for (int i = 0; i < medicinecount; i++) {if (medicine[i].inventory == 0 || medicine[i].inventory <= 5) { //设置5为一个警示线printf("%s已经库存不足,仅剩%d件", medicine[i].name, medicine[i].inventory);flag = 1;}}if (flag == 0) {printf("暂无药品库存快不足\n");}
}//定义一个函数list来给管理员查看销售记录
void list() {if (salecount == 0) {printf("暂无销售记录可查看");}else {for (int i = 0; i < salecount; i++) {printf("第%d份销售清单如下所示:\n", i+1);printf("%s\n", salerecord[i].time);printf("销售的药品id编号为:%d\n", salerecord[i].Medicineid);printf("该药品本次销售中共卖出%d件\n", salerecord[i].num);printf("卖出的价格为:%d\n", salerecord[i].PriceSum);}}
}