test.c
#define _CRT_SECURE_NO_WARNINGS
#include"contact.h"
/*
实现一个通讯录:人的信息:
名字+年龄+性别+电话+地址
1.存放100个人的信息
2.增加联系人
3.删除指定联系人
4.查找联系人
5.修改联系人
6.排序
7.、显示联系人
*/
/*
test.c 测试功能
contact.c 通讯录相关的实现
contact.h 通讯录相关的声明d
*/
enum option
{
EXIT,
ADD,
DEL,
CHANGE,
CHECK,
SHOW,
SORT,
};
void meau()
{
printf("***********************************\n");
printf("******** 0.exit 1.add ********\n");
printf("******** 2.del 3.change ********\n");
printf("******** 4.check 5.show ********\n");
printf("******** 6.sort ********\n");
printf("***********************************\n");
}
int main()
{
contact pc = {0};
//初始化pc
inti(&pc);
int input = 0;
do
{
meau();
printf("请输入您要选择的模式:>\n");
scanf("%d", &input);
switch (input)
{
case EXIT:
printf("退出成功\n");
break;
case ADD:
addContact(&pc);
break;
case DEL:
delContact(&pc);
break;
case CHECK:
checkContact(&pc);
break;
case CHANGE:
changeContact(&pc);
break;
case SHOW:
showContact(&pc);
break;
case SORT:
sortContact(&pc);
break;
default:
printf("对不起,您选择的模式不合法\n");
break;
}
} while (input);
return 0;
}
contact.c
#define _CRT_SECURE_NO_WARNINGS
#include"contact.h"
//初始化pc
void inti(contact* pc)
{
assert(pc);
memset(pc->inFo, 0, sizeof(pc->inFo));
pc->count = 0;
}
//增加联系人
void addContact(contact* pc)
{
assert(pc);
if (pc->count == MAX_INFOPEOPLE)
{
printf("对不起,通讯录已满\n");
return;
}
printf("请输入姓名:>\n");
scanf("%s", pc->inFo[pc->count].name);
printf("请输入年龄:>\n");
scanf("%d", &(pc->inFo[pc->count].age));
printf("请输入性别:>\n");
scanf("%s", pc->inFo[pc->count].sex);
printf("请输入电话:>\n");
scanf("%s", pc->inFo[pc->count].tele);
printf("请输入地址:>\n");
scanf("%s", pc->inFo[pc->count].addr);
//记录通讯录中联系人的个数
(pc->count)++;
printf("增加成功!\n");
return;
}
//显示通讯录
void showContact(const contact* pc)
{
assert(pc);
if (pc->count == 0)
{
printf("通讯录为空\n");
return;
}
printf("%-20s\t%-6s\t%-12s\t%-14s\t%-50s\n", "姓名", "年龄", "性别", "电话", "地址");
for (int i = 0; i < pc->count; i++)
{
printf("%-20s\t%-6d\t%-12s\t%-14s\t%-50s\n",
pc->inFo[i].name,
pc->inFo[i].age,
pc->inFo[i].sex,
pc->inFo[i].tele,
pc->inFo[i].addr);
}
}
//删除指定联系人
void delContact(contact* pc)
{
assert(pc);
if (pc->count == 0)
{
printf("通讯录为空,无联系人可删\n");
return;
}
int ret = findPeopleByName(pc);
if (ret == -1)
{
printf("该联系人不存在\n");
return;
}
for (int i = ret; i < (pc->count) - 1; i++)
{
pc->inFo[i] = pc->inFo[i + 1];
}
(pc->count)--;
printf("删除成功\n");
}
//通过姓名查找联系人,无此人返回-1,否则返回下标。
int findPeopleByName(const contact* pc)
{
//接收联系人的姓名
char name[MAX_NAME];
printf("请输入联系人的姓名:>\n");
scanf("%s", &name);
for (int i = 0; i < pc->count; i++)
{
if (strcmp(name, pc->inFo[i].name) == 0)
{
return i;
}
}
return -1;
}
//查找指定联系人并显示其全部信息
void checkContact(const contact* pc)
{
assert(pc);
if (pc->count == 0)
{
printf("通讯录为空\n");
return;
}
int ret = findPeopleByName(pc);
if (ret == -1)
{
printf("该联系人不存在\n");
return;
}
printf("%-20s\t%-6s\t%-12s\t%-14s\t%-50s\n", "姓名", "年龄", "性别", "电话", "地址");
printf("%-20s\t%-6d\t%-12s\t%-14s\t%-50s\n",
pc->inFo[ret].name,
pc->inFo[ret].age,
pc->inFo[ret].sex,
pc->inFo[ret].tele,
pc->inFo[ret].addr);
}
//查找指定联系人并修改其信息
void changeContact(contact* pc)
{
assert(pc);
if (pc->count == 0)
{
printf("通讯录为空\n");
return;
}
int ret = findPeopleByName(pc);
if (ret == -1)
{
printf("该联系人不存在\n");
return;
}
printf("已查找到联系人\n");
printf("请输入修改后的姓名:>\n");
scanf("%s", pc->inFo[ret].name);
printf("请输入修改后的年龄:>\n");
scanf("%d", &(pc->inFo[ret].age));
printf("请输入修改后的性别:>\n");
scanf("%s", pc->inFo[ret].sex);
printf("请输入修改后的电话:>\n");
scanf("%s", pc->inFo[ret].tele);
printf("请输入修改后的地址:>\n");
scanf("%s", pc->inFo[ret].addr);
printf("修改成功\n");
}
int compareByName(void* e1,void* e2)
{
return strcmp(((struct peopleInFo*)e1)->name, ((struct peopleInFo*)e2)->name);
}
//对通讯录中的内容按照名字进行排序
void sortContact(contact* pc)
{
assert(pc);
if (pc->count == 0)
{
printf("通讯录为空\n");
return;
}
// compareByName,其中的e1与e2一定是被即将排序的所包含的
qsort(pc->inFo,pc->count,sizeof(struct peopleInFo), compareByName);
printf("排序成功\n");
}
contact.h
#pragma once
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
#include<errno.h>
#define MAX_NAME 20
#define MAX_SEX 10
#define MAX_TELE 12
#define MAX_ADDR 50
#define MAX_INFOPEOPLE 100
struct peopleInFo
{
char name[MAX_NAME];
int age;
char sex[MAX_SEX];
char tele[MAX_TELE];
char addr[MAX_ADDR];
};
typedef struct contact
{
struct peopleInFo inFo[MAX_INFOPEOPLE];
int count;
}contact;
//初始化pc
void inti(contact* pc);
//增加联系人
void addContact(contact* pc);
//显示通讯录
void showContact(contact* pc);
//删除指定联系人
void delContact(contact* pc);
//查找指定联系人并显示其全部信息
void checkContact(contact* pc);
//查找指定联系人并修改其信息
void changeContact(contact* pc);
//对通讯录中的内容按照名字进行排序
void sortContact(contact* pc);