用c语言实现一个通讯录

我们创建三个区域

介绍一下qsort函数:

contact.h

#pragma once
//类型的声明
//人的信息
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 100
#define MAX_NAME 10
#define MAX_SEX 10
#define MAX_ADDR 20typedef struct PeoInfo
{char name[MAX_NAME];int age;char sex[MAX_SEX];char addr[MAX_ADDR];
}PeoInfo;
//分装一个通讯录
typedef struct Contact
{PeoInfo data[MAX];//存放人的信息int count ;//count记录当前通讯录中人的个数
}Contact;
void InitContact(Contact* pc);//初始化通讯录,参数就是结构体指针
void AddContact(Contact* pc);
void ShowContact(const Contact* pc);
void DelContact(Contact* pc);//删除指定联系人
void SearchContact(Contact* pc);//查找指定联系人
void ModifyContact(Contact* pc);
void SortContact(Contact* pc);//排序通讯录中的内容

test.c

# define _CRT_SECURE_NO_WARNINGS 
#include"contact.h"
#include<stdio.h>
#include "contact.h"
void menu()
{printf("***********************************\n");printf("****1.add    2.delete  ************\n");printf("****3.search 4.modify    **********\n");printf("****5show   6.sort     ************\n");printf("********0.exit         ************\n");}
int main()
{int input = 0;Contact con;//通讯录InitContact(&con);//结构体传参,尽量传地址,这样效率更高,如果还要改变con,一定要把地址传入才可以//尽量分 装函数,分模块来完成,并且有的时候用大括号初始化不方便do {menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:AddContact(&con);//增加联系人的信息也要修改通讯录的内容break;case 2:DelContact(&con);break;case 3:SearchContact(&con);break;case 4:ModifyContact(&con);break;case 5:ShowContact(&con);break;case 6:SortContact(&con);break;case 0:printf("退出通讯录\n");break;default:printf("选择错误\n");break;}} while (1);return 0;
}

 contact.c

