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


文章目录

    • main()函数
    • 0. 菜单
    • 1. 数据录入:录入系统基本数据,用链表组织
    • 2. 数据存储:用文件形式将录入信息进行存储
    • 3. 数据读取:用文件中的数据可以进行读写操作
    • 4. 数据修改:对以存在的旧数据进行修改操作
    • 5. 数据插入:可以将新数据插入任意指定位置
    • 6. 数据删除:可以对以存在的旧数据进行删除操作
    • 7. 数据查询:按要求进行数据查询
    • 8. 数据统计:按要求对数据进行统计
    • 9. 数据报表:按要求对数据打印报表
    • 10. 数据排序:按要求对数据排序
    • 11. 附加项目:登录,注册部分
    • 12. 辅助函数
    • 13. drug_Info.h文件

-这是我的课设要求的功能内容。。
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; } //退出函数 void W_quit(W *head) {char str[5]; if(head != NULL) {printf("是否保存原来的记录?(Y/N)\n"); printf("选择N会覆盖记录在文件的内容!!!"); gets(str); if(str[0]!='N' && str[0]!='n') W_saveRecords(head); exit(0); } else{exit(0); }}

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 #include #include //药品信息结构体 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

【c语言药店管理系统|药店管理系统(c语言链表实现)】这个系统直接加上#include "W_drug.h"就行,函数声明和药品结构体都包含在内
2020/3/7/14/40
[toc]

    推荐阅读