提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、通讯录的大概框架
- 二、通讯录的具体功能(后续可根据需求增加)
- 三、具体要创建的源文件和头文件
- 四.通讯录的详细思路和代码
- 四.到此这个静态通讯录完成,总的代码如下
- 5.代码效果如下
- 后期我会继续更新通讯录的动态表和如何永久存放到文件中的版本,希望大家多多支持,感谢!
前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、通讯录的大概框架
1.首先通讯录要存放人的信息:姓名+年龄+性别+地址+电话
2.我们假设通讯录中可以存放一百个人的信息
3.通讯录的功能
二、通讯录的具体功能(后续可根据需求增加)
1.增加联系人(Add)
2.删除指定联系人(Del)
3.查找指定联系人的信息(Search)
4.修改指定联系人的信息(Modify)
5.显示所有联系人(Show)
6.按(姓名,年龄或使用者需要的东西)排序(Sort)
三、具体要创建的源文件和头文件
为了确保程序的独立性
我们创造两个源文件Contact.c和test.c,一个头文件Contact.h来实现程序的模块化进行
具体作用如下图
四.通讯录的详细思路和代码
1.首先我们在Contact.h中定义一个结构体PeoInfo用来存放人的信息,定义另一个结构体Contact来控制,并且我们为了更方便修改和使用,我们用define定义的宏来指定大小,同时我们把后面需要使用的头文件包含上
代码如下
#include <stdio.h>
#include <assert.h>
#include <string.h>
#define Max 100
#define Name_Max 20
#define Sex_Max 10
#define Addr_Max 20
#define Tele_Max 20
//人的信息
typedef struct PeoInfo
{
char name[Name_Max];//存放姓名
int age; //存放年龄
char sex[Sex_Max]; //存放性别
char addr[Addr_Max];//存放地址
char tele[Tele_Max];//存放电话
}PeoInfo;
//控制不同人的信息
typedef struct Contact
{
PeoInfo data[Max];//存放人的信息
int sz; //信息个数
}Contact;
2.然后我们在Test.c源文件中实现menu函数和主函数
#include "Contact.h"
void menu()
{
printf("*************************************\n");
printf("******* 1.add 2.del *******\n");
printf("******* 3.search 4.modify *******\n");
printf("******* 5.show 6.sort *******\n");
printf("********** 0.exit **********\n");
printf("*************************************\n");
}
int main()
{
Contact con; //结构体创造的变量
//后续我们传入该参数用结构体指针接收
InitContact(&con); //初始化
int Input = 0;
do
{
menu();
scanf("%d", &Input);//用来选择
switch (Input)
{
case 1:
AddContact(&con); //增加联系人
break;
case 2:
DelContact(&con); //删除指定联系人
break;
case 3:
SearchContact(&con); //查找指定联系人
break;
case 4:
ModifyContact(&con); //修改指定联系人信息
break;
case 5:
ShowContact(&con); //显示指定联系人信息
break;
case 6:
SortContact(&con); //排序
break;
case 0:
printf("退出通讯录\n");
break;
default:
printf("选择错误\n");
break;
}
} while (Input);
return 0;
}
3.接下来我们开始一一在Contact.c和Contact.h中实现和定义函数
1.首先实现初始化函数InitContact
先在Contact.h定义函数InitContact
//初始化
void InitContact(Contact* pc);
再到Contact.c中实现nitContact函数
void InitContact(Contact* pc)
{
assert(pc); //断言
pc->sz = 0;
memset(pc->data, 0, sizeof(pc->data));
//这里使用memset函数对储存人信息的数组全部初始化为0
}
2.实现增加函数 AddContact
先在Contact.h定义函数AddContact
//增加联系人
void AddContact(Contact* pc);
再到Contact.c中实现AddContact函数
void AddContact(Contact* pc)
{
assert(pc);
if (pc->sz == 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].addr);
printf("请输入电话:>");
scanf("%s", pc->data[pc->sz].tele);
pc->sz++;
}
3.由于此后的操作我们都悬着根据名字来查找删除修改,这里我们在Contact.c中实现一个找名字函数FindByName,找到了返回那个人存储这数组中的下标数,没找到返回-1
代码如下
int FindByName(const Contact* pc, char name[])
{
assert(pc && name);
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name, name) == 0)//这里使用strcmp函数比较是否相同
{
return i;
}
}
return -1;
}
4.实现查找函数SearchContact
先在Contact.h定义函数SearchContact
//查找信息
void SearchContact(const Contact* pc);
再到Contact.c中实现SearchContact函数
void SearchContact(const Contact* pc)
{
assert(pc);
char name[Max];
printf("请输入要查找人的名字:>");
scanf("%s", name);
int pos = FindByName(pc, name);
if (pos == -1)
{
printf("通讯录不存在这个人的信息\n");
return;
}
else
{
printf("%s\t%s\t%s\t%s\t%s\t", "名字", "年龄", "性别", "地址", "电话");
printf("\n");
printf("%s\t%d\t%s\t%s\t%s\t",
pc->data[pos].name,
pc->data[pos].age,
pc->data[pos].sex,
pc->data[pos].addr,
pc->data[pos].tele);
printf("\n");
}
}
5.实现删除函数DelContact
先在Contact.h定义函数DelContact
//删除信息
void DelContact(Contact* pc);
再到Contact.c中实现DelContact函数
void DelContact(Contact* pc)
{
char name[Max];
printf("输入要删除人的名字\n");
scanf("%s", name);
if (pc->sz == 0)
{
printf("通讯录为空,无法删除\n");
return;
}
int pos = FindByName(pc, name);
if (pos == -1)
{
printf("通讯录不存在这个人的信息\n");
return;
}
else
{
int i = 0;
for (i = pos; i < pc->sz - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("删除成功\n");
}
}
6.实现修改函数ModifyContact
先在Contact.h定义函数ModifyContact
//修改信息
void ModifyContact(Contact* pc);
再到Contact.c中实现ModifyContact函数
void ModifyContact(Contact* pc)
{
assert(pc);
char name[Max];
printf("请输入要修改人的名字:>");
scanf("%s", name);
int pos = FindByName(pc, name);
if (pos == -1)
{
printf("要修改的人不存在\n");
return;
}
printf("请输入名字:>");
scanf("%s", pc->data[pos].name);
printf("请输入年龄:>");
scanf("%d", &(pc->data[pos].age));
printf("请输入性别:>");
scanf("%s", pc->data[pos].sex);
printf("请输入地址:>");
scanf("%s", pc->data[pos].addr);
printf("请输入电话:>");
scanf("%s", pc->data[pos].tele);
printf("修改完成\n");
}
7.实现排序函数SortContact,这里我们使用qsort函数排序(这里qsort不熟悉的可以cplusplus了解一下,后期我会更新一期qsort的模拟实现)
先在Contact.h定义函数SortContact
//排序信息
void SortContact(Contact* pc);
再到Contact.c中实现SortContact函数
int comparebyname(const void* p1, const void* p2)
{
return strcmp(((PeoInfo*)p1)->name, ((PeoInfo*)p2)->name);
}
//排序
void SortContact(Contact* pc)
{
qsort(pc->data, pc->sz, sizeof(PeoInfo), comparebyname);
printf("排序成功\n");
return;
}
8.最后我们实现显示函数 ShowContact
先在Contact.h定义函数 ShowContact
//显示信息
void ShowContact(const Contact* pc);
再到Contact.c中实现ShowContact函数
void ShowContact(const Contact* pc)
{
assert(pc);
int i = 0;
printf("%s\t%s\t%s\t%s\t%s\t", "名字", "年龄", "性别", "地址", "电话");
printf("\n");
for (i = 0; i < pc->sz; i++)
{
printf("%s\t%d\t%s\t%s\t%s\t",
pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].addr,
pc->data[i].tele);
printf("\n");
}
}
四.到此这个静态通讯录完成,总的代码如下
Test.c
#include "Contact.h"
void menu()
{
printf("*************************************\n");
printf("******* 1.add 2.del *******\n");
printf("******* 3.search 4.modify *******\n");
printf("******* 5.show 6.sort *******\n");
printf("********** 0.exit **********\n");
printf("*************************************\n");
}
int main()
{
Contact con;
InitContact(&con);
int Input = 0;
do
{
menu();
scanf("%d", &Input);
switch (Input)
{
case 1:
AddContact(&con);
break;
case 2:
DelContact(&con);
break;
case 3:
SearchContact(&con);
break;
case 4:
ModifyContact(&con);
break;
case 5:
ShowContact(&con);
break;
case 6:
SortContact;
break;
case 0:
printf("˳ͨѶ¼");
break;
default:
printf("ѡ");
break;
}
} while (Input);
return 0;
}
Contact.h
#include <stdio.h>
#include <assert.h>
#include <string.h>
#define Max 100
#define Name_Max 20
#define Sex_Max 10
#define Addr_Max 20
#define Tele_Max 20
//人的信息
typedef struct PeoInfo
{
char name[Name_Max];
int age;
char sex[Sex_Max];
char addr[Addr_Max];
char tele[Tele_Max];
}PeoInfo;
typedef struct Contact
{
PeoInfo data[Max];//存放人的信息
int sz;//信息个数
}Contact;
//初始化
void InitContact(Contact* pc);
//增加联系人
void AddContact(Contact* pc);
//查找信息
void SearchContact(const Contact* pc);
//删除信息
void DelContact(Contact* pc);
//修改信息
void ModifyContact(Contact* pc);
//排序信息
void SortContact(Contact* pc);
//显示信息
void ShowContact(const Contact* pc);
Contact.h
#include "Contact.h"
void InitContact(Contact* pc)
{
assert(pc);
pc->sz = 0;
memset(pc->data, 0, sizeof(pc->data));
}
void AddContact(Contact* pc)
{
assert(pc);
if (pc->sz == 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].addr);
printf("请输入电话:>");
scanf("%s", pc->data[pc->sz].tele);
pc->sz++;
}
int FindByName(const Contact* pc, char name[])
{
assert(pc && name);
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name, name) == 0)
{
return i;
}
}
return -1;
}
void SearchContact(const Contact* pc)
{
assert(pc);
char name[Max];
printf("请输入要查找人的名字:>");
scanf("%s", name);
int pos = FindByName(pc, name);
if (pos == -1)
{
printf("通讯录不存在这个人的信息\n");
return;
}
printf("%s\t%s\t%s\t%s\t%s\t", "名字", "年龄", "性别", "地址", "电话");
printf("\n");
printf("%s\t%d\t%s\t%s\t%s\t",
pc->data[pos].name,
pc->data[pos].age,
pc->data[pos].sex,
pc->data[pos].addr,
pc->data[pos].tele);
printf("\n");
}
void DelContact(Contact* pc)
{
char name[Max];
printf("输入要删除人的名字\n");
scanf("%s", name);
if (pc->sz == 0)
{
printf("通讯录为空,无法删除\n");
return;
}
int pos = FindByName(pc, name);
if (pos == -1)
{
printf("通讯录不存在这个人的信息\n");
return;
}
else
{
int i = 0;
for (i = pos; i < pc->sz - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("删除成功\n");
}
}
void ModifyContact(Contact* pc)
{
assert(pc);
char name[Max];
printf("请输入要修改人的名字:>");
scanf("%s", name);
int pos = FindByName(pc, name);
if (pos == -1)
{
printf("要修改的人不存在\n");
return;
}
printf("请输入名字:>");
scanf("%s", pc->data[pos].name);
printf("请输入年龄:>");
scanf("%d", &(pc->data[pos].age));
printf("请输入性别:>");
scanf("%s", pc->data[pos].sex);
printf("请输入地址:>");
scanf("%s", pc->data[pos].addr);
printf("请输入电话:>");
scanf("%s", pc->data[pos].tele);
printf("修改完成\n");
}
int comparebyname(const void* p1, const void* p2)
{
return strcmp(((PeoInfo*)p1)->name, ((PeoInfo*)p2)->name);
}
void SortContact(Contact* pc)
{
qsort(pc->data, pc->sz, sizeof(PeoInfo), comparebyname);
printf("排序成功\n");
return;
}
void ShowContact(const Contact* pc)
{
assert(pc);
int i = 0;
printf("%s\t%s\t%s\t%s\t%s\t", "名字", "年龄", "性别", "地址", "电话");
printf("\n");
for (i = 0; i < pc->sz; i++)
{
printf("%s\t%d\t%s\t%s\t%s\t",
pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].addr,
pc->data[i].tele);
printf("\n");
}
}
5.代码效果如下