contact.h//头文件(注:需要自己建立一个新的头文件)
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<assert.h>
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TEL 13
#define MAX_ADDR 30
#define MAX 1000
typedef struct people_information
{
char name[MAX_NAME];
int age;
char sex[MAX_SEX];//性别
char tel[MAX_TEL];//电话
char addr[MAX_ADDR];//地址
}spi;
struct contact
{
spi data[MAX];//存放信息
int sz;//确定通讯录有多少成员
};
//为增加代码的可读性,添加一个枚举类型
enum command
{
exit,
add,
del,
search,
modify,
show,
sort
};
//由于在很多操作中都需要用到查找,因此自定义一个查找函数
static int seek_appointed(char* ps, const struct contact* p)
{
assert(ps&&p);
int i = 0;
for (i = 0; i < p->sz; i++)
{
if (strcmp(ps, p->data[i].name) == 0)
return i;//寻找到了返回通讯录中成员下标
}
if (i == p->sz)
return -1;//寻找不到返回-1
}
//函数声明
//初始化通讯录
void Init_contact(struct contact* p);
//添加通讯录成员
void add_contact(struct contact* p);
//展示通讯录
void show_contact(const struct contact* p);
//删除通讯录中的指定成员
void del_contact(struct contact* p);
//查找通讯录中的指定成员
void search_contact(const struct contact* p);
//修改通讯录的指定成员
void modify_contact(struct contact* p);
//排序通讯录的指定成员
void sort_contact(struct contact* p);
contact(通讯录).cpp//各模块函数实现的代码
#define _CRT_SECURE_NO_WARNINGS
#include"contact.h"
//函数的定义
//初始化通讯录
void Init_contact(struct contact* p)
{
assert(p);//断言,防止输入空指针
memset(p->data, 0, sizeof(p->data));
p->sz = 0;
}
//添加通讯录成员
void add_contact(struct contact* p)
{
assert(p);
if (p->sz == MAX)
{
printf("通讯录已满,存入失败\n");
return;
}
else
{
//添加成员信息
printf("请输入姓名:\n");
scanf("%s", p->data[p->sz].name);//scanf()括号""里的占位符不能加换行符!!!!!
printf("请输入年龄:\n");
scanf("%d", &(p->data[p->sz].age));
printf("请输入性别:\n");
scanf("%s", p->data[p->sz].sex);
printf("请输入电话:\n");
scanf("%s", p->data[p->sz].tel);
printf("请输入地址:\n");
scanf("%s", p->data[p->sz].addr);
p->sz++;
printf("添加成功\n");
}
}
//展示通讯录
void show_contact(const struct contact* p)
{
assert(p);
if (p->sz == 0)
printf("通讯录为空\n");
else
{
printf("%-20s\t%-3s\t%-5s\t%-13s\t%-30s\n","名字","年龄","性别","电话","地址");//\t——水平制表符——空4个空格
int i = 0;
for (i = 0; i < p->sz; i++)
{
printf("%-20s\t%-3d\t%-5s\t%-13s\t%-30s\n",
p->data[i].name,
p->data[i].age,
p->data[i].sex,
p->data[i].tel,
p->data[i].addr
);
}
}
}
//删除通讯录中的指定成员
void del_contact(struct contact* p)
{
assert(p);
if (p->sz == 0)
printf("通讯录为空,无法删除。请添加数据后重试\n");
else
{
char name[MAX_NAME];
printf("请输入要删除成员的名字\n");
scanf("%s", name);
int ret=seek_appointed(name,p);//在通讯录中寻找输入的成员
if (ret == -1)
printf("需要删除的成员不存在\n");
else
{
int i = 0;
for (i = ret; i <p->sz-1; i++)
{
p->data[i] = p->data[i + 1];//让后面的数据覆盖前面的数据
}
p->sz--;//通讯录成员总数-1
printf("删除成功\n");
}
}
}
//查找通讯录中的指定成员
void search_contact(const struct contact* p)
{
char name[MAX_NAME];
printf("请输入需要查找成员的名字\n");
scanf("%s", name);
int i = seek_appointed(name, p);
if (i == -1)
printf("需要查找的成员不存在\n");
else
{
//打印指定成员
printf("%-20s\t%-3s\t%-5s\t%-13s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
printf("%-20s\t%-3d\t%-5s\t%-13s\t%-30s\n",
p->data[i].name,
p->data[i].age,
p->data[i].sex,
p->data[i].tel,
p->data[i].addr
);
}
}
//修改通讯录的指定成员
void modify_contact(struct contact* p)
{
char name[MAX_NAME];
printf("请输入需要修改成员的姓名\n");
scanf("%s", name);
int i = seek_appointed(name,p);
if (i == -1)
printf("需要修改的成员不存在\n");
else
{
//相当于重新在指定位置输入想要的值
printf("请输入姓名:\n");
scanf("%s", p->data[i].name);
printf("请输入年龄:\n");
scanf("%d", &(p->data[i].age));
printf("请输入性别:\n");
scanf("%s", p->data[i].sex);
printf("请输入电话:\n");
scanf("%s", p->data[i].tel);
printf("请输入地址:\n");
scanf("%s", p->data[i].addr);
printf("修改成功\n");
}
}
//排序通讯录的指定成员
void sort_contact(struct contact* p)
{
assert(p);
if (p->sz <2)
printf("通讯录成员少于两个,请输入数据后重试\n");
else
{
char name_dest[MAX_NAME];
char name_sor[MAX_NAME];
do
{
//没找到继续循环,找到了走else,只有当else里的break成功执行后才能跳出循环
printf("请输入需要排序成员的名字\n");
scanf("%s", name_sor);
int i = seek_appointed(name_sor, p);
if (i == -1)
printf("通讯录中无指定的成员,请重新输入后重试\n");
else
{
do
{
printf("请输入需要被交换的成员的名字\n");
scanf("%s", name_dest);
int j = seek_appointed(name_dest, p);
if (j == -1)
printf("通讯录中无指定成员,请重新输入后重试\n");
else
{
spi temp = p->data[i];
p->data[i] = p->data[j];
p->data[j] = temp;
printf("排序完成\n");
break;
}
} while (name_dest);
break;
}
} while (name_sor);
}
}
test.cpp//新建一个专门用来测试的c++文件
#include"contact.h"
void menu()
{
printf("*********************************\n");
printf("****1、add 2、del ****\n");
printf("****3、search 4、modify****\n");//4、修改
printf("****5、show 6、sort ****\n");//6、排序
printf("****0、exit ****\n");
printf("*********************************\n");
}
int main()
{
int input=0 ;
//创建通讯录
struct contact p;
//初始化通讯录
Init_contact(&p);
do
{
menu();
printf("请输入:\n");
scanf("%d", &input);
switch(input)
{
case add:
add_contact(&p);
break;
case del:
del_contact(&p);
break;
case search:
search_contact(&p);
break;
case modify:
modify_contact(&p);
break;
case show:
show_contact(&p);
break;
case sort:
sort_contact(&p);
break;
case exit:
printf("关闭通讯录\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (input);
}