【C语言】通讯录1.0 (静态版)

简介: 通讯录是一种记录联系人信息的工具,包括姓名、电话号码、电子邮件地址、住址等。此通讯录是基于自定义类型的基础上进行制作,通讯录(静态版),后期会进行通讯录的更新****** 有需要源代码,见文章末尾 ******

前言

通讯录是一种记录联系人信息的工具,包括姓名、电话号码、电子邮件地址、住址等。

此通讯录是基于自定义类型的基础上进行制作,通讯录(静态版),后期会进行通讯录的更新

****** 有需要源代码,见文章末尾 ******


系列文章目录

第一篇:【C语言】通讯录1.0 (静态版)

第二篇:【C语言】通讯录2.0 (动态增长版)

第三篇:【C语言】通讯录3.0 (文件存储版


文章目录

前言

系列文章目录

一、什么是通讯录

二、静态版、动态增长版和文件存储版的区别

1. 静态版

2. 动态增长版

3. 文件存储版

三、通讯录模块组成(图文)

1. 通讯录文件构成

2. 通讯录个人信息

3. 通讯录功能模块

四、逻辑测试文件(主函数)

1. 选择菜单界面

2. 选择功能实现

3. 结构体建立联个人信息

4. 结构体建立一个通讯录

5. 初始化通讯录

五、功能函数实现

1. 添加

2. 删除

3. 查找

4. 修改

5. 显示(所有信息)

所有文件代码

1. 头文件代码

2. 函数代码

3. 测试逻辑代码

总结


一、什么是通讯录

通讯录是一种记录联系人信息的工具,包括姓名、电话号码、电子邮件地址、住址等。通讯录可以帮助人们管理自己的联系人,让人们更轻松地与他人保持联系。通讯录可以在手机、电脑、笔记本等设备上保存,也可以在云端储存和同步,方便用户随时查看和更新联系人信息。


二、静态版、动态增长版和文件存储版的区别

C语言静态版、动态增长版和文件存储版的区别如下:


1. 静态版


  1. 静态版:在程序编译时就确定了内存大小,程序运行期间内存大小不会发生变化,因此对于需要处理大量数据或者不确定数据大小的情况不适用。

2. 动态增长版


  1. 动态增长版:可以在程序运行期间根据需要动态增加内存大小,因此适用于处理不确定数据大小的情况。但是动态增长的内存需要手动释放,否则会导致内存泄漏。

3. 文件存储版


  1. 文件存储版:将数据存储在文件中,可以持久保存数据并随时读取。但是存储在文件中的数据需要进行IO操作,因此相比于内存操作来说效率较低。此外,文件存储版不适用于需要频繁修改的数据。


三、通讯录模块组成(图文)


1. 通讯录文件构成

image.png

2. 通讯录个人信息

image.png

3. 通讯录功能模块


image.png


四、逻辑测试文件(主函数)


1. 选择菜单界面

进入通讯录出现选择菜单界面

菜单效果:

image.png

代码如下:

建立一个空类型函数,进行简单的打印即可

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

2. 选择功能实现

进入菜单后,选择所需要的功能进入,用switch语句实现,用枚举类型定义[0-6] 7个数字方便后期编码方便

枚举定义数字代码:

0 EXIT,1 ADD,2 DEL,3 SEARCH,4 MODIFY,5 SHOW,6 SORT 用字母代表各case选项

enumOPTION{
EXIT,//0ADD,
DEL,
SEARCH,
MODIFY,
SHOW,
SORT};

选择代码:

input等于0的时候,do…while语句,while(input)为假,跳出循环

voidtest()
{
intinput=0;
Contactcon;
InitContact(&con);
do    {
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
        {
caseADD:
AddContact(&con);
break;
caseDEL:
DelContact(&con);
break;
caseSEARCH:
SearchContact(&con);
break;
caseMODIFY:
ModifyContact(&con);
break;
caseSHOW:
ShowContact(&con);
break;
caseSORT:
printf("功能待开发\n");
break;
caseEXIT:
printf("成功退出通讯录\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
        }
    } while (input);
}

3. 结构体建立联个人信息

这里使用结构体建立一个联系人所需要的元素信息,用typedef改名成PeoInfo方便后期编写代码

代码如下:

#define MAX 100#define NAME 10#define SEX  5#define TELE 12#define ADDR 30typedefstructPeoInfo{
charname[NAME];
intage;
charsex[SEX];
chartele[TELE];
charaddr[ADDR];
}PeoInfo;

4. 结构体建立一个通讯录

PeoInfo data[MAX]代表通讯录可以存放联系人的数量

int sz表示通讯录现在已经存入的人数数量

typedef改名成Contact方便后期编写代码

代码如下:

//建立通讯录typedefstructContact{
PeoInfodata[MAX]; //通讯录数量intsz;             //目前通讯录内的人数 }Contact;

5. 初始化通讯录

建立一个通讯录为con

InitContact函数中进行初始化,

使用内存函数对结构体各元素进行初始化

代码如下:

逻辑测试文件

Contactcon;
InitContact(&con);

头文件声明

//初始化通讯录voidInitContact(Contact*pc);

函数实现

voidInitContact(Contact*pc)
{
assert(pc);   //断言memset(pc->data, 0, sizeof(pc->data));   //内存函数  data初始化为0  pc->sz=0;
}

五、功能函数实现


1. 添加

第一步,先assert()进行断言判断pc指针

第二步,判断通讯录是否为空,为空返回

第三步,如果不为空,修改pc所指向的data

第四步,data[pc->sz].修改的元素,然后sz++,代表通讯录联系人加1

代码如下

头文件:

//增加联系人voidAddContact(Contact*pc);

函数实现:

voidAddContact(Contact*pc)
{
assert(pc);       //断言if (pc->sz==MAX)         //如果通讯录已经满了  则返回    {
printf("通讯录已满,无法添加\n");
return;
    }
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].tele);
printf("请输入地址:>");
scanf("%s", pc->data[pc->sz].addr);
pc->sz++;    //通讯录加1printf("联系人增加成功\n");
}

