通讯录的实现

通讯录的实现

思路 思路:通讯录:

1、人的信息:姓名+年龄+性别+地址+电话

2、通讯录中可以存放100个人的信息

3:功能:

1》增加联系人

2》删除指定联系人

3》查找指定联系人的信息

4》修改指定联系人的信息

5》显示所有联系人的信息

6》排序(用年龄,名字都行)

1、用到的头文件代码语言:javascript复制#include//memmove、memset的头文件

#include

#include//qsort的头文件 2、声明代码语言:javascript复制//人的信息

#define MAX 100

#define NAME_MAX 20

#define NAME_MAX 5

#define ADDR_MAX 30

#define TELE_MAX 123、结构体的创建代码语言:javascript复制人信息的结构体

typedef struct PeoInfo

{

char name[NAME_MAX];//名字

int age; //年龄

char sex[NAME_MAX]; //性别

char addr[ADDR_MAX];//地址

char tele[TELE_MAX];//电话

}PeoInfo;

通讯录结构体

typedef struct Contact

{

PeoInfo data[MAX];//存放人的信息

int sz;//当前已经放的人的信息的个数

}Contact;知识点:typedef:重命名4、先写一个菜单函数代码语言:javascript复制void menu()

{

printf("***********************************");

printf("****** 1.add 2del *****");//2删除

printf("****** 3.search 4.modify *****");//3查找

printf("****** 5.show 6.sort *****");//4修改

printf("****** 0.exit *****");//5显示

printf("***********************************");//6排序

printf("***********************************");

}5、创建通讯录代码语言:javascript复制Contact con;6、初始化通讯录代码语言:javascript复制 //初始化通讯录

InitContact(&con);初始化函数代码语言:javascript复制​

void InitContact(Contact* pc)//初始化

{

pc->sz = 0;

memset(pc->data, 0, sizeof(pc->data));

//单位字节,因为传的地址是整个数组的地址所以可以直接用sizeof。

}7、用do-while循环main函数中代码代码语言:javascript复制int main()

{

//创建通讯录

Contact con;//也可直接在这里等于0,就是不够灵活

//初始化通讯录

InitContact(&con);

int input = 0;

do

{

menu();//菜单

printf("请选择:>>");

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);//除了0外都是为真继续循环

return 0;

}8、增加联系人函数代码代码语言:javascript复制//添加

void AddContact(Contact* pc)

{

if (pc->sz == MAX)

{

printf("通讯录已满,无法添加\n");

return;//void可以有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)++;//每存入一个就++一个

}9、删除指定联系人函数代码代码语言:javascript复制/删除指定联系人

void DelContact(Contact* pc)

{

char name[NAME_MAX] = { 0 };

if (pc->sz == 0)

{

printf("通讯录为空,无法删除\n");

}

//删除

//找到要删除的人

printf("请输入要删除人的名字:>");

scanf("%s", name);

int ret = FindByName(pc, name);//通过名字查找,返回的用ret存下来

//找不到返回-1

if (-1 == ret)

{

printf("要删除的人不存在\n");

return;//没有要删除的人直接返回就好

}

//删除

//删除后,要把后面的数据前移一位,把删除的覆盖掉

//法一可以一个一个移动

// 法二也可以用memove

for (int j = ret; j < pc->sz - 1; j++)

{

pc->data[j] = pc->data[j + 1];

}

pc->sz--;//删除后,人数减去一

printf("删除成功\n");

}10、查找指定联系人的信息,并打印函数代码代码语言:javascript复制//查找指定联系人

void SearchContact(const Contact* pc)

{

char name[NAME_MAX] = { 0 };

printf("请输入想查找人的名字\n");

scanf("%s", name);

int ret = FindByName(pc, name);//用ret来接受是否找到,没找到还是-1

if (-1 == ret)

{

printf("要查找的人不存在\n");

return;//没有要查找的人直接返回就好

}

//找到

//打印信息

printf("%-10s\t%-4s\t%-10s\t%-15s\t%-15s\n", "名字", "年龄", "性别", "地址", "电话");

printf("%-10s\t%-4d\t%-10s\t%-15s\t%-15s\n",

pc->data[ret].name,

pc->data[ret].age,

pc->data[ret].sex,

pc->data[ret].addr,

pc->data[ret].tele);

}11、修改指定联系人的信息

函数代码代码语言:javascript复制//修改指定联系人

void ModifyContact(Contact* pc)

{

char name[NAME_MAX] = { 0 };

printf("请输入想修改人的名字\n");

scanf("%s", name);

int ret = FindByName(pc, name);//用ret来接受是否找到,没找到还是-1

if (-1 == ret)

{

printf("要修改的人不存在\n");

return;//没有要查找的人直接返回就好

}

//找到修改的人了

//修改

//就是再ret这个位置处的人重新录入这个人的信息

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].addr);

printf("请输入电话:>>");

scanf("%s", pc->data[ret].tele);

printf("修改完成\n");

//修改人信息不会改变个数

}12、显示所有联系人的信息函数代码知识点:-加数字左对齐代码语言:javascript复制//show,打印出来

void ShowContact(const Contact* pc)

{

int i = 0;

printf("%-10s\t%-4s\t%-10s\t%-15s\t%-15s\n", "名字", "年龄", "性别", "地址", "电话");

for (i = 0; i < pc->sz; i++)

{

//左对齐

printf("%-10s\t%-4d\t%-10s\t%-15s\t%-15s\n",

pc->data[i].name,

pc->data[i].age,

pc->data[i].sex,

pc->data[i].addr,

pc->data[i].tele);

}

}13、排序(用年龄,名字都行),用年龄举例,sqort用法有说过函数代码代码语言:javascript复制//排序并打印,以年龄为例子

int cmp_stu_by_age(const void* e1, const void* e2)

{ //强转为结构体指针

return ((PeoInfo*)e1)->age - ((PeoInfo*)e2)->age;

要排序的数组是data,data里边儿的每一个数据元素是PeoInfo,

然后,要把它强转成PeoInfo的一个类型,然后去访问它的一个age进行比较了。

}

//排序并打印

void SortContact(Contact* pc)

{

qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp_stu_by_age);

int i = 0;

printf("%-10s\t%-4s\t%-10s\t%-15s\t%-15s\n", "名字", "年龄", "性别", "地址", "电话");

for (i = 0; i < pc->sz; i++)

{

//左对齐

printf("%-10s\t%-4d\t%-10s\t%-15s\t%-15s\n",

pc->data[i].name,

pc->data[i].age,

pc->data[i].sex,

pc->data[i].addr,

pc->data[i].tele);

}

}

相关阅读

激战2木桩在哪 木桩位置一览
365买球APP

激战2木桩在哪 木桩位置一览

⌚ 01-26 👁️ 6856
罱网捕鱼
365买球APP

罱网捕鱼

⌚ 07-11 👁️ 9875
翡翠观音怎么选才是最好的?注意这6个细节就够了