药店管理系统(c语言链表实现)


-这是我的课设要求的功能内容。。

main()函数

int main() {

   char str[5];
   int n = 0;
   int	m = 1;

   printf("\t*******************************************\n");
   printf("\t*          欢迎来到登录注册界面           *\n");
   printf("\t*        如果没有账号,请务必先注册        *\n");
   printf("\t*******************************************\n");
   printf("\n\n\t1. 登录\n");
   printf("\t2. 注册\n");
   printf("\t请输入:");
   gets_s(str, 5);
   if (str[0] == '1') {
   	m = denglu(n);
   }
   else {
   	n = zhuce();
   }

   if (m == 1) {
   	printf("\n");
   	printf("\t******************************\n");
   	printf("\t*          这是一个          *\n");
   	printf("\t*        药店管理系统        *\n");
   	printf("\t*    可以对药店药品进行管理  *\n");
   	printf("\t*      欢迎使用管理程序      *\n");
   	printf("\t******************************\n");
   	printf("\n");
   	W_menu();
   }
   
}

0. 菜单

void W_menu() {
   int a1 = 0;
   int W_Tag = 0;
   int W_numDrugs = 0;
   W *head;
   head = (W*)malloc(sizeof(W));
   if (head != NULL)
   {
   	head->link = NULL;
   }
   for ( ; ; ) {
   	switch (W_menu_select()){
   		case 1:
   			 W_addRecord( head );
   			 
   			break;
   		case 2:
   			W_modifyRecord( head );
   			break;
   		case 3:
   			W_display(head );
   			break;
   		case 4:
   			W_queryInfo(head);
   			break;
   		case 5:
   			head = W_removeRecord(head);
   			break;
   		case 6:
   			head = W_insertRecord(head);
   			break;
   		case 7:
   			W_Data_statistics(head);			
   			break;
   		case 8:
   			head = W_loadRecords();
   			break;
   		case 9:
   			W_sortInfo(head);				
   			break;
   		case 10:
   			W_saveRecords(head);
   			break;
   		case 11:
   			W_quit( head );
   	}
   }
}
int W_menu_select() {
   char W_str[3];
   int W_se = 0;
   printf("\n");
   printf("\t1. 增加药品信息\n");
   printf("\t2. 修改药品信息\n");
   printf("\t3. 显示药品信息\n");
   printf("\t4. 查询药品信息\n");
   printf("\t5. 删除药品信息\n");
   printf("\t6. 插入药品信息\n");
   printf("\t7. 统计药品信息\n");
   printf("\t8. 从记录文件读取药品信息\n");
   printf("\t9. 对药品信息进行排序\n");
   printf("\t10. 保存药品信息至记录文件\n");
   printf("\t11. 结束运行\n");
   printf("\n\t 左边数字对应功能选择,请选1-11: ");

   for ( ; ; )
   {
   	gets_s(W_str,3);

   	W_se = atoi(W_str);//将字符串转化成整数 
   	/*if (W_se == 0 && (strcmp(W_str, "0") == 0)) W_se = 12;*/
   	if (W_se < 0 || W_se>11) printf("\n\t输入错误,重选1-10:"); 
   	else break;

   }
   return W_se;
}

1. 数据录入:录入系统基本数据,用链表组织

 	//实现增加药品信息功能,建立链表
   void W_addRecord(W* head) {

		char str[3];
		W* p, * q;
		p = head;
		while (1)
		{
			printf("您将要添加一组信息,确定吗?(Y/N)");
			gets_s(str, 3);
			if (str[0] == 'n' || str[0] == 'N')
				break;
	
			q = (W*)malloc(sizeof(W));
			printf("请输入药品编号:");
			scanf_s("%d", &q->W_number, 5);
			eatline();
			printf("请输入药品名称:");
			scanf_s("%s", q->W_name, 50);
			eatline();
			printf("请输入药品进价:");
			scanf_s("%f", &q->W_money, 5);
			eatline();
			printf("请输入药品售价:");
			scanf_s("%f", &q->W_money1, 5);
			eatline();
			printf("请输入药品规格:");
			scanf_s("%s", q->W_size, 50);
			eatline();
			printf("请输入生产厂家:");
			scanf_s("%s", q->W_manufacturer, 50);
			eatline();
			p->link = q;
			q->link = NULL;
			p = q;
	}
	printf("\n现在一共有%d条信息...\n", length(head));
}

