实现一个通讯录;
通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址
提供方法:
- 添加联系人信息
- 删除指定联系人信息
- 查找指定联系人信息
- 修改指定联系人信息
- 显示所有联系人信息
- 清空所有联系人
- 以名字排序所有联系人
下面是头文件部分
#define _CRT_SECURE_NO_WARNINGS
#define MAN_NAME 15 //定义名字数组中字符元素个数
#define MAN_SEX 5 //定义性别数组中字符元素个数
#define MAX_NUMBER 30 //定义号码数组中字符元素个数
#define MAX_ADDRESS 30 //定义地址数组中字符元素个数
#define MAX 1000 //定义数组中元素个数
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
typedef struct message
{
char name[MAN_NAME];
char sex[MAN_SEX];
int age;
char number[MAX_NUMBER];
char address[MAX_ADDRESS];
}meaaage;
typedef struct PEOINF
{
meaaage adta[MAX]; //定义数组来存储1000个人的信息
int sz; //定义变量来记录通讯录中有效信息个数
}ab;
//初始化通讯录
void Iniab(ab* content); //初始化通讯录函数声明
//增加联系人信息
void addcontent(ab* content); //增加联系人函数声明
//删除联系人信息
void delcontent(ab* content); //删除联系人函数声明
//寻找联系人信息
void seekcontent(ab* content); //寻找联系人函数声明
//修改联系人信息
void modcontent(ab* content); //修改联系人函数声明
//展示联系人信息
void showcontent(ab* content); //展示联系人函数声明
//清空联系人信息
void emptycontent(ab* content); //清空联系人函数声明
//排序联系人信息
void sortcontent(ab* content); //排序联系人信息函数声明
下面是各个函数部分
#include "ab.h"
//查找名字函数
int Findbyname(ab* content, char name[])
{
int i = 0;
for (i = 0; i < content->sz; i++)
{
if (strcmp(name, content->adta[i].name) == 0)
{
return i;
}
}
return -1;
}
//查联系人信息函数
int information(ab* content, char name[])
{
printf("请输入联系人姓名->");
scanf("%s", name);
int pos = Findbyname(content, name); //查找名字函数
//判断是否有该联系人
if (pos == -1)
{
printf("没有找到该联系人\n");
}
else
{
//查找到相应联系人,将联系人的信息展示出来
int i = pos;
printf("%-7s\t%-5s\t%-5s\t%-15s\t%-15s\n", "姓名", "性别", "年龄", "电话", "住址");
printf("%-7s\t%-5s\t%-5d\t%-15s\t%-15s\n",
content->adta[i].name, content->adta[i].sex, content->adta[i].age, content->adta[i].number, content->adta[i].address);
return i;
}
}
int_cmp_name(const void* p1, const void* p2) //字符比较函数
{
return strcmp(((meaaage*)p1)->name, ((meaaage*)p2)->name);
}
//初始化通讯录函数
void Iniab(ab* content)
{
content->sz = 0;
memset(content->adta, 0, sizeof(content->adta));
return;
}
//增加联系人函数
void addcontent(ab* content)
{
assert(content);
//在增加联系人之前要判断通讯录是否满了
if (content->sz == MAX) //通讯录满了
{
printf("通讯录满了\n");
return;
}
//通讯录没满
printf("请输入联系人姓名->");
scanf("%s", content->adta[content->sz].name);
printf("请输入联系人性别->");
scanf("%s",content->adta[content->sz].sex);
printf("请输入联系人年龄->");
scanf("%d", &(content->adta[content->sz].age));
printf("请输入联系人电话->");
scanf("%s", content->adta[content->sz].number);
printf("请输入联系人住址->");
scanf("%s", content->adta[content->sz].address);
printf("增加联系人成功\n");
content->sz++;
return;
}
//删除联系人函数
void delcontent(ab* content)
{
char name[MAN_NAME] = {0};
assert(content);
printf("请输入要删除的联系人姓名->");
scanf("%s", name);
int pos = Findbyname(content, name); //查找名字函数
//在删除联系人之前先判断是否有该要删除的联系人
if (pos == -1)
{
printf("没有找到要删除的联系人\n");
}
else
{
int i = 0;
for (i = pos; i < content->sz; i++)
{
content->adta[i] = content->adta[i + 1];
}
content->sz--;
printf("删除指定联系人成功\n");
}
return;
}
//寻找联系人函数
void seekcontent(ab* content)
{
assert(content);
char name[MAN_NAME] = { 0 };
information(content, name); //查联系人信息函数
return;
}
//修改联系人信息函数
void modcontent(ab* content)
{
assert(content);
char name[MAN_NAME] = { 0 };
int i = information(content, name); //查联系人信息函数
printf("请输入要修改信息的联系人姓名->");
scanf("%s", name);
//int i
int pos = Findbyname(content, name); //查找名字函数
修改联系人信息
printf("请输入修改后的信息\n");
printf("请输入联系人姓名->");
scanf("%s", content->adta[i].name);
printf("请输入联系人性别->");
scanf("%s", content->adta[i].sex);
printf("请输入联系人年龄->");
scanf("%d", &(content->adta[i].age));
printf("请输入联系人电话->");
scanf("%s", content->adta[i].number);
printf("请输入联系人住址->");
scanf("%s", content->adta[i].address);
printf("修改信息联系人成功\n");
return;
}
//展示联系人函数
void showcontent(ab* content)
{
//姓名、性别、年龄、电话、住址
assert(content);
int i = 0;
printf("%-7s\t%-5s\t%-5s\t%-15s\t%-15s\n","姓名","性别","年龄","电话","住址");
for (i = 0; i < content->sz; i++)
{
printf("%-7s\t%-5s\t%-5d\t%-15s\t%-15s\n",
content->adta[i].name, content->adta[i].sex, content->adta[i].age, content->adta[i].number, content->adta[i].address);
}
return;
}
//清空联系人函数
void emptycontent(ab* content)
{
assert(content);
char input = 0;
printf("请确认是否要清空通讯录(Y/N)->");
while ((getchar()) != '\n')
{
;
}
if ((input = getchar()) == 'Y')
Iniab(content); //初始化函数——将通讯录全部初始化
return;
}
//排序联系人信息函数
void sortcontent(ab* content)
{
assert(content);
//用qsort函数快速实现排序
qsort(content->adta,content->sz,sizeof(content->adta[0]),int_cmp_name);
int i = 0;
printf("%-7s\t%-5s\t%-5s\t%-15s\t%-15s\n", "姓名", "性别", "年龄", "电话", "住址");
for (i = 0; i < content->sz; i++)
{
printf("%-7s\t%-5s\t%-5d\t%-15s\t%-15s\n",
content->adta[i].name, content->adta[i].sex, content->adta[i].age, content->adta[i].number, content->adta[i].address);
}
return;
}
下面是test.c部分
#include "ab.h"
//实现通讯录:通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址
//1.添加联系人信息
//2.删除指定联系人信息
//3.查找指定联系人信息
//4.修改指定联系人信息
//5.显示所有联系人信息
//6.清空所有联系人
//7.以名字排序所有联系人
enum mean
{
EXIT,
ADD,
DEL,
SEEK,
MOD,
SHOW,
EMPTY,
SORT
};
void mean()
{
printf("*****************************************************************\n");
printf("********* 1.add 2.del ***********\n");
printf("********* 3.seek 4.mod ***********\n");
printf("********* 5.show 6.empty ***********\n");
printf("********* 7.sort 0.exit ***********\n");
printf("*****************************************************************\n");
}
int main()
{
//初始化通讯录
ab content; //定义结构体变量content
Iniab(&content); //初始化通讯录,这里传参选择传地址过去
int input = 0;
do
{
mean();
printf("请选择->");
scanf("%d", &input);
switch (input)
{
case EXIT:
printf("退出通讯录\n");
break;
case ADD:
addcontent(&content); //增加联系人函数
break;
case DEL:
delcontent(&content); //删除联系人函数
break;
case SEEK:
seekcontent(&content); //寻找联系人函数
break;
case MOD:
modcontent(&content); //修改联系人函数
break;
case SHOW:
showcontent(&content); //展示联系人函数
break;
case EMPTY:
emptycontent(&content); //清空联系人信息
break;
case SORT:
sortcontent(&content); //排序联系人信息
break;
}
} while (input);
return 0;
}