通讯录的实现(增删查改排序)(2)

简介: 本课题模拟通讯录的实现,包括: 1.增加联系人的信息 2.删除联系人 3.查找联系人 4.修改联系人信息 5.对联系人进行排序

六、查找联系人并打印(Search)

依然需要用到上述的查找某位联系人是否存在的函数

传参:

SearchContact(&con);

(1)先查找

void SearchContact(contact* pc)
{
  assert(pc);
  printf("请输入你要查找联系人的名字:");
  char name[NAME_MAX];
  scanf("%s", name);
  int ret = FindContact(pc, name);
}

(2)后打印

联系人存在就打印该联系人的信息

void SearchContact(contact* pc)
{
  assert(pc);
  printf("请输入你要查找联系人的名字:");
  char name[NAME_MAX];
  scanf("%s", name);
  int ret = FindContact(pc, name);
  if (ret == -1)
  {
    printf("联系人不存在,查找失败\n");
    return;
  }
  printf("查找成功:\n");
  printf("%-10s %-5s %-10s %-15s %-10s\n", "名字", "性别", "年龄", "电话", "住址");
  printf("%-10s %-5s %-10d %-15s %-10s\n",
    pc->data[ret].name, pc->data[ret].sex, pc->data[ret].age,
    pc->data[ret].tele, pc->data[ret].addr);
}

七、修改联系人(modify)

想要修改某位联系人的信息,首先确定该联系人是否存在

传参:

ModifyContact(&con);

(1)查找联系人

void ModifyContact(contact* pc)
{
  assert(pc);
  printf("请输入你要查找联系人的名字:");
  char name[NAME_MAX];
  scanf("%s", name);
  int ret = FindContact(pc, name);
  if (ret == -1)
  {
    printf("联系人不存在,修改失败\n");
    return;
  }
}

(2)修改联系人信息

void ModifyContact(contact* pc)
{
  assert(pc);
  printf("请输入你要查找联系人的名字:");
  char name[NAME_MAX];
  scanf("%s", name);
  int ret = FindContact(pc, name);
  if (ret == -1)
  {
    printf("联系人不存在,修改失败\n");
    return;
  }
  printf("联系人存在:");
  printf("%-10s %-5s %-10d %-15s %-10s\n",
  pc->data[ret].name, pc->data[ret].sex, pc->data[ret].age,
  pc->data[ret].tele, pc->data[ret].addr);
  printf("请修改姓名>:");
  scanf("%s", pc->data[ret].name);
  printf("请修改性别>:");
  scanf("%s", pc->data[ret].sex);
  printf("请修改年龄>:");
  scanf("%d", &(pc->data[ret].age));
  printf("请修改电话>:");
  scanf("%s", pc->data[ret].tele);
  printf("请修改住址>:");
  scanf("%s", pc->data[ret].addr);
  printf("\n修改成功");
}

八、联系人排序

对联系人排序,使用库函数中的排序函数qsort,我们只需要完成比较函数即可。

排序可以按照名字的字典顺序或者年龄等,我们这里介绍名字和年龄的排序。

(1)按照名字排序

传参:

qsort(pc->data, pc->sz, sizeof(pc->data[0]), qsort_cmp_name);

第四个为函数指针,指向的比较函数需要我们自己完成

名字的比较函数:

//名字排序
int qsort_cmp_name(const void* e1,const void* e2)
{
  return strcmp((((contact*)e1)->data)->name, (((contact*)e2)->data)->name);
}

(1) 名字的字典顺序,其实就算字符串的比较。

(2)字符串比较需要用函数strcmp,头文件#include<string.h>

(2)按照年龄排序

传参:

qsort(pc->data, pc->sz, sizeof(pc->data[0]), qsort_cmp_age);

年龄的比较函数:

//年龄排序
int qsort_cmp_age(const void* e1,const void* e2)
{
  return (((contact*)e1)->data)->age - (((contact*)e2)->data)->age;
}

(3)完整排序函数

