当前位置: 首页 > news >正文

做自由行的网站一加手机官网网站

做自由行的网站,一加手机官网网站,阿里云万网域名购买,网站收录图片本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 我会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. #x1f92d;#x1f92d;#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人能…本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 我会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 前言 哈哈哈,有没有被小编的标题所吸引住,那么友子们是否也想做个有意思的通讯录来制造点浪漫氛围呢 想必友友们答案一定是想的吧 ! ! ! 在本篇博文中,我们主要讲解 目录 1.静态顺序表和动态顺序表 2.利用动态顺序表实现通讯录 3.通讯录的功能和逻辑框架 4.每个逻辑功能的实现 5.通讯录源文件的展示 一.静态顺序表和动态顺序表 1. 顺序表的概念 友友们一定很疑惑顺序表是什么吧 ? 让小编来一一为大家解惑吧 顺序表的底层结构是数组对数组的封装实现了常用的增删改查等接口 2. 顺序表的种类 而我们的顺序表又分两种: 静态顺序表 动态顺序表 这两个的区别在哪呢 ? 其实啊,主要看我们怎么给我们数组长度怎么创建 如果是一开始就给定我们的数组长度呢,我们就叫它静态顺序表 如果我们一开不给长度而只是给个指针,需要我们后期来开辟的.这是我们就叫它动态顺序表 那么我们爱提问的小爱同学就抛出问题来了, 我们今天要学的通讯录是用动态还是静态的顺序表呢 很显然我们需要用的是动态顺序表 宝子们可以想想,动态顺序表我们需要用多少空间就可以开辟相对应的空间 而我们的静态的话,万一空间不足就会造成 数据的丢失 (如果数据丢失很严重的话,是要吃牢饭的) 空间足够就会造成 空间的浪费 鱼式疯言 本质上我们的顺序表就是一个 “披着羊皮” 伪装成 顺序表 的 数组 怎么样修饰就觉得着是怎么样的顺序表其他都一样。 二 . 利用动态顺序表实现通讯录 1.顺序表的选择 友友们还是会思考如果我们知道动态顺序表 然后呢 该怎么样去建立之间的架构呢 宝子们都学过我们数组存放的是一些同类型的数据那如果把这些数据都比喻成我们的联系人呢是不是就可以建立我们的联系人的大图谱成为我们的通讯录了 #define _NAMEMAX_ 50 #define _SEXMAX_ 20 #define _PHONEMAX_ 100 #define _POSITMAX_ 300typedef struct PresonInt {char name[_NAMEMAX_];//名字char sex[_SEXMAX_];//性别int age;//年龄char phone[_PHONEMAX_];//电话char posit[_POSITMAX_];//地址 }Prt;typedef Prt SLDataType; // 动态顺序表 -- 按需申请 typedef struct SeqList {SLDataType* a;int size; // 有效数据个数int capacity; // 空间容量 }SL;于是我们就有了以上的这些类型的声明 鱼式疯言 其实友友们可以和我这样看我们的 a 就是数组 那么这个数组存的是什么数据呢我们平常存的 整型字符 一类的 但我们学了结构体之后我们就可以利用就结构体把我们想要存储的各种数据类型打包成一个 那就是我们的 结构体类型 三.通讯录的功能和逻辑框架 1.功能简介 1至少能够存储100个人的通讯信息 2能够保存用户信息名字、性别、年龄、电话、地址等 3增加联系人信息 4删除指定联系人 5查找制定联系人 6修改指定联系人 7显示联系人信息 case 1:ContastAdd(con);//添加联系人break; case 2:ContastFind(con);//查找联系人break; case 3:Contastdele(con);//删除联系人break; case 4:ContastSet(con);//修改联系人break; case 5:ContastShow(con);//显示通讯录break; case 6:PutSLFile(con);//保存通讯录文档break; case 7:GetSLFile(con);//读取通讯录信息break;2.逻辑框架 1.通讯录的初始化过程 3,.联系人数据的保存和通讯录的销毁过程 void PutSLFile(SL* ps); //保存联系人文件 void GetSLFile(SL* ps); //读取通讯录文档void SLInit(SL* ps); void SLDestroy(SL* ps); //顺序表初始化和销毁void ContastInit(SL* ps); //通讯录初始化 void ContastDestory(SL* ps); //销毁通讯录2.通讯录与顺序表功能连接与维护过程 void SLCheckCapacity(SL* ps); //顺序表扩容void ContastAdd(SL* ps); //添加联系人void ContastShow(SL* ps); //显示通讯录void ContastFind(SL* ps); //查找联系人void ContastSet(SL* ps); //修改指定联系人信息void SLErase(SL* ps, int pos); //指定位置删除数据void Contastdele(SL* ps); //删除指定联系人四.每个逻辑功能的实现 1 菜单打印和通讯录的初始化 void Meau() //菜单功能介绍 {printf(------------------ 通讯录 -------------------\n);printf(--------- 1.添加联系人 2.查找联系人 ---------\n); printf(--------- 3.删除联系人 4.修改联系人 ---------\n);printf(--------- 5.显示通讯录 6.保存通讯录 ---------\n);printf(----------7.读取已存通讯录 0. 退出 ----------\n);}void ContastInit(SL*ps) //通讯录初始化 {SLInit(ps); }void SLInit(SL*ps) //对顺序表进行初始化 {ps-a NULL;//数组元素为0ps-capacity 0;//最大容量放置为0ps-size 0;//有效数据为0 }2.顺序表的扩容如果数组长度不够 void SLCheckCapacity(SL* ps) //扩容顺序表空间 {assert(ps);if (ps-capacity ps-size){int newcapaacity ps-capacity 0 ? INIT_CAPACITY : 2 * (ps-capacity);//用三目操作符来判断总容量是否位0SLDataType* p1 (SLDataType*)realloc(ps-a, newcapaacity * sizeof(SLDataType));//开辟成倍空间大小的空间if (p1 NULL)//判断是否开辟成功{perror(malloc);return;}ps-a p1;//开辟成功就放入ps-capacity newcapaacity;}}3.添加联系人数据(功能一) void ContastAdd(SL* ps) //添加联系人 {SLCheckCapacity(ps);//空间不够时puts(亲请输入你的姓名);scanf(%s, ps-a[ps-size].name);puts(亲请输入你的性别);scanf(%s, ps-a[ps-size].sex);puts(亲请输入你的年龄);scanf(%d, ps-a[ps-size].age);puts(亲请输入你的电话);scanf(%s, ps-a[ps-size].phone);puts(亲请输入你的住址);scanf(%s, ps-a[ps-size].posit);ps-size; }4.查询联系人(以名字为根据查询) int Findname(SL*ps, char nm[]) //查找名字 {for (int i 0; i ps-size; i){if (strcmp(ps-a[i].name, nm) 0){return i;}}return -1; }5. 查找联系人 (功能二) void ContastFind(SL*ps) //查找联系人 {char nm[50] {0};puts(请输入要查找的联系人姓名);scanf(%s, nm);int m Findname(ps, nm);if (m0){printf(名字\t性别\t年龄\t电话\t地址\n);printf(%s\t, ps-a[m].name);printf(%s\t, ps-a[m].sex);printf(%d\t, ps-a[m].age);printf(%s\t, ps-a[m].phone);printf(%s\n, ps-a[m].posit);return;}printf(未搜索到该联系人,查找错误!\n);} 如果没有找到就会显示错误 6 . 删除联系人 (功能三) void Contastdele(SL*ps) //删除指定联系人 {char nm[50] { 0 };puts(请输入要删除的联系人姓名);scanf(%s, nm);int m Findname(ps, nm);if (m 0){SLErase(ps, m 1);printf(删除成功!\n);return;}puts(未搜索到该联系人, 删除错误!); }7.修改联系人(功能四) void ContastSet(SL* ps) //修改指定联系人信息 {char nm[50] { 0 };puts(请输入要修改的联系人姓名);scanf(%s, nm);int m Findname(ps, nm);if (m 0){puts(亲请输入你修改后的姓名);scanf(%s, ps-a[m].name);puts(亲请输入你修改后的性别);scanf(%s, ps-a[m].sex);puts(亲请输入你修改后的年龄);scanf(%d, ps-a[m].age);puts(亲请输入你修改后的电话);scanf(%s, ps-a[m].phone);puts(亲请输入你修改后的住址);scanf(%s, ps-a[m].posit);printf(该联系人修改成功!\n);return ;}puts(未搜索到该联系人,修改失败!); }8.显示通讯录(功能五) void ContastShow(SL* ps) //显示通讯录 {assert(ps ps-size);printf(名字\t性别\t年龄\t电话\t地址\n);for (int i 0; i ps-size; i){printf(%s\t, ps-a[i].name);printf(%s\t, ps-a[i].sex);printf(%d\t, ps-a[i].age);printf(%s\t, ps-a[i].phone);printf(%s\n, ps-a[i].posit);} }9.保存通讯录信息(功能六) //这个函数接口时保存通讯录文档,就是将通讯录的信息写入到文件 //保存通讯录文档 void PutSLFile(SL* ps) {//写入文件FILE* pfwrite fopen(contact.txt,w);//判断 pfwrite 是否为NULLif (fwrite NULL){perror(fopen-fwrite);return;}for (int i 0; i ps-size; i){//用循环的方式//把每个数据以格式化的方式存入fprintf(pfwrite,%s\n, ps-a[i].name);fprintf(pfwrite,%s\n, ps-a[i].sex);fprintf(pfwrite,%d\n, ps-a[i].age);fprintf(pfwrite,%s\n, ps-a[i].phone);fprintf(pfwrite,%s\n, ps-a[i].posit);}printf(保存成功\n);fclose(pfwrite);pfwrite NULL; }10. 读取已有联系人数据(功能七) //读取通讯录文档 void GetSLFile(SL* ps) {FILE* pfread fopen(contact.txt, r);//防止NULL出现if (pfread NULL){perror(fopen-pfread);return;}//先开辟空间//防止野指针的出现SLCheckCapacity(ps);//将数组每个数据进行初始存放while (fscanf(pfread,%s%s%d%s%s,ps-a[ps-size].name, ps-a[ps-size].sex, ps-a[ps-size].age, ps-a[ps-size].phone, ps-a[ps-size].posit) ! EOF){SLCheckCapacity(ps);ps-size;}//打印提示信息printf(读取成功\n);//关闭文件fclose(pfread);//防止野指针pfread NULL; }11.通讯录的销毁 void ContastDestory(SL* ps) //销毁通讯录 {SLDestroy(ps); } void SLDestroy(SL*ps) //销毁顺序表 {assert(ps);ps-capacity 0;ps-size 0;//容量和大小都置为0free(ps-a);//释放空间ps-a NULL;//a置为空指针 }鱼式疯言 上面的十个逻辑功能的实现,都是基于函数来分装的 ❤️ ❤️ ❤️ 亲爱的宝子们,小编在写 通讯录 的时候是反复调用功能 相同的函数 函数的意义就在于我们能够反复利用,不要写多余的代码 宝子们也可以利用这一特点来快速实现我们的通讯录哦 五 . 通讯录源代码展示 顺序表和通讯录的头文件 1. seqlist.h #pragma once #define _CRT_SECURE_NO_WARNINGS #define INIT_CAPACITY 4 #includestdio.h #includeassert.h #includestdlib.h #includestring.h#define _NAMEMAX_ 50 #define _SEXMAX_ 20 #define _PHONEMAX_ 100 #define _POSITMAX_ 300typedef struct PresonInt {char name[_NAMEMAX_];//名字char sex[_SEXMAX_];//性别int age;//年龄char phone[_PHONEMAX_];//电话char posit[_POSITMAX_];//地址 }Prt;typedef Prt SLDataType; // 动态顺序表 -- 按需申请 typedef struct SeqList {SLDataType* a;int size; // 有效数据个数int capacity; // 空间容量 }SL;//顺序表初始化和销毁 void SLInit(SL* ps); void SLDestroy(SL* ps);void ContastInit(SL* ps); //通讯录初始化 void ContastDestory(SL* ps); //销毁通讯录void SLCheckCapacity(SL* ps); //顺序表扩容void ContastAdd(SL* ps); //添加联系人void ContastShow(SL* ps); //显示通讯录void ContastFind(SL* ps); //查找联系人void ContastSet(SL* ps); //修改指定联系人信息void SLErase(SL* ps, int pos); //指定位置删除数据void Contastdele(SL* ps); //删除指定联系人void PutSLFile(SL* ps); //保存联系人文件//读取通讯录文档 void GetSLFile(SL* ps);顺序表测试文件 2. seqlist.c #include seqlist.hvoid SLInit(SL*ps) //对顺序表进行初始化 {ps-a NULL;//数组元素为0ps-capacity 0;//最大容量放置为0ps-size 0;//有效数据为0 }void SLCheckCapacity(SL* ps) //扩容顺序表空间 {assert(ps);if (ps-capacity ps-size){int newcapaacity ps-capacity 0 ? INIT_CAPACITY : 2 * (ps-capacity);//用三目操作符来判断总容量是否位0SLDataType* p1 (SLDataType*)realloc(ps-a, newcapaacity * sizeof(SLDataType));//开辟成倍空间大小的空间if (p1 NULL)//判断是否开辟成功{perror(malloc);return;}ps-a p1;//开辟成功就放入ps-capacity newcapaacity;}}void SLErase(SL* ps, int pos) //指定位置删除数据 {assert(ps ps-sizepos0posps-size1);//删除后//向左移动for (int u pos-1; u ps-size-1; u){ps-a[u] ps-a[u 1];}(ps-size)--;//大小-- }//这个函数接口时保存通讯录文档,就是将通讯录的信息写入到文件 //保存通讯录文档 void PutSLFile(SL* ps) {//写入文件FILE* pfwrite fopen(contact.txt,w);//判断 pfwrite 是否为NULLif (fwrite NULL){perror(fopen-fwrite);return;}for (int i 0; i ps-size; i){//用循环的方式//把每个数据以格式化的方式存入fprintf(pfwrite,%s\n, ps-a[i].name);fprintf(pfwrite,%s\n, ps-a[i].sex);fprintf(pfwrite,%d\n, ps-a[i].age);fprintf(pfwrite,%s\n, ps-a[i].phone);fprintf(pfwrite,%s\n, ps-a[i].posit);}printf(保存成功\n);fclose(pfwrite);pfwrite NULL; }//读取通讯录文档 void GetSLFile(SL* ps) {FILE* pfread fopen(contact.txt, r);//防止NULL出现if (pfread NULL){perror(fopen-pfread);return;}//先开辟空间//防止野指针的出现SLCheckCapacity(ps);//将数组每个数据进行初始存放while (fscanf(pfread,%s%s%d%s%s,ps-a[ps-size].name, ps-a[ps-size].sex, ps-a[ps-size].age, ps-a[ps-size].phone, ps-a[ps-size].posit) ! EOF){SLCheckCapacity(ps);ps-size;}//打印提示信息printf(读取成功\n);//关闭文件fclose(pfread);//防止野指针pfread NULL; }void SLDestroy(SL*ps) //销毁顺序表 {assert(ps);ps-capacity 0;ps-size 0;//容量和大小都置为0free(ps-a);//释放空间ps-a NULL;//a置为空指针 }通讯录测试文件 3. contact.c #include seqlist.hvoid Meau() //菜单功能介绍 {printf(------------------ 通讯录 -------------------\n);printf(--------- 1.添加联系人 2.查找联系人 ---------\n); printf(--------- 3.删除联系人 4.修改联系人 ---------\n);printf(--------- 5.显示通讯录 6.保存通讯录 ---------\n);printf(----------7.读取已存通讯录 0. 退出 ----------\n);}void ContastInit(SL*ps) //通讯录初始化 {SLInit(ps); }void ContastDestory(SL* ps) //销毁通讯录 {SLDestroy(ps); }void ContastAdd(SL* ps) //添加联系人 {SLCheckCapacity(ps);//空间不够时puts(亲请输入你的姓名);scanf(%s, ps-a[ps-size].name);puts(亲请输入你的性别);scanf(%s, ps-a[ps-size].sex);puts(亲请输入你的年龄);scanf(%d, ps-a[ps-size].age);puts(亲请输入你的电话);scanf(%s, ps-a[ps-size].phone);puts(亲请输入你的住址);scanf(%s, ps-a[ps-size].posit);ps-size; }void ContastShow(SL* ps) //显示通讯录 {assert(ps ps-size);printf(名字\t性别\t年龄\t电话\t地址\n);for (int i 0; i ps-size; i){printf(%s\t, ps-a[i].name);printf(%s\t, ps-a[i].sex);printf(%d\t, ps-a[i].age);printf(%s\t, ps-a[i].phone);printf(%s\n, ps-a[i].posit);} }int Findname(SL*ps, char nm[]) //查找名字 {for (int i 0; i ps-size; i){if (strcmp(ps-a[i].name, nm) 0){return i;}}return -1; } void ContastFind(SL*ps) //查找联系人 {char nm[50] {0};puts(请输入要查找的联系人姓名);scanf(%s, nm);int m Findname(ps, nm);if (m0){printf(名字\t性别\t年龄\t电话\t地址\n);printf(%s\t, ps-a[m].name);printf(%s\t, ps-a[m].sex);printf(%d\t, ps-a[m].age);printf(%s\t, ps-a[m].phone);printf(%s\n, ps-a[m].posit);return;}printf(未搜索到该联系人,查找错误!\n);}void Contastdele(SL*ps) //删除指定联系人 {char nm[50] { 0 };puts(请输入要删除的联系人姓名);scanf(%s, nm);int m Findname(ps, nm);if (m 0){SLErase(ps, m 1);printf(删除成功!\n);return;}puts(未搜索到该联系人, 删除错误!); }void ContastSet(SL* ps) //修改指定联系人信息 {char nm[50] { 0 };puts(请输入要修改的联系人姓名);scanf(%s, nm);int m Findname(ps, nm);if (m 0){puts(亲请输入你修改后的姓名);scanf(%s, ps-a[m].name);puts(亲请输入你修改后的性别);scanf(%s, ps-a[m].sex);puts(亲请输入你修改后的年龄);scanf(%d, ps-a[m].age);puts(亲请输入你修改后的电话);scanf(%s, ps-a[m].phone);puts(亲请输入你修改后的住址);scanf(%s, ps-a[m].posit);printf(该联系人修改成功!\n);return ;}puts(未搜索到该联系人,修改失败!); }逻辑测试文件 4. test.c #include seqlist.hint main() {int n 0;SL con;//con就是你存储的通讯录ContastInit(con);do{Meau();puts(请进行以上操作:);scanf(%d, n);switch (n){case 1:ContastAdd(con);//添加联系人break;case 2:ContastFind(con);//查找联系人break;case 3:Contastdele(con);//删除联系人break; case 4:ContastSet(con);//修改联系人break;case 5:ContastShow(con);//显示通讯录break;case 6:PutSLFile(con);//保存通讯录文档break;case 7:GetSLFile(con);//读取通讯录信息break;case 0://退出通讯录puts(通讯录正在退出中...);break;default:printf(输入错误,请重新操作!!!\n);break;}} while (n);ContastDestory(con);return 0; }总结 这次小编带大家实现了我们的通讯录的小功能,虽不说浪漫,但还是饶有趣味的吧 最后让小编梳理下本篇文章我们收获了什么吧 静态顺序表和动态顺序表: 我们知道了静态和动态顺序表的本质都是 数组 ,不同的在于他们数组 长度大小 的是否固定 利用动态顺序表实现通讯录: 比起固定的静态顺序表,我们更常用 数组长度 灵活多变 的动态顺序表 通讯录的功能和逻辑框架: 首先带着宝子们建立通讯录的大体框架和各部分功能的简介 每个逻辑功能的实现: 小编一步一步带着友友们见证了咱们通讯录的 “出生” “成长”“销毁” 的 全过程 通讯录源代码展示 展示了本次基于 顺序表 实现的通讯录全部的代码 如果觉得小编写的还不错的咱可支持三关下,不妥当的咱评论区指正 希望我的文章能给各位家人们带来哪怕一点点的收获就是 小编创作 的最大动力
http://www.zqtcl.cn/news/94381/

