大一下的课设任务之一是设计一个管理系统,上课期间突发奇想–设计一个简单的快递管理系统。
代码中用到的技术比较简单,但是知识点比较多,在编写过程中遇到的bug和困难也不少。
主要运用到的技术有:链表的增删改查,文件的一系列操作,链表输出到文件,文件内容提取到链表、函数的重构等。
- 快递管理系统主要的角色有:商品(即快递)、快递员、快递仓库管理人员、消费者。
- 快递管理系统主要的功能有:快递员送快递、查询手中未送快递;消费者购买快递、查询购买快递情况、取快递;快递仓库管理人员查看仓库快递信息、改变仓库快递信息、统计一个消费者的快递数量;较为完整的菜单界面。
- 快递管理系统运用的主要算法是链表的增删改查。
- 快递管理系统还加入了身份验证功能,虽然这些身份信息是提前写好的并且已经告知使用者,但这也体现了设计的思想。
- 代码中的部分注释是对功能的解释,部分注释是在构思中所写,仅供参考。
- 管理系统的默认登录密码在注释中已给出,请根据密码进行登录和操作。本管理系统为了简单起见,把快递员、消费者、管理人员均各看成一类人员,支持修改密码功能。
大一的时光已然过去,爱过、甜过也痛苦过、失望过,可无论在哪里、在做什么,编程始终是心中所爱,当然,还有那个远方的她…
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LENGTH sizeof(struct Goods)
#define FILENAME1 "goods.txt"
#define FILENAME2 "goodsTem.txt"
struct Goods
{
char name[30];
char ownerName[10];
char ownerTel[15];
struct Goods * next;
};
struct User
{
char account[20];
char password[20];
};
struct Goods * goodsStart = NULL;
struct Goods * goodsEnd = NULL;
struct Goods * goodsTemStart = NULL;
struct Goods * goodsTemEnd = NULL;
int main()
{
void save(struct Goods *goods, char fileName[], char fileOpenWay[]);
void read(char fileName[]);
void add(char addWay[]);
void find(char name[],char ownerName[],char ownerTel[]);
void change(char name[],char ownerName[],char ownerTel[],char oldOwnerName[],char oldOwnerTel[]);
void send(char name[],char ownerName[],char ownerTel[]);
void getGoods(char ownerName[],char ownerTel[]);
void create();
int validation(char account[],char password[],char fileName[]);
void statistics(char ownerName[],char ownerTel[]);
void changePassword(char account[],char newPassword[],char fileName[]);
int welcome;
for(welcome=0;welcome<11;welcome++)
{
if(welcome==5)
{
printf("** 欢迎进入快递管理系统 **");
} else if(welcome==8)
{
printf("** programmed by 于卓冉 **");
} else if(welcome==9)
{
printf("** 计算机类三班 **");
}
else
printf("** **");
}
int count;
printf("*****************************您是否是第一次操作本程序,如果是请按1进行数据初始化,不是请按2*****************************\n");
printf(" ------温馨提示:在本程序中,请您以换行的方式输入每一个数据");
scanf("%d", &count);
if (count == 1)
{
create();
goto A;
} else if (count == 2)
{
goto B;
}
A:
for(welcome=0;welcome<11;welcome++)
{
if(welcome==5)
{
printf("** 请依次进行快递仓库、快递员暂存快递初始化 **");
printf(" ------提示:所有初始化信息将被存入数据文件中");
} else
{
printf("** **");
}
}
add("goods");
goodsEnd = goodsStart;
add("goodsTem");
goodsTemEnd = goodsTemStart;
save(goodsStart, FILENAME1, "a");
save(goodsTemStart, FILENAME2, "a");
B:for(welcome=0;welcome<12;welcome++)
{
if(welcome==3)
{
printf("********************************************| 快递管理系统菜单 |*********************************************");
} else if(welcome==4)
{
printf("********************************************| |*********************************************");
} else if(welcome==5)
{
printf("********************************************| 选择快递员请按1 |*********************************************");
} else if(welcome==6)
{
printf("********************************************| 选择消费者请按2 |*********************************************");
} else if(welcome==7)
{
printf("********************************************| 选择快递仓库管理人员请按3 |*********************************************");
} else if(welcome==8)
{
printf("********************************************-------------------------------*********************************************");
} else
{
printf("************************************************************************************************************************");
}
}
int number, number1, number2, number3;
scanf("%d", &number);
if (number == 1)
{
printf("** 请输入您的账户和密码进行身份验证: **");
char account[20];
char password[20];
scanf("%s",account);
scanf("%s",password);
if(validation(account,password,"courier.txt")==0)
{
goto B;
}
C:for(welcome=0;welcome<12;welcome++)
{
if(welcome==2)
{
printf("** 您现在是快递员 **");
} else if(welcome==4)
{
printf("** | 选择送快递请按1 | **");
} else if(welcome==5)
{
printf("** | 选择查看手中快递情况请按2 | **");
} else if(welcome==6)
{
printf("** | 选择返回菜单请按3 | **");
} else if(welcome==7)
{
printf("** | 选择修改密码请按4 | **");
}
else if(welcome==8)
{
printf("** ------------------------------- **");
} else
{
printf("** **");
}
}
scanf("%d", &number1);
if (number1 == 1)
{
char name[30];
char ownerName[10];
char ownerTel[15];
printf("** 请依次输入您要送的快递名称、收货者名字、手机号码: **\n");
scanf("%s",name);
scanf("%s",ownerName);
scanf("%s",ownerTel);
send(name,ownerName,ownerTel);
goto C;
} else if (number1 == 2)
{
read(FILENAME2);
goto C;
} else if(number1==3)
{
goto B;
} else if(number1==4)
{
char account[20];
char newPassword[20];
printf("** 请输入您的账户和新的密码: **");
scanf("%s",account);
scanf("%s",newPassword);
changePassword(account,newPassword,"courier.txt");
goto B;
}
} else if (number == 2)
{
printf("** 请输入您的账户和密码进行身份验证: **");
char account[20];
char password[20];
scanf("%s",account);
scanf("%s",password);
if(validation(account,password,"consumer.txt")==0)
{
goto B;
}
D:for(welcome=0;welcome<12;welcome++)
{
if(welcome==2)
{
printf("** 您现在是消费者 **");
} else if(welcome==4)
{
printf("** | 选择取快递请按1 | **");
} else if(welcome==5)
{
printf("** | 选择购买商品请按2 | **");
} else if(welcome==6)
{
printf("** | 选择查询快递情况请按3 | **");
} else if(welcome==7)
{
printf("** | 选择返回菜单请按4 | **");
} else if(welcome==8)
{
printf("** | 选择修改密码请按5 | **");
}
else if(welcome==9)
{
printf("** ------------------------------- **");
} else
{
printf("** **");
}
}
scanf("%d", &number2);
if (number2 == 1)
{
char ownerName[10];
char ownerTel[15];
printf("** 请输入您的名字及电话号码: **");
scanf("%s",ownerName);
scanf("%s",ownerTel);
getGoods(ownerName,ownerTel);
goto D;
} else if (number2 == 2)
{
add("goodsTem");
save(goodsTemEnd, FILENAME2, "a+");
goto D;
} else if(number2 == 3)
{
char name[30];
char ownerName[10];
char ownerTel[15];
printf("** 请依次输入您的快递名称、您的名字、手机号码: **");
scanf("%s",name);
scanf("%s",ownerName);
scanf("%s",ownerTel);
find(name,ownerName,ownerTel);
goto D;
} else if(number2==4)
{
goto B;
} else if(number2==5)
{
char account[20];
char newPassword[20];
printf("** 请输入您的账户和新的密码: **");
scanf("%s",account);
scanf("%s",newPassword);
changePassword(account,newPassword,"consumer.txt");
goto B;
}
} else if (number == 3)
{
printf("** 请输入您的账户和密码进行身份验证: **");
char account[20];
char password[20];
scanf("%s",account);
scanf("%s",password);
if(validation(account,password,"manager.txt")==0)
{
goto B;
}
E:for(welcome=0;welcome<12;welcome++)
{
if(welcome==2)
{
printf("** 您现在是快递仓库管理人员 **");
} else if(welcome==4)
{
printf("** | 选择查看仓库中快递情况请按1 | **");
} else if(welcome==5)
{
printf("** | 选择改变仓库中快递信息请按2 | **");
} else if(welcome==6)
{
printf("** | 选择统计一个消费者的快递数量请按3 | **");
} else if(welcome==7)
{
printf("** | 选择返回菜单请按4 | **");
} else if(welcome==8)
{
printf("** | 选择修改密码请按5 | **");
}
else if(welcome==9)
{
printf("** --------------------------------------- **");
} else
{
printf("** **");
}
}
scanf("%d", &number3);
if (number3 == 1)
{
read(FILENAME1);
goto E;
} else if(number3 == 2)
{
char name[30];
char ownerName[10];
char ownerTel[15];
char oldOwnerName[10];
char oldOwnerTel[15];
printf("请输入快递名称、原收货者的名字及电话号码、现收货者的名字及电话号码:\n");
scanf("%s",name);
scanf("%s",oldOwnerName);
scanf("%s",oldOwnerTel);
scanf("%s",ownerName);
scanf("%s",ownerTel);
change(name,ownerName,ownerTel,oldOwnerName,oldOwnerTel);
goto E;
} else if(number3==3)
{
char ownerName[10];
char ownerTel[15];
printf("请输入您要统计的收货者的名字及电话号码:\n");
scanf("%s",ownerName);
scanf("%s",ownerTel);
statistics(ownerName,ownerTel);
goto E;
} else if(number3==4)
{
goto B;
} else if(number3==5)
{
char account[20];
char newPassword[20];
printf("** 请输入您的账户和新的密码: **");
scanf("%s",account);
scanf("%s",newPassword);
changePassword(account,newPassword,"manager.txt");
goto B;
}
}
}
void save(struct Goods * goods,char fileName[],char fileOpenWay[])
{
FILE * fp;
struct Goods * goods1 = goods;
if((fp=fopen(fileName,fileOpenWay))==NULL)
{
printf("cannot open file\n");
return;
}
while(goods1!=NULL)
{
fprintf(fp,"%s %s %s\n",goods1->name,goods1->ownerName,goods1->ownerTel);
goods1 = goods1->next;
}
fclose(fp);
}
void read(char fileName[])
{
FILE * fp;
struct Goods * goods = (struct Goods *) malloc(LENGTH);
if((fp= fopen(fileName,"a+"))==NULL)
{
printf("cannot open file\n");
exit(0);
}
printf("**** 以下是您所查阅的快递信息: ****");
fseek(fp,0,0);
while(fscanf(fp,"%s%s%s\n",&goods->name,&goods->ownerName,&goods->ownerTel)!=EOF)
{
printf("**** 快递名字为:%-30s ,收货者名字为:%8s ,收货者电话号码为:%-11s ****",
goods->name,goods->ownerName,goods->ownerTel);
}
fclose(fp);
}
void add(char addWay[])
{
struct Goods * goods1=(struct Goods *)malloc(LENGTH);
goods1->next=NULL;
printf("** 请依次输入快递的名称、收货者的名字以及手机号码 **");
scanf("%s",&goods1->name);
scanf("%s",&goods1->ownerName);
scanf("%s",&goods1->ownerTel);
if(strcmp(addWay,"goods")==0)
{
if(goodsStart==NULL)
{
printf("快递仓库初始化成功\n");
goodsStart=goods1;
}
goodsEnd=goods1;
} else if(strcmp(addWay,"goodsTem")==0)
{
printf("商品购买成功,您的快递已交给快递员处理\n");
if(goodsTemStart==NULL)
{
goodsTemStart=goods1;
} else
{
goodsTemEnd->next=goods1;
}
goodsTemEnd=goods1;
}
}
void find(char name[],char ownerName[],char ownerTel[])
{
FILE * fp;
FILE * fp1;
struct Goods * goods = (struct Goods *) malloc(LENGTH);
struct Goods * goods1 = (struct Goods *)malloc(LENGTH);
if((fp= fopen(FILENAME1,"a+"))==NULL)
{
printf("cannot open file\n");
exit(0);
}
if((fp1=fopen(FILENAME2,"a+"))==NULL)
{
printf("cannot open file\n");
exit(0);
}
fseek(fp,0,0);
while(fscanf(fp,"%s%s%s\n",&goods->name,&goods->ownerName,&goods->ownerTel)!=EOF)
{
if(strcmp(goods->ownerName,ownerName)==0&&strcmp(goods->name,name)==0&& strcmp(goods->ownerTel,ownerTel)==0)
{
printf("您的快递已到达快递点,请及时领取\n");
fclose(fp);
return;
}
}
fseek(fp1,0,0);
while(fscanf(fp1,"%s%s%s\n",&goods1->name,&goods1->ownerName,&goods1->ownerTel)!=EOF)
{
if(strcmp(goods1->ownerName,ownerName)==0&&strcmp(goods1->name,name)==0&& strcmp(goods1->ownerTel,ownerTel)==0)
{
printf("您的快递仍在运送中,请您耐心等待\n");
fclose(fp1);
return;
}
}
fclose(fp);
fclose(fp1);
printf("您没有正在配送和已送达的快递\n");
}
void change(char name[],char ownerName[],char ownerTel[],char oldOwnerName[],char oldOwnerTel[])
{
struct Goods * linkedList(char fileName[]);
void save(struct Goods * goods,char fileName[],char fileOpenWay[]);
struct Goods * goods = linkedList(FILENAME1);
struct Goods * head = goods;
remove(FILENAME1);
while(goods!=NULL)
{
if(strcmp(goods->name,name)==0&&strcmp(goods->ownerName,oldOwnerName)==0&&strcmp(goods->ownerTel,oldOwnerTel)==0)
{
strcpy(goods->ownerName,ownerName);
strcpy(goods->ownerTel,ownerTel);
save(head,FILENAME1,"a");
printf("已修改此快递的相应信息\n");
return;
}
goods=goods->next;
}
printf("没有此快递的信息,无法修改\n");
}
struct Goods * linkedList(char fileName[])
{
struct Goods * head=NULL;
struct Goods * p1,* p2;
p1=p2=(struct Goods *)malloc(LENGTH);
FILE * fp;
if((fp=fopen(fileName,"a+"))==NULL)
{
printf("file open error!");
exit(0);
}
fseek(fp,0,0);
while(fscanf(fp,"%s%s%s\n",&p1->name,&p1->ownerName,&p1->ownerTel)!=EOF)
{
if(head==NULL)
{
head=p1;
}
else
{
p2->next=p1;
}
p2=p1;
p1=(struct Goods *)malloc(LENGTH);
}
p2->next=NULL;
fclose(fp);
return head;
}
void send(char name[],char ownerName[],char ownerTel[])
{
struct Goods * linkedList(char fileName[]);
void save(struct Goods *goods, char fileName[], char fileOpenWay[]);
struct Goods * goods = linkedList(FILENAME1);
struct Goods * goodsTem = linkedList(FILENAME2);
struct Goods * goodsHead = goods;
struct Goods * goodsTemHead = goodsTem;
struct Goods * goodsTemPrev = (struct Goods *)malloc(LENGTH);
if(strcmp(goodsTem->ownerName,ownerName)==0&&strcmp(goodsTem->name,name)==0&& strcmp(goodsTem->ownerTel,ownerTel)==0)
{
goodsTemHead=goodsTem->next;
goodsTem->next=NULL;
while(goods->next!=NULL)
{
goods=goods->next;
}
goods->next=goodsTem;
remove(FILENAME1);
remove(FILENAME2);
save(goodsTemHead,FILENAME2,"a");
save(goodsHead,FILENAME1,"a");
printf("快递已送达快递仓库\n");
return;
}
while(goodsTem!=NULL)
{
goodsTemPrev=goodsTem;
goodsTem=goodsTem->next;
if(goodsTem==NULL)
{
printf("送快递失败\n");
return;
} else
{
if(strcmp(goodsTem->ownerName,ownerName)==0&&strcmp(goodsTem->name,name)==0&& strcmp(goodsTem->ownerTel,ownerTel)==0)
{
goodsTemPrev->next=goodsTem->next;
goodsTem->next=NULL;
while(goods->next!=NULL)
{
goods=goods->next;
}
goods->next=goodsTem;
remove(FILENAME1);
remove(FILENAME2);
save(goodsTemHead,FILENAME2,"a");
save(goodsHead,FILENAME1,"a");
printf("快递已送达快递仓库\n");
return;
}
}
}
}
void getGoods(char ownerName[],char ownerTel[])
{
struct Goods * linkedList(char fileName[]);
int count=0;
struct Goods * goods = linkedList(FILENAME1);
struct Goods * head = goods;
struct Goods * goodsAfter = (struct Goods *)malloc(LENGTH);
while(goods!=NULL)
{
if(strcmp(head->ownerName,ownerName)==0&& strcmp(head->ownerTel,ownerTel)==0)
{
head=goods->next;
goods=goods->next;
count++;
continue;
}
goodsAfter=goods->next;
if(goodsAfter==NULL)
{
break;
}
if(strcmp(goodsAfter->ownerName,ownerName)==0&& strcmp(goodsAfter->ownerTel,ownerTel)==0)
{
goods->next=goodsAfter->next;
count++;
continue;
}else
{
goods=goods->next;
goodsAfter=goodsAfter->next;
if(goodsAfter==NULL)
{
break;
}
}
}
remove(FILENAME1);
save(head,FILENAME1,"a");
if(count>0) {
printf("您已取走所购买的所有快递\n");
} else {
printf("您输入的信息有错误,请重新操作\n");
}
}
void create()
{
struct User courier={"courier","123456"};
struct User consumer={"consumer","123456"};
struct User manager={"manager","123456"};
FILE * fp;
FILE * fp1;
FILE * fp2;
if((fp=fopen("courier.txt","a"))==NULL)
{
printf("cannot open file\n");
return;
}
if((fp1=fopen("consumer.txt","a"))==NULL)
{
printf("cannot open file\n");
return;
}
if((fp2=fopen("manager.txt","a"))==NULL)
{
printf("cannot open file\n");
return;
}
fprintf(fp,"%s %s\n",courier.account,courier.password);
fprintf(fp1,"%s %s\n",consumer.account,consumer.password);
fprintf(fp2,"%s %s\n",manager.account,manager.password);
fclose(fp);
fclose(fp1);
fclose(fp2);
}
int validation(char account[],char password[],char fileName[])
{
FILE * fp;
struct User user;
if((fp=fopen(fileName,"a+"))==NULL)
{
printf("cannot open file\n");
return 0;
}
fseek(fp,0,0);
while((fscanf(fp,"%s%s\n",user.account,user.password))!=EOF)
{
if(strcmp(user.account,account)==0&&strcmp(user.password,password)==0)
{
printf("您的身份验证成功\n");
fclose(fp);
return 1;
}
}
printf("您的身份验证失败,请重新进行验证\n");
fclose(fp);
return 0;
}
void statistics(char ownerName[],char ownerTel[])
{
struct Goods * linkedList(char fileName[]);
int count;
struct Goods * goods=linkedList(FILENAME1);
while(goods!=NULL)
{
if(strcmp(ownerName,goods->ownerName)==0&&strcmp(ownerTel,goods->ownerTel)==0)
{
count++;
}
goods=goods->next;
}
printf("您所统计的消费者的快递数量为:%d\n",count);
}
void changePassword(char account[],char newPassword[],char fileName[])
{
FILE * fp;
if((fp=fopen(fileName,"a+"))==NULL)
{
printf("file open error!");
exit(0);
}
struct User user;
fseek(fp,0,0);
while((fscanf(fp,"%s%s",user.account,user.password))!=EOF)
{
if(strcmp(user.account,account)==0)
{
strcpy(user.password,newPassword);
fclose(fp);
remove(fileName);
if((fp=fopen(fileName,"a"))==NULL)
{
printf("file open error!");
exit(0);
}
fprintf(fp,"%s %s",user.account,user.password);
fclose(fp);
printf("您的密码修改成功,请您牢记您的新密码\n");
return;
}
}
printf("您的账户输入错误,请重新操作\n");
}