2. 删除

第一步,删除,需要找到相对于的名字

第二步,编写一个查找名字的函数,用来进行查找,查找到后,返回对应的下标

第三步,编写一个for循环,将返回下标后的所有元素进行向前移动

代码如下

头文件:

//删除指定联系人voidDelContact(Contact*pc);

函数实现:

staticintFindname(constContact*pc,charna[])
{
inti=0;
assert(pc&&na);
for (i=0; i<pc->sz; i++)
    {
if (strcmp(pc->data[i].name, na) ==0)
        {
returni;
        }
    }
return-1;
}
voidDelContact(Contact*pc)
{
if (pc->sz==0)
    {
printf("通讯录为空\n");
return;
    }
charname[NAME] = { 0 };
assert(pc);
//输入要查找的联系人名字printf("请输入要查找的名字:>");
scanf("%s", &name);
//找到要查找的联系人intdel=Findname(pc, name);
//删除坐标位子的联系人 ,将后面的联系人进行代替其位置if (del==-1)
    {
printf("找不到,此人不存在\n");
return;
    }
else    {
inti=0;
for (i=del; i<pc->sz; i++)
        {
pc->data[i] =pc->data[i+1];
        }
pc->sz--;
    }
printf("成功删除联系人\n");
}

3. 查找

第一步,使用查找函数进行查找,找到后返回下标

第二步,进行该下标的各元素打印

代码如下

头文件:

//查找指定联系人voidSearchContact(constContact*pc);

函数实现:

voidSearchContact(constContact*pc)
{
if (pc->sz==0)
    {
printf("通讯录为空\n");
return;
    }
charname[NAME] = { 0 };
assert(pc);
//输入要查找的联系人名字printf("请输入要查找的名字:>");
scanf("%s", &name);
//找到要查找的联系人inti=Findname(pc, name);
if (i==-1)
    {
printf("找不到,此人不存在\n");
return;
    }
else    {
printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
printf("%-10s\t%-4d\t%-5s\t%-12s\t%-30s\n",
pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].tele,
pc->data[i].addr);
    }
printf("成功找到联系人\n");
}

4. 修改

第一步,使用上面的查找函数,进行查找需要修改人的名字,返回下标

第二步,对返回的下标内元素,进行修改

代码如下

头文件:

//修改指定联系人voidModifyContact(Contact*pc);

函数实现:

