• C语言结构体应用-通讯录


    总体介绍

    本文主要介绍一个结构体的应用,我们来写一个通讯录

    总体结构:

    #define _CRT_SECURE_NO_WARNINGS 1
    #include "contact.h"
    void menu()
    {
    	printf("***1.add*****2.del*********\n");
    	printf("***3.search**4.revise******\n");
    	printf("***5.show****6.clear*******\n");
    	printf("***7.sort****0.exit********\n");
    }
    int main()
    {
    	struct Contact con;
    	Initcontact(&con);
    	int input = 0;
    	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:Revise(&con);
    			break;
    		case 5:Show(&con);
    			break;
    		case 6:Clear(&con);
    			break;
    		case 7:Sort(&con);
    			break;
    		case 0:printf("退出通讯录\n");
    			break;
    		default:printf("输入错误,请重新输入\n");
    			break;
    		}
    
    	} while (input);
    }
    

    首先我们先打印一个菜单,来显示我们通讯录的各项功能,根据想用的功能来选相应得数字。

    这是一种,是用switch语句来来实现各个功能函数的调用。

    由于各个功能函数的参数与返回值都相同,所以我们可以将他们放到一个函数指针数组当中,这样代码看起来更整洁。

    #define _CRT_SECURE_NO_WARNINGS 1
    #include "contact.h"
    void menu()
    {
    	printf("***1.add*****2.del*********\n");
    	printf("***3.search**4.revise******\n");
    	printf("***5.show****6.clear*******\n");
    	printf("***7.sort****0.exit********\n");
    }
    int main()
    {
    	struct Contact con;
    	Initcontact(&con);
    	int input = 0;
    	void(*pp[8])(struct Contact* pc) = { 0,Add ,Del ,Search ,Revise,Show,Clear ,Sort };
    	
    	do
    	{
    		menu();
    		printf("请选择:>");
    		scanf("%d", &input);
    		if (input >= 0 && input <= 8)
    		{
    			if (input == 0)
    				break;
    			pp[input](&con);
    		}
    		else
    		{
    			printf("输入错误,请重新输入\n");
    		}
    	} while (input);
    }
    

    一,数据的定义及数据初始化

    #pragma once
    #include
    #include
    #include
    struct ConInfo
    {
    	char name[20];
    	char sex[6];
    	int age;
    	char telphone[12];
    	char addre[30];
    };
    struct Contact
    {
    	struct ConInfo data[1000];
    	int sz;
    };
    void Initcontact(struct Contact* pc);
    void Add(struct Contact* pc);
    void Show(struct Contact* pc);
    void Search(struct Contact* pc);
    void Del(struct Contact* pc);
    void Revise(struct Contact* pc);
    void Clear(struct Contact* pc);
    void Sort(const struct Contact* pc);
    

    上面这是contact.h的头文件

    void Initcontact(struct Contact* pc)
    {
    	assert(pc);
    	memset(pc->data, '\0', sizeof(pc->data));
    	pc->sz = 0;
    }
    

    这是初始化数据的函数,我们在使用通讯录之前确保里面的数据都是空的。

    这里用memset函数直接将这么多字节的内容都初始化为0;
    在这里插入图片描述
    这是初始化之前。
    在这里插入图片描述
    这是初始化之后,可以看到,每个字符串都是空字符串,int型数据里放的也是0.

    二,增加联系人

    //增加通讯录的联系人
    void Add(struct Contact* pc)
    {
    	printf("姓名:>");
    	scanf("%s", (pc->data)[pc->sz].name);
    	printf("性别:>");
    	scanf("%s", (pc->data)[pc->sz].sex);
    	printf("年龄:>");
    	scanf("%d", &((pc->data)[pc->sz].age));
    	printf("电话:>");
    	scanf("%s", (pc->data)[pc->sz].telphone);
    	printf("住址:>");
    	scanf("%s", (pc->data)[pc->sz].addre);
    	pc->sz++;
    }
    

    在这里插入图片描述

    三,删除联系人

    static int Find(const struct Contact* pc, char* _name)
    {
    	int i = 0;
    	for (i = 0; i < pc->sz; i++)
    	{
    		if (strcmp(_name, pc->data[i].name) == 0)
    		{
    			return i;
    		}
    	}
    	return -1;
    }
    //删除联系人
    void Del(struct Contact* pc)
    {
    	char name1[20];
    	printf("请输入要删除联系人的姓名:>");
    	scanf("%s", name1);
    	int ret = Find(pc, name1);
    	if (ret == -1)
    	{
    		printf("通讯录中没有该联系人\n");
    	}
    	else
    	{
    		memmove((pc->data + ret), (pc->data + ret + 1),
    			sizeof(struct ConInfo) * (pc->sz - 1 - ret));
    		pc->sz--;
    		printf("成功删除联系人\n");
    	}
    }
    

    在这里插入图片描述

    在这里插入图片描述

    四,修改某个联系人

    //修改指定联系人信息
    void Revise(struct Contact* pc)
    {
    	char name2[20];
    	printf("请输入要修改的联系人姓名:>");
    	scanf("%s", name2);
    	int ret = Find(pc, name2);
    	if (ret == -1)
    	{
    		printf("通讯录中没有该联系人\n");
    	}
    	else
    	{
    		printf("姓名:>");
    		scanf("%s", (pc->data)[ret].name);
    		printf("性别:>");
    		scanf("%s", (pc->data)[ret].sex);
    		printf("年龄:>");
    		scanf("%d", &((pc->data)[ret].age));
    		printf("电话:>");
    		scanf("%s", (pc->data)[ret].telphone);
    		printf("住址:>");
    		scanf("%s", (pc->data)[ret].addre);
    		printf("修改成功\n");
    	}
    }
    

    例如我们修改lisi的年龄。
    在这里插入图片描述

    五,显示所有联系人

    //显示所有联系人的信息
    void Show(const struct Contact* pc)
    {
    	int i = 0;
    	printf(" % -20s\t % -6s\t % -5s\t % -12s\t % -30s\n",
    		"姓名", "性别", "年龄", "电话", "住址");
    	for (i = 0; i < pc->sz; i++)
    	{
    		printf(" % -20s\t % -6s\t % -5d\t % -12s\t % -30s\n",
    			pc->data[i].name, pc->data[i].sex, pc->data[i].age
    			, pc->data[i].telphone, pc->data[i].addre);
    
    	}
    }
    

    我们在展示上述功能的时候其实都已经运用了此功能。

    在这里插入图片描述

    六,删除所有联系人

    //清空通讯录
    void Clear(struct Contact* pc)
    {
    	memset(pc->data, '\0', sizeof(pc->data));
    	pc->sz = 0;
    }
    
    

    删除所有联系人,实际就是重新初始化一遍。

    七,按名字首字母排序联系人

    //按姓氏排序联系人
    int cmp_name(const void* s1, const void* s2)
    {
    	return strcmp(((struct ConInfo*)s1)->name, ((struct ConInfo*)s2)->name);
    }
    void Sort(const struct Contact* pc)
    {
    	qsort(pc->data, pc->sz, sizeof(struct ConInfo), cmp_name);
    	Show(pc);
    }
    

    在这里插入图片描述
    在这里插入图片描述

    八,查找联系人

    //查找联系人
    void Search(struct Contact* pc)
    {
    	char _name[20];
    	printf("请输入联系人的姓名:>");
    	scanf("%s", _name);
    	int ret = Find(pc, _name);
    	if (ret == -1)
    	{
    		printf("通讯录中没有该联系人\n");
    	}
    	else
    	{
    		printf(" % -20s\t % -6s\t % -5s\t % -12s\t % -30s\n",
    			"姓名", "性别", "年龄", "电话", "住址");
    		printf(" % -20s\t % -6s\t % -5d\t % -12s\t % -30s\n",
    			pc->data[ret].name, pc->data[ret].sex, pc->data[ret].age
    			, pc->data[ret].telphone, pc->data[ret].addre);
    	}
    }
    

    在这里插入图片描述

    九,代码展示

    contact.h

    #pragma once
    #include
    #include
    #include
    struct ConInfo
    {
    	char name[20];
    	char sex[6];
    	int age;
    	char telphone[12];
    	char addre[30];
    };
    struct Contact
    {
    	struct ConInfo data[1000];
    	int sz;
    };
    void Initcontact(struct Contact* pc);
    void Add(struct Contact* pc);
    void Show(struct Contact* pc);
    void Search(struct Contact* pc);
    void Del(struct Contact* pc);
    void Revise(struct Contact* pc);
    void Clear(struct Contact* pc);
    void Sort(const struct Contact* pc);
    

    contact.c

    #define _CRT_SECURE_NO_WARNINGS 1
    #define _CRT_SECURE_NO_WARNINGS 1
    #include"contact.h"
    //初始化通讯录
    void Initcontact(struct Contact* pc)
    {
    	assert(pc);
    	memset(pc->data, '\0', sizeof(pc->data));
    	pc->sz = 0;
    }
    //增加通讯录的联系人
    void Add(struct Contact* pc)
    {
    	printf("姓名:>");
    	scanf("%s", (pc->data)[pc->sz].name);
    	printf("性别:>");
    	scanf("%s", (pc->data)[pc->sz].sex);
    	printf("年龄:>");
    	scanf("%d", &((pc->data)[pc->sz].age));
    	printf("电话:>");
    	scanf("%s", (pc->data)[pc->sz].telphone);
    	printf("住址:>");
    	scanf("%s", (pc->data)[pc->sz].addre);
    	pc->sz++;
    }
    //显示所有联系人的信息
    void Show(const struct Contact* pc)
    {
    	int i = 0;
    	printf(" % -20s\t % -6s\t % -5s\t % -12s\t % -30s\n",
    		"姓名", "性别", "年龄", "电话", "住址");
    	for (i = 0; i < pc->sz; i++)
    	{
    		printf(" % -20s\t % -6s\t % -5d\t % -12s\t % -30s\n",
    			pc->data[i].name, pc->data[i].sex, pc->data[i].age
    			, pc->data[i].telphone, pc->data[i].addre);
    
    	}
    }
    static int Find(const struct Contact* pc, char* _name)
    {
    	int i = 0;
    	for (i = 0; i < pc->sz; i++)
    	{
    		if (strcmp(_name, pc->data[i].name) == 0)
    		{
    			return i;
    		}
    	}
    	return -1;
    }
    //查找联系人
    void Search(struct Contact* pc)
    {
    	char _name[20];
    	printf("请输入联系人的姓名:>");
    	scanf("%s", _name);
    	int ret = Find(pc, _name);
    	if (ret == -1)
    	{
    		printf("通讯录中没有该联系人\n");
    	}
    	else
    	{
    		printf(" % -20s\t % -6s\t % -5s\t % -12s\t % -30s\n",
    			"姓名", "性别", "年龄", "电话", "住址");
    		printf(" % -20s\t % -6s\t % -5d\t % -12s\t % -30s\n",
    			pc->data[ret].name, pc->data[ret].sex, pc->data[ret].age
    			, pc->data[ret].telphone, pc->data[ret].addre);
    	}
    }
    //删除联系人
    void Del(struct Contact* pc)
    {
    	char name1[20];
    	printf("请输入要删除联系人的姓名:>");
    	scanf("%s", name1);
    	int ret = Find(pc, name1);
    	if (ret == -1)
    	{
    		printf("通讯录中没有该联系人\n");
    	}
    	else
    	{
    		memmove((pc->data + ret), (pc->data + ret + 1),
    			sizeof(struct ConInfo) * (pc->sz - 1 - ret));
    		pc->sz--;
    		printf("成功删除联系人\n");
    	}
    }
    //修改指定联系人信息
    void Revise(struct Contact* pc)
    {
    	char name2[20];
    	printf("请输入要修改的联系人姓名:>");
    	scanf("%s", name2);
    	int ret = Find(pc, name2);
    	if (ret == -1)
    	{
    		printf("通讯录中没有该联系人\n");
    	}
    	else
    	{
    		printf("姓名:>");
    		scanf("%s", (pc->data)[ret].name);
    		printf("性别:>");
    		scanf("%s", (pc->data)[ret].sex);
    		printf("年龄:>");
    		scanf("%d", &((pc->data)[ret].age));
    		printf("电话:>");
    		scanf("%s", (pc->data)[ret].telphone);
    		printf("住址:>");
    		scanf("%s", (pc->data)[ret].addre);
    		printf("修改成功\n");
    	}
    }
    //清空通讯录
    void Clear(struct Contact* pc)
    {
    	memset(pc->data, '\0', sizeof(pc->data));
    	pc->sz = 0;
    }
    //按姓氏排序联系人
    int cmp_name(const void* s1, const void* s2)
    {
    	return strcmp(((struct ConInfo*)s1)->name, ((struct ConInfo*)s2)->name);
    }
    void Sort(const struct Contact* pc)
    {
    	qsort(pc->data, pc->sz, sizeof(struct ConInfo), cmp_name);
    	Show(pc);
    }
    

    test.c

    #define _CRT_SECURE_NO_WARNINGS 1
    #include "contact.h"
    void menu()
    {
    	printf("***1.add*****2.del*********\n");
    	printf("***3.search**4.revise******\n");
    	printf("***5.show****6.clear*******\n");
    	printf("***7.sort****0.exit********\n");
    }
    int main()
    {
    	struct Contact con;
    	Initcontact(&con);
    	int input = 0;
    	void(*pp[8])(struct Contact* pc) = { 0,Add ,Del ,Search ,Revise,Show,Clear ,Sort };
    	
    	do
    	{
    		menu();
    		printf("请选择:>");
    		scanf("%d", &input);
    		if (input >= 0&& input <= 8)
    		{
    			if (input == 0)
    				break;
    			pp[input](&con);
    		}
    		else
    		{
    			printf("输入错误,请重新输入\n");
    		}
    	} while (input);
    }
    

    在这里插入图片描述

  • 相关阅读:
    全国双非院校考研信息汇总整理 Part.1
    LINUX网络编程初探(补充中)
    postman在ubuntu下报gpu-disable
    【LeetCode热题100】--560.和为K的子数组
    基于nodejs+vue考研信息查询系统
    使用DBeaver进行mysql数据备份与恢复
    TCP的三次握手和四次挥手
    网工内推 | 运营商技术支持,数通基础扎实,最高17k
    【Verilog基础】【计算机体系架构】ITCM和ICACHE对比(面试常问)
    scratch五彩糖葫芦 电子学会图形化编程scratch等级考试三级真题和答案解析2022年6月
  • 原文地址:https://blog.csdn.net/Djsnxbjans/article/details/126961158