实现一个通讯录:
通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名,年龄,电话,地址,性别。
提供方法:
1.添加联系人信息
2.删除指定联系人信息
3.查找指定联系人信息
4.修改指定联系人信息
5.显示所有联系人信息
6.以名字排序所有联系人
7.清空所有联系人
实现时注意的要点:
1.用结构体来存储联系人的信息->PeoInfo
2.用数组来存储总共多少个联系人,并用count来记录有多少个联系人
3.使用枚举来实现程序的可读性
以下是代码实现:
头文件contact.h
#ifndef __CONTACT_H__
#define __CONTACT_H__
#include<stdio.h>
#include<string.h>
enum OPTION
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SHOW,
SORT,
EMPTY
};
enum Modify
{
EXIT1,
NAME,
AGE,
TEL,
ADDR,
SEX
};
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TEL 50
#define MAX_ADDR 100
#define MAX 1000
typedef struct PeoInfo //用数组存放通讯录中的人数,而人的信息用结构体存储
{
char name[MAX_NAME];
int age;
char sex[MAX_SEX];
char tel[MAX_TEL];
char addr[MAX_ADDR];
}PeoInfo;
typedef struct Contact //此结构体存放要修改的数组和记录当前元素的个数变量
{
PeoInfo data[MAX] ;
int count ; //存放当前元素的个数
}Contact,*pContact ; //Contact是一种类型,对struct Contact *进行了类型重命名,则pContact是一种指针类型,如同int *
void InitContact(pContact pc); //初始化数组和count
void AddContact(pContact pc ); //添加
int find(pContact pc); //查找指定联系人的信息
void DelContact(pContact pc); //删除
void SearchContact(pContact pc); //查找
void ModifyContact(pContact pc); //修改
void ShowContact(pContact pc); //显示
void SortContact(pContact pc); //排序
void EmptyContact(pContact pc); //清空
#endif // !__CONTACT_H__
contact.c
#include"contact.h"
void Modifymenu()
{
printf("**********************\n");
printf("******* 1.NAME ******\n");
printf("******* 2.AGE ******\n");
printf("******* 3.TEL ******\n");
printf("******* 4.ADDR ******\n");
printf("******* 5.SEX ******\n");
printf("******* 0.EXIT1******\n");
}
void InitContact(pContact pc) //初始化数组和count
{
pc->count = 0;
memset(pc->data, 0, sizeof(pc->data));
}
void AddContact(pContact pc) //添加
{
if (pc->count == MAX)
{
printf("通讯录已满\n");
return ;
}
//进行添加操作
printf("请输入名字->");
scanf("%s", pc->data[pc->count].name);
printf("请输入年龄->");
scanf("%d", &(pc->data[pc->count].age));
printf("请输入电话->");
scanf("%s", pc->data[pc->count].tel);
printf("请输入地址->");
scanf("%s", pc->data[pc->count].addr);
printf("请输入性别->");
scanf("%s", pc->data[pc->count].sex);
pc->count++;
}
int find(pContact pc) ///查找指定联系人的信息
{
int i = 0;
char name[MAX_NAME];
printf("请输入要查找联系人的姓名->\n");
scanf("%s", name);
for (i = 0; i < pc->count; i++)
{
if (strcmp(name, pc->data[i].name) == 0)
{
return i; //查找成功返回下标
}
}
return -1; //跳出循环说明没有找到,返回-1
}
void DelContact(pContact pc) //删除
{
int i = 0;
if (pc->count == 0)
{
printf("通讯录为空\n");
return;
}
//删除操作,在进行删除操作时,先要进行查找这个联系人,如果这个联系人存在才能进行删除,否则不能删除
int ret = find(pc); //用一个变量接收函数返回值,如果返回不为-1,就说明可以进行删除操作
if (ret != -1) //可以进行删除操作,删除操作的本质是让数组-1,count-1,所查找的联系 人,而返回的ret为该下标值,怎么删掉这个值呢?,就是把后面的值往前挪
{
for (i = ret; i < pc->count -ret- 1; i++) //往前挪
{
pc->data[i] = pc->data[i + 1];
}
pc->count--;
printf("删除成功\n");
}
else
{
printf("该联系人不存在\n");
}
}
void ShowContact(pContact pc) //显示
{
int i = 0;
if (pc->count == 0)
{
printf("通讯录为空\n");
return;
}
for (i = 0; i < pc->count; i++)
{
printf("%-5s %-3d %-5s %-11s %-5s", pc->data[i].name, pc->data[i].age, pc->data[i].sex,pc->data[i].tel,pc->data[i].addr);
printf("\n");
}
printf("———————————————————\n");
}
void SearchContact(pContact pc) //查找
{
//查找联系人,查找完成后显示联系人的信息
int ret = find(pc);
if (ret != -1)
{
printf("姓名: %s 年龄: %d 性别: %s 电话: %s 地址: %s\n", pc->data[ret].name, pc->data[ret].age, pc->data[ret].sex, pc->data[ret].tel, pc->data[ret].addr);
}
else
{
printf("查找失败,该联系人不存在\n");
return;
}
printf("———————————————————\n");
}
void ModifyContact(pContact pc) //修改
{
//修改时,先要进行查询,判断联系人是否存在
int ret = find(pc);
int input = 0;
if (ret != -1)
{
Modifymenu();
printf("请输入要修改的信息->");
scanf("%d", &input);
switch (input)
{
case NAME:
printf("请输入修改后的姓名->");
scanf("%s", pc->data[ret].name);
break;
case AGE:
printf("请输入修改后的年龄->");
scanf("%d", &(pc->data[ret].age));
break;
case SEX:
printf("请输入修改后的性别->");
scanf("%s", pc->data[ret].sex);
break;
case TEL:
printf("请输入修改后的电话->");
scanf("%s", pc->data[ret].tel);
break;
case ADDR:
printf("请输入修改后的地址->");
scanf("%s", pc->data[ret].addr);
break;
case EXIT1:
break;
default:
printf("输入错误\n");
break;
}
printf("修改成功\n");
}
else
{
printf("该联系人不存在\n");
return;
}
}
void SortContact(pContact pc) //排序,以名字的方式排序
{
//采用冒泡排序
int i = 0;
int j = 0;
for (i = 0; i < pc->count - 1; i++)
{
for (j = 0; j < pc->count - 1; j++)
{
if (strcmp(pc->data[j].name, pc->data[j + 1].name) > 0)
{
PeoInfo tmp; //定义一个同样类型的变量
tmp = pc->data[j];
pc->data[j] = pc->data[j + 1];
pc->data[j + 1] = tmp;
}
}
}
printf("排序完成\n");
printf("———————————————————\n");
ShowContact(pc);
printf("———————————————————\n");
}
void EmptyContact(pContact pc) //清空
{
memset(pc->data, 0, sizeof(pc->data));
pc->count = 0;
printf("清空成功\n");
printf("———————————————————\n");
}
test.c
#include"contact.h"
void menu()
{
printf("*********************************\n");
printf("**** 1.add 2.del ****\n");
printf("**** 3.search 4.modify ****\n");
printf("**** 5.show 6.sort ****\n");
printf("**** 7.empty 0.exit ****\n");
printf("*********************************\n");
}
int main()
{
int input = 0;
Contact my_con;
InitContact(&my_con);
do
{
menu();
printf("请选择->");
scanf("%d", &input);
switch (input)
{
case ADD:
AddContact(&my_con); //传入的是地址
break;
case DEL:
DelContact(&my_con);
break;
case SEARCH:
SearchContact(&my_con);
break;
case MODIFY:
ModifyContact(&my_con);
break;
case SHOW:
ShowContact(&my_con);
break;
case SORT:
SortContact(&my_con);
break;
case EMPTY:
EmptyContact(&my_con);
break;
case EXIT:
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (input);
return 0;
}
下图为操作结果: