admin管理员组文章数量:1794759
通讯录的实现
思路
思路:通讯录: 1、人的信息:姓名+年龄+性别+地址+电话 2、通讯录中可以存放100个人的信息 3:功能: 1》增加联系人 2》删除指定联系人 3》查找指定联系人的信息 4》修改指定联系人的信息 5》显示所有联系人的信息 6》排序(用年龄,名字都行)
1、用到的头文件
代码语言:javascript代码运行次数:0运行复制#include<string.h>//memmove、memset的头文件
#include<stdio.h>
#include<stdlib.h>//qsort的头文件
2、声明
代码语言:javascript代码运行次数:0运行复制//人的信息
#define MAX 100
#define NAME_MAX 20
#define NAME_MAX 5
#define ADDR_MAX 30
#define TELE_MAX 12
3、结构体的创建
代码语言:javascript代码运行次数:0运行复制人信息的结构体
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代码运行次数:0运行复制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代码运行次数:0运行复制Contact con;
6、初始化通讯录
代码语言:javascript代码运行次数:0运行复制 //初始化通讯录
InitContact(&con);
初始化函数
代码语言:javascript代码运行次数:0运行复制
void InitContact(Contact* pc)//初始化
{
pc->sz = 0;
memset(pc->data, 0, sizeof(pc->data));
//单位字节,因为传的地址是整个数组的地址所以可以直接用sizeof。
}
7、用do-while循环
main函数中代码
代码语言:javascript代码运行次数:0运行复制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代码运行次数:0运行复制//添加
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代码运行次数:0运行复制/删除指定联系人
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代码运行次数:0运行复制//查找指定联系人
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代码运行次数:0运行复制//修改指定联系人
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代码运行次数:0运行复制//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代码运行次数:0运行复制//排序并打印,以年龄为例子
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);
}
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2024-10-17,如有侵权请联系 cloudcommunity@tencent 删除data函数排序数据数组本文标签: 通讯录的实现
版权声明:本文标题:通讯录的实现 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1754739406a1705794.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论