糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > c语言课程设计-药店管理系统

c语言课程设计-药店管理系统

时间:2021-07-17 17:29:14

相关推荐

c语言课程设计-药店管理系统

这个东东第一次才开始写的时候,脑子都是懵的,把我的方法和解决办法写出来,希望可以对你有一点帮助。

逻辑方面

可以先想想,我需要这个系统实现什么功能,就药店管理系统来讲,这个我觉得增删改查是必须的,再加一个补货提醒,剩下的就是什么几家药店一起搞,这样用户知道库存和药店位置可以做出最优选择。然后搞了两个端口进行,一个用户端,一个工作人员端口,这样的话显示菜单不同,功能也可以分开实现。(这里可以写三个文本,一个存药店信息,一个存药品信息,一个存所有的用户和工作人员的ID和密码)。

代码实现

按照运行显示顺序排列代码

1.结构体建立(一共三个,药品,药店,用户信息)

typedef struct medicine //药品信息结构体{char name[10]; //药品名 int num; //药品编号 int drugstore_num; //药店编号 float price;//药品价格 int stock; //药品库存数量 int sell; //药品销量 char effect[10]; //药品功效 struct medicine *next; } medicine;

typedef struct place //药店信息结构体{int num; //药店编号char address[20]; //药店地址struct place *next;}place;

typedef struct user //用户信息结构体{char name[10]; //用户名int flag1; //标记是客户还是员工 char password[10]; //用户密码struct user *next; }user;

2.链接三个文件

三个文件分别用三个链表链起来,功能实现方面就简单很多,这里为了方便我就放一个就好了(将三个药店链起来)

文件里面一定要有内容emmmm 要是出现文件不存在可以试试把r换成w运行一遍后再换回来,换回来后记得回去吧文件里的内容补上(要是有大佬知道更好的解决办法,能否教一下,我也想知道怎么更好解决)

void place_txt() //将店铺连接起来 {FILE *fp;fp=fopen("place.txt","r+");if(NULL == fp){printf("文件不存在\n");exit(1);} place *p,*q;place_head=(place *)malloc(sizeof(place));place_head->next=NULL;p=(place *)malloc(sizeof(place));p->next=NULL;while(fscanf(fp,"%s %d",p->address,&p->num)!=EOF){if(place_head->next==NULL)place_head->next=p;elseq->next=p;q=p;p=(place *)malloc(sizeof(place));p->next=NULL;}fclose(fp); }

3.主菜单

这个主要是登录,注册和退出系统

介于本人喜欢的颜色和不想看太繁琐的就加了清屏和改了颜色 这个看个人喜欢

system("cls"); //清屏函数system("pause"); //点击一下进行下一功能system("color 0F") //改背景和字体颜色

前面数字改背景颜色 0=黑 1=蓝 2=绿 3=湖蓝 4=红 5=紫 6=黄 7=白 8=灰 9=淡蓝 后面是字体颜色A=淡绿 B=浅淡绿 C=淡红 D=淡紫 E=淡黄 F=亮白

下面是主菜单代码

void main_menu()//主菜单栏 {system("cls\n");int n; printf("\n\t\t-----欢迎来到药店管理系统-----\n\n");system("color 0B");printf("\t\t***** 1 登录*****\n");printf("\t\t***** 2 注册*****\n");printf("\t\t***** 3 退出系统*****\n");printf("\n\t\t输入您所要进行的功能序号:");do{scanf("%d",&n);switch(n){case 1:{log_on(); break;}case 2:{post(); break; }case 3:{sign_out(); break;}default:printf("输入指令不存在请重新输入:\n");}}while(n<1||n>3);}

while里面内个控制,看自己的系统功能多少进行改变即可

4.登录系统

终于到登录系统了,嘿嘿嘿,本人在此和注册系统加了一个加密和控制条件,就是现在普遍见到的输入密码出现的是*。

