c语言实践——通讯录(1)(静态版)

这篇具有很好参考价值的文章主要介绍了c语言实践——通讯录(1)(静态版)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言

一、确定思路和框架

1.联系人的信息存储

2.通讯录的菜单设置

3.初始化通讯录

4.模块的实现

(1)传参问题

(2)实现查找函数 

(3)新增联系人

(4)删除联系人

(5)查找联系人

(6)修改联系人

(7)展示通讯录

(8)对联系人进行排序

二、代码实操

1.创建文件

2.定义

3.函数实现

4.与用户对接


前言

通讯录是我们非常熟悉的信息存储软件,能够实现增加、删除、查找、修改联系人的操作。那么它背后的运行逻辑是什么呢?接下来我们来使用c语言一探究竟。

一、确定思路和框架

1.联系人的信息存储

  • 联系人具有姓名,年龄,性别,电话,住址等信息,这些信息只与某一个人对应,所以应该对它们进行绑定,使不同的联系人具有一套完整的这些数据。而结构体可以非常好地实现这个功能。因此,创建一个PeoInfo(联系人信息)结构体
  • 而联系人的数量是非常多的,因此可以考虑用数组来存储这些结构体。由于这篇文章只讲静态版本通讯录,因此下面的实战将采用静态数组来实现。
  • 在实现增删查改这些功能的过程中,我们需要一个变量来记录数组中存储的元素个数,否则在访问时就必须访问所有的元素,对于访问大量数据来说效率是非常低的。一个数组和它的大小对应,因此可以再创建一个Contact(通讯录)结构体将这两个变量绑定。

2.通讯录的菜单设置

实现一个通讯录,需要创造一个菜单,使得用户能够实现对应的功能。

用户需要的操作主要有:

  • 1.新增联系人,
  • 2.删除联系人,
  • 3.查找联系人,
  • 4.修改联系人,
  • 5.展示通讯录,
  • 6.对联系人进行排序,
  • 7.退出通讯录。

每个数字对应一个函数,即可实现用户需求。

这里,由于操作较多,我们可以使用枚举来将不同的操作的英文名称与数字联系起来,这样代码的可读性就会高很多。

通过选择数字来进入对应的功能,很容易让我们想到switch语句。每个case语句下调用相应模块的函数即可。

如何实现循环选择和退出,可以使用do while循环,先让用户输入,再判断是否退出。

3.初始化通讯录

可以使用memset函数将联系人所有数据初始化为0。

采用赋值方式将数组大小初始化为0。

4.模块的实现

(1)传参问题

因为Contact这个类型的结构体包含了几乎所有需要进行操作的变量(内部的数组存储信息,一个整型变量判断数组大小),所以不论那个模块的操作,只需要调用Contact这个类型的结构体就行。

在传参时,我们使用传址调用,原因如下:

  • 有些函数只需要对形参进行操作即可,但有些函数内部操作是需要记忆的。
  • 结构体中数据量大,如果采用传值调用,需要再创建一个相同的临时变量,大大浪费空间

(2)实现查找函数 

有些模块,如删除、查找、修改,都需要对指定的数据进行操作,需要查找到指定数据,实现方法类似,可以用一个函数实现。

如果找到,返回数据对应的下标。如果找不到,可以返回-1。

(3)新增联系人

当用户选择新增联系人选项时,就进入相应的函数。用一个指针接收结构体的地址,实现对结构体的操作。

由于我们实现的是静态通讯录,无法扩容,因此当通讯录数据已满时,需要提醒用户并退出函数

新增联系人需要用户主动输入相应数据,再用结构体中的相应变量接收。

添加成功时,不要忘记增加Contact结构体中记录数组大小的变量的值。

(4)删除联系人

当用户输入要删除的联系人时,首先使用查找函数寻找相应的数据用一个变量接收查找函数的返回值。

如果找不到,提示用户并退出函数。

如果能找到,利用返回的下标确定数据位置,并删除。

删除可以通过将后面的数据前移并覆盖来实现。可以自己使用循环,也可以直接使用memmove函数。

删除成功时,不要忘记减少Contact结构体中记录数组大小的变量的值。

(5)查找联系人

当用户输入要查找的联系人时,首先使用查找函数寻找相应的数据用一个变量接收查找函数的返回值。

如果找不到,提示用户并退出函数。

