详解C语言之实现通讯录

目录
  • 基本思路和代码实现
  • 其他探讨
  • 总结

基本思路和代码实现

为了代码清晰易读,我们创建一个Main.c源文件用来实现代码的基本逻辑。创建一个Contact.h源文件用于封装实现功能的函数,创建Contact.h头文件用于函数的声明。

首先就是构架代码基本框架,在主函数中实现打印菜单和循环的功能 (这里为了好截图switch里的语句缩进得比较紧凑)

基本逻辑实现后开始考虑创建通讯录,通讯录里会记录人的信息。所以要先能够描述人的信息: 创建表达人的信息的结构体类型,在Contact.h中定义:

而通讯录里记录的是多人的信息,所以创建通讯录实际上就是创建上述结构体的数组。这里需要思考一个问题,在之后实现函数的功能比如增删时,怎么才能得知从哪里增加或者在什么范围内查找并删除。这就需要用到一个能表达当前通讯录有多少个人的变量。而这个变量也能够用来描述通讯录,与其把他独立定义在主函数里不如创建一个通讯录的结构体,将其定义在里面。这样一来此变量的意义更加明确,也不用每次调用函数时都要额外传递他的参数,只需传结构体就行了。创建通讯录的结构体类型,在Contact.h中定义:

创建完了之后接着进行通讯录初始化,封装一个初始化函数InitContact,再设计好其他函数名写在相应位置处:​​​​​​

然后开始具体实现函数的功能。

初始化函数InitContact

增加函数AddContact

删除函数DelContact(这里封装了一个FindName函数,其功能是找到名字相同的结构体数组元素则返回其下标,未找到则返回-1):

查找函数SeachContact

修改函数ModifyContact

打印函数ShowContact:

 FindName函数:

SortContact排列函数可以有多种不同的排列方式,这可以由自己设计。还可用qsort函数加上自己的比较函数来实现更多类型的排列,这里就不实现此函数了。再做好函数声明引好头文件,到这里通讯录的实现就完成了。

其他探讨

在设计如名字和电话住址等数组的大小时,可以使用#define定义

当之后需要修改这些数组的大小时,不用再去一个一个找到每个使用这些数组的地方进行修改,直接修改全局变量的值即可,非常方便。

在判断数字时,可以使用枚举常量将数字替换成有实际意义的词

