文章目录
-这是我的课设要求的功能内容。。
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 <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]