C语言实现制作通讯录(新手推荐)

目录
  • 一、本通讯录要实现的功能
  • 三、程序编写
  • 四、完整程序

一、本通讯录要实现的功能

通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址

通讯录可执行的操作如下:

  • 添加联系人信息
  • 删除指定联系人信息
  • 查找指定联系人信息
  • 修改指定联系人信息
  • 显示所有联系人信息
  • 清空所有联系人
  • 以名字排序所有联系人

二、通讯录初步准备:

1.创建一个.c文件,编写主函数main;

2.再创建一个.c文件,用于集中存放1中的.c文件所使用到的自定义函数;

3.创建一个.h头文件,用于申明1中的.c文件所使用到的函数。

如下图:

三、程序编写

下文将介绍程序的编写思路:

步骤1、首先根据通讯录所包含的信息要求,在头文件中构造结构体PeoIfo,即通讯录要求包含的信息;再构造结构体contact用于储存多个联系人。(注:本段代码使用#define是因为整个程序中会多次用到这些数值,通过#define的方式若后期要修改值,不需要通篇去修改。)

#define MAX 100
#define nameMAX 20
#define sexMAX 10
#define telMAX 20
#define adrMAX 20

struct PeoIfo
{
    char name[nameMAX];
    char sex[sexMAX];
    int age;
    char tel[telMAX];
    char adr[adrMAX];
};

struct contact
{
    struct PeoIfo data[MAX];
    int sz;
};

步骤2、在第一个.c文件中写主函数main(),对步骤1中所构造的结构体进行初始化,初始化函数次数命名为InitContact(&con)。(注:此处段代码需要引用头文件“contact.h”)

#include"contact.h"

int main() {

    int input = 0;
    struct contact con;
    //初始化
    InitContact(&con);

    return 0;
}

步骤3、在头文件中申明初始化函数

//初始化
void InitContact(struct contact* pc);

步骤4、再另外一个.c文件中编写该初始化函数,使其实现初始化功能。

//初始化
void InitContact(struct contact* pc)
{
    pc->sz = 0;
    memset(pc->data, 0, MAX * sizeof(struct PeoIfo));

}

步骤5、回到主函数main()中。编写程序菜单menu(),再编写Switch语句,对应菜单中的选项。此处以1.add为例,1.add选项为增加联系人。

#include"contact.h"
void menu()
{
    printf("*****************************\n");
    printf("****1.add       2.del    ****\n");
    printf("****3.search    4.modify ****\n");
    printf("****5.show      6.empty  ****\n");
    printf("****7.sort      0.exit   ****\n");
    printf("*****************************\n");
}
int main() {

    int input = 0;
    struct contact con;
    //初始化
    InitContact(&con);

    do
    {
        menu();
        printf("请选择:");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            add(&con);
            break;
        case 2:
            del(&con);
            break;
        case 3:
            search(&con);
            break;
        case 4:
            modify(&con);
            break;
        case 5:
            show(&con);
            break;
        case 6:
            InitContact(&con);//直接给他初始化不就清空了。
            break;
        case 7:
            Sort(&con);
            break;
        case 0:
            printf("已退出通讯录。\n");
            break;
        default:
            printf("输入错误,请重新输入:\n");
            break;
        }
    } while (input);

    return 0;
}

步骤6、在.h头文件中申明函数

//添加联系人
void add(struct contact* pc);

步骤7、在另外一个.c文件中,对add函数编写,使其达到添加联系人的功能。此处介绍一下

pc->data[pc->sz].name的含义,pc->data[i],对data中的第i个联系人的结构体PeoIfo进行解引用,.name便是指该联系人的姓名。该段代码末尾pc->sz++,是指联系人+1。

//添加联系人
void add(struct contact* pc)
{
    if (pc->sz >= MAX)
    {
        printf("通讯录已满。\n");
        return;
    }
    printf("请输入姓名\n");
    scanf("%s", pc->data[pc->sz].name);
    printf("请输入性别\n");
    scanf("%s", pc->data[pc->sz].sex);
    printf("请输入年龄\n");
    scanf("%d", &(pc->data[pc->sz].age));
    printf("请输入电话\n");
    scanf("%s", pc->data[pc->sz].tel);
    printf("请输入住址\n");
    scanf("%s", pc->data[pc->sz].adr);
    pc->sz++;
}

