//contact.h
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
#define NAME_MAX 20 //存放姓名的数组大小
#define SEX_MAX 6 //存放性别的数组大小
#define TELE_MAX 12 //存放电话的数组大小
#define ADDRESS_MAX 20 //存放地址的数组大小
#define DATA_MAX 1000 //存放个人信息的数组大小
enum c
{
EXIT,
ADD,
DEL,
SEARCH,
MOD,
PRINT,
SORT,
EMPTY,
};
typedef struct peoInfo
{
char name[NAME_MAX];
int age;
char sex[SEX_MAX];
char tele[TELE_MAX];
char address[ADDRESS_MAX];
}peoInfo;
//静态contact
typedef struct contact
{
peoInfo data[DATA_MAX];//存放个人信息
int sz;//记录有几个人的信息
}contact;
//初始化
void InitContact(contact* pc);
//增加信息
void AddContact(contact* pc);
//打印通讯录
void PrintContact(contact* pc);
//删除联系人
void DelContact(contact* pc);
//查找联系人
void SearchContact(contact* pc);
//修改联系人
void ModContact(contact* pc);
//清空联系人
void EmptyContact(contact* pc);
//联系人排序
void SortContact(contact* pc);
//contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
//初始化
void InitContact(contact* pc)
{
assert(pc);
memset(pc->data, 0, sizeof(pc->data));
pc->sz = 0;
}
//增加信息
void AddContact(contact* pc)
{
if (pc->sz == DATA_MAX)
{
printf("通讯录已满,无法添加\n");
return;
}
assert(pc);
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].tele);
printf("输入地址->");
scanf("%s", pc->data[pc->sz].address);
pc->sz++;
printf("添加成功\n");
}
//打印通讯录
void PrintContact(contact* pc)
{
assert(pc);
int i = 0;
printf("%-10s\t%-5s\t%-6s\t%-12s\t%-15s\n", "姓名", "年龄", "性别", "电话", "地址");
for (i = 0; i < pc->sz; i++)
{
printf("%-10s\t%-5d\t%-6s\t%-12s\t%-15s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].address);
}
printf("\n");
}
//判断名字是否一致
int Find_Name(contact* pc, char* name)
{
assert(pc && name);
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (0 == strcmp(pc->data[i].name, name))
{
return i;
}
}
return -1;
}
//删除联系人
void DelContact(contact* pc)
{
assert(pc);
char name[NAME_MAX];
if (pc->sz == 0)
{
printf("通讯录没有联系人\n");
return;
}
printf("输入需要删除人的姓名\n");
scanf("%s", name);
//找到返回坐标,没找到返回0.
int pos = Find_Name(pc, name);
if (pos == -1)
{
printf("没有找到要删除的联系人\n");
}
else
{
int j = 0;
for (j = pos; j < pc->sz - 1; j++)
{
pc->data[j] = pc->data[j + 1];
}
pc->sz--;
printf("删除成功\n");
PrintContact(pc);
}
}
//查找联系人
void SearchContact(contact* pc)
{
assert(pc);
char name[NAME_MAX];
if (pc->sz == 0)
{
printf("通讯录没有联系人\n");
return;
}
printf("输入查找人的姓名\n");
scanf("%s", name);
//找到返回坐标,没找到返回0.
int pos = Find_Name(pc, name);
if (pos == -1)
{
printf("没有找到要删除的联系人\n");
}
else
{
printf("找到联系人\n");
printf("%-10s %-5s %-6s %-12s %-15s\n", "姓名", "年龄", "性别", "电话", "地址");
printf("%-10s %-5d %-6s %-12s %-15s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex,
pc->data[pos].tele, pc->data[pos].address);
}
}
//修改联系人
void ModContact(contact* pc)
{
assert(pc);
char name[NAME_MAX];
if (pc->sz == 0)
{
printf("通讯录没有联系人\n");
return;
}
printf("输入需要修改联系人的姓名->");
scanf("%s", name);
int pos = Find_Name(pc, name);
if (pos == -1)
{
printf("没有找到要删除的联系人\n");
}
else
{
printf("输入新的姓名->");
scanf("%s", pc->data[pos].name);
printf("输入新的年龄->");
scanf("%d", &(pc->data[pos].age));
printf("输入新的性别->");
scanf("%s", pc->data[pos].sex);
printf("输入新的电话->");
scanf("%s", pc->data[pos].tele);
printf("输入新的地址->");
scanf("%s", pc->data[pos].address);
printf("修改成功\n");
//修改完后,打印一下子
PrintContact(pc);
}
}
//清空联系人
void EmptyContact(contact* pc)
{
assert(pc);
char q = 0;
printf("你确定要清空所有联系人吗?(Y/N)\n");
getchar();
scanf("%c", &q);
if (q == 'Y')
{
int i = 0;
for (i = pc->sz - 1; i > 0; i--)
{
pc->data[i - 1] = pc->data[i];
pc->sz--;
}
if (pc->sz == 1)
{
pc->sz--;
}
//打印
printf("清空联系人\n");
PrintContact(pc);
}
else
{
printf("取消清空联系人\n");
return;
}
}
//qsort排序
int con_name(const void* e1, const void* e2)
{
return (strcmp(((contact*)e1)->data->name, ((contact*)e2)->data->name));
}
//联系人排序
void SortContact(contact* pc)
{
assert(pc);
qsort(pc->data, pc->sz, sizeof(pc->data[0]), con_name);
//打印
printf("排序完成\n");
PrintContact(pc);
}
//test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void menu()
{
printf("-------------------------------\n");
printf("-------1.add 2.del---------\n");
printf("-------------------------------\n");
printf("-------3.search 4.mod---------\n");
printf("-------------------------------\n");
printf("-------5.print 6.sort--------\n");
printf("-------------------------------\n");
printf("-------7.empty 0.exit--------\n");
printf("-------------------------------\n");
}
void test()
{
int input = 0;
contact con;
InitContact(&con);
do
{
menu();//菜单
printf("选择功能->");
scanf("%d", &input);
switch (input)
{
case ADD:
//增加信息
AddContact(&con);
break;
case DEL:
//删除联系人
DelContact(&con);
break;
case SEARCH:
//查找联系人
SearchContact(&con);
break;
case MOD:
//修改联系人
ModContact(&con);
break;
case PRINT:
//打印通讯录
PrintContact(&con);
break;
case SORT:
//联系人排序
SortContact(&con);
break;
case EMPTY:
//清空联系人
EmptyContact(&con);
break;
case EXIT:
printf("退出程序。\n");
break;
default:
printf("输入错误,请重新选择。\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}