收藏 分享(赏)

数-学-实-验.ppt

上传人:无敌 文档编号:23097 上传时间:2018-03-04 格式:PPT 页数:27 大小:72.50KB
下载 相关 举报
数-学-实-验.ppt_第1页
第1页 / 共27页
数-学-实-验.ppt_第2页
第2页 / 共27页
数-学-实-验.ppt_第3页
第3页 / 共27页
数-学-实-验.ppt_第4页
第4页 / 共27页
数-学-实-验.ppt_第5页
第5页 / 共27页
点击查看更多>>
资源描述

1、实验五 函数编程设计,一、实验目的,掌握函数的说明、定义和调用方法掌握函数的嵌套和递归调用掌握文件包含处理的用途和方法编译预处理介绍,二、函数编程,函数的一般形式是:返回类型 函数名(参数列表)函数体函数的定义从形式上可以分成三种:无参函数、有参函数和空函数。函数返回的值有一个类型问题,系统默认返回值是整型,如果是其他类型则要加以说明,允许的类型可以是浮点型、双精度型和各种指针类型,也可以是void类型。函数返回值的类型和函数定义中函数的类型必须保持一致。,如果一个函数要使用变元,就必须声明接受变元的变量。这些变量称为函数的形式参数,它们就像函数内的其它局部变量,在进入到函数时创建,在退出函数

2、时销毁。 1、定义无参和有参函数的方法: 例1、验证一个无参函数,它仅输出“How are you.”。#include void Show()printf(How are you. n);void main() Show();,二、函数编程(续1),二、函数编程(续2),验证一个有参函数,它能输出参数内容。#include void Show(char ch)printf(%c,ch);void main() Show(H); Show(o); Show(w); Show(n);,二、函数编程(续3),2、理解函数实参和形参的对应关系及值传递方式与地址传递方式 1)编写函数swap,将两数交

3、换位置,参考程序如下:#include void swap(int x,int y)int temp;temp=x;x=y;y=temp;printf(x=%d,y=%dn,x,y) -void main()int a=3,b=5;swap(a,b);printf(a=%d,b=%dn,a,b) ,二、函数编程(续4),请上机录入以上程序并进行验证,对程序运行过程中变量空间的开辟和值的变化情况做一个图示分析。在程序处设置断点,查看main( )函数中a、b变量的值以及swap( )函数中的x、y和temp变量的值。 )编写函数reverse,将数组中的数颠倒存放。在操作时,要求只能借助一个临时

4、存储单元,而不得另外开辟数组空间。参考程序如下:,二、函数编程(续5),#include void reverse(int a,int n)int i,j,k;for(i=0,j=n-1;ij;i+,j-)k=ai;ai=aj;aj=k;void main()int i;int s=1,2,3,4,5,6,7,8,9; revserse(s,9); /颠倒存放for(i=0;i9;i+) /输出颠倒后的数组元素printf(%d,si);,二、函数编程(续6),上机录入以上程序并输出运行结果。从上述两个例子可以看到,函数的实参传递到形参有两种方式,即值传递和地址传递。当用简单变量作函数参数时,

5、函数调用中发生的数据传递是单向的,即只能把实参的值传递给形参,而不能将形参的值反向传送给实参。因此,在函数调用过程中,若形参的值发生改变,则实参中的值是不会跟着变化的。用数组作函数参数,就是将数组的首地址传递给函数,实参数组和形参数组占用同一段内存,在函数中对形参数组元素修改的结果,会影响结果主调函数中的实参数组,它的数据传递是双向的。,二、函数编程(续7),3、C语言允许在一个函数的定义中调用另一个函数,称为函数的嵌套调用,即在被调函数中调用了其他函数。一个函数在函数体内调用自身的情况称为递归调用。这是一种特殊的嵌套调用,C语言允许函数的递归调用。在递归调用中,主调函数同时又是被调函数。,二

