课题:

实现一个通讯录可以用来存储1000个人的信息,每个人的信息包括:

姓名、性别、年龄、电话、住址

 

该通讯录可以提供以下功能:

1. 添加联系人信息
2. 删除指定联系人信息
3. 查找指定联系人信息
4. 修改指定联系人信息
5. 显示所有联系人信息
6. 清空所有联系人
7. 以名字排序所有联系人

分析:

首先我们可以定义出存储每个人的信息的结构体以及存储1000个联系人的结构数组。由于实现过程中我们需要知道联系人的人数,因此我们可以将存储1000个人的信息的结构数组和联系人的人数定义为结构体具体定义如下所示:

#define MAX_NAME 20
#define MAX_SEX 4
#define MAX_TELE 12
#define MAX_ADDR 20
#define MAX 1000
typedef struct PeoInfor
{
 char name[MAX_NAME];
 int age;
 char sex[MAX_SEX];
 char tele[MAX_TELE];
 char addr[MAX_ADDR];
}PeoInfor;
typedef struct Contact
{
 PeoInfor con[MAX];
 int count;
}Contact;

根据要求我们可以首先声明一些实现通讯录功能的函数,主要有:

void init_contact(Contact *pcon);    //初始化结构数组

void add_contact(Contact *pcon);   //添加联系人

void show_contact(Contact *pcon);  //显示所有联系人

void delet_contact(Contact *pcon);   //删除联系人

void search_contact(Contact *pcon);//查找指定联系人

void modify_contact(Contact *pcon);//修改指定联系人

void clr_contact(Contact *pcon);//  清空所有联系人

void sort_contact(Contact *pcon);// 按名字排序所有联系人

以下是这些函数的实现:

 static int find_entry(Contact *pcon,const char *find_name) 
 //实现删除、查找、修改函数功能时需要的查找联系人的函数
 {
 int i = 0;
 for (i = 0; i < pcon->count; i++)
 {
  if (strcmp(pcon->con[i].name, find_name) == 0)
   return i;  //按姓名查找,找到以后返回该结构体(联系人)的下标
 }
 return -1;
 } 

 void init_contact(Contact *pcon)
 {
 pcon->count = 0;  //将联系人人数清零
 } 

 void add_contact(Contact *pcon)
 {
 
 if (pcon->count >= MAX)
 {
  printf("电话本已满无法添加");
  return;
 }
 printf("name:>");
 scanf("%s", pcon->con[pcon->count].name);
 printf("age:>");
 scanf("%d", &pcon->con[pcon->count].age);
 printf("sex:>");
 scanf("%s", pcon->con[pcon->count].sex);
 printf("tele:>");
 scanf("%s", pcon->con[pcon->count].tele);
 printf("addr:>");
 scanf("%s", pcon->con[pcon->count].addr);
 pcon->count++;
 printf("添加成功!\n");
 } 

 void show_contact(Contact *pcon)
 {
 int i = 0;
 system("cls");
 printf("%10s  %4s  %4s  %12s %   12s\n", "name", "age", "sex", "tele", "addr");
 for (i = 0; i < pcon->count; i++)
 {
  printf("%10s  %4d  %4s  %12s %12s\n",
   pcon->con[i].name,
   pcon->con[i].age,
   pcon->con[i].sex,
   pcon->con[i].tele,
   pcon->con[i].addr);
 }
 } 

 void delet_contact(Contact *pcon)
 {
 char del_name[MAX_NAME] = { 0 };
 int ret = 0;
 int i = 0;
 char ifdel[5] = { 0 };
 system("cls");
 printf("请输入要删除人的姓名:>");
 scanf("%s", del_name);
 ret = find_entry(pcon, del_name);
 if (ret != -1)
 {
  printf("您确定要删除吗?\n");
  printf("yes or no:>");
  scanf("%s", ifdel);
  if (strcmp(ifdel, "yes") == 0)
  {
  for (i = ret; i < pcon->count - 1; i++)
  {
    pcon->con[i] = pcon->con[i + 1];
  }
   printf("删除完成!\n");
   pcon->count--;
  }
  else
   return;
 }
 else
 {
  printf("要删除的人不存在!\n");
  return;
 }
 
} 

void search_contact(Contact *pcon)
{
 char sear_name[MAX_NAME] = { 0 };
 int ret = 0;
 system("cls");
 printf("请输入要查找的人的姓名:>");
 scanf("%s", sear_name);
 ret = find_entry(pcon, sear_name);
 if (ret != -1)
 {
  printf("查找成功!\n");
  printf("%10s  %4s  %4s  %12s %12s\n", "name", "age", "sex", "tele", "addr");
  printf("%10s  %4d  %4s  %12s %12s\n",
   pcon->con[ret].name,
   pcon->con[ret].age,
   pcon->con[ret].sex,
   pcon->con[ret].tele,
   pcon->con[ret].addr);
 }
 else
 {
  printf("要查找的人不存在!\n");
  return;
 }
} 

void modify_contact(Contact *pcon)
{
 char mod_name[MAX_NAME] = { 0 };
 int ret = 0;
 system("cls");
 printf("请输入要修改的人的姓名:>");
 scanf("%s",mod_name);
 ret = find_entry(pcon, mod_name);
 if (ret != -1)
 {
  printf("name:>");
  scanf("%s", pcon->con[ret].name);
  printf("age:>");
  scanf("%d", &pcon->con[ret].age);
  printf("sex:>");
  scanf("%s", pcon->con[ret].sex);
  printf("tele:>");
  scanf("%s", pcon->con[ret].tele);
  printf("addr:>");
  scanf("%s", pcon->con[ret].addr);
 }
 else
 {
  printf("要修改的人不存在!\n");
  return;
 }
} 

void clr_contact(Contact *pcon)
{
 pcon->count = 0;
 printf("已清空联系人!\n");
} 

void sort_contact(Contact *pcon)
{
 int i = 0;
 int j = 0;
 PeoInfor tmp = { 0 };
 int flag = 0;
 
 for(i = 0; i < pcon->count - 1; i++)
 {
  flag = 0;
  for (j = 0; j < pcon->count - i - 1; j++)
  {
   if (strcmp(pcon->con[j].name, pcon->con[j + 1].name)>0)
   {
    tmp = pcon->con[j];
    pcon->con[j] = pcon->con[j + 1];
    pcon->con[j + 1] = tmp;
    flag = 1;
   }
  }
  if (flag == 0)
   break;
 }
 printf("排序完成!\n");
}

 

测试函数如下:

enum OP
{
 EXIT,
 ADD,
 DELET,
 SEARCH,
 MODIFY,
 SHOW,
 CLR,
 SORT
}; 

void menu()
{
 
 printf("|———————————————————————|\n");
 printf("|0.exit    ***********************  1.add      |\n");
 printf("|2.delet   ***********************  3.search   |\n");
 printf("|4.modify  ***********************  5.show     |\n");
 printf("|6.clr     ***********************  7.sort     |\n");
 printf("|———————————————————————|\n");
} 

void test()
{
 Contact my_con;
 init_contact(&my_con);
 int input = 1;
 while (input)
 {
  menu();
  printf("请选择:>");
  scanf("%d", &input);
  switch (input)
  {
  case ADD:
   add_contact(&my_con);
   break;
  case DELET:
   delet_contact(&my_con);
   break;
  case SEARCH:
   search_contact(&my_con);
   break;
  case MODIFY:
   modify_contact(&my_con);
   break;
  case SHOW:
   show_contact(&my_con);
   break;
  case CLR:
   clr_contact(&my_con);
   break;
  case SORT:
   sort_contact(&my_con);
   break;
  case EXIT:
   exit(0);
   break;
  default:
   break;
  }
 }
} 

int main()
{
 test();
 system("pause");
 return 0;
}