使用angular2框架做的网站,网络服务合同需要缴纳印花税吗,网站国内空间价格,中国交通建设集团有限公司级别前言#xff1a;在大多数高校内#xff0c;都是通过设计一个通讯录管理系统来作为c语言课程设计#xff0c;通过一个具体的系统设计将我们学习过的结构体和函数等知识糅合起来#xff0c;可以很好的锻炼学生的编程思维#xff0c;本文旨在为通讯录管理系统的设计提供思路和… 前言在大多数高校内都是通过设计一个通讯录管理系统来作为c语言课程设计通过一个具体的系统设计将我们学习过的结构体和函数等知识糅合起来可以很好的锻炼学生的编程思维本文旨在为通讯录管理系统的设计提供思路和示例讲解并且对如何动态的分配内存空间使得程序更高效的运行进行了讲解 本文是在基础的通讯录管理系统上进行改进文末有完整代码欢迎大家使用如果对于基础的通讯录管理系统有什么不懂的地方可以参考笔者的上一篇文章里面有详细的万字解读 c语言通讯录管理系统增删查改 目录 一.基础静态版本 改进前
头文件部分
函数实现部分
主函数部分
二.结构体的更改
三.扩容的设计
四.释放空间
五.最终完整代码 改进后
头文件部分
函数的实现部分
主函数部分 一.基础静态版本 改进前
这里我们给出基础版本的代码然后本文后续内容都是基于此进行改进 我们分为 3 个文件来设计 Contact.h 包含头文件的声明对函数的声明以及宏的申明Contact.cpp 通讯录管理系统中具体每一个函数的实现test.cpp 主函数根据用户的选择进行调用相应的函数 头文件部分Contact.h
#pragma once
#includestdio.h
#includeassert.h
#includestring.h#define Name_Max 20
#define Tel_Number 12
#define Sex_Max 5
#define Address_Max 30
#define Contact_Max 100//联系人结构体
typedef struct PeopleInformation
{char name[Name_Max];char telnumber[Tel_Number];int age;char sex[Sex_Max];char address[Address_Max];
}PeoInfor;//通讯录结构体
typedef struct Contact
{PeoInfor data[Contact_Max];//结构体数组存放联系人结构体int size;//记录当前通讯录中有多少个联系人
}Contact;//目录
void menu();//初始化通讯录
void InitContact(Contact* cp);//增加联系人
void AddContact(Contact* cp);//删除联系人
void DelContact(Contact* cp);//通过姓名进行查找联系人
int FindPeople(Contact* cp, char name[]);//展示全部通讯录信息
void ShowContact(const Contact* cp);//查询联系人
void SeachPeople(Contact* cp);//修改联系人信息
void ModifyContact(Contact* cp);
函数实现部分Contact.cpp
#define _CRT_SECURE_NO_WARNINGS 1
#include Contact.hvoid menu()
{printf(\n);printf(-----------------------------\n);printf(--- 1.添加联系人 -----\n);printf(--- 2.删除联系人 -----\n);printf(--- 3.查找联系人 -----\n);printf(--- 4.修改联系人信息 -----\n);printf(--- 5.显示全部信息 -----\n);printf(--- 0.退出通讯录 -----\n);printf(-----------------------------\n);
}//初始化通讯录
void InitContact(Contact* cp)
{//判断非空assert(cp);cp-size 0;memset(cp-data, 0, sizeof(cp-data));
}//增加联系人
void AddContact(Contact* cp)
{//判断非空assert(cp);//判断未满if (cp-size Contact_Max){printf(通讯录已满无法再添加新的联系人\n);return;}printf(请输入要添加的联系人的姓名\n);scanf(%s, cp-data[cp-size].name);printf(请输入要添加的联系人的电话号\n);scanf(%s, cp-data[cp-size].telnumber);printf(请输入要添加的联系人的年龄\n);scanf(%d, (cp-data[cp-size].age));printf(请输入要添加的联系人的性别\n);scanf(%s, cp-data[cp-size].sex);printf(请输入要添加的联系人的住址\n);scanf(%s, cp-data[cp-size].address);cp-size;printf(添加成功\n);
}//通过姓名进行查找联系人
int FindPeople(Contact* cp, char name[])
{assert(cp);for (int i 0; i cp-size; i){if (strcmp(cp-data[i].name, name) 0){return i;}}return -1;
}//删除联系人
void DelContact(Contact* cp)
{assert(cp);char name[Name_Max];if (cp-size 0){printf(通讯录为空无需删除\n);return;}printf(请输入选择删除的联系人的姓名\n);scanf(%s, name);int ret FindPeople(cp, name);if (ret -1){printf(要删除的联系人不存在\n);return;}for (int i ret; i cp-size-1 ; i){cp-data[i] cp-data[i 1];}cp-size--;printf(删除成功\n);
}//查询联系人
void SeachPeople(Contact* cp)
{assert(cp);char name[Name_Max];if (cp-size 0){printf(通讯录为空\n);return;}printf(请输入选择查找的联系人的姓名\n);scanf(%s, name);int ret FindPeople(cp, name);if (ret -1){printf(要查找的联系人不存在\n);return;}//名字 年龄 性别 电话 地址//xxx xxx xxx xxx xxxprintf(%-10s%-5s%-5s%-12s%-30s\n, 名字, 年龄, 性别, 电话, 地址);//打印个人的信息printf(%-10s%-5d%-5s%-12s%-30s\n, cp-data[ret].name, cp-data[ret].age, cp-data[ret].sex, cp-data[ret].telnumber, cp-data[ret].address);
}//展示全部通讯录信息
void ShowContact(const Contact* cp)
{assert(cp);if (cp-size 0){printf(通讯录为空\n);return;}//名字 年龄 性别 电话 地址//xxx xxx xxx xxx xxxprintf(%-10s%-5s%-5s%-12s%-30s\n, 名字, 年龄, 性别, 电话, 地址);for (int i 0; i cp-size; i){//打印每个人的信息printf(%-10s%-5d%-5s%-12s%-30s\n,cp-data[i].name, cp-data[i].age, cp-data[i].sex, cp-data[i].telnumber, cp-data[i].address);}
}//修改联系人信息
void ModifyContact(Contact* cp)
{assert(cp);char name[Name_Max];if (cp-size 0){printf(通讯录为空\n);return;}printf(请输入选择修改的联系人的姓名\n);scanf(%s, name);int ret FindPeople(cp, name);if (ret -1){printf(要修改的联系人信息不存在\n);return;}printf(请输入要修改的联系人的姓名\n);scanf(%s, cp-data[ret].name);printf(请输入要修改的联系人的电话号\n);scanf(%s, cp-data[ret].telnumber);printf(请输入要修改的联系人的年龄\n);scanf(%d, (cp-data[ret].age));printf(请输入要修改的联系人的性别\n);scanf(%s, cp-data[ret].sex);printf(请输入要修改的联系人的住址\n);scanf(%s, cp-data[ret].address);printf(修改成功\n);
}
主函数部分test.cpp
#define _CRT_SECURE_NO_WARNINGS 1
#include Contact.h//枚举增加程序的可读性
enum options
{EXIT,ADD,DEL,SEACH,MODIFY,SHOW
};int main()
{int input 0;//创建通讯录Contact con;//初始化通讯录InitContact(con);do{menu();printf(请输入你的选择 );scanf(%d, input);switch (input){//增加联系人信息case ADD:AddContact(con);break;//删除联系人信息case DEL:DelContact(con);break;//查找某个联系人的信息case SEACH:SeachPeople(con);break;//修改某个联系人的信息case MODIFY:ModifyContact(con);break;//展示通讯录内的每一个联系人的信息case SHOW:ShowContact(con);break;//退出通讯录管理系统case EXIT:printf(通讯录已退出\n);break;//预防非法输入default:printf(输入错误请重新输入\n);break;}}while(input);return 0;
}
二.结构体的更改 动态的分配内存就意味着通讯录这个结构体要动态的分配内存根据通讯录内的信息进行分配所以我们在这里对于通讯录结构体进行更改
//通讯录结构体
typedef struct Contact
{PeoInfor* data;//结构体数组存放联系人结构体int size;//记录当前通讯录中有多少个联系人int capacity;//记录当前存放的容量
}Contact;在这里我们将 data 从一个结构体数组改成了结构体指针然后后续再使用 这个指针指向我们动态开辟的内存就完成了我们的需求设计 并且新增了个变量 capacity 用来记录当前通讯录内的最大容量当联系人的数量和容量相同的时候也就是通讯录满容的时候我们再使用 realloc 重新分配新的内存空间 三.扩容的设计 我们封装一个函数方便我们添加新的联系人的时候进行扩容先判断当前通讯录是否已满如果满了就进行扩容每一次扩容扩展 2 个联系人结构体的大小 首先是判断部分当当前通讯录的容量等于通讯录内实际存放的数据的大小的时候我们就判定为通讯录已满然后我们使用 realloc 开辟新的空间比之前大 2 个联系人结构体的大小 为了程序的健全性我们也要判断开辟空间是否成功如果成功就通过 ptr指针 指向联系人的数据部分用 data 接收如果开辟失败我们就打印报错信息 void CheckContact(Contact* cp)
{if (cp-size cp-capacity){PeoInfor* ptr (PeoInfor*)realloc(cp-data, (cp-capacity 2) * sizeof(PeoInfor));if (ptr ! NULL){cp-data ptr;cp-capacity 2;printf(增容成功\n);}else{perror(AddContact-realloc);return;}}
}
四.释放空间 由程序员申请开辟的空间也应当由程序员设置进行释放在这个通讯录管理系统中也是如此我们需要找到合适的释放位置也就是当用户退出通讯录的时候我们手动进行对开辟的空间进行释放以避免造成内存泄漏 那我们这里就封装一个释放空间的函数
//销毁通讯录
void DestoryContact(Contact* cp)
{free(cp-data);cp-data NULL;cp-size 0;cp-capacity 0;
}五.最终完整代码 改进后
头文件部分Contact.h
#pragma once
#pragma once
#includestdio.h
#includeassert.h
#includestring.h
#includestdlib.h#define Name_Max 20
#define Tel_Number 12
#define Sex_Max 5
#define Address_Max 30
#define Contact_Max 100
#define Contact_SZ 3//联系人结构体
typedef struct PeopleInformation
{char name[Name_Max];char telnumber[Tel_Number];int age;char sex[Sex_Max];char address[Address_Max];
}PeoInfor;//通讯录结构体
typedef struct Contact
{PeoInfor* data;//结构体数组存放联系人结构体int size;//记录当前通讯录中有多少个联系人int capacity;//记录当前存放的容量
}Contact;//目录
void menu();//初始化通讯录
void InitContact(Contact* cp);//增加联系人
void AddContact(Contact* cp);//删除联系人
void DelContact(Contact* cp);//通过姓名进行查找联系人
int FindPeople(Contact* cp, char name[]);//展示全部通讯录信息
void ShowContact(const Contact* cp);//查询联系人
void SeachPeople(Contact* cp);//修改联系人信息
void ModifyContact(Contact* cp);//扩容
void CheckContact(Contact* cp);//销毁通讯录
void DestoryContact(Contact* cp);
函数的实现部分 Contact.cpp
#define _CRT_SECURE_NO_WARNINGS 1
#include Contact.hvoid menu()
{printf(\n);printf(-----------------------------\n);printf(--- 1.添加联系人 -----\n);printf(--- 2.删除联系人 -----\n);printf(--- 3.查找联系人 -----\n);printf(--- 4.修改联系人信息 -----\n);printf(--- 5.显示全部信息 -----\n);printf(--- 0.退出通讯录 -----\n);printf(-----------------------------\n);
}//初始化通讯录
void InitContact(Contact* cp)
{//判断非空assert(cp);cp-size 0;cp-capacity Contact_SZ;cp-data (PeoInfor*)calloc(cp-capacity, sizeof(PeoInfor));if (cp-data NULL){perror(InitContact-calloc);return;}
}void CheckContact(Contact* cp)
{if (cp-size cp-capacity){PeoInfor* ptr (PeoInfor*)realloc(cp-data, (cp-capacity 2) * sizeof(PeoInfor));if (ptr ! NULL){cp-data ptr;cp-capacity 2;printf(增容成功\n);}else{perror(AddContact-realloc);return;}}
}//增加联系人
void AddContact(Contact* cp)
{//判断非空assert(cp);//判断满后扩容CheckContact(cp);printf(请输入要添加的联系人的姓名\n);scanf(%s, cp-data[cp-size].name);printf(请输入要添加的联系人的电话号\n);scanf(%s, cp-data[cp-size].telnumber);printf(请输入要添加的联系人的年龄\n);scanf(%d, (cp-data[cp-size].age));printf(请输入要添加的联系人的性别\n);scanf(%s, cp-data[cp-size].sex);printf(请输入要添加的联系人的住址\n);scanf(%s, cp-data[cp-size].address);cp-size;printf(添加成功\n);
}//通过姓名进行查找联系人
int FindPeople(Contact* cp, char name[])
{assert(cp);for (int i 0; i cp-size; i){if (strcmp(cp-data[i].name, name) 0){return i;}}return -1;
}//删除联系人
void DelContact(Contact* cp)
{assert(cp);char name[Name_Max];if (cp-size 0){printf(通讯录为空无需删除\n);return;}printf(请输入选择删除的联系人的姓名\n);scanf(%s, name);int ret FindPeople(cp, name);if (ret -1){printf(要删除的联系人不存在\n);return;}for (int i ret; i cp-size - 1; i){cp-data[i] cp-data[i 1];}cp-size--;printf(删除成功\n);
}//查询联系人
void SeachPeople(Contact* cp)
{assert(cp);char name[Name_Max];if (cp-size 0){printf(通讯录为空\n);return;}printf(请输入选择查找的联系人的姓名\n);scanf(%s, name);int ret FindPeople(cp, name);if (ret -1){printf(要查找的联系人不存在\n);return;}//名字 年龄 性别 电话 地址//xxx xxx xxx xxx xxxprintf(%-10s%-5s%-5s%-12s%-30s\n, 名字, 年龄, 性别, 电话, 地址);//打印个人的信息printf(%-10s%-5d%-5s%-12s%-30s\n, cp-data[ret].name, cp-data[ret].age, cp-data[ret].sex, cp-data[ret].telnumber, cp-data[ret].address);
}//展示全部通讯录信息
void ShowContact(const Contact* cp)
{assert(cp);if (cp-size 0){printf(通讯录为空\n);return;}//名字 年龄 性别 电话 地址//xxx xxx xxx xxx xxxprintf(%-10s%-5s%-5s%-12s%-30s\n, 名字, 年龄, 性别, 电话, 地址);for (int i 0; i cp-size; i){//打印每个人的信息printf(%-10s%-5d%-5s%-12s%-30s\n, cp-data[i].name, cp-data[i].age, cp-data[i].sex, cp-data[i].telnumber, cp-data[i].address);}
}//修改联系人信息
void ModifyContact(Contact* cp)
{assert(cp);char name[Name_Max];if (cp-size 0){printf(通讯录为空\n);return;}printf(请输入选择修改的联系人的姓名\n);scanf(%s, name);int ret FindPeople(cp, name);if (ret -1){printf(要修改的联系人信息不存在\n);return;}printf(请输入要修改的联系人的姓名\n);scanf(%s, cp-data[ret].name);printf(请输入要修改的联系人的电话号\n);scanf(%s, cp-data[ret].telnumber);printf(请输入要修改的联系人的年龄\n);scanf(%d, (cp-data[ret].age));printf(请输入要修改的联系人的性别\n);scanf(%s, cp-data[ret].sex);printf(请输入要修改的联系人的住址\n);scanf(%s, cp-data[ret].address);printf(修改成功\n);
}//销毁通讯录
void DestoryContact(Contact* cp)
{free(cp-data);cp-data NULL;cp-size 0;cp-capacity 0;
}主函数部分test.cpp
#define _CRT_SECURE_NO_WARNINGS 1
#include Contact.h//枚举增加程序的可读性
enum options
{EXIT,ADD,DEL,SEACH,MODIFY,SHOW
};int main()
{int input 0;//创建通讯录Contact con;//初始化通讯录InitContact(con);do{menu();printf(请输入你的选择 );scanf(%d, input);switch (input){//增加联系人信息case ADD:AddContact(con);break;//删除联系人信息case DEL:DelContact(con);break;//查找某个联系人的信息case SEACH:SeachPeople(con);break;//修改某个联系人的信息case MODIFY:ModifyContact(con);break;//展示通讯录内的每一个联系人的信息case SHOW:ShowContact(con);break;//退出通讯录管理系统case EXIT:DestoryContact(con);printf(通讯录已退出\n);break;//预防非法输入default:printf(输入错误请重新输入\n);break;}} while (input);return 0;
} 本次分享就到此为止了感谢您的支持如有错误欢迎积极指正