步骤8、同理重复步骤6、7,实现剩余的删除、查找等功能。此处不一一赘述,读者在学会add的编写之后,建议独自进行其他功能的函数实现思考。

四、完整程序

1、主函数所在的.c文件原码

#include"contact.h"
void menu()
{
    printf("*****************************\n");
    printf("****1.add       2.del    ****\n");
    printf("****3.search    4.modify ****\n");
    printf("****5.show      6.empty  ****\n");
    printf("****7.sort      0.exit   ****\n");
    printf("*****************************\n");
}
int main() {

    int input = 0;
    struct contact con;
    //初始化
    InitContact(&con);

    do
    {
        menu();
        printf("请选择:");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            add(&con);
            break;
        case 2:
            del(&con);
            break;
        case 3:
            search(&con);
            break;
        case 4:
            modify(&con);
            break;
        case 5:
            show(&con);
            break;
        case 6:
            InitContact(&con);//直接给他初始化不就清空了。
            break;
        case 7:
            Sort(&con);
            break;
        case 0:
            printf("已退出通讯录。\n");
            break;
        default:
            printf("输入错误,请重新输入:\n");
            break;
        }
    } while (input);

    return 0;
}

2、.h头文件原码

#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>

#define MAX 100
#define nameMAX 20
#define sexMAX 10
#define telMAX 20
#define adrMAX 20

struct PeoIfo
{
    char name[nameMAX];
    char sex[sexMAX];
    int age;
    char tel[telMAX];
    char adr[adrMAX];
};

struct contact
{
    struct PeoIfo data[MAX];
    int sz;
};

//初始化
void InitContact(struct contact* pc);
//添加联系人
void add(struct contact* pc);
//删除联系人
void del(struct contact* pc);
//查找联系人
void search(struct contact* pc);
//修改联系人
void modify(struct contact* pc);
//展示通讯录
void show(struct contact* pc);
//清空通讯录
void empty(struct contact* pc);
//按姓名排序
void Sort(struct contact* pc);

3、自定义函数所在的.c文件原码

#include"contact.h"

//打印项目
void pri()
{

    printf("%-15s\t%-10s\t%-10s\t%-10s\t%-20s\n", "姓名", "性别", "年龄", "电话", "住址");
}

//查找联系人的位置
int FindPOS(const struct contact* pc,char name[])
{
    int i = 0;
    for (i = 0; i < pc->sz; i++)
    {
        if (0==strcmp(pc->data[i].name, name) )
        {
            return i;
        }
    }
    return -1;
}
//初始化
void InitContact(struct contact* pc)
{
    pc->sz = 0;
    memset(pc->data, 0, MAX * sizeof(struct PeoIfo));

}

//添加联系人
void add(struct contact* pc)
{
    if (pc->sz >= MAX)
    {
        printf("通讯录已满。\n");
        return;
    }
    printf("请输入姓名\n");
    scanf("%s", pc->data[pc->sz].name);
    printf("请输入性别\n");
    scanf("%s", pc->data[pc->sz].sex);
    printf("请输入年龄\n");
    scanf("%d", &(pc->data[pc->sz].age));
    printf("请输入电话\n");
    scanf("%s", pc->data[pc->sz].tel);
    printf("请输入住址\n");
    scanf("%s", pc->data[pc->sz].adr);
    pc->sz++;
}

//删除联系人
void del(struct contact* pc)
{
    printf("请输入要删除的联系人姓名:\n");
    char delname[nameMAX];
    scanf("%s", &delname);
    int ret=FindPOS(pc, delname);
    if (-1 == ret)
    {
        printf("要删除的联系人不存在\n");
    }
    else
    {
        int i = 0;
        for (i = ret; i < pc->sz - 1; i++)
        {
            pc->data[ret] = pc->data[ret + 1];
        }
        pc->sz--;
        printf("删除成功\n");
    }
}

//查找联系人
void search(struct contact* pc)
{
    char sechname[nameMAX];
    printf("请输入要找的联系人:\n");
    scanf("%s", &sechname);
    int ret = FindPOS(pc, sechname);
    if (-1 == ret)
    {
        printf("找不到联系人\n");
        return;
    }
    pri();
    printf("%-15s\t%-10s\t%-10d\t%-10s\t%-20s\n",
            pc->data[ret].name,
            pc->data[ret].sex,
            pc->data[ret].age,
            pc->data[ret].tel,
            pc->data[ret].adr);
}

