三内存管理应用程序设计.ppt

上传人:本田雅阁 文档编号:2328129 上传时间:2019-03-22 格式:PPT 页数:116 大小:1.04MB
返回 下载 相关 举报
三内存管理应用程序设计.ppt_第1页
第1页 / 共116页
三内存管理应用程序设计.ppt_第2页
第2页 / 共116页
三内存管理应用程序设计.ppt_第3页
第3页 / 共116页
亲,该文档总共116页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《三内存管理应用程序设计.ppt》由会员分享,可在线阅读,更多相关《三内存管理应用程序设计.ppt(116页珍藏版)》请在三一文库上搜索。

1、第 2/76 页,三、 内存管理应用程序设计,内存管理的相关概念 内存数据空间的动态分配 内存代码空间的动态分配,第 3/76 页,1内存管理,主要任务 对内存储器进行分配、变换、保护和扩充,存储管理还应该能够在内存和外存之间交换数据和代码。 在Windows操作系统下,存储器被保护起来,程序和用户无法直接访问,需要在程序中通过静态和动态两种方式来访问。 Windows的内存管理完成物理内存和虚拟内存之间的交换,虚拟内存是32位的,多达4GB的大小,内存管理还提供了一个核心服务,完成内存映射文件、写时复制内存和用户程序使用的大量和稀疏内存的管理。,第 4/76 页,两种使用内存的基本方法,静态

2、方法 数组,例如 Student student501 动态方法 指针,例如 Student *student=new Studentcount+1,第 5/76 页,Windows NT 内存管理,Windows可以管理4GB大小的空间;操作系统使用其中2GB空间,每个用户进程可以使用2GB的专用地址空间。 Win32 API提供: VirtualXXX形式的以页为单位的虚拟内存函数; CreateMapFile、MapViewofFile内存映射文件函数; HeapXXX堆栈函数。,第 6/76 页,内存管理,Windows NT在X86体系下虚拟地址空间的分布:,第 7/76 页,例3-

3、6 动态申请虚拟内存,整数阶乘计算到13就会出错。怎么办? 使用动态申请的虚拟内存空间编写计算任何数的阶乘的程序。 解体思路: 计算较大数的阶乘的计算一般使用数组来存放阶乘的位数。但是C+中数组最大长度是10万,这将影响使用的范围。 可以通过使用动态内存分配(指针)来解决。 本程序采用动态申请虚拟内存空间的方法,不使用物理内存,而是使用虚拟内存,从而使求解问题的范围扩大。,阶乘源代码,阶乘执行代码,第 8/76 页,程序算法, 从命令行接收输入并使用strtol函数将其转换为long型的整数(n为要求阶乘的数)。 通过函数VirtualAlloc保留n10240的地址空间,申请n1024的地址

4、空间。 调用计算阶乘函数lfac。 一位一位显示阶乘结果。 通过函数VirtulFree释放虚拟内存。,第 9/76 页,函数VirtualAlloc,用函数VirtualAlloc保留或申请虚拟内存空间。 该函数格式如下: LPVOID VirtualAlloc( LPVOID lpAddress, / 起始地址 DWORD dwSize, / 大小 DWORD flAllocationType, / 分配类型(MEM_COMMIT等) DWORD flProtect / 保权限(PAGE_READWRITE等) );,第 10/76 页,函数VirtualFree,使用函数VirtualF

5、ree释放虚拟内存,函数格式: BOOL VirtualFree( LPVOID lpAddress, /起始地址 DWORD dwSize, /大小 DWORD dwFreeType /释放类型(MEM_RELEASE等) );,第 11/76 页,源程序,#include #include int lfac(int *a, int n) int sum,sc; for(int i=0;i0) return -1; else return 0; ,第 12/76 页,举例求5!,a0=1; /最低位设为1 for(i=2;i=n;i+) /n的阶乘的循环 sc=0; for(int j=0;

