C语言——药店管理系统

总结

主要还是对链表操作的熟悉和总结。之间也学习了文件,还有一些输入的知识,在下面的代码中会一一解释。

功能

//功能 
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
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值