voidModifyContact(Contact*pc)
{
assert(pc);
charname[NAME] = { 0 };
printf("请输入要修改人的名字:>");
scanf("%s", &name);
intmod=Findname(pc, name);
if (mod==-1)
    {
printf("找不到,不存在\n");
return;
    }
else    {
printf("请输入姓名:>");
scanf("%s", pc->data[mod].name);
printf("请输入年龄:>");
scanf("%d", &(pc->data[mod].age));
printf("请输入性别:>");
scanf("%s", pc->data[mod].sex);
printf("请输入电话:>");
scanf("%s", pc->data[mod].tele);
printf("请输入地址:>");
scanf("%s", pc->data[mod].addr);
printf("联系人修改成功\n");
    }
}

5. 显示(所有信息)

第一步,打印所有元素,编写一个for循环,打印sz所有的个数

代码如下

头文件:

//显示所有联系人的信息voidShowContact(constContact*pc);

函数实现:

voidShowContact(constContact*pc)
{
assert(pc);
printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
inti=0;
for (i=0; i<pc->sz; i++)
    {
printf("%-10s\t%-4d\t%-5s\t%-12s\t%-30s\n",
pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].tele,
pc->data[i].addr);
    }
printf("通讯录展示完毕\n");
}

六、所有文件代码


1. 头文件代码

#pragma once#include<stdio.h>#include<assert.h>#include<string.h>#define MAX 100#define NAME 10#define SEX  5#define TELE 12#define ADDR 30//使用枚举  定义选择   enumOPTION{
EXIT,//0ADD,
DEL,
SEARCH,
MODIFY,
SHOW,
SORT};
//个人信息类型声明typedefstructPeoInfo{
charname[NAME];
intage;
charsex[SEX];
chartele[TELE];
charaddr[ADDR];
}PeoInfo;
//建立通讯录typedefstructContact{
PeoInfodata[MAX]; //通讯录数量intsz;             //目前通讯录内的人数 }Contact;
//函数声明//初始化通讯录voidInitContact(Contact*pc);
//增加联系人voidAddContact(Contact*pc);
//显示所有联系人的信息voidShowContact(constContact*pc);
//删除指定联系人voidDelContact(Contact*pc);
//查找指定联系人voidSearchContact(constContact*pc);
//修改指定联系人voidModifyContact(Contact*pc);

2. 函数代码

#define _CRT_SECURE_NO_WARNINGS 1#include"addbook.h"voidInitContact(Contact*pc)
{
assert(pc);   //断言memset(pc->data, 0, sizeof(pc->data));   //内存函数  data初始化为0  pc->sz=0;
}
voidAddContact(Contact*pc)
{
assert(pc);       //断言if (pc->sz==MAX)         //如果通讯录已经满了  则返回    {
printf("通讯录已满,无法添加\n");
return;
    }
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].tele);
printf("请输入地址:>");
scanf("%s", pc->data[pc->sz].addr);
pc->sz++;    //通讯录加1printf("联系人增加成功\n");
}
//搜索名字找通讯录函数staticintFindname(constContact*pc,charna[])
{
inti=0;
assert(pc&&na);
for (i=0; i<pc->sz; i++)
    {
if (strcmp(pc->data[i].name, na) ==0)
        {
returni;
        }
    }
return-1;
}
voidDelContact(Contact*pc)
{
if (pc->sz==0)
    {
printf("通讯录为空\n");
return;
    }
charname[NAME] = { 0 };
assert(pc);
//输入要查找的联系人名字printf("请输入要查找的名字:>");
scanf("%s", &name);
//找到要查找的联系人intdel=Findname(pc, name);
//删除坐标位子的联系人 ,将后面的联系人进行代替其位置if (del==-1)
    {
printf("找不到,此人不存在\n");
return;
    }
else    {
inti=0;
for (i=del; i<pc->sz; i++)
        {
pc->data[i] =pc->data[i+1];
        }
pc->sz--;
    }
printf("成功删除联系人\n");
}
voidShowContact(constContact*pc)
{
assert(pc);
printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
inti=0;
for (i=0; i<pc->sz; i++)
    {
printf("%-10s\t%-4d\t%-5s\t%-12s\t%-30s\n",
pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].tele,
pc->data[i].addr);
    }
