公共头文件 utili.h
#ifndef _UTILI_H//预处理指令解决头文件可能存在的重复问题
#define _UTILI_H
//定义的是公共头文件,内部存放的是库函数之类的
#include
#include
#include
#endif/*_UTILI_H_*/
通讯录头文件Contact.h
#ifndef _CONTACT_H
#define _CONTACT_H
//主要做一些函数的声明、定义,自定义类型的定义,函数要先声明完成后才能调用
#include"utili.h" //引入公共头文件
enum{QUIT,ADD,DEL,FIND,MODIFY,CLEAR,SORT,SHOW};//枚举定义选项框
#define MAX_NAME_SIZE 20
#define MAX_SEX_SZIE 3
#define MAX_TEL_SIZE 20
#define MAX_ADD_SIZE 256
#define MAX_CONTACT_SIZE 256
#define scanf scanf_s
//定义人员信息结构体
typedef struct PersonInfo
{
char name[MAX_NAME_SIZE];
char sex[MAX_SEX_SZIE];
int age;
char tel[MAX_TEL_SIZE];
char address[MAX_ADD_SIZE];
}PersonInfo;
//定义通讯录结构
typedef struct Contact
{
PersonInfo Cont[MAX_CONTACT_SIZE]; //人员信息结构体数组
size_t capacity; //通讯录的容量
size_t size; //通讯录存放的人员信息的个数
}Contact;
//函数声明
bool IsFull(Contact* pcnt);
bool IsEmpty(Contact* pcnt);
int FindByName(Contact* pcnt);
void InitContact(Contact* pcnt);
void AddContact(Contact* pcnt);
void DelContact(Contact* pcnt);
void FindContact(Contact* pcnt);
void ModifyContact(Contact* pcnt);
void ClearContact(Contact* pcnt);
void SortContact(Contact* pcnt);
void ShowContact(Contact* pcnt);
void ShowPersonInfo(Contact* pcnt, int loca);
#endif //预处理解决可能存在的头文件重复问题
Contact.c函数实现
#include"Contact.h"//引入头文件
//主要负责除主函数外的函数的实现
void InitContact(Contact* pcnt)//通讯录初始化
{
memset(pcnt->Cont, 0, sizeof(PersonInfo) * MAX_CONTACT_SIZE);//memset将人员信息全部置零
pcnt->capacity = MAX_CONTACT_SIZE;
pcnt->size = 0;
}
bool IsFull(Contact* pcnt) //判断通讯录是否已满,满则返回true
{
return (pcnt->size >= pcnt->capacity);
}
bool IsEmpty(Contact* pcnt)//判断通讯录是否为空,空则返回true
{
return (pcnt->size == 0);
}
void ShowPersonInfo(Contact*pcnt,int loca)//展示通讯录中下标为loca的人员信息
{
printf("%-8s%-6s%-6d%-13s%s\n", //使输出对齐
pcnt->Cont[loca].name,
pcnt->Cont[loca].sex,
pcnt->Cont[loca].age,
pcnt->Cont[loca].tel,
pcnt->Cont[loca].address);
}
void ShowContact(Contact* pcnt)//展示通讯录中的人员信息
{
if (IsEmpty(pcnt)) //判空
{
printf("通讯录为空,没有信息\n");
}
else
printf("%-8s%-6s%-6s%-13s%s\n","姓名","性别","年龄","电话","地址");
for (int i = 0; i < pcnt->size; ++i)
{
printf("%-8s%-6s%-6d%-13s%s\n",
pcnt->Cont[i].name,
pcnt->Cont[i].sex,
pcnt->Cont[i].age,
pcnt->Cont[i].tel,
pcnt->Cont[i].address);
}
}
void AddContact(Contact* pcnt)//增加人员信息
{
if (IsFull(pcnt))//检查容量,若通讯录已满,展示提示信息
{
printf("通讯录已满,无法新增人员信息\n");
return;
}
printf("请输入信息:<\n");
printf("姓名:<");
scanf("%s", pcnt->Cont[pcnt->size].name,MAX_NAME_SIZE);
printf("性别:<");
scanf("%s", pcnt->Cont[pcnt->size].sex,MAX_SEX_SZIE);
printf("年龄:<");
scanf("%d", &pcnt->Cont[pcnt->size].age);
printf("电话:<");
scanf("%s", pcnt->Cont[pcnt->size].tel,MAX_TEL_SIZE);
printf("地址:<");
scanf("%s", pcnt->Cont[pcnt->size].address,MAX_ADD_SIZE);
pcnt->size++;
printf("新增人员信息成功!\n");
}
void DelContact(Contact* pcnt)//删除人员信息
{
if (IsEmpty(pcnt)) //先判断通讯录是否为空
{
printf("通讯录里一个人都没有,无法删除\n");
return ;
}
char name[MAX_NAME_SIZE];
printf("输入想要删除的人的姓名:<\n");
scanf("%s", name, MAX_NAME_SIZE);
int ret = FindByName(pcnt, name);
for (int i = ret; i < pcnt->size; ++i)
{
pcnt->Cont[i] = pcnt->Cont[i + 1];
}pcnt->size--;
printf("删除信息成功。。。。\n");
}
int FindByName(Contact* pcnt,char name[])//通过名字进行人员查找,找到返回该人员所在位置的下标,否则返回-1
{
for (int i = 0; i < pcnt->size; ++i)
{
if (strcmp(pcnt->Cont[i].name, name) == 0)
return i;
}
return -1;
}
void FindContact(Contact* pcnt)//查找人员信息并打印
{
char ch = getchar();
if (IsEmpty(pcnt))
{
printf("通讯录里一个人都没有\n");
return ;
}
char name[MAX_NAME_SIZE];
printf("请输入要查询的名字:>");
scanf("%s", name,MAX_NAME_SIZE);
int ret = FindByName(pcnt,name);
if (ret == -1)
{
printf("您要查找的信息不存在\n");
return;
}
ShowPersonInfo(pcnt, ret);
}
void ModifyContact(Contact* pcnt)//修改人员信息
{
if (IsEmpty(pcnt))
{
printf("通讯录里一个人都没有,无法修改\n");
return;
}
char name[MAX_NAME_SIZE];
printf("请输入想要修改信息的人员的姓名:<\n");
scanf("%s", name, MAX_NAME_SIZE);
int ret = FindByName(pcnt, name); //按人名查找
if (ret == -1)
{
printf("该人员信息不存在。。。。\n");
return;
}
int select = 1;
while (select)
{
ShowPersonInfo(pcnt,ret); //将人员信息展示,看看要作何修改
printf("请输入想要修改的信息:<\n");
printf("1-姓名 2-性别 3-年龄 4-电话号码 5-家庭住址 6-退出 \n"); //建立一个循环,可一直修改信息,到满意为止,选择退出修改
int select;
scanf("%d", &select, 10);
switch (select)
{
case 1:
printf("请输入修改后的姓名:<\n");
scanf("%s", pcnt->Cont[ret].name, MAX_NAME_SIZE);
continue;
case 2:
printf("请输入修改后的性别:<\n");
scanf("%s", pcnt->Cont[ret].sex, MAX_SEX_SZIE);
continue;
case 3:
printf("请输入修改后的年龄:<\n");
scanf("%d", &pcnt->Cont[ret].age);
continue;
case 4:
printf("请输入修改后的电话号码:<\n");
scanf("%s", pcnt->Cont[ret].tel, MAX_TEL_SIZE);
continue;
case 5:
printf("请输入修改后的家庭住址:<\n");
scanf("%s", pcnt->Cont[ret].address, MAX_ADD_SIZE);
continue;
case 6:
break;
}
printf("修改人员信息成功。。。。\n");
break;
}
}
void ClearContact(Contact* pcnt)//清空通讯录
{
if (IsEmpty(pcnt)) // 先判断通讯录是否为空?
{
printf("通信录已经为空\n");
return;
}
printf("是否确定清空通讯录?:\n");//这里要吃掉一个换行'\n'
char ch1 = getchar();
char ch = getchar();
if (ch == 'Y' || ch == 'y')
{
pcnt->size = 0;
printf("通讯录已清空\n");
return;
}
else if (ch == 'N' || ch == 'n')
{
printf("已取消清空通讯录\n");
return;
}
else printf("输入非法。。。。\n");
return;
}
void SortContact(Contact* pcnt)//通讯录排序
{
for (int i = 0; i < pcnt->size-1;++i)
{
for (int j = 0; j < pcnt->size - i-1; ++j)
{
PersonInfo tmp;
if (strcmp(pcnt->Cont[j].name, pcnt->Cont[j + 1].name) > 0)
{
tmp = pcnt->Cont[j];
pcnt->Cont[j] = pcnt->Cont[j+ 1];
pcnt->Cont[j + 1] = tmp;
}
}
}
printf("通讯录排序成功!!!\n");
return;
}
ContactMain.c主函数
#include"Contact.h" //引入头文件
int main(int argc, char* argv[])//主函数
{
Contact Cont;//定义一个通讯录
InitContact(&Cont);//初始化通讯录
int select = 1;
while(select)
{
printf("************************\n");
printf("****通****讯****录******\n");
printf("************************\n");
printf("**[1]Add [2]Del **\n");
printf("**[3]Find [4]Mod **\n");
printf("**[5]Clear [6]Sort **\n");
printf("**[0]Quit [7]Show **\n");
printf("************************\n");
printf("请选择:>\n");
scanf("%d", &select);
if (8 <= select || select < 0)
{
printf("输入非法,请输入正确的选项。。。。\n");
break;
}
switch (select)
{
case QUIT://退出
break;
case ADD://增
AddContact(&Cont);
continue;
case DEL://删
DelContact(&Cont);
continue;
case FIND://查
FindContact(&Cont);
continue;
case MODIFY://改
ModifyContact(&Cont);
continue;
case CLEAR://清空
ClearContact(&Cont);
continue;
case SORT://排序
SortContact(&Cont);
continue;
case SHOW://展示
ShowContact(&Cont);
continue;
}
break;
}
printf("您已退出通讯录。。。See you");
}