思路 思路:通讯录:
1、人的信息:姓名+年龄+性别+地址+电话
2、通讯录中可以存放100个人的信息
3:功能:
1》增加联系人
2》删除指定联系人
3》查找指定联系人的信息
4》修改指定联系人的信息
5》显示所有联系人的信息
6》排序(用年龄,名字都行)
1、用到的头文件代码语言:javascript复制#include
#include
#include
#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);
}
}