6、、函数编程(续8),完善如下求n!的递归函数并进行验证。long factorial(int n) long f;if (n 0) printf(n 99printf (Compiled for array greater than 99.n);#endifreturn 0;由于MAX大于99,所以程序在屏幕上显示一条消息。该例说明:跟在#if后面的表达式在编译时求值,因此,它必须仅包含常量及已定义过的标识符,不能使用变量。,三、编译预处理(续6),#else的工作方式与C语言中的else相同:当#if失败时,#else建立起另一选择。上面的例子可扩展为:/* Simple #if examp

7、le. */#include MAX 10int main(void)#if MAX 99printf (Compiled for array greater than 99.n);#elseprintf (Compiled for samll array.n);#endifreturn 0;由于MAX小于99,所以程序在屏幕上显示“Compiled for samll array.”。注意,#else被用来标志#if块的末尾和#else块的开始。因为任何#if仅有一个#endif与之关联。,三、编译预处理(续7),条件编译的另一种方法是使用#ifdef和#ifndef指令,它们分别表示“如果

8、有定义”和“如果无定义”。#ifdef的一般形式为:#ifdef macro_nameStatement sequence#endif如果宏名在前面#define语句中已定义过,则该语句后面的代码块被编译。#ifndef的一般形式为:#ifndef macro_nameStatement sequence#endif如果宏名没有用#define语句定义过,则编译该代码块。,三、编译预处理(续8),#ifdef与#ifndef都可以使用#else或#elif语句。例如:#include #define TED 10int main(void)#ifdef TEDprintf(Hi, Ted.n)

9、;#elseprintf(Hi, anyone.n);#endif#ifndef RALPHprintf(RALPH not defined.n);#endifreturn 0;,三、编译预处理(续9),#undef指令取消其后那个前面已定义过的宏名,也就是不定义宏。#undef的一般形式为:#undef macro_name除了#ifdef外,还有一种方法可以确定宏是否已定义。可以将#if指令和defined编译时运算符一起使用。efined运算符的一般形式如下:defined macro_name如果macro_name已定义,则表达式为真,否则为假。例如,要确认宏MYFILE是否已定义,

10、可以用以下两种预处理命令之一:#if defined MYFILE或#ifdef MYFILE可以在defined前面加上“!”来颠倒条件。例如,仅当DEBUG没有定义时,才编译以下程序段:#if !defined DEBUGprintf(“Final version!n”);#endif,四、编程题,1分别编写5个函数add,sub,mul,divv,rem,用以求两个整数的加、减、乘、除及余数运算。要求:制作一个菜单让用户选择做哪种运算,用输入数字的方法进行选择。当选择某种运算后程序即调用相应的函数完成相应的计算。某种计算完毕后,系统应返回主菜单等待用户选择,以继续完成其他操作。,四、编程

11、题(续1),提示:菜单制作可用一个for循环来处理,直到用户输入退出标志字符时则结束循环。整数的加、减、乘的结果均有整数,而除时不一定为整数,应该注意。可将结果变量定义为float型,在输出的时注意前三种运算的小数点为0位。,四、编程题(续2),2写两个函数,分别求两个正数的最大公约数和最小公倍数,用主函数调用这两个函数并输出结果。两个正数由键盘输入。提示:分别编写最大公约数与最小公倍数的函数。主函数调用时,应该检查输入的是否为正数。,五、附录,函数调用机制进行函数调用时,需要做如下工作:在栈中保存调用函数的状态,因为被调用函数返回后调用函数还要继续执行;在栈中保存调用函数的返回地址,即指令指

12、针寄存器中的值,使得函数运行结束后,返回到调用函数的适当位置;为函数的返回值在栈中分配空间;在栈中为被调函数分配用于存放局部变量的空间,包括函数的参数;传递参数,使用实参初始化形式参数。在函数中,实际参与运算的是形参;,五、附录(续1),将控制转移到被调用函数,即把指令寄存器设置为被调用函数的第一条指令的地址;开始执行被调用函数中的代码;函数返回时,如果有返回值,把返回值保存在“为函数的返回值在栈中分配”的临时变量空间;释放保存在栈中的数据,控制转移到调用函数的适当位置,即把保存在栈中的返回地址赋给指针寄存器;函数调用在空间和时间上都有开销。程序的栈空间是有限的,如果需要很大的栈空间,可以在链接前设置栈空间的大小。,本节课完! 谢谢! ,

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

当前位置:首页 > 中等教育 > 职业教育

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报