一、前言
此药店管理系统运用了循环、指针、结构体、链表、函数、文件等知识,包含了c语言绝大多数内容。
二、基本思路
药店管理系统由登录界面、管理端、用户端构成。
登录界面用户必须先进行注册,并确认注册身份。注册的账号、密码、身份信息保存在id文件中。之后进行登录。如果用户输入的信息与id文件中的信息一致,才会登录成功。
管理端有药品录入、显示、查找和修改功能,用户端有药品显示,查找,购买功能。
药品的录入、查找运用了链表的建立、增删、遍历,显示运用了单链表的冒泡排序。药品的信息储存在medicine的文件中,需要的时候读到链表中。
三、分布实现
登录界面
- 功能实现
运用printf将注册登录页面打印出来。用户选择后调到对应函数中。注册先选择注册的身份,随后输入账号密码,不一致则重新输入,一致则注册成功并返回登录界面。
登录密码错误上限三次,登录成功后进入正式页面。
(2)代码实现
注册与登录界面
int main(int argc, char *argv[]) {//登录面板 int n; printf("\n\n\n"); printf("-----------------------------------------\n"); printf("|\t 欢迎使用药店管理系统\t\t|\n"); printf("|\t\t1- 注册 \t\t|\n"); printf("|\t\t2- 登录 \t\t|\n"); printf("|\t\t0- 结束 \t\t|\n"); printf("-----------------------------------------\n");a: printf("请输入对应数字进行操作:"); scanf("%d",&n); if(n==1) { system("cls"); register_(); }else if(n==2) { system("cls"); login(); }else if(n==0) { return 0; }else { printf("输入错误,请重新输入!\n"); goto a; } return 0;}
注册函数
a: printf("请确认你要注册的身份:\n"); printf("1-管理员\t\t2-用户\n"); int identity,i; char account[20]={0},password_1[10]={0},password_2[10]={0}; scanf("%d",&identity); if(identity==1||identity==2) { printf("请输入账号:\n"); scanf("%s",account);b: printf("请输入密码(8位):\n"); for(i=0;i<8;i++) { password_1[i]=getch(); printf("*"); } printf("请再次确认密码:\n"); for(i=0;i<8;i++) { password_2[i]=getch(); printf("*"); } printf("%s\n%s",password_1,password_2); if(strcmp(password_1,password_2)==0) { printf("注册成功!\n"); }else { printf("密码输入不一致!\n"); goto b; } }else { printf("输入错误,请重新输入!\n"); goto a; }
保存到文件中
FILE *fp; fp=fopen("D:/c/Dev-Cpp/id.txt","a+"); if(fp==NULL) { printf("文件打开失败!\n"); return 0; } fprintf(fp,"%d %s %s\n",identity,&account,&password_1); fclose(fp); printf("按任意键返回!\n"); getch(); system("cls"); main();
登录函数
#include #include #include int login(){ int identity=0,j=3; char account_1[20]={0},account_2[20]={0},password_1[10]={0},password_2[10]={0};a: printf("请输入账号:\n"); scanf("%s",account_1); printf("请输入密码(8位):\n"); int judge=0,i; for(i=0;i<8;i++) { password_1[i]=getch(); printf("*"); } FILE *fp; fp=fopen("D:/c/Dev-Cpp/id.txt","a+"); if(fp==NULL) { printf("账号不存在,请注册账号!\n"); system("cls"); main(); } while(!feof(fp)) { fscanf(fp,"%d %s %s\n",&identity,&account_2,&password_2); if(identity==1&&strcmp(account_2,account_1)==0&&strcmp(password_2,password_1)==0) { judge=1; break; }else if(identity==2&&strcmp(account_2,account_1)==0&&strcmp(password_2,password_1)==0) { judge=2; break; } } fclose(fp); printf("%d",judge); if(judge==0) { if(j==0) { printf("次数用尽\n"); return 0; } system("cls"); printf("账号或密码错误!请重新输入!(你还有%d次机会)\n",j--); goto a; }else if(judge==1) { printf("登录成功!\n"); system("cls"); printf("你好,管理员\n"); master(); }else { printf("登录成功!\n"); system("cls"); printf("你好,用户!\n"); customer(); }}
(3)输出界面
首界面
注册界面
登录界面
管理端
- 药品录入
功能实现
首先以单链表的形式读入所录入药品名称与价格,然后以追加方式打开medicine文件将链表内信息存入。
代码实现
药品录入
do { scanf("%s %lf",name,&price); s=(Node*)malloc(sizeof(Node)); strcpy(s->name,name); s->price=price; r->next=s; r=s; printf("\n继续录入?(Y/N)\n"); choice=getch(); }while(choice=='Y'||choice=='y'); r->next=NULL;}
文件保存
//文件保存 FILE *fp; fp=fopen("medicine","a+"); if(fp==NULL) { printf("文件打开失败!\n"); return 0; } Node *p; int i; double l; char a[20]; for(p=link->next;p;p=p->next) { fprintf(fp,"%s %.2lf\n",p->name,p->price); } fclose(fp);
输出界面
(2)药品显示
功能实现
将medicine文件中的药品信息读到链表中进行操作。用户可以选择默认的输出顺序,也可以选择则按照价格的高低顺序来输出。
默认顺序即按照录入顺序进行输出,输出时会加上序号。
按照价格高低输出用到单链表的排序。我选择冒泡排序。首先根据药品标记的序号得出要排序的药品数目n。然后以while循环n次,在while循环中,首先初始化指针指向第一个药品信息,然后遍历链表,如果发现此结点的药品价格比下一个结点的药品价格高,则交换药品信息。随后输出修改后的链表即可。
代码实现
从文件堕入链表
//文件读取 int i=1; FILE *fp; fp=fopen("medicine","r"); if(fp==NULL) { printf("文件打开失败!\n"); return 0; } //读入到链表 Node *s,*r,*head; r=(Node*)malloc(sizeof(Node)); r->next=NULL; head=r; while(!feof(fp)) { s=(Node*)malloc(sizeof(Node)); fscanf(fp,"%s %lf",s->name,&s->price); s->order=i++; r->next=s; r=s; } r->next=NULL; fclose(fp);
排序部分
while(i-1!=0) { q=head->next; while(q->next->next) { if(q->price>q->next->price) { s=q->next; char a[20]; double m=s->price; s->price=q->price; q->price=m; strcpy(a,s->name); strcpy(s->name,q->name); strcpy(q->name,a); } q=q->next; } i--; }
输出部分
Node *p; p=head->next; while(p->next) { printf("%-3d %-20s %-10.2lf\n",p->order,p->name,p->price); p=p->next; }
输出界面
(3)药品查找
功能实现
查找界面在输入药品名称后,会在文件中寻找对应药品,如果找到则会输出并继续寻找,直到遍历结束。非法输入则显示药品不存在。
代码实现
在文件中查找药品信息
while(!feof(fp)) { fscanf(fp,"%s %lf",a,&j); if(!strcmp(a,A)) { if(t==0) { printf("为你找到以下信息:\n"); } printf("%-20s %-10.2lf\n",a,j); t=1; } } fclose(fp);
输出界面
(4)药品修改
功能实现
将文件中的信息存到链表中。用户可以选择修改或删除。用户输入要修改的药品后,遍历链表找到对应信息,然后对链表进行基本的修改和删除。随后再保存回文件中。
代码实现
修改信息
do { t=0; printf("请输入修改药品名称:\n"); scanf("%s",a); Node *p=head; while(p->next) { if(!strcmp(a,p->name)) { printf("你要修改的信息为:\n"); printf("%-20s %-10.2lf\n",a,j); printf("请重新输入药品信息:\n"); scanf("%s %.2lf",a,&j); p->order=i; strcpy(p->name,a); p->price=j; t=1; } p=p->next; } if(t==0) { printf("所修改的药品信息不存在!\n"); } printf("继续修改?(Y/N)"); choice=getch(); }while(choice=='Y'||choice=='y');
删除信息
while(p->next) { if(!strcmp(a,p->next->name)) { printf("你要删除的信息为:\n"); printf("%-20s %-10.2lf\n",p->next->name,p->next->price); printf("请确认是否删除(Y/N)"); char choice=getch(); Node *q=p->next; if(choice=='Y'||choice=='y') { p->next=q->next; free(q); }else { goto d; } t=1; break; } p=p->next; } if(t==0) { printf("输入有误\n"); }d: printf("继续修改?(Y/N)"); choice=getch(); }while(choice=='Y'||choice=='y');
输出界面
修改信息
删除信息
用户端
(1)药品购买
功能实现
用户在选择购买药品时,会显示出从低到高的所有药品信息和序号。用户选择购买的药品编码和数目后会打印出对应账单。
代码实现
选购阶段
printf("请输入想要购买的药品编号:\n"); scanf("%d",&x); printf("请输入想要购买的药品数目:\n"); scanf("%d",&number[i]); Node *p=head->next; while(p->next) { if(x==p->order) { break; } p=p->next; } strcpy(bill[i],p->name); count+=number[i]*p->price; i++; printf("是否要继续购买(Y/N)\n"); w=getch(); }while(w=='Y'||w=='y');
账单打印
printf("你的账单:\n"); printf("--------------------------------\n"); printf("药品:\n"); for(j=0;j<i;j++) { printf("%s X %d\n",bill[j],number[j]); } printf("合计:"); printf("%lf\n",count); printf("--------------------------------\n");
输出界面
四、特点
1.运用#include中的system(“cls”)清屏操作,让界面整洁。
2.非法输入会显示错误、药品不存在等。
3.密码隐式输出,且次数上限。
4.对于药品名称重复,再查找和修改时,都会显示出来。
五、完整代码
//项目一:#include #include #include /* run this program using the console pauser or add your own getch, system("pause") or input loop */int main(int argc, char *argv[]) {//登录面板 int n;printf("\n\n\n");printf("-----------------------------------------\n");printf("|\t 欢迎使用药店管理系统\t\t|\n");printf("|\t\t1- 注册 \t\t|\n");printf("|\t\t2- 登录 \t\t|\n");printf("|\t\t0- 结束 \t\t|\n");printf("-----------------------------------------\n");a:printf("请输入对应数字进行操作:");scanf("%d",&n);if(n==1){system("cls");register_();}else if(n==2){system("cls");login();}else if(n==0){return 0; }else{printf("输入错误,请重新输入!\n");goto a;}return 0;}//项目二:#include #include int register_(){a:printf("请确认你要注册的身份:\n");printf("1-管理员\t\t2-用户\n");int identity,i;char account[20]={0},password_1[10]={0},password_2[10]={0};scanf("%d",&identity);if(identity==1||identity==2){printf("请输入账号:\n");scanf("%s",account);b:printf("请输入密码(8位):\n");for(i=0;i<8;i++){password_1[i]=getch();printf("*");}printf("请再次确认密码:\n");for(i=0;i<8;i++){password_2[i]=getch();printf("*");}printf("%s\n%s",password_1,password_2);if(strcmp(password_1,password_2)==0){printf("注册成功!\n");}else{printf("密码输入不一致!\n");goto b;}}else{printf("输入错误,请重新输入!\n");goto a;}FILE *fp;fp=fopen("D:/c/Dev-Cpp/id.txt","a+");if(fp==NULL){printf("文件打开失败!\n");return 0;}fprintf(fp,"%d %s %s\n",identity,&account,&password_1);fclose(fp);printf("按任意键返回!\n");getch();system("cls");main();}//项目三:#include #include #include int login(){int identity=0,j=3;char account_1[20]={0},account_2[20]={0},password_1[10]={0},password_2[10]={0};a:printf("请输入账号:\n");scanf("%s",account_1);printf("请输入密码(8位):\n");int judge=0,i;for(i=0;i<8;i++){password_1[i]=getch();printf("*");}FILE *fp;fp=fopen("D:/c/Dev-Cpp/id.txt","a+");if(fp==NULL){printf("账号不存在,请注册账号!\n");system("cls");main();}while(!feof(fp)){fscanf(fp,"%d %s %s\n",&identity,&account_2,&password_2);if(identity==1&&strcmp(account_2,account_1)==0&&strcmp(password_2,password_1)==0){judge=1;break;}else if(identity==2&&strcmp(account_2,account_1)==0&&strcmp(password_2,password_1)==0){judge=2;break;}}fclose(fp);printf("%d",judge);if(judge==0){if(j==0){printf("次数用尽\n");return 0; }system("cls");printf("账号或密码错误!请重新输入!(你还有%d次机会)\n",j--);goto a;}else if(judge==1){printf("登录成功!\n");system("cls");printf("你好,管理员\n");master();}else{printf("登录成功!\n");system("cls");printf("你好,用户!\n");customer();}}//项目四:#include //管理端 #include int master(){printf("=========================================\n");printf("|管理端: \t\t\t\t|\n");printf("|1-显示所有药品\t\t\t\t|\n");printf("|2-录入药品信息\t\t\t\t|\n");printf("|3-查询药品信息\t\t\t\t|\n");printf("|4-修改药品信息\t\t\t\t|\n");printf("|5-返回登录页面\t\t\t\t|\n");printf("|0-退出程序 \t\t\t\t|\n");printf("=========================================\n");a:printf("请选择功能0-5:\n");int n;while(1){scanf("%d",&n);switch(n){case 1:system("cls");output_1();break;case 2:system("cls");create();break;case 3:system("cls");search_1();break;case 4:system("cls");revamp();break;case 5:system("cls");main();break;case 0:return 0;default:printf("输入错误,请重新输入!\n");goto a; }}}//项目五:#include //用户端 #include int customer(){printf("=========================================\n");printf("|用户端: \t\t\t\t|\n");printf("|1-显示所有药品\t\t\t\t|\n");printf("|2-查询药品信息\t\t\t\t|\n");printf("|3-购买药品 \t\t\t\t|\n");printf("|4-返回登录页面\t\t\t\t|\n");printf("|0-退出程序 \t\t\t\t|\n");printf("=========================================\n");a:printf("请选择功能0-4:\n");int n;scanf("%d",&n);switch(n){case 1:system("cls");output_2();break;case 2:system("cls");search_2();break;case 3:system("cls");purchase();break;case 4:system("cls");main();break;case 0:return 0;default:printf("输入错误,请重新输入!\n");goto a; }}//项目六:#include //录入药品信息 #include #include #include typedef struct node {int order;char name[20];double price;struct node *next;}Node;void list(Node *head)//单链表录入药品信息 {Node *r,*s;r=head;char choice;char name[20];int order;double price;do{scanf("%s %lf",name,&price);s=(Node*)malloc(sizeof(Node));strcpy(s->name,name);s->price=price;r->next=s;r=s;printf("\n继续录入?(Y/N)\n");choice=getch();}while(choice=='Y'||choice=='y');r->next=NULL;}int create(){printf("药名:价格:\n");Node *link;link=(Node*)malloc(sizeof(Node));link->next=NULL;list(link);//文件保存FILE *fp;fp=fopen("medicine","a+");if(fp==NULL){printf("文件打开失败!\n");return 0;}Node *p;int i;double l;char a[20];for(p=link->next;p;p=p->next){fprintf(fp,"%s %.2lf\n",p->name,p->price);}fclose(fp);printf("文件保存完毕,按任意键返回!\n");getch();system("cls");master();}//项目七:#include #include #include typedef struct node{int order;char name[20];double price;struct node *next;}Node;int output_1(){//文件读取 int i=1;FILE *fp;fp=fopen("medicine","r");if(fp==NULL){printf("文件打开失败!\n");return 0;}//读入到链表 Node *s,*r,*head;r=(Node*)malloc(sizeof(Node));r->next=NULL;head=r;while(!feof(fp)){s=(Node*)malloc(sizeof(Node));fscanf(fp,"%s %lf",s->name,&s->price);s->order=i++;r->next=s;r=s;}r->next=NULL;fclose(fp);printf("请选择输出格式:(1-默认顺序/2-价格顺序)\n");//输出链表 int z;scanf("%d",&z);if(z==1){Node *p;p=head->next;while(p->next){printf("%-3d %-20s %-10.2lf\n",p->order,p->name,p->price);p=p->next;}}else if(z==2){Node *q,*s;while(i-1!=0){q=head->next;while(q->next->next){if(q->price>q->next->price){s=q->next;char a[20];double m=s->price;s->price=q->price;q->price=m;strcpy(a,s->name);strcpy(s->name,q->name);strcpy(q->name,a);}q=q->next;}i--;}q=head->next;while(q->next){printf("%-3d %-20s %-10.2lf\n",q->order,q->name,q->price);q=q->next;}}else{printf("输入有误,请重新输入\n");}printf("按任意键返回!\n");getch();system("cls");master();}//项目八:#include #include #include typedef struct node{int order;char name[20];double price;struct node *next;}Node;int output_2(){//文件读取 int i=1;FILE *fp;fp=fopen("medicine","r");if(fp==NULL){printf("文件打开失败!\n");return 0;}//读入到链表 Node *s,*r,*head;r=(Node*)malloc(sizeof(Node));r->next=NULL;head=r;while(!feof(fp)){s=(Node*)malloc(sizeof(Node));fscanf(fp,"%s %lf",s->name,&s->price);s->order=i++;r->next=s;r=s;}r->next=NULL;fclose(fp);printf("请选择输出格式:(1-默认顺序/2-价格顺序)\n");//输出链表 int z;scanf("%d",&z);if(z==1){Node *p;p=head->next;while(p->next){printf("%-3d %-20s %-10.2lf\n",p->order,p->name,p->price);p=p->next;}}else if(z==2){Node *q,*s;while(i-1!=0){q=head->next;while(q->next->next){if(q->price>q->next->price){s=q->next;char a[20];double m=s->price;s->price=q->price;q->price=m;strcpy(a,s->name);strcpy(s->name,q->name);strcpy(q->name,a);}q=q->next;}i--;}q=head->next;while(q->next){printf("%-3d %-20s %-10.2lf\n",q->order,q->name,q->price);q=q->next;}}else{printf("输入有误,请重新输入\n");}printf("按任意键返回!\n");getch();system("cls");customer();}//项目九:#include #include #include void search_1(){char A[20]={0},choice;int I=-1,i;double J=-1,j;char a[20];int x;int t=0;FILE *fp;do{t=0;printf("请输入药品名称:\n");scanf("%s",A);fp=fopen("medicine","r");while(!feof(fp)){fscanf(fp,"%s %lf",a,&j);if(!strcmp(a,A)){printf("为你找到以下信息:\n");printf("%-20s %-10.2lf\n",a,j);t=1;break;}}fclose(fp);if(t==0){printf("输入药品不存在!\n");}printf("继续查询?(Y/N)\n");choice=getch();}while(choice=='Y'||choice=='y');printf("按任意键返回!\n");getch();system("cls");master();}//项目十:#include #include #include void search_2(){char A[20]={0},choice;int I=-1,i;double J=-1,j;char a[20];int x;int t=0;FILE *fp;do{t=0;printf("请输入药品名称:\n");scanf("%s",A);fp=fopen("medicine","r");while(!feof(fp)){fscanf(fp,"%d %s %lf",&i,a,&j);if(!strcmp(a,A)){printf("为你找到以下信息:\n");printf("%-3d %-20s %-10.2lf\n",i,a,j);t=1;break;}}fclose(fp);if(t==0){printf("输入药品不存在!\n");}printf("继续查询?(Y/N)\n");choice=getch();}while(choice=='Y'||choice=='y');printf("按任意键返回!\n");getch();system("cls");customer();}//项目十一:#include #include #include #include typedef struct node{int order;char name[20];double price;struct node *next;}Node;int revamp(){int x,t;int I=-1,i;double J=-1,j;char A[20]={0};char a[20];char choice;FILE *fp;//文件读取 fp=fopen("medicine","r");if(fp==NULL){printf("文件打开失败!");return 0;}Node *s,*r,*head;r=(Node*)malloc(sizeof(Node));r->next=NULL;head=r;while(!feof(fp)){s=(Node*)malloc(sizeof(Node));fscanf(fp,"%s %lf",s->name,&s->price);r->next=s;r=s;}r->next=NULL;fclose(fp);//操作信息b:printf("请选择操作方法(1-修改信息/2-删除信息):\n");scanf("%d",&x);if(x==1){//修改操作 a:do{t=0;printf("请输入修改药品名称:\n");scanf("%s",a);Node *p=head; while(p->next){if(!strcmp(a,p->name)){printf("你要修改的信息为:\n");printf("%-20s %-10.2lf\n",a,j);printf("请重新输入药品信息:\n");scanf("%s %.2lf",a,&j);p->order=i;strcpy(p->name,a);p->price=j;t=1;break;}p=p->next;}if(t==0){printf("所修改的药品信息不存在!\n");}printf("继续修改?(Y/N)");choice=getch();}while(choice=='Y'||choice=='y');//删除操作}else if(x==2){do{t=0;printf("请输入删除药品名称:\n");scanf("%s",a);Node *p=head; while(p->next){if(!strcmp(a,p->next->name)){printf("你要删除的信息为:\n");printf("%-20s %-10.2lf\n",p->next->name,p->next->price);printf("请确认是否删除(Y/N)");char choice=getch();Node *q=p->next;if(choice=='Y'||choice=='y'){p->next=q->next;free(q);}else{goto d;}t=1;break;}p=p->next;}if(t==0){printf("输入有误\n");}d:printf("继续修改?(Y/N)");choice=getch();}while(choice=='Y'||choice=='y');}else{printf("输入有误,请重新输入\n");goto b;}//文件保存 FILE *fq;fq=fopen("medicine","w");if(fp==NULL){printf("文件打开失败!\n");return 0;}Node *q;for(q=head->next;q->next;q=q->next){fprintf(fq,"%s %.2lf\n",q->name,q->price);}fclose(fq);printf("修改完成!\n");printf("按任意键返回!\n");getch();system("cls");master();}//项目十二:#include #include #include #include typedef struct node{int order;char name[20];double price;struct node *next;}Node;int purchase(){//从文件转到链表中FILE *fp;int z=0;fp=fopen("medicine","r");if(fp==NULL){printf("文件打开失败!\n");return 0;}Node *s,*r,*head;r=(Node*)malloc(sizeof(Node));r->next=NULL;head=r;while(!feof(fp)){s=(Node*)malloc(sizeof(Node));fscanf(fp,"%s %lf",s->name,&s->price);s->order=z++;r->next=s;r=s;}r->next=NULL;fclose(fp);//显示所有药品 Node *p,*t;while(z-1!=0){p=head->next;while(p->next->next){if(p->price>p->next->price){t=p->next;char a[20];double m=t->price;t->price=p->price;p->price=m;strcpy(a,t->name);strcpy(t->name,p->name);strcpy(p->name,a);}p=p->next;}z--;}p=head->next;while(p->next){printf("%-3d %-20s %-10.2lf\n",p->order,p->name,p->price);p=p->next;}//购买药品int x,i=0,j;double count=0;char bill[200][200],number[200];char w;printf("--------------------------------\n");do{printf("请输入想要购买的药品编号:\n");scanf("%d",&x);printf("请输入想要购买的药品数目:\n");scanf("%d",&number[i]);Node *p=head->next;while(p->next){if(x==p->order){break;}p=p->next;}strcpy(bill[i],p->name);count+=number[i]*p->price;i++;printf("是否要继续购买(Y/N)\n");w=getch();}while(w=='Y'||w=='y');printf("你的账单:\n");printf("--------------------------------\n");printf("药品:\n");for(j=0;j<i;j++){printf("%s X %d\n",bill[j],number[j]);}printf("合计:");printf("%lf\n",count);printf("--------------------------------\n");printf("按任意键返回!\n");getch();system("cls");customer();}