创建通讯录->初始化通讯录->实现通讯录删添功能->实现通讯录修改某联系人功能->实现搜索联系人功能->实现重新排序通讯录所有联系人功能->实现展示通讯人所有联系人功能->....等,目前就先实现通讯录基本的功能吧.
通讯录是保存联系人信息的功能,想想咱们手机上的通讯人,每一个联系人都会有(姓名,性别,年龄,手机号,住址等信息栏),故联系人是一个复杂的对象,那咱们就可以创建 一个结构体。
#define MAX_NAME 20
#define MAX_SEX 10
#define MAX_ADD 50
#define MAX_PHONE 25
#define MAX_COUNT 1000
typedef struct people
{
char name[MAX_NAME];
char sex[MAX_SEX];
int old;
char phone[MAX_PHONE];
char address[MAX_ADD];
}people;
这里数组的大小是我宏定义过的,这样我们就方便后期的统一修改。这时候我们就又有一个问题,因为我们创建的联系人的结构体数组是直接创建了1000的容量,我该怎么知道此时通讯录保存了多少人,是很麻烦一件事,所有我们进行了下面的优化,来解决了这一问题。
用size来记录此时通讯人保存的人数,若没有联系人,则size的值为0。这样一个完美的通讯录类型创建完成,这里我们定义一个变量:contact con;下面就开始通讯录的初始化了。
初始化也是挺简单的,只需要运用一个memset函数,简单对memset注释一下吧,memset的第一个形参值的是你要操作的变量,第二形参是,你要初始化的值,注意这里初始化的值,是按每个字节初始化的,第三个是你要初始化的字符数,也就是字节数。
你看,这里size的作用就体现出来,没有size你就不知道当前通讯录是一种什么状态,是满,还是怎么的。这里要记得,添加完联系人后,记得讲size的值+1
这里,是实现了一个由联系人姓名来找到联系人,因为后面的删除,修改,查找功能都离不开这个功能,所有单独封装一个函数。若查找成功,则返回其下标,否则返回-1以表示该联系人不存在,
这里,没什么要着重说明的,记得size的值--都行。
上面是通讯录的修改功能
这是通讯录的查找功能
这里对通讯录的排序要利用一个排序函数qsort,上面是我们编程者自己实现的排序原则,此函数的确有些复杂,这是关于qsort的详解,若想跟深入的理解qsort函数,可以去模拟实现一下。我也把有关次,模拟的讲解链接,放在这
排序神器——qsort函数之详解-CSDN博客
冒泡排序进阶之模拟qsort排序函数(回调函数用法讲解)-CSDN博客
咱们用的通讯录,肯定有各种排序功能,而这里我则就实现了两种。
这里则是通讯录的展示功能
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void menu()
{
printf("欢迎来到高智能梦涵通讯录\n");
printf("添加联系人请按数字-----1\n");
printf("删除联系人请按数字-----2\n");
printf("修改联系人请按数字-----3\n");
printf("查找联系人请按数字-----4\n");
printf("展示已有联系人请按数字-5\n");
printf("重新排序联系人请按数字-6\n");
printf("挂断智能梦涵机器人请按-0\n");
}
enum funtion
{
EXIT,
ADD,
REMOVE,
CHANGE,
SEARCH,
SHOW,
SORT,
};
int main()
{
int input = 0;
contact con;
Initcon(&con);
do
{
system("cls");
menu();
scanf("%d",&input);
switch(input)
{
case ADD:
Add_contact(&con);
system("pause");
break;
case REMOVE:
Remove_contact(&con);
system("pause");
break;
case CHANGE:
Change_contact(&con);
system("pause");
break;
case SEARCH:
Search_contact(&con);
system("pause");
break;
case SHOW:
Show_contact(&con);
system("pause");
break;
case SORT:
Sort_contact(&con);
system("pause");
break;
case EXIT:
system("cls");
printf("主人,期待与你的下次相遇\n");
break;
default:
printf("找不到此功能,请重新输入\n");
}
}while(input);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void Initcon(contact* con)
{
memset(con,0,sizeof(contact));
//memset(con->date,0,sizeof(con->date));
//con->size = 0;
}
void Add_contact(contact* con)
{
//判断通讯录是否已达到满值
if(con->size == MAX_COUNT)
printf("通讯录已满,请删除一些失联人后再添加\n");
else
{
printf("请输入联系人姓名>.");
scanf("%s",con->date[con->size].name);
printf("请输入联系人性别>.");
scanf("%s",con->date[con->size].sex);
printf("请输入联系人年龄>.");
scanf("%d",&con->date[con->size].old);
printf("请输入联系人电话>.");
scanf("%s",con->date[con->size].phone);
printf("请输入联系人地址>.");
scanf("%s",con->date[con->size].address);
}
con->size++;
printf("添加成功\n");
}
void Show_contact(contact* con)
{
int i = 0;
printf("%-10s\t %-10s\t %-10s\t %-10s\t %-10s\n","姓名","性别","年龄","电话","地址");
for(i=0;isize;i++)
{
printf("%-10s\t %-10s\t %-10d\t %-10s\t %-10s\n",con->date[i].name,
con->date[i].sex,
con->date[i].old,
con->date[i].phone,
con->date[i].address);
}
}
static int Find(contact* con)
{
int i = 0;char zmh[MAX_NAME];
printf("请输入你要操作的对象>.");
scanf("%s",zmh);
for(i=0;isize;i++)
{
if(!(strcmp(zmh,con->date[i].name)))
return i;
}
if(i==con->size)
return -1;
}
void Remove_contact(contact* con)
{
int ret = Find(con);
if(-1==ret)
printf("该联系人不存在\n");
else
{
int i = 0;
for(i=ret;isize-1;i++)
{
con->date[i] = con->date[i+1];
}
con->size--;
printf("删除成功\n");
}
}
void Change_contact(contact* con)
{
int ret = Find(con);
if(-1==ret)
printf("该联系人不存在\n");
else
{
printf("请输入联系人姓名>.");
scanf("%s",con->date[ret].name);
printf("请输入联系人性别>.");
scanf("%s",con->date[ret].sex);
printf("请输入联系人年龄>.");
scanf("%d",&con->date[ret].old);
printf("请输入联系人电话>.");
scanf("%s",con->date[ret].phone);
printf("请输入联系人地址>.");
scanf("%s",con->date[ret].address);
printf("修改成功\n");
}
}
void Search_contact(contact* con)
{
int ret = Find(con);
if(-1==ret)
printf("该联系人不存在\n");
else
{
printf("%-10s\t %-10s\t %-10s\t %-10s\t %-10s\n","姓名","性别","年龄","电话","地址");
printf("%-10s\t %-10s\t %-10d\t %-10s\t %-10s\n",con->date[ret].name,
con->date[ret].sex,
con->date[ret].old,
con->date[ret].phone,
con->date[ret].address);
}
}
static int cmp_int(const void* e1,const void* e2)
{
return *(int*)e1-*(int*)e2;
}
static int cmp_char(const void* e1,const void* e2)
{//这里之所以用const关键字,是因为咱们只是用此函数比较的,为了变量的安全性,加上const以表不能修改
return strcmp(((people*)e1)->name,((people*)e2)->name);
}
void Sort_contact(contact* con)
{
int input = 0;
printf("按姓名字典序排序,请输入--1\n");
printf("按年龄的大小排序,请输入--2\n");
printf("更多排序方式 ,等梦涵更新哦!");
printf("请选择你要排序的方式>.");
scanf("%d",&input);
switch(input)
{
case 1:qsort(con->date,con->size,sizeof(con->date[0]),cmp_char);
break;
case 2:qsort(con->date,con->size-1,sizeof(con->date[0]),cmp_int);
break;
/*目前只提供两种类型的其中一种排序原则,原理都是一样的*/
default:
break;
}
printf("排序成功\n");
}
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
#include
#define MAX_NAME 20
#define MAX_SEX 10
#define MAX_ADD 50
#define MAX_PHONE 25
#define MAX_COUNT 1000
//创建通讯录
typedef struct people
{
char name[MAX_NAME];
char sex[MAX_SEX];
int old;
char phone[MAX_PHONE];
char address[MAX_ADD];
}people;
typedef struct contact
{
people date[MAX_COUNT];
int size;
}contact;
//初始化通讯录
void Initcon(contact* con);
//添加联系人
void Add_contact(contact* con);
//删除联系人
void Remove_contact(contact* con);
//修改联系人
void Change_contact(contact* con);
//查找联系人
void Search_contact(contact* con);
//重新排序
void Sort_contact(contact* con);
//展示联系人
void Show_contact(contact* con);