2. 数据存储:用文件形式将录入信息进行存储

//实现从链表保存记录到文件功能
void W_saveRecords(W* head) {
	FILE* fp;
	int Tag;
	char fname[30];
	W* p = NULL;
	p = head->link;

	if (length(head) == 0)
	{
		printf("没有记录可存!");
		return;
	}

	printf("请输入要存入的文件名(直接回车选择文件drug_info.txt):");
	gets_s(fname, 30);
	if (strlen(fname) == 0)//自动生成文件名
		strcpy(fname, "D://drug_info.txt");
	if ((fp = fopen(fname, "w+")) == NULL)
	{
		printf("不能存入文件!");
		return;
	}
	printf("\n存文件...\n");
	while (p) {//从链表读取数据到文件
		fprintf(fp, "%d\t%s\t%f\t%f\t%s\t%s\n", p->W_number, p->W_name, p->W_money, p->W_money1, p->W_size, p->W_manufacturer);
		p = p->link;

	}
	fclose(fp);
	printf("%d条记录已存入文件,请继续操作.\n", length(head));
}

3. 数据读取:用文件中的数据可以进行读写操作

//实现从文件读取信息到链表功能,并返回新建立的链表的头节点
W* W_loadRecords() {

   FILE* fp;
   char fname[30];
   W* p1, * q1, * head1;
   W w;
   head1 = (W*)malloc(sizeof(W));
   p1 = head1;


   printf("请输入要读取的文件名(直接回车选择文件drug_info.txt):");
   gets_s(fname, 30);
   if (strlen(fname) == 0)
   	strcpy(fname, "D://drug_info.txt");

   if ((fp = fopen(fname, "rb")) == NULL)
   {
   	printf("打不开文件!请重新选择\n");
   	return NULL;
   }

   printf("\n读取文件...\n");


   int W_number1;//人为编号
   char W_name1[50];//药品名称
   float W_money2;//药品进价
   float W_money3;//药品售价
   char W_size1[50];//规格
   char W_manufacturer1[50];//生产厂家
   while (fscanf(fp, "%d\t%s\t%f\t%f\t%s\t%s", &W_number1, W_name1, &W_money2, &W_money3, W_size1, W_manufacturer1) != EOF) {


   	q1 = (W*)malloc(sizeof(W));
   	q1->W_number = W_number1;
   	strcpy(q1->W_name, W_name1);
   	q1->W_money = W_money2;
   	q1->W_money1 = W_money3;
   	strcpy(q1->W_size, W_size1);
   	strcpy(q1->W_manufacturer, W_manufacturer1);
   	p1->link = q1;
   	q1->link = NULL;
   	p1 = q1;
   }
   printf("读取出%d条记录\n", length(head1));
   fclose(fp);
   return head1;
}

4. 数据修改:对以存在的旧数据进行修改操作

//实现修改指定编号的药品信息功能
void W_modifyRecord(W* head2) {
   FILE* fp;
   char fname[30];
   char str[3];
   int n;int i = 0;
   W* p2;

   printf("您将要修改一组信息,确定吗?(Y/N)");
   gets_s(str, 3);
   if (str[0] == 'n' || str[0] == 'N')
   	return;
   else
   	printf("请输入要修改药品的编号:");

   scanf_s("%d", &n, 5);
   eatline();
   for (p2 = head2;i < n && p2->link != NULL;i++) {
   	p2 = p2->link;
   }
   printf("修改药品编号为:");
   scanf_s("%d", &p2->W_number, 5);
   eatline();
   printf("修改药品名称为:");
   scanf_s("%s", p2->W_name, 50);
   eatline();
   printf("修改药品进价为:");
   scanf_s("%f", &p2->W_money, 5);
   eatline();
   printf("修改药品售价为:");
   scanf_s("%f", &p2->W_money1, 5);
   eatline();
   printf("修改药品规格为:");
   scanf_s("%s", p2->W_size, 50);
   eatline();
   printf("修改生产厂家为:");
   scanf_s("%s", p2->W_manufacturer, 50);
   eatline();

   int t = 0;
   printf("是否需要保存?\n");
   printf("输入1为是,0为否\n");
   printf("请输入:");
   scanf("%d", &t);
   eatline();
   if (t == 1) {
   	W_saveRecords(head2);		
   }
}

5. 数据插入:可以将新数据插入任意指定位置

