三内存管理应用程序设计课件_第1页
三内存管理应用程序设计课件_第2页
三内存管理应用程序设计课件_第3页
三内存管理应用程序设计课件_第4页
三内存管理应用程序设计课件_第5页
已阅读5页,还剩111页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

2、针,例如Student *student=new Studentcount+14内存管理 Windows NT在X86体系下虚拟地址空间的分布: 6例3-6 动态申请虚拟内存整数阶乘计算到13就会出错。怎么办?使用动态申请的虚拟内存空间编写计算任何数的阶乘的程序。解体思路:计算较大数的阶乘的计算一般使用数组来存放阶乘的位数。但是C+中数组最大长度是10万,这将影响使用的范围。可以通过使用动态内存分配(指针)来解决。本程序采用动态申请虚拟内存空间的方法,不使用物理内存,而是使用虚拟内存,从而使求解问题的范围扩大。阶乘源代码阶乘执行代码7函数VirtualAlloc用函数VirtualAlloc保

3、留或申请虚拟内存空间。该函数格式如下:LPVOID VirtualAlloc( LPVOID lpAddress, / 起始地址 DWORD dwSize, / 大小 DWORD flAllocationType, / 分配类型(MEM_COMMIT等) DWORD flProtect / 保权限(PAGE_READWRITE等));9函数VirtualFree使用函数VirtualFree释放虚拟内存,函数格式:BOOL VirtualFree( LPVOID lpAddress, /起始地址 DWORD dwSize, /大小 DWORD dwFreeType /释放类型(MEM_RELE

4、ASE等)); 10源程序#include #include int lfac(int *a, int n) int sum,sc; for(int i=0;in*1024;i+) /空间清零ai=0; a0=1; /最低位设为1 for(i=2;i=n;i+) /n的阶乘的循环 sc=0;for(int j=0;j0) return -1; else return 0;11举例求5!a0=1; /最低位设为1for(i=2;i=n;i+) /n的阶乘的循环 sc=0; for(int j=0;jn*1024;j+) /阶乘每一位处理的循环 sum=aj*i+sc; /上一次进位值和当前计算结

5、果求和 sc=sum/10; /存放进位数值 aj=sum%10;/将余数存入数组 i =2(2!=2)i =3(3!=6)i =4(4!=24)i =5(5!=120)j=0sum=2sc=0a0=22!=a0=2j=0sum=6sc=0a0=63!=a0=6j=0sum=24sc=2a0=4j=0sum=20sc=2a0=0j=2sum=20sc=0a2=1j=1sum=2sc=2a1=23!=a1a0=24j=1sum=12sc=1a1=26!=a2a1a0=12012主函数int main() char *p; int n; coutn; if(n0) couta输入数据错;retur

6、n 1; int * lpBase =(int *) VirtualAlloc(NULL, 1024, MEM_COMMIT, PAGE_READWRITE); /保留 n*10240总的地址空间 int * lpPage = (int *)VirtualAlloc (lpBase + 0, n*1024,MEM_COMMIT,PAGE_READWRITE); /提交n*1024的页地址空间 bool flag=FALSE; if(lfac(lpPage,n)0) cout溢出=0;i-) if(flag | lpPagei0) flag=TRUE; coutlpPagei; /输出每一位 c

7、outendl; VirtualFree (int *)lpPage + 0,n*1024,MEM_DECOMMIT);/ 对页地址解除提交内存VirtualFree (lpBase,n*10240,MEM_RELEASE); / 释放整个范围的地址return 0;例3-6源代码例3-6执行代码13程序执行结果14例3-7 编写计算圆周率的程序解题思路 已经提供可以计算任意位小数的圆周率的动态链接库文件“pi.dll”和静态库文件“pi.lib”,需要将它们拷贝到工程的“Debug”子目录中。 在“pi.dll”中存在计算圆周率的函数ComputPI,格式如下: int ComputPI(l

8、ong bits); 其中,参数bits代表要求的圆周率的小数位数;返回值是0表示成功,是1表示失败。16程序步骤 建立“Win32控制台工程”,工程名称为“Example3_7”; 在工程中添加一个C+源程序文件,文件名称为“Example3_7.cpp”; 在工程中加入文件“pi.lib”。17程序执行结果19 四、设备与文件管理应用程序设计设备管理、文件管理于人机接口管理的相关概念设备管理程序设计文件设备管理程序设计人机接口管理程序设计 20 1. 设备管理与程序设计主要任务 根据确定的设备分配原则对设备进行分配,使设备与主机能够并行工作,为用户提供良好的设备使用界面,以提高设备与设备之