//修改联系人
void modify(struct contact* pc)
{
    printf("请输入要修改的联系人姓名:\n");
    char moname[nameMAX];
    scanf("%s", &moname);
    int ret = FindPOS(pc, moname);
    if (-1 == ret)
    {
        printf("没有找到联系人\n");
    }
    else
    {
        printf("请输入姓名\n");
        scanf("%s", pc->data[ret].name);
        printf("请输入性别\n");
        scanf("%s", pc->data[ret].sex);
        printf("请输入年龄\n");
        scanf("%d", &(pc->data[ret].age));
        printf("请输入电话\n");
        scanf("%s", pc->data[ret].tel);
        printf("请输入住址\n");
        scanf("%s", pc->data[ret].adr);
    }

}

//展示通讯录
void show(struct contact* pc)
{
    pri();
    int i = 0;
    for (i = 0; i < pc->sz; i++)
    {
        printf("%-15s\t%-10s\t%-10d\t%-10s\t%-20s\n",
            pc->data[i].name,
            pc->data[i].sex,
            pc->data[i].age,
            pc->data[i].tel,
            pc->data[i].adr);
    }

}

//按姓名排序
int compare(void* s1, void* s2)
{
    return strcmp(((struct PeoIfo*)s1)->name, ((struct PeoIfo*)s2)->name);
}
void Sort(struct contact* pc)
{
    qsort(pc->data, pc->sz, sizeof(struct PeoIfo), compare);
}

以上就是C语言实现制作通讯录(新手推荐)的详细内容,更多关于C语言通讯录的资料请关注我们其它相关文章!

时间: 2022-09-20

详解C语言之实现通讯录

目录 基本思路和代码实现 其他探讨 总结 基本思路和代码实现 为了代码清晰易读,我们创建一个Main.c源文件用来实现代码的基本逻辑.创建一个Contact.h源文件用于封装实现功能的函数,创建Contact.h头文件用于函数的声明. 首先就是构架代码基本框架,在主函数中实现打印菜单和循环的功能 (这里为了好截图switch里的语句缩进得比较紧凑) 基本逻辑实现后开始考虑创建通讯录,通讯录里会记录人的信息.所以要先能够描述人的信息: 创建表达人的信息的结构体类型,在Contact.h中定义: 而

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

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

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

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

C语言实现静态版通讯录的示例代码

目录 前言 通讯录需求分析 功能介绍 实现思路 代码实现 test.c contact.c contact.h 效果图 前言 大家好~今天要实现一个非常有意思的东西–通讯录. 通讯录需求分析 为了实现通讯录管理系统,为此,要保证实现以下的功能: 能够存放1000个联系人的信息.每个人的信息包含:名字.年龄.性别.电话.地址.除此之外,还是实现:增加人的信息.删除人的信息.修改指定人的信息.查找指定人的信息.清空联系人的信息.显示联系人的信息.排序通讯录的信息. 功能介绍 1.增加联系人信息 2.

用c语言编写一个通讯录代码详解

目录 实现通讯录的思路如下: 总结 实现通讯录的思路如下: 1.程序运行起来时用户首先要看到菜单栏选项并且对应菜单栏所给出的选项做出选择,这里我们简单设计一个Menu()函数可以让用户看见可选项目: 2.用户可选的范围应该是1~7,为了避免用户做出超出范围的选择我们可以用switch语句来判断用户的选择若用户输入的数字非法还可以让用户继续选择,而继续选择这个动作需要用到while语句,用户对通讯录的不断操作也需要用到while语句: 3.用户选择不同的选项,程序就要调用对应的函数来实现其功能并且

JavaScript编写棋盘覆盖代码详解

一.前言 之前做了一个算法作业,叫做棋盘覆盖,本来需要用c语言来编写的,但是因为我的c语言是半桶水(哈哈),所以索性就把网上的c语言写法改成JavaScript写法,并且把它的覆盖效果显示出来 二.关键代码 <!DOCTYPE html> <html> <head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <titl

Java语言实现数据结构栈代码详解

近来复习数据结构,自己动手实现了栈.栈是一种限制插入和删除只能在一个位置上的表.最基本的操作是进栈和出栈,因此,又被叫作"先进后出"表. 首先了解下栈的概念: 栈是限定仅在表头进行插入和删除操作的线性表.有时又叫LIFO(后进先出表).要搞清楚这个概念,首先要明白"栈"原来的意思,如此才能把握本质. "栈"者,存储货物或供旅客住宿的地方,可引申为仓库.中转站,所以引入到计算机领域里,就是指数据暂时存储的地方,所以才有进栈.出栈的说法. 实现方式是

