一、成果展示
- 添加联系人
- 修改联系人
- 删除联系人
- 查找联系人
- 排序通讯录
按姓名排序: 按地址排序: 按年龄排序: - 清空通讯录:
二、思路
大致思路:
- 联系人是一个复杂的实体,包括:姓名,电话,地址等,不只一个变量,因此需要用结构体(struct Peoinfo)来定义联系人。
- 通讯录是个联系人列表,通讯录就可以定义为struct Peoinfo类型的数组,但数组还需要包含下标(即联系人的个数),因此还需要定义一个整数。所以,我们也采用结构体(struct Contact)对其定义。
- 接下来通过switch-case语句实现通迅录的不同功能。
1. 添加联系人
- 添加联系人的前提必须是通讯录还有空间,因此,首先判断通讯录的人数sz是否已经超过数组data的最大容量MAX_DATA。
- 然后依次输入需要添加的联系人的信息。
- 每添加一个联系人后要给sz加一。
2. 查找联系人
- 先输入需要查找的联系人姓名,通过遍历data数组,比较输入的联系人姓名与数组中的联系人姓名是否相等。
- 此处可以将寻找联系人的函数分装起来,方便后面使用。
3. 修改联系人
- 要修改联系人,首先应该先找到该联系人,这里直接用上一步写好的find()函数。
- 如果函数返回值不为-1时,再执行修改的步骤。
4. 删除联系人
- 删除联系人也需要先找到该联系人,这里依然使用find()函数。
- 在找到该联系人的数组下标后,只需要使该改联系人后面的元素依次向前覆盖一个元素即可。
- 图例:
5. 展示通讯录
- 对通讯录中的data数组依次遍历输出联系人信息即可。
6. 排序通讯录
- 排序通讯录利用qsort函数,排序后依次输出。
- 此处编写了三种排序方法,分别按姓名(首字母大小),地址(首字母大小),年龄排序,由于采用qsort库函数,只需要编写三种比较方法即可。
7. 清空通讯录
- 清空通讯录,让联系人数sz为0即可达到目的。
三、完整代码
contact.h
#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>
#define MAX_NAME 20
#define MAX_SEX 10
#define MAX_NUM 12
#define MAX_ADDR 30
#define MAX_DATA 100
struct Peoinfo
{
char name[MAX_NAME];
char sex[MAX_SEX];
char num[MAX_NUM];
int age;
char addr[MAX_ADDR];
};
struct Contact
{
struct Peoinfo data[MAX_DATA];
int sz;
};
void init_contact(struct Contact* con);
void addContact(struct Contact* con);
void deleteContact(struct Contact* con);
void modifyContact(struct Contact* con);
void searchContact(struct Contact* con);
void showContact(struct Contact* con);
void sortContact(struct Contact con);
void clearContact(struct Contact* con);
contact.c
#include "contact.h"
void init_contact(struct Contact* con)
{
assert(con);
con->sz = 0;
memset(con->data, 0, MAX_DATA*sizeof(struct Peoinfo));
}
void addContact(struct Contact *con)
{
assert(con);
if ((con->sz) > MAX_DATA)
{
printf("通讯录已满!\n");
}
printf("请输入姓名:");
scanf("%s", con->data[con->sz].name);
printf("请输入性别:");
scanf("%s", con->data[con->sz].sex);
printf("请输入电话:");
scanf("%s", con->data[con->sz].num);
printf("请输入年龄:");
scanf("%d", &(con->data[con->sz].age));
printf("请输入地址:");
scanf("%s", con->data[con->sz].addr);
con->sz++;
printf("添加联系人成功!\n");
}
void deleteContact(struct Contact* con)
{
char name[MAX_NAME];
printf("请输入要删除的联系人:");
scanf("%s", name);
int ret = find(con, name);
if (ret == -1)
printf("未找到该联系人!\n");
else
{
int i = 0;
for (i = 0; i < con->sz - ret; i++)
{
con->data[ret+i] = con->data[ret + i+1];
}
con->sz--;
printf("删除联系人成功!\n");
}
}
void modifyContact(struct Contact* con)
{
char name[MAX_NAME];
printf("请输入要修改的联系人:");
scanf("%s", name);
int ret = find(con, name);
if (ret == -1)
printf("未找到该联系人!\n");
else
{
printf("请输入姓名:");
scanf("%s", con->data[ret].name);
printf("请输入性别:");
scanf("%s", con->data[ret].sex);
printf("请输入电话:");
scanf("%s", con->data[ret].num);
printf("请输入年龄:");
scanf("%d", &(con->data[ret].age));
printf("请输入地址:");
scanf("%s", con->data[ret].addr);
printf("修改联系人成功!\n");
}
}
static int find(const struct Contact* con,char* name)
{
int i = 0;
for (i = 0; i < con->sz; i++)
{
if (0==strcmp(con->data[i].name,name))
return i;
}
return -1;
}
void searchContact(struct Contact* con)
{
assert(con);
char name[20]={0};
printf("请输入要查找的联系人:");
scanf("%s", &name);
int ret=find(con, name);
if (ret == -1)
printf("未找到该联系人!\n");
else
{
printf("%-20s\t%-10s\t%-12s\t%-5s\t%-30s\n", "姓名", "性别", "电话", "年龄", "地址");
printf("%-20s\t%-10s\t%-12s\t%-5d\t%-30s\n", con->data[ret].name, con->data[ret].sex,
con->data[ret].num, con->data[ret].age, con->data[ret].addr);
}
}
void showContact(struct Contact* con)
{
assert(con);
int i = 0;
printf("%-20s\t%-10s\t%-12s\t%-5s\t%-30s\n", "姓名", "性别", "电话", "年龄", "地址");
for (i = 0; i < con->sz; i++)
{
printf("%-20s\t%-10s\t%-12s\t%-5d\t%-30s\n", con->data[i].name,con->data[i].sex,
con->data[i].num,con->data[i].age,con->data[i].addr);
}
}
int name_cmp(const void* e1, const void* e2)
{
return strcmp(((struct Peoinfo*)e1)->name, ((struct Peoinfo*)e2)->name);
}
int addr_cmp(const void* e1, const void* e2)
{
return strcmp(((struct Peoinfo*)e1)->addr, ((struct Peoinfo*)e2)->addr);
}
int age_cmp(const void* e1, const void* e2)
{
return ((struct Peoinfo*)e1)->age- ((struct Peoinfo*)e2)->age;
}
void sortContact(struct Contact con)
{
printf("********* 请选择排序方式:**********\n");
printf("********* 1.姓名 2.地址 **********\n");
printf("********* 3.年龄 ***********\n");
printf("************************************\n");
int a = 0;
scanf("%d", &a);
switch(a)
{
case 1:
qsort(con.data, con.sz, sizeof(con.data[0]), name_cmp);
break;
case 2:
qsort(con.data, con.sz, sizeof(con.data[0]), addr_cmp);
break;
case 3:
qsort(con.data, con.sz, sizeof(con.data[0]), age_cmp);
break;
default:
printf("输入错误\n");
break;
}
int i = 0;
printf("%-20s\t%-10s\t%-12s\t%-5s\t%-30s\n", "姓名", "性别", "电话", "年龄", "地址");
for (i = 0; i < con.sz; i++)
{
printf("%-20s\t%-10s\t%-12s\t%-5d\t%-30s\n", con.data[i].name, con.data[i].sex,
con.data[i].num, con.data[i].age, con.data[i].addr);
}
}
void clearContact(struct Contact* con)
{
con->sz = 0;
printf("清空联系人成功!\n");
}
test.c
#include "contact.h"
void Meue()
{
printf("************************************\n");
printf("***** 1.add 2.delete *****\n");
printf("***** 3.modify 4.search *****\n");
printf("***** 5.show 6.sort *****\n");
printf("***** 7.clear 0.exit *****\n");
printf("************************************\n");
}
int main()
{
int a = 0;
enum number
{
EXIT,
ADD,
DELETE,
MODIFY,
SEARCH,
SHOW,
SORT,
CLEAR
};
struct Contact con;
init_contact(&con);
do
{
Meue();
scanf("%d", &a);
switch (a)
{
case EXIT:
printf("成功退出!\n");
break;
case ADD:
addContact(&con);
break;
case DELETE:
deleteContact(&con);
break;
case MODIFY:
modifyContact(&con);
break;
case SEARCH:
searchContact(&con);
break;
case SHOW:
showContact(&con);
break;
case SORT:
sortContact(con);
break;
case CLEAR:
clearContact(&con);
break;
default:
printf("输入错误!\n");
break;
}
}
while (a);
return 0;
}
|