客户快递信息管理系统——导入文件识别存储

发布于:2024-03-04 ⋅ 阅读:(51) ⋅ 点赞:(0)

客户快递信息管理系统背景:

目前不少公司都提供网购服务,为了将商品快递给客户,就必须保存和管理客户的姓名、电话号码、邮寄地址等信息。为此,本项目要求完成一个小型客户快递信息管理系统,完成对客户快递信息的建立、显示、查找、插入、删除、修改等功能。作为一个完整的系统,应该具有良好的界面和较强的容错能力。

实验目的:

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");
	else
		while (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;
			}//endcase2
			case 3: {
				inquireLink(L);
				break;
			}//endcase3
			case 4: {
				deleteLink(L);
				break;
			}//endcase4
			case 5: {
				if (L != NULL) { //客户信息表L已创建
					printf("当前客户信息内容如下:\n");
					printLink(L);
					if (seat > 9) count = 0; //显示菜单
				}//endif
				else printf("ERROR: 客户信息还没有建立,请先建立客户信息\n");
				break;
			}//endcase5
			case 6: {
				modifyLink(L);
				break;
			}//endcase6
			case 7: {
				inputLink(L);
				break;
			}
			case 0: {
					if(seat == 0) return 0;        //当用户为零时直接退出系统 
					else dropLink(L);                   //用户不为零清除内存再退出系统 
					printf("退出系统");
					return 0;
					} 
			default:
				printf("没有此功能,重新输入\n");
		}//endswitch
		printf("请选择0-6:");
	}//endwhile
	return 1;
}//endmain1
本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到