使用synchronized实现一个Lock代码详解

刚看到这个题目的时候无从下手,因为觉得synchronized和lock在加锁的方式上有很大不同,比如,看看正常情况下synchronized时如何加锁的. 方式一: public synchronized void a(){ //TODO } 方式二: public void b(){ synchronized(this){ //TODO } } 从这两种方式来看,锁都是加在{}之间的,我们再来看看Lock是如何做的呢: public void c() { lock.lock(); try {

Swift利用CoreData实现一个通讯录存储详解

前言 相信大家对CoreData应该都不陌生,CoreData作为Apple的亲儿子,依然在App需要存储结构化数据上发挥着重要的作用.CoreData已经超过十年了,而且亲爹还在积极的维护着它. Core Data是iOS5之后才出现的一个数据持久化存储框架,它提供了对象-关系映射(ORM)的功能,即能够将对象转化成数据,也能够将保存在数据库中的数据还原成对象. 虽然其底层也是由类似于SQL的技术来实现,但我们不需要编写任何SQL语句,有点像Java开发中的Hibernate持久化框架 Cor

如何用C语言编写PHP扩展的详解

1:预定义在home目录,也可以其他任意目录,写一个文件,例如caleng_module.def内容是你希望定义的函数名以及参数:int a(int x,int y)string b(string str,int n) 2:到php源码目录的ext目录#cd /usr/local/php-5.4.0/ext/ 执行命令,生成对应扩展目录#./ext_skel --extname=caleng_module --proto=/home/hm/caleng_module.def 3:修改config

易语言结束程序的代码详解

易语言怎么结束程序呢?这个是我们要考虑的,请看下面. 非无私奉献,拒绝看经验不回复,学懂了记得按照下面做: 具体操作请看图. 1.易语言新建一个windows窗口 2.我们需要添加一个按钮 按住右边框内图标 3.然后再窗口上 就可以拉出来一个按钮 4.点击按钮 进入按钮代码编辑区 5.这里我们输入函数 结束()就可以了很简单 6.我们运行看看窗口 然后点击按钮 就可以关闭当前程序了

易语言日志记录类代码详解

以下是关于用易语言编写的记录日志类的相关源码内容 .版本 2 .子程序 写日志记录 .参数 写日志_日志文件名, 文本型 .参数 写日志_日志文本, 文本型 .局部变量 文件句柄, 整数型 文件句柄 = 打开文件 (写日志_日志文件名, , ) .如果 (文件句柄 = 0)     写到文件 (写日志_日志文件名, {  }) .否则 .如果结束 文件句柄 = 打开文件 (写日志_日志文件名, , ) .如果 (文件句柄 > 0)     插入文本行 (文件句柄, 到文本 (取现行时间 ())

关于c语言的一个小bug详解

不多说,说了都是累赘!直接看代码吧! 复制代码 代码如下: <SPAN style="FONT-SIZE: 14px">#include <stdio.h>int array[] = {23, 34, 12, 17, 204, 99, 16};#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))int main (void){    int d = -1, x;    if( d <= (TOTAL

Java语言中的内存泄露代码详解

Java的一个重要特性就是通过垃圾收集器(GC)自动管理内存的回收,而不需要程序员自己来释放内存.理论上Java中所有不会再被利用的对象所占用的内存,都可以被GC回收,但是Java也存在内存泄露,但它的表现与C++不同. JAVA中的内存管理 要了解Java中的内存泄露,首先就得知道Java中的内存是如何管理的. 在Java程序中,我们通常使用new为对象分配内存,而这些内存空间都在堆(Heap)上. 下面看一个示例: public class Simple { public static vo

利用 Go 语言编写一个简单的 WebSocket 推送服务

本文中代码可以在 github.com/alfred-zhong/wserver获取. 背景 最近拿到需求要在网页上展示报警信息.以往报警信息都是通过短信,微信和 App 推送给用户的,现在要让登录用户在网页端也能实时接收到报警推送. 依稀记得以前工作的时候遇到过类似的需求.因为以前的浏览器标准比较陈旧,并且那时用 Java 较多,所以那时候解决这个问题就用了 Comet4J.具体的原理就是长轮询,长链接.但现在毕竟 html5 流行开来了,IE 都被 Edge 接替了,再用以前这种技术就显得过