如果能找到,利用返回的下标确定数据位置,并打印。

打印时为了使结果更美观,可以使用类似”%-5s“这种对齐方式实现整齐的界面。

打印前可以先打印一组标题,表示下面的数据类型。

查找联系人时不会改变原数据,为了防止数据被修改,使用const对参数加以修饰。

(6)修改联系人

当用户输入要查找的联系人时,首先使用查找函数寻找相应的数据用一个变量接收查找函数的返回值。

如果找不到,提示用户并退出函数。

如果能找到,用户需要主动输入相应数据,用结构体中的相应变量接收。

(7)展示通讯录

当用户选择展示通讯录时,通讯录中的数据将被打印在屏幕上。

可以使用for循环,通过数组大小确定循环次数,依次将各组数据打印出来。

打印时为了使结果更美观,可以使用类似”%-5s“这种对齐方式实现整齐的界面。

打印通讯录时不会改变原数据,为了防止数据被修改,使用const对参数加以修饰。

打印前可以先打印一组标题,表示下面的数据类型。

(8)对联系人进行排序

当用户选择排序时,排序函数自动对所有的数据进行排序。

对结构体排序,可以使用qsort函数。

可以利用作为qsort参数的比较函数实现对不同内容的排序(按名字排序,按年龄排序等)。

这篇文章只按名字排序作为范例。

以上就是我们实现通讯录的全部思路。现在让我们具体实现一下吧!

二、代码实操

1.创建文件

首先创建三个文件,分别是contact.c,test.c,contact.h

  • contact.c:实现不同模块的函数定义。
  • test.c:通过调用函数测试不同的模块。
  • contact.h:实现函数的声明和包含头文件

注意其他两个文件要包含contact.h文件才能使用其中的定义。

2.定义

对结构体、函数、以及相关的常量在contact.c文件中进行定义。

contact.c

#pragma once
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 1000
#define MAX_NAME 15
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_ADDR 5
typedef struct PeoInfo
{
	char name[MAX_NAME];
	int age;
	char sex[MAX_SEX];
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
}PeoInfo;

 typedef struct Contact
{
	PeoInfo Data[MAX];
	int size;
}Contact;

 void InitContact(Contact* pc);
 void ContactAdd(Contact* pc);
 void ShowContact(const Contact* pc);
 void ContactDel(Contact* pc);
 void ContactSearch(const Contact* pc);
 void ContactModify(Contact* pc);
 void ContactSort(Contact* pc);

为了使用和修改方便,对数组个数进行宏定义,对结构体进行重命名。

3.函数实现

在contact.c中对函数进行定义。

contact.c

#include "contact.h"

//初始化通讯录
void InitContact(Contact* pc)
{
	memset(pc, 0, sizeof(pc->Data));
	pc->size = 0;
}
//添加联系人
void ContactAdd(Contact* pc)
{
	if (pc->size == MAX)
	{
		printf("通讯录已满,无法添加联系人\n");
		return;
	}
	printf("请输入名字>:");
	scanf("%s", pc->Data[pc->size].name);
	printf("请输入年龄>:");
	scanf("%d", &pc->Data[pc->size].age);
	printf("请输入性别>:");
	scanf("%s", pc->Data[pc->size].sex);
	printf("请输入电话>:");
	scanf("%s", pc->Data[pc->size].tele);
	printf("请输入地址>:");
	scanf("%s", pc->Data[pc->size].addr);
	pc->size++;
	printf("添加成功\n");
}
//按名字查找,找到了返回下标,找不到返回-1
//这个函数是用来辅助search和show的,所以不应该被其他文件使用
static int FindByName(const Contact* pc, char name[MAX_NAME])
{
	int i = 0;
	for (i = 0; i < pc->size; i++)
	{	//如果能找到
		if (0 == strcmp(pc->Data[i].name, name))
		{
			return i;
		}
	}
	//找不到
	return -1;
}
//展示联系人
//不应该改变原数据
void ShowContact(const Contact* pc)
{
	int i = 0;
	printf("%-15s %-5s %-5s %-11s %-5s", "姓名", "年龄", "性别", "电话", "地址\n");
	for (i = 0; i < pc->size; i++)
	{
		printf("%-15s %-5d %-5s %-11s %-5s\n", pc->Data[i].name,
			pc->Data[i].age,
			pc->Data[i].sex,
			pc->Data[i].tele,
			pc->Data[i].addr);
	}

}
//删除指定联系人
void ContactDel(Contact* pc)
{
	//1.找到要删除的数据下标
	char name[MAX_NAME];
	printf("请输入要删除的名字:>");
	scanf("%s", name);
	//如果找不到,提示后直接返回
	int pos = FindByName(pc,name);//按名字查找,找到了返回下标,找不到返回-1
	if (pos == -1)
	{
		printf("找不到指定联系人\n");
		return;
	}
	//2.找到了就删除
	memmove(pc->Data + pos, pc->Data + pos + 1, (pc->size - 1 - pos)*sizeof(pc->Data[0]));
	pc->size--;
	printf("删除成功\n");
}
//查找联系人
//不应该改变原数据
void ContactSearch(const Contact * pc)
{
	char name[MAX_NAME];
	printf("请输入要查找的人的名字>:");
	scanf("%s", name);
	int pos = FindByName(pc, name);//按名字查找,找到了返回下标,找不到返回-1
	if (pos == -1)
	{
		printf("找不到要查找的人\n");
		return;
	}
	printf("%-15s %-3s %-5s %-11s %-5s", "姓名", "年龄", "性别", "电话", "地址\n");
	printf("%-15s %-3d %-5s %-11s %-5s\n", pc->Data[pos].name,
		pc->Data[pos].age,
		pc->Data[pos].sex,
		pc->Data[pos].tele,
		pc->Data[pos].addr);
}

