利用此系统进行药品的信息管理和储存,包括出入仓库,价格变动等功能。(初学者,语言为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,例如对某些违规数据的输入无法进行辨识导致数据出错。
总结:做完这个系统,我对编程有新的理解,在实际应用中要考虑很多种情况,与平时做的题不同,需要自己思考各种各样的情况发生该如何解决,甚至有时不知道该怎么改。所以我认为在做时知道怎么错要比知道怎么对更重要。