目录

contact.h头文件

contact.c源文件

main.c源文件


项目分析:

  • 通讯录项目需要用到的顺序表的数据结构,每个元素为一个联系人信息结构体
  • 通讯录功能有新增、删除、查找、修改、排序、打印、清空
  • 通讯录还要有读档和存档的功能,用文件的读写
  • 新增数据要考虑顺序容量问题,若满则扩
  • 删除数据要先找到数据,再从要删除数据的位置,循环将后面的数据前移覆盖
  • 查找数据用strstr比strcmp更好,这样能实现模糊查找
  • 排序用qsort函数,可以按照联系人姓名或者联系人电话号码进行排序

contact.h头文件

外部头文件包含:

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
#include <Windows.h>
#include <string.h>

数据结构:

#define CAPACITY 4    //顺序表初始容量typedef struct PeoInfo
{char name[10];char phone[12];
}Peo;typedef struct Contact
{Peo* data;int size;int capacity;
}Con;

函数声明:

void Init(Con* con);    //初始化
void Add(Con* con);     //添加
void Del(Con* con);     //删除
void Find(Con* con);    //查找
void Mod(Con* con);     //修改
void Sort(Con* con);    //排序
void Print(Con* con);   //打印
void Destory(Con* con); //清空
void Load(Con* con);    //加载信息
void Save(Con* con);    //保存信息

contact.c源文件

void Init(Con* con) 初始化

#include "contact.h"void Init(Con* con)
{assert(con);con->data = (Peo*)malloc(sizeof(Peo) * CAPACITY);if (con->data == NULL) {perror("init::malloc");exit(1);}con->size = 0;con->capacity = CAPACITY;Load(con);    //读档
}

void Add(Con* con)

void Del(Con* con) 数据增删

用临时变量结构体指针进行扩容,增加安全性

bool Empty(Con* con)
{assert(con);return con->size == 0;
}    //判空void Check(Con* con)
{assert(con);if (con->size == con->capacity) {Peo* tmp = (Peo*)realloc(con->data, sizeof(Peo) * (con->size + CAPACITY));if (tmp) {con->data = tmp;con->capacity += CAPACITY;}}
}    //检查容量void Add(Con* con)
{assert(con);Check(con);printf("请输入姓名:");scanf("%s", con->data[con->size].name);printf("请输入号码:");scanf("%s", con->data[con->size].phone);printf("新增联系人成功:%s %s\n", con->data[con->size].name, con->data[con->size].phone);++con->size;
}void Del(Con* con)
{assert(con);if (Empty(con)) {printf("通讯录为空\n");return;}printf("请输入要删除的联系人姓名:");char del[20];scanf("%s", del);int i = 0;while (i < con->size) {if (strcmp(del, con->data[i].name) == 0) {int j = i;while (j < con->size - 1) {strcpy(con->data[j].name, con->data[j + 1].name);strcpy(con->data[j].phone, con->data[j + 1].phone);++j;}}++i;}
}

void Find(Con* con) 模糊查询

void Find(Con* con)
{assert(con);printf("请输入姓名/号码进行查询:");char find[20];scanf("%s", find);int count = 0;int i = 0;while (i < con->size) {if (strstr(con->data[i].name, find) || strstr(con->data[i].phone, find)) {printf("%10s %12s\n", con->data[i].name, con->data[i].phone);++count;}++i;}printf("共查询到 %d 条数据\n", count);
}

void Mod(Con* con) 数据修改

void Mod(Con* con)
{assert(con);printf("请输入需要修改信息的联系人姓名:");char mod[20];scanf("%s", mod);int i = 0;while (i < con->size) {if (strcmp(mod, con->data[i].name) == 0) {printf("请更新姓名:");scanf("%s", con->data[i].name);printf("请更新号码:");scanf("%s", con->data[i].phone);return;}++i;}printf("联系人未查询到\n");
}

void Sort(Con* con) 数据排序

