药店管理系统
总结
主要还是对链表操作的熟悉和总结。之间也学习了文件,还有一些输入的知识,在下面的代码中会一一解释。
功能
//功能
void first(); //登录界面
void zhuce(); //注册
void denglu(); //登录
Linklist* add_medicine(Linklist *head); //添加药品信息
Linklist* delet_medicine(Linklist *head); //删除药品信息
void change_medicine(Linklist *head); //修改药品信息
void find(Linklist *head); //查询
void findnum_medicine(Linklist *head); //查找药品信息(编号)
void findname_medicine(Linklist *head); //查找药品信息(名称)
void sort(Linklist *head); //排序
void price_medicine(Linklist *head); //按照药品价格排序(升序)
void number_medicine(Linklist *head); //按照药品剩余量排序(降序)
void sum_medicine(Linklist *head); //统计总药品剩余量
void keep_medicine(Linklist *head); //将信息保存至文件中
void findprice_medicine(Linklist *head); //查询药品价格
void insert_medicine(Linklist *head); //插入药品信息
Linklist* open_medicine(); //打开文件
void print_medicine(Linklist *head); //输出药品信息
1.登陆界面
一个简单的登陆页面,包括注册,登录和退出等操作,用switch
来选择。
void first()
{
printf(" ___________________________________________________________\n");
printf("| 欢迎使用药店管理系统 |\n");
printf("| 1-登录 |\n");
printf("| 2-注册 |\n");
printf("| 0-退出 |\n");
printf("|___________________________________________________________|\n");
printf("请选择操作: ") ;
int choice;
scanf("%d",&choice);
switch (choice)
{
case 1:
system("cls");
denglu();
system("cls");
break;
case 2:
system("cls");
zhuce();
system("cls");
first();
break;
case 0:
exit(1);
default:first();
}
2.注册
这里用到一个新知识,把输入的密码转换为*
。首先用到一个头文件#include<conio.h>
。该头文件包含getch=()
函数。其作用是从控制台读取一个字符,但不显示再屏幕上。这里注意,当我们输入错误想要删除时,backspace
也是会被当成转义字符输入进字符串的。所以我们需要手写一个判断删除的条件判断语句。
if(ch=='\b')
{
if(i!=0)
{
printf("\b \b");//注意两个退格转义字符
i--;
}
}
接着,我们将输入的字符存入一个字符串数组中即可。
void zhuce()
{
FILE *fp;
int i,j,flag=0;
char ch,bh;
struct user a;
char name[20];
char code1[20];
char code2[20];
while(1)
{
printf("欢迎使用药店管理系统!\n");
printf("用户注册\n");
printf("请输入用户名:\n");
scanf("%s",name);
if(strlen(name)>20)
{
printf("用户名位数过多,请重新输入\n");
scanf("%s",name);
}
fp= fopen("zhanghao.txt","r");
if(fp==NULL)
{
fp= fopen("zhanghao.txt","w");
fclose(fp);
fp= fopen("zhanghao.txt","r");
}
flag=0;
while(!feof(fp))
{
fscanf(fp,"%s %s\n",a.username,a.usermima);//格式化读入函数
if(strcmp(a.username,name)==0)//输入的与文件中的比较,若为0则该用户存在。后面所有的信息比较都用的该函数,用比较字符串的方法判断输入的正确性。
{
flag=1;
break;
}
}
fclose(fp);
if(flag==1)
{
printf("该用户名已存在!");
Sleep(1000);
system("cls");
first();
}
else
{
while(1)
{
printf("\n请输入密码:\n");
while((ch=getch())!='\r')//从控制台读取一个字符,但不显示在屏幕上
{
if(ch=='\b')
{
if(i!=0)
{
printf("\n");
i--;
}
}
else
{
putchar('*');//输出“*号”
code1[i++]=ch;//存入字符
}
}
code1[i]='\0';
i=0;
j=0;
printf("\n请再次输入密码: ");
while((bh=getch())!='\r')
{
if(bh=='\b')
{
if(j!=0)
{
printf("\n");
j--;
}
}
else
{
putchar('*');
code2[j++]=bh;
}
}
code2[j]='\0';
j=0;
if(strcmp(code1,code2)==0)
{
fp = fopen("zhanghao.txt","a");
fprintf(fp,"%s %s\n",name,code1);
fclose(fp);
break;
}
}
printf("\n注册成功!\n");
printf("返回请输入(1)\n");
printf("输入其他键继续注册\n");
if(getchar()=='1')
break;
Sleep(1000);
system("cls");
}
}
}
3.登录
基本思路和注册一样
void denglu()
{
FILE *fp;
int i=0;
char ch;
struct user a;
char code[20];
char name[20];
int flag=0;
fp=fopen("zhanghao.txt","r");
printf("\n用户登录\n");
fclose(fp);
do
{
fp=fopen("zhanghao.txt","r");
printf("\n请输入用户名:");
scanf("%s",name);
if(strlen(name)>20)
{
printf("用户名位数过多,请重新输入\n");
scanf("%s",name);
}
printf("\n请输入密码:");
while((ch=getch())!='\r')
{
if(ch=='\b')
{
if(i!=0)
{
printf("\b \b");
i--;
}
}
else
{
putchar('*');
code[i++]=ch;
}
}
code[i]='\0';
while(!feof(fp))
{
fscanf(fp,"%s %s\n",a.username,a.usermima);
if(strcmp(name,a.username)==0 && strcmp(code,a.usermima)==0)
{
flag=1;
break;
}
}
fclose(fp);
if(flag)
{
printf("\n登陆成功!\n");
Sleep(1000);
break;
}
else
{
printf("密码错误\n\n");
printf("请重新进行选择\n");
Sleep(1000);
system("cls");
first();
}
}while(0);
}
4.添加药品信息
用头插法添加药品
Linklist* add_medicine(Linklist *head)//添加药品信息
{
printf("请输入药品信息:\n");
printf("药品编号:");
scanf("%s",n);
Linklist *q;
q=head;
while (q->next!=NULL)
{
if(strcmp(q->next->id, n)==0)
{
printf("此药品已存在,无需再添加\n");
break;
}
q=q->next;
}
if(q->next==NULL)
{
Linklist *p;
p=(Linklist*)malloc(sizeof(Linklist));
strcpy(p->id,n);
printf("药品名:");
scanf("%s",p->name);
printf("剩余量:");
scanf("%d", &num);
p->sum=num;
printf("药品价格:");
scanf("%d", &pc);
p->price=pc;
p->next=q->next;
q->next=p;
}
return head;
}
5.删除药品信息
Linklist* delet_medicine(Linklist *head)//删除药品信息
{
Linklist *q,*p;
q=head;
printf("请输入药品信息:\n");
printf("药品编号:");
scanf("%s",&n);
while(q->next!=NULL)
{
if(strcmp(q->next->id,n)==0)
{
p=q->next;
q->next=p->next;
free(p);
printf("药品信息删除成功\n");
break;
}
q=q->next;
}
if(q->next==NULL)
{
printf("没有当前药品信息!\n");
}
return head;
}
6.修改药品信息
等同链表的修改操作。
void change_medicine(Linklist *head)//修改药品信息
{
int choice;
Linklist *p