c语言学习第30课--通讯录的实现

简介: c语言学习第30课--通讯录的实现

学习了一段时间,今天学习如何实现一个通讯录。通讯录成员信息包括名字,性别,年龄,地址,电话。

那麽如何实现呢,这里用数组的静态存储来实现。

1.首先创建表示关于通讯录成员信息的结构体,关于结构体的大小,与成员的联系,我们能在建立一个结构体表示。

//表示人的结构体
typedef struct  peoInfol
{
  char name[20];
  int age;
  char sex[5];
  char telep[12];
  char addr[30];
}peoInfo;
typedef struct contact
{
  peoInfo data[100];
  int size;//有效个数
}Contact, * pContact;

实现通讯录个功能的接口函数。

void Initcontact(Contact* pc);//初始化通讯录
void ADDcontact(Contact* pc);//增加通讯录成员
void SHOWcontact(const Contact* pc);//展示通讯录成员
void DELEcontact(Contact* pc);//删除通讯录成员
void sercontact(const Contact* pc);//查找通讯录成员
void modefycontact(Contact* pc);//修改通讯录成员
int cmp_byname(const void* e1, const void* e2);//比较通讯录名字大小
void Sortcontact(Contact* pc);//按名字大小排序通讯录成员
void Initcontact(Contact* pc)
{
  pc->size = 0;
  memset(pc->data, 0, sizeof(pc->data));//初始化函数
}
void ADDcontact(Contact* pc)
{
  if (pc->size == MAX)
  {
    printf("通讯录已满");
    return;
  }
  printf("请输入名字:>");
  scanf("%s\n", pc->data[pc->size].name);
  printf("请输入年龄:>");
  scanf("%d", &pc->data[pc->size].age);
  printf("请输入性别:>");
  scanf("%s", pc->data[pc->size].sex);
  printf("请输入电话:>");
  scanf("%s", pc->data[pc->size].telep);
  printf("请输入地址:>");
  scanf("%s", pc->data[pc->size].addr);
  pc->size++;
  printf("添加成功");
}
void SHOWcontact(const Contact* pc)
{
  int i = 0;
  printf("%-10s %-5s %-5s %-5s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");
  for (i = 0; i < pc->size; i++)
  {
    printf("%-10s %-5d %-5s %-5s %-5s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].telep, pc->data[i].addr);
  }
}
void DELEcontact(Contact* pc)
{
  if (pc->size == 0)
  {
    printf("通讯录不为空,无法删除\n");
    return;
  }
  //找道该人的位置
  printf("输入删除人的名字:");
  char name[MAX_SIZE];
  int pos = findname(pc, name);
  //删除
  int i = 0;
  for (i = 0; i < pc->size; i++)
  {
    pc->data[i] = pc->data[i + 1];
  }
  pc->size--;
  printf("删除成功\n");
}
void sercontact(const Contact* pc)
{
  char name[MAX_SIZE] = { 0 };
  printf("请输入要查找人的名字:>");
  scanf("%s\n", name);
  //查找
  int pos = findname(pc, name);
  if (pos == -1)
  {
    printf("要查找的人不存在\n");
    return;
  }
  //打印
  printf("%-10s %-5s %-5s %-5s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");
  printf("%-10s %-5d %-5s %-5s %-5\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].telep, pc->data[pos].addr);
}
void modefycontact(Contact* pc)
{
  char name[MAX_SIZE] = { 0 };
  printf("请输入要修改人的名字:>");
  scanf("%s\n", name);
  //查找
  int pos = findname(pc, name);
  if (pos == -1)
  {
    printf("你要修改的人不存在\n");
  }
  printf("请输入名字:>");
  scanf("%s\n", pc->data[pos].name);
  printf("请输入年龄:>");
  scanf("%d", pc->data[pos].age);
  printf("请输入性别:>");
  scanf("%s", pc->data[pos].sex);
  printf("请输入电话:>");
  scanf("%s", pc->data[pos].telep);
  printf("请输入地址:>");
  scanf("%s", pc->data[pos].addr);
  pc->size++;
  printf("修改成功!\n");
}//按名字排序
int cmp_byname(const void* e1, const void* e2)
{
  return strcmp(((peoInfo*)e1)->name, ((peoInfo*)e2)->name);
}
void Sortcontact(Contact* pc)
{
  qsort(pc->data, pc->size, sizeof(peoInfo), cmp_byname);
}

为了方便查找一个成员,我们还写了一个名字查找的接口函数

static int findname(Contact* pc, char name[])
{
  int i = 0;
  int pos = 0;
  if (strcmp((pc->data[i].name), name) == 0)
  {
    return i;
  }
  return -1;
}//通过名字查找成员的位置

定义一个枚举体来表示switch 语句中case 中对应的函数,与菜单呼应。

enum Option
{
  ADD=1,
  DEL=2,
  SERCH=3,
  SHOW=4,
  SORT=5,
  EXIT=6
};

菜单

void menu()
{
  printf("*********************************************\n");
  printf("*************1.ADD     2.DEL       **********\n");
  printf("*************3.SERCH   4.MODEFY    **********\n");
  printf("*************5.SHOW    6.SORT      **********\n");
  printf("*************7.EXIT                **********\n");
  printf("*********************************************\n");
}

主函数,调用各个函数。

int main()
{
   int input = 0;
   //初始化通讯录
   Contact con;
   Initcontact(&con);
     do
     {
       menu();
       printf("请选择:>");
       scanf("%d", &input);
       switch (input)
       {
       case ADD:
         ADDcontact(&con);
         break;
       case DEL:
         DELEcontact(&con);
         break;
       case SERCH:
         sercontact(&con);
         break;
       case SHOW:
         SHOWcontact(&con);
         break;
       case SORT:
         break;
       case EXIT:
         printf("退出通讯录\n");
         break;
       default:
         printf("选择错误\n");
         break;
       }
     } while (input);
  return 0;
}


相关文章
|
23天前
|
存储 C语言
C语言学习记录——动态内存函数介绍(malloc、free、calloc、realloc)
C语言学习记录——动态内存函数介绍(malloc、free、calloc、realloc)
23 1
|
4天前
|
存储 编译器 C语言
c语言学习历程【1】
c语言学习历程【1】
8 1
|
6天前
|
存储 程序员 Go
|
16天前
|
机器学习/深度学习 搜索推荐 程序员
C语言实现个人通讯录(功能优化)-2
C语言实现个人通讯录(功能优化)
C语言实现个人通讯录(功能优化)-2
|
16天前
|
存储 C语言 索引
C语言实现个人通讯录(功能优化)-1
C语言实现个人通讯录(功能优化)
C语言实现个人通讯录(功能优化)-1
|
23天前
|
C语言
C语言学习记录——通讯录(静态内存)
C语言学习记录——通讯录(静态内存)
16 2
|
23天前
|
存储 C语言
C语言学习记录——联合体(共用体、特点、用法、联合体大小计算)
C语言学习记录——联合体(共用体、特点、用法、联合体大小计算)
19 2
|
23天前
|
测试技术 C语言
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
16 1
|
23天前
|
C语言
C语言学习记录——动态内存开辟常见的错误
C语言学习记录——动态内存开辟常见的错误
13 1
|
3天前
|
C语言