printf("通讯录展示完毕\n");
}
voidSearchContact(constContact*pc)
{
if (pc->sz==0)
    {
printf("通讯录为空\n");
return;
    }
charname[NAME] = { 0 };
assert(pc);
//输入要查找的联系人名字printf("请输入要查找的名字:>");
scanf("%s", &name);
//找到要查找的联系人inti=Findname(pc, name);
if (i==-1)
    {
printf("找不到,此人不存在\n");
return;
    }
else    {
printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
printf("%-10s\t%-4d\t%-5s\t%-12s\t%-30s\n",
pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].tele,
pc->data[i].addr);
    }
printf("成功找到联系人\n");
}
voidModifyContact(Contact*pc)
{
assert(pc);
charname[NAME] = { 0 };
printf("请输入要修改人的名字:>");
scanf("%s", &name);
intmod=Findname(pc, name);
if (mod==-1)
    {
printf("找不到,不存在\n");
return;
    }
else    {
printf("请输入姓名:>");
scanf("%s", pc->data[mod].name);
printf("请输入年龄:>");
scanf("%d", &(pc->data[mod].age));
printf("请输入性别:>");
scanf("%s", pc->data[mod].sex);
printf("请输入电话:>");
scanf("%s", pc->data[mod].tele);
printf("请输入地址:>");
scanf("%s", pc->data[mod].addr);
printf("联系人修改成功\n");
    }
}

3. 测试逻辑代码

#define _CRT_SECURE_NO_WARNINGS 1#include"addbook.h"voidmenu()
{
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");
}
voidtest()
{
intinput=0;
Contactcon;
InitContact(&con);
do    {
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
        {
caseADD:
AddContact(&con);
break;
caseDEL:
DelContact(&con);
break;
caseSEARCH:
SearchContact(&con);
break;
caseMODIFY:
ModifyContact(&con);
break;
caseSHOW:
ShowContact(&con);
break;
caseSORT:
printf("功能待开发\n");
break;
caseEXIT:
printf("成功退出通讯录\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
        }
    } while (input);
}
intmain()
{
test();
return0;
}

总结

本期博客,是通讯录1.0(静态版),是对前面所学知识进行复习,编写通讯录时有助于理解自定义类型的学习和了解,后期会对现在的通讯录进行更新!!!


如这篇博客对大家有帮助的话,希望 三连 支持一下 !!! 如果有错误感谢大佬的斧正 如有 其他见解发到评论区,一起学习 一起进步。

目录
相关文章
|
27天前
|
存储 C语言
探索C语言数据结构:利用顺序表完成通讯录的实现
本文介绍了如何使用C语言中的顺序表数据结构实现一个简单的通讯录,包括初始化、添加、删除、查找和保存联系人信息的操作,以及自定义结构体用于存储联系人详细信息。
18 2
|
1月前
|
存储 C语言
手把手教你用C语言实现通讯录管理系统
手把手教你用C语言实现通讯录管理系统
|
6月前
|
C语言
C语言——通讯录系统—基于 VS2022
C语言——通讯录系统—基于 VS2022
|
3月前
|
存储 搜索推荐 算法
【C语言】C语言—通讯录管理系统(源码)【独一无二】
【C语言】C语言—通讯录管理系统(源码)【独一无二】
|
3月前
|
存储 数据可视化 C语言
【C语言】C语言 手机通讯录系统的设计 (源码+数据+论文)【独一无二】
【C语言】C语言 手机通讯录系统的设计 (源码+数据+论文)【独一无二】
|
5月前
|
机器学习/深度学习 搜索推荐 程序员
C语言实现个人通讯录(功能优化)-2
C语言实现个人通讯录(功能优化)
C语言实现个人通讯录(功能优化)-2
|
5月前
|
存储 C语言 索引
C语言实现个人通讯录(功能优化)-1
C语言实现个人通讯录(功能优化)
C语言实现个人通讯录(功能优化)-1
|
5月前
|
C语言
C语言学习记录——通讯录(静态内存)
C语言学习记录——通讯录(静态内存)
32 2
|
6月前
|
存储 C语言
C语言实现通讯录
C语言实现通讯录
40 2
|
6月前
|
存储 C语言
C语言实验-动态顺序表实现简易通讯录(二)
在这个C语言实验中,你将实现一个简单的通讯录,它使用动态顺序表来存储联系人信息。
50 2