今天我们来实现一个通讯录,里面可以记录需要统计的人的信息,下面是这个通讯录的要求:
我们创建3个文件,分别将测试功能和声明功能和通讯录的实现功能封装起来,这样可以使我们的代码条理更加清楚
先制作一个菜单将通讯录的功能展示
void menu()
{
printf("\n********1.Add 2.Del********\n");
printf("********3.Search 4.Modify*****\n");
printf("********5.Show 6.sort*******\n");
printf("******** 0.Exit *******\n");
//打印菜单
}
通过输入值存入input之中来实现功能
为了使代码的可读性更高我们设计一个枚举常量,使输入可以与功能对应
enum Option
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SHOW,
SORT
};//使用枚举使代码的可读性更高
下面是代码的测试功能框架:
int main()
{
int input = 0;
contact con;
InitContact(&con);
do
{
menu();
scanf("%d", &input);
switch (input)
{
case EXIT:
break;
case ADD:
Add(&con);//录入人的信息
break;
case DEL:
Del(&con);//删除人的信息
break;
case SEARCH:
Search(&con);//查找人的信息
break;
case MODIFY:
Modify(&con);//修改人的信息
break;
case SHOW:
Show(&con);//打印目前的通讯录
break;
case SORT:
Sort(&con);//排列通讯录的内容
break;
}
} while (input);
首先创建一个结构体用于存放被录入人的信息:
#define Max_Name 20
#define Max_Sex 5
#define Max_Tele 12
#define Max_Addr 30
typedef struct PeoInfo
{
char name[Max_Name];
int age;
char sex[Max_Sex];
char tele[Max_Tele];
char addr[Max_Addr];
}PeoInfo;//运用#define到时候可以更好地修改最大存储的内容大小
我们每次加入人的信息时我们还要统计录入人的数量,这样我们需要创建一个新的结构体,里面既可以存放人的信息,又可以存放统计了几个人。
#define Max 100
typedef struct contact
{
PeoInfo data[Max];//统计信息的数组
int sz;//这个就是统计录入了几个人的变量
}contact
下面就是具体通讯的实现功能:
在开始之前我们先对通讯录进行初始化,设计函数InitContact
void InitContact(contact* pc)
{
pc->sz = 0;
memset(pc->data, 0, sizeof(pc->data));//这里运用memset函数快速初始化
}
我们先实现添加联系人:
void Add(contact* pc)
{
if (pc->sz >= Max)
{
printf("数据已经添加满\n");
}
else
{
printf("请输入姓名\n");
scanf("%s", pc->data[pc->sz].name);
printf("请输入年龄\n");
scanf("%d", &(pc->data[pc->sz].age));
printf("请输入性别\n");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入电话\n");
scanf("%s", pc->data[pc->sz].tele);
printf("请输入住址\n");
scanf("%s", pc->data[pc->sz].addr);
pc->sz++;//添加完之后统计的人数要加1
printf("添加成功\n");
}
}
之后我们实现打印通讯录Show代码
void Show(contact* pc)
{
int i = 0;
printf("%-10s %-4s %-5s %-12s %-30s\n",
"姓名", "年龄", "性别", "电话", "住址");//打印一个标题
for (i = 0; i < pc->sz; i++)
{
printf("%-10s %-4d %-5s %-12s %-30s\n",
pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].tele,
pc->data[i].addr);
}
}
下面我们实现删除Del的代码,在删除之前我们先要查找该人名设计函数Find_name来实现这个功能
Find_name函数代码:
int Find_name(contact* pc, char name[])
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (0 == strcmp(name, pc->data[i].name))
{
return i;//这里是相同的情况就返回下标
}
}
//若找不到就返回-1
return -1;
}
Del函数的代码:
void Del(contact* pc)
{
char Name[20];
printf("请输入你要删除的人的姓名\n");
scanf("%s", Name);
//删除之前我们要先查找该名字,所以我们先写Find_name来查找该名字
//找到了后返回下标
if (-1 == Find_name(pc, Name))
{
printf("没有找到该联系人\n");
}
else//将删除元素后面的值往前覆盖
{
int i = 0;
for (i = Find_name(pc, Name); i < pc->sz - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
}
}
之后写查找人名的代码Search:
void Search(contact* pc)
{
char Name[20];
printf("请输入你要查找的人\n");
scanf("%s", Name);
if (Find_name(pc, Name) >= 0)
{
int ret = Find_name(pc, Name);
printf("找到了\n");
printf("%-10s %-4s %-5s %-12s %-30s\n",
"姓名", "年龄", "性别", "电话", "住址");
printf("%-10s %-4d %-5s %-12s %-30s\n",
pc->data[ret].name,
pc->data[ret].age,
pc->data[ret].sex,
pc->data[ret].tele,
pc->data[ret].addr);
}
else
{
printf("没有找到\n");
}
}
下面写修改Modify函数:
void Modify(contact* pc)
{
char Name[20];
printf("请输入你要修改的人\n");
scanf("%s", Name);
int pos = Find_name(pc, Name);
printf("请输入姓名\n");
scanf("%s", pc->data[pos].name);
printf("请输入年龄\n");
scanf("%d", &(pc->data[pos].age));
printf("请输入性别\n");
scanf("%s", pc->data[pos].sex);
printf("请输入电话\n");
scanf("%s", pc->data[pos].tele);
printf("请输入住址\n");
scanf("%s", pc->data[pos].addr);
printf("修改成功\n");
}
最后写排序函数Sort,这里我们使用qsort函数来辅助排序:
void cmp_name(const void* p1, const void* p2)
{
return strcmp(((PeoInfo*)p1)->name , ((PeoInfo*)p2)->name);
}
void Sort(contact* pc)
{
qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp_name);//这里我们按照姓名的首字母排序
}
到这里我们的代码大致均已实现,下面我们看看运行的结果:
Add添加元素
Show展示通讯录:
Del删除元素:
Search查找元素:
Modify修改元素:
Sort排序:
下面是函数的全部代码:
contact.h头文件
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#define Max 100
#define Max_Name 20
#define Max_Sex 5
#define Max_Tele 12
#define Max_Addr 30
typedef struct PeoInfo
{
char name[Max_Name];
int age;
char sex[Max_Sex];
char tele[Max_Tele];
char addr[Max_Addr];
}PeoInfo;
typedef struct contact
{
PeoInfo data[Max];
int sz;
}contact;
void InitContact(contact* pc);
void Add(contact* pc);
void Show(contact* pc);
void Del(contact* pc);
void Search(contact* pc);
void Modify(contact* pc);
void Sort(contact* pc);
contact.c文件(通讯录实现文件)
#include"contact.h"
void InitContact(contact* pc)
{
pc->sz = 0;
memset(pc->data, 0, sizeof(pc->data));//这里运用memset函数快速初始化
}
void Add(contact* pc)
{
if (pc->sz >= Max)
{
printf("数据已经添加满\n");
}
else
{
printf("请输入姓名\n");
scanf("%s", pc->data[pc->sz].name);
printf("请输入年龄\n");
scanf("%d", &(pc->data[pc->sz].age));
printf("请输入性别\n");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入电话\n");
scanf("%s", pc->data[pc->sz].tele);
printf("请输入住址\n");
scanf("%s", pc->data[pc->sz].addr);
pc->sz++;//添加完之后统计的人数要加1
printf("添加成功\n");
}
}
void Show(contact* pc)
{
int i = 0;
printf("%-10s %-4s %-5s %-12s %-30s\n",
"姓名", "年龄", "性别", "电话", "住址");//打印一个标题
for (i = 0; i < pc->sz; i++)
{
printf("%-10s %-4d %-5s %-12s %-30s\n",
pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].tele,
pc->data[i].addr);
}
}
int Find_name(contact* pc, char name[])
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (0 == strcmp(name, pc->data[i].name))
{
return i;//这里是相同的情况就返回下标
}
}
//若找不到就返回-1
return -1;
}
void Del(contact* pc)
{
char Name[20];
printf("请输入你要删除的人的姓名\n");
scanf("%s", Name);
//删除之前我们要先查找该名字,所以我们先写Find_name来查找该名字
//找到了后返回下标
if (-1 == Find_name(pc, Name))
{
printf("没有找到该联系人\n");
}
else//将删除元素后面的值往前覆盖
{
int i = 0;
for (i = Find_name(pc, Name); i < pc->sz - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
}
}
void Search(contact* pc)
{
char Name[20];
printf("请输入你要查找的人\n");
scanf("%s", Name);
if (Find_name(pc, Name) >= 0)
{
int ret = Find_name(pc, Name);
printf("找到了\n");
printf("%-10s %-4s %-5s %-12s %-30s\n",
"姓名", "年龄", "性别", "电话", "住址");
printf("%-10s %-4d %-5s %-12s %-30s\n",
pc->data[ret].name,
pc->data[ret].age,
pc->data[ret].sex,
pc->data[ret].tele,
pc->data[ret].addr);
}
else
{
printf("没有找到\n");
}
}
void Modify(contact* pc)
{
char Name[20];
printf("请输入你要修改的人\n");
scanf("%s", Name);
int pos = Find_name(pc, Name);
printf("请输入姓名\n");
scanf("%s", pc->data[pos].name);
printf("请输入年龄\n");
scanf("%d", &(pc->data[pos].age));
printf("请输入性别\n");
scanf("%s", pc->data[pos].sex);
printf("请输入电话\n");
scanf("%s", pc->data[pos].tele);
printf("请输入住址\n");
scanf("%s", pc->data[pos].addr);
printf("修改成功\n");
}
void cmp_name(const void* p1, const void* p2)
{
return strcmp(((PeoInfo*)p1)->name , ((PeoInfo*)p2)->name);
}
void Sort(contact* pc)
{
qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp_name);//这里我们按照姓名的首字母排序
}
test.c测试文件
#include"contact.h"
void menu()
{
printf("\n********1.Add 2.Del********\n");
printf("********3.Search 4.Modify*****\n");
printf("********5.Show 6.sort*******\n");
printf("******** 0.Exit *******\n");
//打印菜单
}
enum Option
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SHOW,
SORT
};//使用枚举使代码的可读性更高
int main()
{
int input = 0;
contact con;
InitContact(&con);
do
{
menu();
scanf("%d", &input);
switch (input)
{
case EXIT:
break;
case ADD:
Add(&con);
break;
case DEL:
Del(&con);
break;
case SEARCH:
Search(&con);
break;
case MODIFY:
Modify(&con);
break;
case SHOW:
Show(&con);
break;
case SORT:
Sort(&con);
break;
}
} while (input);
}
以上就是全部内容,谢谢观看!!!