C语言写电话通讯录

news/2024/11/16 23:35:29/

首先,书写一个东西要清楚框架和需求

1.通讯录中能够存储1000个人的信息
每个人的信息包括:
 名字 + 性别 + 年龄 + 电话 + 地址
 2.增加人的信息
 3.删除人的信息
 4.修改人的信息
 5.查找指定人的信息

在这里,创建 头文件contact.h  源文件contact.c      源文件text.c  创建三个文件来写而不放在一个文件来写是为了简洁干净,容易让人看的明白

头文件用来创建已知库函数的内容实现和定义一些数值和定义自定义函数

源文件contact.c用来具体阐述自定义函数的实现

源文件text.c用来测试通讯录的实现

#define _CRT_SECURE_NO_WARNINGS
#define MAX_NAME 20
#define MAX_SEX  20
#define MAX_TELE 12
#define MAX_ADDR 20          //在这里定义数是因为以后需要修改数据只需要修改这里的就可以
#define MAX 1000             //不用一个个修改
#include<string.h>
#include<stdio.h>
#define _CRT_SECURE_NO_WARNINGS//类型的定义
typedef struct peopleInfo
{char name[MAX_NAME];char sex[MAX_SEX];int age;char tele[MAX_TELE];char addr[MAX_ADDR];
}peopleInfo;//创建通讯录---静态版本
typedef struct peoplesum
{peopleInfo data[MAX];  //存入库中总人数int sz;  //当前存入库中的人数
}contact;void Initcontact(contact* pc);void Addcontact(contact* pc);  //添加函数的自定义void Printcontact(contact* pc);  //打印函数的自定义void Delcontact(contact* pc);  //删除函数的自定义void Searchcontact(contact* pc);  //搜索函数的自定义void Modifycontact(contact* pc);  //修改函数的自定义

以上是库函数contact.h的全部内容

