温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C语言静态版通讯录怎么实现

发布时间:2023-04-19 11:27:03 来源:亿速云 阅读:77 作者:iii 栏目:开发技术

这篇文章主要介绍“C语言静态版通讯录怎么实现”,在日常操作中,相信很多人在C语言静态版通讯录怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言静态版通讯录怎么实现”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    1. 配置运行环境

    本通讯录运用到了三个文件

    test.c //测试通讯录的相关功能

    contact.h //声明

    contact.c //通讯录的实现模块

    2. 通讯录的实现

    想要做通讯录,首要任务就是要把模块想好。

    先打印一个通讯录的界面菜单

    void menu()
    {
    	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.1 通讯录的功能目录

    通讯录的功能有7种:

    • 增加联系人

    • 删除指定联系人

    • 查找联系人

    • 修改联系人的信息

    • 对联系人的排序

    • 显示联系人的信息

    • 退出通讯录

    创建人的信息的结构体类型

    第一步是封装一个人的信息的结构体类型

    由于封装的结构体类型的名字太长,总是写的话感觉太麻烦了

    对 struct PeoInfo进行了typdef类型重命名

    struct PeoInfp 改成 PeoInfp

    //表示一个人的信息
    typedef struct PeoInfo
    {
    	char name[20];
    	int age;
    	char sex[5];
    	char tele[12];
    	char addr[30];
    }PeoInfo;

    以上的数值如果以后会经常用到的话,可以用#define 来定义,方便以后修改

    #define MAX 100
    #define MAX_NAME 20
    #define MAX_SEX 5
    #define MAX_TELE 12
    #define MAX_ADDR 30

    2.2 增加信息功能代码的实现

    //增加通讯录信息
    void AddContact(Contact* pc)
    {
    	if (DATA_MAX == pc->sz)
    	{
    		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);
    	printf("信息添加成功!\n");
    	pc->sz++;
    }

    2.3 显示信息功能代码的实现

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

    2.4 删除信息功能代码的实现

    void DelContact(pContact pc)
    {
    	char name[MAX_NAME] = { 0 };
    	if (pc->sz == 0)
    	{
    		printf("通讯录为空,无法删除\n");
    		return;
    	}
    	//删除
    	//1. 找到要删除的人 - 位置(下标)
    	printf("输入要删除人的名字:>");
    	scanf("%s", name);
    	int pos = FindByName(pc, name);
    	if (pos == -1)
    	{
    		printf("要删除的人不存在\n");
    		return;
    	}
    	int i = 0;
    	//2. 删除 - 删除pos位置上的数据
    	for (i = pos; i<pc->sz-1; i++)
    	{
    		pc->data[i] = pc->data[i + 1];
    	}
    	pc->sz--;
    	printf("删除成功\n");
    }

    2.5 查询信息功能代码的实现

    void SearchContact(const Contact* pc)
    {
    	char name[MAX_NAME] = {0};
    	printf("请输入要查找人的名字:>");
    	scanf("%s", name);
    	//查找
    	int pos = FindByName(pc, name);
    	if (pos == -1)
    	{
    		printf("要查找的人不存在\n");
    		return;
    	}
    	//打印
    	printf("%-10s %-4s %-5s %-12s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");
    	//打印数据
    	printf("%-10s %-4d %-5s %-12s %-30s\n",
    		pc->data[pos].name,
    		pc->data[pos].age,
    		pc->data[pos].sex,
    		pc->data[pos].tele,
    		pc->data[pos].addr);
    }

    2.6 修改信息功能代码的实现

    void ModifyContact(Contact* pc)
    {
    	char name[MAX_NAME] = {0};
    	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");
    }

    2.7 按名字排序信息功能代码的实现

    //按照名字来排序
    int cmp_by_name(const void* e1, const void* e2)
    {
    	return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
    }
    void SortContact(Contact* pc)
    {
    	qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_by_name);
    	printf("排序成功\n");
    }

    3. 完整静态版本通讯录的全部源码

    3.1 contact.c

    #define _CRT_SECURE_NO_WARNINGS 1
    #include "contact.h"
    void InitContact(Contact* pc)
    {
    	pc->sz = 0;
    	memset(pc->data, 0, sizeof(pc->data));
    }
    void AddContact(Contact* 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++;
    	printf("添加成功\n");
    }
    void ShowContact(const Contact* pc)
    {
    	int i = 0;
    	//姓名      年龄      性别     电话      地址
    	//hengchuan 20        男      123456    北京
    	//
    	//打印标题
    	printf("%-10s %-4s %-5s %-12s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");
    	//打印数据
    	for (i = 0; i < pc->sz; i++)
    	{
    		printf("%-10s %-4d %-5s %-12s %-30s\n",
    			pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
    	}
    }
    static int FindByName(const 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 DelContact(pContact pc)
    {
    	char name[MAX_NAME] = { 0 };
    	if (pc->sz == 0)
    	{
    		printf("通讯录为空,无法删除\n");
    		return;
    	}
    	//删除
    	//1. 找到要删除的人 - 位置(下标)
    	printf("输入要删除人的名字:>");
    	scanf("%s", name);
    	int pos = FindByName(pc, name);
    	if (pos == -1)
    	{
    		printf("要删除的人不存在\n");
    		return;
    	}
    	int i = 0;
    	//2. 删除 - 删除pos位置上的数据
    	for (i = pos; i < pc->sz - 1; i++)
    	{
    		pc->data[i] = pc->data[i + 1];
    	}
    	pc->sz--;
    	printf("删除成功\n");
    }
    void SearchContact(const Contact* pc)
    {
    	char name[MAX_NAME] = { 0 };
    	printf("请输入要查找人的名字:>");
    	scanf("%s", name);
    	//查找
    	int pos = FindByName(pc, name);
    	if (pos == -1)
    	{
    		printf("要查找的人不存在\n");
    		return;
    	}
    	//打印
    	printf("%-10s %-4s %-5s %-12s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");
    	//打印数据
    	printf("%-10s %-4d %-5s %-12s %-30s\n",
    		pc->data[pos].name,
    		pc->data[pos].age,
    		pc->data[pos].sex,
    		pc->data[pos].tele,
    		pc->data[pos].addr);
    }
    void ModifyContact(Contact* pc)
    {
    	char name[MAX_NAME] = { 0 };
    	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(const void* e1, const void* e2)
    {
    	return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
    }
    void SortContact(Contact* pc)
    {
    	qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_by_name);
    	printf("排序成功\n");
    }

    3.2 contact.h

    #pragma once
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <errno.h>
    #define MAX 100
    #define MAX_NAME 20
    #define MAX_SEX 5
    #define MAX_TELE 12
    #define MAX_ADDR 30
    //表示一个人的信息
    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 sz;//记录通讯录中的有效信息个数
    }Contact, *pContact;
    //初始化通讯录
    void InitContact(Contact* pc);
    //增加指定联系人
    void AddContact(Contact* pc);
    //显示联系人信息
    void ShowContact(const Contact* pc);
    //删除指定联系人
    //void DelContact(Contact* pc);
    void DelContact(pContact pc);
    //查找指定联系人
    void SearchContact(const Contact* pc);
    //修改通讯录
    void ModifyContact(Contact* pc);
    //排序通讯录元素
    void SortContact(Contact* pc);

    3.3 test.c

    #define _CRT_SECURE_NO_WARNINGS 1
    #include "contact.h"
    void menu()
    {
    	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");
    }
    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:
    			AddContact(&con);
    			break;
    		case DEL:
    			DelContact(&con);
    			break;
    		case SEARCH:
    			SearchContact(&con);
    			break;
    		case MODIFY:
    			ModifyContact(&con);
    			break;
    		case SHOW:
    			ShowContact(&con);
    			break;
    		case SORT:
    			SortContact(&con);
    			break;
    		case EXIT:
    			printf("退出通讯录\n");
    			break;
    		default:
    			printf("选择错误\n");
    			break;
    		}
    	} while (input);
    	return 0;
    }

    4. 静态版本通讯录的缺点

    缺点:

    通讯录的大小是固定的 - 100个元素当通讯录退出后,重新运行,之前的信息都丢了

    当前通讯录中的信息都是保存在内存中的,程序退出,内存就回收了,下一次重新运行程序,内存重新分配,之前的数据就不见了

    到此,关于“C语言静态版通讯录怎么实现”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI