C语言——通讯录实现

一、介绍

本文只是对于结构体类型的练习。

只是简单的静态通讯录实现,没有具体的UI界面,只有一些简单的功能,同时也比较粗糙,有很多地方没有经过足够的打磨。

二、源码

本项目包含三个文件:

test.c/cpp

#include "contacts_list.h"int main()
{int status = 0;Contacts_list contacts_list;//通讯录结构体变量InitContact(&contacts_list);int res = 0;int num = 0;do{menu();//打印菜单scanf("%d", &status);system("cls");switch (status){case 1:AddContact(&contacts_list);break;case 2:DeleteContact(&contacts_list);break;case 3:char name1[21];printf("please type in the name>:");scanf("%s", name1);res = SearchContact(&contacts_list, name1);if (res != -1){printf("%d\n", res);}else{printf("cannot find\n");}break;case 4:char name2[21];printf("please type in the name>:");scanf("%s", name2);ModifyContact(&contacts_list,name2);break;case 5:DisplayContact(&contacts_list);break;case 6:printf("1.sort by name\n");printf("2.sort by age\n");scanf("%d", &num);SortContact(&contacts_list,num);break;case 0:printf("exit\n");break;default :printf("error\n");break;}} while (status);return 0;
}

contact.c/cpp

#include "contacts_list.h"void menu()
{printf("*************************************\n");printf("*****  1.add            2.del    ****\n");printf("*****  3.search         4.modify ****\n");printf("*****  5.display        6.sort   ****\n");printf("*****  0.exit                    ****\n");printf("*************************************\n");printf("please choose a option>:");
}void InitContact(Contacts_list* list)
{int i = 0;for (i = 0; i < 100; i++){list->num = 0;//将联系人个数初始化为零memset(list->data, 0, sizeof(list->data));//将数据部分初始化为0}
}void AddContact(Contacts_list* list)
{if (list->num == MAXCONTACTS){printf("there is no more space\n");//没有空间return;}printf("please type in name(maximum 20)>:");scanf("%s", list->data[list->num].name);printf("please type in gender(maximum 8)>:");scanf("%s", list->data[list->num].gender);printf("please type in age>:");scanf("%d", &(list->data[list->num].age));list->num++;printf("operating successfully\n");
}void DisplayContact(const Contacts_list* list)
{int i = 0;for (i = 0; i < list->num; i++){printf("name: %s\n", list->data[i].name);printf("gender: %s\n", list->data[i].gender);printf("age: %d\n", list->data[i].age);printf("-------------------------\n");}printf("display successfully\n");
}void DeleteContact(Contacts_list* list)
{char name[21];if (list->num == 0){printf("there is no contact can be deleted\n");//联系人为零,无需删除return;}printf("please type in the name who you want to delete>:");scanf("%s", name);int res = SearchContact(list, name);if (res != -1){int i = 0;for (i = res; i < list->num - 1; i++){list->data[i] = list->data[i + 1];}list->num--;printf("delete successfully\n");}else{printf("cannot find\n");//没找到要删除的联系人return;}
}int SearchContact(Contacts_list* list, const char* string)
{int i = 0;for (i = 0; i < list->num; i++){if (strcmp(list->data[i].name, string) == 0){return i;//查找到返回下标}}return -1;//未查找到返回-1
}void ModifyContact(Contacts_list* list, const char* string)
{int res = SearchContact(list, string);if (res == -1){printf("cannot find\n");return;}printf("please type in name(maximum 20)>:");scanf("%s", list->data[res].name);printf("please type in gender(maximum 8)>:");scanf("%s", list->data[res].gender);printf("please type in age>:");scanf("%d", &(list->data[res].age));printf("modification successfully\n");
}int cmp_by_name(const void* element1, const void* element2)
{PeopleInfo* ele1 = (PeopleInfo*)element1;//强制转换为联系人结构体类型,方便访问name变量PeopleInfo* ele2 = (PeopleInfo*)element2;return strcmp(ele1->name, ele2->name);
}int cmp_by_age(const void* element1, const void* element2)
{int res = ((PeopleInfo*)element1)->age - ((PeopleInfo*)element2)->age;return ((-res < 0) - (res < 0));
}void SortContact(Contacts_list* list, int num)
{switch (num){case 1:qsort(list->data, list->num, sizeof(list->data[0]), cmp_by_name);printf("sort successfully\n");break;case 2:qsort(list->data, list->num, sizeof(list->data[0]), cmp_by_age);printf("sort successfully\n");break;default :printf("error\n");break;}
}

contact.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAXCONTACTS 100//打印菜单函数
void menu();//声明联系人信息结构体变量
typedef struct PeopleInfo
{char name[21];char gender[9];int age;
}PeopleInfo;//声明通讯录结构体变量
typedef struct Contacts_list
{PeopleInfo data[MAXCONTACTS];//存放联系人数据int num;//记录通讯录联系人个数
}Contacts_list;//初始化函数
void InitContact(Contacts_list* list);//添加联系人
void AddContact(Contacts_list* list);//显示通讯录
void DisplayContact(const Contacts_list* list);//删除联系人
void DeleteContact(Contacts_list* list);//查找联系人
int SearchContact(Contacts_list* list, const char* string);//修改联系人
void ModifyContact(Contacts_list* list,const char* string);//排序联系人
void SortContact(Contacts_list* list, int num);//按名字排序
int cmp_by_name(const void* element1, const void* element2);//按年龄排序
int cmp_by_age(const void* element1, const void* element2);

如有错误,欢迎指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/5178.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Typora中设置文字颜色

在Typora中设置文字颜色的三种方法如下&#xff1a; 方法一&#xff1a;使用内联公式 开启使用内联公式。依次点击“文件”→“偏好设置”&#xff08;或使用快捷键Ctrl逗号&#xff09;&#xff0c;在弹出的窗口中选择“Markdown”&#xff0c;然后勾选“内联公式”&#xf…

基于docker-compose使用虚拟机搭建redis集群

代码实现 新建文件 docker-compose-redis.yml&#xff0c;复制以下代码 version: 2.2services:redis-node1:image: redis:5.0restart: alwayscommand: redis-server --port 7000 --cluster-enabled yes --cluster-config-file /data/nodes.conf --appendonly yesports:- &quo…

智能穿戴终端设备安卓主板方案_MTK平台智能手表PCBA定制开发

新移科技智能手表方案兼容WiFi、BLE、2~5G等多种通信能力。支持多个功能模块&#xff0c;包括&#xff1a;通话、计步、定位、睡眠监测、心率监测、血氧监测等。智能手表通过滑动与功能性按键提供高度直观的体验感受&#xff0c;从腕间即可掌控日常生活。形态支持定制包括&…

安全架构概述

安全架构是确保网络环境中的数据、系统和用户安全的关键组成部分&#xff0c;它涉及到多种技术和策略的综合应用。基本内容主要包括以下几个方面&#xff1a; 1. 访问控制与身份验证 &#xff1a;确保只有经过验证的用户或系统可以访问特定资源&#xff0c;常用技术包括多因素…

MySQL从入门到高级 --- 4.约束

文章目录 第四章&#xff1a;4.MySQL约束4.1 主键约束4.1.1 添加单列主键4.1.2 添加多列主键(联合主键)4.1.3 通过修改表结构添加主键4.1.4 删除主键约束4.1.5 自增长约束特点 4.1.6 指定自增字段初始值 - 创建表时指定4.1.7 指定自增字段初始值 - 创建表之后4.1.8 delete与tru…

如何配置 Prettier 配置文件,确保其中的文件 glob 模式能够正确包含 postcss.config.js 文件

如何配置 Prettier 配置文件&#xff0c;确保其中的文件 glob 模式能够正确包含 postcss.config.js 文件 要配置 Prettier 以确保其文件 glob 模式能够正确包含 postcss.config.js 文件&#xff0c;您可以按照以下步骤操作&#xff1a; 确认 Prettier 配置文件的存在&#xf…

商城数据库88张表结构(十五)

DDL 57.后台权限表 CREATE TABLE wang_privileges (privilegeId int(11) NOT NULL AUTO_INCREMENT COMMENT 自增ID,menuId int(11) NOT NULL COMMENT 父ID,privilegeCode varchar(20) NOT NULL COMMENT 权限代码,privilegeName varchar(30) NOT NULL COMMENT 权限名称,isMenu…

websocket全局封装使用

WebSocket对象的创建 WebSocket对象的关闭 启用心跳机制&#xff0c;避免断连 消息推送&#xff0c;接收到消息后进行业务逻辑处理 重连机制&#xff0c;如果断连后尝试一定次数的重连&#xff0c;超过最大次数后仍然失败则关闭连接 调用案例如下&#xff1a; const socketMana…

Vue笔记 4

内置指令 1.v-text_指令 我们学过的指令&#xff1a; ​ v-bind : 单向绑定解析表达式, 可简写为 :xxx ​ v-model : 双向数据绑定 ​ v-for : 遍历数组/对象/字符串 ​ v-on : 绑定事件监听, 可简写为 ​ v-if : 条件渲染&#xff08;动态控制节点是否存存在&#xff0…

洞察未来:数据治理中的数据架构新思维

随着大数据时代的来临&#xff0c;数据已经成为企业运营和社会发展的重要资产。然而&#xff0c;数据的复杂性和快速增长给企业带来了前所未有的挑战。在这样的背景下&#xff0c;数据治理成为了企业不可或缺的一环。数据治理不仅涉及数据的管理、安全和隐私保护&#xff0c;更…

ubuntu部署sonar与windows下使用sonar-scanner

ubuntu部署sonar与windows下使用sonar-scanner sonar部署java安装mysql安装配置sonarqube 插件安装sonar-scanner使用简单使用 sonar部署 使用的是sonarqube-7.5&#xff0c;支持的java环境是jdk8&#xff0c;且MySQL版本 >5.6 && <8.0 java安装 打开终端&…

Jackson-自定义注解及实现数据脱敏、枚举转换

Hi,大家好&#xff0c;我是抢老婆酸奶的小肥仔。 上一章&#xff0c;我们介绍了下Jackson及相关的注解&#xff0c;其实我们可以通过仿照一些注解来实现自定义以满足我们自己的业务需求&#xff0c;这一章&#xff0c;我们来说说jackson提供的自定义注解及一些应用吧。 废话不…

Virtualbox7.0.10--创建虚拟机

前言 下载Virtualbox7.0.10&#xff0c;可参考《Virtualbox–下载指定版本》 Virtualbox7.0.10具体安装步骤&#xff0c;可参考《Virtualbox7.0.10的安装步骤》 Virtualbox7.0.10创建虚拟机&#xff0c;可参考《Virtualbox7.0.10–创建虚拟机》 Virtualbox7.0.10安装Ubuntu20.0…

H.265码流解析

这一篇内容旨在对H.265码流中的一些概念做简单了解,部分概念与H.264相同,本篇中将不再重复。 1、NALU H.265(HEVC)码流的NALU结构和AVC有一些不同,属于增强版,HEVC NALU结构如下: NALU Header: Forbidden_zero_bit:1位,必须为0,如果不是则表示NALU非法;Nal_unit_t…

后端如何处理接口的重复调用

首先是&#xff0c;原理在请求接口之前&#xff0c;使用过滤器拦截数据&#xff0c;来进行判断两次数据是否一致。 1.自定义注解 2.创建一个Handler处理器 3.RepeatSubmitInterceptor的实现类 4.过滤器的配置

大型企业总分支多区域数据传输,效率为先还是安全为先?

大型企业为了业务拓展需要&#xff0c;会在全国乃至全球各地设立分公司和办事机构&#xff0c;以便更好地处理当地事务&#xff0c;并进行市场的开拓和客户维护&#xff0c;此时&#xff0c;企业内部就衍生出了新的业务需求&#xff0c;即多区域数据传输。 多区域很难准确定义&…

云容器与云中间件

云容器与中间件是两种不同的技术和服务类别&#xff0c;它们分别在云计算环境中扮演着不同的角色&#xff0c;旨在帮助企业构建、部署、管理应用程序并确保其高效、可靠地运行。下面分别介绍两者的基本概念、包含的内容以及各自的用途。 容器 基本概念&#xff1a; 在腾讯云中…

[C++][算法基础]最大不相交区间数量(贪心 + 区间问题2)

给定 &#x1d441; 个闭区间 [&#x1d44e;&#x1d456;,&#x1d44f;&#x1d456;]&#xff0c;请你在数轴上选择若干区间&#xff0c;使得选中的区间之间互不相交&#xff08;包括端点&#xff09;。 输出可选取区间的最大数量。 输入格式 第一行包含整数 &#x1d4…

Aiseesoft Data Recovery for Mac:专业数据恢复软件

Aiseesoft Data Recovery for Mac是一款高效且专业的数据恢复软件&#xff0c;专为Mac用户量身打造。 Aiseesoft Data Recovery for Mac v1.8.22激活版下载 无论是由于误删、格式化还是系统崩溃等原因导致的数据丢失&#xff0c;Aiseesoft都能帮助您快速找回。 它采用先进的扫描…

使用命令删除zip中的文件

要删除zip文件中的某个文件&#xff0c;可以使用zip工具的-d&#xff08;delete&#xff09;选项。 首先需要确保系统已安装zip程序&#xff0c;通常会预装在Linux与macOS上。在Windows系统上&#xff0c;可能要安装额外的压缩工具如7-zip&#xff0c;才能在命令行中执行这类操…