//修改联系人
void ContactModify(Contact* pc)
{
	//1.查找
	char name[MAX_NAME];
	printf("请输入要修改的人的名字>:");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("找不到要修改的联系人\n");
		return;
	}
	//修改
	printf("请输入名字>:");
	scanf("%s", pc->Data[pos].name);
	printf("请输入年龄>:");
	scanf("%d", &pc->Data[pos].age);
	printf("请输入性别>:");
	scanf("%s", pc->Data[pos].sex);
	printf("请输入电话>:");
	scanf("%s", pc->Data[pos].tele);
	printf("请输入地址>:");
	scanf("%s", pc->Data[pos].addr);
	printf("修改成功\n");
}
//排序
int cmp_by_name(void* e1, void* e2)
{
	return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
void ContactSort(Contact* pc)
{
	qsort(pc->Data, pc->size, sizeof(PeoInfo), cmp_by_name);
	printf("排序成功\n");
}

不同的模块都在这里啦,注意查找函数是FindByName函数为了辅助这些函数实现的,所以用static取消外部链接属性,防止与外部函数冲突或被外部文件使用。

4.与用户对接

将用户选择和调用函数写进test.c文件中。

test.c

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

}
//受用枚举类型,提高可读性,比define更方便,
//define把字母替换成相应的数字,
//但是enum直接字母和数字完全相同
enum Option
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	SORT
};

int main()
{
	int input = 0;
	Contact con;//定义通讯录
	//初始化通讯录
	InitContact(&con);
	do
	{
		menu();
		printf("请选择>:");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			ContactAdd(&con);
			break;
		case DEL:
			ContactDel(&con);
			break;
		case SEARCH:
			ContactSearch(&con);
			break;
		case MODIFY:
			ContactModify(&con);
			break;
		case SHOW:
			ShowContact(&con);
			break;
		case SORT:
			ContactSort(&con);
			break;
		case EXIT:
			printf("退出通讯录\n");
			break;
		default:
			printf("选择非法,请重新选择\n");
			break;
		}

	} while (input);
	return 0;
}

实现结果比较多,所以就不向大家展示啦。你可以在自己的编译器上运行,这段代码在运行时已经非常详细的引导用户使用啦。文章来源地址https://www.toymoban.com/news/detail-424047.html

