药品管理系统

   利用此系统进行药品的信息管理和储存,包括出入仓库,价格变动等功能。(初学者,语言为c语言)

包含文件

main.c 主函数部分.

jbxx.h函数和链表的声明

jbxx.c所写的函数部分

denglu.txt数据的储存文件(以文本形式进行储存)

所用知识为链表的增删查改,文件的读写等。

1、main.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "jbxx.h"

int main() 
{
		List list;
    list.head->next=NULL;//使头节点不储存数据,方便之后进行链表操作。
	int a=3;

	char yhm[30]={"admin"};//在系统内定义一组密码和用户名
	char mima[20]={"123456"};
    char arr[30];
    char arr1[20];
    load(&list);
	do{
	printf("\t\t\t\t\t\t****************\n");
	printf("\t\t\t\t\t\t**药品管理系统**\t\t\t\t\t\t\n");
	printf("\t\t\t\t\t\t****************\n");
	printf("\n\n");
    printf("\t\t\t\t\t\t1、登录\n");
	printf("\t\t\t\t\t\t0、退出系统\n");
	printf("\t\t\t\t\t\t");
	fflush(stdin);
	scanf("%d",&a);
		if(a==1)
		{   
			printf("\t\t\t\t\t\t请输入用户名\n");
			printf("\t\t\t\t\t\t");
			scanf("%s",arr);
			
			if(strcmp(yhm,arr)!=0)
			{
				system("cls");
				printf("\t\t\t\t\t\t用户名错误\n");
				
				continue;
			}
			
				printf("\t\t\t\t\t\t请输入密码\n");
				printf("\t\t\t\t\t\t");
			scanf("%s",arr1);
             if(strcmp(mima,arr1)!=0)
			{
					system("cls");//清屏,让系统画面更便于观看
					printf("\t\t\t\t\t\t密码错误\n");
				
				continue;
			}	
			else{
				
			printf("登录成功\n");
			system("cls");
			menu(&list);
			a=0;
		}
		}
	

		
		if(a!=1&&a!=0)
		{
			printf("无效操作\n");
			scanf("%d",&a);
		}
		system("cls");
	}while(a!=0);

	save(&list);
	printf("退出成功");
	
	
	
	return 0;
}

2、jbxx.h

typedef struct node{
	int value;
	char name[30];
	char gonghuoshang[30];
	int sum;
	struct node *next;
} Node;
typedef struct list{
   Node* head;
} List;
void print(List* plist);//打印链表中储存的数据
void chazhao(List* plist,char* arr);//查找药品
void xuigai(List *plist);//修改药品名称或供货商
void add(List* plist,int c);//添加节点
void menu(List* list);//菜单界面
void delete1(List* plist);//删除链表节点
void load(List* plist);//加载文件中的数据到链表中
void save(List* plist);//保存链表的数据到文件
void jiage(List* plist);//修改药品价格
void shuliang(List* plist);//药品的出入库
void paixu(List* plist);//对链表进行排序

3、jbxx.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "jbxx.h"
void menu(List* list)
{
	int prime=0;
	int a=0;
	do{
	switch(a)
	{
	
	case 0:
		printf("\t\t\t\t\t===========================================\n");
	printf("\t\t\t\t\t|                                         |\n");
	printf("\t\t\t\t\t|          欢迎来到医院药品管理系统       |\n");
	printf("\t\t\t\t\t|                                         |\n");
	printf("\t\t\t\t\t|=========================================|\n");
	printf("\t\t\t\t\t|            请选择要操作的命令           |\n");
	printf("\t\t\t\t\t|-----------------------------------------|\n");
	printf("\t\t\t\t\t|                                         |\n");
	printf("\t\t\t\t\t|            1.药品的出库和入库           |\n");
	printf("\t\t\t\t\t|            2.显示药品信息               |\n");
	printf("\t\t\t\t\t|            3.增加药品信息               |\n");
	printf("\t\t\t\t\t|            4.药品价格变动               |\n");
	printf("\t\t\t\t\t|            5.删除药品信息               |\n");
	printf("\t\t\t\t\t|            6.查找药品信息               |\n");
	printf("\t\t\t\t\t|            7.修改药品信息               |\n");
	printf("\t\t\t\t\t|           -1.退出系统并保存信息         |\n");
	printf("\t\t\t\t\t|                                         |\n");
	printf("\t\t\t\t\t|=========================================|\n");
	printf("\t\t\t\t\t|请输入命令:");
	break;
	case 1:
	shuliang(list);
	prime=1;
	break;
	case 2:
	paixu(list);	
	prime=1;
	break;
	case 3:
		printf("\t\t\t\t\t请输入要录入的药品种类数量\n");
		printf("\t\t\t\t\t");
		int b;
		scanf("%d",&b);
	add(list,b);
	printf("录入成功\n");
	prime=1;
	break;
	case 4:
	jiage(list);
	prime=1;
	break;
	case 5:
	delete1(list);
	prime=1;
	break;
	case 6:
	printf("输入要查找的药品名称\n");
	char arr2[30];
	scanf("%s",arr2);
	chazhao(list,arr2);
	prime=1;
	break;
	case 7:
	xuigai(list);
	prime=1;
	break;
	default:
	printf("无效操作\n");
	prime=1;
	break;
}
if(prime==0){
	fflush(stdin);//清除缓冲区,防止输入字符产生死循环。
scanf("%d",&a);
system("cls");
}
else{
	a=0;
	prime=0;	
}
}while(a!=-1);
}
void add(List* plist,int c)
{
int n;
int m;
char arr[30];
char arr1[30];
Node *q=plist->head;
printf("\t\t\t\t\t请依次输入名称,供货商,价格\n");

for(int i=0;i<c;i++){
Node *p=(Node*)malloc(sizeof(Node));
printf("\t\t\t\t\t");
fflush(stdin);
scanf("%s%s",arr,arr1);

scanf("%d",&n);
	 p->value=n;
	 strcpy(p->gonghuoshang,arr1);
	 strcpy(p->name,arr);
	 p->sum=0;
	 p->next=NULL;
	 Node *last=plist->head->next;
	 if(last)
	 {
	 while(last->next)
	 {
	 	last=last->next;
	 }
	 last->next=p;
	 }else
	 {
	 	plist->head->next=p;
	 }
	
}
	 printf("录入成功\n");
system("cls");

}
//注意头节点
void print(List* plist)
{
Node *p;
printf("\t\t\t\t=======================药品信息表=========================\n");
printf("\t\t\t\t|名称|============|供货商|======|价格/元|======|库存量/箱|\n");
printf("\t\t\t\t|                                                        |\n");
	for(p=plist->head->next;p;p=p->next)
	{
		printf("\t\t\t\t|%-15s   %-10s",p->name,p->gonghuoshang);
		printf("    %-10d    %-5d     |\n",p->value,p->sum);
printf("\t\t\t\t|--------------------------------------------------------|\n");
	}
	printf("输入任意按键返回菜单\n");
	char w;
	scanf("%c",&w);
	system("cls");
 } 
void chazhao(List* plist,char* arr)
{
	Node *p;
printf("\t\t\t\t=======================药品信息表=========================\n");
printf("\t\t\t\t|名称|============|供货商|======|价格/元|======|库存量/箱|\n");
printf("\t\t\t\t|                                                        |\n");
	for(Node *p=plist->head->next;p;p=p->next)
	{
		if(strcmp(arr,p->name)==0)
		{
		printf("\t\t\t\t|%-15s   %-10s",p->name,p->gonghuoshang);
		printf("    %-10d    %-5d     |\n",p->value,p->sum);
printf("\t\t\t\t|--------------------------------------------------------|\n");
		}	
		
	}
	printf("输入任意按键返回菜单\n");
	char w;
	scanf("%c",&w);
	system("cls");
	menu(plist);
}
void xuigai(List *plist)
{
char arr[30];
char arr1[30];
printf("请输入要进行修改的药品名称\n");
	scanf("%s",arr);
	printf("请输入供货商\n");
	scanf("%s",arr1);
	Node *p=plist->head;
	
	for(p=plist->head->next;p;p=p->next)
	{
		if(strcmp(arr,p->name)==0&&strcmp(arr1,p->gonghuoshang)==0)
		{
			printf("请输入要修改的项目\n");
			printf("1、名称\n");
			printf("2、供货商\n");
			int xuanze;
			scanf("%d",&xuanze);
			switch(xuanze)
			{
				case 1:
				{
				char arr2[30];
				printf("请输入修改后的名称\n");
				scanf("%s",arr2);
				strcpy(p->name,arr2);
				break;
			}
					case 2:
					{
				char arr3[30];
				printf("请输入修改后的供货商\n");
				scanf("%s",arr3);
				strcpy(p->name,arr3);
				break;
			}
				
				default:
				{
				printf("无效操作\n");
				break;
		}
			}
			break;
		}

	}

	if(p==NULL)
{
	printf("未找到该药品\n");
	printf("输入任意按键返回菜单\n");
	int w;
	scanf("%d",&w);
	system("cls");
}
else {

printf("输入任意按键返回菜单\n");
	int w;
	scanf("%d",&w);
	system("cls");
}
}
void save(List* plist)
{
	Node* p;
	
	FILE* pfwrite;
	pfwrite=fopen("denglu.txt","w");
	if(pfwrite==NULL)
	{
		printf("ERROR");
		return;
	}
	for(p=plist->head->next;p;p=p->next)
	{
	fprintf(pfwrite,"%s %s %d %d",p->name,p->gonghuoshang,p->value,p->sum);
	}
	fclose(pfwrite);
}
void load(List* plist)
{
	Node* p;
	p=plist->head;
	FILE* pfread;
	pfread=fopen("denglu.txt","r");
		if(pfread==NULL)
	{
		printf("ERROR");
		return;
	}
	int w;
	char v[30];
	char ghs[30];
	int s;
	while(fscanf(pfread,"%s %s %d %d",v,ghs,&w,&s)!=EOF)
	{
Node *q=(Node*)malloc(sizeof(Node));	
strcpy(q->gonghuoshang,ghs);
strcpy(q->name,v);
q->sum=s;
q->value=w;
p->next=q;
p=p->next;
}
	fclose(pfread);
}
void delete1(List* plist)
{
	Node *q;
	Node *p;
	printf("请输入要删除的药品名称\n");
	char arr1[30];
	scanf("%s",arr1);
	printf("请输入供货商\n");
	char arr2[30];
	scanf("%s",arr2);
	for(q=NULL,p=plist->head->next;p;q=p,p=p->next)//删除链表
	{

	if(strcmp(p->gonghuoshang,arr2)==0&&strcmp(p->name,arr1)==0)
	{
		q->next=p->next;
		free(p);
		system("cls");
		break;
		}
	}
	if(p==NULL)
{
	printf("未找到该药品\n");
	printf("输入任意按键返回菜单\n");
	int w;
	scanf("%d",&w);
	system("cls");
	
}
	else
	{
			system("cls");
		printf("删除成功\n");
	}
}
void jiage(List* plist)
{
	Node* p=plist->head;
	printf("请输入药品名称\n");
	char arr1[30];
	scanf("%s",arr1);
	printf("请输入供货商\n");
	char arr2[30];
	scanf("%s",arr2);
	for(p=plist->head->next;p;p=p->next)
	{
		if(strcmp(arr1,p->name)==0&&strcmp(arr2,p->gonghuoshang)==0)
		{
			break;
	}
}
if(p==NULL)
{
	printf("未找到该药品\n");
	printf("输入任意按键返回菜单\n");
	int w;
	scanf("%d",&w);
	system("cls");

}
else
{
printf("请输入修改后的价格\n");
int t;
scanf("%d",&t);
p->value=t;
	system("cls");
	printf("修改成功\n");
}
}
void shuliang(List* plist)
{
	Node* p=plist->head;
	printf("请输入药品名称\n");
	char arr1[30];
	scanf("%s",arr1);
	printf("请输入供货商\n");
	char arr2[30];
	scanf("%s",arr2);
		for(p=plist->head->next;p;p=p->next)
	{
		if(strcmp(arr1,p->name)==0&&strcmp(arr2,p->gonghuoshang)==0)
		{
			break;
	}
}
if(p==NULL)
{
	printf("未找到该药品\n");
	printf("输入任意按键返回菜单\n");
	int w;
	scanf("%d",&w);
	system("cls");
	return;
}
else
{
printf("出库请输入1,入库请输入0\n");
int t;
scanf("%d",&t);
if(t==1)
{
	printf("请输入出库数量\n");
	int a;
	scanf("%d",&a);
	if(a<0)
	{
		printf("Error\n");
		printf("输入任意按键返回菜单\n");
	int w;
	scanf("%d",&w);
	system("cls");
			return;
	}
	if(a>p->sum)
	{
		printf("库存不足\n");	
		printf("输入任意按键返回菜单\n");
	int w;
	scanf("%d",&w);
	system("cls");
		return;
	}
	else
	{
	p->sum=p->sum-a;	
	}
	}	
else if(t==0)
{
	printf("请输入入库数量\n");
	int g;
	scanf("%d",&g);
	if(g<0)
	{
		printf("Error\n");
		printf("输入任意按键返回菜单\n");
	int w;
	scanf("%d",&w);
	system("cls");
		return;
	}
	else
	{
		p->sum=p->sum+g;
	printf("输入任意按键返回菜单\n");
	int w;
	scanf("%d",&w);
	system("cls");
	}
	
}
}
}
void paixu(List* plist)
{
  Node *tail,*p,*q;
    tail = NULL;
    Node* head;
head=plist->head;
	int n;
		fflush(stdin);
	printf("\t\t\t\t\t\t1、按照价格排序\n");
	printf("\t\t\t\t\t\t2、按照存货量排序\n");
	printf("\t\t\t\t\t");

	scanf("%d",&n);
	switch(n)
	{
		case 1:
		{
			int a;
	printf("\t\t\t\t\t\t1、从大到小排序\n");
	printf("\t\t\t\t\t\t2、从小到大排序\n");
	printf("\t\t\t\t\t");
	fflush(stdin);
			scanf("%d",&a);
	switch(a)
	{
		case 1:
		{
    while((head->next->next) != tail) 
    {
        p = head;
        q = head->next;
        while((q->next) != tail)
        {
            if((q->value) < (q->next->value))   //不停判断两个相邻的数并且交换顺序
            {
                p->next = q->next;
                q->next = q->next->next;
                p->next->next = q;
                q = p->next;    //始终保存p,q是相邻的位置
            }
            q = q->next;
            p = p->next;
        }
        /*最重要的一步,将tail不停向前移动*/
        tail = q;   
    }
    system("cls");
    print(plist);
    break;
}
		
		case 2:
			{
		   while((head->next->next) != tail) 
    {
        p = head;
        q = head->next;
        while((q->next) != tail)
        {
            if((q->value) > (q->next->value))   //不停判断两个相邻的数并且交换顺序
            {
                p->next = q->next;
                q->next = q->next->next;
                p->next->next = q;
                q = p->next;    //始终保存p,q是相邻的位置
            }
            q = q->next;
            p = p->next;
        }
        /*最重要的一步,将tail不停向前移动*/
        tail = q;   
    }
    system("cls");
			print(plist);
			break;
		}
		default:{	
			system("cls");
	printf("error\n");

		break;
	}
break;		
	}	
break;

	}
		
		case 2:
		{
	printf("\t\t\t\t\t\t1、从多到少排序\n");
	printf("\t\t\t\t\t\t2、从少到多排序\n");
		printf("\t\t\t\t\t");	
			int b;
			fflush(stdin);
			scanf("%d",&b);
	switch(b)
	{
		case 1:
				{
		   while((head->next->next) != tail) 
    {
        p = head;
        q = head->next;
        while((q->next) != tail)
        {
            if((q->sum) < (q->next->sum))   //不停判断两个相邻的数并且交换顺序
            {
                p->next = q->next;
                q->next = q->next->next;
                p->next->next = q;
                q = p->next;    //始终保存p,q是相邻的位置
            }
            q = q->next;
            p = p->next;
        }
        tail = q;   
    }
    system("cls");
			print(plist);
			break;
		}

		case 2:
				{
	   while((head->next->next) != tail) 
    {
        p = head;
        q = head->next;
        while((q->next) != tail)
        {
            if((q->sum) > (q->next->sum))   //不停判断两个相邻的数并且交换顺序
            {
                p->next = q->next;
                q->next = q->next->next;
                p->next->next = q;
                q = p->next;    //始终保存p,q是相邻的位置
            }
            q = q->next;
            p = p->next;
        }
        /*最重要的一步,将tail不停向前移动*/
        tail = q;   
    }
    system("cls");
			print(plist);
			break;
		}
			default:
			{	
			    system("cls");
	printf("error\n");
		break;
	}
}
break;
}
	default:
	{	
	    system("cls");
	printf("error\n");

		break;
	}
}

}

注:1、其中保存数据必须正常退出系统,否则会无法保存甚至可能会使原本文件的数据出错。

2、其中一些代码还存在一些bug,例如对某些违规数据的输入无法进行辨识导致数据出错。

 

总结:做完这个系统,我对编程有新的理解,在实际应用中要考虑很多种情况,与平时做的题不同,需要自己思考各种各样的情况发生该如何解决,甚至有时不知道该怎么改。所以我认为在做时知道怎么错要比知道怎么对更重要。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值