void menu2()
{
  printf("*************************\n");
  printf("**** 1.名字   2.年龄 ****\n");
  printf("*************************\n");
}
//联系人排序
void SortContact(contact* pc)
{
  int input2;
  menu2();
  printf("请选择排序方式:");
  scanf("%d",&input2);
  switch (input2)
  {
  case 1:qsort(pc->data, pc->sz, sizeof(pc->data[0]), qsort_cmp_name);break;
  case 2:qsort(pc->data, pc->sz, sizeof(pc->data[0]), qsort_cmp_age);break;
  defualt:printf("选择错误\n");
    break;
  }
}

每进入一次该函数,只能排序一次,不需要设置循环

九、菜单的实现

(1)主函数部分

enum Option
{
  EXIT,//退出
ADD,//增加
DEL,//删除联系人
SEARCH,//查找联系人
MODIFY,//修改指定联系人
SHOW,//打印联系人
SORT,//分类
};
int main()
{
    contact con;
  InitContact(&con);
  int input;
  do
  {
    menu();
    printf("请输入你的选择>:");
    scanf("%d",&input);
    switch (input)
    {
    case ADD:AddContact(&con);
      break;
    case DEL:DelContact(&con);
      break;
    case SEARCH:SearchContact(&con);
      break;
    case MODIFY:ModifyContact(&con);
      break;
    case SHOW:ShowContact(&con);
      break;
    case SORT:SortContact(&con);
      break;
    case EXIT:printf("你已选择退出程序\n");
      break;
    default:printf("选择错误,请重新选择\n");
      break;
    }
  } while (input);
  return 0;
}

【代码思路】

(1)do…while循环配合switch选择语句完成菜单的构造。可以供用户多次选择,直至退出

(2)在选择语句中

(2)菜单函数

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

所谓的菜单,就算打印出来让我们看。具体的选项还是得由主函数部分实现。

十、完整通讯录代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
#define NAME_MAX 20
#define SEX_MAX 6
#define TELE_MAX 20
#define ADDR_MAX 20
#define MAX 100
typedef struct PeoInfo
{
  char name[NAME_MAX];//姓名
  char sex[SEX_MAX];//性别
  int age;//年龄
  char tele[TELE_MAX];//电话
  char addr[ADDR_MAX];//地址
}PeoInfo;
typedef struct contact
{
  PeoInfo data[MAX];//通讯录
  int sz;//记录通讯录的个数
}contact;
//函数的声明
//初始化
 void InitContact(contact* pc);
 //添加用户信息
 void AddContact(contact* pc);
 //打印通讯录
 void ShowContact(contact* pc);
 //删除联系人
 void DelContact(contact* pc);
 //查找某个联系人
 void SearchContact(contact* pc);
 //修改联系人
 void ModifyContact(contact* pc);
 //联系人排序
 void SortContact(contact* pc);