6、jn*1024;j+) /阶乘每一位处理的循环 sum=aj*i+sc; /上一次进位值和当前计算结果求和 sc=sum/10; /存放进位数值 aj=sum%10; /将余数存入数组 ,i =2(2!=2),i =3(3!=6),i =4(4!=24),i =5(5!=120),j=0 sum=2 sc=0 a0=2 2!=a0=2,j=0 sum=6 sc=0 a0=6 3!=a0=6,j=0 sum=24 sc=2 a0=4,j=0 sum=20 sc=2 a0=0,j=2 sum=20 sc=0 a2=1,j=1 sum=2 sc=2 a1=2,3!=a1a0=24,j=1 sum=1

7、2 sc=1 a1=2,6!=a2a1a0=120,第 13/76 页,主函数,int main() char *p; int n; coutn; if(n=0;i-) if(flag | lpPagei0) flag=TRUE; coutlpPagei; /输出每一位 coutendl; VirtualFree (int *)lpPage + 0,n*1024,MEM_DECOMMIT);/ 对页地址解除提交内存 VirtualFree (lpBase,n*10240,MEM_RELEASE); / 释放整个范围的地址 return 0; ,例3-6源代码,例3-6执行代码,第 14/76

8、页,程序执行结果,第 15/76 页,2 动态连接库的使用,动态链接库(Dynamic-Link Library),简称DLL,是基于Windows程序设计的一个重要组成部分。 优点: 1使用DLL的动态连接不是将库代码拷贝,只在程序中记录函数的入口点和接口,在程序执行时才将库代码装入内存,如果有多个程序使用相同的DLL,也只需将DLL在内存中装载一次,节省了内存开销。 2DLL是基于Windows的程序模块,它不仅包含可执行代码,还可以包含数据,各种资源,扩大了库文件的使用范围。 3对于一个大型的、不断更新的应用程序,可以将许多重复的功能写成DLL,用主程序调用,这样既减少了开发的工作量,又

9、提高了访问速度。 4DLL独立于编程语言,可以使用目前流行的多种计算机语言或开发工具来编制和调用,比如:VC+、C+Builder、PB、VB、Delphi和汇编语言等。,第 16/76 页,例3-7 编写计算圆周率的程序,解题思路 已经提供可以计算任意位小数的圆周率的动态链接库文件“pi.dll”和静态库文件“pi.lib”,需要将它们拷贝到工程的“Debug”子目录中。 在“pi.dll”中存在计算圆周率的函数ComputPI,格式如下: int ComputPI(long bits); 其中,参数bits代表要求的圆周率的小数位数;返回值是0表示成功,是1表示失败。,第 17/76 页,

10、程序步骤, 建立“Win32控制台工程”,工程名称为“Example3_7”; 在工程中添加一个C+源程序文件,文件名称为“Example3_7.cpp”; 在工程中加入文件“pi.lib”。,第 18/76 页,源程序,#include #include int ComputPI(long bits); int main(int argc, char *argv) if (argc “; return 1; char *p; long n=strtol(argv1, ,例3-7源代码,例3-7执行代码,第 19/76 页,程序执行结果,第 20/76 页,四、设备与文件管理应用程序设计,设备

11、管理、文件管理于人机接口管理的相关概念 设备管理程序设计 文件设备管理程序设计 人机接口管理程序设计,第 21/76 页,1. 设备管理与程序设计,主要任务 根据确定的设备分配原则对设备进行分配,使设备与主机能够并行工作,为用户提供良好的设备使用界面,以提高设备与设备之间,设备与之间,进程与进程之间的并行性,从而提高整个操作系统的效率。,第 22/76 页,设备和内存之间数据传输方式,操作系统的设备管理程序通过四种控制方式完成设备与内存之间的数据传送。 1程序直接控制方式 中断控制方式 DMA方式 通道方式,第 23/76 页,(1)循环探测I/O方式,通过设置一个测试I/O设备“忙/闲”状态

12、标志的触发器。若它置“闲”,则执行I/O操作,若它置“忙”,则CPU不断对它进行监测,直至设备“闲”下来为止。在早期计算机系统中主要采用这种方式。 由于CPU速度比I/O设备速度高得多,而循环测试I/O方式使得CPU与外部设备只能串行工作,因此CPU绝大部分时间都处于等待I/O设备完成的循环测试中,CPU资源浪费极大。 优点: 管理简单 缺点: 浪费了CPU资源,第 24/76 页,(2)中断处理方式,为了克服循环测试方式的缺点(CPU必须不断主动测试I/O设备是否空闲),引入中断处理技术。该方式的核心就是使I/O设备具有主动“汇报”的能力;每当完成I/O操作后,便给CPU发一个通告信号。只有

