版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、电脑钢琴系统 汇编语言程序设计课题内容和要求题目描述:利用汇编语言设计一个模拟钢琴演奏程序。在显示器上显示出钢琴的键盘,以计算机键盘的相应键模拟钢琴键盘进行乐曲的演奏。在PC机键盘上按键,屏幕上对应的钢琴键出现跳动,并发出相应音符的声音,例如:按数字 “1”, 发C大调 do按数字 “2”, 发C大调 re按数字 “3”, 发C大调 me 按空格(其它)鍵,退出。基本要求:(1)设计一个基本的只有7键的模拟钢琴键盘;(2)按键时,对应的钢琴键有反映,并发出相应频率的音符声;(3)松键时,对应的钢琴键恢复原状;(4)实物演示时要求讲出程序原理和设计思想;(5)程序运行良好、界面清晰。提高要求:
2、(1)绘制出三维立体钢琴键,随着按键,对应钢琴键有向下的动作;(2)钢琴声随着琴键按下时间的长短持续发出不同长短的声音;(3)扩展钢琴的音域。二、需求和思路分析(1)钢琴的绘制。这部分主要实现画钢琴键盘键身的功能。它是由一个个白色的长方块构成的,要在屏幕上画出有立体效果的长方形白色键盘,我们需要用BIOS调用编织线使程序。显示适配器都自带显示服务的BIOS,利用它所提供的BIOS调用来编写程序,对于我们编程应用者来说是透明的,我们只需要调用显示驱动程序INT 10H。钢琴主要是由矩形、直线等规则几何形状构成,可以采用文本方式,也将屏幕设置成图形显示方式,通过画点、画线等基本程序完成钢琴的绘制。
3、对于绘制钢琴键盘,为使其有立体感,还需要先在稿纸上画出一个缩小版的钢琴键盘,准确计算其各个边界的坐标,包括为使其有立体感而要画出斜线的方法,都需要事先准确推出运算公式。钢琴键盘的动态显示则是同步于键盘的按键有按下和弹起的动画。这部分功能需要也可以用绘制钢琴的方法来实现这个效果。(2)音符的演奏。在PC系列机上,8254的三个计数器各有其作用,计数器0用于维护系统时钟;计数器1用于周期性的向DMA发送数据请求信号,供存储器刷新使用;计数器2接到扬声器用来产生声音。各计数器的输入时钟脉冲频率均为1.19318MHz。通过设置计数值可以产生各种频率的声音。与此同时,许多输入输出操作都是由8255A可
4、编程外设接口来控制的。利用CPU支持的外围电路8254与8255,通过汇编程序改变8255的PB0,PB1口,接通扬声器,使得计算机能够发出一定频率的声音,同时通过8254的与8255连接的2号计数器控制指定频率,从而达到控制扬声器的音调的效果。三、概要设计 绘制钢琴键盘的流程图:在绘制键盘的程序中,基本的就是调用INT 10H,重要的是键盘坐标的设计,以及各个颜色的设定,以实现立体效果。由于要画斜着的键盘键身,而汇编程序本身只有画点的功能,所以我们就要设计一个循环来实现键盘的绘制。对每个坐标点(CX,DX)进行画点,DX不变,CX每画完一个就自增,在规定界限内实现一整行的绘制,而在DX自减1
5、,CX不变则对上一行的点进行绘制。循环便能进行整个键盘竖直部分的绘制。斜线部分则需要一些巧妙的设计,因为设置DI为右边界,而每个点的横坐标CX的起始位置始终是DI减去键盘键身宽度,如果要画斜线则DI、CX在画第一个键盘的时候就应该比竖直部分少1,根据这样的特征,可以先设置一个拐点处的纵坐标值450,高于这个值时,画竖直部分;低于这个值时画斜线部分。发声部分的原理设计是利用可编程定时/计数器8254在扬声器中的应用而完成的。扬声器驱动系统的硬件组成如下图所示。利用8254驱动扬声器发声是由系统插件上8255的外围电路来发出驱动信号的。如下图中的spk data和tim gatespk就是接在82
6、55的输出端口上。其中tim gatespk控制8254定时器来驱动扬声器,spk data来控制扬声器的门电路。直接由门电路驱动发出的声音比较难听,通过滤波器滤掉杂波之后会更动听一些,所以最好如下图所示加一个滤波器。8255A由一个控制寄存器,三个输入输出数据寄存器。输入输出寄存器又称为输入/输出端口。这三个端口的名字分别称为A口、B口和C口。一般编址为60H,61H和62H。在系统初始化的时候已经将A口和C口设为输入方式,B口设为输出方式。可以通过对8254计数器编程使产生某一频率的方波,输出经过驱动器驱动,推动扬声器发出声音。发声部分的流程图:键盘按下有声音且要保持声音随按键的长短而不同
7、,需要监视8255状态端口,在没有丢开键时,扬声器不会关闭而会一直发声。在键盘17按下的同时要屏幕键盘要有显示,则需要调用DOWN子程序,来实现琴键按下的动态效果。因为在扬声器没有关闭时,不会调用UP子程序,所以琴键也会随按键的长短而停留住,使按键的动态效果更加合理。DOWN、UP子程序原理和绘制钢琴键盘部分一样,在这里就不再累述。四、详细设计 详细源代码及注释:DATA SEGMENT DAT DB 0, 45, 75, 100, 125, 157, 190, 222, 252 ;各音阶发声的对应的不同频率值LEN DB 0, 6, 14, 22, 30, 38, 46, 54, 62 ;屏
8、幕所画键盘的每个键身的右边界值DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATASTART: MOV AX,DATA MOV DS,AXMOV AH,0 ; 设置屏幕显示图形方式:每屏幕字符数8025, 16色MOV AL,12H INT 10H ; 调用10H的0号功能中断MOV AH,6 ; 窗口上滚功能调用 MOV AL,0 ; 设置颜色为黑色MOV CH,0 MOV CL,0 MOV DH,18H MOV DL,4FH ;窗口坐标INT 10H ;执行中断MOV SI,360 ;键盘键身的最上面坐标MOV DX,480 ;键盘键身的最下面坐标 M
9、OV DI,540 ;键盘键身的右边界初始值MOV CX,540 ;画键盘键身的初始横坐标REDRAW: SUB DX,1 ;画完一行的键盘后画另一行CMP DX,445 ;为起到三维效果而产生斜线的临界坐标 ,比较JA ZHI ;大于445就处在竖直的键盘处,跳转到画竖直部分代码处CMP DX,SI ;与键盘键身的最上边界比较JB LL ;低于此坐标说明整个键盘绘画完毕,跳转至发声程序代码处 XIE: ;低于临界坐标时要进行画斜线部分的坐标处理SUB DI,479 ;右边界和写点横坐标都减去固定值再减去1SUB CX,539 ;右边界和写点横坐标都减去固定值再减去1JMP HH ;跳转至写点
10、的代码部分ZHI: ;高于临界坐标时任然要进行画竖直部分的坐标处理SUB DI,480 ;右边界和写点横坐标都减去固定值SUB CX,540 ;右边界和写点横坐标都减去固定值HH:MOV BL,0 ;对每个键盘键身的一行进行计数, PAINT: MOV AL,15 ;画白色键身MOV AH,0CH MOV BH,0 ;在第0号显示页写点 INT 10H ;10号中断的0C号功能实现写点 INC CX ;写完一个点后纵坐标不变,横坐标加一继续写点 CMP CX,DI JBE PAINT ;在没有超过右边界的时候按横坐标加一继续写点 ADD DI,80 ;超过右边界后则对右边界和横坐标进行处理AD
11、D CX,20 INC BL ;在这种情况下说明一个键盘键身的一行画完了,在纵坐标不变的情况下画下一个键盘键身的一行 CMP BL,6 ;设定键盘数目JBE PAINT JMP REDRAWLL: MOV AL,80H ;对8255进行初始化工作,A口、B口均为输出状态工作与方式0 OUT 63H,AL ;写入控制端口 MOV AL,0B7H ;对计数器8254进行初始化工作,选2号计数器,且先读写低8位后高8位,工作与模式3 OUT 43H,AL ;写入控制端口PP: MOV AH,01H ;调用键盘中断等待键盘输入,并将键盘输入对应的ASCII码值做出口参数存入AL INT 16H JZ
12、PP ;没有键盘输入循环等待SUB AL,30H ;将对应的ASCII码值减去30留下个位数值,以便取表中对应的边界值和发声频率值 CMP AL,08H ;AL中的参数将传递到SOUND子程序去,此处还有按键范围的作用,按键不是17将溢出跳出 JAE OVER1CALL SOUND ;调用发声程序子程序JMP PP ;一个按键的发声结束,等下一个键盘输入OVER1:JMP OVER ;溢出SOUND PROC NEAR ;发声子程序PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI ;保护变量,以便在此子程序中用到变量时不至改变原值影响下面操作MOV AH,0 ;使
13、SI中的值就是键盘参数的十进制值 MOV SI,AX ; 保护AL于SI中,以待后用,作为参数传递 MOV BX,OFFSET DAT XLAT ;差频率值表中的值,并赋给ALMOV DI,AX ;设置发声频率值的对应键盘所要频率MOV DX,12H MOV AX,34DCH ; PC机内置计数器的输入时钟脉冲频率的16进制值1234DCDIV DI ;出后得到8254计数初值 OUT 42H,AL ;先写低8位 MOV AL,AH OUT 42H,AL ;后写高8位 IN AL,61H ;读PB口当前状态OR AL,3 ; 使PB0、PB1均为1OUT 61H,AL ;接通扬声器,此时喇叭将
14、在计数器输出的频率工作发声,且CPU得以解放可执行下面的绘图工作CALL DOWN ;调用使键盘产生向下按的效果的子程序WAIT1: IN AL,60H ;查看8255状态端口 TEST AL,80H ;查询键是否放开 这样键不松开就会一直出声 JZ WAIT1 ;未放开继续查询CALL UP ;调用使键盘产生向上跳起效子程序MOV AL,0 ;关闭扬声器 OUT 61H,ALMOV AL,0H MOV AH,0CH INT 21HPOP SI ;还原变量 POP DX POP CX POP BX POP AX RETSOUND ENDPDOWN PROC NEAR ;键盘按下子程序 PUSH
15、 AX PUSH BX PUSH CX PUSH DX PUSH DIMOV AX,SI ;将上面做参数保存起来的SI传递到此运用 MOV BH,AL ;BH中表示按得是什么键, MOV BL,0 PUSH BX MOV BX,OFFSET LEN XLAT ;查边界值表得到键盘键身的右边界值,并将结果赋给AL POP BX ;BH中表示按得是什么键, PUSH BX ;将取出的右边界值作*10处理MOV BX,10MUL BXPOP BXMOV SI,AX ;SI中为横坐标的边界MOV DX,450 ;键盘竖直部分要实现按下效果的起始纵坐标 MOV DI,475 ;键盘竖直部分实现按下效果的
16、临界值 GO: PUSH SI SUB SI,60 ;边界减去键盘键身的宽度得到写点的起始横坐标CX MOV CX,SI POP SI CA: MOV AL,0 ;对得到的(CX,DX)点进行写黑色实现擦除效果MOV AH,0CH MOV BH,0 INT 10H INC CX ;某键盘键身的某行的一个个横坐标点 CMP CX,SI ; 画好一行没有?JBE CA INC DX ;一行画好后画另一行 CMP DX,DI JBE GOPOP DI POP DX POP CX POP BX POP AXRETDOWN ENDPPUSH BX ;一段延时程序,以使键盘按下效果不至于太快 PUSH C
17、X MOV BX,1000 DELAY:MOV CX,0FfFH DL10MS:LOOP DL10MS DEC BX JNZ DELAY POP CX POP BXUP PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH DIMOV AX,SI ;将上面做参数保存起来的SI传递到此运用 MOV BH,AL ;BH中表示按得是什么键, MOV BL,0 PUSH BX MOV BX,OFFSET LEN XLAT ;查边界值表得到键盘键身的右边界值,并将结果赋给AL POP BX ;BH中表示按得是什么键, PUSH BXMOV BX,10 ;将取出的右
18、边界值作*10处理MUL BXPOP BXMOV DX,475 ;键盘竖直部分要实现弹起效果的起始纵坐标 MOV DI,450 ;键盘竖直部分要实现弹起效果的临界纵坐标OK: PUSH SI SUB SI,59 ;边界减去键盘键身的宽度得到写点的起始横坐标CX MOV CX,SI POP SI SB: MOV AL,15 ;对得到的(CX,DX)点进行写白色实现弹起效果 MOV AH,0CH MOV BH,0 INT 10H INC CX ;某键盘键身的某行的一个个横坐标点 CMP CX,SI ; 画好一行没有? JBE SB DEC DX ;一行画好后画另一行 CMP DX,DI JAE O
19、KPOP DI POP DX POP CX POP BX POP AXRETUP ENDPOVER: MOV AH,4CH INT 21HCODE ENDS END START五、测试数据及其结果分析测试运行结果如下:初始键盘竖直部分效果如下:此结果比较合理的完成了初步设计。实现简单立体效果后绘制的钢琴键盘如下所示:当按下一个键时键盘显示一直按下,并一直发声,视觉效果如下所示:这几步实现设计的所需的功能要求。六、调试过程中的问题调试过程中出现了很多问题,比如琴键的坐标选取的不是很好,出现了不对齐的情况。经过再次仔细的运算,发现几个坐标在运算过程中会有所偏差,便对其做了相关的修改。而监视8255
20、状态端口以实现发声时间的长短,则一直不是很顺利。起初的想法是是查看键盘缓冲区是否有值,但发现键丢开并不会自动使键盘缓冲区的值去除。经过网上找寻相关功能,终于理解了可以监视8255状态端口的方法来实现监视键盘动作。值得改进的地方我觉得就是琴键饿设计,可以考虑在两个白色琴键中间再加上黑色琴键,这样会更加逼真。而且琴键按下的时候可以改进成整个键身都会按下,而不是只有竖直部分有按下的效果,不过这一想法实现起来应该不是那么容易。七、专业课程设计总结本程序的关键技术在于BIOS程序调用、输入/输出和键盘中断的等方面的相关知识,包括BIOS INT10H程序调用、I/O接口信息、I/O端口寻址、输入/输出指
21、令、数据传送方式、键盘中断和子程序调用等。通过设计解决了显示器绘制图形、I/O寻址及端口地址分配等的问题,不仅回顾了汇编程序设计各个方面的知识,熟练了代码的编写,也加深了对输入/输出的操作的理解。正因为汇编语言的特殊性,是要与硬件直接打交道,所以所用的语言也更难懂,难记。但通过这次课程设计后,我更加熟练地掌握了汇编程序的设计与代码的编写,也对PC机的相关硬件有了更多的认识,如何操作、有何作用都有了很清楚的概念。当然在此次课程设计中也遇到了不少问题,比如一开始并不知道如何用汇编画图,对8255、8254的控制设置,端口地址的用处还不是很清楚,这些都通过半天时间的看书得以解决,所以以后我应该把知识
22、学得更加牢靠一点,到用到的时候就会水到渠成。在完成基本要求后便在提高要求的解决上费了一番功夫,主要是斜线画法的构思和如何实现扬声器一直发声直到键盘的按键丢开。在斜线问题的解决上是某次灵感突发而想到的,而监视8255状态端口的想法则有所参考。所以以后我定当要把知识学牢,运用起来也就会容易很多。在程序的调试过程中,出现的问题有些是由于不够仔细,而有些则是由于对概念和原理对的不清晰造成的。虽然都成功的调试通过,但有些错误还是值得我在以后的学习中深思和反省的。以使以后不会在出现类似的问题。对这门课程,我觉得老师的题目选的很好,对我从多方面进行了考察:实际的动手能力和理论知识的掌握情况等。这将使我们牢固
23、掌握所学知识,不会遗忘。考核方式也很合理,在适当监督的基础上给我们自己发挥的空间。文件系统管理 操作系统课题内容和要求实验针对操作系统的文件系统进行题目设计,要求编程实现操作系统文件系统管理的部分功能,具体包括:(1) 实现一个文本文件(即流式文件)中某信息的插入和删除;(2) 实现一个记录文件的某个记录的插入和删除。基本要求:(1) 任选C、C+和Java语言实现以上两个功能;(2) 文本文件包含中文和英文;(3) 程序运行良好,界面清晰。提高要求:(1) 实现文本文件的多个信息或者记录式文件多个记录的插入和删除;(2) 能够用MFC或Java实现可交互的图形用户界面。二、需求和思路分析对于
24、第一个要求,要对文本文件进行操作,首先要对文本文件有足够的了解。Windows操作系统中的文本文件其实就是操作系统中文件系统的流式文件,知道了这一点将对程序设计有很大的帮助。流式文件内的数据只是一串顺序的信息集合。流式文件中的每个字节都有一个索引,第一个字节的索引是0,第二个字节的索引是1,以此类推,打开文件的进程使用文件读写位置来访问文件中的特定字节。当文件打开时,文件读写位置(指针)指向首字节,每k个字节的读或写操作的完成,则将文件的读写位置(指针)加k。提供使用流式文件的系统调用有:read()、write()、seek()。C函数库再调用这些函数构成自己的文件操作函数。在文本文件的题目
25、设计中首先是要实现文件打开,在此之后才能对其某个信息进行读写、修改、删除。可以利用系统函数fopen()函数打开想要进行操作的文件。因为在windows操作系统中的文本文件是流式文件,所以对其的读取可以直接调用fseek()函数进行定位要操作的位置。但在MFC中却没有必要这么复杂,可以直接运用Microsoft Windows的现成资源图标、位图和游标在Microsoft Visual C+中直接编辑。这样便可以省去自己调用文件系统的系统函数。记录式文件是一种有结构的文件,它包含若干逻辑记录,逻辑记录是文件中按信息在逻辑上的独立含义所划分的信息单位,记录在文件中的排列按其出现次序编号,记录0,
26、记录1,等等。逻辑记录的概念被应用于许多场合,如某学校的学生住宿文件中,每个学生的住宿信息是一条逻辑记录,整个学校学生的住宿信息,即全部逻辑记录,便组成了学校的住宿文件。从操作系统管理的角度来看,逻辑记录是文件内独立的最小信息单位,每次总是为使用者存储、检索或更新一条逻辑记录,同流式文件一样,通过文件读写位置(指针)来指定对文件信息的访问,但是在记录式文件中,文件的记录位置取代字节位置。为了方便记录是文件的组织和管理,提高文件记录的查找效率,通常对逻辑文件的每条逻辑记录至少指定一个与其对应的基本数据项,利用它可与同一文件中的其他逻辑记录区别开来。这个用于标识某条逻辑记录的数据项称为记录键,也叫
27、做关键字,简称键(下面将知道在程序设计中使用结构型数组的下标来作为记录键的)。而在记录是文件的设计中要对某条记录进行插入或者删除则没有文本文件那么容易,首先是记录的构建,由于Microsoft Visual C+并不能像Java一样创建由Excle文件构成的记录式文件,所以只能用以文本文件作为存储,并在程序运行时以记录的格式读出并操作。在定下这个以文本文件作存储的思路后就要解决如何实现构建每条记录。如果这一块解决那么记录是文件的操作便也可以顺利的解决。最后我是这样解决这个问题的,构建一个结构型数组作为记录存入文本文件。这样便能在操作实现整个记录的读出、插入和删除。首先要定义好这个结构型数组,其
28、次就是文本文件的打开并将输入已记录的形式存入文本文件,最终在主函数中实现读入,并实现插入某个记录或者删除某条记录。三、概要设计 对文本文件某信息插入和删除的算法流程图如下:用MFC实现文本文件的插入、删除操作相对比较简单,首先要用到的就是文本编辑框,将此控件拖入窗口中,利用Microsoft Windows的现成资源图标、位图和游标在Microsoft Visual C+中的文本编辑框中直接编辑,以实现键盘输入信息的缓存功能。“读入”按钮触发事件读取指定路径的文本文件的内容,CTxtFileDlg:OnBUTTONOpen()函数实现此功能,将文本文件的内容读入到文本编辑框中以供编辑。“插入”
29、按钮触发事件将在文本编辑框中的光标闪烁位置插入的信息插入到指定路径的文本文件中,CTxtFileDlg:OnBUTTONSave()函数实现此功能。“删除”按钮触发事件将在文本编辑框中选中的信息删除,并将删除后的文件存入文本文件,CTxtFileDlg:OnBUTTONClear()函数来实现此功能。对记录式文件某记录的插入和删除的算法流程图如下:这部分的记录用一个结构型数组record来表示并存储在文本文件中,当打开这个文件时以这个结构型数组的固定长度为每次读取文件的的长度,便能实现以记录的形式读出记录。这部分开始打开一个文本文件需要先用到fopen()函数打开一个指定路径的记录文并返回文件
30、的头指针给first文件指针,读取记录时每次first指针移动结构型数组的长度。程序提示可以进行的操作:插入记录或者删除记录。选择插入时,程序首先提示要插入记录的记录键(这里用结构型数组的下标来作为记录键),等待输入后便提示输入记录的值,用户输入完成后程序会把更新完成的记录在输出显示一遍。选择删除时,程序首先提示要删除的记录记录键。等待输入后便删除指定记录键的记录。四、详细设计 文本文件信息的插入和删除代码分析:TxtFile.dsp该文件(项目文件)包含的信息,在项目的水平是用来建立一个单一的项目或子项目。其他用户可以共享项目(.DSP)的文件,但他们应该用当地的Makefiles文件。Tx
31、tFile.h这是主要的头文件的应用程序。它包括其他项目的具体标题(包括Resource.h )和声明CTxtFileApp应用类。省去了一些VC注释代码如下:#if !defined(AFX_TXTFILE_H_E0B47DD9_9DDB_43B1_9609_D821319FBAE2_INCLUDED_)#define AFX_TXTFILE_H_E0B47DD9_9DDB_43B1_9609_D821319FBAE2_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000#ifndef _AFXWIN_H_#error in
32、clude stdafx.h before including this file for PCH#endif#include resource.hclass CTxtFileApp : public CWinApppublic:CTxtFileApp();public:virtual BOOL InitInstance();DECLARE_MESSAGE_MAP();#endif#include stdafx.h#include TxtFile.h#include TxtFileDlg.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEst
33、atic char THIS_FILE = _FILE_;#endifTxtFile.cpp这是主要的应用,其中包含源文件的应用类的CTxtFileApp。省去VC的提示代码如下:BEGIN_MESSAGE_MAP(CTxtFileApp, CWinApp)ON_COMMAND(ID_HELP, CWinApp:OnHelp)END_MESSAGE_MAP()CTxtFileApp:CTxtFileApp()/ TODO: add construction code here,/ Place all significant initialization in InitInstanceCTxtF
34、ileApp theApp;BOOL CTxtFileApp:InitInstance()AfxEnableControlContainer();#ifdef _AFXDLLEnable3dControls();#elseEnable3dControlsStatic();#endifCTxtFileDlg dlg;m_pMainWnd = &dlg;int nResponse = dlg.DoModal();if (nResponse = IDOK)/ TODO: Place code here to handle when the dialog is/ dismissed with OKel
35、se if (nResponse = IDCANCEL)/ TODO: Place code here to handle when the dialog is/ dismissed with Cancelreturn FALSE;TxtFile.rc这是一个所有程序使用的Microsoft Windows资源的清单,它包括图标,位图,和游标是储存在复位子目录。此文件可以直接在Microsoft Visual C+编辑。TxtFileDlg.h , TxtFileDlg.cpp -对话 这些文件包含有您的CTxtFileDlg级。这个类的定义了你的应用程序的主对话框的行为。对话的模板是在Txt
36、File.rc ,可在Microsoft Visual C+编辑。StdAfx.h , StdAfx.cpp 这些文件是用来建立一个预编译头(PCH)文件名为TxtFile.pch和名为StdAfx.obj的预编译类型文件。 Resource.h 这是标准的头文件,它确定新资源的ID。Microsoft Visual C+中读取和更新该文件。主程序代码:/ TxtFileDlg.cpp : implementation file/#include stdafx.h#include TxtFile.h#include TxtFileDlg.h#ifdef _DEBUG#define new DE
37、BUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endifclass CAboutDlg : public CDialogpublic:CAboutDlg();protected:DECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)/AFX_DATA_INIT(CAboutDlg)/AFX_DATA_INITvoid CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(
38、pDX);/AFX_DATA_MAP(CAboutDlg)/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CAboutDlg, CDialog)/AFX_MSG_MAP(CAboutDlg)/ No message handlers/AFX_MSG_MAPEND_MESSAGE_MAP()CTxtFileDlg:CTxtFileDlg(CWnd* pParent /*=NULL*/): CDialog(CTxtFileDlg:IDD, pParent)/AFX_DATA_INIT(CTxtFileDlg)/ NOTE: the ClassWizard will add membe
39、r initialization here/AFX_DATA_INIT/ Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);void CTxtFileDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CTxtFileDlg)/ NOTE: the ClassWizard will add DDX and DD
40、V calls here/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CTxtFileDlg, CDialog)/AFX_MSG_MAP(CTxtFileDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON_Open, OnBUTTONOpen)ON_BN_CLICKED(IDC_BUTTON_Save, OnBUTTONSave)ON_BN_CLICKED(IDC_BUTTON_Clear, OnBUTTONClear)/AFX_MSG_MAPEND_MESSAGE_M
41、AP()/ CTxtFileDlg message handlersBOOL CTxtFileDlg:OnInitDialog()CDialog:OnInitDialog();ASSERT(IDM_ABOUTBOX & 0 xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);SetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE);
42、/ Set small iconreturn TRUE; / return TRUE unless you set the focus to a controlvoid CTxtFileDlg:OnSysCommand(UINT nID, LPARAM lParam)if (nID & 0 xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialog:OnSysCommand(nID, lParam);void CTxtFileDlg:OnPaint() if (IsIconic()CPaintDC dc(thi
43、s); / device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);/ Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height
44、() - cyIcon + 1) / 2;/ Draw the icondc.DrawIcon(x, y, m_hIcon);elseCDialog:OnPaint();HCURSOR CTxtFileDlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;void CTxtFileDlg:OnBUTTONOpen() /实现文本文件的读入,/ TODO: Add your control notification handler code hereCString csFileName;char *zStr = hh.txt; /指定的文件路径csFileN
45、ame=zStr;CStdioFile out;out.Open(csFileName, CFile:modeRead);CStringcsSQL=,cs;doout.ReadString(cs); /只能读取一行csSQL+=cs;csSQL+=rn;while ( out.GetPosition()SetDlgItemText(IDC_EDIT,csSQL);out.Close();void CTxtFileDlg:OnBUTTONSave() /在文本边框内插入信息后用此按键触发的事件实现存入到文本文件/ TODO: Add your control notification handl
46、er code hereCString csFileName;char *zStr = hh.txt;csFileName=zStr;CStdioFile out;out.Open(csFileName, CFile:modeCreate | CFile:modeWrite);CStringcsSQL;this-GetDlgItemText(IDC_EDIT,csSQL);out.WriteString(csSQL);out.Close();void CTxtFileDlg:OnBUTTONClear() /在文本边框内删除信息后用此按键触发的事件实现存入到文本文件/ TODO: Add yo
47、ur control notification handler code hereCString csFileName;char *zStr = hh.txt;csFileName=zStr;CStdioFile out;out.Open(csFileName, CFile:modeCreate | CFile:modeWrite);CStringcsSQL;this-GetDlgItemText(IDC_EDIT,csSQL);out.WriteString(csSQL);out.Close();记录式文件记录插入和删除的代码:#include#includestruct record /结
48、构型数组的定义char name10;int no;int age;char sex15;stud4;void save() /定义一个函数实现命令行输入的记录写入指定文件int i;FILE *fp;if(fp=fopen(creat.txt,wb)=NULL) /以读写方式打开creat.txt文件printf(errn);exit(0);for(i=0;i4;i+)if(fwrite(&studi,sizeof(struct record),1,fp)!=1) /以固定长度向文本文件中写入记录printf(errn);fclose(fp);void main()int i;for(i=0
49、;i4;i+)printf(input the NO.%d record:n,i+1);scanf(%s%d%d%s,,&studi.no,&studi.age,studi.sex); /从键盘输入记录值printf(donen);save();创建记录文件代码结束。显示记录的函数代码:#include#includestruct student_type /记录的结构型数组的定义char name10;int num;int age;char addr15;stud4;void main()int i;FILE *fp;fp=fopen(creat.txt,rb); /以
50、只读的方式打开creat.txt文件for(i=0;i4;i+)/fseek(fp,i*sizeof(struct record),0);printf(The NO.%d record is:,i+1);fread(&studi,sizeof(struct student_type),1,fp); /将每条记录读入内存并在下面的函数调用中显示printf(%-10s %4d %4d %15sn,,studi.num,studi.age,studi.addr);fclose(fp);实现插入和删除的代码:#include#includestruct record /记录的结构
51、型数组的定义char name10;int no;int age;char sex15;rec5,temp;void main()int i,num,place;FILE *first,*second;if(first=fopen(creat.txt,rb)=NULL)printf(err);exit(0);for(i=0;i4;i+) /从文件读入记录fseek(first,i*sizeof(struct record),0);fread(&reci,sizeof(struct record),1,first);fclose(first);printf(想干嘛:1、插入2、删除n);scan
52、f(%d,&num);if(num=2) /删除一个记录printf(chose 14 to delete?n);scanf(%d,&place); /要删除的记录号for(i=place-1;i3;i+)reci=reci+1; /直接将要删除的记录的记录键覆盖printf(The new record is:n);for(i=0;i3;i+)printf(The NO.%d record is:,i+1);printf(%-10s %4d %4d %15sn,,reci.no,reci.age,reci.sex);printf(ENDn);if(second=fopen(show.txt,wb)=NULL) /打开要写回的文件printf(err);exit(0);for(i=0;i4;i=place;i-)reci=reci-1; /将要插入记录的后面记录逐个后移reci=temp; /将要插
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年个人与建筑公司借款合同范本汇编4篇
- 二零二五年度企业员工关系管理与冲突预防协议范本3篇
- 2025年度新型环保材料租赁经营合同模板4篇
- 二零二五年度商业活动场地借用及宣传合同2篇
- 二零二五年度体育产业普通合伙企业合作协议范本4篇
- 2025年度5G产业投资理财协议
- 2025年三方知识产权转让还款协议书范本及内容说明3篇
- 个性化定制2024年版民间资金借贷协议范本版B版
- 2025年酒店住宿赔偿协议范本
- 个人股份转让协议书
- 2024-2030年中国海泡石产业运行形势及投资规模研究报告
- 动物医学类专业生涯发展展示
- 2024年同等学力申硕英语考试真题
- 消除“艾梅乙”医疗歧视-从我做起
- 非遗文化走进数字展厅+大数据与互联网系创业计划书
- 2024山西省文化旅游投资控股集团有限公司招聘笔试参考题库附带答案详解
- 科普知识进社区活动总结与反思
- 加油站廉洁培训课件
- 现金日记账模板(带公式)
- 消化内科专科监测指标汇总分析
- 混凝土结构工程施工质量验收规范
评论
0/150
提交评论