实现一个通讯录
要求:通讯录可以用来存储1000个人的信息,
每个人的信息包括:
姓名、性别、年龄、电话、住址
提供方法:
1. 添加联系人信息
2. 删除指定联系人信息
3. 查找指定联系人信息
4. 修改指定联系人信息
5. 显示所有联系人信息
6. 清空所有联系人
7. 以名字排序所有联系人
解题思路:
1.先定义一个结构体A,用来存放联系人的基本信息;
2.在定义一个结构体B,里面用来存放 结构体A 和 当前通讯录内联系人的个数。
简单来说:效果如同点击链接,点击B,可以找到A,在点击A 就能找到联系人的详细信息。
思维导图 :
代码如下:
contact.h 函数声明
#define _CRT_SECURE_NO_WARNINGS_ 1
#include<stdio.h>
#include<assert.h>
#include<string.h>
#ifndef _CONTACT_H
#define _CONTACT_H
#define MAX 1000
#define NAME_MAX 20
#define SEX_MAX 4
#define TELE_MAX 20
#define ADDR_MAX 40
typedef struct PeoInfo
{
int name[NAME_MAX];
int age;
char sex[SEX_MAX];
char tele[TELE_MAX];
char addr[ADDR_MAX];
}PeoInfo;
typedef struct contact
{
PeoInfo data[MAX];
int size;
}contact;
void contact_init(contact *pcon); //初始化通讯录
void AddContact(contact *pcon); // 添加联系人
void ShowContact(contact *pcon); //展示通讯录内容
void DelContact(contact *pcon);
void SearchContact(contact *pcon); //查找联系人
void ModfiyContacat(contact *pcon); //修改联系人
void EmptyContact(contact *pcon); //清空联系人
void SortContact(contact *pcon); //排序联系人
#endif //_CONTACT_H
contact.c 存放函数
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
void contact_init(contact *pcon) //初始化通讯录
{
assert(pcon);
memset(pcon,0,sizeof(pcon->data));
pcon->size = 0;
}
void AddContact(contact *pcon) // 添加联系人
{
assert(pcon);
if(pcon->size == MAX)
{
printf("通讯录已满,添加失败\n");
}
else
{
printf("请输入名字:\n");
scanf("%s",pcon->data[pcon->size].name);
printf("请输入年龄:\n");
scanf("%d",&pcon->data[pcon->size].age);
printf("请输入性别:\n");
scanf("%s",&pcon->data[pcon->size].sex);
printf("请输入电话:\n");
scanf("%s",&pcon->data[pcon->size].tele);
printf("请输入地址:\n");
scanf("%s",&pcon->data[pcon->size].addr);
}
pcon->size++;
printf("添加联系人成功\n");
}
void ShowContact(contact *pcon)
{
int i = 0;
printf("name\tage\tsex\ttele\taddr\n");
//printf("%10s\t%4s\t%5s\t%20s\t%40s",
// "name","age","sex","tele","addr");
for(i=0; i<pcon->size; i++)
{
printf("%s\t",pcon->data[i].name);
printf("%d\t",pcon->data[i].age);
printf("%s\t",pcon->data[i].sex);
printf("%s\t",pcon->data[i].tele);
printf("%s\t",pcon->data[i].addr);
//printf("%10s\t%4s\t%5s\t%20s\t%40s",
// pcon->data[i].name,
// pcon->data[i].age,
// pcon->data[i].sex,
// pcon->data[i].tele,
// pcon->data[i].addr );
printf("\n");
}
}
void DelContact(contact *pcon) //删除联系人
{
int i = 0;
char arr[20]={0};
assert(pcon!=NULL);
printf("请输入要删除的联系人姓名:");
scanf("%s",arr);
for(i=0; i<pcon->size; i++) //找到联系人
{
if(strcmp(pcon->data[i].name,arr)==0)
{
for(;i<pcon->size;i++) //把后面的联系人往前移动
{
pcon->data[i] = pcon->data[i+1];
}
pcon->size--;
printf("删除成功\n");
}
}
if(i==pcon->size)
{
printf("查无此人\n");
}
}
void SearchContact(contact *pcon) //查找联系人
{
int i = 0;
char arr[40]= {0};
printf("请输入联系人姓名:\n");
scanf("%s",arr);
assert(pcon!=NULL);
for(i=0; i<pcon->size; i++)
{
if(strcmp(pcon->data[i].name, arr) == 0)
{
printf("name\tage\tsex\ttele\taddr\n");
printf("%s\t",pcon->data[i].name);
printf("%d\t",pcon->data[i].age);
printf("%s\t",pcon->data[i].sex);
printf("%s\t",pcon->data[i].tele);
printf("%s\t",pcon->data[i].addr);
printf("\n");
}
else
{
printf("查无此人\n");
}
}
}
void ModfiyContacat(contact *pcon) //修改联系人
{
int i = 0;
char arr[40]= {0};
printf("请输入被修改的联系人的姓名:\n");
scanf("%s",arr);
assert(pcon!=NULL);
for(i=0; i<pcon->size; i++)
{
if(strcmp(pcon->data[i].name, arr) == 0)
{
printf("请输入名字:\n");
scanf("%s",pcon->data[i].name);
printf("请输入年龄:\n");
scanf("%d",&pcon->data[i].age);
printf("请输入性别:\n");
scanf("%s",pcon->data[i].sex);
printf("请输入电话:\n");
scanf("%s",pcon->data[i].tele);
printf("请输入地址:\n");
scanf("%s",pcon->data[i].addr);
printf("修改成功\n");
}
}
if(i==pcon->size)
{
printf("查无此人\n");
}
}
void EmptyContact(contact *pcon)//清空联系人
{
assert(pcon!=NULL);
pcon->size=0;
printf("清除成功\n");
}
void Swap(PeoInfo *p1, PeoInfo * p2)
{
PeoInfo tmp ;
tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
void SortContact(contact *pcon) //排序联系人
{
int i = 0;
int j = 0;
assert(pcon!=NULL);
//按照年龄排序(采用冒泡)
//for(i=0; i<pcon->size-1; i++) //趟数
//{
// for(j=0; j<pcon->size-i-1; j++ ) //比较次数
// {
// if(pcon->data[j].age > pcon->data[j+1].age)
// {
// Swap(&pcon->data[j],&pcon->data[j+1]);
// }
// }
//}
//ShowContact(pcon);
//按照名字排序
for(i=0; i<pcon->size-1; i++) //趟数
{
for(j=0; j<pcon->size-i-1; j++ ) //比较次数
{
if(strcmp(pcon->data[j].name, pcon->data[j+1].name)>0) //前者大,才需要交换
{
Swap(&pcon->data[j],&pcon->data[j+1]);
}
}
}
ShowContact(pcon);
}
test.c 测试代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include "contact.h"
enum Option
{
QUIT,
ADD,
DEL,
SEARCH,
MODFIY,
SHOW,
EMPTY,
SORT
};
void menu()
{
printf("==============================\n");
printf("====== 1.add 2.del =====\n");
printf("====== 3.search 4.modfiy ==\n");
printf("====== 5.show 6.empty====\n");
printf("====== 7.sort 0.quit ====\n");
printf("==============================\n");
}
void test()
{
int input=0;
contact con;
contact_init(&con);
do
{
menu();
printf("请选择操作:\n");
scanf("%d",&input);
switch(input)
{
case ADD:
AddContact(&con);
break;
case DEL:
DelContact(&con);
break;
case SEARCH:
SearchContact(&con);
break;
case MODFIY:
ModfiyContacat(&con);
break;
case SHOW:
ShowContact(&con);
break;
case EMPTY:
EmptyContact(&con);
break;
case SORT:
SortContact(&con);
break;
case QUIT:
printf("退出通讯录\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
}while(input);
}
int main()
{
test();
return 0;
}