《(中职)编程基础——C语言项目七 用函数实现模块化程序设计教学课件().pptx》由会员分享,可在线阅读,更多相关《(中职)编程基础——C语言项目七 用函数实现模块化程序设计教学课件().pptx(33页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、(中职)编程基础C语言项目七 用函数实现模块化程序设计教学课件(工信版)项目七 用函数实现模块化程序设计任务20 输出里程较长的中国高铁线函数的定义与调用任务21 求阶乘函数的嵌套调用和递归调用任务23 求长方体体积及侧面积函数的作用域任务22 找出数组中的最大值数组作为函数参数任务20 输出里程较长的中国高铁线函数的定义与调用任务描述:请编程实现:输入任意两条铁路线的长度,输出较长的高速铁路线,要求使用函数完成。案例分析:u 先定义一个函数max,求出大者u 在主函数中调用max函数,输出较大者7.1函数的定义1.函数定义的一般形式函数定义的一般形式为:类型名 函数名(形式参数列表)函数体函
2、数体包括声明部分和语句部分。任务20 输出里程较长的中国高铁线函数的定义与调用7.2函数的调用1.函数调用的一般形式 函数调用的一般形式为:函数名(实参列表);如果是调用无参函数,则“实参表列”可以没有,但括号不能省略。如果实参表列包含多个实参,则各参数间用逗号隔开。任务20 输出里程较长的中国高铁线函数的定义与调用7.3函数的参数和返回值 函数在定义的时候通过参数列表来指定参数的数量和类型,参数使得函数变得更加灵活,传入不同的参数可以让函数实现更为丰富的功能。比如,现在要造一辆车,那么这个车轮就使用一个函数来生产,但如果所有型号的汽车的车轮都一样,那就没办法个性化销售了。所以函数要支持个性化
3、定制,让车轮可以是圆的,也可以是不对,车轮都应该是圆的,那就定制图案,可以是梅花的,可以是五角星的,等等。这就是参数的用法。任务20 输出里程较长的中国高铁线函数的定义与调用1.形参和实参形参就是形式参数,函数定义的时候写的参数就叫形参,因为那时候它只是作为一个占位符而已。而实参就是在真正调用这个函数的时候,传递进去的数值,是一个实实在在的值。实参可以是常量、变量或表达式。形参和实参的功能其实就是用作数据传送。2.形参和实参间的数据传递在调用函数过程中,系统会把实参的值传递给被调用函数的形参。或者说,形参从实参得到一个值。该值在函数调用期间有效,可以参加该函数中的运算。在调用函数过程中发生的实
4、参与形参间的数据传递称为“虚实结合”。如下例输出两个整数中的较大值,要求用函数来实现。3.函数的返回值函数的返回值是通过函数中的return语句获得的,return语句的一般形式为:return(表达式);或者 return 表达式;任务20 输出里程较长的中国高铁线函数的定义与调用任务20 输出里程较长的中国高铁线函数的定义与调用任务实施:includeint max(int x,int y)int z;z=xy?x:y;return(z);main()int max(int x,int y);int a,b,c;printf(请输入两条铁路线的长度:);scanf(%d,%d,&a,&b)
5、;c=max(a,b);printf(较长的铁路线为:%4d公里n,c);任务总结:本任务将知识融于腾飞的中国高铁案例中,了解中国高铁飞速发展的同时,升腾起对国家的热爱之情。同时在本任务中掌握了函数的定义和调用的相关知识。任务拓展:编写一个函数,要求函数能打印“*我爱你中国*”。任务20 输出里程较长的中国高铁线函数的定义与调用任务21 求阶乘函数的嵌套调用和递归调用任务描述:用递归方法求n!,n!=n(n-1)(n-2)21。案例分析:u 正整数阶乘是指所有小于及等于该数的所有正整数的积u 根据阶乘的性质可知,n!=(n-1)!n,而(n-1)!=(n-2)!(n-1),,1!=1u 第1阶
6、段是“回溯”,即将n!表示为(n-1)!直到1!此时1!=1,回溯结束u 第2阶段“递推”,从1!推算出2!=1!2=2,一直推算出n!7.4 函数的嵌套调用和递归调用 C语言的函数定义是相互独立的,也就是说,在定义函数时,一个函数内不能再定义另一个函数,即不能嵌套定义,但函数的调用是可以嵌套的,即在调用一个函数的过程中,又调用另一个函数。如果在调用函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。任务21 求阶乘函数的嵌套调用和递归调用任务实施:任务21 求阶乘函数的嵌套调用和递归调用#include long fact(int n)long result;if(num0)r
7、esult=n*fact(n-1);elseresult=1;return result;main()long fact(int n);int n;long y;printf(请输入一个正整数:);scanf(%d,&n);y=fact(n);printf(%d的阶乘是:%ldn,n,y);任务总结:从本任务可以看出,使用递归的关键在于找出递归关系和递归终止条件。而对初学者来说,最容易出现的就是没有设置递归终止的条件,程序会无休止地调用函数本身而停不下来,直至内存耗尽而崩溃。在有些问题上,用递归实现更易于操作,如汉诺塔程序,但有些问题用递归实现会大大增加程序的运行时间并消耗大量内存,此时尽量不
8、使用递归函数。任务21 求阶乘函数的嵌套调用和递归调用任务拓展:Hanoi(汉诺)塔问题。这是一个古典的数学问题,是一个用递归方法解题的典型例子。问题是这样的:古代有一个梵塔,塔内有3个座A,B,C.开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到C座,但规定每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动过程中可以利用B座。要求编程序输出移动盘子的步骤。任务21 求阶乘函数的嵌套调用和递归调用任务22 找出数组中的最大值数组作为函数参数任务描述:请编程实现:输入任意两条铁路线的长度,输出较长的高速铁路线,要求
9、使用函数完成。任务22 找出数组中的最大值数组作为函数参数案例分析:u 定义一个数组a,长度为10,用来存放10个数u 设计一个函数max,用来求两个数中的大者u 在主函数中定义一个变量m,m的初值为a0,假定第1个元素a0是最大值u 依次将数组元素a1a9与m比较u 最后得到的m值就是10个数中的最大者任务22 找出数组中的最大值数组作为函数参数知识准备:7.5 数组作为函数参数1.数组元素作函数参数数组元素可以用作函数实参,但是不能用作形参。在用数组元素作函数实参时,把实参的值传给形参,是“值传递”方式。数据传递的方向是从实参传到形参,单向传递。任务22 找出数组中的最大值数组作为函数参数
10、知识准备:7.5 数组作为函数参数2.一维数组名作函数参数除了可以用数组元素作函数参数外,还可以用数组名作函数参数(包括实参和形参),作为实参的数组名将数组元素首地址传递给形参所表示的数组名,即实参传给形参的是地址。3.多维数组名作函数参数可以用多维数组名作为函数的实参和形参,这里只以二维数组为例来介绍。在被调用函数中对形参数组定义时可以指定每一维的大小,也可以省略第一维的大小说明。任务实施:#includemain()int max(int x,int y);/函数声明int a10,m,n,i;printf(请输入10个整数:);/输入10个数给a0a9for(i=0;i10;i+)sca
11、nf(%d,&ai);printf(n);m=a0;for(i=1;iy?x:y);/返回x和y中的大者任务22 找出数组中的最大值数组作为函数参数任务总结:数组元素也可以用作函数实参,其用法与变量相同,向形参传递数组元素的值。此外,数组名也可以作实参和形参,传递的是数组第一个元素的地址。任务22 找出数组中的最大值数组作为函数参数任务拓展:用选择法对数组中10个整数按由小到大排序。(提示:所谓选择法就是先将10个数中最小的数与a0对换;再将a1a9中最小的数与a1对换每比较一轮,找出一个未经排序的数中最小的一个。)任务22 找出数组中的最大值数组作为函数参数任务23 求长方体体积及侧面积函数
12、的作用域任务描述:请编程实现:输入长方体的长、宽、高,求其体积及三个侧面的侧面积。案例分析:u 由于return语句只能从函数中带回一个返回值,所以体积和三个侧面积不可能都由return语句返回u 利用全局变量的特点来解决这个问题u 使用return语句返回一个数值(体积)u其他数据则通过全局变量来传递任务23 求长方体体积及侧面积函数的作用域知识准备:7.6 函数的作用域1.局部变量局部变量是在函数内部声明的变量,这包括函数的形参。它们仅在包含该变量声明的函数中才起作用,在函数外不能使用这些变量。另外在复合语句内部定义的变量,其作用范围仅限于复合语句内部。任务23 求长方体体积及侧面积函数的
13、作用域知识准备:7.6 函数的作用域2.全局变量在函数外面定义的变量称为外部变量,也叫全局变量。有时候,可能需要在多个函数中使用同一个变量,那么就会用到全局变量,因为全局变量可以被本程序中其他函数所共用。任务23 求长方体体积及侧面积函数的作用域知识准备:7.7 变量的存储类别根据变量的作用域(空间角度)的不同,可将变量分为局部变量和全局变量。根据变量的生存期(时间角度)的不同,可将变量分为静态存储方式和动态存储方式。1.自动变量在代码块中声明的变量默认的存储类型就是自动变量(auto),使用关键字 auto来描述。任务23 求长方体体积及侧面积函数的作用域知识准备:7.7 变量的存储类别2.
14、寄存器变量寄存器是存在于CPU 内部的,CPU对寄存器的读取和存储可以说几乎没有任何延时。将一个变量声明为寄存器变量(register),那么该变量就有可能被存放于CPU的寄存器中。3.静态局部变量如果使用static来声明局部变量,那么就可以将局部变量指定为静态局部变量(static)。static使得局部变量具有静态存储期,所以它的生存期与全局变量一样,存储空间直到程序结束才释放。任务23 求长方体体积及侧面积函数的作用域知识准备:7.7 变量的存储类别4.外部变量如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件结束。在定义点之前的函数不能引用该外部变量。如果由于某种考虑
15、,在定义点之前的函数需要引用该外部变量,则应该在引用之前用关键字extern对该变量作“外部变量声明”,表示把该外部变量的作用域扩展到此位置。任务23 求长方体体积及侧面积函数的作用域任务实施:任务23 求长方体体积及侧面积函数的作用域#includeint s1,s2,s3;int vs(int a,int b,int c)int v;v=a*b*c;s1=a*b;s2=b*c;s3=a*c;return v;main()int v,l,w,h;printf(n请输入长方体的长,宽,高n);scanf(%d%d%d,&l,&w,&h);v=vs(l,w,h);printf(nv=%d,s1=
16、%d,s2=%d,s3=%dn,v,s1,s2,s3);任务总结:全局变量的作用范围是整个程序,所以无论是main函数还是a,b,c函数,都可以对他进行访问和修改,相当于各个函数间有直接的传递通道。全局变量无疑拓宽了函数之间交流的渠道。任务23 求长方体体积及侧面积函数的作用域任务拓展:有一个一维数组,内放10个学生成绩,写一个函数,当主函数调用此函数后,能求出平均分、最高分和最低分。(提示:调用一个函数可以得到一个函数返回值,现在希望通过函数调用能得到3个结果,可以利用全局变量来达到此目的。)任务23 求长方体体积及侧面积函数的作用域项目总结本项目共包含四个任务,主要介绍了函数的相关内容。详细介绍了如何实现模块化编程的方法,表现了模块化程序设计的优点和相关语法知识。函数的定义和调用,主要介绍了函数的类型、参数、返回值;通过函数的嵌套调用和递归调用,了解了自定义函数的全面内容以及递归在现实中应用;通过变量的作用域,了解变量的作用域范围的分划。