目录
一. 实验目的
本实验旨在通过编程实现一个药店销售统计系统,包括药品信息管理、销售记录管理、库存警告及用户交互界面等功能。通过此系统,药店可以方便地管理药品库存、记录销售情况,并提供实时的库存警告,帮助药店提高管理效率和服务质量。
二. 系统设计
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; //药品的id
char 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);
}
}
}