C语言实战项目---通讯录

项目要实现的内容:能够存放100个人的通讯录程序,能够实现联系人数据的存储,删除,修改,查找,展示联系人的信息。

所需知识:结构体,指针,函数.................

废话不多说,咱们直接开始

1.界面的打印

我们需要一个可以执行选择的界面提供用户选择不同的数字来执行不同的程序。

我们在这里提前声明一下:

1.add(增加联系人的信息)

2.deal(删除联系人的信息)

3.search(查找联系人的信息)

4.modify(修改联系人的信息)

5.show(展示联系人的信息)

那我们现在就开始

void menu()
{printf("************************************************\n");printf("***      1. add        2.deal                   *\n");printf("***      3.search      4.modify                 *\n");printf("***      5.show        6.exit                   *\n");printf("*************************************************\n");}

这个就是我们的菜单

菜单的打印很简单就使用一个 printf一个函数,我们接着继续把选择语句写出来 在我们写之前我们来思考一个问题(我们一共有六个可供选择的程序接口,那么我们该如何分辨我们选择执行的程序不会出错呢?)其实有个办法就是使用  枚举常量来实现。

大家来看不懂枚举的大家看我往期博客 我把地址放在这 CSDN

enum Option
{exit,       //退出信息管理系统   0add,        //增加信息管理系统   1deal,       //删除信息管理系统   2search,     //搜索信息管理系统   3 modify,     //修改信息管理系统   4show,       //展示信息管理系统   5};

这样我们就可以清楚的知道我们所选择的每个选项,所要执行的程序。

我们来实现选择,选择不同的数字来执行不同的程序。原理很简单,使用一个do while(循环)

嵌套一个Switch语句。

int main()
{int input = 0;do{menu();printf("请选择\n");scanf_s("%d", &input);switch (input){case exit:printf("退出信息管理系统");break;case add:ADDContact(&con);break;case deal:DEALContact(&con);break;case search:SearchContact(&con);break;case modify:ModifyCkontact(&con);break;case show:SHOWContact(&con);break;default:printf("请重新选择");break;}} while (input);return 0;
}

大家请看,当我们使用了枚举类型之后我们的选择都具象化了。

最基本的菜单和界面操作完成后我们来实现各种接口。

2.实现接口的预操作

2.1 创建结构体变量

我们创建的结构体是用来保存联系人的信息,其中包含联系人的“姓名”“性别”“地址”“年龄”“电话”

我们使用typedef 来将结构体命名为 peopleinform(people--人,inform--信息)

typedef struct peopleinform //设置人的信息
{char name[20];char sex[5];char adrs[30];int age;char tele[20];}peopleinform;

这是一个人的信息,但是我们的通讯录要实现的是100个人的信息,那么我们就需要再创建一个结构体来实现。

typedef struct Contact
{peopleinform date[100]; //用来存放数据int sz; //用来记录的是信息管理系统中存放信息的个数}Contact;

以上就是我们预处理,那么我们来实现接口。

 3.初始化联系人信息管理系统

再实现联系人数据增加的前提是我们要初始化date,sz,保证它们中没有任何的数据,以免对我们后续联系人数据的增加产生干扰。

我们初始化有两个办法,一个就是使用memset函数之间初始化

                                       二是使用循环来实现。

                                       由于C语言提供了函数,我们就使用这个。

//初始化信息管理系统
void IntiContact(Contact* pc);
void IntiContact(Contact* pc)
{assert(pc);pc->sz = 0;memset(pc->date, 0, sizeof(pc->date));/*memset是一个初始化函数,作用是将某一块内存中的全部设置为指定的值s指向要填充的内存块。c是要被设置的值。n是要被设置该值的字符数。返回类型是一个指向存储区s的指针*/}

关键点拨:我们使用指针类型的原因,大家都知道传参。一个是传值,一个是传地址。

为什么在这里我们选择传地址(完了使用指针访问地址)???

在此之前我还有一篇博客(函数栈帧的创建与销毁)地址放在这里--CSDN 感兴趣的可以去详细了解。

解释:形参是实参的一份临时拷贝,如果单纯的传值,我们访问的时候是不需要修改的。

传值-----(B是一个中间人我是C需要把一份东西给A,我把东西给B,B给A),但是当我要找到A时,我就需要A的地址了。

传地址----(B这个中间人直接把A的地址给了我,我直接去找A,对A里面的值进行修改)。

因为我们需要对   date 和 sz 的内部的值进行修改所以 我们使用的是传地址。

初始化完成之后我们就可以来实现各种各样的接口了。

4.联系人数据的增加

//增加学生信息的信息
void ADDContact(Contact* pc);

这个过程是相对比较简单的使用printf函数和scanf函数即可。

报错:scanf函数我们在使用的时候,如果我们在后面不加上具体的数量,大小会报错。

void ADDContact(Contact* pc)
{assert(pc);//先判断信息管理系统有没有空间支持增加if (pc->sz == 100){printf("信息管理系统已满无法增加\n");return;}//如果没有返回就增加一个人的信息printf("请输入名字");scanf_s("%s", pc->date[pc->sz].name, 20);printf("请输入年龄");scanf_s("%d", &(pc->date[pc->sz].age));printf("请输入性别");scanf_s("%s", pc->date[pc->sz].sex, 5);printf("请输入电话");scanf_s("%s", pc->date[pc->sz].tele, 20);printf("请输入地址");scanf_s("%s", pc->date[pc->sz].adrs, 30);//由于信息录入完成所以增加了一个人的信息pc->sz++;printf("增加成功\n");}

 程序跑起来效果就是这样。

5.联系人数据的查看

由于“删除”“修改”“查找”都需要使用遍历查找,所以我们把它们放在后面,我们先来实现查看接口。

//查看学生信息的信息
void SHOWContact(Contact* pc);

相较于后面几个接口这个接口比较好实现,使用循环来打印就是。

大家请看

void SHOWContact(Contact* pc)
{assert(pc);;	if (pc->sz == 0){printf("信息管理系统为空无法打印\n");return;}int i = 0;printf("%-20s%-5s%-5s%-12s%-30s\n", "姓名", "年龄", "性别", "电话", "地址");for (i = 0; i < pc->sz; i++){//打印每个人的信息printf("%-20s%-5d%-5s%-12s%-30s\n", //分别打印姓名,年龄,性别,电话,地址。pc->date[i].name, pc->date[i].age, pc->date[i].sex, pc->date[i].tele, pc->date[i].adrs);}
}

我来为大家解释一下代码:

printf("%-20s%-5s%-5s%-12s%-30s\n", "姓名", "年龄", "性别", "电话", "地址");

这一行代码:是打印我们的上面部分,采用的是左对齐的方式。(所以%20s,我们会加上“-”这个符号,其中%20s,是宽度)

printf("%-20s%-5d%-5s%-12s%-30s\n", //分别打印姓名,年龄,性别,电话,地址。
            pc->date[i].name, pc->date[i].age, pc->date[i].sex, pc->date[i].tele, pc->date[i].adrs);

这一行打印的是我们下面的部分。

那我们接着继续往下看

6.联系人数据的删除
 

6.1查找指定联系人

//删除指定学生信息的信息
void DEALContact(Contact* pc);

在我们实现删除的前提是找到指定的联系人,那么该如何操作呢?

思路如下:1.自定函数FindByName通过遍历来找到指定的姓名

                  2.再来删除

查找的代码:

int FIndByNmae(Contact* pc, char name[])
{assert(pc);int i = 0;for (i = 0; i < pc->sz; i++){if (strcmp(pc->date[i].name, name) == 0){return i;}}return -1; //找不到
}

分析如下:我们使用循环来遍历SZ(sz中存储的是有效联系人的信息,我们查找是否有名字相同的),我们使用了  strcmp 函数我们可以找到此人。找不到就会直接返回。

怕大家不理解Strcmp 我找来了资料大家可以看看。

 6.2删除指定联系人

oid DEALContact(Contact* pc)
{char name[20];assert(pc);if (pc->sz == 0){printf("没有学生信息的数据无法删除");return;}//找到学生信息printf("输入想要删除学生信息的名字:");scanf_s("%s", name, 20);//找到名字为name的人//分装一个新的函数FIndByName用来查找学生信息int ret = FIndByNmae(pc, name);if (ret == -1){printf("要删除的人不存在\n");return;}//删除这个人的信息 int i = 0;for (i = ret; i < pc->sz - 1; i++){pc->date[i] = pc->date[i + 1];}pc->sz--;printf("删除成功");}

我来给大家详细通过画图来解释一下删除的全过程(如何进行删除操作的)

 

假设我们要删除 ret那么如何删除呢?

我们通过覆盖,从后面到前面覆盖,就是使用ret后面的那一个来把ret覆盖起来。

以上就是删除联系人的信息

7.联系人数据的修改

 //修改指定学生信息的信息 
void  ModifyCkontact(Contact*pc);

当我们有了自定义函数来实现查找之后,修改操作便会简单很多。 我们之间把增加的后半段代码复制过来。

void  ModifyCkontact(Contact* pc)
{char name[20];assert(pc);printf("请输入你要修改的人的名字:");scanf_s("%s", name, 20);int ret = FIndByNmae(pc, name);if (ret == -1){printf("要修改的人不存在\n");return;}//修改printf("请输入名字");scanf_s("%s", pc->date[ret].name, 20);printf("请输入年龄");scanf_s("%d", &(pc->date[ret].age));printf("请输入性别");scanf_s("%s", pc->date[ret].sex, 5);printf("请输入电话");scanf_s("%s", pc->date[ret].tele, 20);printf("请输入地址");scanf_s("%s", pc->date[ret].adrs, 30);printf("修改成功");
}

8.联系人数据的查找

//查找指定学生信息的信息void SearchContact(Contact*pc);
void SearchContact(Contact*pc)
{char name[20];assert(pc);printf("请输入你要查找的人的名字:");scanf_s("%s", name, 20);int ret = FIndByNmae(pc, name);if (ret == -1){printf("要查找的人不存在\n");return;}//显示出来printf("%-20s%-5s%-5s%-12s%-30s\n", "姓名", "年龄", "性别", "电话", "地址");printf("%-20s%-5d%-5s%-12s%-30s\n", //分别打印姓名,年龄,性别,电话,地址。pc->date[ret].name, pc->date[ret].age, pc->date[ret].sex, pc->date[ret].tele, pc->date[ret].adrs);}

 相同的原理只要我们可以找到就可以实现。

9.通讯录的完整代码

text.c

#include"Contact.h"
void menu()
{ printf("************************************************\n" );printf("        基于动态链表实现的学生信息系统          *\n");printf("***      1. add        2.deal                   *\n");printf("***      3.search      4.modify                 *\n");printf("***      5.show        6.exit                   *\n");printf("*************************************************\n");printf("本系统提供了增加,删除,搜索,修改,展示 学生信息\n");
}
enum Option
{exit,       //退出信息管理系统add,        //增加信息管理系统deal,       //删除信息管理系统search,     //搜索信息管理系统modify,     //修改信息管理系统show,       //展示信息管理系统};
int main()
{int input = 0;Contact con;  //con就是创建的信息管理系统//初始化信息管理系统(因为在开始信息管理系统没有进行初始化内部存放的都是随机值)IntiContact(&con);do{menu();printf("请选择\n");scanf_s("%d", &input);switch (input){case exit:printf("退出信息管理系统");break;case add:ADDContact(&con);break;case deal:DEALContact(&con);break;case search:SearchContact(&con);break;case modify:ModifyCkontact(&con);break;case show:SHOWContact(&con);break;default:printf("请重新选择");break;}} while (input);return 0;
}

 Contact.c

#include"Contact.h"
void IntiContact(Contact* pc)
{assert(pc);pc->sz = 0;memset(pc->date, 0, sizeof(pc->date));/*memset是一个初始化函数,作用是将某一块内存中的全部设置为指定的值s指向要填充的内存块。c是要被设置的值。n是要被设置该值的字符数。返回类型是一个指向存储区s的指针*/}
void ADDContact(Contact* pc)
{assert(pc);//先判断信息管理系统有没有空间支持增加if (pc->sz == 100){printf("信息管理系统已满无法增加\n");return;}//如果没有返回就增加一个人的信息printf("请输入名字");scanf_s("%s", pc->date[pc->sz].name,20);printf("请输入年龄");scanf_s("%d", &(pc->date[pc->sz].age));printf("请输入性别");scanf_s("%s", pc->date[pc->sz].sex,5);printf("请输入电话");scanf_s("%s", pc->date[pc->sz].tele,20);printf("请输入地址");scanf_s("%s", pc->date[pc->sz].adrs,30);//由于信息录入完成所以增加了一个人的信息pc->sz++;printf("增加成功\n");}
void SHOWContact(Contact* pc)
{assert(pc);;	if (pc->sz == 0){printf("信息管理系统为空无法打印\n");return;}int i = 0;printf("%-20s%-5s%-5s%-12s%-30s\n", "姓名", "年龄", "性别", "电话", "地址");for (i = 0; i < pc->sz; i++){//打印每个人的信息printf("%-20s%-5d%-5s%-12s%-30s\n", //分别打印姓名,年龄,性别,电话,地址。pc->date[i].name, pc->date[i].age, pc->date[i].sex, pc->date[i].tele, pc->date[i].adrs);}
}int FIndByNmae(Contact* pc, char name[])
{assert(pc);int i = 0;for (i = 0; i < pc->sz; i++){if (strcmp(pc->date[i].name, name) == 0){return i;}}return -1; //找不到}void DEALContact(Contact* pc)
{char name[20];assert(pc);if (pc->sz == 0){printf("没有学生信息的数据无法删除");return;}//找到学生信息printf("输入想要删除学生信息的名字:");scanf_s("%s", name, 20);//找到名字为name的人//分装一个新的函数FIndByName用来查找学生信息int ret = FIndByNmae(pc, name);if (ret == -1){printf("要删除的人不存在\n");return;}//删除这个人的信息 int i = 0;for (i = ret; i < pc->sz-1; i++){pc->date[i] = pc->date[i + 1];}pc->sz--;printf("删除成功");}
void SearchContact(Contact*pc)
{char name[20];assert(pc);printf("请输入你要查找的人的名字:");scanf_s("%s", name, 20);int ret = FIndByNmae(pc, name);if (ret == -1){printf("要查找的人不存在\n");return;}//显示出来printf("%-20s%-5s%-5s%-12s%-30s\n", "姓名", "年龄", "性别", "电话", "地址");printf("%-20s%-5d%-5s%-12s%-30s\n", //分别打印姓名,年龄,性别,电话,地址。pc->date[ret].name, pc->date[ret].age, pc->date[ret].sex, pc->date[ret].tele, pc->date[ret].adrs);}void  ModifyCkontact(Contact* pc)
{char name[20];assert(pc);printf("请输入你要修改的人的名字:");scanf_s("%s", name, 20);int ret = FIndByNmae(pc, name);if (ret == -1){printf("要修改的人不存在\n");return;}//修改printf("请输入名字");scanf_s("%s", pc->date[ret].name, 20);printf("请输入年龄");scanf_s("%d", &(pc->date[ret].age));printf("请输入性别");scanf_s("%s", pc->date[ret].sex, 5);printf("请输入电话");scanf_s("%s", pc->date[ret].tele, 20);printf("请输入地址");scanf_s("%s", pc->date[ret].adrs, 30);printf("修改成功");
}

Contact.h

#pragma once
#include<string.h>
#include<assert.h>
#define NAME_MAX 20;
#define SEX_MAX 5;
#define ADRS_MAX 20;
#define TELE_MAX 15;
#include<stdio.h>
typedef struct peopleinform //设置人的信息
{char name[20];char sex[5];char adrs[30];int age;char tele[20];}peopleinform;
typedef struct Contact
{peopleinform date[100]; //用来存放数据int sz; //用来记录的是信息管理系统中存放信息的个数}Contact;
//初始化信息管理系统
void IntiContact(Contact* pc);
//增加学生信息的信息
void ADDContact(Contact* pc);
//查看学生信息的信息
void SHOWContact(Contact* pc);
//删除指定学生信息的信息
void DEALContact(Contact*pc);
//查找指定学生信息的信息void SearchContact(Contact*pc);//修改指定学生信息的信息 
void  ModifyCkontact(Contact*pc);

今天的博客就到这里了,后续为大家更新C++的相关课程。

感谢你的观看

                               

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

AI绘画成果展(第一期)

免费获取更多原图&#xff0c;备注“AI绘画”&#xff0c;可在文章末尾点击名片进qun获取。 免费获取更多原图&#xff0c;备注“AI绘画”&#xff0c;可在文章末尾点击名片进qun获取。

pandas索引

pandas索引 一、索引1.1 建立索引1.2 重置索引1.3 索引类型1.4 索引的属性1.5 索引的操作 一、索引 1.1 建立索引 建立索引可以在数据读取加载中指定索引&#xff1a; import pandas as pd df pd.read_excel(team.xlsx, index_colname) # 将name列设置为索引 df.head()效…

Hadoop3:HDFS的架构组成

一、官方文档 我这里学习的是Hadoop3.1.3版本&#xff0c;所以&#xff0c;查看的也是3.1.3版本的文档 Architecture模块最下面 二、HDFS架构介绍 HDFS架构的主要组成部分&#xff0c;是一下四个部分 1、NameNode(NN) 就是Master节点&#xff0c;它是集群管理者。 1、管…

解决 SyntaxError: Unexpected token ‘.‘ 报错问题

这个报错一般是编译问题&#xff0c;浏览器的版本过低没通过代码 解决办法&#xff1a; 在package.json文件中加上这个 "browserslist": ["> 1%","last 2 versions","not dead","not ie < 6","Android > 4&…

Web 3.0时代:软文发稿对企业品牌的影响

Web 3.0的到来&#xff0c;标志着我们已经进入了一个全新的互联网时代。在这个新时代中&#xff0c;信息的生成和传播有了更多的可能性和更广的空间。作为企业品牌宣传的重要手段之一的软文发稿&#xff0c;在Web 3.0时代将会面临什么样的挑战和机遇&#xff1f; 首先&#xf…

人脸美型SDK解决方案,适用于各类应用场景

视频内容已经成为企业宣传、产品展示、互动直播等多个领域的核心载体。而在这些场景中&#xff0c;高质量的人脸美型效果不仅能够提升用户体验&#xff0c;更能为品牌加分。美摄科技凭借深厚的技术积累和行业洞察&#xff0c;推出了全新的人脸美型SDK解决方案&#xff0c;为企业…

Fizzler库+C#:从微博抓取热点的最简单方法

概述 在这篇技术文章中&#xff0c;我们将深入研究如何利用Fizzler库结合C#语言&#xff0c;以实现从微博平台抓取热点信息的功能。微博作为中国乃至全球范围内具有重要影响力的社交媒体平台之一&#xff0c;在互联网信息传播中扮演着举足轻重的角色。通过Fizzler这一强大的.N…

Sarcasm detection论文解析 |CAT-BiGRU

论文地址 论文地址&#xff1a;CAT-BiGRU: Convolution and Attention with Bi-Directional Gated Recurrent Unit for Self-Deprecating Sarcasm Detection | Cognitive Computation github:Ashraf-Kamal/Self-Deprecating-Sarcasm-Detection (github.com) 论文首页 笔记框架 …

什么软件能在桌面提醒我 电脑桌面提醒软件

在这个信息爆炸的时代&#xff0c;我们每个人每天都需要处理海量的信息和任务。有时候&#xff0c;即便是再细心的人&#xff0c;也难免会因为事情太多而忘记一些重要的细节。 我就经常遇到这样的问题&#xff0c;明明记得自己有个重要的会议要参加&#xff0c;或者有个关键的…

LeetCode 每日一题 Day 144-157

2385. 感染二叉树需要的总时间 给你一棵二叉树的根节点 root &#xff0c;二叉树中节点的值 互不相同 。另给你一个整数 start 。在第 0 分钟&#xff0c;感染 将会从值为 start 的节点开始爆发。 每分钟&#xff0c;如果节点满足以下全部条件&#xff0c;就会被感染&#xf…

风电厂数字孪生3D数据可视化交互展示构筑智慧化电厂管理体系

随着智慧电厂成为未来电力企业发展的必然趋势&#xff0c;深圳华锐视点紧跟时代步伐&#xff0c;引领技术革新&#xff0c;推出了能源3D可视化智慧管理系统。该系统以企业现有的数字化、信息化建设为基础&#xff0c;融合云平台、大数据、物联网、移动互联、机器人、VR虚拟现实…

什么是视频号小店?为什么这么多人都在做?一文带你轻松入门!

大家好&#xff0c;我是电商花花。 现在电商的快速发展&#xff0c;电商行业在各大电商平台上不断发展&#xff0c;而视频号小店也被更多人看到和入驻&#xff0c;让更多创业者对视频号小店产生兴趣。 知道的人都觉得视频号小店是一个不可多得的创业项目&#xff0c;因为这里…

开源的聊天服务器tigase 7.1.3 相关文档

官方的api文档 7.1.3&#xff1a; Tigase Administration Guide github地址&#xff1a; Release 7.1.3 tigase/tigase-server GitHub 安装教程&#xff1a; Tigase手动安装过程-腾讯云开发者社区-腾讯云

学习强国手机助手

前景&#xff1a; 用手机刷学习强国时要一直盯着手机&#xff0c;总感觉费时费劲&#xff0c;刚好最近学习python写个小工具帮忙自动学习&#xff0c;实现了文章和视频学习&#xff0c;答题类不一定都能正确。上班时电脑连着USB就可以放那&#xff0c;自己可以上班干自己事情。…

IDEA中git的常用操作(保姆级教学)

IDEA中git的常用操作&#xff08;保姆级教学&#xff09; 以下是git的工作原理&#xff0c;觉得繁琐的可以跳过不看 Workspace&#xff1a;工作区 (平时存放代码的地方) Index / Stage&#xff1a;暂存区&#xff08;用于临时存放存放你的改动&#xff0c;事实上就是一个文件&…

SemCity: 一个应用于真实户外环境场景生成的3D Diffusion模型

论文标题&#xff1a; SemCity: Semantic Scene Generation with Triplane Diffusion 论文作者&#xff1a; Jumin Lee1, Sebin Lee1, Changho Jo, Woobin Im, Juhyeong Seon, Sung-Eui Yoon 项目地址&#xff1a;https://sglab.kaist.ac.kr/SemCity/ 前言&#xff1a; 该论…

JVM笔记-常用命令

1、jstat jstat是一个极强的监视JVM的工具&#xff0c;可以用来监视JVM的各种堆和非堆的大小以及内存使用量。 Usage: jstat -help|-optionsjstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]jstat的常用用法如图所示&#xff…

maven-test不通过导致无法打包

背景 别人写的一个test包&#xff0c;没有测试通过&#xff0c;导致最后没有打包成功 解决方案 package生命周中不要勾选test

《我的医养信息化之路》之三十三:健康保养“4S”店

最近早上起来肩部的骨头出现酸痛&#xff0c;不由得有点感慨岁月不饶人。我已经感觉到年近50岁各种器官的衰退&#xff0c;从30岁开始我就慢慢感觉到一点点的变化。年龄老化导致的系统整体功能水平低下&#xff0c;从而产生各种器质性慢性病症。因此&#xff0c;系统功能低下才…

Swagger使用和注释介绍

一&#xff1a;介绍 1、什么是Swagger Swagger是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法&#xff0c;参数和模型紧密集成到服务器端的代码&#xff…