int log_on() //登录系统{system("cls");system("color 0E");user *p=user_head->next;int flag=1,i=0,j=0;char a[10],b[11];char c=0;printf("\n\t\t---------欢迎您使用---------\n\t\t");fflush(stdin);do{printf("您有%d次机会输入\n\t\t",3-j);printf("请输入您的用户名:\n\t\t"); scanf("%s",a);printf("\t\t请输入您的账户密码:\n\t\t");i=0;p=user_head->next;while(i<10&&c!=13) //13 回车{c=getch();if((c>47&&c<58)||(c>96&&c<123)){b[i++]=c;putchar('*');}b[10]='\0';} while(p!=NULL){if(strcmp(a,p->name)==0&&strcmp(b,p->password)==0){flag=0;break;}elsep=p->next;}if(flag){printf("\n\t\t密码或用户名错误请重试\n");j++;}else{printf("\n\t\t登陆成功,即将跳转至菜单");break;}}while(j!=3);if(j==3){printf("\n\t\t三次机会用完将跳转至注册页面");system("pause");post();} else{if(p->flag1==1111){system("pause");customer_menu();}else{system("pause");user_menu();}}}

这里给个建议,写的时候一定要写一个函数测试一下。(不要问,问了全都是泪)还有就是内个*密码内个,需要头文件,会在最后进行头文件汇总的不用担心。

5.注册系统

void post() //注册系统 {system("color 0D");int i=0,n=0;char a[10],b[11];char c=0; system("cls");printf("\n\t欢迎使用注册系统\n");while(1){printf("\n\t请输入用户名(不超过10个字符):\n\t");scanf("%s",a);if(exist(a)==0){printf("\n\t该用户已存在,请重新输入:");continue; }if(strlen(a)<=10){printf("\n\t请输入十位密码,密码可由数字和小写字母组成:\n\t");while(i<10&&c!=13) //13 回车{c=getch();if((c>47&&c<58)||(c>96&&c<123)){b[i++]=c;putchar('*');}b[10]='\0';} printf("\n\t请输入邀请码(客户邀请码为1111)"); scanf("%d",&n);}else printf("\n\t您输入的用户长度为%d,请重新输入(不超过10位):\n\n",strlen(a));if(n!=0)break;}printf("\n\n\t系统会自动将用户名和密码存入使用者的文件中!\n");FILE *fp; //将新用户的昵称和密码保存到用户信息文件中 fp = fopen("user.txt","a+");if(NULL == fp){printf("\t文件不存在\n");exit(1);}fprintf(fp," %s %d %s",a,n,b);fclose(fp);system("pause");main_menu(); }int sign_out() //退出系统 {system("cls");printf("\n\t\t感谢您使用本系统,欢迎下次使用");system("pause");return 0; }

这里就会可能万一用户名相同怎么办,当然我加了一个函数防止这个问题发生。(全都是我出现的问题)。

int exist(char name[]) //判断用户名是否存在 {user *p; p=user_head; while(p!=NULL){if(strcmp(p->name ,name)==0){return 0; }p=p->next ;}return 1; }

6.退出系统

int sign_out() //退出系统 {system("cls");printf("\n\t\t感谢您使用本系统,欢迎下次使用");system("pause");return 0; }

7.客户菜单栏

啊,终于迎来了第一个端口,但是好像除了不同方式查看药品和药店位置,我好像也想不出来别的功能了。(网上买药这个东东考虑过,有别的功能欢迎补充)

void customer_menu()//顾客菜单栏{system("color 0B");system("cls\n");int n=0;printf("\n\t\t-----------**药店欢迎您-----------\n\n");printf("\t\t*****1.按药品名查询*******\n");printf("\t\t*****2.按药店编号查询*****\n"); printf("\t\t*****3.返回上一目录*******\n");printf("\n\t\t----------------------------------\n");do{printf("\t\t");printf("请输入所要操作的指令编号(1位):"); scanf("%d",&n);switch(n){case 1:{cus_finddrugs1();break;}case 2:{cus_finddrugs2();break;}case 3:{main_menu();break;}default:printf("输入指令不存在,请重新输入:");}}while(n<1||n>3);}

顺势把里面的功能也放进来吧

void cus_finddrugs1()//客户端查找药品 (药品名查找){system("color 0F");system("cls");int flag=1;char a[10]; printf("\n\n\t\t输入所需查找药品的名称:\n\t\t");scanf("%s",a);system("cls"); medicine *p=medicine_head->next;while(p!=NULL){if(strcmp(p->name,a)==0){flag=0;printf("--------------------------------------------------------\n");printf("\t药品名称:%s\n",p->name);printf("\t药品编号:%d\n",p->num);printf("\t药品价格:%.2f\n",p->price);printf("\t药店编号:%d\n",p->drugstore_num);printf("\t药品当前药店库存:%d\n",p->stock);printf("\t药品功效:%s\n",p->effect);printf("--------------------------------------------------------\n");}p=p->next;} if(flag)printf("查无此药\n");printf("点击返回菜单");system("pause");customer_menu(); }

