C语言代码实现通讯录管理系统

目录
  • 一、需求分析
  • 二、程序结构
  • 三、头文件内容的介绍
  • 四、模块化实现各个功能
    • (1)主函数实现
    • (2)初始化通讯录
    • (3)添加联系人信息
    • (4)删除联系人信息
    • (5)查找联系人信息
    • (6)更改联系人信息
    • (7)显示所有联系人信息
    • (8)对联系人信息进行排序
    • (9)退出时销毁通讯录

本文实例为大家分享了C语言实现通讯录管理系统,供大家参考,具体内容如下

一、需求分析

运用C语言实现一个简单的通讯录管理系统,要求对数据有 增删改查清排显 等功能的实现(这里由于还没学到文件,所以下面所有的存储都是在内存中,也就是当程序结束的时候添加的信息都会清空掉 - 后续会加以改进的)

二、程序结构

在基本的程序设计中,都会将项目分为三个文件:

1、test.c - 主函数(负责调用各个功能的接口)
2、contact.c - 实现各个模块的功能
3、contact.h - 用于存放头文件、宏定义、函数声明等

三、头文件内容的介绍

#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <ctype.h>
#include <errno.h>
#include <stdlib.h>

#define MAX 1000
#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 50
#define TELE_MAX 12

#define DEFAULT_SZ 3

// 数组版本
//typedef struct PeoInfo
//{
//    char name[NAME_MAX];
//    int age;
//    char sex[SEX_MAX];
//    char addr[ADDR_MAX];
//    char tele[TELE_MAX];
//}PeoInfo;
//
//typedef struct Contact
//{
//    //PeoInfo data[MAX];  // 存放信息
//    PeoInfo data[MAX];
//    int sz; // 存放通讯录有几个人的信息
//}Contact;

// 每个人的基本信息
typedef struct PeoInfo
{
    char name[NAME_MAX];
    int age;
    char sex[SEX_MAX];
    char addr[ADDR_MAX];
    char tele[TELE_MAX];
}PeoInfo;

typedef struct Contact
{
    //PeoInfo data[MAX];  // 存放信息
    PeoInfo* data;
    int sz; // 存放通讯录有几个人的信息
    int capacity; // 记录当前通讯录的最大容量
}Contact;

void DestoryContact(Contact* pc);
void InitContact(Contact* pc);
void AddContact(Contact* pc);
void ShowContact(const Contact* pc);
void DeleteContact(Contact* pc);
void SearchContact(const Contact* pc);
void ModifyContact(Contact* pc);
void SortContact(Contact* pc);

里面被注释的代码则是之前的数组版本,规定死了通讯录大小;而下面我们会用动态增容来进行实现。头文件里面用宏定义主要为了之后我们更改对应的大小的时候更加的方便;结构体主要存放的就是三大部分:

1. 一个指向每个人基本信息的结构体指针;2. sz记录着通讯录的记录条数;3. capacity 存放通讯录的容量

四、模块化实现各个功能

(1)主函数实现

int main()
{
    int input = 0;
    Contact con; // 创建通讯录

    InitContact(&con);

    do
    {
        menu();
        printf("请选择:->");
        scanf("%d", &input);

        switch (input)
        {
        case ADD:
            AddContact(&con);
            break;
        case DEL:
            DeleteContact(&con);
            break;
        case SEARCH:
            SearchContact(&con);
            break;
        case MODIFY:
            ModifyContact(&con);
            break;
        case SORT:
            SortContact(&con);
            break;
        case SHOW:
            ShowContact(&con);
            break;
        case EXIT:
            DestoryContact(&con);
            printf("退出\n");
            break;
        default:
            printf("输入错误,请重新输入\n");
            break;
        }
    } while (input);

    return 0;
}

一般函数的主函数里面都可以用do ……while结构来控制程序的执行顺序,在case后面用的则是 枚举常量 ,这样能做到更好的见名知意。

(2)初始化通讯录

void InitContact(Contact* pc)
{
    assert(pc);
    pc->sz = 0;
    PeoInfo* tmp = (PeoInfo*)malloc(DEFAULT_SZ * sizeof(PeoInfo));
    if (tmp != NULL)
    {
        pc->data = tmp;
    }
    else
    {
        printf("InitContact()::%s\n", strerror(errno));
    }

    pc->capacity = DEFAULT_SZ;
}