int cmp_name(const void* e1, const void* e2)
{return strcmp((*(Peo*)e1).name, (*(Peo*)e2).name);
}int cmp_phone(const void* e1, const void* e2)
{return strcmp((*(Peo*)e1).phone, (*(Peo*)e2).phone);
}void Sort(Con* con)
{assert(con);printf("请选择排序方式(1.cmp_name   2.cmp_phone):");int choose;scanf("%d", &choose);if (choose == 1) {qsort(con->data, con->size, sizeof(Peo), cmp_name);printf("已按姓名排序成功\n");}else if (choose == 2) {qsort(con->data, con->size, sizeof(Peo), cmp_phone);printf("已按号码排序成功\n");}else {printf("输入错误,排序失败\n");}
}

void Print(Con* con) 打印

void Destory(Con* con) 销毁、清空

void Print(Con* con)
{assert(con);if (Empty(con)) {printf("通讯录为空\n");return;}int i = 0; printf("         联系人   电话号码\n");while (i < con->size) {printf("%03d: %10s %12s\n", i, con->data[i].name, con->data[i].phone);++i;}
}void Destory(Con* con)
{assert(con);free(con->data);con->data = (Peo*)malloc(sizeof(Peo) * CAPACITY);if (con->data == NULL) {perror("destory::malloc");exit(1);}con->size = 0;con->capacity = CAPACITY;
}

void Load(Con* con) 读档

void Save(Con* con) 存档

void Load(Con* con)
{assert(con);FILE* pfRead = fopen("contact.txt", "rb");if (pfRead == NULL) return;Peo tmp = { 0 };while (fread(&tmp, sizeof(Peo), 1, pfRead)) {Check(con);con->data[con->size] = tmp;++con->size;}fclose(pfRead);pfRead = NULL;
}void Save(Con* con)
{assert(con);FILE* pfWrite = fopen("contact.txt", "wb");if (pfWrite == NULL) {perror("pfWrite::fopen");exit(1);}int i = 0;while (i < con->size) {fwrite(con->data + i, sizeof(Peo), 1, pfWrite);++i;}fclose(pfWrite);pfWrite = NULL;
}

main.c源文件

#include "contact.h"void Menu()
{printf("\n------------------------\n");printf("-----    0. 退出   -----\n");printf("-----    1. 新增   -----\n");printf("-----    2. 删除   -----\n");printf("-----    3. 查找   -----\n");printf("-----    4. 修改   -----\n");printf("-----    5. 排序   -----\n");printf("-----    6. 打印   -----\n");printf("-----    7. 清空   -----\n");printf("------------------------\n");printf("请输入选项:");
}int main()
{Con con;Init(&con);int input;do {Menu();scanf("%d", &input);system("cls");switch (input) {case 0:Save(&con);printf("退出通讯录\n");return;case 1:Add(&con);break;case 2:Del(&con);break;case 3:Find(&con);break;case 4:Mod(&con);break;case 5:Sort(&con);break;case 6:Print(&con);break;case 7:Destory(&con);break;default:break;}} while (input);return 0;
}

