综合性门户网站列举,wordpress搬家更换域名,wordpress修改首页模板,湖南领企信息科技有限公司一、思路
1.文件
这里由于通讯录实现代码较长#xff0c;因此分三个文件进行#xff0c;contact.c用于实现通讯录主体代码#xff0c;声明各项头文件用contact.h实现#xff0c;测试用test.c
二.功能
增加联系人删除联系人修改联系人查找指定联系人排序显示通讯录的信息…一、思路
1.文件
这里由于通讯录实现代码较长因此分三个文件进行contact.c用于实现通讯录主体代码声明各项头文件用contact.h实现测试用test.c
二.功能
增加联系人删除联系人修改联系人查找指定联系人排序显示通讯录的信息
三.分步实现代码
1.初始化结构体
通讯录中每个联系人的信息至少包括姓名、年龄、性别、电话、住址。 我们可以将这些内容定义为一个结构体因为每个联系人的信息都有这几个要素
#define NAME_MAX 20
#define SEX_MAX 20
#define TELE_MAX 20
#define ADDR_MAX 20typedef struct PeoInfo
{char name[NAME_MAX];int age;char sex[SEX_MAX];char tele[TELE_MAX];char addr[ADDR_MAX];
}PeoInfo;
typedef是定义结构体类型由struct PeoInfo--- PeoInfo 这样后面使用定义变量时类型就直接写PeoInfo就可以了
数组【】里面如果是常量 那就后期想修改是非常不方便的所以我们自己定义NAME_MAX等后期修改起来更加方便。
但当我们操作通讯录联系人时需要知道联系人是否达到上限如果达到则无法再添加联系人
因此我们将联系人的信息与通讯录已有联系人个数联系一同放入结构体避免后续功能需同时传入两个变量
#define MAX 100
typedef struct Contact
{PeoInfo data[MAX];//存放数据int sz;//记录当前通讯录中存放的人的信息个数
}Contact;//通讯录
因此后续访问通讯录信息时即可通过contact访问data然后访问信息。
2.InitContact初始化个人信息的声明
//初始化通讯录
void InitContact(struct Contact* ps)
{memset(ps-data, 0, sizeof(ps-data));//将待用内存空间设置为0ps-size 0;//设置通讯录最初只有0个元素
}3.添加联系人的信息
最初应该通讯录判断已有联系人是否达到上线即用ps-size达到则无法添加否则就输入待添加联系人的信息最后添加完成size
//添加一个联系人的信息
void AddContact(struct Contact* ps)
{if (ps-size 1000){printf(通讯录已满无法添加\n);}//通讯录内联系人已达上限else{printf(请输入姓名:);scanf(%s, ps-data[ps-size].name);printf(请输入年龄:);scanf(%d, (ps-data[ps-size].age));printf(请输入性别:);scanf(%s, ps-data[ps-size].sex);printf(请输入电话:);scanf(%s, ps-data[ps-size].tele);printf(请输入地址:);scanf(%s, ps-data[ps-size].address);ps-size;//通讯录中联系人个数1printf(添加成功\n);}
}4.删除联系人的信息
我们需要用户输入待删除联系人的名字并在通讯录中查找是否存在该名字的联系人。因为后面还会有此相同的操作所以将其封装为一个函数避免代码冗余删除完成就size--
接着就是实现删除我们只需通过输入字符串名字来找到该联系人所在下标记录下来然后来个for循环从后往前覆盖并且防止越界j应该小于size-1。
int FindByName(char name[15],const struct Contact* ps)
{int i 0;for (i 0; i ps-size; i){if (strcmp(ps-data[i].name, name) 0)return i;//找到了返回下标}return -1;//找不到的情况
}//删除一个联系人的信息
void DeleteContact(struct Contact* ps)
{char name[15];printf(请输入要删除联系人的姓名:);scanf(%s, name);//查找int pos FindByName(name, ps);//找到了返回下标没找到返回-1//删除if (pos -1){printf(未找到该联系人\n);}else{int j 0;for (j pos; j ps-size - 1; j){ps-data[j] ps-data[j 1];}//从要删除的联系人位置开始后一位联系人信息覆盖前一个联系人信息printf(删除成功\n);ps-size--;//通讯录中联系人个数-1}
}5.查找指定联系人并打印其信息
首先我们也需要用户输入待查找联系人的名字如果存在此人我们就将其信息打印出来。
//查找指定联系人并打印其信息
void SreachContact(const struct Contact* ps)
{char name[15];printf(请输入要查找联系人的姓名:);scanf(%s, name);int pos FindByName(name, ps);//找到了返回下标没找到返回-1if (pos -1){printf(查无此人\n);}else{printf(%-15s\t%-4s\t%-5s\t%-12s\t%-20s\n, 姓名, 年龄, 性别, 电话, 住址);printf(%-15s\t%-4d\t%-5s\t%-12s\t%-20s\n,ps-data[pos].name,ps-data[pos].age,ps-data[pos].sex,ps-data[pos].tele,ps-data[pos].address);}//打印该联系人的信息内容
}6.修改指定联系人的信息
要修改联系人信息自然也要先在通讯录中找到该联系人如果找到了我们就将该联系人信息重新录入一次就行了。
//修改指定联系人的信息
void ModifyContact(struct Contact* ps)
{char name[15];printf(请输入要修改的联系人的姓名:);scanf(%s, name);int pos FindByName(name, ps);//找到了返回下标没找到返回-1if (pos -1){printf(查无此人\n);}else{printf(请输入姓名:);scanf(%s, ps-data[pos].name);printf(请输入年龄:);scanf(%d, (ps-data[pos].age));printf(请输入性别:);scanf(%s, ps-data[pos].sex);printf(请输入电话:);scanf(%s, ps-data[pos].tele);printf(请输入地址:);scanf(%s, ps-data[pos].address);printf(修改成功\n);}//修改联系人信息即将该联系人信息重新录入
}7.打印通讯录中的全部信息
首先判断通讯录是否为空如果没有联系人那就没有打印的必要了。如果通讯录不为空我们首先打印一排信息栏接下来循环size次即联系人个数次打印每个联系人的信息即可。
//打印通讯录中的全部信息
void ShowContact(const struct Contact* ps)
{if (ps-size 0){printf(通讯录为空\n);}//通讯录中联系人个数为0else{printf(%-15s\t%-4s\t%-5s\t%-12s\t%-20s\n, 姓名, 年龄, 性别, 电话, 住址);//打印信息栏int i 0;for (i 0; i ps-size; i){printf(%-15s\t%-4d\t%-5s\t%-12s\t%-20s\n,ps-data[i].name,ps-data[i].age,ps-data[i].sex,ps-data[i].tele,ps-data[i].address);}//打印通讯录全部信息内容}
}
8.通过名字排序通讯录中联系人的先后顺序
这个排序功能我们可以借助于已有的qosrt函数进行排序只需要写一个自定义的比较函数即可。
//自定义的比较函数
int CmpByName(const void* e1, const void* e2)
{return strcmp((const char*)e1, (const char*)e2);
}//通过名字排序通讯录中联系人的先后顺序
void SortContact(struct Contact* ps)
{qsort(ps-data, ps-size, sizeof(struct PeoInfo), CmpByName);//排序
}四.整体代码
contact.h
#define _CRT_SECURE_NO_WARNINGS 1#define MAX 1000#define MAX_NAME 15
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_ADDRESS 20#include stdio.h
#include string.h
#include stdlib.henum Option
{EXIT,//0ADD,//1DELETE,//2SREACH,//3MODIFY,//4SHOW,//5SORT//6
};//增加代码可读性struct PeoInfo
{char name[MAX_NAME];int age;char sex[MAX_SEX];int tele[MAX_TELE];char address[MAX_ADDRESS];
};//每一个联系人的信息内容//通讯录类型
struct Contact
{struct PeoInfo data[MAX];//存放1000个联系人的信息int size;//记录当前已有联系人的个数
};//初始化通讯录
void InitContact(struct Contact* ps);//添加一个联系人的信息
void AddContact(struct Contact* ps);//删除一个联系人的信息
void DeleteContact(struct Contact* ps);//查找指定联系人并打印其信息
void SreachContact(const struct Contact* ps);//修改指定联系人的信息
void ModifyContact(struct Contact* ps);//打印通讯录中的全部信息
void ShowContact(const struct Contact* ps);//通过名字排序通讯录中联系人的先后顺序
void SortContact(struct Contact* ps);contact.c
#include contact.h//初始化通讯录
void InitContact(struct Contact* ps)
{memset(ps-data, 0, sizeof(ps-data));//将待用内存空间设置为0ps-size 0;//设置通讯录最初只有0个元素
}//添加一个联系人的信息
void AddContact(struct Contact* ps)
{if (ps-size MAX){printf(通讯录已满无法添加\n);}//通讯录内联系人已达上限else{printf(请输入姓名:);scanf(%s, ps-data[ps-size].name);printf(请输入年龄:);scanf(%d, (ps-data[ps-size].age));printf(请输入性别:);scanf(%s, ps-data[ps-size].sex);printf(请输入电话:);scanf(%s, ps-data[ps-size].tele);printf(请输入地址:);scanf(%s, ps-data[ps-size].address);ps-size;//通讯录中联系人个数1printf(添加成功\n);}
}//通过名字查找联系人找到了返回下标没找到返回-1
static int FindByName(char name[MAX_NAME],const struct Contact* ps)
{int i 0;for (i 0; i ps-size; i){if (strcmp(ps-data[i].name, name) 0)return i;//找到了返回下标}return -1;//找不到的情况
}//删除一个联系人的信息
void DeleteContact(struct Contact* ps)
{char name[MAX_NAME];printf(请输入要删除联系人的姓名:);scanf(%s, name);//查找int pos FindByName(name, ps);//找到了返回下标没找到返回-1//删除if (pos -1){printf(查无此人\n);}else{int j 0;for (j pos; j ps-size - 1; j){ps-data[j] ps-data[j 1];}//从要删除的联系人位置开始后一位联系人信息覆盖前一个联系人信息printf(删除成功\n);ps-size--;//通讯录中联系人个数-1}
}//查找指定联系人并打印其信息
void SreachContact(const struct Contact* ps)
{char name[MAX_NAME];printf(请输入要查找联系人的姓名:);scanf(%s, name);int pos FindByName(name, ps);//找到了返回下标没找到返回-1if (pos -1){printf(查无此人\n);}else{printf(%-15s\t%-4s\t%-5s\t%-12s\t%-20s\n, 姓名, 年龄, 性别, 电话, 住址);printf(%-15s\t%-4d\t%-5s\t%-12s\t%-20s\n,ps-data[pos].name,ps-data[pos].age,ps-data[pos].sex,ps-data[pos].tele,ps-data[pos].address);}//打印该联系人的信息内容
}//修改指定联系人的信息
void ModifyContact(struct Contact* ps)
{char name[MAX_NAME];printf(请输入要修改的联系人的姓名:);scanf(%s, name);int pos FindByName(name, ps);//找到了返回下标没找到返回-1if (pos -1){printf(查无此人\n);}else{printf(请输入姓名:);scanf(%s, ps-data[pos].name);printf(请输入年龄:);scanf(%d, (ps-data[pos].age));printf(请输入性别:);scanf(%s, ps-data[pos].sex);printf(请输入电话:);scanf(%s, ps-data[pos].tele);printf(请输入地址:);scanf(%s, ps-data[pos].address);printf(修改成功\n);}//修改联系人信息即将该联系人信息重新录入
}//打印通讯录中的全部信息
void ShowContact(const struct Contact* ps)
{if (ps-size 0){printf(通讯录为空\n);}//通讯录中联系人个数为0else{printf(%-15s\t%-4s\t%-5s\t%-12s\t%-20s\n, 姓名, 年龄, 性别, 电话, 住址);//打印信息栏int i 0;for (i 0; i ps-size; i){printf(%-15s\t%-4d\t%-5s\t%-12s\t%-20s\n,ps-data[i].name,ps-data[i].age,ps-data[i].sex,ps-data[i].tele,ps-data[i].address);}//打印通讯录全部信息内容}
}//自定义的比较函数
int CmpByName(const void* e1, const void* e2)
{return strcmp((const char*)e1, (const char*)e2);
}//通过名字排序通讯录中联系人的先后顺序
void SortContact(struct Contact* ps)
{qsort(ps-data, ps-size, sizeof(struct PeoInfo), CmpByName);//排序
}test.c
#include contact.hvoid menu()
{printf(|-----------------------|\n);printf(| contact |\n);printf(| 1.Add 2.Delete |\n);printf(| 3.Search 4.Modify |\n);printf(| 5.Show 6.Sort |\n);printf(| 0.Exit |\n);printf(|-----------------------|\n);
}//打印菜单int main()
{int input 0;//创建通讯录struct Contact con;//con就是通讯录里面包含1000个元素的数组和size//初始化通讯录InitContact(con);do{menu();printf(请选择:);scanf(%d, input);switch (input){case ADD:AddContact(con);break;case DELETE:DeleteContact(con);break;case SREACH:SreachContact(con);break;case MODIFY:ModifyContact(con);break;case SHOW:ShowContact(con);break;case SORT:SortContact(con);break;case EXIT:printf(退出通讯录\n);break;default:printf(选择错误请重新选择\n);break;}} while (input);return 0;
}最后运用枚举可以增加代码可读性因为你如果用123等用户可能不明白意思。但是用枚举实现既符合你输入习惯又规范
用宏定义来定义一些数据是为了方便后续修改。