这里设定了通讯录的起始大小,后面可以通过动态增容来扩大(而数组版本的话就没有这么灵活了)

(3)添加联系人信息

void check_capacity(Contact* pc)
{
    assert(pc);
    if (pc->sz == pc->capacity)
    {
        // 增容
        PeoInfo* tmp = (PeoInfo*)realloc(pc->data, (pc->capacity + 2)*sizeof(PeoInfo));
        if (tmp != NULL)
        {
            pc->data = tmp;
            pc->capacity += 2;
            printf("增容成功\n");
        }
        else
        {
            printf("InitContact()::%s\n", strerror(errno));
        }
    }
}

void AddContact(Contact* pc)
{
    assert(pc);
    check_capacity(pc);

    // 添加内容
    printf("名字:");
    scanf("%s", pc->data[pc->sz].name);
    printf("年龄:");
    scanf("%d", &(pc->data[pc->sz].age));
    printf("性别:");
    scanf("%s", pc->data[pc->sz].sex);
    printf("地址:");
    scanf("%s", pc->data[pc->sz].addr);
    printf("电话:");
    scanf("%s", pc->data[pc->sz].tele);
    
    pc->sz++;
    printf("添加成功\n");
}

这里实现了一个check_capacity 的接口,用来判断当前通讯录是否存满了;若满了则进行扩容(一般按2倍进行扩容),注意:添加成功后需要对 sz++

(4)删除联系人信息

int FindByName(const Contact* pc, char* name)
{
    int i = 0;
    for (i = 0; i < pc->sz; i++)
    {
        if (strcmp(pc->data[i].name, name) == 0)
        {
            return i;
        }
    }
    return -1;
}

void DeleteContact(Contact* pc)
{
    char name[NAME_MAX] = { 0 };
    assert(pc);

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

    // 根据输入的人名进行删除
    printf("请输入要删除的人名:");
    scanf("%s", name);

    int pos = FindByName(pc, name);

    if (pos == -1)
    {
        printf("要删除的人不存在\n");
    }
    else
    {
        // 删除
        //int j = 0;
        //for (j = pos; j < pc->sz-1; j++)  // sz-1为了防止j+1非法访问
        //{
        //    pc->data[j] = pc->data[j + 1];
        //}

        //pc->sz--;
        //printf("删除成功\n");
        //if (pc->sz>1)
        memmove((pc->data) + pos, (pc->data) + pos + 1, (pc->sz - pos)*sizeof(PeoInfo));
        pc->sz--;
    }
}

这里我就只做了按照名字进行删除,你们也可以都尝试一下哟。下面写了两种删除方法(这里的按名字删除前需要进行查找,因此我们也可以直接使用我们下面要实现的查找函数,但如果查找里面进行了其他功能,那时不能直接使用的哟)

(5)查找联系人信息

void SearchContact(const Contact* pc)

{
    char name[NAME_MAX] = { 0 };
    assert(pc);

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

    printf("请输入要查找的姓名:");
    scanf("%s", name);
    int i = FindByName(pc, name);

    if(-1 == i)
    {
        // 没有找到
        printf("你要查找的人不存在\n");
    }
    else
    {
        // 找到了
        printf("%-10s\t%-5s\t%-5s\t%-20s\t%-13s\n", 
                "姓名", "年龄", "性别", "地址", "电话");
        printf("%-10s\t%-5d\t%-5s\t%-20s\t%-13s\n",
            pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].addr, pc->data[i].tele);
    }
}

这里如果查找到了后,我打印显示了一下

(6)更改联系人信息

void ModifyContact(Contact* pc)
{
    char name[NAME_MAX] = { 0 };
    assert(pc);

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

    printf("请输入要修改信息的姓名:");
    scanf("%s", name);

    int i = FindByName(pc, name);

    // 修改内容
    printf("新的名字:");
    scanf("%s", pc->data[i].name);
    printf("新的年龄:");
    scanf("%d", &(pc->data[i].age));
    printf("新的性别:");
    scanf("%s", pc->data[i].sex);
    printf("新的地址:");
    scanf("%s", pc->data[i].addr);
    printf("新的电话:");
    scanf("%s", pc->data[i].tele);

    printf("修改后的信息为:\n");

    printf("%-10s\t%-5s\t%-5s\t%-20s\t%-13s\n", "姓名", "年龄", "性别", "地址", "电话");
    printf("%-10s\t%-5d\t%-5s\t%-20s\t%-13s\n",
        pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].addr, pc->data[i].tele);
}