//实现将一组药品信息插入链表功能
W* W_insertRecord(W* head5) {
   W* p5, * q5;
   int n = 0;

   q5 = (W*)malloc(sizeof(W));
   printf("请输入药品编号:");
   scanf_s("%d", &q5->W_number, 5);
   eatline();
   printf("请输入药品名称:");
   scanf_s("%s", q5->W_name, 50);
   eatline();
   printf("请输入药品进价:");
   scanf_s("%f", &q5->W_money, 5);
   eatline();
   printf("请输入药品售价:");
   scanf_s("%f", &q5->W_money1, 5);
   eatline();
   printf("请输入药品规格:");
   scanf_s("%s", q5->W_size, 50);
   eatline();
   printf("请输入生产厂家:");
   scanf_s("%s", q5->W_manufacturer, 50);
   eatline();

   for (p5 = head5; n < q5->W_number - 1 && p5->link != NULL; ++n)
   	p5 = p5->link;
   //printf("找到了第%d个\n", p5->W_number);
   q5->link = p5->link;
   p5->link = q5;
   serialNumber(head5);
   printf("\n数据插入成功...\n");
   return head5;
}

6. 数据删除:可以对以存在的旧数据进行删除操作

W* W_removeRecord(W* head6) {
	W* p6, * q6;
	int n = 0;
	int i = 0;
	printf("请输入要删除的药品信息的编号:");
	scanf("%d", &i);
	for (p6 = head6; n < i - 1 && p6->link != NULL; ++n)
		p6 = p6->link;
	if (i > 0 && p6->link != NULL) {
		q6 = p6->link;
		p6->link = q6->link;
		free(q6);
	}
	serialNumber(head6);
	printf("\n数据删除成功...\n");
	eatline();
	return head6;
}

7. 数据查询:按要求进行数据查询

//实现通过查询函数返回药品编号来输出药品信息功能
void W_findRecord(int n, W* head4) {
	W* p4;
	int i = 0;

	for (p4 = head4;i < n && p4->link != NULL;i++) {
		p4 = p4->link;
	}
	printf("\t-------------------------------------------------------------------------------------------------------- \n");
	printf("\t编号\t药品名称\t药品进价/元\t药品售价/元\t药品规格\t生产厂家\n");
	printf("\t-------------------------------------------------------------------------------------------------------- \n");
	printf("\t%d\t%s\t%f\t%f\t%s\t%s\n", p4->W_number, p4->W_name, p4->W_money, p4->W_money1, p4->W_size, p4->W_manufacturer);
	printf("\t-------------------------------------------------------------------------------------------------------- \n");
}

//实现查询功能,并返回编号给寻找函数
void W_queryInfo(W* head3) {

	char str[5];
	char target[20];
	char target1[20];
	
	int i = 0;
	int n = 0;
	int n1 = 0;

	while (1)
	{
		printf("请输入查询的方式:(直接输入回车则结束查询)\n");
		printf("1. 按药品编号\n");
		printf("2. 按药品名称\n");
		printf("3. 按药品进价和售价\n");
		printf("请输入:");
		gets_s(str, 5);
		if (strlen(str) == 0)
			break;
		if (str[0] == '1')
		{
			printf("请输入欲查询的药品的编号:");
			gets_s(target, 20);
			n = atoi(target);//将字符串转化成整数 
		}
		else if (str[0] == '2')
		{
			W* q3 = head3;
			printf("请输入欲查询的药品的名称:");
			gets_s(target, 20);
			while (strcmp(q3->W_name, target) != 0) {
				q3 = q3->link;
			}
			n = q3->W_number;
		}
		else
		{
			printf("请输入欲查询的药品的进价和售价:");
			scanf("%s %s", target, target1);
			W* q3 = head3;
			n = atoi(target);//将字符串转化成整数 
			while (q3->W_money != n) {
				q3 = q3->link;
			}
			n = q3->W_number;
		}
		W_findRecord(n, head3);
	}
}

8. 数据统计:按要求对数据进行统计

//实现简单的数据统计功能
void W_Data_statistics(W* h) {
	char str[5];
	char target[40];
	int n = 0, i = 0;
	W* x1;

	while (1)
	{
		printf("请输入统计的方式:(直接输入回车则结束)\n");
		printf("1. 统计药品利润\n");
		printf("2. 统计由同一厂家生产的药品\n");
		printf("请输入:");
		gets_s(str, 5);
		if (strlen(str) == 0)
			break;
		if (str[0] == '1')
		{
			printf("请输入欲统计的药品的编号:");
			gets_s(target, 20);
			n = atoi(target);//将字符串转化成整数 
			for (x1 = h;i < n && x1->link != NULL;i++) {
				x1 = x1->link;
			}
			printf("药品:%s\t利润:%f\n", x1->W_name, x1->W_money1 - x1->W_money);

		}
		else
		{
			x1 = h;
			printf("请输入欲统计的生产厂家:");
			gets_s(target, 40);
			printf("该生产厂家的药品有:");
			while (x1) {
				if (strcmp(x1->W_manufacturer, target) == 0)
					printf("  %s\t", x1->W_name);
				x1 = x1->link;
			}
			printf("\n");
		}
	}
}

9. 数据报表:按要求对数据打印报表


//实现显示所有药品信息功能
void W_display(W* head) {

   int W_i;

   if (length(head) == 0)
   {
   	printf("没有可供显示的记录");
   	return;
   }
   printf("\t-------------------------------------------------------------------------------------------------------- \n");
   printf("\t编号\t药品名称\t药品进价/元\t药品售价/元\t药品规格\t生产厂家\n");

   W* p;
   p = head->link;
   printf("\t-------------------------------------------------------------------------------------------------------- \n");
   while (p != NULL)
   {
   	printf("\t%d\t%s\t%f\t%f\t%s\t%s\n", p->W_number, p->W_name, p->W_money, p->W_money1, p->W_size, p->W_manufacturer);
   	printf("\t-------------------------------------------------------------------------------------------------------- \n");
   	p = p->link;
   }
   for (W_i = 0;W_i < length(head); W_i++) {


   	if (W_i % 19 == 0 && W_i != 0)//打印一定数目信息,避免一下打印太多信息
   	{
   		printf("输入任意字符后继续...\n");
   		getchar();
   		printf("\n\n");
   		printf("\t编号\t药品名称\t药品进价/元\t药品售价/元\t药品规格\t生产厂家\n");
   	}

   }
}

10. 数据排序:按要求对数据排序

//实现排序功能,按照价格(进价)的升降序排序
void W_sortInfo(W* h2) {

	char str[5];
	W* pa, * pb, temp;
	pa = h2->link;
	if (h2->link== NULL) {//链表为空
		printf("没有数据.\n");
		return;
	}
	if (h2->link->link == NULL) {//链表有1个节点
		printf("不需要排序.\n");
		return;
	}
	while (1)
	{
		printf("请输入排序的方式:(直接输入回车则结束)\n");
		printf("1. 按照进价升序排序\n");
		printf("2. 按照进价降序排序\n");
		printf("请输入:");
		gets_s(str, 5);
		if (strlen(str) == 0)
			break;
		if (str[0] == '1') {
			//选择排序 == 按着座位找人
			while (pa->link != NULL) {//以pf指向的节点为基准节点
				pb = pa->link;//pb从基准点的下一个节点开始
				while (pb != NULL) {
					if (pa->W_money > pb->W_money) {//升序排序
						temp = *pa;//交换节点的地址
						*pa = *pb;
						*pb = temp;
						temp.link = pa->link;//交换被交换节点的指向地址
						pa->link = pb->link;
						pb->link = temp.link;
					}
					pb = pb->link;
				}
				pa = pa->link;
			}
			serialNumber(h2);
			printf("\n升序排序完毕...\n\n");
		}
		else {
			while (pa->link != NULL) {
				pb = pa->link;
				while (pb != NULL) {

					if (pa->W_money < pb->W_money) {//降序排序
						temp = *pa;
						*pa = *pb;
						*pb = temp;
						temp.link = pa->link;
						pa->link = pb->link;
						pb->link = temp.link;

					}

					pb = pb->link;
				}
				pa = pa->link;
			}
			serialNumber(h2);
			printf("\n降序排序完毕...\n\n");
		}
	}
	return;
}

11. 附加项目:登录,注册部分

