第6章 2子程序设计方法
- 格式:ppt
- 大小:75.00 KB
- 文档页数:37


第五章 选择结构程序设计
结构化程序设计的基本特点:
(1)没有无条件转移语句goto
(2)没有行号或语句标号
(3)程序划分为块(结构),每个块只有一个入口,只有一个出口。
(4)基本的块只有三个:即顺序结构,选择结构,循环结构。整个程序由三种基本结构并列(顺序),嵌套构成。
5.1 关系运算符和表达式
在程序中经常需要比较两个量的大小关系,以决定程序下一步的工作。比较两个量的运算符称为关系运算符。
5.1.1 关系运算符及其优先次序
在C语言中有以下关系运算符:
1) < 小于
2) <= 小于或等于
3) > 大于
4) >= 大于或等于
5) == 等于
6) != 不等于
关系运算符都是双目运算符,其结合性均为左结合。关系运算符的优先级低于算术运算符,高于赋值运算符。在六个关系运算符中,<,<=,>,>=的优先级相同,高于==和!=,==和!=的优先级相同。
5.1.2 关系表达式
关系表达式的一般形式为:
表达式 关系运算符 表达式
例如:
a+b>c-d
x>3/2
„a‟+1
-i-5*j==k+1
都是合法的关系表达式。由于表达式也可以又是关系表达式。 因此也允许出现嵌套的情况。例如:
a>(b>c)
a!=(c==d)
等。
关系表达式的值是真”和“假”,用“1”和“0”表示。如:
5>0的值为“真”,即为1。
(a=3)>(b=5)由于3>5不成立,故其值为假,即为0。
【例5.1】
main(){
char c='k';
int i=1,j=2,k=3;
float x=3e+5,y=0.85;
printf("%d,%d\n",‟a‟+5=k+1);
printf("%d,%d\n",1
}
在本例中求出了各种关系运算符的值。字符变量是以它对应的ASCII码参与运算的。对于含多个关系运算符的表达式,如k==j==i+5,根据运算符的左结合性,先计算k==j,该式不成立,其值为0,再计算0==i+5,也不成立,故表达式值为0。
选择题:
下列关于预处理命令的描述中,错误的是( D )。
A.预处理命令最左边的标识符是#
B.预处理命令是在编译前处理的
C.宏定义命令可以定义符号常量
D.文件包含命令只能包含.h文件
答案:D
填空题:
1、一般具有应用价值的程序由多个源文件组成。其中只有一个源文件具有main( )函数,其他的文件不能含有主函数。
2、extern int n;中表示该变量n不在本文件中分配空间,而在程序的其他文件中分配空间。属于变量声明而不是变量定义。
3、默认的函数声明或定义总是extern的。
4、有时候,你可能需要使某个函数只在一个源文件中有效,不能被其他源文件所用,这是在函数前面加一个static,将该函数定义为静态函数。
5、在文件作用域下声明的inline函数默认为static存储类型。
6、只有标号是函数作用域的。
7、include包含指令一般有两种格式:#include
简答题:
文件包含命令的功能吗?该命令一定要放在程序首部吗?
答:该预处理命令是将指定的包含文件内容放在该命令出现的地方。
不一定要放在程序首部,但通常放在程序开头,便于后边语句的使用。
一、实验目的
1) 掌握子程序的设计方法;
2) 输入并汇编求N!程序;
3) 将OBJ文件连接成EXE文件;
4) 观察并记录运行结果。
二、实验原理及基本技术路线图(方框原理图)
1、子程序结构:
过程名 PROC 属型
…
过程名 ENDP
其中过程名就是子程序名,它也表示子程序入口的符号地址。属型可以是NEAR型(缺省值)或FAR型。NEAR型子程序只可以被段内调用,而FAR型子程序可以被段间或段内调用。
2、设计子程序时应注意的问题
(1)子程序说明:为便于引用,子程序应在开头对其功能、调用参数和返回参数等予以说明,例如参数的类型、格式及存放位置等。
(2)寄存器的保存与恢复:为了保证调用程序的寄存器内容不被破坏,应在子程序开头保存它要用到的寄存器内容,返回前再恢复它们。通常用PUSH指令保存,用POP恢复。注意由于堆栈操作采用后进先出的规则,一般说来,弹出寄存器的顺序应该与压入时的相反。
(3)密切注意堆栈状态:在设计含有子程序的程序时,要密切注意堆栈的变化。这包括要注意一切与堆栈有关的操作。例如CALL调用类型和子程序定义类型的一致性,PUSH和POP指令的匹配,通过堆栈传递参数时子程序返回使用RET
n指令等,以确保堆栈平衡,否则后果不可预料。
(4)子程序参数传递:可以通过给子程序传递参数使其更通用。常用的参数传递方法如下:通过寄存器传递;若调用程序和子程序在同模块(源程序)中,子程序可以直接访问模块中的变量;通过地址表传递参数地址;通过堆栈传递参数或参数地址。
(5)嵌套与递归子程序:在汇编语言中,允许子程序作为调用程序去调用另一子程序,把这种关系称为子程序嵌套。在子程序嵌套的情况下,如果一个子程序调用的子程序就是它自身,这样的子程序称为递归子程序。
3、求N!程序流程图:
主程序
结果地址入N入栈
调用FACT求N!
返回 FACT子程序
保存BP内容,建立帧首地址
昆明理工大学信息工程与自动化学院学生实验报告
( 2011 —2012学年第 1 学期 )
课程名称:汇编语言程序设计 开课实验室:信自楼445 2009年10 月18日
年级、专业、班 学号 姓名 成绩
实验项目名称
子程序设计 指导教师 万小容
教师评语
教师签名:
年 月 日
一、实验目的
1、掌握子程序的设计方法;
2、输入并汇编求N!程序;
3、观察并记录运行结果。
二、实验原理
1、把可以多次调用、能够完成特定操作功能的程序段编写成独立的程序模块,该程序模块称为子程序,又称为过程。调用这些子程序的程序称为主程序。在主程序中,如果调用到子程序,就需要把控制转移到子程序,这个过程称为转子。子程序执行完了,要把控制再返回到主程序,这个过程称为返主。主程序与子程序之间的关系如图2.1所示。
图2.1 调用子程序调用子程序调用子程序返回子程序主程序123123 2、在子程序嵌套的情况下,如果一个子程序调用的子程序就是它自身,这就称为递归调用,这样的子程序称为递归子程序。递归子程序对应于数学上对函数的递归定义,采用递归的方法往往能设计出效率较高的程序,完成相当复杂的计算,所以它是很有用的。
一般来说,能写出递归公式的问题,都可以编写出相应的递归子程序。而递归调用最简单例子是计算阶乘。求N!本身是一个子程序,由于N!是N和(N-1)!的乘积,所以为求(N-1)!必须递归调用求N!的子程序,只是每次调用所使用的参数不同而已。流程见图2.2。
图2.2
三、实验仪器
pc机一台
四、源程序代码
DATA SEGMENT
BUF DW 5
RESU DW ?
DATA ENDS