(7)显示所有联系人信息

void ShowContact(const Contact* pc)
{
    assert(pc);
    // 打印标题
    printf("%-10s\t%-5s\t%-5s\t%-20s\t%-13s\n", "姓名", "年龄", "性别", "地址", "电话");
    int i = 0;
    for (i = 0; i < pc->sz; i++)
    {
        printf("%-10s\t%-5d\t%-5s\t%-20s\t%-13s\n",
            pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].addr, pc->data[i].tele);
    }
}

直接遍历打印即可

(8)对联系人信息进行排序

int cmp_by_name(const void* e1, const void* e2)
{
    return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}

int cmp_by_age(const void* e1, const void* e2)
{
    return ((PeoInfo*)e1)->age - ((PeoInfo*)e2)->age;
    // return strcmp(, ((PeoInfo*)e2)->name);
}

void SortContact(Contact* pc)
{
    int choice = 0;
    printf("请选择:(1、按姓名;2、按年龄)");
    scanf("%d", &choice);

    if (1 == choice)
    {
        qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp_by_name);

        printf("排序后的数据:\n");
        ShowContact(pc);
    }
    else if (2 == choice)
    {
        qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp_by_age);
        printf("排序后的数据:\n");
        ShowContact(pc);
    }
    else
    {
        printf("输入有误\n");
    }
}

这里使用qsort实现的排序,可以对 姓名 或 年龄进行排序的

(9)退出时销毁通讯录

void DestoryContact(Contact* pc)
{
    assert(pc);
    free(pc->data);
    pc->data = NULL;
}

直接将里面指向有效内容的 pc->data 进行free释放就行,因为它本来就是动态开辟的,后面要有个好习惯,free之后将其置为NULL,不然就为野指针了。

总结:

以上就是动态增容版本通讯录的全部代码,尽管用了动态增容,里面仍然会存在很多的空间浪费,后面等博主学了链表后,在进行改进。