相关文章:

  • 做网站都需要什么工具网站开发培训哪里好
  • 做网站里面的图片像素要求安徽 网站建设
  • 电子商务推广网站wordpress小程序搭建
  • 张家港网站开发培训广告代理那些平台可以给网站做外链
  • 搞一个公司网站得多少钱中国航天空间站最新消息
  • php移动网站开发微商做图王官方网站
  • 制作网站中英文字体不能为网页设计与制作教程试题
  • 网站建设与管理案例柳洪轶wordpress学校站模板
  • 湖北省和住房建设厅官方网站自媒体专业
  • 榆林网站开发自己建设购物网站
  • 新材建设局网站百度提问首页
  • 网站优化网站建设栅格布局 网站设计
  • 网站建设销售前景网站手机开
  • 网站建站 用户注册北京网站建设方案报价
  • jsp做网站 案例网站模板 招聘
  • 德州建设银行兑换网站服务器网站跳转怎么做的
  • 金华专业做网站公司湖南网站建设服务
  • 企业网站设计沈阳苏宁电器网站建设特点分析
  • 建设工程类公司网站易语言可以做api网站对接吗
  • 青岛做网站皆赴青岛博wordpress 数据库 备份
  • 外贸公司网站空间哈尔滨seo优化专注
  • 建筑行业综合查询平台优化推广联盟
  • 北京管庄网站建设公司开平网站制作
  • 如何做销售直播网站最专业网站建设
  • 太原市住房和城乡建设局的网站首页网络推广服务外包公司
  • 湘icp备 网站建设 农业 湖南稿定设计免费版
  • 公司网站推广方法陕西省住房建设厅官网
  • 网站关键词排名突然没了无锡企业网站建设报价
  • 找做网站的人网站改版 301跳转
  • 网站备案一次就可以了吧营销管理培训课程