void cus_finddrugs2()//客户端查找药品(药店名查找){system("color 0E");int n,flag=0;char m[20];system("cls\n");printf("\n\t\t------------------------------------------\n");place *p=place_head->next;while(p!=NULL){printf("\t\t%s %d\n",p->address,p->num);p=p->next;}medicine *q;printf("\t\t输入所要查找的药店编号:");do{scanf("%d",&n);if(n<1||n>4)printf("\n\t\t此药店编号无效,请重新输入:\n");}while(n<1||n>4);system("cls");printf("\n\t\t请输入要查找的药品名称:");scanf("%s",m);q=medicine_head->next;while(q!=NULL){if(q->drugstore_num==n&&strcmp(q->name,m)==0){flag=0;printf("\n\n--------------------------------------------------------\n");printf("\t\t药品名称:%s\n",q->name);printf("\t\t药品编号:%d\n",q->num);printf("\t\t药品价格:%.2f\n",q->price);printf("\t\t药店编号:%d\n",q->drugstore_num);printf("\t\t药品当前药店库存:%d\n",q->stock);printf("\t\t药品功效:%s\n",q->effect);printf("--------------------------------------------------------\n");break;}q=q->next;} if(flag)printf("\t\t查无此药\n");printf("点击鼠标返回菜单");system("pause");customer_menu(); }

有个小错误(太傻了这个错误),当时自己心血来潮,把药店编号改成11 12 13,却忘了当时写代码时定了最多四个药店控制条件也是1——4。

8.工作人员端口

菜单

void user_menu()//经理端菜单栏 {system("color 0B");int i;system("cls");printf("\t\t*******药品管理系统********\n");printf("\t\t1.增加药品 \n");printf("\t\t2.查找药品 \n");printf("\t\t3.所有药品信息 \n");printf("\t\t4.药品销量 \n");printf("\t\t5.查看所需补货商品\n");printf("\t\t6.收银 \n");printf("\t\t7.返回上一界面\n");printf("\t\t**************************\n");printf("\t\t--------------------------\n");printf("\t\t请输入所操作程序编号:\n\t\t");do{scanf("%d",&i);printf("\t\t");system("pause");switch(i){case 1:{adddrugs();break;}case 2:{user_finddrugs();break;}case 3:{alldrugs();break;}case 4:{saledrugs();break;}case 5:{replenish();break;}case 6: {redycedrugs();break;}case 7:{main_menu();break;}default:printf("\n\t\t输入指令不会存在,请重新输入:");}} while(i<1||i>6);}

下面按照功能进行排列 一个黑框框一个函数

void adddrugs()//增加药品 {system("color 0D");system("cls");medicine *p=medicine_head->next;while(1){medicine *q;q=(medicine *)malloc(sizeof(medicine));q->next=NULL;if(p==NULL){medicine_head->next=q;}while(p!=NULL){if(p->next==NULL){p->next=q;break;}p=p->next;}printf("\t\t---------------------------------------\n");printf("\n\t\t输入所添加的药品名称:");scanf("%s",q->name);printf("\n\t\t输入所添加药品编号:");scanf("%d",&q->num);printf("\n\t\t输入药品所添加到的药店编号:");scanf("%d",&q->drugstore_num);printf("\n\t\t输入所添加药品的价格:");scanf("%f",&q->price);printf("\n\t\t输入所添加药品数量:");scanf("%d",&q->stock);printf("\n\t\t输入目前添加药品销量:");scanf("%d",&q->sell);printf("\n\t\t输入所添加药品的功效:");scanf("%s",q->effect);printf("\n\t\t药品信息输入完成,将自动保存至文件\n");printf("\t\t---------------------------------------\n");FILE *fp;fp=fopen("medicine.txt","a+");if(NULL==fp){printf("\t\t此文件不存在\n");exit(1);} fprintf(fp," %s %d %d %.2f %d %d %s",q->name,q->num,q->drugstore_num,q->price,q->stock,q->sell,q->effect);fclose(fp);break;}printf("\n\t\t点击任意位置跳转至上一界面");system("pause");user_menu();}

