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

杭州学网站建设2022最新国内新闻50条简短

杭州学网站建设,2022最新国内新闻50条简短,重庆市网站备案材料,中兴的网站谁做的目录 前言#xff1a; 一#xff1a;整体框架 关于通讯录结构体的创建 二#xff1a;通讯录的功能实现#xff08;静态#xff09; 2.1初始化通讯录 2.2增加联系人 2.3打印通讯录 2.4删除联系人 2.5 查找联系人 2.6修改联系人 2.7排序联系人 三#xff1a;通…  目录 前言 一整体框架 关于通讯录结构体的创建  二通讯录的功能实现静态 2.1初始化通讯录 2.2增加联系人 2.3打印通讯录 2.4删除联系人 2.5 查找联系人 2.6修改联系人  2.7排序联系人 三通讯录优化——动态内存 3.1通讯录的创建 3.2初始化通讯录  3.3增加联系人  3.4清空通讯录  四通讯录优化——文件版本 4.1退出保存信息到文件 4.2初始化时加载文件信息 五整体代码 test.c contact.c contact.h 前言 在之前的篇章中讲述了【C语言】进阶——结构体【C语言】进阶——动态内存【C语言】进阶——文件操作。 在本篇运用以上知识结合来写一个小项目——通讯录 我会逐步从静态版本优化到动态增加以及最终的文件存储版循循渐进详解通讯录的实现 实现思路 通讯录类似一个复杂结构体包含了很多信息以个人信息的通讯录而言需要包含个人名字年龄电话性别以及地址 而它所具有的基本功能增Add删(Del) 改(modify) 查 (Search)以及我们可以对其一些简单的拓展功能 这些具体分析为 打印一个菜单提供用户选择功能添加联系人信息删除联系人信息查询联系人信息修改联系人信息显示所有联系人信息对所有联系人信息进行排序整理删除所有联系人信息操作完毕可选择退出。 将整个项目分为三部分 test.c ——测试代码模块 contact.c——函数的实现 contact.h——类型的定义函数声明等  一整体框架 我们需要映入眼帘的菜单选择和提示可以选择do...while()和switch语句相结合来打印出整个框架体系 另外因为switch语句中case 1,case2...这样的数字不好看我们可以采用枚举变量来定义         枚举的关键字是enum 在括号内部注意每个成员名后面要加逗号同时别忘了括号外面的分号 枚举内部的成员被依次赋值为0,1,2 我们假如将female赋值为1secret就被赋值为2male赋值为0         枚举的优点 1.增加代码的可读性和可维护性 2. 和 #define 定义的标识符比较枚举有类型检查更加严谨。 3. 防止了命名污染封装 4. 便于调试 5. 使用方便一次可以定义多个常量 void menu() {printf(-通讯录-\n);printf(-1.增加联系人-\n);printf(-2.删除联系人-\n);printf(-3.查找联系人-\n);printf(-4.修改联系人-\n);printf(-5.打印通讯录-\n);printf(-6.排序通讯录-\n);printf(-0.退出通讯录-\n);printf(--\n); } enum Option {EXIT, //0ADD,DEL,SEARCH,MODIFY,SHOW,SORT }; int main() {int input 0;do{//菜单menu();printf(请输入操作:);scanf(%d, input);switch (input){case ADD:printf(增加联系人\n);break;case DEL:printf(删除联系人\n);break;case SEARCH:printf(查找联系人\n);break;case MODIFY:printf(修改联系人\n);break;case SHOW:printf(打印联系人\n);break;case SORT:printf(排序联系人\n);break;case EXIT:printf(退出通讯录\n);break;default:printf(输入错误重新输入\n);break;}} while (input);return 0; } 关于通讯录结构体的创建  创建所需的个人信息结构体 利用#define 定义常量有利于维护 #define NAME_MAX 20 #define SEX_MAX 5 #define TELE_MAX 12 #define ADDR_MAX 30typedef struct Peo //个人信息结构体 {char name[NAME_MAX];int age;char sex[SEX_MAX];char tele[TELE_MAX];char addr[ADDR_MAX]; }Peo; 另外还需要创建一个结构体来记录Peo的信息以数组来存放创建变量记录个数  typedef struct Contact {Peo data[DATA_MAX]; //存放个人信息int sz; //记录信息人数 }Contact; 二通讯录的功能实现静态 2.1初始化通讯录 //静态-初始化通讯录 void InitContact(Contact* pc) {assert(pc);pc-sz 0;memset(pc-data, 0, sizeof(pc-data)); } memset来初始化以字节为单位一个字节一个字节的初始化  2.2增加联系人 增加之前先判断是否为满增加成功后还需要将sz记录加入的人数 //增加联系人 void AddContact(Contact* pc) {assert(pc);//判断通讯录是否满了if (pc-sz DATA_MAX){printf(通讯录已满增加失败\n);return;}//增加信息printf(请输入名字:);scanf(%s, pc-data[pc-sz].name);printf(请输入年龄:);scanf(%d, (pc-data[pc-sz].age));printf(请输入性别:);scanf(%s, pc-data[pc-sz].sex);printf(请输入电话:);scanf(%s, pc-data[pc-sz].tele);printf(请输入地址:);scanf(%s, pc-data[pc-sz].addr);//对sz增加pc-sz;printf(增加成功\n); } 2.3打印通讯录 增加联系人后真的在内存中增加与否并不知道我们需要打印出来 先判断是否有信息然后打印标题增加可读性再利用for循环将sz个信息打印出来  -20就代表域宽是20(长度不够20用空格填充)负号代表左对齐默认是右对齐的 //显示所有的联系人 void ShowContact(const Contact* pc) {assert(pc);//判断通讯录内是否有信息if (pc-sz 0){printf(打印失败通讯录为空\n);return;}//打印//打印标题printf(%-20s%-5s%-5s%-12s%-30s\n, 名字, 年龄, 性别, 电话, 地址);//打印信息int i 0;for (i 0; i pc-sz; i){//打印每个人的信息printf(%-20s%-5d%-5s%-12s%-30s\n,pc-data[i].name, pc-data[i].age, pc-data[i].sex, pc-data[i].tele, pc-data[i].addr);} } 2.4删除联系人 先判断通讯录是否有信息通过名字来查找是否存在此人封装函数因为我们在查找联系人修改联系人中也会用到此功能。查找到此人返回sz位置没有此人返回-1 通过for循环假如要删除人为 tmp的信息就只需要把tmp后的数据往前移动覆盖掉tmp位置的信息就可以了如果要删除最后一个人则直接sz--;可以不进行访问算是删除了删除成功后就把sz--说明数组里的有效数据减1 //通过名字查找被删除人 static int FindByName(Contact* pc, char* name) {assert(pc);int i 0;for (i 0; i pc-sz; i){if (strcmp(pc-data[i].name, name) 0){return i;}}return -1;//找不到 } //删除联系人 void DelContact(Contact* pc) {assert(pc);//判断是否为空if (pc-sz 0){printf(删除失败通讯录为空\n);return;}//查找是否存在此人char name[NAME_MAX];printf(请输入被删除人名字:\n);scanf(%s, name);//查找此人存在返回位置不存在返回-1int ret FindByName(pc,name);if (ret -1){printf(要删除的人不存在\n);return;}//删除覆盖此人for (int i ret; i pc-sz - 1; i) //sz-1 是防止执行体越界如果要删除的是最后一个元素通过sz--直接不访问{pc-data[i] pc-data[i 1];}pc-sz --;printf(删除成功\n); } 2.5 查找联系人 跟删除同理先查找是否存在此人查找到了返回下标打印出来即可  //查找联系人 void FindContact(Contact* pc) {assert(pc);//判断是否为空if (pc-sz 0){printf(查找失败通讯录为空\n);return;}//查找此人存在返回位置不存在返回-1char name[NAME_MAX];printf(请输入被查找人名字:\n);scanf(%s, name);int ret FindByName(pc, name);if (ret -1){printf(要查找的人不存在\n);return;}//显示出来printf(%-20s%-5s%-5s%-12s%-30s\n, 名字, 年龄, 性别, 电话, 地址);printf(%-20s%-5d%-5s%-12s%-30s\n,pc-data[ret].name, pc-data[ret].age, pc-data[ret].sex, pc-data[ret].tele, pc-data[ret].addr); } 2.6修改联系人  查找到此人位置记录返回通过该位置进行修改  //修改联系人 void ModifyContact(Contact* pc) {assert(pc);//判断是否为空if (pc-sz 0){printf(修改失败通讯录为空\n);return;}//查找此人存在返回位置不存在返回-1char name[NAME_MAX];printf(请输入被修改人名字:\n);scanf(%s, name);int ret FindByName(pc, name);if (ret -1){printf(要查找的人不存在\n);return;}//修改printf(请输入名字:);scanf(%s, pc-data[ret].name);printf(请输入年龄:);scanf(%d, (pc-data[ret].age));printf(请输入性别:);scanf(%s, pc-data[ret].sex);printf(请输入电话:);scanf(%s, pc-data[ret].tele);printf(请输入地址:);scanf(%s, pc-data[ret].addr);printf(修改成功\n); } 2.7排序联系人 利用qsort快速排序然后我们以名字strcmp函数来比较 //目录排序 //void qsort(void* base, size_t num, size_t size, // int (*compar)(const void*, const void*)); int cmpare(const void* p1, const void* p2) {return strcmp(((Peo*)p1)-name, ((Peo*)p2)-name); }void SortContact(Contact* pc) {qsort(pc-data, pc-sz, sizeof(Peo), cmpare); } 三通讯录优化——动态内存 3.1通讯录的创建 增加变量capacity——用来记录通讯录容量 利用指针动态创建内存结合malloc,realloc,calloc typedef struct Contact {Peo* data; //存放数据int sz; //记录信息人数int capacity; //记录的是通讯录的当前容量 }Contact; 3.2初始化通讯录  利用calloc 开辟动态空间给data  #define DEFAULT_SZ 3 //默认容量 #define DEFAULT_INC 2 //扩容量//动态版本的初始化 void InitContact(Contact* pc) {assert(pc);pc-sz 0;pc-capacity DEFAULT_SZ; pc-data calloc(pc-capacity, sizeof(Peo)); if (pc-data NULL){perror(InitContact-calloc);return;} } 3.3增加联系人  利用realloc来进行动态扩容存放到临时变量ptr里开辟成功给data //检查是否需要扩容 void CheckCapacity(Contact* pc) {if (pc-sz pc-capacity){Peo* ptr (Peo*)realloc(pc-data, (pc-capacity DEFAULT_INC) * sizeof(Peo));if (ptr ! NULL){pc-data ptr;pc-capacity DEFAULT_INC;printf(增容成功\n);}else{perror(AddContact-realloc);return;}} } //增加联系人 void AddContact(Contact* pc) {assert(pc);//增加容量CheckCapacity(pc);//增加信息printf(请输入名字:);scanf(%s, pc-data[pc-sz].name);printf(请输入年龄:);scanf(%d, (pc-data[pc-sz].age));printf(请输入性别:);scanf(%s, pc-data[pc-sz].sex);printf(请输入电话:);scanf(%s, pc-data[pc-sz].tele);printf(请输入地址:);scanf(%s, pc-data[pc-sz].addr);pc-sz;printf(增加成功\n); }3.4清空通讯录  因为涉及到了动态开辟所以使用后要进行free空间 防止内存泄漏 写到EXIT退出通讯录里面让它退出直接调用这个清空销毁函数就算不销毁最终程序结束也会自动销毁 void DestroyContact(Contact* pc) {free(pc-data);pc-data NULL;pc-sz 0;pc-capacity 0; } 四通讯录优化——文件版本 4.1退出保存信息到文件 使用文件操作涉及到了文件缓冲区 ANSIC 标准采用“缓冲文件系统”处理的数据文件的所谓缓冲文件系统是指系统自动地在内存中为程序 中每一个正在使用的文件开辟一块“文件缓冲区”。 ① 从内存向磁盘输出数据会先送到内存中的缓冲区装满缓冲区后才一起送到磁盘上。 ② 从磁盘向计算机读入数据则从磁盘文件中读取数据输入到内存缓 冲区充满缓冲区然后再从缓冲区逐个地将数据送到程序数据区程序变量等。 ③ 缓冲区的大小根据C编译系统决定的。 因为有缓冲区的存在C语言在操作文件的时候需要做刷新缓冲区或者在文件操作结束的时候关闭文件。 如果不做可能导致读写文件的问题。 先把信息存储起来后在执行销毁并退出  //保存信息到文件 void SaveContact(Contact* pc) {FILE* pf fopen(contact.txt, wb); //二进制读文件if (pf NULL){perror(SaveContact);return;}//写信息到文件int i 0;for (i 0; i pc-sz; i){//fwrite((pc-data[i]), sizeof(PeoInfo), 1, pf);fwrite(pc-data i, sizeof(Peo), 1, pf);}fclose(pf);pf NULL; } 4.2初始化时加载文件信息 将信息加载到文件当中 在初始化阶段加载文件信息 void CheckCapacity(Contact* pc);//检查上次保存的信息是否需要扩容 void LoadContact(Contact* pc) {FILE* pf fopen(contact.txt, rb); //以二进制读文件if (pf NULL){perror(LoadContact);return;}//读文件Peo tmp { 0 }; //临时变量while (fread(tmp, sizeof(Peo), 1, pf)){CheckCapacity(pc);pc-data[pc-sz] tmp;pc-sz;}fclose(pf);pf NULL; }//文件版本的初始化函数 void InitContact(Contact* pc) {assert(pc);pc-sz 0;pc-capacity DEFAULT_SZ;pc-data calloc(pc-capacity, sizeof(Peo));if (pc-data NULL){perror(InitContact-calloc);return;}//加载文件中的信息到通讯录LoadContact(pc); } 五整体代码 test.c #define _CRT_SECURE_NO_WARNINGS 1 #includestdio.h #include contact.h void menu() {printf(-通讯录-\n);printf(-1.增加联系人-\n);printf(-2.删除联系人-\n);printf(-3.查找联系人-\n);printf(-4.修改联系人-\n);printf(-5.打印通讯录-\n);printf(-6.排序通讯录-\n);printf(-0.退出通讯录-\n);printf(--\n); } enum Option {EXIT, //0ADD,DEL,SEARCH,MODIFY,SHOW,SORT }; int main() {int input 0;Contact con; //创建通讯录//初始化通讯录InitContact(con);do{//菜单menu();printf(请输入操作:);scanf(%d, input);switch (input){case ADD:printf(增加联系人\n);AddContact(con);break;case DEL:printf(删除联系人\n);DelContact(con);break;case SEARCH:printf(查找联系人\n);FindContact(con);break;case MODIFY:printf(修改联系人\n);ModifyContact(con);break;case SHOW:printf(打印联系人\n);ShowContact(con);break;case SORT:printf(排序联系人\n);SortContact(con);break;case EXIT:printf(退出通讯录\n);SaveContact(con);DestroyContact(con);break;default:printf(输入错误重新输入\n);break;}} while (input);return 0; } contact.c #define _CRT_SECURE_NO_WARNINGS 1 #include contact.h静态-初始化通讯录 //void InitContact(Contact* pc) //{ // assert(pc); // pc-sz 0; // memset(pc-data, 0, sizeof(pc-data)); //} 动态版本的初始化 //void InitContact(Contact* pc) //{ // assert(pc); // pc-sz 0; // pc-capacity DEFAULT_SZ; // pc-data calloc(pc-capacity, sizeof(Peo)); // if (pc-data NULL) // { // perror(InitContact-calloc); // return; // } //} void CheckCapacity(Contact* pc);//检查上次保存的信息是否需要扩容 void LoadContact(Contact* pc) {FILE* pf fopen(contact.txt, rb);if (pf NULL){perror(LoadContact);return;}//读文件Peo tmp { 0 };while (fread(tmp, sizeof(Peo), 1, pf)){CheckCapacity(pc);pc-data[pc-sz] tmp;pc-sz;}fclose(pf);pf NULL; }//文件版本的初始化函数 void InitContact(Contact* pc) {assert(pc);pc-sz 0;pc-capacity DEFAULT_SZ;pc-data calloc(pc-capacity, sizeof(Peo));if (pc-data NULL){perror(InitContact-calloc);return;}//加载文件中的信息到通讯录LoadContact(pc); } // 静态增加联系人 //void AddContact(Contact* pc) //{ // assert(pc); // //判断通讯录是否满了 // if (pc-sz DATA_MAX) // { // printf(通讯录已满增加失败\n); // return; // } // //增加信息 // printf(请输入名字:); // scanf(%s, pc-data[pc-sz].name); // printf(请输入年龄:); // scanf(%d, (pc-data[pc-sz].age)); // printf(请输入性别:); // scanf(%s, pc-data[pc-sz].sex); // printf(请输入电话:); // scanf(%s, pc-data[pc-sz].tele); // printf(请输入地址:); // scanf(%s, pc-data[pc-sz].addr); // //对sz增加 // pc-sz; // printf(增加成功\n); //} void DestroyContact(Contact* pc) {free(pc-data);pc-data NULL;pc-sz 0;pc-capacity 0; } //检查是否需要扩容 void CheckCapacity(Contact* pc) {if (pc-sz pc-capacity){Peo* ptr (Peo*)realloc(pc-data, (pc-capacity DEFAULT_INC) * sizeof(Peo));if (ptr ! NULL){pc-data ptr;pc-capacity DEFAULT_INC;printf(增容成功\n);}else{perror(AddContact-realloc);return;}} } //增加联系人 void AddContact(Contact* pc) {assert(pc);//增加容量CheckCapacity(pc);//增加信息printf(请输入名字:);scanf(%s, pc-data[pc-sz].name);printf(请输入年龄:);scanf(%d, (pc-data[pc-sz].age));printf(请输入性别:);scanf(%s, pc-data[pc-sz].sex);printf(请输入电话:);scanf(%s, pc-data[pc-sz].tele);printf(请输入地址:);scanf(%s, pc-data[pc-sz].addr);pc-sz;printf(增加成功\n); }//显示所有的联系人 void ShowContact(const Contact* pc) {assert(pc);//判断通讯录内是否有信息if (pc-sz 0){printf(打印失败通讯录为空\n);return;}//打印//打印标题printf(%-20s%-5s%-5s%-12s%-30s\n, 名字, 年龄, 性别, 电话, 地址);//打印信息int i 0;for (i 0; i pc-sz; i){//打印每个人的信息printf(%-20s%-5d%-5s%-12s%-30s\n,pc-data[i].name, pc-data[i].age, pc-data[i].sex, pc-data[i].tele, pc-data[i].addr);} }//通过名字查找被删除人 static int FindByName(Contact* pc, char* name) {assert(pc);int i 0;for (i 0; i pc-sz; i){if (strcmp(pc-data[i].name, name) 0){return i;}}return -1;//找不到 } //删除联系人 void DelContact(Contact* pc) {assert(pc);//判断是否为空if (pc-sz 0){printf(删除失败通讯录为空\n);return;}//查找是否存在此人char name[NAME_MAX];printf(请输入被删除人名字:\n);scanf(%s, name);//查找此人存在返回位置不存在返回-1int ret FindByName(pc,name);if (ret -1){printf(要删除的人不存在\n);return;}//删除覆盖此人for (int i ret; i pc-sz - 1; i) //sz-1 是防止执行体越界如果要删除的是最后一个元素通过sz--直接不访问{pc-data[i] pc-data[i 1];}pc-sz--;printf(删除成功\n); }//查找联系人 void FindContact(Contact* pc) {assert(pc);//判断是否为空if (pc-sz 0){printf(查找失败通讯录为空\n);return;}//查找此人存在返回位置不存在返回-1char name[NAME_MAX];printf(请输入被查找人名字:\n);scanf(%s, name);int ret FindByName(pc, name);if (ret -1){printf(要查找的人不存在\n);return;}//显示出来printf(%-20s%-5s%-5s%-12s%-30s\n, 名字, 年龄, 性别, 电话, 地址);printf(%-20s%-5d%-5s%-12s%-30s\n,pc-data[ret].name, pc-data[ret].age, pc-data[ret].sex, pc-data[ret].tele, pc-data[ret].addr); }//修改联系人 void ModifyContact(Contact* pc) {assert(pc);//判断是否为空if (pc-sz 0){printf(修改失败通讯录为空\n);return;}//查找此人存在返回位置不存在返回-1char name[NAME_MAX];printf(请输入被修改人名字:\n);scanf(%s, name);int ret FindByName(pc, name);if (ret -1){printf(要查找的人不存在\n);return;}//修改printf(请输入名字:);scanf(%s, pc-data[ret].name);printf(请输入年龄:);scanf(%d, (pc-data[ret].age));printf(请输入性别:);scanf(%s, pc-data[ret].sex);printf(请输入电话:);scanf(%s, pc-data[ret].tele);printf(请输入地址:);scanf(%s, pc-data[ret].addr);printf(修改成功\n); }//目录排序 //void qsort(void* base, size_t num, size_t size, // int (*compar)(const void*, const void*)); int cmpare(const void* p1, const void* p2) {return strcmp(((Peo*)p1)-name, ((Peo*)p2)-name); }void SortContact(Contact* pc) {qsort(pc-data, pc-sz, sizeof(Peo), cmpare); } //保存信息到文件 void SaveContact(Contact* pc) {FILE* pf fopen(contact.txt, wb); //二进制读文件if (pf NULL){perror(SaveContact);return;}//写信息到文件int i 0;for (i 0; i pc-sz; i){//fwrite((pc-data[i]), sizeof(PeoInfo), 1, pf);fwrite(pc-data i, sizeof(Peo), 1, pf);}fclose(pf);pf NULL; } contact.h #pragma once #includestdio.h #includeassert.h #includestring.h #define NAME_MAX 20 #define SEX_MAX 5 #define TELE_MAX 12 #define ADDR_MAX 30#define DATA_MAX 100#define DEFAULT_SZ 3 //默认容量 #define DEFAULT_INC 2 //扩容量typedef struct Peo //个人信息结构体 {char name[NAME_MAX];int age;char sex[SEX_MAX];char tele[TELE_MAX];char addr[ADDR_MAX]; }Peo; typedef struct Contact {Peo* data;//存放数据int sz; //记录信息人数int capacity;//记录的是通讯录的当前容量 }Contact;//初始化通讯录 //void InitContact(Contact* pc);//动态版本的初始化 void InitContact(Contact* pc);//增加联系人 void AddContact(Contact* pc);//显示所有的联系人 void ShowContact(const Contact* pc);//删除联系人 void DelContact(Contact* pc);//查找联系人 void FindContact(Contact* pc);//修改联系人 void ModifyContact(Contact* pc);//排序联系人 void SortContact(Contact* pc);//销毁通讯录 void DestroyContact(Contact* pc);//保存信息到文件 void SaveContact(Contact* pc);//加载文件信息到通讯录 void LoadContact(Contact* pc); 以上就是利用三章知识点结合做的小项目——通讯录 文中不足之处还望指点感激不尽
http://www.hkea.cn/news/14574674/