13、当CPU接到I/O设备中断请求后,才处理I/O操作。 优点: 速度快,提高了资源的利用率。 缺点:I/O操作还依赖于CPU,如果I/O处理频繁,CPU也将很忙。特别是对字符设备,传送一个字符,就要响应一次中断处理;若字符I/O设备很多、传输量很大时,CPU可能完全陷入I/O处理中而不能自拔。,示例,第 25/76 页,DMA方式(Direct Memory Access),中断方式只能提高CPU的利用率,但在传送数据量大、速度高的情况下,其处理效率就不理想了。 目前在块设备的I/O系统中,采用DMA方式。它是一种简单的通道方式,即在硬件的支持下,通过占用总线控制权,实现信息交换。这种方法并不中

14、断当前CPU的工作,而只是在CPU暂停的几个周期内由DMA控制器实现信息交换。即DMA为具有部分CPU功能的装置。 优点:I/O操作处理速度快。 缺点: DMA方式只能完成简单的数据传输,不能满足更复杂的I/O操作要求,在大、中型计算机系统中,普遍采用I/O处理机来管理外部设备和主存之间的信息交换。,第 26/76 页,(4)通道(Channel)方式,要想把CPU从繁忙的杂务中解放出来,必须使I/O设备的管理不再依赖于CPU。“通道”是具有相对独立的I/O处理能力的装置。如大型机的前端机,PC机的Intel 8090(I/O通道)等。在通道方式下,I/O处理变成了处理机之间的通讯问题。 在采

15、用通道方式的I/O系统中,CPU有两个作用:一是将I/O操作任务下达给通道,由通道代替CPU专门处理I/O工作;二是随时了解通道、控制器和设备工作的情况。,第 27/76 页,设备管理示意图,第 28/76 页,缓冲技术与设备分配,缓冲技术 单缓冲、双缓冲、多缓冲和单缓冲池 设备分配 专门的数据结构 最佳的设备分配原则和策略 设备驱动程序,第 29/76 页,例3-8 光驱管理程序,算法分析 通过使用媒体控制接口(MCI) 的API函数,实现对光驱的操作。 编写命令行式的程序,格式为: 光驱操作命令 光驱号 操作参数 接收命令行的argv1参数,代表光驱盘符,和argv2参数,代表操作命令(O

16、表示打开,C表示关闭); 根据argv2参数的值,分别传递argv1参数调用函数OnCdopen打开光驱和OnCdclose关闭光驱。,第 30/76 页,解题思路,使用“mmsystem.h”中的媒体控制接口(MCI) API函数; MCI_OPEN_PARMS /打开光驱参数结构体 MCI_STATUS_PARMS /光驱状态参数结构体 ZeroMemory函数 /光驱参数赋零,将光驱类型 /参数设为CD_AUDIO mciSendCommand函数 /发送设备打开命令 根据命令参数打开光驱和关闭光驱 最后释放设备存储。,第 31/76 页,对话框框架程序用到的元素,MCI_OPEN_PA

17、RMS结构体 MCI_STATUS_PARMS结构体 mciSendCommand函数 ZeroMemory函数,第 32/76 页,结构体说明光驱管理程序,typedef struct tagMCI_OPEN_PARMS /打开光驱参数 DWORD dwCallback; / MCIDEVICEID wDeviceID; WORD wReserved0; LPCSTR lpstrDeviceType; LPCSTR lpstrElementName; LPCSTR lpstrAlias; MCI_OPEN_PARMS; typedef struct tag MCI_STATUS_PARMS

