实现一个通讯录:通讯录可以用力存储1000个人的信息
每个人的信息包括:姓名,性别,年龄,电话,住址,
提供方法:
1.添加联系人信息
2.删除指定联系人信息
3.查找指定联系人信息
4.修改指定联系人信息
5.显示所有联系人信息
6.清空所有联系人
7.以名字排序所有联系人
【题目分析】:
1.如何将通讯录中联系人的基本信息(姓名,性别,年龄,电话,住址)在内存中存储起来呢?当然首先想到的就是利用结构体这个类型,它包括的成员类型可以是不同类型的。让我们先来实现这部分功能的代码:
typedef struct PerInfo
{
char name[NAME_MAXNUM];
int age;
char sex[SEX_MAXNUM];
char tele[TELE_MAXNUM];
char addr[ADDR_MAXNUM];
}PerInfo;
typedef struct Contact
{
PerInfo data[MAX]; //存储所有联系人的所有信息
int size; //记录联系人的个数
}Contact,*Pcon;
2.将信息存储起来之后最重要的就是如何去实现它所给出的7个函数功能了,下面且听我一一道来:
添加联系人信息: 在这里我提供的是静态的方法,就是再定义一个结构体,它包括两个成员,一个数组包括联系人的所有信息,一个整形的变量记录联系人个数,当你添加完成一个联系人的所有信息之后,这个整形的变量就加1知道达到最大存储个数1000就停止添加;
void Add(Pcon pcon) //添加联系人
{
int i=0;
printf("请输入你要添加的联系人个数:");
scanf("%d",&(pcon->size));
if(pcon->size >= MAX)
{
printf("通讯录已满\n");
}
else
{
printf("请输入你要添加的联系人的所有信息:(姓名 年龄 性别 联系电话 家庭住址)\n");
for(i=0;i<pcon->size;i++)
{
scanf("%s",pcon->data[i].name);
scanf("%d",&(pcon->data[i].age));
scanf("%s",pcon->data[i].sex);
scanf("%s",pcon->data[i].tele);
scanf("%s",pcon->data[i].addr);
}
}
}
那仫结果是不是我们想要的呢?请读者继续向后看:
删除指定联系人信息: 如何删除呢?我们可以根据名字找到该联系人,把要删除的元素删除之后,此时这个位置是空的并没有存储任何信息,那仫是不是就浪费了这个空间呢?试想一下,这个通讯录原本就存储了1000个联系人,删除了一个联系人之后,如果我们想要再添加一个联系人,此时存储信息数组的下标已经指向最大,如果继续向后添加是不是就越界了呢?那是当然的啦!如何去解决这个问题呢?当然我们只要每次删除一个元素后就将该元素之后的元素往前挪,补上这个空位就可以了。这就像我们站队一样,排在队列前面的人走了我们还会站在原地吗?当然不会了,接下来就让我们去实现这个功能的代码吧!
int Find_position(Pcon pcon,char *str)
{
int i=0;
for(i=0;i<pcon->size;i++)
{
if(strcmp(pcon->data[i].name,str) == 0) //将要查找的姓名与通讯录里的联系人匹配,找到就返回下标
{
return i;
}
}
return -1;
}
void Del(Pcon pcon) //删除指定联系人
{
int ret=0;
int i=0;
char str[NAME_MAXNUM]={0};
printf("请输入你要删除的联系人姓名:");
scanf("%s",str);
ret=Find_position(pcon,str);
if(ret != -1)
{
for(i=ret;i<pcon->size;i++)
{
pcon->data[i]=pcon->data[i+1]; //删除的元素之后的元素往前挪一个位置
}
pcon->size--;
}
else
{
printf("通讯录里没有此联系人\n");
return ;
}
}
查找指定联系人,修改指定联系人:
这一部分是最容易实现的,它的思路和上面删除指定联系人的思路一致都是调用查找函数,找到就返回对应下标,代码实现如下:
void Search(Pcon pcon) //查找指定联系人
{
int ret=0;
char str[NAME_MAXNUM]={0};
printf("请输入你要查找的联系人的名字:");
scanf("%s",str);
ret=Find_position(pcon,str);
if(ret != -1)
{
printf("查找成功\n");
}
else
{
printf("通讯录里无此人\n");
return ;
}
}
void Revise(Pcon pcon) //修改指定联系人
{
int ret=0;
char str[NAME_MAXNUM]={0};
printf("请输入你要修改的联系人的姓名:");
scanf("%s",str);
ret=Find_position(pcon,str);
if(ret != -1)
{
printf("请输入你修改后的联系人信息:(姓名 年龄 性别 联系电话 住址):\n");
scanf("%s %d %s %s %s",pcon->data[ret].name,&(pcon->data[ret].age),pcon->data[ret].sex,\
pcon->data[ret].tele,pcon->data[ret].addr);
printf("修改成功\n");
}
else
{
printf("通讯录里无此人\n");
return ;
}
}
以名字排序所有联系人:思路是冒泡排序字符串
void Sort_name(Pcon pcon) //以名字排序联系人
{
int flag=0;
int i=0;
int j=0;
for(i=0;i<pcon->size-1;i++)
{
flag=0; //对冒泡排序的优化
for(j=0;j<pcon->size-1-i;j++)
{
if(strcmp(pcon->data[j].name,pcon->data[j+1].name) > 0) //默认升序排列
{
PerInfo tmp=pcon->data[j];
pcon->data[j]=pcon->data[j+1];
pcon->data[j+1]=tmp;
flag=1;
}
}
if(flag == 0)
break;
}
}
在这里附上程序源代码,方便读者理解:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NAME_MAXNUM 20
#define SEX_MAXNUM 5
#define TELE_MAXNUM 12
#define ADDR_MAXNUM 10
#define MAX 1000
enum OP
{
EXIT,
ADD,
DEL,
SEARCH,
REVISE,
DISPLAY,
EMPTY,
SORT
};
typedef struct PerInfo
{
char name[NAME_MAXNUM];
int age;
char sex[SEX_MAXNUM];
char tele[TELE_MAXNUM];
char addr[ADDR_MAXNUM];
}PerInfo;
typedef struct Contact
{
PerInfo data[MAX]; //存储所有联系人的所有信息
int size; //记录联系人的个数
}Contact,*Pcon;
void menu()
{
printf("***************简易通讯录***************\n");
printf("****1.添加联系人*******2.删除联系人****\n");
printf("****3.查找联系人*******4.修改联系人****\n");
printf("****5.显示联系人*******6.清空联系人****\n");
printf("****7.以名字排序联系人*0.退出**********\n");
printf("***************************************\n");
}
void Add(Pcon pcon) //添加联系人
{
int i=0;
printf("请输入你要添加的联系人个数:");
scanf("%d",&(pcon->size));
if(pcon->size >= MAX)
{
printf("通讯录已满\n");
}
else
{
printf("请输入你要添加的联系人的所有信息:(姓名 年龄 性别 联系电话 家庭住址)\n");
for(i=0;i<pcon->size;i++)
{
scanf("%s",pcon->data[i].name);
scanf("%d",&(pcon->data[i].age));
scanf("%s",pcon->data[i].sex);
scanf("%s",pcon->data[i].tele);
scanf("%s",pcon->data[i].addr);
}
}
}
int Find_position(Pcon pcon,char *str)
{
int i=0;
for(i=0;i<pcon->size;i++)
{
if(strcmp(pcon->data[i].name,str) == 0) //将要查找的姓名与通讯录里的联系人匹配,找到就返回下标
{
return i;
}
}
return -1;
}
void Del(Pcon pcon) //删除指定联系人
{
int ret=0;
int i=0;
char str[NAME_MAXNUM]={0};
printf("请输入你要删除的联系人姓名:");
scanf("%s",str);
ret=Find_position(pcon,str);
if(ret != -1)
{
for(i=ret;i<pcon->size;i++)
{
pcon->data[i]=pcon->data[i+1]; //删除的元素之后的元素往前挪一个位置
}
pcon->size--;
}
else
{
printf("通讯录里没有此联系人\n");
return ;
}
}
void Search(Pcon pcon) //查找指定联系人
{
int ret=0;
char str[NAME_MAXNUM]={0};
printf("请输入你要查找的联系人的名字:");
scanf("%s",str);
ret=Find_position(pcon,str);
if(ret != -1)
{
printf("查找成功\n");
}
else
{
printf("通讯录里无此人\n");
return ;
}
}
void Revise(Pcon pcon) //修改指定联系人
{
int ret=0;
char str[NAME_MAXNUM]={0};
printf("请输入你要修改的联系人的姓名:");
scanf("%s",str);
ret=Find_position(pcon,str);
if(ret != -1)
{
printf("请输入你修改后的联系人信息:(姓名 年龄 性别 联系电话 住址):\n");
scanf("%s %d %s %s %s",pcon->data[ret].name,&(pcon->data[ret].age),pcon->data[ret].sex,\
pcon->data[ret].tele,pcon->data[ret].addr);
printf("修改成功\n");
}
else
{
printf("通讯录里无此人\n");
return ;
}
}
void Display(Pcon pcon) //显示联系人信息
{
int i=0;
for(i=0;i<pcon->size;i++)
{
printf("%s %d %s %s %s\n",pcon->data[i].name,pcon->data[i].age,pcon->data[i].sex,\
pcon->data[i].tele,pcon->data[i].addr);
}
}
void Empty(Pcon pcon) //清空联系人
{
pcon->size=0;
}
void Sort_name(Pcon pcon) //以名字排序联系人
{
int flag=0;
int i=0;
int j=0;
for(i=0;i<pcon->size-1;i++)
{
flag=0; //对冒泡排序的优化
for(j=0;j<pcon->size-1-i;j++)
{
if(strcmp(pcon->data[j].name,pcon->data[j+1].name) > 0) //默认升序排列
{
PerInfo tmp=pcon->data[j];
pcon->data[j]=pcon->data[j+1];
pcon->data[j+1]=tmp;
flag=1;
}
}
if(flag == 0)
break;
}
}
int main()
{
Contact pcon;
int intput=1;
memset(pcon.data,0,MAX*sizeof(PerInfo)); //把联系人的所有信息置成0
pcon.size=0;
while(intput)
{
menu();
printf("请输入一个你要选择的操作:");
scanf("%d",&intput);
if(intput >= 0 && intput <= 7)
{
switch(intput)
{
case ADD:
Add(&pcon);
break;
case DEL:Del(&pcon);
break;
case SEARCH:Search(&pcon);
break;
case REVISE:Revise(&pcon);
break;
case DISPLAY:Display(&pcon);
break;
case EMPTY:Empty(&pcon);
break;
case SORT:Sort_name(&pcon);
break;
case EXIT:
break;
}
}
}
system("pause");
return 0;
}
在最后用一句话勉励自己:不到最后关头永远不要轻言放弃,因为前方或许就是坦途