文章目录
-
- 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]
推荐阅读
- java|Java学习资料分享
- #|数据结构-双向循环链表
- #|数据结构-双向链表操作
- 51单片机笔记|(十四)51单片机——LCD1602实现滚动效果
- 单片机|单片机 c语言 d,单片机89C51与A/D转换器MAX - 控制/MCU - 电子发烧友网
- 单片机从入门到高级|51单片机——AD/DA转换
- 算法|C语言RGB转Lab色域
- c语言基础知识讲解|二维数组零碎知识梳理
- 链表|多线程环境下,HashMap为什么会出现死循环()