客户快递信息管理系统背景:
目前不少公司都提供网购服务,为了将商品快递给客户,就必须保存和管理客户的姓名、电话号码、邮寄地址等信息。为此,本项目要求完成一个小型客户快递信息管理系统,完成对客户快递信息的建立、显示、查找、插入、删除、修改等功能。作为一个完整的系统,应该具有良好的界面和较强的容错能力。
实验目的:
1.针对客户快递信息管理系统这一实际问题,学会依据软件开发流程,进行需求分析,概要设计、模块设计、详细设计,完成代码编写与调式,进行测试分析,撰写用户手册,从而得到软件开发的综合训练。
2.学会依据实际问题选择合适的数据结构存储通讯信息,设计相应的算法实现客户信息的建立、显示、查找、插入、删除、修改等操作。
关键
实现了导入文件到程序中,程序直接识别并存入系统当中。
/*0. 退出系统,释放客户信息的存储空间; 第一周
1. 可输入若干条客户信息,并创建相应的存储结构存放这些信息; 第一周
2. 可显示全部客户信息; 第一周
3. 可在存储结构中插入一条客户信息; 第一周
4. 可按姓名查询并显示该客户信息;
5. 可按姓名删除该客户信息;
6. 可按姓名修改该客户信息;
以上为基本要求,更高要求如下:
7. 将老师提供的“客户信息.txt”复制到你的项目文件夹中,将该文件中的客户信息.导入到你系统相应存储结构中。*/ #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN sizeof(LNode) int seat; //全局变量,用于存放客户信息成员的序号
typedef struct LNode { //客户信息结点char name[20]; //姓名double telenum; //电话char address[200]; //邮寄地址struct LNode *next;
} LNode, *LinkList;//功能0:退出系统,释放客户信息的存储空间
void dropLink(LinkList L) {LinkList cur = L->next; //cur意味着当前节点,初始化指向链表头节点,需要考虑是不是虚拟头节点 LinkList temp; //temp做临时节点while(cur !=NULL) { //cur为空意味着删除结束 temp = cur->next; //且temp指向cur的下一个节点 free(cur); //释放当前节点 cur = temp; //将cur赋值为cur的下一个节点,实现遍历效果 } L = NULL; //将链表头指针置为NULL
}//功能1:可输入若干条客户信息,并创建相应的存储结构存放这些信息
LinkList creatIncreLink(LinkList L) {//前插法(逆位序)创建一个存放客户信息成员的单链表,返回头结点地址double telenum;char name[20], address[200], temp;LinkList p;if (L == NULL) {L = (LinkList)malloc(LEN); //头结点L->next = NULL;}printf("请输入姓名、电话号码、邮寄地址,建立客户信息\n若要结束,只需将姓名输入'0'\n");printf("请输入姓名: ");temp = getchar();gets(name);if (!strcmp(name, "0")) {//若要结束,只需将姓名输入'0'free(L); //释放头结点L = NULL;return (L);}printf("请输入电话号码:");scanf("%lf", &telenum);printf("请输入邮寄地址: ");temp = getchar();gets(address);while (true) {p = (LinkList)malloc(LEN); //新结点strcpy(p->name, name);strcpy(p->address, address);p->telenum = telenum;//在L的头部插入新结点p->next = L->next;L->next = p;printf("请输入姓名: ");//temp = getchar(); //实验表明这条语句不能要gets(name);if (!strcmp(name, "0")) return (L);//若要结束,只需将姓名输入'0'printf("请输入电话号码:");scanf("%lf", &telenum);printf("请输入邮寄地址: ");temp = getchar(); //实验表明这条语句一定要gets(address);}
}//功能2:可显示全部客户信息
void printLink(LinkList L) {// 打印头结点地址为L的客户信息LinkList p = L;seat = 1;printf("\n -------------------------------------------\n");printf(" 姓名 电话号码 邮寄地址\n");printf(" --------------------------------------------\n");if (L == NULL || L->next == NULL)printf("该客户信息中没有元素\n");elsewhile (p->next != NULL) {printf(" %2d %-8s", seat, p->next->name);printf(" %.0f %-19s\n", p->next->telenum, p->next->address);p = p->next;seat++;}printf(" --------------------------------------------\n");return ;
}//功能3:可在存储结构中插入一条客户信息
void insertLink(LinkList L) {double telenum; //存储客户的电话号码 char name[20], address[200], temp; //存储客户的姓名和寄件地址,temp来做缓存 LinkList p = (LinkList)malloc(LEN); //创建节点来存储客户信息 printf("现在开始插入客户的信息,\n请输入姓名:"); temp = getchar();gets(name);printf("请输入电话号码:");scanf("%lf", &telenum);printf("请输入邮寄地址:");temp = getchar();gets(address);strcpy(p->name, name); //将输入的name存入节点的name域 p->telenum = telenum; //将输入的telenum存入节点的telenum域 strcpy(p->address, address); //将输入的address存入节点的address域 p->next = L->next; //将p节点的指针域指向头节点L的下一节点 L->next = p; //将头节点L的指针与指向p节点 printLink(L);
} //功能4:可按姓名查询并显示该客户信息
void inquireLink(LinkList L) {LinkList cur = (LinkList)malloc(LEN);cur = L->next;LinkList temp = (LinkList)malloc(LEN);/*使用一个变量来记录是否查询到客户,否是0,第一次查询是1,后边是2、3、...;也可以充当在表中全局变量seat的效果,记录客户次序*/int isExists = 0; char name[20];printf("请输入你要查询信息的客户姓名:");char tem = getchar();gets(name);while(cur != NULL) { //为空意味查询不到 temp = cur->next;if(!strcmp(cur->name, name)){isExists++;if(isExists == 1) { //第一次查询到需要打印出表头 printf("查询到客户信息如下:\n"); printf("\n -------------------------------------------\n");printf(" 姓名 电话号码 邮寄地址\n");printf(" --------------------------------------------\n");}printf(" %2d %-8s", isExists, cur->name);printf(" %.0f %-19s\n", cur->telenum, cur->address);}cur = temp; }printf(" --------------------------------------------\n"); //打印表尾
} //功能5:可按姓名删除该客户信息
void deleteLink(LinkList L) {LinkList cur = (LinkList)malloc(LEN);LinkList pre = (LinkList)malloc(LEN);pre = L;char name[20];int deleteClient = 0; //删除用户数目printf("请输入你要删除的客户姓名:"); char tem = getchar();gets(name);while(pre->next != NULL) { //为空意味查询不到要删除的客户 cur = pre->next;if(!strcmp(cur->name, name)){ //判定到删除姓名与客户姓名是否相同 deleteClient++; //若相同则积累删除用户+1 pre->next = cur->next; free(cur);}else pre = cur;} if(deleteClient) printf("删除成功\n"); //删除用户数目不为零时证明有删除,删除成功 return;
}//功能6:可按姓名修改该客户信息
void modifyLink(LinkList L) {char name[20];printf("输入你要修改的客户姓名:");char tem = getchar();gets(name);printf("%s",name);LinkList cur = (LinkList)malloc(LEN);cur = L->next;bool isName, isTelenum, isAddress; //定义三个信息变量来记录是否要改变各自信息 while(cur != NULL) {if(!strcmp(cur->name, name)) {printf("是否要修改此用户的姓名(是1|否0):"); scanf("%d", &isName);if(isName){printf("输入修改后的姓名:"); tem = getchar(); gets(cur->name);printf("修改姓名成功\n");}printf("是否要修改此用户的电话号码(是1|否0):");scanf("%d", &isTelenum);if(isTelenum){printf("输入修改后的电话号码:"); scanf("%lf", &cur->telenum);printf("修改电话号码成功\n"); }printf("是否要修改此用户的邮寄地址:(是1|否0):");scanf("%d", &isAddress);if(isAddress) {printf("输入修改后的邮寄地址:");tem = getchar();gets(cur->address);printf("修改邮寄地址成功\n");}}cur = cur->next;}
} //功能7: 将老师提供的“客户信息.txt”复制到你的项目文件夹中,将该文件中的客户信息.导入到你系统相应存储结构中。
LinkList inputLink(LinkList& L) {if(L == NULL){L = (LinkList)malloc(LEN);}//初始化,导入文件 FILE *file = fopen("客户信息.txt", "r+");if (file == NULL) {perror("Error opening file");return NULL;}char buffer[256];char name[20], itelenum[20], address[200];double telenum;//将信息存入一个个的客户信息节点 while(fgets(buffer, sizeof(buffer), file) != NULL) {//通过lable指针来指向buffer的初始地址,使用strtok函数来切割得到信息 char* lable; lable = buffer;seat++;//创建链表节点LinkList cur = (LinkList)malloc(LEN);//将信息中的姓名、电话号码、寄件地址整理好存入创建的链表节点//提取姓名 //从butter初始地址开始,截到第一个>符号 char *token = strtok(lable, ">");strcpy(name, token);lable += strlen(token)+1; //strlen(token)得到姓名的长度,加一跳过>符号 //提取电话号码//从姓名>后开始,截到第二个>符号 token = strtok(lable, ">");strcpy(itelenum,token);//itelenum[i] = '\0';telenum = atof(itelenum); // 转换为 double//提取寄件地址//strlen(token)得到电话的长度,加一跳过>符号lable += strlen(token)+1;//将剩下的字符赋给地址 strcpy(address, lable);//将信息中的姓名、电话号码、寄件地址整理好存入创建的链表节点strcpy(cur->name, name); //将输入的name存入节点的name域 cur->telenum = telenum; //将输入的telenum存入节点的telenum域 strcpy(cur->address, address); //将输入的address存入节点的address域 //将节点插入到链表中cur->next = L->next; //将p节点的指针域指向头节点L的下一节点 L->next = cur; //将头节点L的指针与指向p节点 }printf("导入成功");fclose(file);return L;
}int main() {LinkList L = NULL, p;int menu, count = 0; //count专门用于控制菜单显示,不要做其他用途char temp;bool succeed = 0; //succeed标志操作是否成功,1成功,0失败char name[20]; //姓名double telenum; //电话char address[200]; //邮寄地址//system("color 1f");while (true) {if (count % 5 == 0) {printf("\n ********* ^@^欢迎使用客户快递信息管理系统*********\n");printf(" * 1 创建客户信息 *\n");printf(" * 2 插入客户信息 *\n");printf(" * 3 查询客户信息 *\n");printf(" * 4 删除客户信息 *\n");printf(" * 5 显示客户信息 *\n");printf(" * 6 修改客户信息 *\n");printf(" * 7 修改客户信息 *\n");printf(" * 0 退出管理系统 *\n");printf(" ********* ^@^欢迎使用客户快递信息管理系统*********\n");printf("请选择0-6:");}count++;scanf("%d", &menu);switch (menu) {case 1: {L = creatIncreLink(L);printf("建立客户信息:");printLink(L);if (seat > 9) count = 0; //显示菜单break;}case 2: {insertLink(L);break;}//endcase2case 3: {inquireLink(L);break;}//endcase3case 4: {deleteLink(L);break;}//endcase4case 5: {if (L != NULL) { //客户信息表L已创建printf("当前客户信息内容如下:\n");printLink(L);if (seat > 9) count = 0; //显示菜单}//endifelse printf("ERROR: 客户信息还没有建立,请先建立客户信息\n");break;}//endcase5case 6: {modifyLink(L);break;}//endcase6case 7: {inputLink(L);break;}case 0: {if(seat == 0) return 0; //当用户为零时直接退出系统 else dropLink(L); //用户不为零清除内存再退出系统 printf("退出系统");return 0;} default:printf("没有此功能,重新输入\n");}//endswitchprintf("请选择0-6:");}//endwhilereturn 1;
}//endmain1