到了这里,关于c语言实践——通讯录(1)(静态版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言实现通讯录--静态版

    实现一个通讯录 ,里面存放100个人的信息,完成通讯录的基本操作功能:增删查改联系人 (1)通讯录存放100个人的信息? 创建一个数组作为通讯录,100个元素,每个元素里面存放每个人的信息,所以数组里面的每个元素应该是结构体类型。 (2)每个人的信息应该包括哪些

    2024年02月16日
    浏览(60)
  • C语言---认识动态内存管理并实现一个动态通讯录:静态通讯录别来沾边

    👧个人主页:@小沈熬夜秃头中୧⍤⃝❅ 😚小编介绍:欢迎来到我的乱七八糟小星球🌝 📋专栏:C语言学习 🔑本章内容:动态内存管理 送给各位💌:当你的能力还驾驭不了你的目标时那你就应该沉下心来历练 记得 评论📝 +点赞👍 +收藏😽 +关注💞哦~ 提示:以下是本篇

    2024年02月08日
    浏览(85)
  • 【C语言】通讯录的实现(静态版)

    本文将会用c语言实现一个通讯录的系统,并且存储若干人的信息,每个人的信息包括:姓名,性别,年龄,电话号码,住址。此通讯录系统的功能包括: 1.增加联系人 2.删除对应的联系人 3.查找联系人 4.修改联系人的信息 5.排序此通讯录 6.显示通讯录每个人的信息 。 建立菜

    2023年04月18日
    浏览(28)
  • 【C语言】——通讯录(静态-动态增长-文件储存)

      目录 前言: 一:整体框架 关于通讯录结构体的创建  二:通讯录的功能实现(静态) 2.1初始化通讯录 2.2增加联系人 2.3打印通讯录 2.4删除联系人  2.5 查找联系人 2.6修改联系人  2.7排序联系人 三:通讯录优化——动态内存  3.1通讯录的创建 3.2初始化通讯录  3.3增加联系

    2024年02月07日
    浏览(36)
  • 手机通讯录的实现——C语言(静态版本)

    目录 一:通讯录的思想 二:通讯录的实现 1.创建文件 2.打印菜单 3.创建联系人结构体 4.初始化菜单 5.实现菜单的功能 a.增加联系人 b.删除联系人 c.查找联系人 d.修改联系人 e.打印联系人 三:总结 我们将每一位联系人的姓名,性别,年龄,电话,地址来用一个结构体保存,用

    2024年02月09日
    浏览(39)
  • 静态版通讯录——C语言【详解+全部码源】

    前言: 我们用C语言实现一个可以存放100个人信息的通讯录 每个人的信息包括: 姓名、性别、年龄、住址、电话 通讯录的功能包括: 增加联系人 删除指定联系人 查找指定联系人 修改指定联系人 显示联系人信息 排序联系人(按照年龄/名字) 与我们之前的扫雷和三子棋项目

    2023年04月20日
    浏览(29)
  • C语言之通讯录的实现(静态版,动态版,文件版)

    个人主页(找往期文章包括但不限于本期文章中不懂的知识点): 我要学编程(ಥ_ಥ)-CSDN博客 目录 静态通讯录的实现逻辑  test.c:通讯录的逻辑实现 Contact.h:函数的声明与头文件的包含 Contact.c:函数的实现  通讯录源码:  test.c: Contact.c: Contect.h: 动态版通讯录  test.c: Co

    2024年04月13日
    浏览(40)
  • 【进阶C语言】静态版通讯录的实现(详细讲解+全部源码)

    前言 📕作者简介: 热爱跑步的恒川 ,正在学习C/C++、Java、Python等。 📗本文收录于 C语言进阶 系列,本专栏主要内容为数据的存储、指针的进阶、字符串和内存函数的介绍、自定义类型结构、动态内存管理、文件操作等,持续更新! 📘相关专栏Python,Java等正在发展,拭目

    2023年04月25日
    浏览(36)
  • C语言实践——通讯录(2)(动态版)

    首先感谢上一篇博客的大佬们的点赞,非常感谢!!! 目录 前言  一、需要添加的功能 1. 初始化——动态内存开辟 2.添加联系人——通讯录扩容 3.退出通讯录——通讯录销毁 二、具体操作 1.铺垫 2.修改初始化函数 3.修改添加函数  4.退出通讯录,新增销毁函数 上一篇文章我

    2023年04月08日
    浏览(32)
  • 通讯录的实现(静态入手版)

    🍉博客主页:阿博历练记 📖文章专栏:c语言(初阶与进阶) 🎁代码仓库:阿博编程日记 🌹欢迎关注:欢迎友友们点赞收藏+关注哦 在生活中,我们可以通过通讯录快速实现对一位好友的查找,便捷了我们的日常生活,今天阿博就带领友友们一起探索通讯录的实现🙈🙈🙈

    2024年02月02日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包