18、/光驱状态参数 DWORD dwCallback; DWORD dwReturn; DWORD dwItem; DWORD dwTrack; MCI_STATUS_PARMS;,第 33/76 页,设备控制函数说明,MCIERROR mciSendCommand( /发送打开设备命令 MCIDEVICEID IDDevice, /设备标示号 UINT uMsg, /命令消息 DWORD fdwCommand, /命令消息标志 DWORD dwParam /命令消息参数 ); void ZeroMemory ( /初始化数据函数 PVOID Destination, /填充地址 DWORD Le

19、ngth /填充字节大小 );,第 34/76 页,源程序,#include #include #include /MCI API函数头文件 #pragma comment(lib,“winmm“) void CD_OpenCloseDrive(BOOL bOpenDrive, TCHAR cDrive) MCI_OPEN_PARMS op; /光驱打开参数结构 MCI_STATUS_PARMS st; /光驱状态参数结构 DWORD flags; TCHAR szDriveName4; /光驱盘符变量 strcpy(szDriveName, “X:“); :ZeroMemory( /释放设备

20、存取 ,第 35/76 页,子函数源程序,void OnCdopen(CString m_Letter) /打开光驱子函数 CString new_letter = m_Letter; /取得输入光驱盘符 CD_OpenCloseDrive(TRUE, new_letter0);/打开指定盘符光驱 m_Letter = “; void OnCdclose(CString m_Letter) /关闭光驱子函数 CString new_letter = m_Letter; /取得输入光驱盘符 CD_OpenCloseDrive(TRUE, new_letter0);/关闭指定盘符光驱 m_Lett

21、er = “; ,第 36/76 页,主函数,int main(int argc, char *argv) if (argc “; return 1; if( argv20=O ) OnCdopen(argv1); else OnCdclose(argv1); return 0; ,例3-8源代码,例3-8执行代码,第 37/76 页,例3-9 双缓冲显示位图程序,在程序设计中,普通的绘图方法是一个图形一个图形地直接绘制到屏幕上,这样做的缺点是会引起屏幕闪烁。 采用双缓冲技术可以减少屏幕的闪烁。,第 38/76 页,解题思路,本程序采用单文档/视图框架; 本程序中定义一个内存显示设备对象Mem

22、DC、屏幕显示设备对象pDC和位图对象m_Bitmap; 其中CBitmap是MFC提供的一个表示位图文件的位图类,一个位图具有它的类型、大小和颜色值等; 通过MemDC的函数CreateCompatibleDC建立与屏幕显示兼容的内存显示设备; 通过m_Bitmap的函数CreateCompatibleBitmap建立一个与屏幕显示兼容的位图; 通过MemDC的函数SelectObject将位图选入到内存显示设备中; 接着在内存位图中进行绘制; 绘制完成后通过pDC的函数BitBlt将内存中的图拷贝到屏幕上进行显示; 使用完成后,需要清除位图对象m_Bitmap和内存显示设备MemDC。,第

23、 39/76 页,程序步骤, 建立单文档/视图框架程序,工程名为“Example3_9”; 在文件“Example3_9View.cpp”的OnDraw(CDC* pDC) 函数中添加如下代码: CDC MemDC; /首先定义一个显示设备对象 CBitmap m_Bitmap; /定义一个位图对象 int nWidth=500; /绘图宽度 int nHeight=500; /绘图高度 MemDC.CreateCompatibleDC(NULL); /建立与屏幕显示兼容的内存显示设备 m_Bitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight); /

