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

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

一、通讯录变量的创建

【思路1】

   通讯录是一个复杂的对象,包含了用户的名字、性别、年龄、电话号码和家庭住址等信息,所以需要用结构体来定义

#define NAME_MAX 20
#define SEX_MAX 6
#define TELE_MAX 20
#define ADDR_MAX 20
typedef struct PeoInfo
{
  char name[NAME_MAX];//姓名
  char sex[SEX_MAX];//性别
  int age;//年龄
  char tele[TELE_MAX];//电话
  char addr[ADDR_MAX];//地址
}PeoInfo;

为了方便后续修改结构体中每个成员的大小范围,使用了宏定义的常量,来表示每个数组的大小。


【思路2】


(1)这是一个结构体类型,用来创造变量,一次只能创建一个,不合适,所以需要数组。


(2)因为通讯录是数组,所以需要一个变量来实时记录通讯录的个数。


(3)为了可以使用,他们需要同类型,所以还需要再创造一个结构体


#define MAX 100
typedef struct contact
{
  PeoInfo data[MAX];//通讯录
  int sz;//记录通讯录的个数
}contact;

接下来再用contact创造变量就好

contact con;//通讯录变量的创建

二、通讯录的初始化

(1)需要修改通讯录中的内容,需要传结构体的地址

InitContact(&con);//传参

2)初始化函数

void InitContact(contact* pc)
{
  assert(pc);
  memset(pc->data,0,sizeof(pc->data));
  pc->sz = 0;//通讯录开始的容量为0
}

(1)用assert函数判断指针是否为空,为空则会退出程序。需要包含头文件:#include<assert.h>


(2)用memset函数将通讯录中的内容设置成0即可。需要包含头文件:#include<string.h>


三、通讯录信息的添加(add)

(1)信息添加的条件


在信息添加前我们需要查看通讯录是否已满,满了则不能再继续添加信息。


传参:

AddContact(&con);

通讯录判满:

void AddContact(contact* pc)
{
    assert(pc);//指针判空操作
    if (pc->sz == MAX)
  {
    printf("通讯录已满,存入信息失败\n");
    return;
  }
}

(2)信息添加的过程

void AddContact(contact* pc)
{
  assert(pc); 
    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");
}

(1)逐一对通讯录进行信息添加即可,需要注意结构体的访问方式

(2)data数组的第一个联系人的下标是0,等于sz的值

(3)信息添加的完善

以上的操作每次只能添加一个人的信息,很不方便。所以我们使用go语句循环以上的代码

void AddContact(contact* pc)
{
  assert(pc);
  int adds;
    back://go语句标记2
    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;//go语句标记1
    else
    {
      return;
    }
}

四、通讯录的打印(show)

当已经可以想通讯录中添加了联系人信息之后,就可以将他们的信息打印在屏幕上进行验证:

(1)可以打印通讯录的条件

传参:

ShowContact(&con);

通讯录判空:

void ShowContact(contact* pc)
{
  assert(pc);
  if (pc->sz == 0)
  {
    printf("通讯录为空\n");
    return;
  }
}

如果通讯录一个信息都没有,将不会打印

(2)通讯录的打印

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");
}

(1)通讯录打印的时候,注意打印的格式

(2)%-10s:实现的是左对齐

五、删除联系人(del)

(1)通讯录的判空

传参:

DelContact(&con);

判空:

void DelContact(contact* pc)
{
  assert(pc);
  if (pc->sz == 0)
  {
    printf("通讯录为空,删除失败\n");
    return;
  }
}

(2)删除联系人的条件

如果需要删除的联系人不存在,那么也将会删除失败。所以需要查找联系人是否存在

查找函数:(联系人存在,返回联系人的下标;不存在返回-1)

传参:

    printf("请输入你要删除的联系人:");
  char name[NAME_MAX];
  scanf("%s",name);
  int ret = FindContact(pc,name);
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;
}

(3)删除操作

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");
}


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