版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
医用仪器软件设计——基于MFC课程介绍1.课程目标人体生理参数监测系统应用软件(Windows系统)USB传输五参:温度、血压、血氧、呼吸和心电课程介绍2.课程内容MFC开发环境C++语言基础(数组、函数、枚举、指针、引用)面向对象程序设计(封装、继承、多态等)MFC程序设计(对话框、消息映射、函数指针、多线程)打包解包小工具设计实验串口通信小工具设计实验波形绘制小工具设计实验人体生理参数监测系统软件平台布局实验体温/血压/血氧/呼吸/心电监测与显示实验数据存储实验MFC开发环境01Contents.1MFC概述2搭建MFC开发环境3第一个MFC项目新建HelloWorld项目MFC开发界面介绍完善HelloWorld项目设置应用程序图标运行程序发布程序1.MFC概述1.1MFCMFC(MicrosoftFoundationClasses)是微软基础类库的简称,是微软公司实现的一个c++类库,主要封装了大部分的WindowsAPI函数。WindowsAPI函数:Windows操作系统为编写Windows应用程序提供的接口函数。什么是MFC?MFC是一个应用程序框架,可以基于应用框架提供的类库进行快速开发,提高项目开发的效率,减少开发周期,降低开发成本。为什么需要MFC?1.2MFC发展史1.MFC概述时间推出产品说明1990AFX应用程序框架将C++和面向对象编程思想应用于Windows编程,因AFXAPI库与现有WindowsAPI不兼容,未能被程序员接受1992MFC1.0(16位)MicrosoftC/C++7.01993MFC2.0(32位)VisualC++1.01994MFC3.0(32位)VisualC++2.0…1998MFC6.0(32位)VisualC++6.0VisualC++6.0是C++的经典IDE2.1MFC开发环境介绍2.搭建MFC开发环境微软公司的C/C++开发工具包含编辑器、调试器和编译器等,可支持C/C++等编程语言VC++:MicrosoftVisualC++VS:MicrosoftVisualStudio微软提供的完整开发工具集,它包括了整个软件生命周期中所需要的大部分工具可用于C/C++开发,还支持其他许多语言,比如C#、F#、J#、Asp、Web等等VisualC++是VisualStudio的一个部分2.2计算机的配置要求2.搭建MFC开发环境.NETFramework4.6框架MicrosoftVisualStudio2019操作系统:Win7及以上版本CPU:主频不低于2.0GHz内存:4GB或更高,推荐8G硬盘:80G或更大2.3搭建开发环境2.搭建MFC开发环境2.3搭建开发环境安装.NETFramework4.6框架双击相关软件文件夹中的NDP46-KB3045557-x86-x64-AllOS-ENU.exe进行安装若弹出以下窗口,则不需要安装2.搭建MFC开发环境2.3搭建开发环境
安装MicrosoftVisualStudio2019双击相关软件文件夹中的
vs_community__408779306.1590572925.exe弹出以下窗口,点击继续,会进行安装包的下载,此过程需要确保网络通畅注意:VS需在联网状态下安装。若无法联网,可尝试安装补丁文件夹中的KB4490628和KB4474419来解决该问题,双击运行即可开始安装。2.搭建MFC开发环境2.3搭建开发环境
安装MicrosoftVisualStudio2019③勾选“.NET桌面开发”和“使用C++的桌面开发”,并在“可选”中勾选“适用于最新v142生成工具的C++MFC”,点击安装,等待程序安装完成。2.搭建MFC开发环境2.3搭建开发环境
安装MicrosoftVisualStudio2019④安装完成后,若有账户可以选择“登录”,若没有账户可以选择“创建一个”或者“以后再说”。等待程序准备完毕后,在开发设置中选择“VisualC++”,并选择自己喜欢的颜色主题,启动VS。2.搭建MFC开发环境2.3搭建开发环境
安装MicrosoftVisualStudio2019⑤选择“继续但无需代码”,找到工具中的“选项”,点击“文本编辑器”下的“C/C++”目录下的“制表符”,
选择“插入空格”,并将“制表符大小”和“缩进大小”设置成4。3.第一个MFC项目3.1新建HelloWorld项目创建新项目选择项目模板-MFC应用设定项目名称和位置选择应用程序类型-基于对话框选择“在静态中使用MFC”,点击完成
3.第一个MFC项目3.1新建HelloWorld项目创建新项目选择项目模板-MFC应用设定项目名称和位置选择应用程序类型-基于对话框选择“在静态中使用MFC”,点击完成
3.第一个MFC项目3.2MFC开发界面介绍菜单栏工具栏工作视图区编辑区状态栏其他视图区—六大分区3.第一个MFC项目3.2MFC开发界面介绍—工作视图区解决方案资源管理器类视图资源视图菜单栏“视图”→“解决方案资源管理器”菜单栏“视图”→“类视图”菜单栏“视图”→“其他窗口”→“资源视图”3.第一个MFC项目3.3完善HelloWorld项目
“资源视图”-Dialog-IDD_HELLOWORLD_DIALOG打开对话框。选中TODO行,按下delete按键删除控件
“工具箱”-“StaticText”拖动或者单击
选中控件“StaticText”
-“属性”,“描述文字”修改成“HelloWorld”,回车确定。点击工具栏中的水平居中和垂直居中图标,使文字居中3.第一个MFC项目3.3完善HelloWorld项目将图标添加到资源文件中保存图标文件到工程所在文件夹中的“res”文件夹中“资源视图”中右击“Icon”文件夹,选择“添加资源”点击“导入”找到存入“res”文件夹中的图标,点击“打开”在“资源视图”中可以看到新图标的名字为“IDI_ICON1”
3.第一个MFC项目3.4设置应用程序图标设置图标
“解决方案资源管理器”中双击打开Resource.h头文件
弹出的三个窗口全选“是”
将IDI_ICON1的值改成“127”(编译时默认将ID最小的作为.exe文件的图标)3.第一个MFC项目3.4设置应用程序图标3.第一个MFC项目
“解决方案资源管理器”中双击打开HelloWorldDlg.cpp源文件,将第56行代码中的IDR_MAINFRAME修改为IDI_ICON1设置图标3.4设置应用程序图标3.第一个MFC项目单击工具栏中的“本地Windows调试”即可运行程序(Debug模式生成的.exe文件包含了调试信息,占用内存较大)3.5运行程序3.第一个MFC项目切换到“Release”模式,单击“本地Windows调试”可生成发布版程序(Release编译模式生成的.exe文件中去除了所有调试信息,因此占用内存更小,相对执行速度也更快,通常是代码成熟并且测试通过后面向用户市场的版本)将HelloWorld.exe发送至其他计算机(Windows系统),即使计算机未搭建MFC开发环境也可运行HelloWorld.exe程序3.6发布程序3.第一个MFC项目医用仪器软件设计——基于MFCMFC的类与控件02Contents.1字符串类CString2容器类3控件1.字符串类CString1.1MFC的两种编码格式UNICODE编码为宽字节编码,使用Unicode字符集MBCS编码为多字节编码,使用多字节字符集Unicode又称为万国码,是国际组织制定的旨在容纳全球所有字符的编码方案所有的字符都使用两个字节编码的编码模式,以满足跨语言、跨平台的要求MBCS可以使用不同长度的字节编码单字节字符包含拉丁文字母表等双字节字符被用来表示东亚及中东的语言注意:在不同的编码格式下,字符串之间进行相互转换的方法是不一样的。课本用的是多字节字符集。1.字符串类CString1.2_T宏MFC具有两种编码字符集,故两种字符串都支持,分别使用L””(宽字节编码)和””(多字节编码)包裹,_T可以保证转换编码类型时,程序不需要修改,即可以保证两种编码字符集在程序中的兼容。为什么使用_T宏?如何实现_T宏?微软使用统一的_T(””)包裹字符串。在tchar.h文件中可以看到对_T宏的定义:#define_T(x) __T(x)#define_TEXT(x) __T(x)#define__T(x) L##x//编码格式为UNICODE#define__T(x) x//编码格式为MBCSL表示UNICODE编码,以UNICODE格式保存字符串_T可以表示UNICODE,也可以表示MBCS,取决于项目编码格式设置,会自动转换1.字符串类CString1.2_T宏C++基本数据类型中表示字符的有两种:char、wchar_tchar:多字节字符,一个char占一个字节。之所以叫多字节字符是因为表示一个字时可能是一个字节也可能是多个字节。比如:一个英文字符(如’s’)用一个char(一个字节)表示,一个中文汉字(如’中’)用3个char(三个字节)表示。wchar_t类型:宽字符,一个wchar_t占2个字节。之所以叫宽字符是因为所有的字都要用两个字节(即一个wchar_t)来表示,不管是英文还是中文。如何使用_T宏?宽字节编码:L””多字节编码:
””兼容写法:_T(””)UNICODE编码wchar_tstr1[20]=L"Hello";charstr2[20]="Hello";MBCS编码wchar_tstr1[20]=_T("Hello");charstr2[20]=_T("Hello");示例:1.字符串类CString1.3TCHAR类型UNICODE编码格式下: typedefwchar_tTCHAR;TCHAR类型的用途:存储_T(””)类型的通用字符MBCS编码格式下: typedefcharTCHAR;//UNICODE编码格式下TCHARtchar;wchar_twchar;intsize1=sizeof(tchar);//size1值为2,TCHAR表示wchar_tintsize2=sizeof(wchar);//size2值为2,表示wchar_t为宽字符类型//MBCS编码格式下TCHARtchar;chara;intsize1=sizeof(tchar);//size1值为1,TCHAR表示charintsize2=sizeof(a);//size2值为1,表示char为多字节字符类型TCHAR被定义为wchar_t类型(2字节,16位字符类型)TCHAR被定义为char类型(1字节,8位字符类型)示例:1.字符串类CString1.4CString构造函数CString类中有多种构造函数,下面简单介绍常用的几种:CString();默认构造函数,构造一个空的字符串对象。
CStringstr;CString(constCString&stringSrc);将一个已知CString对象stringSrc的内容拷贝到该CString对象。
CStringstr1(_T("HelloWorld")); //str1=="HelloWorld"
CStringstr2(str1); //str2=="HelloWorld"CString(LPCTSTRlpch,intnLength);将字符串lpch中的前nLength个字符拷贝到该CString对象。 CStringstr(_T("HelloWorld“),5); //str=="Hello"CString(TCHARch,intnRepeat);构造一个含有nRepeat个ch的字符串。
CStringstr(_T('w‘),3); //str=="www"1.字符串类CString1.5编辑字符串CString类中提供了很多简便的函数来编辑字符串,下面简单介绍常用的函数:Insert()在指定位置插入字符或字符串,并返回插入后的字符串的长度。
函数原型为intInsert(intnIndex,TCHARtChar)或intInsert(intnIndex,LPCTSTRpstr) nIndex:插入位置的索引值;tChar:待插入的字符;pstr:待插入的字符串。
示例: CStringstr(_T("Hello")); //str="Hello"
intn=str.Insert(5,_T("World")); //str="HelloWorld",n=10
intm=str.Insert(10,_T("!")); //str="HelloWorld!",m=11Remove()在字符串中移除指定的字符,并返回移除的字符的数目。
函数原型为intRemove(TCHARtChar)tChar:待移除字符
示例: CStringstr(_T("Hello")); //str="Hello"
intn=str.Remove(_T('l')); //str="Heo",n==21.字符串类CString1.5编辑字符串Replace()替换当前字符中的字符或字符串,并返回替换的数目,若在当前字符串中不存在,则返回0。
函数原型为intReplace(TCHARchOld,TCHARchNew)或intReplace(LPCTSTRlpszOld,LPCTSTRlpszNew)chOld/lpszOld指定的字符或字符串将被参数chNew/lpszNew替换
示例: CStringstr(_T("tooth")); //str="tooth"
intm=str.Replace(_T('o'),_T('e')); //str="teeth",m=2
intn=str.Replace(_T(“ee”),_T(“oo”)); //str="tooth",n=1
intt=str.Replace(_T(“bb”),_T(“oo”)); //str="tooth",t=0Delete()在当前字符串的指定位置移除指定数量的字符,并返回值已改变的字符串的长度。
函数原型为intDelete(intnIndex,intnCount) nIndex:移除位置的索引值;nCount:待移除字符的数量。
示例: CStringstr(_T("early")); //str="early"
intd=str.Delete(3,2); //str="ear",d=31.字符串类CString1.5编辑字符串SetAt()修改当前字符串中指定位置的字符。
函数原型为VoidSetAt(intnIndex,TCHARtChar)nIndex:修改位置的索引值;tChar:修改后的字符。
示例: CStringstr(_T("book")); //str="book"
str.SetAt(0,_T('l')); //str="look"Mid()从当前字符串中的指定位置往后截取指定长度的字符串并返回。
函数原型为CStringMid(intnFirst,imtnCount)nFirst:截取位置的索引值;nCount:裁取字符串的长度。
示例: CStringstr1(_T("PackUnpackDemo")); //str1="PackUnpackDemo"
CStringstr2=str1.Mid(4,6); //str2="UnpackLeft()和Right()从当前字符串的开头或结尾截取指定长度的字符串并返回。
函数原型分别为CStringLeft(intnCount)和CStringRight(intnCount)nCount:截取字符串的长度。
示例: CStringstr1(_T("PackUnpackDemo")); //str1="PackUnpackDemo"
Cstringstr2=str1.Left(4); //str2="Pack"
CStringstr3=str1.Right(4); //str3="Demo"1.字符串类CString1.6字符串查询CString类中提供了很多简便的函数来查询字符串,下面简单介绍常用的函数:函数功能str(例子)形式返回值GetLength()返回当前字符串中字符的个数“Length”intnumber=str.GetLength();number=6GetAt()获取当前字符串中指定位置的字符并返回“Length”TCHARtChar=str.GetAt(3);tChar='g'IsEmpty()判断当前字符串是否为空“Length”BOOLflag1=str.IsEmpty();flag1=0空BOOLflag2=str.IsEmpty();flag2=1Find()在当前字符串(或指定位置往后)中查找指定字符或字符串首次出现的位置并返回,未找到则返回-1“HelloWorld”inta=str.Find(_T('o'));a=4intb=str.Find(_T(“ll”));b=2intc=str.Find(_T('o'),5);c=6intd=str.Find(_T(“ll“),5);d=-11.字符串类CString1.7字符串转换除了编辑和查询,字符串常还需要与其他数值类型或字符集进行转换,下面简单介绍常用的函数:函数功能str/num(例子)形式返回值_ttoi()字符串转换为整型“12”intnumber=_ttoi(str);number=12_ttof()字符串转为浮点型“1.23”floatnumber=_ttof(str);number=1.23Format()将其他类型数值转换为字符串number=25pi=3.14159str1.Format(_T("%d"),number);str1="25"str2.Format(_T("%3o"),number);str2=“31",转8进制,不足3位在前面补空格str3.Format(_T("%.4x"),number);str3="0019",转16进制,不足4位在前面补0str4.Format(_T("%4.1f"),pi);str4=“3.1",保留小数点后1位,不足4位在前面补空格MakeUpper()MakeLower()将当前字符串转化为大写和小写“HelloWorld”str.MakeUpper();str="HELLOWORLD"str.MakeLower();str="helloworld"MakeReverse()所有字符颠倒顺序“reed”str.MakeReverse();str="deer"2.容器类vector2.1容器类介绍vector是个封装了动态大小数组的顺序容器(SequenceContainer),它能够存放各种类型的对象,可以简单的理解为,向量vector是一个能够存放任意数据类型的动态数组,其主要特点如下:顺序序列:顺序容器中的元素按照严格的线性顺序排序,可以通过元素在序列中的位置访问对应的元素。动态数组:支持对序列中的任意元素进行快速直接访问,甚至可以通过指针进行该操作。还提供了在序列末尾相对快速地添加或删除元素的操作。内存分配器:使用一个内存分配器对象来动态处理存储需求。注意:vector类是随标准C++引入的标准库的一部分,使用时需要包含头文件:#include<vector>2.容器类vector2.2vector的定义和初始化vector类提供了多种构造函数,常用的几种:注意:使用vector前需要先引入命名空间:usingnamespacestd,或在进行vector定义时添加std::前缀vector():创建一个空vector。vector(intnSize):创建一个vector,元素个数为nSize,初始值默认为0。vector(intnSize,constT&t):创建一个vector,元素个数为nSize,且值均为t。vector(constvector&x):复制构造函数。vector类的用法举例:std::vector<int>list1; //list1为空std::vector<int>list2(10); //list2中存有10个整型数据,值都为0std::vector<int>list3(10,2); //list3中存有10个整型数据,值都为2std::vector<int>list4(list3); //list4中存有10个整型数据,值都为22.容器类vector2.3vector的常用成员函数push_back()在向量尾部增加一个元素。pop_back() 删除向量中的最后一个元素。clear() 清空向量中的所有元素。size() 返回向量元素的个数。empty() 判断向量是否为空,是则返回true,否则返回false。
示例: vector<int>list(2); //list2中存有2个整型数据,值都为0
intnumber=list.size(); //number=2
list.push_back(1); //添加1个元素
number=list.size(); //number=3
list.pop_back(); //删除最后1个元素
number=list.size(); //number=2
list.clear(); //清空list
boolflag=list.empty(); //flag=true
number=list.size(); //number=03.控件3.1按钮Button功能:用于接收用户命令,应用程序在接收到用户命令后,通常需要进行一些后台工作。按钮可以响应单击或双击动作,在按钮检测到动作后,向其父窗口发送相应的通知,程序可以根据通知的类型进行相应的逻辑处理。描述文字:显示在控件上的文本ID:该控件在项目中的资源ID,建议根据控件的功能对应修改控件的ID,增加控件的辨识度和代码的可读性编号3的区域:该控件在设计界面中的坐标(以左上角为原点)编号4的区域:该控件的尺寸属性属性3.控件3.1按钮Button对齐和预览将3个按钮全选,对话框编辑器的对齐功能都转变为可用状态(大部分按钮在只选中一个控件时不可用)。鼠标悬停即可预览按钮的功能。点击该按钮可以在不可编译运行项目的情况下预览该对话框的运行效果功能从左到右为:左对齐右对齐顶端对齐底端对齐垂直居中水平居中横向等间距纵向等间距使宽度相同使高度相同使大小相同3.控件3.1按钮Button消息映射MFC提供了消息映射机制来处理按钮的单击和双击等触发事件。3.控件3.2复选框CheckBox功能:CheckBox控件提供一个带有文本标签的复选框,可以打开(选中)或关闭(取消选中)。当一组复选框提供多个选项时,同一时间可以有任意个复选框处于选中状态,且各个复选框之间相互独立,互不影响。操作复选框的方法:为复选框控件添加一个Cbutton类变量通过该变量即可调用CButton类中的函数SetCheck()函数设置复选框的勾选状态GetCheck()函数获取复选框当前的状态3.控件3.3编辑框EditControl功能:编辑框EditControl用来接收用户输入的文本。操作编辑框的方法:为编辑框控件添加一个CEdit类变量通过该变量即可调用CWnd类(CEdit类继承自该类)中的函数
GetWindowText()函数获取编辑框中的文本
SetWindowText()函数设置编辑框中的文本3.控件3.4组合框ComboBox功能:组合框ComboBox为编辑框和列表框的组合。共有3种类型:操作组合框的方法:为组合框控件添加一个CComboBox类变量通过该变量即可调用CComboBox类中的函数 AddString()函数向组合框的选项列表中添加选项
SetCurSel()函数将选项列表中的某一项设置为组合框的当前选项 GetCurSel()获取组合框的当前项在选项列表中的索引简易(Simple)组合框:直接显示组合框中的选项列表框,单击任一项即可将其设置为组合框的当前项,选项的内容可编辑下拉式(Dropdown)组合框:默认不显示选项列表框,只有在单击组合格右侧的下拉按钮时才会弹出,单击任一项即可将其设置为组合框的当前项,选项的内容可编辑下拉列表(DropdownList)式组合框:与下拉式组合框的唯一区别是选项的内容不可编辑注意事项:下拉列表添加选项:在“数据”选项中添加选项的文本即可,各个选项之间用英文格式的分号“;”隔开将“排序”选项后的True改为False:目的是让选项列表按照用户在“数据”选项中输入的顺序显示,否则系统可能会将输入的选项重新排序3.控件3.5列表框ListBox功能:列表框ListBox控件提供一个选项列表,可分为单选列表框和多选列表框,取决于用户对控件的属性设置。单选列表框中一次只能选择一个列表项,而多选列表框可以同时选择多个列表项,被选中的项会高亮显示。操作列表框的方法:为列表框控件添加一个CListBox类变量通过该变量即可调用CListBox类中的函数 AddString()函数向选项列表中添加选项 ResetContent()函数清除所有选项3.控件3.6分组框GroupBox功能:分组框GroupBox为容器类控件,提供一个带标题的边框,用来容纳具有逻辑关系的一组控件。注意,分组框仅仅是在视觉效果上对其中的控件进行组合,在逻辑上并无关联。3.控件3.7单选按钮RadioButton功能:RadioButton控件提供一个带有文本标签的单选按钮。在实际应用中,通常由多个单选按钮组成一组,同组中最多只能有一个单选按钮处于选中状态,当选中其他未选中的按钮时,先前处于选中状态的按钮会取消选中。操作单选按钮的方法:为单选按钮控件添加一个CButton类变量通过该变量即可调用CButton类中的函数 SetCheck()函数设置单选按钮的选中状态 GetCheck()函数获取单选按钮的当前状态3.控件3.7单选按钮RadioButton多组单选按钮分组的方法:显示控件优先级:菜单命令“格式”→“Tab键顺序”设置组内优先级高的单选按钮属性:“组”选项改为True系统按照Tab键顺序进行检测,当检测到“组”属性为True的单选按钮时,开启一个新的分组3.控件3.8静态文本StaticText功能:StaticText控件用于显示文本或图像。操作静态文本的方法:为静态文本控件添加一个CStatic类变量通过该变量即可调用CWnd类(CStatic类继承自该类)中的函数
GetWindowText()函数获取文本
SetWindowText()函数设置文本3.控件3.9图形控件PictureControl功能:PictureControl控件用于显示位图(Bitmap)和图标(Icon)。操作图形控件设置图标的方法:打开图形控件的属性视图将“类型”选项设置为Icon将“图像”选项设置为IDR_MAINFRAME(项目自带的资源文件)将“边框”选项设置为True,为图标添加边框医用仪器软件设计——基于MFCC++语言基础03Contents.1HelloWorld实验2简单的秒值-时间转换实验3基于数组的秒值-时间转换实验4
基于函数的秒值-时间转换实验5基于枚举的秒值-时间转换实验6基于指针的秒值-时间转换实验7基于引用的秒值-时间转换实验1.HelloWorld实验1.1实验内容通过VisualStudio的控制台创建HelloWorld.cpp文件,并对该文件进行编译和执行。1.HelloWorld实验1.2实验原理命名规范C++是大小写敏感的编程语言,即Hello与hello是不同的。本书中涉及到的类名、函数名的命名规范如下:类名和函数名:类名和函数名的首字母均为大写,如果名称由若干单词组成,那么每个单词的首字母均为大写,例如MyFirstClass。1.HelloWorld实验1.2实验原理C++程序结构以HelloWorld实验为例介绍C++的程序结构,程序清单如下:#include<iostream>usingnamespacestd;intmain(){cout<<"HelloWorld!"<<endl;return0;}#include作用:用于引用其他文件的内容。编译时,在使用include的文件中,将include所在行替换为其文件内容。符号区别:<>引用标准库;“”引用自定义文件namespace作用:命名空间,在命名重复的情况下进行区分main()函数作用:程序运行时,第一个执行的函数cout<<"HelloWorld!"<<endl;作用:编译器输出“HelloWorld!”并换行
1.HelloWorld实验1.3实验步骤创建“控制台应用”添加代码运行程序:Ctrl+F52.简单的秒值-时间转换实验2.1实验内容
一天有24小时、一小时有60分钟,一分钟有60秒,因此,一天就有24×60×60=86400秒,如果从0开始计算,每天按秒计数,则范围为0~86399。通过键盘输入一个0~86399之间的值,包括0和86399,将其转换为小时值、分钟值和秒值,并输出到VisualStudio的控制台。入口函数:main变量:小时hour,分钟min,秒sec输入:cin运算输出:cout2.简单的秒值-时间转换实验2.2实验原理—变量命名规范变量类型变量说明命名规范举例局部变量函数中的变量第一个单词首字母小写,后续单词的首字母大写,其余字母小写格式heartRate全局变量函数外的变量g字母开头,后续单词的首字母大写,其余字母小写格式gHeartRate成员变量类中的成员变量m字母开头,后续单词的首字母大写,其余字母小写格式mHeartRate静态变量static关键字声明s字母开头,后续单词的首字母大写,其余字母小写格式sHeartRate常量const关键字声明所有字母大写,不同单词之间用下画线隔开的格式HEART_RATE2.简单的秒值-时间转换实验2.2实验原理类型存储空间范围char1字节-27~(27-1)或0~(28-1)unsignedchar1字节0~(28-1)signedchar1字节-27~(27-1)int4字节-231~(231-1)unsignedint4字节0~(232-1)signedint4字节-231~(231-1)shortint2字节-215~(215-1)unsignedshortint2字节0~(216-1)signedshortint2字节-215~(215-1)longint8字节-263~(263-1)signedlongint8字节-263~(263-1)unsignedlongint8字节0~(264-1)float4字节-2128~(2128-1)double8字节-21024~(21024-1)longdouble16字节-216384~(216384-1)wchar_t2字节或4字节1个宽字符—C++基本数据类型2.简单的秒值-时间转换实验2.2实验原理输出流:cout是iostream库中ostream类型的一个对象,与流插入运算符“<<”结合使用,在代码语句末尾通过endl换行。
示例:intcurrNum=12;
cout<<"Currentnumis"<<currNum<<"."<<endl;
打印出如下信息:Currentnumis12.输入流:cin是iostream库中istream类型的一个对象,与流提取运算符“>>”结合使用。
示例:intcurrNum;
cout<<"请输入数字:"; cin>>currNum;—标准输入输出流2.简单的秒值-时间转换实验2.2实验原理算术运算符格式说明+A+B加法,相加运算符两侧的值-A–B减法,左操作数减去右操作数*A*B乘法,相乘操作符两侧的值/A/B除法,左操作数除以右操作数的商%A%B取余,左操作数除以右操作数的余数++A++或++A自增,操作数的值增加1--A--或--A自减,操作数的值减少1计算小时、分钟、秒值hour=tick/3600; //tick对3600取商赋值给hour
min=(tick%3600)/60; //tick对3600取余后再对60取商赋值给min
sec=(tick%3600)%60; //tick对3600取余后再对60取余赋值给sec—运算C++中的算术运算符2.简单的秒值-时间转换实验2.3代码分析代码运行结果:3.基于数组的秒值-时间转换实验3.1实验内容通过键盘输入一个0~86399之间的值,包括0和86399,将其转换为小时值、分钟值和秒值,而小时值、分钟值和秒值为数组arrTimeVal的元素,即arrTimeVal[2]为小时值、arrTimeVal[1]为分钟值、arrTimeVal[0]为秒值,并输出转换结果。入口函数:main变量:数组存储输入:cin运算输出:cout3.基于数组的秒值-时间转换实验3.2实验原理—数组数组的介绍:用于数据的存储,一旦定义一个数组,其中只能存放一种数据类型。数组的特点:①长度确定,因为数组一旦被创建,它的元素个数就不可改变;②各元素类型必须相同,不允许出现混合类型。创建数组直接声明:数据类型数组名[数组长度];使用new运算符创建动态数组:数据类型*数组名=new数据类型[数组长度];数组初始化创建数组时赋值:数据类型数组名[数组长度]={值1,值2…};数据类型数组名[]={值1,值2…};先创建再for循环赋值:intarr[4];for(inti=0;i<4;i++){arr[i]=i+1;//数组赋值arr[4]={1,2,3,4}}使用数组数组名[索引值]注意:数组索引值从0开始3.基于数组的秒值-时间转换实验3.3代码分析4.基于函数的秒值-时间转换实验4.1实验内容通过键盘输入一个0~86399之间的值,包括0和86399,用CalcHour()函数计算小时值,用CalcMin()函数计算分钟值,用CalcSec()函数计算秒值,在主函数中通过调用上述三个函数实现秒值-时间值转换,并输出转换结果。入口函数:main变量:小时hour,分钟min,秒sec输入:cin运算输出:cout4.基于函数的秒值-时间转换实验4.2实验原理—函数函数的作用:将一段经常使用的代码封装起来,完成某个功能操作,便于以后他人使用。每个C++程序至少有一个函数,即main()函数,作为入口函数。函数的定义修饰符返回值类型函数名(参数类型参数名1,参数类型参数名2,…){
函数体 (return返回值;)}修饰符:一般情况下不写,用于定义函数的访问类型,如virtual、static。返回值类型:函数返回值的数据类型,若无返回值使用void,函数体中不需要return语句。函数名:函数的实际名称。要求见名知意,命名采用第一个单词首字母大写,如果名称由若干单词组成,那么每个单词的首字母均为大写,其余字母小写的格式命名。参数列表:带有数据类型的变量名列表,称为形参。表示函数的不确定因素。函数的声明:若自定义函数位于main函数之后,需要在main函数之前进行声明。4.基于函数的秒值-时间转换实验4.3代码分析5.基于枚举的秒值-时间转换实验5.1实验内容通过键盘输入一个0~86399之间的值,包括0和86399,使用CalcTimeVal()函数计算时间值(包括小时值、分钟值和秒值),通过枚举区分具体是哪一种时间值,返回值为计算出的时间值,在main()函数中通过调用CalcTimeVal()实现秒值-时间值转换,并输出转换结果。入口函数:main变量:小时hour,分钟min,秒sec输入:cin运算输出:cout5.基于枚举的秒值-时间转换实验5.2实验原理—枚举使用场景:一个变量只有几种可能的值,通过枚举把可能的值一一列举出枚举类型enumEnumTimeVal{TIME_VAL_HOUR,TIME_VAL_MIN,TIME_VAL_SEC,}关键字:enum使用注意:枚举类型一旦定义,枚举就相当于全局常量,在switch…case…语句中直接使用枚举常量,不需要枚举类型switch…case…语句作用:判断一个变量与一系列值中某个值是否相等switch(表达式){case常量值1:
语句块1 [break;]…case常量值n:
语句块n [break;]default:
语句块n+1 [break;]}switch语句中表达式的值必须与case常量值的数据类型相同。规则如下:(1)当表达式的值与case常量值相等时,则执行case语句后面的语句块,直到遇到break语句为止。当遇到break语句时,程序跳转到switch…case…语句后面的语句执行。(2)case语句并不一定都要包含break语句,如果没有break语句,程序会继续执行下一条case语句,直到出现break语句为止。(3)default语句在没有case常量值和表达式的值相等的时候执行。enum枚举类型名{
枚举常量1,
枚举常量2,
…..}5.基于枚举的秒值-时间转换实验5.3代码分析6.基于指针的秒值-时间转换实验6.1实验内容通过键盘输入一个0~86399之间的值,包括0和86399,将其转换为小时值、分钟值和秒值,并且将小时值、分钟值和秒值分别存放在指针p的(p+2)地址、(p+1)地址和(p+0)地址,最后输出转换结果。入口函数:main变量:指针输入:cin运算输出:cout6.2实验原理—指针6.基于指针的秒值-时间转换实验指针的含义:指针是一个变量,它的值为另一个变量的地址,即内存位置的直接地址。可通过指针保存地址(&取地址符,获取变量的地址)可通过指针访问内存(*解引用符,访问指针指向的内存)内存编号从0开始,用十六进制数表示内存地址,32位系统占4个字节,64位系统占8个字节指针变量的定义语法:数据类型*变量名;指针访问内存:通过解引用(指针前加*)来找到指针指向的内存指针指向整型变量:inta=1; //定义整型变量aint*p; //定义整型指针p=&a; //指针指向变量地址,&代表取地址*p=88; //通过指针修改变量a的值指针所占内存空间:32位系统占4个字节,64位系统占8个字节cout<<"p所占内存空间="<<sizeof(p)<<endl;
cout<<"p所占内存空间="<<sizeof(int*)<<endl;6.2实验原理—空指针6.基于指针的秒值-时间转换实验空指针的含义:赋为NULL值的指针被称为空指针,空指针指向内存中编号为0的空间。空指针的用途:初始化指针变量int*p;*p=10;//程序报错指针的初始化建议:为所有未使用的指针赋NULL值,同时在使用指针前对指针进行判空处理,就可以防止误用一个未初始化的指针注意1:使用未初始化的指针是引发运行时错误的一大原因注意2:空指针指向的内存为系统占用,不可访问int*p1=NULL;*p1=100;//程序崩溃inta=1;
int*p3=NULL;p3=&a;if(NULL!=p3)//使用指针前对指针进行判空处理
*p3=8;6.2实验原理—释放内存6.基于指针的秒值-时间转换实验背景介绍:当程序的内存需求只能在运行时确定时需进行动态内存分配。例如,当需要的内存取决于用户输入。在这些情况下,程序需要动态分配内存,使用结束时需要显式地释放内存。释放内存的两种方式:通过new分配的内存使用delete来释放内存通过malloc分配的内存使用free来释放内存释放内存带来的问题:delete和free只是释放了指针指向的内存,指针本身未被释放,此时指针存储的是一些垃圾值,就是通常所说的“野指针”。“野指针”指向已经释放的内存可能会导致数据错乱。解决方案:在执行释放内存操作后,应该及时将指针指向NULL地址6.2实验原理—指针操作一维数组6.基于指针的秒值-时间转换实验创建动态数组数据类型*数组名=new数据类型[数组长度];动态数组的长度可在运行中确定数组指针变量名=数组名(都指向数组第一个元素地址)数组元素存放在连续地址空间中(一个存储单元存储一个字节)数组指针类型和数组数据类型需保持一致创建长度为4的动态整型数组:int*arr=newint[4];for(inti=0;i<4;i++){*(arr+i)=i+1;//同arr[i]=i+1;}通过指针给数组赋值1234数组名:arrarr[0]arr[1]arr[2]arr[3]*(arr+0)*(arr+1)*(arr+2)*(arr+3)6.3代码分析6.基于指针的秒值-时间转换实验7.基于引用的秒值-时间转换实验7.1实验内容通过键盘输入一个0~86399之间的值,包括0和86399,声明小时值、分钟值的引用,操作引用别名获取转换的小时值和分钟值;定义一个转换秒值的函数,将引用作为形参,然后调用该函数获取转换的秒值,最后输出转换结果。入口函数:main变量:引用输入:cin运算:引用输出:cout7.2实验原理—引用7.基于引用的秒值-时间转换实验引用的含义:对某个已存在的变量重新定义一个名字。相当于给变量起的别名,绑定到变量上。引用的语法:数据类型&别名=原名;使用注意事项:引用必须初始化引用一旦初始化,不可重新引用其他变量引用的好处:引用可以用来指向其他变量,其本质是指针常量(指针指向不可更改),引用的优势在于其语法要比指针简单很多。7.2实验原理—&和*多重含义区分7.基于引用的秒值-时间转换实验符号的上下文决定了符号的意义用于声明的一部分,组成复合类型用于表达式里的运算符
inti=10;int&r=i;//&紧随类型名出现,因此是声明的一部分,r是一个引用
int*p;//*紧随类型名出现,因此是声明的一部分,p是一个指针
p=&i;//&出现在表达式中,是一个取地址符*p=i;//*出现在表达式中,是一个解引用符7.3代码分析7.基于引用的秒值-时间转换实验医用仪器软件设计——基于MFC面向对象程序设计04Contents.1类的封装实验2类的继承实验3类的多态实验4
重载实验5抽象类实验6接口实验7异常处理实验0类的基础知识0.类的基础知识0.1面向对象和面向过程函数1:打开冰箱(){人站在冰箱前,打开冰箱。。。}函数2:储存大象(){大象先迈左腿,再迈右腿。。。}函数3:关闭冰箱(){人站在冰箱前,关闭冰箱。。。}以事物为中心以分类的方式解决问题用类组织代码以过程为中心用函数组织代码按步骤去解决问题人{打开(冰箱){冰箱.打开();}存储(大象){大象.进入();}关闭(冰箱){冰箱.关闭();}}性能高易维护,易使用,易扩展优点编程思想面向过程面向对象举例特点人把大象装进冰箱冰箱{打开(){}关闭(){}}大象{进入(冰箱){}}共同点相辅相成,并不是对立。整体上用面向对象把控,细节上用面向过程解决。0.类的基础知识0.2类和对象具有共同属性和行为的事物的抽象客观存在的事物皆为对象对象是类的实例类是对象的模板面向对象类对象举例特点联系0.类的基础知识0.3类的定义类:对现实生活中具有共同属性和行为的事物的抽象。类的组成:属性和行为属性:在类中通过成员变量来体现(类中函数外的变量)行为:在类中通过成员函数来体现定义类的步骤定义类名确定成员的访问权限:默认private权限,可连续共用访问权限添加属性(变量)/行为(函数){}后添加分号;class类名{
访问权限:
变量1的数据类型变量1;
变量2的数据类型变量2; ……
函数1;
函数2;
……};类名:人(Person)属性:姓名(name)年龄(age)身高(height)性别(sex)行为:吃饭(eat)睡觉(sleep)自我介绍(introduce)0.类的基础知识创建对象格式:类名对象名;示例:Personp;Personp;对象类型对象名称使用对象1、使用成员变量格式:对象名.变量名;示例:;2、使用成员函数格式:对象名.函数名();示例:p.eat();0.4对象的使用0.类的基础知识0.5构造函数和析构函数格式:class类名{
类名(参数){
}
~类名(){}}括号法调用构造函数:intmain(){
Personp; //调用默认无参构造函数
Personp1(10); //调用有参构造函数}作用构造函数:创建对象时为对象的属性赋值,由编译器自动调用析构函数:执行对象的清理工作,对象销毁前系统自动调用语法构造函数:类名(){}函数名与类名相同没有返回值,也不写void注意:如果定义了构造函数,系统将不再提供默认的构造函数。建议时刻保留无参构造函数的存在。使用隐式调用:如果不写构造和析构函数,编译器会默认提供空实现的无参函数显式调用:构造函数可以有参数,可发生重载;析构函数不能带有参数析构函数:~类名(){}函数名与类名相同,名称前加符号~没有参数,没有返回值,也不写void1.类的封装实验1.1实验内容
创建CalcTime类,在类中依次定义用于保存小时值、分钟值和秒值的成员变量mHour、mMin和mSec;用于指定小时值、分钟值和秒值的常量TIME_VAL_HOUR、TIME_VAL_MIN和TIM_VAL_SEC;用于计算三个时间值的CalcTimeVal()函数;用于获取三个时间值的GetTimeVal()函数。创建ConvertTime类,在类中创建CalcTime类型的对象,通过对象分别获取转换的小时值、分钟值和秒值,然后通过cout输出转换结果。其中,CalcTime类中的CalcTimeVal()、GetTimeVal()和三个常量访问属性为public,其余的成员变量访问属性为private。在main()函数中获取键盘输入值(0~86399之间的值,包括0和86399),然后,实现秒值-时间值转换,并输出转换结果。1.类的封装实验1.2实验原理—封装封装的概念:封装是把过程和数据包围起来,提供相应的方式进行获取。类是封装的一种体现,类将属性和行为作为一个整体,用来表现生活中的事物。封装主要用于信息隐藏,通过关键字private,protected和public实现属性和行为的权限控制。通俗地说,把该隐藏的隐藏起来,该暴露的暴露出来。如何进行封装(以属性封装为例):(1)将属性私有化:利用权限修饰符来控制权限,防止被随意获取(2)在方法中进行属性的读写(获取和设置),写权限可以检测数据有效性封装的好处:提高代码的安全性1.类的封装实验1.3代码分析创建CalcTime类,在类中依次定义用于保存小时值、分钟值和秒值的成员变量mHour、mMin和mSec;用于指定小时值、分钟值和秒值的常量TIME_VAL_HOUR、TIME_VAL_MIN和TIM_VAL_SEC;用于计算三个时间值的CalcTimeVal()函数;用于获取三个时间值的GetTimeVal()函数。创建ConvertTime类,在类中创建CalcTime类型的对象,通过对象分别获取转换的小时值、分钟值和秒值,然后通过cout输出转换结果。其中,CalcTime类中的CalcTimeVal()、GetTimeVal()和三个常量访问属性为public,其余的成员变量访问属性为private。在main()函数中获取键盘输入值(0~86399之间的值,包括0和86399),然后,实现秒值-时间值转换,并输出转换结果。
UML类图【箭头指向】带普通箭头的实线,指向被拥有者。【权限符号】【关联关系】是一种拥有关系,它使得一个类知道另一个类的属性和方法。2.类的继承实验2.1实验内容创建一个父类CalcTime,在父类中依次定义用于保存小时值、分钟值和秒值的成员变量mHour、mMin和mSec;用于指定小时值、分钟值的常量TIME_VAL_HOUR和TIME_VAL_MIN;用于计算小时值和分钟值,同时获取对应值后向外输出的GetTimeVal()函数。然后定义一个继承父类的CalcAllTime子类,在子类中定义用于计算秒值,同时获取对应值向外输出的GetSecVal()函数;用于判断tick是否符合条件的CalcFlg()函数;用于打印转换结果的DispTime()函数。在main()函数中创建一个CalcAllTime型对象,该对象名为ct,然后获取键盘输入值(0~86399之间的值,包括0和86399),实现秒值-时间值转换,并输出转换结果。2.类的继承实验2.2实验原理继承的格式格式:class子类名:继承方式父类名{}范例:classStudent:publicPerson{}Person:是父类,也被称为基类、超类Student:是子类,也被称为派生类继承的介绍:继承可以使得子类具有父类的属性和方法,还可以在子类中重新定义追加属性和方法。注意事项:继承必须在合理的范围内进行向上抽取。可以说:学生是人,狗是动物
不能说:狗是人继承的好处:减少重复代码。—继承学生类:Student
属性:国籍,姓名,学生号
方法:自我介绍,睡觉,学习教师类:Teacher
属性:国籍,姓名,教师号
方法:自我介绍,睡觉,讲课抽取出共同的属性和方法人类:Person
属性:国籍,姓名
方法:自我介绍,睡觉学生类/教师类继承自人类示例:2.类的继承实验2.2实验原理继承的格式:class子类名:继承方式父类名{}—访问权限和继承方式继承方式一共有三种:公有继承保护继承私有继承访问权限类内类外子类public可访问可访问可访问protected可访问不可访问可访问private可访问不可访问不可访问访问权限2.类的继承实验2.3代码分析创建一个父类CalcTime,在父类中依次定义用于保存小时值、分钟值和秒值的成员变量mHour、mMin和mSec;用于指定小时值、分钟值的常量TIME_VAL_HOUR和TIME_VAL_MIN;用于计算小时值和分钟值,同时获取对应值后向外输出的GetTimeVal()函数。然后定义一个继承父类的CalcAllTime子类,在子类中定义用于计算秒值,同时获取对应值向外输出的GetSecVal()函数;用于判断tick是否符合条件的CalcFlg()函数;用于打印转换结果的DispTime()函数。在main()函数中创建一个CalcAllTime型对象,该对象名为ct,然后获取键盘输入值(0~86399之间的值,包括0和86399),实现秒值-时间值转换,并输出转换结果。
UML类图【泛化关系】用于继承【箭头指向】实线空心箭头表示,子类指向父类3.类的多态实验3.1实验内容创建一个CalcTime类,在CalcTime类中定义用于保存小时值的成员变量mHour,用于计算并获取对应时间值的虚方法getTimeVal()方法。通过公有继承方式继承基类CalcTime来创建CalcMin类,在CalcMin类中定义用于保存分钟值的成员变量mMin,用于计算并获取对应时间值的getTimeVal()方法。通过公有继承方式继承基类CalcTime来创建CalcSec类,在CalcSec类中定
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 深度解析(2026)《GBT 30104.101-2021数字可寻址照明接口 第101部分:一般要求 系统组件》
- 《GAT 2322-2025法庭科学 超级胶加湿加热显现手印技术规程》(2026年)合规红线与避坑实操手册
- 《CJT 413-2012中低速磁浮交通轨排通 用技术条件》(2026年)合规红线与避坑实操手册
- 2025北京东直门中学高三(上)期中英语试题及答案
- 眼视光技术职业规划指南
- 大连市就业指导中心
- 胆囊结石护理常规考核试题
- 2026四年级下《运算定律与简便计算》知识闯关游戏
- 医院档案室工作制度上墙
- 医院计算机采购制度
- 2025年中国邮政经济金融笔试及答案
- 2025年湖南省政府采购评审专家考试真题库及答案
- 钢结构劳务分包施工方案
- 2026年及未来5年市场数据中国饲料用蛋氨酸行业市场调查研究及投资战略咨询报告
- 支气管哮喘急性发作护理指南
- 《苏菲的世界》读书笔记及心得分享
- 2024年新高考全国卷英语试题及答案(完整版)
- 2025年冰雪运动行业全球发展趋势研究报告
- 2025年黑龙江省公安厅招聘警务辅助人员笔试考试试卷(含答案)
- 2025年安徽省高考物理真题卷含答案解析
- 中小学生守则及中学生日常行为规范(新版)
评论
0/150
提交评论