C++MFC 面向对象程序设计 小型通讯录管理程序设计

news2024/11/26 9:47:06

课程名称:面向对象程序设计

实验名称:小型通讯录管理程序设计

1.实验目的  

  1. 深入理解面向对象技术的封装性、继承性和多态性,掌握面向对象程序设计方法。
  2. 综合应用C++基础知识实现小型应用程序开发。
  3. 掌握使用C++流类库实现数据文件访问的操作方法。
  4. 熟悉基于对话框的MFC应用程序创建过程,掌握ClassWizard工具和常用控件的使用方法。

C++ MFC实现通讯录系统的实验目的如下:

1.练习使用C++编程语言和MFC框架进行程序开发;

2.学习GUI界面设计及交互操作;

3.了解常用数据结构之一——链表,并能在程序中灵活运用;

4.通过实现通讯录系统,深入理解面向对象的思想和基本概念;

5.提高实践能力和代码调试能力,培养分析和解决问题的能力。

在实现通讯录系统的过程中,你将会学习并掌握大量技术知识和编程方法,例如类定义与继承、成员函数的设计和实现、控件布局和事件响应等。

2.实验环境

1.PC 机 1 台(1G 以上内存)

2.VC++ 6.0 集成开发环境

3.实验内容与要求

设计一个小型通讯录管理程序,实现通讯录文件的新建、保存、以及通讯录的增、删、改、查功能。要求系统用户界面良好,功能完善,性能稳定。

  • 实验步骤      功能需求分析

通讯录系统的主要功能需求:

添加联系人:可以添加新的联系人信息,包括姓名、电话号码、电子邮件地址等;

删除联系人:可以删除已经存在的联系人信息;

查询联系人:可以按照姓名或电话号码来查询已经存在的联系人信息;

修改联系人:可以根据需求修改联系人的姓名、电话号码或者其他信息;

显示联系人:可以查看所有联系人的信息列表,包括姓名、电话号码、电子邮件地址等;

排序联系人:可以按照姓名或者电话号码对联系人列表进行排序;

打印联系人:可以通过打印机将联系人信息打印出来。

在实现通讯录系统时,还需要考虑安全性和用户界面友好性,例如合理设置账户权限、输入验证及错误提示、简洁易懂的操作界面等。通过综合考虑这些功能需求,并加以完善和优化,才能设计出满足用户需求的高效、易用的通讯录系统。

. 基本功能
- 添加联系人
- 删除联系人
- 修改联系人
- 显示联系人信息
2. 附加功能
- 查找联系人
- 读取保存联系人信息

    1. 用户界面设计

通讯录系统的基本界面设计:

主界面:主界面应该有添加、删除、修改、查询等功能按钮,同时要显示所有联系人的信息列表。用户可以通过单击这些按钮或者选中列表中的某一项来进行相应操作。

添加联系人界面:在此界面中,用户需要输入新增联系人的姓名、电话号码等基本信息并保存,或者取消此次添加操作返回主界面。

删除联系人界面:在此界面中,用户需要选择要删除的联系人,并确认是否删除该联系人。如果确认删除则从联系人列表中移除此联系人。

查询联系人界面:在此界面中,用户需要输入搜索条件(例如联系人姓名或者电话号码),然后系统会将符合条件的联系人列出来供用户查看。

修改联系人界面:在此界面中,用户需要先选择要修改的联系人,然后再修改该联系人的基本信息并保存,或者取消此次修改操作返回主界面。

    1. 类的设计
      分别为三个对话框添加类,MailListtDlg ContactAdding ContactModifying分别为本通讯录的主对话框类、添加联系人子对话框类、修改联系人子对话框类。

主对话框的成员变量

子对话框的成员变量

    1. 主要功能模块算法设计

1. 添加联系人模块算法:

算法思想:通过用户输入的信息,创建新的联系人对象,并将该联系人对象添加到通讯录中。

算法流程图:

开始

获取用户输入的联系人信息

创建Contact对象,填充联系人信息

调用ContactList的添加方法,将新联系人添加到列表中

结束

主要实现语句:

```c++

// 获取用户输入的联系人信息

CString name, phone, email;

(nameTxt.GetWindowText(name), phoneTxt.GetWindowText(phone), emailTxt.GetWindowText(email));

// 创建Contact对象

CContact* newContact = new CContact(name, phone, email);

// 将新联系人添加到通讯录列表中

m_contactList.AddContact(newContact);

```

2. 删除联系人模块算法:

算法思想:根据用户选择的联系人,在通讯录列表中删除该联系人对象。

算法流程图:

```

开始

获取用户选中的联系人项

调用ContactList的删除方法,从列表中移除选中联系人

结束

```

主要实现语句:

```c++

// 获取用户选中的联系人ID

int selIndex = contactListCtrl.GetSelectionMark();

if (selIndex != -1) {

  // 从通讯录列表中删除选择的联系人

  m_contactList.DeleteContact(selIndex);

}

```

3. 查询联系人模块算法:

算法思想:根据用户输入的关键字,在通讯录中搜索符合条件的联系人。

算法流程图:

```

开始

获取用户输入的查询关键字

调用ContactList的查找方法,根据关键字搜索联系人

更新UI界面,显示符合条件的联系人

结束

```

主要实现语句:

```c++

// 获取用户输入的查询关键字

CString keyword;

searchText.GetWindowText(keyword);

// 搜索符合条件的联系人并更新UI界面

m_contactList.SearchContacts(keyword);

UpdateData(FALSE);

```

4. 修改联系人模块算法:

算法思想:根据用户选择的联系人,在通讯录中进行修改操作,并将其保存。

算法流程图:

```

开始

获取用户选择的联系人项

展示选中联系人当前信息

获取用户修改后的联系人信息

创建Contact对象,填充修改后的信息

删除旧的联系人,在通讯录列表中添加新联系人

结束

```

主要实现语句:

```c++

// 获取用户选中的联系人ID

int selIndex = contactListCtrl.GetSelectionMark();

if (selIndex != -1) {

  // 展示选中联系人当前信息

  CContact* oldContact = m_contactList.GetContact(selIndex);

  nameTxt.SetWindowText(oldContact->GetName());

  phoneTxt.SetWindowText(oldContact->GetPhone());

  emailTxt.SetWindowText(oldContact->GetEmail());



  // 获取用户修改后的联系人信息

  CString newName, newPhone, newEmail;

  (nameTxt.GetWindowText(newName), phoneTxt.GetWindowText(newPhone), emailTxt.GetWindowText(newEmail));

  // 创建Contact对象

  CContact* newContact = new CContact(newName, newPhone, newEmail);



  // 删除旧的联系人,在通讯录列表中添加新联系人

  m_contactList.DeleteContact(selIndex);

  m_contactList.AddContact(newContact);

}

```
    1. 基于MFC的操作过程

以下是基于MFC框架的通讯录系统的操作过程:

1. 点击通讯录系统的启动图标,系统启动并显示主界面。

2. 在主界面上,用户可以看到所有联系人的信息列表,同时还有添加、删除、查询和修改等按钮,用户可以根据自己的需求进行相应的操作。

3. 如果用户需要添加新联系人,可以单击“添加”按钮,在弹出的添加联系人对话框中输入联系人信息,并单击“确定”按钮确认添加。系统会将新联系人添加到信息列表中。

4. 如果用户需要删除联系人,可以先选中要删除的联系人项,然后单击“删除”按钮,系统会弹出确认删除对话框,用户确定后系统将该联系人从列表中移除。

5. 如果用户需要查询联系人,可以在搜索框中输入关键字,然后单击“查找”按钮,系统会在信息列表中搜索符合条件的联系人并将它们展示在列表中。

6. 如果用户需要修改联系人信息,可以先选中要修改的联系人项,然后单击“修改”按钮,系统会弹出修改联系人对话框,用户可以修改联系人信息并保存。

7. 如果用户需要排序联系人列表,可以选择排序方式(按照姓名或电话号码),然后单击“排序”按钮,系统会将联系人列表按照用户选择的方式进行排序。

8. 当用户想退出程序时,可以单击“退出”按钮,系统提示是否确认退出,用户确认后程序结束运行。

  • 实验结果与总结
    1. 程序测试结果截图    上面的图片贴下来几个

程序测试结果如下:

1. 添加联系人功能测试:添加新的联系人,确认信息是否正确显示在信息列表中。

2. 删除联系人功能测试:选择一个已有的联系人,在确认对话框中确认删除该联系人,然后检查信息列表中该联系人是否被成功移除。

3. 查询联系人功能测试:输入一个关键词,应用搜索功能检验是否获取到符合条件的联系人列表中。

4. 修改联系人功能测试:选择一个已有的联系人,进入修改联系人页面,再次确认改动后联系人信息是否反映到信息列表中。

5. 排序联系人功能测试:选择排序方式,检查联系人列表是否按照指定顺序排列。

6. 错误处理测试:验证系统是否正确处理各种无效输入、错误操作等异常情况,并给出对应的错误提示和解决方案。

以上测试结果均表明通讯录系统能够完成各种功能的预期要求,并在各种测试条件下保持稳定和可靠性。 对于不同类型的用户需求,通讯录系统都能够做出相应的响应和提供合适的解决方案,具有高度可扩展性和灵活性。

实验总结

(对实验过程中涉及的知识点进行总结)

1. 对象导向编程:MFC基于对象导向编程模型(OOP),这种编程方式是一种通过面向对象设计和封装来实现软件组件开发和调用的方法。OOP可以将代码组织成逻辑上相对独立和可复用的类,提高代码重用率和可维护性。

2. 控件和事件处理:在MFC中,通常使用对话框(Dialog)作为程序主窗口,并在其上添加各种控件,例如按钮、文本框、列表框等,以进行用户交互。每个控件都有与之对应的事件处理函数,例如按下按钮或选择列表项时,就会执行相应的事件处理函数。

3. 文件读写操作:在通讯录系统中,需要将数据保存到文件中,MFC提供了丰富的文件读写相关的类库,例如 CFile, CStdioFile 等,可以方便地读写、打开、关闭文件。

4. 数据结构:在MFC通讯录系统中,可以使用链表、数组等数据结构来管理通讯录信息,例如可以使用链表来实现联系人信息的动态添加和删除。

5. 图形界面设计:良好的图形界面设计能够提高整个系统的使用体验和美观度。在MFC中,可以借助视图和控件,采用窗体界面、图标等设计元素,快速实现用户界面布局和交互功能。

总之,以上知识点都是MFC通讯录系统开发中不可或缺的一部分,熟练使用这些知识技能可以帮助我们更好地完成软件开发任务。

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

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

相关文章

LabVIEWCompactRIO 开发指南第七章47 EtherCAT RIO

LabVIEWCompactRIO 开发指南第七章47 EtherCAT RIO 在某些应用中,主I/O和扩展I/O系统需要紧密同步--所有输入和输出必须同时更新。使用确定性总线,主控制器不仅可以知道扩展I/O何时更新,还可以确切地知道数据到达需要多长时间。可以使用NI …

电动葫芦无法运转怎么办?

有关电动葫芦无法起动与运转故障,电动葫芦无法起动怎么办,有没有好的解决办法,检查电源熔丝是否烧断,定子绕组相间短路、接地或断路,以及是否负载过大或传动机械故障等。 电动葫芦无法运转故障怎么办 1、首先&#xf…

vue 3 第二十六章:样式(scoped、深度选择器、全局选择器、css modules、自定义注入名称、css中v-bind)

文章目录 1. 介绍2. 基本使用3. scoped原理4. 深度选择器5. 插槽选择器6. 全局选择器7. 混合使用局部与全局样式8. CSS Modules9. 自定义注入名称10. CSS 中的 v-bind() 1. 介绍 在 Vue 中&#xff0c;我们可以使用 scoped 特性来给组件的样式添加作用域。通过为组件的 <st…

win11 revit2022如何卸载干净

目录结构 杀死相关进程卸载相关应用卸载相关目录删除注册表中的相关数据 注意 &#xff1a;下面的结束任务和删除东西有则删除没有则不用管 杀死相关进程 进入任务管理器&#xff08;control shift esc&#xff09;结束相关任务&#xff08;Autodesk开头的文件和名字中带rev…

交通 | 共乘出行:基于图结构的动态多时空供需网络的均衡度量方法

​ 论文解读 郭王懿&#xff0c;孙楚天&#xff0c;陈泰劼&#xff0c;张云天 ​ 编者按 共乘出行极大地改变了人们的日常出行方式。如何高效运营背后的双边平台是极具挑战性的工作。滴滴出行、Lyft公司是其中的佼佼者。本专题将探讨双边平台运营中的一个关键问题&#xff…

高速吹风筒中的发热丝介绍--【其利天下技术】

高速吹风筒用得发热丝&#xff0c;其实是个大功率的家伙&#xff0c;整个产品它的功耗是最大的。它有什么特别的地方呢&#xff1f;与传统的风筒发热丝&#xff0c;高速风筒发热丝有何要求呢&#xff1f; 一&#xff1a;发热丝工作原理&#xff1a; 发热丝是指由导体材料制成的…

LabVIEWCompactRIO 开发指南第七章46 Ethernet RIO

LabVIEWCompactRIO 开发指南第七章46 Ethernet RIO 使用标准以太网协议扩展I/O时&#xff0c;可以使用NI9148以太网RIO扩展机箱。程序员可以利用现有的网络基础设施&#xff0c;如交换机和路由器。尽管全双工交换机网络消除了数据包冲突&#xff0c;但交换机会引入抖动&#…

LeetCode刷题 --- 哈希表

1. 两数之和 解题思路&#xff1a; 利用哈希表&#xff0c;key存数组当前值&#xff0c;value存数组下标两数之和等于target&#xff0c;可以看做是两个数是配对遍历数组&#xff0c;看哈希表中有没有值和这个当前值配对&#xff0c;如果没有&#xff0c;就存入哈希表如果有&am…

Fiddler抓包工具之fiddler设置过滤

fiddler设置过滤 基本的过滤操作流程以百度为例 步骤&#xff1a; 1、右侧高级工具栏点击Filters》勾选Use Filters》选择Show only Internet Hosts和Show only the following Hosts》在文本框中输入host地址 2、点击Changes not yet saved》再点击Actions》Run Filterset …

【医学图像】图像分割系列.4

介绍几篇使用Transformer结构做医学图像分割的论文&#xff1a;CASTformer&#xff08;NeuralPS2022&#xff09;&#xff0c;PHNet&#xff08;arXiv2023&#xff09;。 Class-Aware Adversarial Transformers for Medical Image Segmentation, NeuralPS2022 解读&#xff1a…

37. C++ 基于范围的for循环、指针空值——nullptr(c++11新特性)

目录 1.基于范围的for循环语法如下&#xff1a; 2.一些编程中的实例 3.指针空值——nullptr c11标准下的NULL和nullptr 今天进行了新的学习&#xff0c;基于范围的for循环。基于范围的 for 循环&#xff08;Range-based for loop&#xff09;是 C11 引入的一种循环结构…

机器学习 监督学习 Week3

Logistic Regression 一个用于分类的算法&#xff0c;模型拟合后&#xff0c;以某些值作为阈值&#xff0c;将数据区分为不同的类别。过去的回归算法中&#xff0c;y的值可以范围很广&#xff0c;而在分类算法中y代表类别&#xff0c;往往只有几个&#xff0c;甚至只有两个(tru…

物联网HMI的关键驱动力—SCADA级功能库和控件库

一、前言 在这个数字化时代&#xff0c;物联网HMI已成为连接人与设备之间的关键纽带&#xff0c;为用户提供直观、智能的交互体验&#xff0c;背后强大的关键驱动力扮演着至关重要的角色&#xff0c;其中SCADA级功能库和控件库的引入成为了物联网HMI设计和开发的核心要素。 S…

论文参考文献怎么引用|Word引用多篇参考文献|word参考文献连续引用|参考文献连续编号|交叉引用

一、参考文献准备 首先将参考文献在段落设置模型中进行编号&#xff0c;通过“交叉引用”对“参考文献”编号引用&#xff0c;以“[x-y]”引用格式实现连续多个文献引用。以实现以[1-3]交叉引用格式来引用[1][2][3] 三个连续参考文献为例说明本方法。 二、参考文献连续编号[…

Redis数据类型之列表List

Redis数据类型之列表List list中的命令如下&#xff1a; lpush&#xff1a;从左边插入&#xff0c;插入的数据是倒叙 LPUSH key value1 [value2] 将一个或多个值插入到列表头部 lpush k1 a b c d e f ; 输出结果 f e d c b a lpop k1; 输出 f 从左边pop弹出时先弹出的是f&…

ESD监控系统、防静电闸机的应用案例

ESD监控系统和防静电闸机是在电子厂、医药厂、半导体厂、航空航天等领域广泛应用的静电措施&#xff0c;可以有效地保护生产线上的产品安全&#xff0c;提高产品质量和可靠性。 近日一家电子元器件公司在其生产线上安装了防静电监控系统、ESD防静电闸机&#xff0c;用于控制人员…

Vue之基本使用

一、前端的发展史 1.HTML(5)、CSS(3)、JavaScript(ES5、ES6)&#xff1a;编写一个个的页面 -> 给后端(PHP、Python、Go、Java) -> 后端嵌入模板语法 -> 后端渲染完数据 -> 返回数据给前端 -> 在浏览器中查看 2.Ajax的出现 -> 后台发送异步请求&#xff0c;…

今天是六一儿童节~身为我们班的信息担当的我为我们班同学准备了一个小惊喜,你确定不来看看吗(turtle库实现:送给同学们一朵小红花)

目录 一.实现思路 二.花朵的实现方法 三.花朵的茎实现方法 四.画出第一片叶子的方法 五.画出第二片叶子的方法 六.如何设置页面主体 结尾 今天呢&#xff0c;也是一年一度的六一儿童节&#xff08;虽然各位大佬可能不过&#xff0c;但是我还是要过的&#xff09;&#xf…

JMeter性能测试零基础完整入门版,视频教程加源码免费看

目录 1. Jmeter简介 2. Jmeter安装 2.1 JDK安装 2.2 JMeter安装 3. 测试实例 3.2 请求参数 3.3 返回结果 4. JMeter脚本编写 4.1 添加线程组 4.2 添加HTTP请求 4.3 添加察看结果树 4.4 添加用户自定义变量 4.5 添加断言 4.6 添加断言结果 4.7 添加聚合报告 5. 执…

Spring Boot如何实现微服务架构中的API网关?

Spring Boot如何实现微服务架构中的API网关&#xff1f; 随着微服务架构的流行&#xff0c;越来越多的企业开始构建自己的微服务系统。在这种情况下&#xff0c;API网关变得尤为重要。API网关是微服务架构中的一个组件&#xff0c;它可以帮助我们管理和路由所有的API请求。Spr…