【C/C++实战项目】通讯录相关推荐

  1. 【码云周刊第 3 期】来自国内开发者的实战项目,开源让通讯从未如此简单!...

    为什么80%的码农都做不了架构师?>>>    类型:即时通讯 "小时候,乡愁是一枚小小的邮票,我在这头,母亲在那头-- " 春节将至,思乡心切,小一情不自禁的想 ...

  2. (上)小程序从0快速入门到实战项目打造个性简历,让你轻松脱颖而出吸引面试官眼球(附源码)

    前言 分享之前我们先来认识一下小程序,官方定义的微信小程序是一种新的开放能力,开发者可以快速地开发一个小程序.更是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体 ...

  3. Java开发实战项目分享

    序言 很多学生问我如何学好Java,感觉Java的知识点太多,无从下手.Java发展几十年由于其历史悠久,从传统项目研发到移动端.互联网分布式系统的研发都有其深厚的技术底蕴,所以我们学习Java应该信 ...

  4. 什么是互联网大厂_仅限今天!大厂最热数据分析经典实战项目大公开!

    原标题:仅限今天!大厂最热数据分析经典实战项目大公开! 如今,全球早已步入数据时代,随着行业的高速发展,相关岗位缺口已超150万,且薪资超同行业50%.未来十年,数据细分岗位将扩张5倍,各行业数据人才 ...

  5. mybatis学习7 实战项目

    自己写一个实战项目,最好和hibernate做对比. 转载于:https://www.cnblogs.com/liufei1983/p/7492214.html

  6. 干货满满的 Python 实战项目,点赞收藏

    作者 | 俊欣 来源 | 关于数据分析与可视化 今天小编来给大家介绍3个干货满满的计算机视觉方向的Python实战项目,主要用到的库有 opencv-python numpy pillow 要是大家所 ...

  7. 实战:人脸识别实战项目(源码共享)

    首先我想问个问题:现在什么工程师最值钱? 毫无疑问,我想超 90% 的都会说:人工智能工程师.也难怪,随着近几年人工智能的发展,已经逐渐渗透到了各个领域,比如:医疗.教育.机械自动化.个性化推荐.信息 ...

  8. 数百个CV实战项目与必备7本书5000页中英文CV书籍免费送啦~

    数百个CV实战项目与必备7本5000页书籍,公众号[深度学习冲鸭]的后台回复关键字[CV入坑必备](建议复制~)获得: CV学习书籍汇总 1:<学习OpenCV中文版> 2:<图像处 ...

  9. 数百个CV实战项目与必备7本书5000页中英文CV书籍以及算法工程师必备资料免费送啦~...

    数百个CV实战项目与必备7本5000页书籍,公众号[深度学习冲鸭]的后台回复关键字[CV入坑必备](建议复制~)获得: CV学习书籍汇总 1:<学习OpenCV中文版> 2:<图像处 ...

  10. 再次升级,985博士整理的71个OpenCV实战项目教程开放下载!

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 近期小白学视觉公众号推出了多篇Python+OpenCV实战项目的 ...

最新文章

  1. ie下input的type属性为hidden问题
  2. 不容易系列之(4)——考新郎
  3. 基于redhat linux虚拟服务器的web负载均衡集群(piranha+LVS)
  4. 《成为一名机器学习工程师》_如何在2020年成为机器学习工程师
  5. Objective-C成员变量声明方式探究
  6. 【一天一个C++小知识】005. C++中的句柄类(智能指针)
  7. 3D场景编辑导出-LayaAir引擎Unity插件使用详解
  8. java项目启动就调用方法_Java项目启动时执行指定方法的几种方式
  9. 安卓手机作为文件共享服务器,安卓手机的文件共享应该怎么操作?
  10. Python读写矢量数据(1)针对读取矢量数据——Python地理数据处理学习分享
  11. Code Sign error: Provisioning profile '6805769A-5085-4BE7-B9D1-2859CD2CBE9E' can't be found
  12. 说话人识别(speaker Recognition/Verification)简介
  13. solidworks2022 无效的(不一致的)使用许可号码 问题解决
  14. 谷歌研究利用AI合成图片,使静态图片动起来
  15. 微信小程序收款手续费_【微信支付】微信小程序支付开发者文档
  16. 单片机补充案例--两只老虎
  17. [转]如何免费下到IEEE ACM的论文(SCI-HUB的使用)
  18. 打印机驱动冲突和端口异常:win10更新部分补丁后,打印机本地连接(连接打印机的主机)可以打印,其他共享网络中的电脑可以连接到打印机,但不能打印——解决方案
  19. 安卓逆向 AndroidManifest.xml 编辑 解码与编码工具
  20. 有、无线电的信号传输

热门文章

  1. Word2vec 原理解析
  2. mysql增删改查要用事务吗_数据库的增删改查、事务与索引
  3. matlab各语句意思,请问这个语句表示什么意思?
  4. 如何做一个基于JAVA多用户B2C商城系统毕业设计毕设作品(springboot框架)
  5. 评委打分 在唱歌比赛中,有6名评委给选手打分,分数范围是[0-100]之间的整数。
  6. python 多线程 廖雪峰_Python 一篇学会多线程
  7. 【数据库】数据库之存储引擎
  8. 你们公司有做过数据迁移吗,行业中常见的数据迁移方案,了解下,每个人技术人必备的技能
  9. linux下删除木目录的方法,rmdir/rm删除目录的区别
  10. 0708-Pen Brush