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

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

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

实验目的:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/717493.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++构造函数析构函数

构造和析构函数用于管理对象的初始化和清理工作&#xff0c;确保对象的正确生命周期管理。以下是其重要特性&#xff1a; 构造函数不能是虚函数 从存储空间角度&#xff1a; 虚函数是需要通过虚函数表和虚指针来调用的&#xff0c;如果用虚函数实现构造函数&#xff0c;而对象…

【算法沉淀】刷题笔记:并查集 带权并查集+实战讲解

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《数据结构与算法&#xff1a;初学者入门指南》&#x1f4d8;&am…

Day13:信息打点-JS架构框架识别泄漏提取API接口枚举FUZZ爬虫插件项目

目录 JS前端架构-识别&分析 JS前端架构-开发框架分析 前端架构-半自动Burp分析 前端架构-自动化项目分析 思维导图 章节知识点 Web&#xff1a;语言/CMS/中间件/数据库/系统/WAF等 系统&#xff1a;操作系统/端口服务/网络环境/防火墙等 应用&#xff1a;APP对象/API接…

QML学习之Text

文本显示是界面开发中的重要内容&#xff0c;在Qt Quick模块中提供了 Text 项来进行文本的显示&#xff0c;其中可以使用 font 属性组对文本字体进行设置&#xff1a; font.bold&#xff1a;是否加粗&#xff0c;取值为true或false font.capitalization&#xff1a;大写策略&a…

01.20 校招 实习 内推 面经

绿*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;内推/实习/校招汇总表格 1、校招 | 中兴微电子2024届校园招聘 校招 | 中兴微电子2024届校园招聘 2、长城汽车2024大学生开放日上大分&#xff01; 长城汽车2024大学生开放日上大分&#xff01; 3、校招 | 江淮汽…

java程序员的金三银四求职宝典(二)

程序员的金三银四求职宝典 随着春天的脚步渐近&#xff0c;对于许多程序员来说&#xff0c;一年中最繁忙、最重要的面试季节也随之而来。金三银四&#xff0c;即三月和四月&#xff0c;被广大程序员视为求职的黄金时期。在这两个月里&#xff0c;各大公司纷纷开放招聘&#xf…

倒计时36天

C-小红关鸡_牛客周赛 Round 35 (nowcoder.com) //超时 134.17/175 主要是循环这部分的问题 #include <bits/stdc.h> using namespace std; #define int long long const int N 2e5 6; const int inf 0x3f3f3f3f; int a[N]; void solve() {int n,k;cin>>n>…

多模态大语言模型的ai反馈增强机器人操作研究

本研究关注于利用大语言模型&#xff08;LLMs&#xff09;提供的自动化偏好反馈来增强决策过程 ○ 提出了一种多模态LLM&#xff0c;称为CriticGPT&#xff0c;可以理解机器人操作任务中的轨迹视频&#xff0c;并提供分析和偏好反馈 ○ 从奖励建模的角度验证了CriticGPT生成的…

使用 MongoDB Atlas 无服务器实例更高效地开发应用程序

使用 MongoDB Atlas无服务器实例更高效地开发应用程序 身为开发者&#xff0c;数据库并不一定需要您来操心。您可不想耗费时间来预配置集群或调整集群大小。同样地&#xff0c;您也不想操心因未能正确扩展而导致经费超标。 MongoDB Atlas 可为您提供多个数据库部署选项。虽然…

【javascript】快速入门javascript

本文前言及说明 适合学过一门语言有一定基础的人看。 省略最初学习编程时的各种编程重复的基础知识。 javascript简介 编程语言&#xff08;主前端&#xff09; 用途&#xff1a;主web前后端&#xff0c;游戏&#xff0c;干别人网站 优点&#xff1a;速度快&#xff0c;浏…

一文扫盲:室内导航系统的应用场景和技术实现(入门级)

hello&#xff0c;我是贝格前端工场&#xff0c;之间搞过一些室内导航项目&#xff0c;有2D也有3D的&#xff0c;算是有些经验&#xff0c;这里给大家分享一下室内导航的基本尝试&#xff0c;欢迎老铁们点赞、关注&#xff0c;如有需求可以私信我们。 一、室内导航是什么 室内…

Vue开发实例(十)Tabs标签页打开、关闭与路由之间的关系

创建标签页 一、创建标签页二、点击菜单展示新标签页1、将标签数据作为全局使用2、菜单点击增加标签页3、处理重复标签4、关闭标签页 三、点击标签页操作问题1&#xff1a;点击标签页选中菜单进行高亮展示问题2&#xff1a;点击标签页路由也要跳转 四、解决bug 先展示最终效果 …

Android 基础入门 基础简介

1. 观察App运行日志 2.Android 开发设计的编程语言 koltin Java c c 3.工程目录结构 4.Gradle 5.build.gradle 文件解析 plugins {id("com.android.application")//用了哪些插件 主配置文件版本控制 所以这里不用写版本 }android {namespace "com.tiger.myap…

【C++】每周一题——2024.3.3(手滑再写一篇)

题目 Cpp 【问题描述】 输入一个由若干个以空格分隔的单词组成的英文文章&#xff0c;求文章中最短的单词&#xff08;文章以英文句点”.”结束&#xff0c;且字符数不超过200&#xff09;. 【输入格式】 一行&#xff0c;表示输入的英文文章。 【输出格式】 一行&#xff0c;表…

反向代理与负载均衡

目录 反向代理 负载均衡 反向代理 代理角色&#xff1a; 正常情况下&#xff0c;客户端&#xff08;如浏览器&#xff09;直接与服务器通信&#xff0c;但在反向代理中&#xff0c;Nginx充当客户端和服务器之间的中介。客户端向Nginx发送请求&#xff0c;而Nginx负责将请求转…

基于springboot+vue的二手车交易系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

金三银四,风控建模面试全攻略:从简历准备到面试技巧

随着春天的到来,招聘市场的 “金三银四” 也悄然而至。公众号的小伙伴问我有没有面试相关指导课程,上完课后,把整理的部分材料通过文章分享给更多有需要的朋友。预祝大家顺利获得心仪的职位。本文将从简历准备、面试注意事项以及高频面试问题三个方面,为你提供一份全面的风…

字符串判空错误

字符串判空错误 前端传来的请求数据&#xff0c;若用只用String为null判断&#xff0c;则忽略了str“”的情况&#xff0c;此时str不空&#xff0c;但str.length()0 RequestMapping(path "/add", method RequestMethod.POST)ResponseBodypublic String addDiscuss…

C++进阶(二) 多态

一、多态的概念 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c; 具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会 产生出不同的状态。举个栗子&#xff1a;比如买票这个行为&#xff0c;当普通人买票时&#xff0c;是全价买票&#xff1b;学…

Linux 查询端口被占用命令

Linux 查询端口被占用命令 1、lsof -i:端口号 用于查看某一端口的占用情况&#xff0c;比如查看8000端口使用情况&#xff0c;lsof -i:8000 lsof -i:8080&#xff1a;查看8080端口占用 lsof abc.txt&#xff1a;显示开启文件abc.txt的进程 lsof -c abc&#xff1a;显示abc进…