//函数功能的实现
void InitContact(contact* pc)
{
  assert(pc);
  memset(pc->data,0,sizeof(pc->data));
  pc->sz = 0;
}
void ShowContact(contact* pc)
{
  assert(pc);
  if (pc->sz == 0)
  {
    printf("通讯录为空\n");
    return;
  }
  printf("%-10s %-5s %-10s %-15s %-10s\n","名字","性别","年龄","电话","住址");
  int i = 0;
  for (i=0;i<pc->sz;i++)
  {
    printf("%-10s %-5s %-10d %-15s %-10s\n",
      pc->data[i].name, pc->data[i].sex, pc->data[i].age,
      pc->data[i].tele, pc->data[i].addr);
  }
  printf("\n");
}
void AddContact(contact* pc)
{
  assert(pc);
  int adds;
    back:
    if (pc->sz == MAX)
    {
      printf("通讯录已满,存入信息失败\n");
      return;
    }
    printf("请输入姓名>:");
    scanf("%s", pc->data[pc->sz].name);
    printf("请输入性别>:");
    scanf("%s", pc->data[pc->sz].sex);
    printf("请输入年龄>:");
    scanf("%d", &(pc->data[pc->sz].age));
    printf("请输入电话>:");
    scanf("%s", pc->data[pc->sz].tele);
    printf("请输入住址>:");
    scanf("%s", pc->data[pc->sz].addr);
    pc->sz++;
    printf("信息添加成功\n");
    printf("是否继续添加联系人信息1/0:");
    scanf("%d",&adds);
    if (adds == 1)
      goto back;
    else
    {
      return;
    }
}
//查看某个联系人是否存在
static int FindContact(contact* pc,char name[])
{
  assert(pc);
  int i = 0;
  for (i=0;i<pc->sz;i++)
  {
    if (strcmp(name, pc->data[i].name) == 0)
      return i;
  }
  return -1;
}
//删除联系人
void DelContact(contact* pc)
{
  assert(pc);
  if (pc->sz == 0)
  {
    printf("通讯录为空,删除失败\n");
    return;
  }
  printf("请输入你要删除的联系人:");
  char name[NAME_MAX];
  scanf("%s",name);
  int ret = FindContact(pc,name);
  if (ret == -1)
  {
    printf("联系人不存在,删除失败\n");
    return;
  }
  int i = 0;
  for (i=ret;i<pc->sz-1;i++)
  {
    pc->data[i] = pc->data[i + 1];
  }
  pc->sz--;
  printf("删除联系人成功\n");
}
//查找联系人
void SearchContact(contact* pc)
{
  assert(pc);
  printf("请输入你要查找联系人的名字:");
    char name[NAME_MAX];
  scanf("%s", name);
  int ret = FindContact(pc, name);
  if (ret == -1)
  {
    printf("联系人不存在,查找失败\n");
    return;
  }
  printf("查找成功:\n");
  printf("%-10s %-5s %-10s %-15s %-10s\n", "名字", "性别", "年龄", "电话", "住址");
  printf("%-10s %-5s %-10d %-15s %-10s\n",
    pc->data[ret].name, pc->data[ret].sex, pc->data[ret].age,
    pc->data[ret].tele, pc->data[ret].addr);
}
//修改联系人
void ModifyContact(contact* pc)
{
  assert(pc);
  printf("请输入你要查找联系人的名字:");
  char name[NAME_MAX];
  scanf("%s", name);
  int ret = FindContact(pc, name);
  if (ret == -1)
  {
    printf("联系人不存在,修改失败\n");
    return;
  }
  printf("联系人存在:");
  printf("%-10s %-5s %-10d %-15s %-10s\n",
    pc->data[ret].name, pc->data[ret].sex, pc->data[ret].age,
    pc->data[ret].tele, pc->data[ret].addr);
  printf("请修改姓名>:");
  scanf("%s", pc->data[ret].name);
  printf("请修改性别>:");
  scanf("%s", pc->data[ret].sex);
  printf("请修改年龄>:");
  scanf("%d", &(pc->data[ret].age));
  printf("请修改电话>:");
  scanf("%s", pc->data[ret].tele);
  printf("请修改住址>:");
  scanf("%s", pc->data[ret].addr);
  printf("\n修改成功");
}
//分类菜单
void menu2()
{
  printf("*************************\n");
  printf("**** 1.名字   2.年龄 ****\n");
  printf("*************************\n");
}
//名字排序
int qsort_cmp_name(const void* e1,const void* e2)
{
  return strcmp((((contact*)e1)->data)->name, (((contact*)e2)->data)->name);
}
//年龄排序
int qsort_cmp_age(const void* e1,const void* e2)
{
  return (((contact*)e1)->data)->age - (((contact*)e2)->data)->age;
}
//联系人排序
void SortContact(contact* pc)
{
  int input2;
  menu2();
  printf("请选择排序方式:");
  scanf("%d",&input2);
  switch (input2)
  {
  case 1:qsort(pc->data, pc->sz, sizeof(pc->data[0]), qsort_cmp_name);break;
  case 2:qsort(pc->data, pc->sz, sizeof(pc->data[0]), qsort_cmp_age);break;
  defualt:printf("选择错误\n");
    break;
  }
}
//主函数及菜单
void menu()
{
  printf("********************************\n");
  printf("**** 1. add      2. del     ****\n"); 
  printf("**** 3. search   4. modify  ****\n");
  printf("**** 5. show     6. sort    ****\n");
  printf("**** 0. exit                ****\n");
  printf("********************************\n");
}
enum Option
{
EXIT,//退出
ADD,//增加
DEL,//删除联系人
SEARCH,//查找联系人
MODIFY,//修改指定联系人
SHOW,//打印联系人
SORT,//分类
};
int main()
{
  contact con;
  InitContact(&con);
  int input;
  do
  {
    menu();
    printf("请输入你的选择>:");
    scanf("%d",&input);
    switch (input)
    {
    case ADD:AddContact(&con);
      break;
    case DEL:DelContact(&con);
      break;
    case SEARCH:SearchContact(&con);
      break;
    case MODIFY:ModifyContact(&con);
      break;
    case SHOW:ShowContact(&con);
      break;
    case SORT:SortContact(&con);
      break;
    case EXIT:printf("你已选择退出程序\n");
      break;
    default:printf("选择错误,请重新选择\n");
      break;
    }
  } while (input);
  return 0;
}

