【教学课件】第9章编程技巧.ppt
《【教学课件】第9章编程技巧.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第9章编程技巧.ppt(26页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第9章章 编程技巧编程技巧第一节第一节 表达式解释计算表达式解释计算第二节第二节 C与操作系统接口设计与操作系统接口设计第三节第三节 C与汇编语言的接口与汇编语言的接口第四节第四节 程序调试问题程序调试问题1/26C语言程序设计语言程序设计 龙昭华主编第一节第一节 表达式解释计算表达式解释计算(第九章(第九章 编程技巧)编程技巧)2/26一、一、表达式句法定义表达式句法定义 需要定义一个含有+、-、*、/的运算表达式。加、减、乘、除四则运算符及括号的意义完全与平常的算术运算习惯一致。程序接受一行字符串,并对它进行表达式的解释计算,这就相当于一个简单的编译系统。数:数:num()数字数字数字数
2、字.因子:因子:factor()数数)表达式表达式(项:项:term()因子因子*/因子因子表达式:表达式:expr()项项+-项项二、二、各句法对应函数各句法对应函数第一节第一节 表达式解释计算表达式解释计算3/26(第九章(第九章 编程技巧)编程技巧)为了便于识别表达式的各成份,并计算它们的值,需要定义相应的函数:num()函数:将数的字符序列转换成数值。如:9、8.12、-10.30、1230等。factor()函数:计算因子的值。如:-91.89、(90*10.8+5.8)、60等。term()函数:计算项的值。如:89、(9/2+10)、90*7/10、(10-2)/2等。exor(
3、)函数:计算表达式的值。如:9+(10/2-9)、200-90、30+0.99等。由于表达式句法的递归定义,这些函数也将通过相互递归调用求得各自对应成份的值。假设主函数控制流程是反复读入一行正文,调用表达式计算函数expr(),求出表达式的值并输出,直至输入空行结束。程序中引入下列全局变量:buf字符数组,存储一行正文信息。cpt为当前正待识别的字符指针。result为存储表达式计算结果的变量。主函数的算法主函数的算法为:读入一行存buf数组。如果输入行非空转,否则转。置cpt初值。计算表达式值result=expr();输出result的值。转。退出。在第4步中所用到的函数需要编写,其余函数
4、用标准库函数完成。1 1、expr()expr()函数算法函数算法第一节第一节 表达式解释计算表达式解释计算4/26(第九章(第九章 编程技巧)编程技巧)根据表达式的句法定义,expr()函数有以下形式:double expr()value1=term();/*调用函数term()求项值*/while(当前有效字符为+或-)保存运算符;value2=term();/*求下一个项值*/if(运算符=+)value1+=value2;else value1-=value2;return value1;函数函数term()term()的算法与函数expr()的算法类似。函数term()调用facto
5、r()完成因子计算,处理乘除法运算符*和/。对于除法需要考虑除数为0的情况。说明说明:当前有效字符是指非空白字符。2 2、factor()factor()函数算法函数算法第一节第一节 表达式解释计算表达式解释计算5/26(第九章(第九章 编程技巧)编程技巧)当前有效字符为数字符,因子是一个数。转换该数的字符序列为数值,作为因子的值。当前有效字符为左括号(,因子是一个带括号的表达式。递归调用函数expr(),以表达式的值作为因子的值。且表达式计算后,当前有效字符应为右括号),否则因括号不正确配对,是个句法错误的表达式。当前有效字符为其它字符,也是个句法错误的表达式。double factor()
6、if(当前有效字符为数字符)return num();if(当前有效字符=()移动字符指针至下一个有效字符;fvalue=expr();if(当前有效字符=)移动字符指针至下一个有效字符;else 报告表达式句法错误;return fvalue;else 报告表达式句法错误;return 1.0;注意注意:这里没有讨论有)而没有(与之匹配的问题。三、三、完整的程序完整的程序第一节第一节 表达式解释计算表达式解释计算6/26 3 3、num()num()函数算法函数算法 num()函数实际上就是字符转换成数值。先转换整数部分,整数每位数字乘以10,使用循环完成。如果还有小数点.,则小数点后面的数
7、字乘以0.1,仍使用循环完成。(第九章(第九章 编程技巧)编程技巧)例例9.1 9.1 表达式解释计算的详细程序见表达式解释计算的详细程序见li9_1.c。运行结果:9+8 (enter)he result is 17.000000(10-20)*2+5 (enter)he result is-15.0000009+9*9+1-(10/2+1.9)(enter)he result is 84.100000(enter)注:最后一个回车退出循环。第二节第二节 C与操作系统接口设计与操作系统接口设计(第九章(第九章 编程技巧)编程技巧)7/26一、一、BIOS中断表中断表 在C语言编程中,常常需要
8、利用操作系统如DOS的低级资源,而这些资源不能使用C编译程序访问,必须使用DOS中断(软中断)才能完成。中断中断是一种特殊类型的指令,它停止执行当前程序,把系统当前状态保留在堆栈中,然后转移到由中断号确定的相应的中断处理子程序上。当中断子程序执行完时,它执行中断返回,使原先运行的程序恢复执行。中断分为硬中断和软中断两种基本类型。8086CPU允许程序通过INT指令执行软中断,跟在INT指令后的数字指定所用的中断号。如:INT 21h执行21h号中断。中断号是用来找出相应的中断处理程序的。在PC-DOS中,使用软中断访问操作系统功能,每个中断命令都有其专门的访问功能类型,而且这些功能函数是由AH
9、寄存器中的值决定的。如果需要增加信息,所增加的信息传给AX、BX、CX和DX寄存器。PC-DOS操作系统分为ROM-BIOSROM-BIOS(Basic I/O System)和DOSDOS(Disk OperatingSystem)两部分。ROM-BIOS提供最低层子例程,而DOS用这些低层子例程提供进一步的高级功能。二者是交叉在一起的,用户访问它们的方法基本相同:都是通过软中断。BIOS中断表中断表(续续)第二节第二节 C与操作系统接口设计与操作系统接口设计8/26(第九章(第九章 编程技巧)编程技巧)中断号中断号11h5h10h12h13h14h屏幕打印服务程序15h16h1Ah17h1
10、8h19h打印机I/O盒带控制键盘I/O执行ROM BASIC执行引导装入程序系统时间和日期设置功功 能能功功 能能中断号中断号显示器I/O设备清单内存大小磁盘I/O串行口I/O在PC-DOS中,ROM-BIOS有12个中断,如下表所示:访问上表中断有两种方法:一是使用系统调用函数int86(),二是使用汇编语言接口来实现。大多数C都提供了int86()函数。int86()函数的一般格式如下:#include int int86(int intnum,union REGS *in,union REGS *out)二、二、利用利用int86()函数访问函数访问BIOS系统功能系统功能第二节第二节
11、 C与操作系统接口设计与操作系统接口设计9/26 在int86()中需要用到的结构体与共用体如下:(第九章(第九章 编程技巧)编程技巧)/*字符寄存器*/struct WORDREGS unsigned int ax,bx,cx;unsigned int dx,si,di unsigned int cflag,flags;struct BYTEREGS unsigned char al,ah;unsigned char bl,bh;unsigned char cl,ch;unsigned char dl,dh;/*寄存器字节*/unionREGS struct WORDREGS x;struc
12、t BYTEREGS h;例例9.2 利用10h号中断功能6,可以实现清屏。#include void cls()union REGS r;r.h.ah=6;/*屏幕转动程序*/r.h.al=0;/*清屏程序*/r.h.ch=0;/*上转起始行*/r.h.cl=0;/*列起始列起始*/r.h.dh=24;/*上转结束行上转结束行*/r.h.dl=79;/*列结束列结束*/r.h.bh=7;/*空行是黑色空行是黑色*/int86(0 x10,&r,&r);例例9.3 9.3 调用调用16h16h号中断号中断0 0号功能读取键盘扫描码。号功能读取键盘扫描码。第二节第二节 C与操作系统接口设计与操作
13、系统接口设计10/26(第九章(第九章 编程技巧)编程技巧)在为IBM-PC及其兼容机编程时,最难读到的是箭头键和功能键,以及INS、DEL、PGUP、PGDN、END、HOME等键的ASCII码值。键值存放如下:int c;char sc2;sc0sc1 当用户在IBM-PC机上按下一个键时,产生一个称为扫描码的两个字节(16位)的值。该扫描码由两部分组成:低位低位字节内含相应键的ASCII码码(若它是标准键),高位高位字节内含该键在键盘上的定位码定位码。对于标准键的定位码为0,因此低位的值就是它的ASCII码值(8位)。而对于特殊键,它的低位值为0,高位的值才是它的键值。要得到特殊键值,不
14、能使用gets()、scanf()等函数,只能用这里提供的方法。其程序参见li9_3.c。运行结果显示部分键盘扫描码为:A-65 a-97 0-48 9-57 (-40 +-43 -60 =-61左箭头左箭头-75 右箭头右箭头-77 上箭头上箭头-72 下箭头下箭头-80INS-82 DEL-83 F2-60 F3-61 F10-68 ESC-27 PGUP-73 PGDN-81 END-79 HOME-71int get_key()union REGS r;r.h.ah=0;return(int86(0 x16,&r,&r);三、三、利用利用DOS访问系统功能访问系统功能第二节第二节 C与
15、操作系统接口设计与操作系统接口设计11/26(第九章(第九章 编程技巧)编程技巧)PC-DOS中由ROM-BIOS引导装入程序装入和执行的部分叫DOS。其中包含了大部分在ROM-BIOS例程中找不到的各种各样的高级功能,利用AH寄存器传送所请求的DOS功能调用号,通过中断21h可以访问DOS的所有功能。如1 1号功能号功能为从键盘读字符,2 2号功能号功能为在屏幕上显示字符,3 3号功能号功能从异步端口读字符,4 4号功能号功能写字符到异步端口,5 5号功能号功能在打印机上打印字符,B B号功能号功能检查键盘状态,2A2A号功能号功能读取系统日期,2B2B号功能号功能设置系统日期,2C2C号功
16、能号功能读取系统时间等。虽然可以像ROM-BIOS功能一样,利用int86()函数访问DOS功能,但很多系统都有一专门函数bdos(),该函数用来执行21h号中断调用,调用操作系统中的某个高级功能。bdos()函数原型如下:int bdos(int fnum,unsigned int Reg_DX,unsigned int Reg_AL)int bdos(int fnum,unsigned int Reg_DX,unsigned int Reg_AL)其中其中:fnum是DOS功能号;Reg_DX的值赋给DX寄存器;Reg_AL的值赋给AL寄存器;返回值返回值:bdos()回送AX寄存器的值。
17、例例9.4 9.4 调用调用12h12h号中断号中断BhBh号功能检查键盘状态。号功能检查键盘状态。第二节第二节 C与操作系统接口设计与操作系统接口设计12/26(第九章(第九章 编程技巧)编程技巧)#include#include int kbhit()int kbhit()return(char)bdos(0 xB,0,0);return(char)bdos(0 xB,0,0);除了第一个参数外。其余都用0,因为不需要其它信息。把返回值强行变成char型是必要的,因为所返回的是在AL中的状态,而AL没有定义。kbhit()函数的返回值为:如果按下键,则返回“真”,否则返回“假”。kbhit
18、()函数的一个非常普通的用途就是可以让某个子例程被用户命令所中断。例例9.5 调用12h号中断的3号功能读串口,4号功能写串口。如果需要编写一个调制解调器程序,就要用到在异步串行口上进行读写字符。/*向串口写字符*/#include int put_async(char ch)bdos(0 x4,ch,0);/*从串口读字符*/#include int get_async()return(char)bdos(0 x3,0,0);这里又强行作了char转换,以保证放在AH寄存器中的任何值,都不会让任何调用例程乱了套。第三节第三节 与汇编语言的接口与汇编语言的接口(第九章(第九章 编程技巧)编程技
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 教学课件 教学 课件 编程 技巧
限制150内