希望这篇文章对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C语言动态与静态分别实现通讯录详细过程

    目录 前言: 一.静态通讯录的实现 1.环境的分工逻辑 2.待实现的功能 3.contact.h 4.contact.c 5.test.c 6.实现效果 二.通讯录动态的实现 1.contact.h 2.contact.c 3.test.c 前言: 通讯录相信每一个人都了解过 它的功能包括简单包括:增删查改 这一期就来实现一个C语言实现的通讯录 续上次所聊到的--动态内存的分配 那么我会从标题所给的两个方式来实现 一.静态通讯录的实现 1.环境的分工逻辑 由于过程有点长,便于理解,所以一共会用到

  • C语言实现简易通讯录实例

    目录 一.问题描述 二.功能介绍 二.实现流程 1.创建通讯录 2.创建源文件test.c 3.创建源文件contact.c 4.删除通讯录联系人信息 (DelContact函数实现) 5.查找通讯录联系人信息( SearchContact函数实现) 6.修改联系人信息(ModifyContact函数实现) 总结: 一.问题描述 用C语言来写一个简易的通讯录 二.功能介绍 通讯录1.通讯录中能够存放1000个人的信息每个人的信息:名字,年龄,性别,电话,地址2.增加人的信息3.删除人的信息4.修

  • C语言实现简单的通讯录管理系统

    本文实例为大家分享了C语言实现通讯录管理系统的具体代码,供大家参考,具体内容如下 要实现一个通讯录管理系统,需要用到结构体.指针.文件操作.动态管理等内容. 效果展示: 实现思路 通讯录中的联系人包括姓名.年龄.性别.电话.住址,因此可以定义一个结构体PeoInfo来存储这些信息. 同时,由于通讯录需要记录当前的大小,以此来方便我们对通讯录realloc进行扩容,所以需要定义通讯录结构体Contact来保存这些信息,其中该结构体中可以嵌套一个PeoInfo类型的指针. 当定义完结构体以后,就可以

  • C语言实现可增容动态通讯录详细过程

    目录 创建可自动扩容的通讯录 添加用户信息 删除用户信息 查找联系人 修改用户信息 以名字将用户排序 销毁通讯录 创建可自动扩容的通讯录 这里我们想实现通讯录自动扩容,不够了能扩大内存,变得稍微有点智能,就不得不用到开辟内存的函数malloc和realloc,这两个函数又和free离不开关系 所以这里我给大家简单的介绍一下这三个库函数 malloc:这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针 void *malloc( size_t size ); 如果开辟成功,则返回一个指

  • C语言实现通讯录系统程序

    本文实例为大家分享了C语言实现通讯录系统程序的具体代码,供大家参考,具体内容如下 前言 利用链表增.删.改.查功能以及文件来完成通讯录系统.通讯录中包含联系人的基本信息:姓名.联系电话.家庭住址以及电子邮件. 以下是设计该系统的步骤: 1.导出通讯录系统的功能: (构建一个通讯录结构体) #include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h>  /*定义通讯录结构体*

  • C语言静态动态两版本通讯录实战源码

    目录 正片开始 静态版本 头文件( phonebook.h) 接口(test.c) 功能板块(phonebook.c) 1. 初始化: 2. 增添: 3.查找 4.删除 5.修改 6.排序 7.全览 静态版全部代码 test.c(接口) phonebook.h(头文件) phonebook.c(功能) 动态版 动态初始化: 扩容函数 动态版全部代码 test.c phonebook.h 正片开始 这里为了方便对照,我搬出整个程序的前后修改版本,并分别作为静态和动态版本,实际差距并不大,提供出来只

  • 用C语言实现通讯录

    相信大家都见识过通讯录,通讯录里面一般有的内容为姓名,联系方式,年龄等信息.通讯录的主要功能有:增加.删除.查找.排序.修改.展示等操作. 那么具体应该用C语言怎么实现这个呢?接下来我们大家一起来看一下,一起用前一段时间所学习的C语言相关知识来看看! 1. 先定义主函数 Contact.h 里面声明通讯录所要实现的功能,第一次的功能可能考虑不全.没关系,可以在想要某个功能时再添加即可. #define _CRT_SECURE_NO_WARNINGS 1 #ifndef __CONTACT_H_

  • C语言与C++动态通讯录超详细实现流程

    目录 1.思路以及要实现的功能 2.详细步骤 2.1 打印菜单界面(建一个源文件test.c) 2.2 主函数 2.3 初始化函数与加载函数 2.4 增加联系人函数AddContact 2.5 删除联系人函数DelContact 2.6 查找联系人函数与打印函数 2.7 修改信息函数ModifyContact 2.8 排序函数SortContact 2.9 保存信息函数与销毁数据函数 3.源码 1.思路以及要实现的功能 通讯录就是为了存储许多联系人的不同方面的信息如名字.电话.地址.年龄.性别等

  • C语言实现通讯录功能的流程与代码

    用C语言制作一个拥有添加,删除,查找,修改,排序,清空,打印功能的通讯录 用分模块的方法来实现这个通讯录,函数的声明,类型的声明放在一个.h文件中,函数的实现放在一个.c文件中,在主文件中来调用函数. 首先创建一个test.c文件用来测试并且实现通讯录的功能 通讯录需要显示一个菜单来让用户具体选择哪个功能,那么在test.c文件中就需要打印出来一个菜单,如下代码: #include <stdio.h> void menu() { printf("*******************

  • C语言代码实现通讯录管理系统

    目录 一.需求分析 二.程序结构 三.头文件内容的介绍 四.模块化实现各个功能 (1)主函数实现 (2)初始化通讯录 (3)添加联系人信息 (4)删除联系人信息 (5)查找联系人信息 (6)更改联系人信息 (7)显示所有联系人信息 (8)对联系人信息进行排序 (9)退出时销毁通讯录 本文实例为大家分享了C语言实现通讯录管理系统,供大家参考,具体内容如下 一.需求分析 运用C语言实现一个简单的通讯录管理系统,要求对数据有 增删改查清排显 等功能的实现(这里由于还没学到文件,所以下面所有的存储都是在

  • 基于C语言实现个人通讯录管理系统

    之前利用C语言完成了一个关于个人通讯录管理系统的课题,主要是关于联系人的添加.查找.删除.修改.输出以及文件的写入与读出,还有一个甜点功能-模拟通话,它的实现原理也很容易理解,文章末尾会介绍到. 主框架: 1.函数声明 关于这里的函数声明,主要是为了可以清楚的了解整个系统的功能,这里不做过多介绍.还有结构体链表的创建,贯穿了各个功能代码部分,必不可少. 2.联系人的添加 这部分主要涉及联系人的姓名.地址.电话.QQ号和邮箱(当然需要其他功能可自行添加),考虑到数组操作不便前提下,使用链表的尾插法

  • C语言实现简单通讯录管理系统

    C语言实现的通讯录管理系统,供大家参考,具体内容如下 设计一个学生通信录,学生通迅录数据信息构成内容可自行设计(如:学号.姓名.电话号码.所在班级.寝室地址等),通信录数据类型定义为结构体类型. 主要实现功能包括: (1)创建学生通讯录 (2)修改学生通讯录 (3)增删学生通讯录 (4)能够按多种方式进行查询(如:①按学号查询:②按所在班级查询) 源代码: #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.

  • C语言开发实现通讯录管理系统

    本文实例为大家分享了C语言通讯录管理系统开发的具体代码,供大家参考,具体内容如下 程序介绍 通讯录管理系统主要是实现对联系人的增.删.查以及显示的基本操作.用户可以根据自己的需要在功能菜单中选择相应的操作,实现对联系人的快速管理. 操作流程 用户在编译完成后会产生一个系统的可执行文件,用户只要双击可执行文件就可以进入系统,进入系统的功能选择菜单,如图所示,用户根据自己的需要选择相应的操作. 代码 #include<stdio.h> #include<stdlib.h> #inclu

  • C语言实现个人通讯录管理系统

    如何用c语言制作简易的个人通讯录管理系统?想必这是每一位初步学习c语言的同学需要解决的一个大问题.如何将这些数据类型不完全相同的数据元素存储并访问呢?采用结构体便能轻松解决这个问题! #include<stdio.h> #include<string.h> #include<stdlib.h> #include<windows.h> struct stu //第一部分:声明结构体类型struct stu { char name[100];//姓名为字符串型

  • C语言实现通讯录管理系统

    本文实例为大家分享了C语言实现通讯录管理系统的具体代码,供大家参考,具体内容如下 工具:Visual C++6.0 说明: 本系统基于C语言实现班级通讯录管理系统,为大一时学习C语言刚入门所做的课程设计.功能包括增.删.查.改等,非常适合初学者练手.通讯录包括的个人信息有姓名.学号.性别.籍贯.政治面貌.手机号.QQ号.宿舍等.主要用到了指针.结构体.遍历链表.文件读取等知识点. 运行效果: 代码: #include<stdio.h> #include<string.h> #inc

  • C语言通讯录管理系统完整代码

    本文实例为大家分享了C语言实现通讯录管理系统的具体代码,供大家参考,具体内容如下 设计内容: 设计一个通讯录管理系统,以实现以下功能:信息添加.查询.修改.删除.排序等功能. 设计要求: 1) 每条信息至包含 :姓名.电话.工作单位等信息2) 作为一个完整的系统,应具有友好的界面和较强的容错能力 预览: 代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <windows.

  • 学生成绩管理系统C语言代码实现

    C语言实现了学生成绩管理系统,可以进行学生成绩的增加,删除,更新,查询,计算和展示. 完整代码如下: #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct person //定义结构体 { char num[10]; //学号 char name[20]; //姓名 float cyuyan; //C语言成绩 float en; //物理学成绩 float ji; //原子物理成绩

  • C语言通讯录管理系统完整版

    C语言实现了通讯录的录入信息.保存信息.插入.删除.排序.查找.单个显示等功能.. 完整的代码如下: #include <stdio.h> #include <malloc.h> //得到指向大小为Size的内存区域的首字节的指针// #include <string.h> #include <stdlib.h> //标准库函数// #define NULL 0 #define LEN sizeof(struct address_list) //计算字节//

  • C语言单链表实现通讯录管理系统

    本文实例为大家分享了C语言单链表实现通讯录管理系统的具体代码,供大家参考,具体内容如下 本人前几天刚刚自学了单链表,趁热打铁,赶紧写一个小小的项目练练手. 单链表的实现在本人之前的博客中有:C语言编写一个链表 通讯录管理系统 保存人的信息有:  名字   name 电话   telephone 性别   sex 年龄   age 用一个结构体来装这些信息: struct infor{ char name[20]; int age; char sex[8]; char telephone[16];

随机推荐