#define _CRT_SECURE_NO_WARNINGS 1
#ifndef __CONTACT_H//防止重复引入
#define __CONTACT_H__
#include <stdio.h>
#include <string.h>
#include<stdlib.h>
enum OP//使用枚举,让switch语句更清晰明了
{
EXIT,
ADD,
DEL,
MODIFY,
SEARCH,
DISPLAY,
SORT,
CLEAR
};
#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 25
#define MAX 1000
typedef struct Person//通讯录成员的具体信息
{
char name[NAME_MAX];
int age; char sex[SEX_MAX];
char tele[TELE_MAX];
char addr[ADDR_MAX];
}Person;
typedef struct Contact
{
Person data[MAX];//通讯录能保存的最多人数
int size;//当前包含的人数
}Contact,*con;//指针用来在函数内部接收结构体指针
void menu();//打印菜单
void _add_contact(con pcon);//增加成员
void _del_contact(con pcon);//删除成员
void _search_contact(con pcon);//查询成员
void _modify_contact(con pcon);//修改成员
void _display_contact(con pcon);//显示所有成员
void _clear_contact(con pcon);//清空所有成员
void _sort_contact(con pcon);//按姓名排序所有成员
#endif //__CONTACT_H__
#include"contact.h"
int main()
{
int input=1;
Contact pcon={0};
pcon.size=0;
while(input)
{
menu();
printf("请选择:");
scanf("%d",&input);
switch(input)
{
case ADD:
_add_contact(&pcon);
break;
case DEL:
_del_contact(&pcon);
break;
case SEARCH:
_search_contact(&pcon);
break;
case MODIFY:
_modify_contact(&pcon);
break;
case DISPLAY:
_display_contact(&pcon);
break;
case CLEAR:
_clear_contact(&pcon);
break;
case SORT:
_sort_contact(&pcon);
break;
case EXIT:
break;
default:
printf("选择参数错误\n");
break;
}
}
system("pause");
return 0;
}
</span>
#include"contact.h"
void menu()//打印菜单
{
printf("***********************\n");
printf("1. 添加联系人信息\n");
printf("2. 删除指定联系人信息\n");
printf("3. 修改指定联系人信息\n");
printf("4. 查找指定联系人信息\n");
printf("5. 显示所有联系人信息\n");
printf("6. 以名字排序所有联系人\n");
printf("7. 清空所有联系人\n");
printf("0. 退出\n");
printf("************************\n");
}
int find(con pcon,char arr[])//由于后面的很多函数都用到查找函数,所以将其封装为函数
{
int i=0;
for(i=0; i<pcon->size; i++)
{
if(strcmp(pcon->data[i].name,arr))
{
return i;
}
}
return -1;
}
void _add_contact(con pcon)//增加成员
{
if(pcon->size<MAX)
{
printf("请输入你要添加的成员信息:\n");
printf("请输入姓名:");
scanf("%s",(pcon->data[pcon->size].name ));
printf("请输入年龄:");
scanf("%d",&(pcon->data[pcon->size].age ));
printf("请输入性别:");
scanf("%s",(pcon->data[pcon->size].sex));
printf("请输入电话:");
scanf("%s",(pcon->data[pcon->size].tele ));
printf("请输入地址:");
scanf("%s",(pcon->data[pcon->size].addr ));
printf("添加成功!\n");
pcon->size++;
}
else
printf("通讯录已满!\n");
}
void _display_contact(con pcon)//显示所有成员
{
int i=0;
for(i=0; i<pcon->size; i++)
{
printf("%s%10d%10s%10s%10s\n",pcon->data[i].name,
pcon->data[i].age,
pcon->data[i].sex,
pcon->data[i].tele,
pcon->data[i].addr);
}
printf("打印成功!\n");
}
void _del_contact(con pcon)//删除成员
{
int i=0;
char name[20]={0};
printf("请输入你要删除的成员姓名:");
scanf("%s",&name);
i=find(pcon,name);
if(i>=0)
{
pcon->data[i]=pcon->data[pcon->size-1];
(pcon->size)--;
printf("删除成功!\n");
}
else
printf("没找到要删除的成员!\n");
}
void _search_contact(con pcon)//查询成员
{
int i=0;
char name[20]={0};
printf("请输入你要查询成员的姓名:");
scanf("%s",&name);
i=find(pcon,name);
if(i>=0)
{
printf("%s%10d%10s%10s%10s\n",pcon->data[i].name,
pcon->data[i].age,
pcon->data[i].sex,
pcon->data[i].tele,
pcon->data[i].addr);
printf("查询成功!\n");
}
else
printf("没找到你要查询的成员!\n");
}
void _modify_contact(con pcon)//修改成员
{
int i=0;
char name[20]={0};
printf("请输入你要修改的成员:");
scanf("%s",name);
i=find(pcon,name);
if(i>=0)
{
printf("请输入你要修改的成员信息:\n");
printf("请输入姓名:");
scanf("%s",(pcon->data[i].name ));
printf("请输入年龄:");
scanf("%d",&(pcon->data[i].age ));
printf("请输入性别:");
scanf("%s",(pcon->data[i].sex));
printf("请输入电话:");
scanf("%s",(pcon->data[i].tele ));
printf("请输入地址:");
scanf("%s",(pcon->data[i].addr ));
printf("修改成功!");
}
else
printf("没找到你要修改的成员!\n");
}
void _sort_contact(con pcon)//按姓名排序所有成员
{
int i=0;
int j=0;
int flag=0;
for(i=0; i<pcon->size-1; i++)//控制排序趟数,最后一次不需要交换
{
flag=1;
for(j=0; j<pcon->size-1-i; j++)
{
if(strcmp((pcon->data[j].name),(pcon->data[j+1].name))>0)
{
Person tmp= pcon->data[j];
pcon->data[j]=pcon->data[j+1];
pcon->data[j+1]=tmp;
flag=0;
}
if(flag==1)
break;
}
}
printf("排序成功!\n");
//_display_contact(pcon);
}
void _clear_contact(con pcon)//清空所有成员
{
pcon->size=0;//因为刚开始时通讯录为空,所以这条语句可达到清空目的
}
一定要注意,打印菜单的顺序要和枚举成员的定义顺序一致,而不是主函数的switch语句,呜呜呜,浪费了我好长时间才找出错误!