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