9、间,设备与之间,进程与进程之间的并行性,从而提高整个操作系统的效率。21设备和内存之间数据传输方式操作系统的设备管理程序通过四种控制方式完成设备与内存之间的数据传送。 1程序直接控制方式 中断控制方式 DMA方式 通道方式 22(1)循环探测I/O方式通过设置一个测试I/O设备“忙/闲”状态标志的触发器。若它置“闲”,则执行I/O操作,若它置“忙”,则CPU不断对它进行监测,直至设备“闲”下来为止。在早期计算机系统中主要采用这种方式。由于CPU速度比I/O设备速度高得多,而循环测试I/O方式使得CPU与外部设备只能串行工作,因此CPU绝大部分时间都处于等待I/O设备完成的循环测试中,CPU资源

10、浪费极大。 优点: 管理简单 缺点: 浪费了CPU资源 23(2)中断处理方式为了克服循环测试方式的缺点(CPU必须不断主动测试I/O设备是否空闲),引入中断处理技术。该方式的核心就是使I/O设备具有主动“汇报”的能力;每当完成I/O操作后,便给CPU发一个通告信号。只有当CPU接到I/O设备中断请求后,才处理I/O操作。 优点: 速度快,提高了资源的利用率。 缺点:I/O操作还依赖于CPU,如果I/O处理频繁,CPU也将很忙。特别是对字符设备,传送一个字符,就要响应一次中断处理;若字符I/O设备很多、传输量很大时,CPU可能完全陷入I/O处理中而不能自拔。示例24(4)通道(Channel)

11、方式要想把CPU从繁忙的杂务中解放出来,必须使I/O设备的管理不再依赖于CPU。“通道”是具有相对独立的I/O处理能力的装置。如大型机的前端机,PC机的Intel 8090(I/O通道)等。在通道方式下,I/O处理变成了处理机之间的通讯问题。在采用通道方式的I/O系统中,CPU有两个作用:一是将I/O操作任务下达给通道,由通道代替CPU专门处理I/O工作;二是随时了解通道、控制器和设备工作的情况。 26设备管理示意图 CPUCH1CH2CHnCU1CU2CUmDV1DV2DV3DV4DVkDVk+1通道控制器设备27例3-8 光驱管理程序算法分析 通过使用媒体控制接口(MCI) 的API函数,

12、实现对光驱的操作。 编写命令行式的程序,格式为: 光驱操作命令 光驱号 操作参数 接收命令行的argv1参数,代表光驱盘符,和argv2参数,代表操作命令(O表示打开,C表示关闭); 根据argv2参数的值,分别传递argv1参数调用函数OnCdopen打开光驱和OnCdclose关闭光驱。29解题思路使用“mmsystem.h”中的媒体控制接口(MCI) API函数;MCI_OPEN_PARMS /打开光驱参数结构体MCI_STATUS_PARMS /光驱状态参数结构体ZeroMemory函数 /光驱参数赋零,将光驱类型 /参数设为CD_AUDIOmciSendCommand函数 /发送设备

13、打开命令根据命令参数打开光驱和关闭光驱最后释放设备存储。30对话框框架程序用到的元素MCI_OPEN_PARMS结构体 MCI_STATUS_PARMS结构体 mciSendCommand函数 ZeroMemory函数 31结构体说明光驱管理程序typedef struct tagMCI_OPEN_PARMS /打开光驱参数 DWORD dwCallback; / MCIDEVICEID wDeviceID; WORD wReserved0; LPCSTR lpstrDeviceType; LPCSTR lpstrElementName; LPCSTR lpstrAlias; MCI_OPEN

14、_PARMS;typedef struct tag MCI_STATUS_PARMS /光驱状态参数 DWORD dwCallback; DWORD dwReturn; DWORD dwItem; DWORD dwTrack; MCI_STATUS_PARMS;32设备控制函数说明MCIERROR mciSendCommand( /发送打开设备命令 MCIDEVICEID IDDevice, /设备标示号 UINT uMsg, /命令消息 DWORD fdwCommand, /命令消息标志 DWORD dwParam /命令消息参数);void ZeroMemory ( /初始化数据函数 PV

15、OID Destination, /填充地址 DWORD Length /填充字节大小);33源程序#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:);:ZeroMemor