24、建立一个与屏幕显示兼容的位图 MemDC.SelectObject( /清除内存显示设备 程序运行即可得到结果.,第 40/76 页,程序运行结果,例3-9执行代码,第 41/76 页,2. 文件管理与程序设计,主要任务 有效地管理文件的存储空间,合理地组织和管理文件系统,为文件访问和文件保护提供更有效的方法及手段,并把这种存储、检索、共享和保护文件的手段提供给操作系统本身和用户,以达到方便用户和提高资源利用率的目的。,第 42/76 页,文件有关概念,文件 一组相关信息的集合,文件具有一定的数据结构、数据、分类属性和访问权限。 文件从物理上,由位(bit)、字节(byte)、块(block)

25、、页(page)和盘(disk)等组成; 物理结构有连续文件结构、串联文件结构和索引文件结构。 从逻辑上,有字(word)、字段(segment)、记录(record)、虚拟块(virtual block)、文件(file)、文件目录(file directory)、文件夹(folder)和文件卷(volume)等。 逻辑结构可分为两大类:字符流式的无结构文件和记录式的有结构文件。,第 43/76 页,文件系统,文件管理程序和所管理的全部文件(文件与目录的集合)。 最常用的一些文件类型是: .exe 可执行文件 .wav 声音文件 .lib静态库文件 .jpg 图片文件 .dll动态库文件 .

26、doc Word文件 .ocx 组件文件 .mdb Access数据库文件 .cpp C+源程序文件 .log日志文件 .java Java源程序文件 .bmp 位图文件 .html 网页文件 .ini初始化文件 .chk磁盘整理文件等等,第 44/76 页,文件保护,文件的保护可以通过改变文件属性为可读、可写、可执行、隐藏和归挡来进行。,第 45/76 页,文件系统格式,Windows操作系统采用FAT32和NTFS两种文件系统格式: 其中FAT32采用文件目录表(file directory table,FDT)和文件分配表(file allocate table,FAT)相结合的方式来管

27、理文件。FAT32的文件分配表是32位的,增强了对磁盘的管理能力,减少了磁盘空间的浪费。 NTFS采用压缩存储方式,具有文件权限的管理功能,能够更好地管理文件。,第 46/76 页,文件结构,文件的结构包括物理结构和逻辑结构。 文件的物理结构又称为文件的存储结构,它是指文件在外存上的存储组织形式,与存储介质的存储性能有关。 常用的物理结构有连续文件结构、串联文件结构和索引文件结构。文件的逻辑结构是用户所观察到的文件组织形式,是用户可以直接处理的数据及结构,它独立于物理特性,又称为文件组织(FILE ORGANIZATION)。 文件的逻辑结构可分为两大类:字符流式的无结构文件和记录式的有结构文

28、件。,第 47/76 页,文件的逻辑结构,文件的逻辑结构分为两种形式: 一种是有结构的记录式文件,它由一组相关记录组成。文件中的记录可按顺序编号为记录1、记录2、记录n。 例如,数据库文件。 另一种是无结构的流式文件,它是指由字符序列集合组成的文件。 例如,一个Word文件。 在UNIX中,所有文件都被看作是流式文件,包括打印机、显示器等I/O设备。,示例,示例,第 48/76 页,文件的物理结构,是指文件在存储设备上的存放形式。 文件在逻辑上是连续的,但在存储设备上存放时却有几种不同形式: 连续文件。又称顺序文件。其特点是文件存放在存储设备的相临的物理块中,即连续存放。 串联文件。又称链表文

29、件。它采用非连续的物理块来存放文件信息,将文件的所有物理块串联组成一个链表,块之间通过指针链接。 索引文件。索引文件要求系统为每一个文件创建一张索引表,索引表的表项给出文件的逻辑块号和物理块号的对应关系。 Hash(散列)文件。它采用计算寻址方法,将记录键值通过Hash函数计算转换成相应记录的地址。,示例,第 49/76 页,文件的目录结构,文件组织体系中还包括文件的目录结构。 用户使用的是文件的逻辑结构,系统使用的是文件的物理结构,在两种不同的组织结构之间似乎应该有衔接的纽带。 衔接的纽带就是文件的目录结构。 通过文件的目录结构,将文件的逻辑结构和文件的物理结构联系在了一起。,第 50/76

30、 页,例3-10 驱动器浏览程序,解题思路: 本程序显示操作系统中的所有盘符,程序中用到MFC和Windows API函数; CString代表一个字符串对象; SetAt 函数改变字符串某个位置的字符; GetLength函数取得字符的长度; GetBuffer函数将一个CString型的字符串转换为LPTSTR类型的指定长度的字符串; 宏变量DRIVE_REMOVABLE、DRIVE_FIXED、DRIVE_REMOTE、DRIVE_CDROM和DRIVE_RAMDISK分别表示不同类型的盘,在程序代码中有说明。,第 51/76 页,程序步骤, 调用API函数GetLogicalDrive

31、s取得“我的电脑”中的所有逻辑盘,并得到一个DWORD类型的数,其中的某一位为1时表示该位代表的盘存在。其中GetLogicalDrives函数的格式为: DWORD GetLogicalDrives(VOID); 通过提取dwDriveList的每一位,得到所有盘符; 调用API函数GetDriveType判别每一盘符的类型,其中GetDriveType函数的格式为: UINT GetDriveType(int nDrive),第 52/76 页,程序,#include #include void main() int nPos = 0; UINT nCount = 0; CString s

32、trDrive = “?:“; DWORD dwDriveList = GetLogicalDrives (); /取得我的电脑的所有盘 CString cTmp; UINT nType; cout= 1; /准备取得下一个盘符 nPos+; cout“共:“nCount“个盘“endl; ,第 53/76 页,程序运行结果,例3-10执行代码,第 54/76 页,例3-11 判别指定文件或文件夹属性,算法分析 从命令行输入指定的文件或目录名称,可以包含通配符( “*” 和“?”)。命令格式为: 命令 文件名 使用FMC的CFileFind类的FindFile函数对指定文件进行查找。 CFil

33、eFind类的FindNextFile函数对指定文件继续进行查找(因指定的文件可能含有通配符)。 分别通过函数GetFileName、 GetFilePath、IsDirectory、IsReadOnly和GetCreateTime得到文件的名称、路径、是否目录、是否只读和建立时间等,并显示相应结果。,第 55/76 页,解题思路,本应用用到MFC的CFileFind类的FindFile、 FindNextFile、GetFileName、 GetFilePath、IsDirectory、IsReadOnly和GetCreateTime函数; 还用到CTime类的GetYear、GetMont

34、h、GetDay函数取得文件建立的时间(年、月、日)。,第 56/76 页,源程序,#include #include void main(int argc,char *argv) if(argc“endl; exit(1); CFileFind finder; BOOL bWorking = finder.FindFile(argv1); /取得命令行参数指定的文件名,并查询 while (bWorking) bWorking = finder.FindNextFile(); /继续查询下一个文件 cout “文件名称:“(LPCTSTR) finder.GetFileName() endl

35、; cout “文件路径:“(LPCTSTR) finder.GetFilePath() endl; if(finder.IsDirectory( ) cout “目录“endl; else cout “文件“ endl; if(finder.IsReadOnly( ) cout “只读“ endl; CTime fileTime; finder.GetCreationTime(fileTime); /取得文件建立时间 cout “建立时间是:“fileTime.GetYear()“年“; cout fileTime.GetMonth()“月“; cout fileTime.GetDay()“

36、日“ endlendl; ,第 57/76 页,程序运行结果,例3-11执行代码,第 58/76 页,例3-12 读取位图文件属性程序,算法分析 从命令行输入指定的位图文件名称; 命令格式为:命令 位图文件名 定义位图文件头结构变量BitmapFileHeader; 定义位图信息结构变量BitmapInfo; 打开指定文件; 使用函数fread分别读取位图文件头和位图信息; 关闭指定文件。并显示位图文件名称、位图文件类型、图像宽度、图像高度和每个像素的位数。,第 59/76 页,解题思路,位图文件是Windows操作系统中很重要的一种图形格式,本例是对位图文件的简单操作。 本程序用到的结构体和

37、函数有: BITMAPFILEHEADER /位图文件头结构体 BITMAPINFO /位图信息结构体 fread()函数 /文件读函数,第 60/76 页,BITMAPFILEHEADER格式,位图文件头结构体为: typedef struct tagBITMAPFILEHEADER WORD bfType; /文件类型 DWORD bfSize; /文件大小 WORD bfReserved1; /文件保留1 WORD bfReserved2; /文件保留2 DWORD bfOffBits; / ;,第 61/76 页,位图信息结构体,位图信息结构体BITMAPINFO的格式为: typed

38、ef struct tagBITMAPINFO BITMAPINFOHEADER bmiHeader; /位图像素、像素位数 RGBQUAD bmiColors1; /颜色 BITMAPINFO;,第 62/76 页,Fread函数,函数fread的格式如下: size_t fread( void *buffer, /文件缓冲区 size_t size, /缓冲区块长度 size_t count, /缓冲区块个数 FILE *stream /文件流指针 );,第 63/76 页,源程序,#include #include #include void main(int argc,char *ar

39、gv) if(argc“endl; exit(1); BITMAPFILEHEADER BitmapFileHeader; /定义位图文件头结构变量 BITMAPINFO BitmapInfo; /定义位图信息结构变量 FILE *fp=fopen(argv1,“rb“); /打开命令行指定的文件 if(fp=NULL) cout“文件:“argv1“打开错误“endl; exit(1); fread( ,第 64/76 页,程序运行结果,例3-12执行代码,第 65/76 页,例3-14 处理学生成绩系统,有一批学生期末考试数据,已知总人数不超过500人,内容包括:学号、姓名、高数成绩、英语

40、成绩和计算机成绩。 使用MFC的对话框框架结构编写程序录入学生期末考试数据,并计算每位同学的平均分和所有同学各课程总分,并将最后计算的每位同学的平均分和所有同学各课总分存放在文件中供显示或打印。,第 66/76 页,解题思路,显示学生成绩和统计总成绩以及打印功能是通过调用API函数ShellExecute完成的,该函数的格式如下: HINSTANCE ShellExecute( HWND hwnd, /窗口句柄 LPCTSTR lpOperation, /操作命令 LPCTSTR lpFile, /文件名称 LPCTSTR lpParameters, /参数 LPCTSTR lpDirecto

41、ry, /目录 INT nShowCmd /窗口大小 ); 其中,hwnd为窗口句柄,使用this-GetSafeHwnd()取得; lpOperation可以是“open”(打开)、“print”(打印)和“explore”(浏览目录)、 参数lpFile为需要处理的文件名、 参数lpParameters为文件参数,参数pDirectory为文件目录,参数nShowCmd为窗口打开的大小(SW_SHOWNORMAL、SW_SHOWMAXIMIZED等)。,第 67/76 页,程序步骤,在VC+中建立文档视图的程序框架,工程命名为“Example3_15”; 加入一个新对话框,并按下列要求设计

42、对话框资源: 对话框资源号为:“IDD_STUDENTDIALOG”; 对话框窗口标题为:“增加学生期末考试成绩”; 设置对话框中对象的属性;放置6个静态文本控件,6个编辑文本控件,2个按钮控件,以及对应的控件变量。 在工程中增加一个Student类: 创建菜单、修改菜单属性; 在类“Example3_14View”中增加成员变量: public: int count; Student student501; 在文件“Example3_14View.cpp”中加入操作代码。,第 68/76 页,Student 类成员,public: int No; CString Name; float Ma

43、thScore,EnglishScore,ComputerScore, AverageScore; Student() MathScore=EnglishScore=ComputerScore=AverageScore=0; ,第 69/76 页,CExample3_14View()的代码,#include “Student.h“ #include “StudentDialog.h“ CExample3_14View:CExample3_14View() count=0; ,第 70/76 页,CExample3_14View:OnAdd() 代码,void CExample3_14View:

44、OnAdd() CStudentDlg dlg; dlg.m_Count=count; int result=dlg.DoModal(); if(result=IDOK) studentcount.No=dlg.m_No; studentcount.Name=dlg.m_Name; studentcount.MathScore=dlg.m_MathScore; studentcount.EnglishScore=dlg.m_EnglishScore; studentcount.ComputerScore=dlg.m_ComputerScore; studentcount.AverageScor

45、e=(studentcount.MathScore+ studentcount.EnglishScore+ studentcount.ComputerScore)/3; count+; ,第 71/76 页,CExample3_14View:OnShow()代码,void CExample3_14View:OnShow() FILE *file=fopen(“Student.txt“,“wt“); char *p; char p1256; p=“ 学生期末考试成绩单 rn学号 姓名 数学 英语 计算机 均分rn“; fputs(p, file); p=“=rn“; fputs(p, file)

46、; for(int i=0;iGetSafeHwnd(), “open“, “Student.txt“, NULL, NULL, SW_SHOWNORMAL); ,第 72/76 页,CExample3_14View:OnTotal()代码,void CExample3_14View:OnTotal() FILE *file=fopen(“StudentTotal.txt“,“wt“); char *p; char p1256; p=“ 学生总成绩单 rn人数 数学 英语 计算rn“; fputs(p, file); p=“=rn“; fputs(p, file); studentcount.MathScore=0; studentcount.EnglishScore=0; studentcount.ComputerScore=0; for(int i=0;iGetSafeHwnd(), “open“, “StudentTota

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1