#include"contact.h"
#define _CRT_SECURE_NO_WARNINGSvoid Initcontact(contact* pc)
{pc->sz = 0;memset(pc->data, 0, sizeof(pc->data); //此处初始化 peopleInfo,用到memset(起始地址,初始化的内容,初始化多少个字节)contact con ={0}在这里也可以,但是有些复杂情况不可以
}               //为什么用pc->data,是因为 pc是一个变量,不直接用data是因为需要指明谁的data数组void Addcontact(contact* pc)
{if (pc->sz == MAX)  {printf("空间已满,无法添加");}else{//添加信息 添加的信息放在szprintf("请输入名字:");scanf("%s\n", pc->data[pc->sz].name);  //[pc->sz] 是指下标,前面没有&是因为name为数组printf("请输入年龄:");scanf("%d\n", &pc->data[pc->sz].age);printf("请输入性别:");scanf("%s\n", pc->data[pc->sz].sex);printf("请输入电话:");scanf("%s\n", pc->data[pc->sz].tele);printf("请输入地址:");scanf("%s\n", pc->data[pc->sz].addr);pc->sz++;printf("完成");}
}void Printcontact(contact * pc)
{int i = 0;//打印标题printf(" % -20s\t % -5s\t %-5s\t % -10s\t % -10s\n", "名字","年龄","性别","电话", "地址");//打印数据printf("%-20s\t %-5s\t %-5s\t %-10s\t %-10s\n",pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
}int Findbyname(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)
{char name[MAX_NAME] = { 0 };if (pc->sz == 0){printf("空间为空,无法删除");}printf("请输入要删除的人的名字:");scanf("s", name);//查询到要删除的人,假如没有int pos = Findbyname(pc, name);if (pos == -1){printf("要删除的人不存在\n");}//假如有int j = 0;for (j = pos; j < pc->sz - 1; j++  )  //为什么要-1,若1=10时候,i=1就是第11个{pc->data[j] = pc->data[j + 1];}pc->sz--;  //若要是删除最后一个数据不就不会进入循环了吗?不会进入循环的话sz--,则会减掉一个数据,而减掉的数据则是最后一个printf("删除成功");
}void Searchcontact(contact* pc)
{char name[MAX_NAME] = { 0 };printf("请输入要删除的人的名字:");scanf("s", name);//查询到要查找的人,假如没有int pos = Findbyname(pc, name);if (pos == -1){printf("要查找的人不存在\n");}else{printf(" % -20s\t % -5s\t %-5s\t % -10s\t % -10s\n", "名字","年龄","性别","电话","地址");printf("%-20s\t %-5s\t %-5s\t %-10s\t %-10s\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 };if (pc->sz == 0){printf("空,无法修改");}printf("请输入要修改的人的名字:");scanf("s", name);//查询到要修改的人,假如没有int pos = Findbyname(pc, name);if (pos == -1){printf("要删除的人不存在\n");}//有else{printf("请输入名字:");scanf("%s\n", pc->data[pc->sz].name);  //[pc->sz] 是指下标,前面没有&是因为name为数组printf("请输入年龄:");scanf("%d\n", &pc->data[pc->sz].age);printf("请输入性别:");scanf("%s\n", pc->data[pc->sz].sex);printf("请输入电话:");scanf("%s\n", pc->data[pc->sz].tele);printf("请输入地址:");scanf("%s\n", pc->data[pc->sz].addr);}
}

以上是源文件contact.c的内容,因为是对自定义函数的实现,而自定义函数的创建是头文件创建的,所以在文件开头要包含上头文件#include"contact.h"

#define _CRT_SECURE_NO_WARNINGS
#include"shuxie.h"
//1.通讯录中能够存储1000个人的信息
//每个人的信息包括:
// 名字 + 性别 + 年龄 + 电话 + 地址
// 2.增加人的信息
// 3.删除人的信息
// 4.修改人的信息
// 5.查找指定人的信息int main()
{enum opintion{ADD,DEL,SEARCH,MODIFY,PRINT,EXIT,};int input = 0;//通讯录创建  contact con;  //通讯录//初始化通讯录InitContact(&con);  //为什么不能传con, 1)传值是不能修改内容的,万一以后需要修改值就不能修改了 2)占内存太大do{scanf("%d\n", &input);switch (input){case ADD://完成添加操作Addcontact(&con);break;case DEL://删除Delcontact(&con);break;case SEARCH://Searchcontact(&con);break;case MODIFY://Modifycontact(&con);break;case PRINT://Printcontact(&con);  //虽然不用修改但是占内存break;case EXIT://printf("推出通讯录");default://printf("输入错误");}} while (input);
return 0;
}

同理,也要包含头文件contact.h,以上是text.c的全部内容

以上是静态版本下的通讯录代码,动态下不太熟练,等熟练后再进行完善。


http://www.ppmy.cn/news/701140.html

相关文章

C++电话通讯录_黑马

任务 添加联系人&#xff1a;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;联系电话&#xff0c;家庭住址&#xff08;上限1K&#xff09; 显示 删除&#xff08;按照姓名 查找&#xff08;按照姓名 修改&#xff08;按照姓名 清空全部 退出sys 效果&#xff1a; Code&am…

通讯录_通讯录拦截防爆

为了通讯录所谓的面子强撑 很多朋友因为其他原因借了714高炮或者其他网贷口子&#xff0c;一直在循环使用&#xff0c;每月给的利息就是工资的一半或更多&#xff0c;导致快到强制的边缘 每个人的家庭环境又不一样&#xff0c;想强制又因为怕催收骚扰到家人一直在苦苦强撑&…

插入排序——希尔排序

希尔排序其实就是一种插入排序&#xff0c;实际上就是通过直接插入排序一步步改进优化而实现的。所以在了解希尔排序之前要明白插入排序的实现原理。 插入排序 其实我觉得插入排序也可以叫做摸牌排序&#xff0c;就是从第二张牌开始处理&#xff0c;将摸到的牌按照合适的顺序插…

浅谈智能照明系统发展及在工程中的应用

安科瑞 华楠 &#xff3b;摘 要&#xff3d;长久以来&#xff0c;智能照明系统在国内未被得到重视&#xff0c;多数建筑物仍用传统方式来控制的灯光照明&#xff0c;一些智能建筑使用楼宇自动化&#xff08;ba&#xff09;系统监控照明&#xff0c;但只能实现简单的区域照明和…

抓取高德地图位置信息及预览图片,生成excel文件小白教程

本人也是小白初学者&#xff0c;所以教程很小白&#xff0c;有不对的地方请指正&#xff0c;谢谢。 抓取步骤 1.申请高德地图API 2.新建excel文件 3.获取网页源代码 4.分析代码&#xff0c;找到需要抓取的内容位置特点&#xff0c;抓取内容 5.将抓取到的内容插入到文件中&…

批量提取PDF和图片发票信息 2.2

人工录入发票信息真的好烦&#xff0c;有什么软件可以快速解决这个问题吗&#xff1f;​ 那天看到这个问题后&#xff0c;自己写了一个批量提取发票信息的小软件&#xff0c;打开软件之后&#xff0c;选择大量发票文件所在的文件夹就可以了&#xff0c;会自动把发票识别的结果…

免费物流跟踪轨迹订阅接口技术文档-快递鸟

物流跟踪由轨迹订阅接口和轨迹推送接口组成&#xff0c;对接时需要对接以下二个接口 1.轨迹订阅接口 1.1 功能说明 快递鸟物流轨迹订阅接口用于向快递鸟订阅物流轨迹信息。将订单内容通过订阅接口订阅到快递鸟&#xff0c;客户可自动获取运单的轨迹节点信息。 免费试用接口&…

Thinkphp企业级知宇自动发卡系统源码bug漏洞分析和修复

导读&#xff1a; 网上90%以上的自动发卡平台都是使用知宇自动发卡系统&#xff0c;这个系统功能强大、业务完善&#xff0c;是个很不错的程序。知宇自动发卡系统使用Thinkphp5.0内核开发的&#xff0c;是一个完全开源的项目&#xff0c;这套系统在网上早已泛滥&#xff0c;泛…