16、y(&op, sizeof(MCI_OPEN_PARMS); /光驱参数赋值为0op.lpstrDeviceType = (LPCSTR) MCI_DEVTYPE_CD_AUDIO; /光驱类型参数为CD_AUDIOif (cDrive 1) szDriveName0 = cDrive; op.lpstrElementName = szDriveName; /光驱盘符参数为函数参数 flags = MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID | MCI_OPEN_ELEMENT | MCI_OPEN_SHAREABLE; else flags = MCI_OPEN_TYP

17、E | MCI_OPEN_TYPE_ID | MCI_OPEN_SHAREABLE; if ( !mciSendCommand(0,MCI_OPEN,flags,(unsigned long)&op) ) /发送设备打开命令st.dwItem = MCI_STATUS_READY;if(bOpenDrive) mciSendCommand(op.wDeviceID,MCI_SET,MCI_SET_DOOR_OPEN,0); /打开光驱else mciSendCommand(op.wDeviceID,MCI_SET,MCI_SET_DOOR_CLOSED,0); /关闭光驱mciSendComm

18、and(op.wDeviceID,MCI_CLOSE,MCI_WAIT,0); /释放设备存取34子函数源程序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,

19、new_letter0);/关闭指定盘符光驱m_Letter = ;35主函数int main(int argc, char *argv)if (argc 3) couta使用方法: Example3_8 ; return 1; if( argv20=O ) OnCdopen(argv1); else OnCdclose(argv1); return 0;例3-8源代码例3-8执行代码36例3-9 双缓冲显示位图程序 在程序设计中,普通的绘图方法是一个图形一个图形地直接绘制到屏幕上,这样做的缺点是会引起屏幕闪烁。采用双缓冲技术可以减少屏幕的闪烁。37解题思路本程序采用单文档/视图框架;本程序中

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

21、MemDC。38程序步骤建立单文档/视图框架程序,工程名为“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); /建立一个与屏幕显示

22、兼容的位图MemDC.SelectObject(&m_Bitmap); /将位图选入到内存显示设备中MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(192,192,192); /画实心矩形 MemDC.Ellipse(100,100,400,400); /画圆MemDC.MoveTo(100,100); /移动到指定位置MemDC.LineTo(400,400); /画直线MemDC.TextOut(220,250,“欢迎”); /显示文字pDC-BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY); /将内存中的图拷

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

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

25、件 .mdb Access数据库文件.cpp C+源程序文件 .log日志文件.java Java源程序文件 .bmp 位图文件.html 网页文件 .ini初始化文件.chk磁盘整理文件等等43文件保护文件的保护可以通过改变文件属性为可读、可写、可执行、隐藏和归挡来进行。 44文件系统格式Windows操作系统采用FAT32和NTFS两种文件系统格式:其中FAT32采用文件目录表(file directory table,FDT)和文件分配表(file allocate table,FAT)相结合的方式来管理文件。FAT32的文件分配表是32位的,增强了对磁盘的管理能力,减少了磁盘空间的浪费

26、。NTFS采用压缩存储方式,具有文件权限的管理功能,能够更好地管理文件。45文件结构文件的结构包括物理结构和逻辑结构。文件的物理结构又称为文件的存储结构,它是指文件在外存上的存储组织形式,与存储介质的存储性能有关。常用的物理结构有连续文件结构、串联文件结构和索引文件结构。文件的逻辑结构是用户所观察到的文件组织形式,是用户可以直接处理的数据及结构,它独立于物理特性,又称为文件组织(FILE ORGANIZATION)。文件的逻辑结构可分为两大类:字符流式的无结构文件和记录式的有结构文件。46文件的逻辑结构文件的逻辑结构分为两种形式:一种是有结构的记录式文件,它由一组相关记录组成。文件中的记录可按

27、顺序编号为记录1、记录2、记录n。 例如,数据库文件。另一种是无结构的流式文件,它是指由字符序列集合组成的文件。 例如,一个Word文件。在UNIX中,所有文件都被看作是流式文件,包括打印机、显示器等I/O设备。示例示例47文件的物理结构是指文件在存储设备上的存放形式。文件在逻辑上是连续的,但在存储设备上存放时却有几种不同形式:连续文件。又称顺序文件。其特点是文件存放在存储设备的相临的物理块中,即连续存放。串联文件。又称链表文件。它采用非连续的物理块来存放文件信息,将文件的所有物理块串联组成一个链表,块之间通过指针链接。索引文件。索引文件要求系统为每一个文件创建一张索引表,索引表的表项给出文件