有了枚举常量,即使代码过长,也不用在反复翻阅寻找数字所代表的意义,直接从词语含义上就能得知。增加了代码的可读性。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • C语言实现一个简易通讯录

    本文实现一个通讯录,是基于c语言的IO文件操作.数据结构里面的顺序表实现. 具体功能 实现了 1.信息的添加 2.信息的显示 3.信息的修改(修改单一属性) 4.将内存中的信息保存到文件中去 5.将文件中的信息加载到内存中(每次程序运行数据就会丢失) 6.信息的删除 7.信息的查找(按照各自的属性查找) 8.给每一条信息设置了唯一的标识id 9.通讯录的销毁 头文件中的声明 在c语言中我们采用结构体来记录每一个人的具体信息 用顺序表的数据结构来来对数据的操作 #ifndef __ADDRESSB

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

    本文实例为大家分享了C语言通讯录系统(增删改查),供大家参考,具体内容如下 全部代码如下所示: #include <iostream> #include <string> using namespace std; const int MAX = 1000; //联系人结构体 typedef struct person { string m_name; //姓名 int m_sex; //性别 1 男,0 女 int m_age; //年龄 string m_phone; //电话

  • C语言实现通讯录程序

    本文实例为大家分享了C语言实现通讯录程序的具体代码,供大家参考,具体内容如下 设计要求: 可以存放1000个人的信息,每个人的信息包括姓名.年龄.性别.电话.住址 通讯录功能包括: 1.增加联系人 2.删除指定联系人 3.查找指定联系人 4.修改指定联系人 5.显示所有联系人 6.退出通讯录 思路分析: 首先我们需要创建3个文件,分别是源文件(test.c).通讯录文件(contact.c).通讯录头文件(contact.h),其中头文件用来包含头文件.声名信息.结构体.创建全局变量以及宏. 我

  • C语言实现通讯录小项目

    本文实例为大家分享了C语言实现通讯录小项目的具体代码,供大家参考,具体内容如下 编写程序实现通讯录的基本功能,可以做到增,删,查,改,打印通讯录,等等功能 test.c #include <stdio.h> #include "contact.h" void menu() { printf("*********************************************\n"); printf("****** 1. add 2.de

  • C语言实现通讯录小功能

    本文实例为大家分享了C语言实现通讯录功能的具体代码,供大家参考,具体内容如下 头文件contact.h #pragma once #define _CRT_SECURE_NO_WARNINGS 1 //#define max 1000 #define fault 3 #define max_name 20 #define max_telephone 12 #define max_sex 5 #define max_address 30 #include<stdio.h> #include<

  • C语言实现简单通讯录功能

    本文实例为大家分享了C语言实现简单通讯录功能的具体代码,供大家参考,具体内容如下 1.存放联系人信息 2.信息:名字+年龄+性别+电话+住址 3.增加联系人 4.删除联系人 5.查找联系人 6.修改联系人 7.排序 test.c源文件代码如下: #define _CRT_SECURE_NO_WARNINGS 1 #include "contact.h" void menu() { printf("#####################################\n&

  • 详解C语言之实现通讯录

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

  • 详解C语言结构体,枚举,联合体的使用

    目录 一.匿名结构体 二.结构体的自引用 1.声明时不要自己引用自己 2.结构体重命名时不能使用重命名 三.结构体内存对齐规则 1.结构体内存计算 2.结构体嵌套 3.通过调整结构体成员顺序,压缩内存 四.存在内存对齐的原因 五.修改默认对齐数 六.结构体传参 七.位段 1.位段在内存中的存储 2.位段的跨平台问题 八.枚举 1.枚举的定义 2.枚举的优点 九.联合体(共用体) 1.联合体大小的计算 2.使用联合体判断计算机的大小端字节序 一.匿名结构体 struct { char name[2

  • 详解C语言函数返回值解析

    详解C语言函数返回值解析 程序一: int main() { int *p; int i; int*fun(void); p=fun(); for(i=0;i<3;i++) { printf("%d\n",*p); p++; } return 0; }; int* fun(void) { static int str[]={1,2,3,4,5}; int*q=str; return q; } //不能正确返回 虽然str是在动态变量区,而该动态变量是局部的,函数结束时不保留的.

  • 详解C语言 三大循环 四大跳转 和判断语句

    三大循环for while 和 do{ }while; 四大跳转 : 无条件跳转语句 go to; 跳出循环语句 break; 继续跳出循环语句 continue; 返回值语句 return 判断语句 if,if else,if else if else if...else ifelse 组合 if(0 == x) if(0 == y) error(): else{ //program code } else到底与那个if配对 C语言有这样的规定: else 始终与同一括号内最近的未匹配的if语

  • 详解C语言gets()函数与它的替代者fgets()函数

    在c语言中读取字符串有多种方法,比如scanf() 配合%s使用,但是这种方法只能获取一个单词,即遇到空格等空字符就会返回.如果要读取一行字符串,比如: I love BIT 这种情况,scanf()就无能为力了.这时我们最先想到的是用gets()读取. gets()函数从标准输入(键盘)读入一行数据,所谓读取一行,就是遇到换行符就返回.gets()函数并不读取换行符'\n',它会吧换行符替换成空字符'\0',作为c语言字符串结束的标志. gets()函数经常和puts()函数配对使用,puts

  • 详解C 语言项目中.h文件和.c文件的关系

    详解C 语言项目中.h文件和.c文件的关系 在编译器只认识.c(.cpp))文件,而不知道.h是何物的年代,那时的人们写了很多的.c(.cpp)文件,渐渐地,人们发现在很多.c(.cpp)文件中的声明语句就是相同的,但他们却不得不一个字一个字地重复地将这些内容敲入每个.c(.cpp)文件.但更为恐怖的是,当其中一个声明有变更时,就需要检查所有的.c(.cpp)文件. 于是人们将重复的部分提取出来,放在一个新文件里,然后在需要的.c(.cpp)文件中敲入#include XXXX这样的语句.这样即

  • 详解C语言用malloc函数申请二维动态数组的实例

    详解C语言用malloc函数申请二维动态数组的实例 C语言在程序运行中动态的申请及释放内存十分方便,一维数组的申请及释放比较简单. Sample one #include <stdio.h> int main() { char * p=(char *)malloc(sizeof(char)*5);//申请包含5个字符型的数组 free(p); return 0; } 是否申请二维动态内存也如此简单呢?答案是否定的.申请二维数组有一下几种方法 Sample two /* 申请一个5行3列的字符型

  • 详解易语言的程序的输入方法概念

    为了便于输入程序,易语言内置四种名称输入法:首拼.全拼.双拼.英文.三种拼音输入法均支持南方音及多音字.首拼输入法及全拼输入法在系统中被合并为"首拼及全拼输入法",系统自动判别所输入的拼音是首拼方式还是全拼方式.双拼输入法的编码规则与 Windows 系统所提供的双拼输入法一致.例如:欲输入"取整 (1.23)"语句,各种输入法的输入文本为: ・ 首拼及全拼输入法: qz(1.23) 或者 quzheng(1.23) ・ 双拼输入法: quvg(1.23) ・ 英文

  • 详解go语言 make(chan int, 1) 和 make (chan int) 的区别

    遇到golang channel 的一个问题:发现go 协程读取channel 数据 并没有按照预期进行协作执行. 经过查资料: 使用channel 操作不当导致,channel分 有缓冲区 和 无缓冲区 , 以下是两者的区别. 无缓冲区channel 用make(chan int) 创建的chan, 是无缓冲区的, send 数据到chan 时,在没有协程取出数据的情况下, 会阻塞当前协程的运行.ch <- 后面的代码就不会再运行,直到channel 的数据被接收,当前协程才会继续往下执行.

  • 详解C语言-二级指针三种内存模型

    二级指针相对于一级指针,显得更难,难在于指针和数组的混合,定义不同类型的二级指针,在使用的时候有着很大的区别 第一种内存模型char *arr[] 若有如下定义 char *arr[] = {"abc", "def", "ghi"}; 这种模型为二级指针的第一种内存模型,在理解的时候应该这样理解:定义了一个指针数组(char * []),数组的每个元素都是一个地址. 在使用的时候,若要使用中间量操作元素,那么此时中间量应该定义为 char *tm

随机推荐