任务19 简单个人电话号码查询系统

系列文章

任务19 简单个人电话号码查询系统

  1. 问题描述
    人们在日常生活中经常需要查找某个人或某个单位的电话号码,本实验将实现一个简单的个人电话号码查询系统,根据用户输入的信息(例如姓名等)进行快速查询。
  2. 基本要求
    (1) 在外存上,用文件保存电话号码信息;
    (2) 在内存中,设计数据结构存储电话号码信息;
    (3) 提供查询功能:根据姓名实现快速查询;
    (4) 提供其他维护功能:例如插入、删除、修改等;
    (5) 按电话号码进行排序。

文章目录

  • 系列文章
  • 一、实践目的与要求
    • 1、目的
    • 2、要求
  • 二、课题任务
  • 三、总体设计
    • 1.存储结构及数据类型定义
    • 2.程序结构
    • 3.所实现的功能函数
  • 四、小组成员及分工
  • 五、 测试
    • 文件读取
    • 添加联系人
    • 删除联系人
    • 修改联系人
    • 查询联系人
    • 退出
  • 六、源代码获取


一、实践目的与要求

1、目的

通过此次实践环节主要达到以下目的:
(1)进一步理解和运用结构化程序设计的思想和方法,学会根据具体问题选择合理的计算机存储结构实现数据的存储,构造较有效率的算法;
(2)学会算法描述的方法,并编制具有结构清晰、合理和易读性的小型实用程序;
(3)并会设计测试方案,完成程序的测试,能撰写出该程序的技术报告,为文档整理工作打下一个初步的基础;
(4)培养小组成员间互相学习,取长补短,协同工作的能力。

2、要求

(1)模块化程序设计,锯齿型书写格式,代码要有足够的注释;
(2)根据课题中规定的要求实现既定目标;
(3)撰写格式排版规范、结构完整的技术文档。

二、课题任务

(题目、内容及主要功能描述)

简单个人电话号码查询系统

  1. 问题描述
    人们在日常生活中经常需要查找某个人或某个单位的电话号码,本实验将实现一个简单的个人电话号码查询系统,根据用户输入的信息(例如姓名等)进行快速查询。
  2. 基本要求
    (1) 在外存上,用文件保存电话号码信息;
    (2) 在内存中,设计数据结构存储电话号码信息;
    (3) 提供查询功能:根据姓名实现快速查询;
    (4) 提供其他维护功能:例如插入、删除、修改等;
    (5) 按电话号码进行排序。

三、总体设计

1.存储结构及数据类型定义

(采用了什么存储结构、被处理数据定义的数据类型,数据类型定义中要有注释说明)

typedef struct {
    char name[50];
    char phoneNumber[20];
} Contact;

2.程序结构

(程序整体的模块结构图)
在这里插入图片描述

3.所实现的功能函数

(每个功能对应的函数名、函数形参及返回值说明)

void addContact(Contact* contacts, int* count, const char* name, const char* phoneNumber)// 添加联系人 函数名addContact 函数形参Contact* contacts, int* count, const char* name, const char* phoneNumber 函数返回值void 
void deleteContact(Contact* contacts, int* count, const char* name) // 删除联系人 函数名deleteContact 函数形参Contact* contacts, int* count, const char* name 函数返回值void 
void updateContact(Contact* contacts, int count, const char* name, const char* newPhoneNumber) // 修改联系人 函数名updateContact 函数形参Contact* contacts, int count, const char* name, const char* newPhoneNumber 函数返回值void 
const char* findContact(const Contact* contacts, int count, const char* name)// 查询联系人 函数名findContact 函数形参const Contact* contacts, int count, const char* name 函数返回值const char* 
void saveContactsToFile(const Contact* contacts, int count, const char* filename) // 保存联系人到文件 函数名saveContactsToFile 函数形参const Contact* contacts, int count, const char* filename 函数返回值void 
int loadContactsFromFile(Contact* contacts, const char* filename) // 从文件中加载联系人 函数名loadContactsFromFile 函数形参Contact* contacts, const char* filename 函数返回值int 
int comparePhoneNumbers(const void* a, const void* b) //用于比较两个联系人的电话号码 函数名comparePhoneNumbers 函数形参const void* a, const void* b 函数返回值int 
void sortContactsByPhoneNumber(Contact* contacts, int count) 函数名
sortContactsByPhoneNumber 函数形参 Contact* contacts, int count 函数返回值void 
int main(); 函数名main 函数形参无 函数返回值int 

四、小组成员及分工

(组长、组员及每人承担的具体模块任务或其他)
组长:

void addContact(Contact* contacts, int* count, const char* name, const char* phoneNumber)// 添加联系人 函数名addContact 函数形参Contact* contacts, int* count, const char* name, const char* phoneNumber 函数返回值void 
void deleteContact(Contact* contacts, int* count, const char* name) // 删除联系人 函数名deleteContact 函数形参Contact* contacts, int* count, const char* name 函数返回值void 
void updateContact(Contact* contacts, int count, const char* name, const char* newPhoneNumber) // 修改联系人 函数名updateContact 函数形参Contact* contacts, int count, const char* name, const char* newPhoneNumber 函数返回值void 

组员1:

const char* findContact(const Contact* contacts, int count, const char* name)// 查询联系人 函数名findContact 函数形参const Contact* contacts, int count, const char* name 函数返回值const char* 
void saveContactsToFile(const Contact* contacts, int count, const char* filename) // 保存联系人到文件 函数名saveContactsToFile 函数形参const Contact* contacts, int count, const char* filename 函数返回值void 
int loadContactsFromFile(Contact* contacts, const char* filename) // 从文件中加载联系人 函数名loadContactsFromFile 函数形参Contact* contacts, const char* filename 函数返回值int

组员2:

int comparePhoneNumbers(const void* a, const void* b) //用于比较两个联系人的电话号码 函数名comparePhoneNumbers 函数形参const void* a, const void* b 函数返回值int 
void sortContactsByPhoneNumber(Contact* contacts, int count) 函数名
sortContactsByPhoneNumber 函数形参 Contact* contacts, int count 函数返回值void 
int main(); 函数名main 函数形参无 函数返回值int 

五、 测试

(整合各功能模块后的测试结果截图及说明)

文件读取

在这里插入图片描述

添加联系人

在这里插入图片描述

删除联系人

在这里插入图片描述

修改联系人

在这里插入图片描述

查询联系人

在这里插入图片描述

退出

在这里插入图片描述
针对于文件的读写以及数据的排序工作,在添加、删除和修改联系人后调用排序功能,每步都保存在文件中。

六、源代码获取

本次的分享就到这里啦,创作不易,感谢点赞收藏👍
感兴趣的小伙伴可以在评论区留言或者私信我哦💕

提示:代码获取链接: 下载源码

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

k8s 对已完成job自动清理

job在处理完一个任务以后,状态会变成Completed,job在状态为Completed的时候默认不会自动清理的,还会继续占用系统资源。 TTL-after-finished控制器 kubernetes中有专门的控制器可以自动清理已完成的job,就是TTL-after-finished控制器。 TTL…

股东刚减持,股价却起飞?用Python量化A股解禁数据,利空出尽是利好? | 邢不行

2019年6月11日,宁德时代上市一周年之际,有45%的股票迎来了解禁。 这些由大股东、高管、早期投资者持有的股份,原先无法交易,但从这一天起就可以自由卖出了。 很多人出于对解禁后巨大卖盘的担忧纷纷提前卖出,导致宁德时…

如何有效的向 AI 提问 ?

文章目录 〇、导言一、Base LLM 与 Instruction Tuned LLM二、如何提出有效的问题 ?1. 明确问题:2. 简明扼要:3. 避免二义性:4. 避免绝对化的问题:5. 利用引导词:6. 检查语法和拼写:7. 追问细节…

路由器端口映射-原理+图解

文章目录 1. 前言2. 内部服务器3. 内网IP3.1 含义3.2 查询内网IP方法3.3 直观法判断内网IP 4. 内部端口5. 外部端口6. 远程桌面连接7. 端口映射原理图8. 欢迎纠正~ 1. 前言 端口映射就是可将N台主机的内网IP地址映射成一个公网IP地址,从而让外网可以访问到局域网内…

nodejs安装教程

1. 下载 官网地址 https://nodejs.cn/download/ 2. 安装 双击安装包,一直点 Next 安装好后 cmd查看是否安装成功: node -v 查看nodejs版本 npm -v 查看npm版本,npm(node package manager)是nodejs的包管理器&#…

应急响应-web

应急响应的流程分为6个阶段 PDCERF 准备 ,检测,抑制,根除,恢复,总结 准备: 准备阶段就是以预防为主,准备一些应急响应的预案,对应急响应的分工操作制定一些计划,进行应…

设计事务所项目管理指南

在数字化的浪潮下,各行各业都面临着升级转型的问题。对设计团队而言,传统的管理方式已经无法满足日益前进的团队需求。 设计事务所可能存在的管理问题: 1,项目过程中信息流通慢,成员工作进度无法及时同步; …

Dubbo源码篇08---依赖注入和AOP在Dubbo中的实现