28、的逻辑块号和物理块号的对应关系。Hash(散列)文件。它采用计算寻址方法,将记录键值通过Hash函数计算转换成相应记录的地址。示例48文件的目录结构文件组织体系中还包括文件的目录结构。用户使用的是文件的逻辑结构,系统使用的是文件的物理结构,在两种不同的组织结构之间似乎应该有衔接的纽带。衔接的纽带就是文件的目录结构。通过文件的目录结构,将文件的逻辑结构和文件的物理结构联系在了一起。49例3-10 驱动器浏览程序解题思路:本程序显示操作系统中的所有盘符,程序中用到MFC和Windows API函数;CString代表一个字符串对象;SetAt 函数改变字符串某个位置的字符;GetLength函数取

29、得字符的长度;GetBuffer函数将一个CString型的字符串转换为LPTSTR类型的指定长度的字符串;宏变量DRIVE_REMOVABLE、DRIVE_FIXED、DRIVE_REMOTE、DRIVE_CDROM和DRIVE_RAMDISK分别表示不同类型的盘,在程序代码中有说明。50程序步骤 调用API函数GetLogicalDrives取得“我的电脑”中的所有逻辑盘,并得到一个DWORD类型的数,其中的某一位为1时表示该位代表的盘存在。其中GetLogicalDrives函数的格式为: DWORD GetLogicalDrives(VOID);通过提取dwDriveList的每一位,

30、得到所有盘符;调用API函数GetDriveType判别每一盘符的类型,其中GetDriveType函数的格式为: UINT GetDriveType(int nDrive) 51程序#include #include void main() int nPos = 0; UINT nCount = 0; CString strDrive = ?:; DWORD dwDriveList = GetLogicalDrives (); /取得我的电脑的所有盘 CString cTmp; UINT nType; cout我的电脑包含如下盘:endl; while (dwDriveList) if (d

31、wDriveList & 1) cTmp = strDrive; strDrive.SetAt (0, 0 x41 + nPos); /将数字表示的盘符转换为字母 coutstrDrive.GetBuffer(strDrive.GetLength(); /将字符串转换为指定格式 nType = GetDriveType (LPCTSTR) strDrive); /取得每个盘的类型 switch (nType) case DRIVE_REMOVABLE:cout可移动盘endl;break; case DRIVE_FIXED: cout逻辑硬盘endl; break; case DRIVE_RE

32、MOTE:cout网络盘endl;break; case DRIVE_CDROM:coutCDROM盘endl; break; case DRIVE_RAMDISK:coutRAM盘endl;break; default: cout未知类型盘= 1; /准备取得下一个盘符 nPos+; cout共:nCount个盘endl; 52程序运行结果 例3-10执行代码53例3-11 判别指定文件或文件夹属性算法分析从命令行输入指定的文件或目录名称,可以包含通配符( “*” 和“?”)。命令格式为: 命令 文件名使用FMC的CFileFind类的FindFile函数对指定文件进行查找。CFileFin

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

34、立的时间(年、月、日)。55 源程序#include#includevoid main(int argc,char *argv)if(argc2) cout 使用格式:Example3_11 endl; exit(1); CFileFind finder;BOOL bWorking = finder.FindFile(argv1); /取得命令行参数指定的文件名,并查询while (bWorking)bWorking = finder.FindNextFile(); /继续查询下一个文件cout 文件名称:(LPCTSTR) finder.GetFileName() endl;cout 文件路