相关文章:

  • 官网网站建设需求文档丹阳火车站对面规划
  • 求西北地区网站建设专家 西安沉睡网络 官方网址?做房地产用什么网站好
  • 建设二手商品网站总结黑龙江省城乡和住房建设厅网站首页
  • 做网站用模版山东省建设协会网站
  • 济南公司网站建设公司python如何建网站建设
  • 做彩页素材的网站搜索引擎优化的英文
  • 文化网站前置审批wordpress精仿卢松松
  • 网站建设 技术方案邢台网红排行榜
  • 信息网站开发网上注册公司系统
  • 如何将软件上传到公开网站硬件开发工程师面试题
  • 百度云网盘深圳知名网络优化公司
  • 腾讯云域名查询中山网站seo
  • wordpress站内信群发生成链接的软件
  • 在原备案号下增加新网站wordpress怎么用万网域名
  • 广州教育学会网站建设wordpress支持什么语言包
  • 网站建设 企业文化团购网站怎么做
  • 设计网站建设方案网络营销为导向的企业网站
  • 青海网站建设优化微信公众号平台手机端
  • 做全景效果图的网站烟台网站建设的公司
  • 服务器图片企业网站seo
  • 福建建设局网站河南郑州特产
  • 制作一个公司网站的流程响应式网站和营销型网站
  • 做淘宝店头的网站微信里怎么进入自己的公众号
  • 网站加图标属于您自己的网站建设
  • 怎么利用代码做网站企业网站维护是指
  • 网站建设的大公司有哪些菜单宣传网站怎么做
  • 做网站怎样建立服务器西安SEO网站推广
  • 借用备案网站跳转做淘宝客网站推广软件价格
  • 云南网站建设维修公司哪家好app下载网站免费
  • 安徽网站优化好不好免费crm软件