通讯录管理系统(C语言)

需求及功能分析

本系统主要划分为8个子系统,如下图所示·。
在这里插入图片描述

  1. 增加联系人模块
  2. 删除联系人模块
  3. 查找联系人模块
  4. 插入联系人模块
  5. 保存联系人模块
  6. 加载联系人模块
  7. 显示联系人模块
  8. 退出模块

具体代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>#define MAX 40
typedef struct {char name[50];/*姓名*/char corp[50];/*工作单位*/char phone[15];/*联系手机*/char address[100];/*家庭住址*/char qq[15];/*联系QQ*/char msn[50];/*联系MSN*/char mail[50];/*电子邮件*/
} AddressInfo;/*通讯录结构体*/int AddNew_AddrInfo(AddressInfo f[]);/*增加联系人*/
int Select_Menu(); /*输出主菜单*/
void Output_AddrInfo(AddressInfo addrinfo);/*输出一个联系人信息*/
int Find_AddrInfo(AddressInfo f[], int n, char *k);/*查找*/
int Delete_AddrInfo(AddressInfo f[], int countPerson);/*删除联系人*/
int Insert_AddrInfo(AddressInfo f[], int countPerson);/*插入联系人*/
void Save_AddrInfo(AddressInfo f[], int countPerson);/*保存文件*/
void Search_AddrInfo(AddressInfo f[], int countPerson);/*查找联系人*/
int Read_AddrInfo(AddressInfo f[]);/*从文件读取联系人信息*/
void DisplayAll_AddrInfo(AddressInfo f[], int countPerson);/*输出所有的联系人信息*//*主函数*/
int main() {AddressInfo addrinfo[MAX];int countPerson = 0;do {switch (Select_Menu()) {case 0:/*增加联系人*/countPerson = AddNew_AddrInfo(addrinfo);break;case 1:/*删除联系人*/countPerson = Delete_AddrInfo(addrinfo, countPerson);break;case 2:/*查找联系人*/Search_AddrInfo(addrinfo, countPerson);break;case 3:/*插入联系人*/countPerson = Insert_AddrInfo(addrinfo, countPerson);break;case 4:/*保存联系人文件*/Save_AddrInfo(addrinfo, countPerson);break;case 5:/*从文件加载联系人信息*/countPerson = Read_AddrInfo(addrinfo);break;case 6:/*显示所有联系人*/DisplayAll_AddrInfo(addrinfo, countPerson);break;case 7:/*退出循环*/exit(0);break;}} while (1);
}/*增加联系人*/
int AddNew_AddrInfo(AddressInfo f[]) {int i = 0, n = 0;char *s = 0;printf("请输入当前增加的联系人总个数 \n");/*提示信息*/scanf("%d", &n); /*输入记录数*/printf("请输入记录 \n"); /*提示输入记录*/printf("姓名  工作单位  联系电话  家庭住址  联系QQ   联系MSN  电子邮件\n");printf("------------------------------------------------\n");for (i = 0; i < n; i++) {scanf("%s", f[i].name);scanf("%s", f[i].corp);scanf("%s", f[i].phone);scanf("%s", f[i].address);scanf("%s", f[i].qq);scanf("%s", f[i].msn);scanf("%s", f[i].mail);printf("----------------------------------------------\n");}return n; /*返回记录条数*/
}/*主菜单*/
int Select_Menu() {char s[80];/*以一行80个字符为限,多余的部分不从键盘读取*/int c = 0;system("cls");/*清屏*/printf("\n");printf("/******************************************\\\n");printf("*                                          *\n");printf("*        通  讯  录  管  理  系  统        *\n");printf("*                  主菜单                  *\n");printf("*                                          *\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("\\******************************************/\n\n");do {printf("\n 请选择对应的序号(0~7):"); /*提示输入选项*/scanf("%s", s); /*输入选择项*/c = atoi(s); /*将输入的字符串转化为整型数*/} while (c < 0 || c > 7); /*选择项不在0~7之间重输*/return c; /*返回选择项,主程序根据该数调用相应的函数*/
}/*删除联系人*/
int Delete_AddrInfo(AddressInfo f[], int countPerson) {char k[50];/*要删除的联系人的姓名*/int i, j;int ch = 0;printf("请输入要删除的联系人的姓名:\n"); /*提示信息*/scanf("%s", k);/*从键盘取得输入的姓名*/i = Find_AddrInfo(f, countPerson, k); /*调用Find_AddrInfo查询*/if (i > countPerson - 1) /*如果i>n-1超过了数组的长度*/printf("没找到要删除的联系人\n"); /*显示没找到要删除的记录*/else {Output_AddrInfo(f[i]); /*调用输出函数显示该条记录信息*/printf("输入1确认删除,输入0不删除(1/0)。\n"); /*确认是否要删除*/scanf("%d", &ch); /*输入一个整数0或1*/if (ch == 1) /*如果确认删除整数为1*/{for (j = i + 1; j < countPerson; j++) /*删除该记录,实际后续记录前移*/{memcpy(&(f[j - 1]), &(f[j]), sizeof(AddressInfo));}countPerson--; /*记录数减1*/}}return countPerson; /*返回记录数*/
}/*查找记录*/
void Search_AddrInfo(AddressInfo f[], int countPerson) {int i = 0;    /*保存查找到节点序号*/char k[50]; /*记录要查找的联系人姓名*/printf("请输入要查找的联系人姓名:\n");scanf("%s", k); /*输入要查找的联系人姓名*/i = Find_AddrInfo(f, countPerson, k);/*调用find函数,得到一个整数*/if ((i + 1) > countPerson)/*如果整数i值大于n-1,说明没找到*/printf("未找到,请确认有此用户存在!\n");elseOutput_AddrInfo(f[i]); /*找到,调用显示函数显示记录*/
}/*显示指定的联系人信息*/
void Output_AddrInfo(AddressInfo addrinfo) {printf("\n\n************************************\n");printf("姓名  工作单位  联系电话  家庭住址  联系QQ   联系MSN  电子邮件\n");printf("------------------------------------------------\n");printf("%-6s%-10s%-10s%-10s%-10s%-10s%-10s\n", addrinfo.name, addrinfo.corp, addrinfo.phone, addrinfo.address,addrinfo.qq, addrinfo.msn, addrinfo.mail);printf("****************************************\n");printf("按任意键继续!");getch();
}/*查找联系人*/
int Find_AddrInfo(AddressInfo f[], int n, char *k) {int i;for (i = 0; i < n; i++)/*从第一条记录开始,直到最后一条*/{if (strcmp(k, f[i].name) == 0) /*记录中的姓名和待比较的姓名是否相等*/return i; /*相等,则返回该记录的下标号,程序提前结结束*/}return i; /*返回i值*/
}/*插入联系人*/
int Insert_AddrInfo(AddressInfo f[], int countPerson)/*插入联系人*/
{int i, j;char s[50]; /*确定插入在哪个记录之前*/AddressInfo tempInfo; /*新插入记录信息*/memset(&tempInfo, 0, sizeof(AddressInfo));printf("请输入以下信息的值\n");printf("*****************************************\n");printf("姓名  工作单位  联系电话  家庭住址  联系QQ   联系MSN  电子邮件\n");printf("------------------------------------------------\n");scanf("%s", tempInfo.name);scanf("%s", tempInfo.corp);scanf("%s", tempInfo.phone);scanf("%s", tempInfo.address);scanf("%s", tempInfo.qq);scanf("%s", tempInfo.msn);scanf("%s", tempInfo.mail);printf("----------------------------------------\n");printf("请问您要在哪个联系人的信息前面插入,请输入该联系人的姓名:\n");scanf("%s", s); /*输入插入位置的姓名*/i = Find_AddrInfo(f, countPerson, s); /*调用find,确定插入位置*/for (j = countPerson - 1; j >= i; j--) /*从最后一个结点开始向后移动一条*/{memcpy(&(f[j + 1]), &(f[j]), sizeof(AddressInfo));}memcpy(&(f[i]), &(tempInfo), sizeof(AddressInfo));countPerson++; /*记录数加1*/return countPerson; /*返回记录数*/}/*保存函数*/
void Save_AddrInfo(AddressInfo f[], int countPerson) {int i;FILE *fp; /*指向文件的指针*/if ((fp = fopen("AddrInfo.txt", "wb")) == NULL) /*打开文件,并判断打开是否正常*/{printf("不能打开文件:AddrInfo.txt\n");/*没打开*/exit(1); /*退出*/}printf("\n************开始保存文件.************\n"); /*输出提示信息*/fprintf(fp, "%d", countPerson); /*将记录数写入文件*/fprintf(fp, "\r\n"); /*将换行符号写入文件*/for (i = 0; i < countPerson; i++) {fprintf(fp, "%-6s%-10s%-10s%-10s%-10s%-10s%-10s\n", f[i].name, f[i].corp,f[i].phone, f[i].address, f[i].qq, f[i].msn, f[i].mail);fprintf(fp, "\r\n"); /*记录每行的一个回车换行符*/}fclose(fp);/*关闭文件*/printf("****************保存成功***************\n"); /*显示保存成功*/printf("按任意键继续!");getch();}/*读入函数*/
int Read_AddrInfo(AddressInfo f[]) {FILE *fp = NULL; /*指向文件的指针*/int i = 0, countPerson = 0;if ((fp = fopen("AddrInfo.txt", "rb")) == NULL)/*打开文件*/{printf("不能打开文件:AddrInfo.txt\n"); /*不能打开*/exit(1); /*退出*/}fscanf(fp, "%d", &countPerson); /*从文件读取联系人总个数*/printf("\n************开始读取文件.************\n"); /*输出提示信息*/for (i = 0; i < countPerson; i++)fscanf(fp, "%6s%10s%10s%10s%10s%10s%10s\n", f[i].name, f[i].corp,f[i].phone, f[i].address, f[i].qq, f[i].msn, f[i].mail);fclose(fp); /*关闭文件*/printf("****************读取成功***************\n"); /*显示保存成功*/return countPerson; /*返回记录数*/
}/*显示记录函数*/
void DisplayAll_AddrInfo(AddressInfo f[], int countPerson) {int i;for (i = 0; i < countPerson; i++) {Output_AddrInfo(f[i]); /*调用输出函数显示该记录*/printf("\r\n");}
}

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

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

相关文章

前端八股文 $set

为什么会有$set vue2中对数组中新增的属性是监听不到的 如图 vue 插件中有但是 视图中没有刷新 解决方法 解决就是 $set() 就是在数组中新增属性的时候可以重新渲染视图 具体的写法 写法 就是 第一个 是在那个对象上新增 第二个参数 是新增的属性 第三个参数是 新增的属性…

R语言画散点图-饼图-折线图-柱状图-箱线图-等高线图-曲线图-热力图-雷达图-韦恩图(三D)

R语言画散点图-饼图-折线图-柱状图-箱线图-等高线图-曲线图-热力图-雷达图-韦恩图&#xff08;三D&#xff09; 散点图使用 plotly 包示例解析效果 使用 scatterplot3d 包示例解析效果 饼图使用 plotly 包示例解析效果 使用 plotrix 包示例解析效果 折线图使用 plotly 包示例解…

在STM32嵌入式中C/C++语言对栈空间的使用

像STM32这样的微控制器在进入main函数之前需要对栈进行初始化。可以说栈是C语言运行时的必要条件。我们知道栈实际上是一块内存空间&#xff0c;那么这块空间都用来存储什么呢&#xff1f;有什么办法能够优化栈空间的使用&#xff1f; 栈空间保存的内容 栈是一个先入后出的数据…

mac无法清空废纸篓怎么办 mac废纸篓清空了如何找回 cleanmymac误删文件怎么恢复

废纸篓相当于“一颗后悔药”&#xff0c;用于临时存储用户删除的文件。我们从从Mac上删除的文件&#xff0c;一般会进入废纸篓中。如果我们后悔了&#xff0c;可以从废纸篓中找回来。然而&#xff0c;有时我们会发现mac无法清空废纸篓&#xff0c;这是怎么回事?本文将探讨一些…

【数据结构初阶】顺序表

hi&#xff0c;我们又见面啦&#xff01;happy~~~ 目录 前言&#xff1a; 一、线性表 二、顺序表 1、概念 2、与数组的区别 3、分类 4、动态顺序表的实现 SeqList.h 见下 SeqList.c 见下 test.c 见下 【注意】 ————————————— 致回不去的童年 ———…

前端调试技巧:动态高亮渲染区域

效果&#xff1a; 前端界面的渲染过程、次数&#xff0c;会通过高亮变化来显示&#xff0c;通过这种效果排除一些BUG 高亮 打开方式 F12进入后点击ESC&#xff0c;进入rendering&#xff0c;选择前三个即可&#xff08;如果没有rendering&#xff0c;点击橘色部分勾选上&…

swiftui使用ScrollView实现左右滑动和上下滑动的效果,仿小红书页面

实现的效果如果所示&#xff0c;顶部的关注用户列表可以左右滑动&#xff0c;中间的内容区域是可以上下滚动的效果&#xff0c;点击顶部的toolbar也可以切换关注/发现/附近不同页面&#xff0c;实现翻页效果。 首页布局 这里使用了NavigationStack组件和tabViewStyle样式配置…

zerotier安装后设备在线,两个设备无法ping通

来源 组 NAS&#xff0c; 软路由&#xff0c;内网穿透&#xff0c;远程访问&#xff0c;安装了 zerotier&#xff0c;无法ping通 方法 修改windows防火墙&#xff0c;Configure the Windows firewall to allow pings。 Search for and open Windows Firewall.Select Advance…

Node.js快速入门

Node.js 1、Node.js介绍与安装 官网&#xff1a;https://nodejs.cn/ 介绍&#xff1a;简单的说 Node.js 就是运行在服务端的 JavaScript。 Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台。 Node.js 是一个事件驱动 I/O 服务端 JavaScript 环境&#xff0c;基…

Python | Leetcode Python题解之第274题H指数

题目&#xff1a; 题解&#xff1a; class Solution:def hIndex(self, citations: List[int]) -> int:left,right 0,len(citations)while left<right:# 1 防止死循环mid (leftright1)>>1cnt 0for v in citations:if v>mid:cnt1if cnt>mid:# 要找的答案在…

哈希 -- 简单实现

在STL库中&#xff0c;有map和set两个关联式容器&#xff0c;这两个容器的底层都是以红黑树为底层。但是在后续的发展过程中&#xff0c;我们发现有些场景的数据不适合用红黑树进行存储&#xff0c;所以有人就发明了底层为哈希表的map和set,称为unordered_map 和 unordered_set…

C语言中的控制语句(一):if语句

文章目录 &#x1f34a;自我介绍&#x1f34a;if 的单分支语句&#x1f34a;a.if 单分支判断&#x1f34a;b.if单分支选择判断 &#x1f34a;if多分支语句&#x1f34a;if多分支选择判断 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&a…

MMCV 核心组件分析(一):整体概述

概述 MMCV 是计算机视觉研究的基础库&#xff0c;并提供以下功能。

(11)Python引领金融前沿:投资组合优化实战案例

1. 前言 本篇文章为 Python 对金融的投资组合优化的示例。投资组合优化是从一组可用的投资组合中选择最佳投资组合的过程&#xff0c;目的是最大限度地提高回报和降低风险。 投资组合优化是从一组可用的投资组合中选择最佳投资组合的过程&#xff0c;目的是最大限度地提高回报…

单例模式_Golang

目录 一、单例模式 1.1 基本概念 1.2 使用场景 二、Golang实现 2.1 懒汉模式&#xff08;Lazy Loading&#xff09; 一、单例模式 1.1 基本概念 一个类只能生成一个实例&#xff0c;且该类能自行创建这个实例的一种模式,这个定义个人感觉可以拆的通俗一些,在项目的生命周…

电子电器架构 - SOA架构软件平台

电子电器架构 - SOA架构软件平台 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无…

Spring通过工厂方法进行配置

在Spring的世界中&#xff0c; 我们通常会利用 xml配置文件 或者 annotation注解方式来配置bean实例&#xff01; 在第一种利用 xml配置文件 方式中&#xff0c; 还包括如下三小类 反射模式&#xff08;我们前面的所有配置都是这种模式&#xff09;工厂方法模式Factory Bean模…

【Spark官方文档部分翻译】RDD编程指南(RDD Programming Guide)

写在前面 内容如何选择 本翻译只翻译本人认为精华的部分&#xff0c;本人认为的Spark的一些核心理念&#xff0c;编程思想。一些特别基础的操作包括但不限于搭建环境就不在此赘述了。 配套版本 本系列基于Spark 3.3.1&#xff0c;Scala 2.12.10&#xff0c;进行翻译总结 原…

Linux+InternStudio 关卡(test)

任务地址&#xff1a; https://github.com/InternLM/Tutorial/blob/camp3/docs/L0/Linux/task.md 文档 https://github.com/InternLM/Tutorial/blob/camp3/docs/L0/Linux/readme.md 任务 ssh连接 端口映射 gradio页面 笔记&#xff1a; 1.端口映射阶段&#xff1a;输入密…

【BUG】已解决:ModuleNotFoundError: No module named ‘sklearn‘

已解决&#xff1a;ModuleNotFoundError: No module named ‘sklearn‘ 目录 已解决&#xff1a;ModuleNotFoundError: No module named ‘sklearn‘ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是…