35、径:(LPCTSTR) finder.GetFilePath() endl;if(finder.IsDirectory( ) cout 目录endl;elsecout 文件 endl;if(finder.IsReadOnly( ) cout 只读 endl;CTime fileTime;finder.GetCreationTime(fileTime); /取得文件建立时间cout 建立时间是:fileTime.GetYear()年;cout fileTime.GetMonth()月;cout fileTime.GetDay()日 endlendl;56程序运行结果 例3-11执行代码57 例3

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

37、文件读函数59BITMAPFILEHEADER格式位图文件头结构体为: typedef struct tagBITMAPFILEHEADER WORD bfType; /文件类型 DWORD bfSize; /文件大小 WORD bfReserved1; /文件保留1 WORD bfReserved2; /文件保留2 DWORD bfOffBits; / ; 60位图信息结构体位图信息结构体BITMAPINFO的格式为:typedef struct tagBITMAPINFO BITMAPINFOHEADER bmiHeader; /位图像素、像素位数 RGBQUAD bmiColors1;

38、/颜色 BITMAPINFO;61Fread函数函数fread的格式如下:size_t fread( void *buffer, /文件缓冲区 size_t size, /缓冲区块长度 size_t count, /缓冲区块个数 FILE *stream /文件流指针 );62源程序#include#include#includevoid main(int argc,char *argv)if(argc2) cout用法:Example3_12 endl; exit(1); BITMAPFILEHEADER BitmapFileHeader; /定义位图文件头结构变量BITMAPINFO Bi

39、tmapInfo; /定义位图信息结构变量 FILE *fp=fopen(argv1,rb); /打开命令行指定的文件if(fp=NULL) cout文件:argv1打开错误endl; exit(1); fread(&BitmapFileHeader,sizeof(BITMAPFILEHEADER),1,fp); /读位图文件头fread(&BitmapInfo,sizeof(BITMAPINFO),1,fp); /读位图信息fclose(fp); /关闭文件cout位图文件名称为:argv1endl; cout位图文件类型为:(char)BitmapFileHeader.bfType;cou

40、t(char)(BitmapFileHeader.bfType/0 x100)endl;cout位图文件的大小:BitmapFileHeader.bfSizebytesendl;cout图像宽度:BitmapInfo.bmiHeader.biWidth点endl;cout图像高度:BitmapInfo.bmiHeader.biHeight点endl;switch(BitmapInfo.bmiHeader.biBitCount) /每个像素的位数 case 0: coutJPEG图endl;break; case 1: cout单色图endl;break; case 4: cout16色图end

41、l;break; case 8: cout256色图endl;break; case 16: cout64K图endl;break; case 24: cout16M真彩色图endl;break; case 32: cout4G真彩色图endl;break; default: cout单位像素位数未知GetSafeHwnd()取得; lpOperation可以是“open”(打开)、“print”(打印)和“explore”(浏览目录)、 参数lpFile为需要处理的文件名、 参数lpParameters为文件参数,参数pDirectory为文件目录,参数nShowCmd为窗口打开的大小(SW

42、_SHOWNORMAL、SW_SHOWMAXIMIZED等)。66程序步骤在VC+中建立文档视图的程序框架,工程命名为“Example3_15”;加入一个新对话框,并按下列要求设计对话框资源:对话框资源号为:“IDD_STUDENTDIALOG”;对话框窗口标题为:“增加学生期末考试成绩”;设置对话框中对象的属性;放置6个静态文本控件,6个编辑文本控件,2个按钮控件,以及对应的控件变量。在工程中增加一个Student类:创建菜单、修改菜单属性;在类“Example3_14View”中增加成员变量:public:int count;Student student501;在文件“Example3_

43、14View.cpp”中加入操作代码。67 Student 类成员public:int No;CString Name;float MathScore,EnglishScore,ComputerScore, AverageScore;Student()MathScore=EnglishScore=ComputerScore=AverageScore=0;68 CExample3_14View()的代码#include Student.h#include StudentDialog.h CExample3_14View:CExample3_14View()count=0;69 CExample3

44、_14View:OnAdd() 代码void CExample3_14View: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_Com

45、puterScore;studentcount.AverageScore=(studentcount.MathScore+studentcount.EnglishScore+studentcount.ComputerScore)/3;count+; 70 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

46、, file);for(int i=0;iGetSafeHwnd(), open, Student.txt, NULL, NULL, SW_SHOWNORMAL);71CExample3_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; studen

47、tcount.EnglishScore=0; studentcount.ComputerScore=0; for(int i=0;iGetSafeHwnd(), open, StudentTotal.txt, NULL, NULL, SW_SHOWNORMAL);72 CExample3_14View:OnPrint()代码void CExample3_14View:OnPrint() ShellExecute(this-GetSafeHwnd(), print, Student.txt, NULL, NULL, SW_SHOWNORMAL);73 CExample3_14View:OnTot

48、alprint()代码void CExample3_14View:OnTotalprint()ShellExecute(this-GetSafeHwnd(), print, StudentTotal.txt, NULL, NULL, SW_SHOWNORMAL);74 例3-14运行结果 (b)数据输入 (c)学生成绩单 (d)学生统计成绩单图3-44 例3-14的运行结果例3-14执行代码75作业、思考题作业:第3章 一、二、三题的全部答疑时间:星期四、五:下午:4:006:00点答疑地点:计教中心505房间76结束语欢迎参加到中心网站软件基础课程的学习讨论中来。中心网址: http:/我的

49、E-mail地址: LZQ 谢谢,再见!77Cstring类Cstring类是MFC中提供的一个有关字符串操作的应用程序类。它的定义放在头文件中。其成员函数有:SetAt(int nIndex,TCHAR ch)替换指定位置上的字符GetAt(int nIndex)返回指定位置的字符GetLength()返回字符串的长度GetBuffer()将Cstring型字符串转换为LPTSTR型字符串Insert()在字符串指定位置插入子串MakeReverse()将字符串中字符倒序Format()格式化输出Find()返回指定字符在字符串中的位置返回78MFC的概述MFC是一个Windows应用程序框

50、架,它定义了应用程序的结构,并实现了标准的用户接口。MFC提供了管理窗口、菜单、对话框的代码,可实现基本的输入/输出和数据存储。使用MFC库,可以在Windows软件开发专家的工作基础上建立自己的应用程序。应用程序框架的核心是“文档-视图”结构。文档类的作用是将应用程序的数据保存在文档类对象中,视图类的作用是显示数据和编辑数据。MFC库协调着文档、视图、框架窗口以及应用程序对象之间的相互作用。 79MFC类功能简介根类CObjectMFC应用结构类应用和线程支持类、命令例程类、文档类、文档模板类窗口、对话和控件类 CWnd类、框架窗口类、对话框类、视图类、控件类、控件条类菜单类绘图和打印类、输

51、出(设备上下文)类、绘图工具类简单的数据类型类数组、列表和映射类文件和数据库类文件I/O类、DAO类、ODBC类Internet和网络类OLE类调试和异常类80MFC类层次 MFC的类可分为两种:从CObject派生的类及非派生类。CObject应用结构类文件服务类绘图工具类框架窗口类CCmdTargetCWndCDCCFile所有窗口的基类CFrameWnd对话框类CDialog视图类CView控件类CAnimateCtrl应用对象类CWinAppCDocumentCDocTemplate文档类文档模板类CMenu菜单类CArray数组类CList列表类CMap映射类CGdiObject返回

52、81CDC类MFC的类中与图形操作有关的类有两种:一种是CDC(Class Device Context)类、一种是GDI(Graphic Device Interface)对象类。GDI图形设备接口是Windows提供的一个图形操作的抽象的接口,通俗地讲是各种关于图形操作的函数库。Windows不允许应用程序直接访问硬件,而是通过GDI间接地和硬件打交道(通过“设备环境”DC)。CDC类主要功能是完成绘图功能和环境的建立。82CDC类中常用的函数及功能 BitBlt()TextOut()LineTo()Ellipse()FillRect()MoveTo()Ractangle()Pie()Po

53、lygon()GetTextColor()SelectStockObject()SetWindowOrg()SetWindowExt()把位图从一个DC拷贝到另一个DC绘制文本绘制线条绘制椭圆或圆用给定的画笔的颜色填充矩形设置画笔的位置绘制矩形绘制饼图绘制多边形获取文本的颜色选取GDI绘图对象设置窗口中坐标系中的原点设置窗口的范围83CDC类的使用方法对于显示器类型的DC调用CDC*CWnd:GetDC()函数来获得指向窗口的工作区的DC指针;利用得到的DC指针,调用CDC类的函数完成绘制工作;使用ReleaseDC()释放获得的DC。对于内存型的DC调用CDC*CWnd:CreateComp

54、atibleDC()函数来创建兼容设备环境;利用得到的DC对象,调用CDC类的函数,来完成绘制工作;使用DeleteDC()删除创建的DC。返回84OnDraw()函数的使用方法在Windows中是不允许直接访问显示硬件的,要控制显示的对象,需要通过和窗口关联的“设备环境”与显示硬件进行通信。设备环境是由Visual C+的CDC类对象来表示的,该对象以指针的形式作为参数传递给了OnDraw函数,有了这个设备环境指针,就可以在OnDraw函数完成各种各样的绘制工作。返回例如,在Exaple3_9工程文件中有: void CExaple3_9View:OnDraw(CDC* pDC)CExapl

55、e3_9Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here85设备管理有关的数据结构为了对系统中的设备实行有效的管理,设置了一整套数据结构,包括:系统设备表(SDT)、设备控制表(DCT)、控制器控制表(COCT)以及通道控制表(CHCT),称这些表格的数据为“设备管理数据基”。也可以说,设备的管理,实际上是对这些相关数据的表格的管理。 86SDT 系统设备表(System Device Table)SDT表记录着系统中全部标准I/O设备,一种设备一个表项。 内容包括:

56、设备1设备i .SDT设备i特征信息设备类设备标识符进程标识符设备接口模块标识符 每一种设备又建立相应的设备控制块、控制器控制块和通道控制块。87DCT 设备控制表(Device Control Table)为了实现对设备的控制,每一种设备都在DCT表中有一个表项,内容包括: DCTDCT1DCTi设备类型设备标识符设备状态(忙/闲)与设备连接的控制器表指针重复执行次数或时间 *设备队列队头指针设备队列队尾指针注:表示若出错,重复执行的次数或时间。88COCT控制器控制表(COntroller Control Table)为了实现对控制器的控制,每一个控制器都在COCT表中有一个表项,内容包括

57、: COCTCOCT1COCTi控制器标识符控制器状态(忙/闲)与控制器连接的通道表指针控制器队列队头指针控制器队列队尾指针89CHCT 通道控制表(CHannel Control Table)为了实现对通道的控制,每一个通道都在CHCT表中有一个表项,内容包括: CHCTCHCT1CHCTi通道标识符通道状态(忙/闲)与通道连接的控制器表指针通道队列队头指针通道队列队尾指针90基于数据基的管理示意图 SDTDCTCOCTCHCT 申请I/O 申请控制器 申请通道 队列 队列 队列 设备管理程序返回91与分配策略有关的因素I/O设备的固有属性I/O设备的分配算法设备的安全性与设备的无关性 92

58、 I/O设备的固有属性设备属性不同要采用不同的分配方式。独享设备 是一些慢速的设备,它不允许交叉使用,并在使用过程中需要人工干预。因此,一旦占用,只能到用完才能释放、收回。共享设备 如磁盘,其定位操作时间短,可供直接存取操作,可由多进程共享使用,所以采用共享分配方式。共享设备在系统中主要用于存储文件。 93 I/O设备的分配算法I/O调度程序的分配策略与进程调度策略基本相同,但由于I/O操作一旦启动,就不能停止的特点,因此,不能采用进程调度的时间片轮转法。 先请求先分配 当多个进程对同一个设备提出I/O请求时,系统按请求的先后次序将进程排队。设备分配程序将I/O设备分配给队列中第1个进程。优先

59、数最高优先 系统优先响应优先数最高的进程对I/O设备的请求。对优先数相同的I/O请求,则按先请求先分配的原则处理。 94 设备分配的安全性在有些系统下,出于安全的考虑,限定一个进程只能提出一个I/O设备请求,以防止可能产生“死锁”,导致设备分配不安全。设备分配程序在多请求方式中,为保证不发生死锁,一般要采取预防发生死锁的措施。 95 与设备无关性为提高系统的可适应性和可扩展性,应使用户程序和实际使用的物理设备无关。为此引入逻辑设备名和物理设备名的概念。系统规定,在用户程序中只允许使用逻辑设备名。与设备无关性通常是通过系统提供的逻辑设备和物理设备的映象表来实现的(也称为进程连接表PAT。若某逻辑

60、设备已连接到相应的物理设备上,则PAT表中该物理设备表项由该类设备的逻辑设备名和物理设备名组成)。 返回96文件系统的组织基本概念 文件卷(Volume)用于存放文件的存储介质 的统称。一个逻辑盘就是一个文件卷。 块(Block)文件系统中,用来存储、传输文件信息的单位。定长(例如512或1024个字节)。 块长度 不同文件系统,块长度不一样,通常 取2n ;MS-DOS中,用“簇”(2n 个扇区) 作为块长度单位,UNIX中,用“页”作为 长度单位。n97基本概念(续) 文件构成: 为便于管理,一个文件由两个部分组成:文件特征信息;用于管理和操作控制;文件体;是文件的实际内容信息。文件目录及

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论