当前位置: 首页 > news >正文

简单通讯录

contact.h

#pragma once#define MAX 100  //通讯录存储的人数
#define NAME_MAX 20  //联系人的名字长度
#define SEX_MAX 5  //性别的长度
#define ADDR_MAX 30  //地址的长度
#define TELE_MAX 12  //电话的长度#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>typedef struct PeoInfo
{char name[NAME_MAX];  //名字int age;  //年龄char sex[SEX_MAX];  //性别char addr[ADDR_MAX];  //地址char tele[TELE_MAX];  //电话
} PeoInfo;typedef struct Contact
{PeoInfo data[MAX]; //通讯录  数组int sz;//当前已存放的信息个数
} Contact;//初始化通讯录
void InitContact(Contact* pc);
//添加联系人
void AddContact(Contact* pc);
//删除联系人
void DelContact(Contact* pc);
//查找联系人
void SearchContact(const Contact* pc);
//修改联系人
void ModifyContact(Contact* pc);
//排序通讯录
void QsortContact(Contact* pc);
//清空通讯录
void ClearContact(Contact* pc);
//展示通讯录
void ShowContact(const Contact* pc);

contact.c

#define _CRT_SECURE_NO_WARNINGS 1#include "contact.h"void InitContact(Contact* pc)
{assert(pc);pc->sz = 0;memset(pc->data, 0, sizeof(pc->data));
}void AddContact(Contact* pc)
{assert(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].addr);printf("请输入电话:>");scanf("%s", pc->data[pc->sz].tele);pc->sz++;
}//用名字来查找联系人
int FindByName(const Contact* pc, char name[])
{int i = 0;for (i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, name) == 0){return i;}}return -1;
}void DelContact(Contact* pc)
{assert(pc);if (pc->sz == 0){printf("通讯录为空,无法删除\n");return;}char name[NAME_MAX];printf("请输入要删除的人的名字:>");scanf("%s", name);int ret = FindByName(pc, name);if (ret == -1){printf("要删除的人不存在\n");return;}int i = 0;for (i = ret; i < pc->sz - 1; i++){pc->data[i] = pc->data[i + 1];}pc->sz--;printf("删除成功\n");  
}void SearchContact(const Contact* pc)
{assert(pc);char name[NAME_MAX] = { 0 };printf("请输入要查找人的名字:>");scanf("%s", name);int pos = FindByName(pc, name);if (pos == -1){printf("要查找的人不存在\n");return;}printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].addr,pc->data[pos].tele);
}void ModifyContact(Contact* pc)
{assert(pc);char name[NAME_MAX] = { 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].addr);printf("请输入电话:>");scanf("%s", pc->data[pos].tele);printf("修改完成\n");
}//qsort中使用的比较函数
int ComparByName(const char* p1, const char* p2)
{return strcmp(p1, p2);
}
void QsortContact(Contact* pc)
{assert(pc);qsort(pc->data, pc->sz, sizeof(PeoInfo), ComparByName);printf("排序完成\n");
}void ClearContact(Contact* pc)
{assert("pc");InitContact(pc);printf("通讯录已清空\n");
}void ShowContact(const Contact* pc)
{assert(pc);int i = 0;printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");for (i = 0; i < pc->sz; i++){printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].addr,pc->data[i].tele);}
}

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("******  7. clear   0. exit    ******\n");printf("************************************\n");
}
//枚举操作,增加代码可读性
enum Option
{EXIT,ADD,DEL,SEARCH,MODIFY,SHOW,SORT,CLEAR
};
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:QsortContact(&con);break;case CLEAR:ClearContact(&con);break;case EXIT:printf("退出通讯录\n"); break;default:printf("选择错误,重新选择\n");break;}} while (input);return 0;
}
http://www.dtcms.com/a/536711.html

相关文章:

  • 有没有专门交人做美食的视频网站wordpress经典博客主题
  • 2025年mathorcup大数据竞赛B题【物流理赔风险识别及服务升级问题】原创论文分享(含完整python代码)
  • 当AI把薯片当手枪:物联网技术如何终结识别乌龙?
  • 51CTO_开源的密码自助平台Self Service Password
  • DB-GPT 0.7.4 版本更新|开源蚂蚁集团Text2SQL数据集:Falcon、支持GLM-4.5大模型
  • 网站基本维护安庆建设网站
  • 【Android Audio】安卓音频中Surround mode切换流程
  • 2026版基于python的旅游景点推荐系统
  • 直白理解 NTRU 公钥加密系统
  • 如何在物联网产品应用串行psram
  • 1.2、实战准备:AI安全研究环境搭建与工具链
  • 鞋材加工东莞网站建设山西网页制作
  • 网站建设基本流程包括哪几个步骤工装设计方案网站
  • 苏州手机网站建设报价logo设计网站平台
  • 数据驱动AI落地:交通运维与仓储管理的智能化破局方法论与技术实践
  • 多功能雷达行为辨识与预测技术研究
  • Rust面试题及详细答案120道(115-120)-- 对比其他语言
  • LeetCode算法学习之移除元素
  • allWebPlugin中间件IE特别版发布
  • 前端八股之HTTP
  • rust笔记
  • 西安招聘网站建设多多鱼网页设计代码
  • 中国团队开发出有效的钙钛矿电池缓冲液
  • 使用mybatis-plus,实现将排序时,字段值为NULL的数据排在最后
  • Websocket两台服务器之间的通信
  • 网站技能培训班有哪些做网站用什么软件ps字体
  • 摩根大通将支持比特币和以太坊作为抵押品
  • 绿园区住房和城乡建设局网站c2c平台是什么意思
  • Web前端开发:用JavaScript阻止表单提交
  • 从 TCP 粘包到线程池:一起了解用 QRunnable 重构 Qt 高并发网络通信架构