Dubbo源码篇08---依赖注入和AOP在Dubbo中的实现 引言依赖注入使用实践 Wrapper机制使用实践注意 引言 前面三篇文章,我们从使用到原理,详细分析了一遍Dubbo SPI机制的实现原理: Dubbo源码篇05—SPI神秘的面纱—使用篇Dubbo源码篇06—SPI神秘的面纱—原…

【JavaSE】Java基础语法(十九):接口新特性

文章目录 1. 接口组成更新概述2. 接口中默认方法3. 接口中静态方法4. 接口中私有方法 1. 接口组成更新概述 常量:接口可以定义全局常量,使用关键字public static final修饰。 抽象方法:接口中可以定义抽象方法,使用关键字public…

首发Yolov8优化:Adam该换了!斯坦福最新Sophia优化器,比Adam快2倍 | 2023.5月斯坦福最新成果

1.Sophia优化器介绍 斯坦福2023.5月发表的最新研究成果,他们提出了「一种叫Sophia的优化器,相比Adam,它在LLM上能够快2倍,可以大幅降低训练成本」。 论文:https://arxiv.org/pdf/2305.14342.pdf 本文介绍了一种新的模型预训练优化器:Sophia(Second-order Clippe…

<Linux开发>驱动开发 -之-基于pinctrl/gpio子系统的beep驱动

<Linux开发>驱动开发 -之-基于pinctrl/gpio子系统的beep驱动 交叉编译环境搭建: <Linux开发> linux开发工具-之-交叉编译环境搭建 uboot移植可参考以下: <Linux开发> -之-系统移植…

完整卸载office以及重装office 2021

完整卸载office以及重装 一.背景 之前很早安装的word最近发现打开,编辑等操作都很卡,而且占用的CPU很多,20%左右,而在网上搜索了一些结果无法解决问题后,决定卸载重装 二. 卸载的建议方法 直接参考官方链接从PC卸载…

Pytest自动化测试框架之Allure报告

简介 Allure Framework是一种灵活的、轻量级、多语言测试报告工具。 不仅可以以简洁的网络报告形式非常简洁地显示已测试的内容, 而且还允许参与开发过程的每个人从日常执行中提取最大程度的有用信息和测试。 从开发/测试的角度来看: Allure报告可以…

弘基笔记本电脑怎么使用U盘重装系统?

弘基笔记本电脑怎么使用U盘重装系统?有的用户的弘基笔记本电脑使用过程中出现了蓝屏的情况,系统频繁的出现蓝屏问题导致自己的使用受到了影响,那么这个情况怎么去进行问题的解决呢?一起来看看以下的解决方法吧。 准备工作&#xf…

直接缓存访问DCA

直接缓存访问DCA:网卡原本DMA写是将接收到的数据帧写入系统内存,DCA机制是网卡DMA写输入的数据能直接发送到属于CPU内部的L2高速缓存中,从而提高网络IO的性能。 设备驱动程序要初始化网卡的DCA功能,将CPU ID号(通过获取…

Unity-vr用眼睛注视选择物体

Unity-vr用眼睛注视选择物体 文章目录 Unity-vr用眼睛注视选择物体工程版本用法说明脚本说明WatchController - 注视主控制器WatchEvent - 注视事件WatchGameobject - 被注视物体TimerTool - 计时器工具 总结 工程版本 unity2019.4.9f1 vs2019 项目工程源代码下载 用法说明 …

技术大佬们都是怎么学习的?

目录 问题 熟悉更多业务 熟悉端到端 自学 Do exercise Learning trying Teaching 问题 今天逛帖子的时候,看到这么个问题: 这个问题我曾经也很好奇过,那些成为技术大佬的人当初是怎么学习,以及怎么成长过来的&#xff0…

私有GitLab仓库 - 本地搭建GitLab私有代码仓库并随时远程访问「内网穿透」

文章目录 前言1. 下载Gitlab2. 安装Gitlab3. 启动Gitlab4. 安装cpolar内网穿透5. 创建隧道配置访问地址6. 固定GitLab访问地址6.1 保留二级子域名6.2 配置二级子域名 7. 测试访问二级子域名 转载自远控源码文章:Linux搭建GitLab私有仓库,并内网穿透实现公…

Makefile

Makefile 1.举一个Makefile的例子2.使用变量3.更省事的方式,让Make 自动推导.PHONY:clean是什么意思?! 4.cmake与Makefile的联系在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下: 1.举一个Makefile的例子 hello_demo : hellospea…

回收站中怎么找回误删除的文件?这几种方法很实用

当我们在电脑上操作文件的时候,难免会有不小心删除文件的情况发生。这个时候,我们可以打开回收站来找回误删除的文件。但是,有时候我们也会误将回收站清空。那么,该怎样才能找回已经误删除的文件呢?在这里提供了回收站…