void user_finddrugs()//经理端查找药品 (药品名查找){system("color 0E");system("cls");int flag=1;char a[10]; printf("\n\n\t\t输入所需查找药品的名称:\n\t\t");scanf("%s",a);system("cls");medicine *p=medicine_head->next;while(p!=NULL){if(strcmp(p->name,a)==0){flag=0;printf("--------------------------------------------------------\n");printf("\t药品名称:%s\n",p->name);printf("\t药品编号:%d\n",p->num);printf("\t药品价格:%.2f\n",p->price);printf("\t药店编号:%d\n",p->drugstore_num);printf("\t药品当前药店库存:%d\n",p->stock);printf("\t药品功效:%s\n",p->effect);printf("--------------------------------------------------------\n");}p=p->next;} if(flag)printf("查无此药\n");printf("点击返回菜单");system("pause");user_menu(); }

void alldrugs()//所有药品信息{system("color 0F");system("cls");medicine *p=medicine_head->next;while(p!=NULL){printf("\n*****************************************\n");printf("药品名称:%s\n",p->name);printf("药品编号:%d\n",p->num);printf("药店编号:%d\n",p->drugstore_num);printf("药品价格:%.2f\n",p->price);printf("库存数量:%d\n",p->stock);printf("药品销量:%d\n",p->sell);printf("药品功效:%s\n",p->effect);printf("\n*****************************************\n");p=p->next;}printf("\n所有药品显示完毕");system("pause");user_menu();}

void saledrugs() //销售药品量 {system("color 0F");double a=0;system("cls");medicine *p=medicine_head->next;while(p!=NULL){if(p->sell>0){printf("\t\t------------------------------------\n");printf("\t\t药品名称:%s\n",p->name);printf("\t\t销量为:%d\n",p->sell);printf("\t\t所在店铺编号为:%d\n",p->drugstore_num);printf("\t\t销售价格合计:%.2f\n",p->sell*p->price);a+=(p->sell*p->price);printf("\t\t------------------------------------\n");}p=p->next;}printf("\t\t总计销售总价为%.2f\n",a);printf("\n\n\t\t销售如上所示\n\t\t");system("pause");user_menu();}

上述为药品销量,没有排序的,可以试着自己搞下排序的。

void replenish() //补货函数 {system("color 0A");system("cls");medicine *p=medicine_head->next;while(p!=NULL){if(p->stock<20){printf("\n\t\t-------------------------------------------------------------\n");printf("\t\t%d号药店%s库存少于20件,近期需进行补货\n",p->drugstore_num,p->name);printf("\n\t\t-------------------------------------------------------------\n");}p=p->next;}printf("需补货药品显示完毕\n");system("pause");user_menu();}

void redycedrugs()//收银 {system("color 0D");system("cls");int n,m;char a[10];medicine *p=medicine_head->next;printf("\t\t-----------------------------------------\n");printf("\n\n\t\t请输入购买的药品名称:");scanf("%s",a);printf("\n\t\t请输入购买所在药店编号:");scanf("%d",&n);printf("\n\t\t请输入购买数量:");scanf("%d",&m); while(p!=NULL){if(strcmp(p->name,a)==0&&p->drugstore_num==n){printf("\n\t\t应付价格为%.2f",p->price*m);p->sell+=m;p->stock-=m;break;}p=p->next;}printf("\n\t\t收银结束\n");printf("\t\t-----------------------------------------\n");system("pause");user_menu();}

9.主函数

int main(){user_txt();place_txt();medicine_txt();main_menu();return 0;}

10.头文件

中间说的头文件它终于来了!!!

#include<stdio.h>#include<stdlib.h>#include<io.h> #include<string.h>#include<conio.h>#include<windows.h>

最后想说一下,以前总觉得for循环很好用,但是在课设里面do while异常好用,每个循环都有优点,不同场合虽说可以相互代替,但是总有最适合的。(do while是真的适合在这里用!!!)

如果觉得《c语言课程设计-药店管理系统》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。