# define _CRT_SECURE_NO_WARNINGS 
#include"contact.h"
#include<assert.h>
void InitContact(Contact* pc)
{assert(pc);pc->count = 0;//通讯录创建好一个信息都不能有memset(pc->data, 0, sizeof(pc->data));//如果不用memset,还得用循环}
void AddContact(Contact* pc)
{assert(pc);if (pc->count == MAX) {printf("通讯录已经满了,不能增加\n");}printf("请输入名字");scanf("%s", pc->data[pc->count].name);//name是个数组,不用取地址printf("请输入年龄\n");scanf("%s",&( pc->data[pc->count].age));//age是个整型变量,需要进行取地址printf("请输入性别\n");scanf("%s", pc->data[pc->count].sex);printf("请输入地址\n");scanf("%s", pc->data[pc->count].addr);pc->count++;printf("增加成功\n");
}
void ShowContact(Contact* pc)
{assert(pc);int i = 0;printf("%20s\t%3d\t%12s\t%30s\n","名字","年龄","性别","地址");for (i = 0; i < pc->count; i++) {printf("%20s\t%3d\t%12s\t%30s\n", pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].addr);}
}
static int FindByName(Contact* pc, char name)//加上static只能在.c文件内部看到
{assert(pc);int i = 0;for (i = 0; i < pc->count; i++) {if (strcmp(pc->data[i].name, name) == 0) {return i;}}return -1;
}
void DelContact(Contact* pc)
{char name[MAX_NAME] = { 0 };assert(pc);if (pc->count == 0) {printf("通讯录为空,没有元素可以删除\n");}printf("请输入要删除人的名字\n");scanf("%s", name);//先查找,后删除,所以我们分装一个查找函数int pos = FindByName(pc, name);//在pc指向的通讯录里寻找nameif (pos == -1)//删除只需要将后面的元素往前覆盖{printf("要删除的联系人不存在\n");return;}for (int i = pos; i < pc->count-1; i++)//如果是count,会越界{pc->data[i] = pc->data[i + 1];}pc->count--;//count变成99,最后一个元素也访问不到printf("删除成功\n");}
void SearchContact(Contact* pc)
{char name[MAX_NAME] = { 0 };printf("请输入要查找人的名字\n");scanf("%s", name);int pos = FindByName(pc, name);//在pc指向的通讯录里寻找nameif (pos == -1)//删除只需要将后面的元素往前覆盖{printf("要删除的联系人不存在\n");return;}else printf("%20s\t%3d\t%12s\t%30s\n", "名字", "年龄", "性别", "地址");for (int i = 0; i < pc->count; i++) {printf("%20s\t%3d\t%12s\t%30s\n", pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].addr);}
}
void ModifyContact(Contact* pc)
{char name[MAX_NAME] = { 0 };printf("请输入要修改人的名字\n");scanf("%s", name);int pos = FindByName(pc, name);//在pc指向的通讯录里寻找nameif (pos == -1){printf("要修改的联系人不存在\n");return;}//重新录入一遍printf("要修改的人的信息已经查找到,现在开始修改\n");printf("请输入名字");scanf("%s", pc->data[pos].name);//name是个数组,不用取地址printf("请输入年龄\n");scanf("%s", &(pc->data[pos].age));//age是个整型变量,需要进行取地址printf("请输入性别\n");scanf("%s", pc->data[pos].sex);printf("请输入地址\n");scanf("%s", pc->data[pos].addr);printf("修改成功\n");
}
int cmp_peo_by_name(const void* e1, const void* e2)//e1和e2就是要比较的两个元素
{return (((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
void SortContact(Contact* pc)//按照名字来排序{assert(pc);qsort(pc->data, pc->count, sizeof(PeoInfo), cmp_peo_by_name);printf("排序成功\n");}

运行一下,看看是否能够正常运行:

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

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

相关文章

Java中 IO 流分为几种,什么时候用,怎么用

Java中 IO 流分为几种&#xff0c;什么时候用&#xff0c;怎么用 亲爱的朋友&#xff0c; 在这美好的时刻&#xff0c;愿你收获满满的幸福与喜悦。愿生活的每一天都充满温馨和笑声&#xff0c;愿你在每一个梦想的追逐中都能找到成就和满足。 愿你的心中充满爱和宽容&#xff0c…

【BIAI】Lecture 12 - Emotion in Brain AI

Emotion in Brain & AI 专业术语 Limbic system 边缘系统 Amygdala 杏仁核 temporal lobe 颞叶 hippocampus 海马体 Central Nucleus 中央核 medial amygdala 内侧杏仁核 ventral periaqueductal gray 腹侧中脑导水管周围灰质 课程大纲 What is emotion 当大脑检测到某些具…

OpenGL 入门(九)—Material(材质)和 光照贴图

文章目录 材质设置材质光的属性脚本实现 光照贴图漫反射贴图高光反射贴图 材质 材质本质是一个数据集&#xff0c;主要功能就是给渲染器提供数据和光照算法。 如果我们想要在OpenGL中模拟多种类型的物体&#xff0c;我们必须针对每种表面定义不同的材质(Material)属性。 我们…

【保姆级教程|YOLOv8改进】【5】精度与速度双提升,使用FasterNet替换主干网络

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

unity 增加系统时间显示、FPS帧率、ms延迟

代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;using UnityEngine;public class Frame : MonoBehaviour {// 记录帧数private int _frame;// 上一次计算帧率的时间private float _lastTime;// 平…

Redis(三)主从架构、Redis哨兵架构、Redis集群方案对比、Redis高可用集群搭建、Redis高可用集群之水平扩展

转自 极客时间 Redis主从架构 redis主从架构搭建&#xff0c;配置从节点步骤&#xff1a; 1、复制一份redis.conf文件2、将相关配置修改为如下值&#xff1a; port 6380 pidfile /var/run/redis_6380.pid # 把pid进程号写入pidfile配置的文件 logfile "6380.log" …

【大数据】Flink 中的 Slot、Task、Subtask、并行度

Flink 中的 Slot、Task、Subtask、并行度 1.并行度2.Task 与线程3.算子链与 slot 共享资源组4.Task slots 与系统资源5.总结 我们在使用 Flink 时&#xff0c;经常会听到 task&#xff0c;slot&#xff0c;线程 以及 并行度 这几个概念&#xff0c;对于初学者来说&#xff0c;这…

canvas缩放坐标系(scale)

查看专栏目录 canvas实例应用100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

GaussDB HCS 轻量化部署软件下载指引

一、Support 账号准备 1. 账号说明 华为的软件服务在华为support网站发布&#xff0c;注册该账号后&#xff0c;可以申请软件、下载离线文档&#xff0c;查看技术案例等功能 2. 账号注册 步骤 1&#xff1a;点击如下官方链接 华为运营商技术支持 - 华为 步骤 2&#xff1…

「深度学习」门控循环单元GRU

一、梯度消失问题 梯度消失&#xff1a; 基础的 RNN 模型不善于处理长期依赖关系&#xff0c;有很多局部影响&#xff0c;很难调整自己前面的计算。y^{<i>} 仅仅受自己附近的值影响。 解决方法&#xff1a;GRU 或 LSTM 梯度爆炸&#xff1a; 反向传播时&#xff0c;随着…

鸿蒙开发系列教程(十四)--组件导航:Tabs 导航

Tabs 导航 Tabs组件的页面组成包含两个部分&#xff0c;分别是TabContent和TabBar。TabContent是内容页&#xff0c;TabBar是导航页签栏 每一个TabContent对应的内容需要有一个页签&#xff0c;可以通过TabContent的tabBar属性进行配置 设置多个内容时&#xff0c;需在Tabs…

【力扣】无重复字符的最长子串,滑动窗口+哈希集合+优化

无重复字符的最长子串原题地址 方法一&#xff1a;滑动窗口 考虑用2个指针来维护子串&#xff0c;使得这条子串没有重复字符。 i和j表示下标&#xff0c;[i,j]表示子串&#xff0c;长度为j-i1。我们可以用i遍历字符串的所有字符&#xff0c;对于每一个i&#xff0c;都尽可能…