至此,通讯录的实现完成。

相关文章
通讯录的实现(增删查改排序)(1)
本课题模拟通讯录的实现,包括: 1.增加联系人的信息 2.删除联系人 3.查找联系人 4.修改联系人信息 5.对联系人进行排序
71 0
|
6月前
|
编译器 C语言
C语言进阶⑯(自定义类型)项目:静态通讯录,增删查改排序打印。
C语言进阶⑯(自定义类型)项目:静态通讯录,增删查改排序打印。
50 1
|
5月前
|
算法
数据结构和算法学习记录——复习静态顺序表的两个接口函数(在指定位置插入数据,在指定位置删除数据)
数据结构和算法学习记录——复习静态顺序表的两个接口函数(在指定位置插入数据,在指定位置删除数据)
22 0
|
6月前
|
存储
【数据结构】----顺序表项目-通讯录
【数据结构】----顺序表项目-通讯录
26 0
|
6月前
|
C语言
【通讯录项目 (2 / 3)】基于顺序表的通讯录实现——顺序表功能实现
顺序表的功能我们已经实现,我们使用的是最简单的顺序表,所以整个过程看起来没有困难。在下一篇文章中我们将进行通讯录的实现。 在通讯录里,顺序表的类型不在是简单的" int ",而是结构体类型。 下面给出通讯录的基本功能供大家参考预习。
49 0
|
6月前
|
存储 人工智能 算法
C语言之“动态顺序表的增删改查及拥有附加功能的通讯录实现”
C语言之“动态顺序表的增删改查及拥有附加功能的通讯录实现”
|
11月前
|
存储
数据结构——基于顺序表实现通讯录
数据结构——基于顺序表实现通讯录
129 0
7-3 通讯录排序(20分)
输入n个朋友的信息,包括姓名、生日、电话号码,本题要求编写程序,按照年龄从大到小的顺序依次输出通讯录。题目保证所有人的生日均不相同。
136 0
|
存储 Java 数据安全/隐私保护
java数据结构基于哈希表的学生通讯录程序设计
利用哈希表的思想设计一个能快速查询的学生通讯录程序。每个学生的信息至少包括:学号(10个数字)、姓名(不超过20字符)、手机号码(11个数字)。程序主要功能:从键盘输入学生通讯录,以学号为关键字建立哈希表,酌情设计哈希函数和处理冲突的策略;采用哈希表方法根据输入的学号显示该学生的通讯录信息;能够修改学生的手机号码;能够添加和删除某个学生的通讯录信息。
109 0
|
存储 C语言
【C语言】通讯录(添加、删除、查找、修改、显示、清空、按名字排序)
【C语言】通讯录(添加、删除、查找、修改、显示、清空、按名字排序)