//实现注册功能
int zhuce() {
   FILE* fp;
   char name[30];
   char n[8],n1[8];

   while (1) {
   	printf("请输入要创建的用户名:");
   	scanf("%s", name);
   	eatline();
   	printf("请输入密码(仅限六位数字,不允许使用符号):");
   	scanf("%s", n);
   	eatline();
   	printf("请确认密码(务必输入六位):");
   	scanf("%s", n1);
   	eatline();
   	if (strcmp(n ,n1) == 0) {
   		if ((fp = fopen("D://zc.txt", "w+")) == NULL) {
   			printf("文件打开失败");
   			return 0;
   		}
   		for (int n2 = 0; n2 < 6; n2++) {
   			*(n + n2) += 3;
   		}
   	
   		fprintf(fp, "%s\t%s\n", name, n);
   		fclose(fp);
   		printf("\n用户创建成功...\n\n");
   		return 1;
   	}
   	else {
   		printf("两次密码输入不同,请重新设定密码!\n");
   	}
   }
}

//实现登录功能
int denglu(int n) {
   FILE* fp;
   int i = 5;
   char n1[8];
   char name1[30];
   if (n == 1) {
   	printf("注册完毕,请登录...\n");
   }
   if ((fp = fopen("D://zc.txt", "r+")) == NULL) {
   	printf("文件打开失败");
   	return 0;
   }
   else {
   	printf("如果没有账号,请先注册.\n");
   	int t = 0;
   	printf("是否需要注册?\n");
   	printf("输入1为是,0为否\n");
   	printf("请输入:");
   	scanf("%d", &t);
   	if (t == 1) {
   		if (denglu(zhuce()) == 1) {
   			return 1;
   		}
   	}
   	
   	char n2[8];
   	char name2[30];
   	fscanf(fp, "%s\t%s\n", name2, n2);
   	for (int n3 = 0; n3 < 6; n3++) {
   		*(n2 + n3) -= 3;
   	}

   	printf("请输入用户名:");
   	scanf("%s", name1);
   	if (strcmp(name2, name1) == 0) {
   		while (1) {
   			printf("请输入密码:");
   			scanf("%s", n1);
   			
   			if (strcmp(n2, n1) != 0) {
   				i--;
   				printf("\n密码错误,还可尝试%d次\n", i);					
   			}
   			else {
   				printf("\n输入正确,进入系统...\n\n");
   				eatline();
   				return 1;
   			}
   			if (i == 0) {
   				printf("错误次数过多,系统退出\n");
   				exit(0);
   			}
   		}
   	}
   }
   fclose(fp);
}

12. 辅助函数


//实现计算链表长度功能,并返回长度值
int length(W* head) {
   int len;
   W* p;
   for (len = 0, p = head->link;p != NULL;len++)//从头节点开始一直循环到尾节点
   	p = p->link;
   return len;
}

//实现给药品信息重新编号功能
void serialNumber(W* h3) {
   W* i;
   i = h3->link;
   int j = length(h3);

   for (int n = 1;n <= j;n++) {
   	i->W_number = n;
   	i = i->link;
   }

}

//解决scanf缓冲区问题
static void eatline(void)
{
   while (getchar() != '\n')
   	continue;
}

13. drug_Info.h文件

#ifndef H_DRUG_HH
#define H_DRUG_HH

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


//药品信息结构体
typedef struct W {
	int W_number;//人为编号
	char W_name[50];//药品名称
	float W_money;//药品进价
	float W_money1;//药品售价
	char W_size[50];//规格
	char W_manufacturer[50];//生产厂家
	struct W* link;
}W;

//功能函数
void W_menu(); //菜单处理函数 
int W_menu_select(void); //菜单选择函数 
void W_addRecord(W *head); //增加信息函数
void W_display(W *head); //显示所有药品信息函数 
void W_saveRecords(W* head ); //文件存储操作函数 
W* W_loadRecords(); //文件读取操作函数
void W_quit(W *head); //结束程序函数 
void W_findRecord(int n,W*head4); //查找指定记录函数 
void W_queryInfo(W*head3); //查询指定药品信息的函数 
void W_modifyRecord(W *head2); //修改指定药品信息函数 
W* W_insertRecord(W*head5);//插入信息函数
W* W_removeRecord(W* head6); //删除记录函数 
void W_Data_statistics(W *h);//数据统计
void W_sortInfo(W *h2);  //药品信息排序函数 

//辅助函数
static void eatline(void);//解决缓冲区问题
int length(W* head);//计长函数
void serialNumber(W* h3);//编号函数


#endif 

这个系统直接加上#include "W_drug.h"就行,函数声明和药品结构体都包含在内
2020/3/7/14/40
[toc]

发布了21 篇原创文章 · 获赞 5 · 访问量 734

猜你喜欢

转载自blog.csdn.net/weixin_45862170/article/details/104714113