C语言课件第6章函数1new.ppt_第1页
C语言课件第6章函数1new.ppt_第2页
C语言课件第6章函数1new.ppt_第3页
C语言课件第6章函数1new.ppt_第4页
C语言课件第6章函数1new.ppt_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1,第 六 章,模块化程序设计 -函数,2,一、函数概述 二、函数的定义及调用 三、局部变量和全局变量 四、变量的存储类别 五、预编译命令,主要内容,3,本章要点,怎样定义函数?如何调用函数?如何声明函数? 什么是函数的参数?在函数调用时,参数是如何传递的? 在使用函数的过程中,要注意哪些问题?怎样确定函数的参数? 如何使用局部变量和全局变量? 什么是静态变量,4,怎样把多个函数组织起来? 怎样用结构化程序设计的思想解决问题? 怎样用函数嵌套求解复杂的问题? 怎样用函数递归解决问题? 预编译命令的作用,5,一、 函数概述,使用结构化程序设计方法解决复杂的问题,把大问题分解成若干小问题,小问题再

2、进一步分解成若干更小的问题; 写程序时,用main()解决整个问题,用子函数解决小问题, main()调用解决小问题的子函数; 这些子函数又进一步调用解决更小问题的函数,从而形成函数的嵌套调用,程序结构,6,C语言中的数学库函数,使用数学库中的函数时,应使用#include 命令将数学头文件 math.h 包含到程序中,数学函数可用来完成一些常用的数学计算,在使用函数时,通常按如下顺序书写: 函数名、左圆括 号、 参数(或用逗号分开的参数列表)、右圆括号,例如: printf(“%8.2f”,sqrt( 900.0 ),说明如下,执行这条语句时,就会通过调用函数sqrt计算900.0 的平方根

3、,数900.0 是函数sqrt的参数,函数sqrt的参数是double型;函数值也是double型,上述语句的打印结果为30.00,7,一)、函数的定义 (二)、函数的调用 (三)、函数编程举例 (四)、函数的嵌套调用 (五)、函数的递归调用,二、函数的定义及调用,8,一)函数的定义,定义: 函数是可重复使用的程序段,从其他的程序段中均可通过调用该函数来执行该函数所包括的程序段。 函数的分类: 库函数:由C语言系统提供定义 如scanf()、printf()等函数 自定义函数:需要用户自己定义 如计算圆柱体体积函数cylinder() 无参函数:不需要使用(代入)外来数据的函数 有参函数:需要

4、使用(代入)外来数据的函数,9,一)函数的定义,函数是指完成一个特定工作的独立程序模块。 main()也是一个函数,一个C程序由一个main()或多个函数构成。 程序中一旦调用了某个函数,该函数就会完成一些特定的工作,然后返回到调用它的地方。 有的函数经过运算,得到一个明确的运算结果,并需要回送该结果。例如,函数cylinder()返回圆柱的体积。 有的函数完成一系列操作步骤,不需要回送任何运算结果,10,1不返回运算结果的函数定义,void 函数名(参数表) 函数实现过程 return;,这类函数通常用于屏幕输出等,表示不返回结果,在VC环境下函数的返回值类型不能省略,* 函数首部 *,*

5、函数体*,* 可以省略return *,11,例6-1 输出5之内的数字金字塔,* 输出数字金字塔 */ #include void pyramid ( ) /* 函数定义 */ int i, j; for (i = 1; i = 5; i+) /* 需要输出的行数 */ for (j = 1; j = 5-i; j+) /* 输出每行左边的空格 */ printf( ); for (j = 1; j = i; j+) /* 输出每行的数字 */ printf( %d , i); /* 每个数字的前后各有一个空格 */ putchar (n);,1 2 2 3 3 3 4 4 4 4 5 5

6、5 5 5,12,例6-2 输出 n 之内的数字金字塔,* 输出数字金字塔 */ #include void pyramid (int n) /* 函数定义 */ int i, j; for (i = 1; i = n; i+) /* 需要输出的行数 */ for (j = 1; j = n-i; j+) /* 输出每行左边的空格 */ printf( ); for (j = 1; j = i; j+) /* 输出每行的数字 */ printf( %d , i); /* 每个数字的前后各有一个空格 */ putchar (n);,1 2 2 3 3 3 4 4 4 4 5 5 5 5 5,13

7、,举例计算两个三角形面积,例6-3 输入两个三角形三边长,分别求这两个三角形的面积。 面积公式:s = 其中,p=(a+b+c)/2 要求定义和调用函数 triangle(a,b,c) 计算三角形的面积,14,include #include int main( ) double a1,b1,c1,a2,b2,c2,p1,p2,s1,s2; printf (请输入第一个三角形的三边长: ); scanf (%lf%lf%lf,不用自定义函数的源程序,出现 功能重复的语句 需优化,15,例6-3 自定义的函数triangle,分析:该函数须代入三边长度值,且有一结果值 /* 首先定义求三角形面积

8、的函数 */ double triangle (double a, double b, double c) double p, s; /*对语句中使用的变量进行定义*/ p=(a+b+c)/2; s =sqrt(p *(p-a)r *(p-b) * (p-c); /* 计算面积 */ return s; /* 返回结果 */,16,include #include int main( ) double a1,b1,c1,a2,b2,c2,p1,p2,s1,s2; printf (请输入第一个三角形的三边长: ); scanf (%lf%lf%lf,例6-3 该程序的main函数变为,例6-3的

9、源程序由两个函数组成。他们之间是调用和被调用的关系。main 函数调用triangle函数,17,double triangle (double a, double b,double c) double s,p; p=(a+b+c)/2; result = sqrt(p*(p-a)*(p-b)*(p-c); return s;,函数定义,函数类型 函数名(形参表)/* 函数首部 */ /* 函数体 */ 函数实现过程 return 表达式;,把函数运算的结果回送给主函数,只能返回一个值,函数返回值的类型,没有分号,18,形参变量的定义,类型1 参数1 ,类型2 参数2 ,类型n 参数n 参数之

10、间用逗号分隔,每个参数前面的类型都必须分别写明,函数类型 函数名(形参表) 函数实现过程 return 表达式;,不能写成 double r, h,double triangle (double a, double b,double c) double s,p; p=(a+b+c)/2; result = sqrt(p*(p-a)*(p-b)*(p-c); return s;,19,double cylinder (double r, double h) /* 函数首部 */ /* 函数体,写在一对大括号内 */ double result; result =3.1415926 * r * r

11、 * h; /* 计算圆柱体积 */ return result; /* 返回运算结果*/,分析函数的定义,函数类型,函数名,形参表,与函数类型一致,20,三)函数的调用,定义一个函数后,就可以在程序中调用这个函数。 调用标准库函数时,在程序的最前面用#include命令包含相应的头文件。 调用自定义函数时,程序中必须有与调用函数相对应的函数定义,21,1函数调用的形式和过程,使用返回值: s = triangle(a,b,c); printf(“%f n” , triangle(a,b,c);); 完成操作: pyramid(5); /这也称为函数调用语句,常用于void类型函数的调用,常用

12、于返回结果的函数的调用,常量、变量、表达式,函数名(实参表,22,函数调用的过程,计算机在执行程序时,从主函数main开始执行,如果遇到某个函数调用,主函数被暂停执行,转而执行相应的函数,该函数执行完后,将返回主函数,然后再从原先暂停的位置继续执行。 函数遇return或最后的大括号,返回主函数,23,包含子函数的程序的执行过程,1) 程序的执行从主函数的第一条语句开始; 遇到函数调用时,暂停在主调函数中的执行,转去处理函数调用; 为被调函数的形参变量分配内存单元,并将实参的值赋给形参变量. 为函数内定义的内部变量分配内存单元。 执行被调函数的函数体,直到遇到return语句; 此时,将释放为

13、形参变量和内部变量分配的内存单元。 程序的执行流程又转回到主调函数,同时将return语句括号中表达式的值带回主函数,include void main() int a,b,c; scanf(“%d%d”,int max( int x, int y ) int z; z = xy ? x : y ; return ( z ) ;,24,2参数传递,函数定义时的参数被称为形式参数(简称形参) double triangle (double a, double b, double c,); 函数调用时的参数被称为实际参数(简称实参) s1 = triangle (a1, b1,c1); 实参形参

14、在参数传递过程中,实参把值复制给形参。 形参和实参一一对应:数量一致,类型一致,顺序一致 形参:变量,用于接受实参传递过来的值 实参:常量、变量或表达式,单向传递,25,3函数结果返回,函数返回的两种情况 完成确定的运算,有一个运算结果返回给主调函数。 完成指定工作,没有确定的运算结果需返回给主调函数(函数类型void)。 函数结果返回的形式: return 表达式; return (表达式,26,对被调函数的声明和函数原型,当被调函数的定义出现在主调函数之后时,在主调函数中,使用函数原型对被调函数进行声明,函数原型的作用,函数原型告诉编译器函数返回值的数据类型,函数所要接收的参数个数、参数类

15、型和参数顺序。 编译器用函数原型校验函数调用,函数原型的两种书写格式,类型标识符 函数名(参数1的数据类型,参数2的数据类型,,类型标识符 函数名(参数1的数据类型 参数名1,参数2的数据类型 参数名2 ,,函数原型-用于声明被调函数,27,例6-4】定义判断奇偶数的函数even (n,定义一个判断奇偶数的函数even (n),当n为偶数时返回整数值1,否则返回整数值0。 /* 判断奇偶数的函数 */ int even (int n)/* 函数首部 */ if(n%2 = 0) /* 判别 n 的奇偶性 */ return 1;/* 偶数返回1 */ else return 0;/* 奇数返回

16、0 */,如何调用该函数,28,例6.5:编写程序:输入变量m,n的值,计算组合数: C(m,n)=m!/(n!*(m-n)!) (mn,float fac(int x) int i; float t=1; for (i=1;i=x;i+) t=t*i; return(t);,input m,n:5 3,The result is 10.0,分析: 将求阶乘的任务用子函数实现。 主函数负责输入、调用函数进行计算、输出结果,include void main() float c; int m,n; float fac(int x); printf(“input m,n:”); scanf(“%d

17、%d”,29,四)函数编程举例,例6-6: 输入精度值e,使用格里高利公式求的近似值,精确到最后一项的绝对值小于e。要求定义和调用函数 funpi(e) 求的近似值,30,例6-6 源程序,* 用格里高利公式计算的近似值,精度为e */ #include #include int main (void) double e, pi; double funpi (double e); printf (Enter e:); scanf (%lf,double funpi (double e) int denominator, flag; double item, sum; flag = 1; den

18、ominator = 1; item = 1.0; sum = 0; while (fabs (item) = e) item = flag * 1.0 / denominator; sum = sum + item; flag = -flag; denominator = denominator + 2; return sum * 4;,Enter e: 0.0001 pi = 3.1418,31,例6-7 判断素数的函数,例6-7: 求100以内的全部素数,每行输出10个。素数就是只能被1和自身整除的正整数,1不是素数,2是素数。 要求定义和调用函数prime (m)判断m是否为素数,当m

19、为素数时返回整数值1,否则返回整数值0。 算法描述:对2100之间的每个数进行判断,若是素数,则输出该数。 for(m = 2; m = 100; m+) if (m是素数) printf(%d , m,prime(m) != 0,32,例6-7 源程序,include #include void main() int count, m; int prime (int m); count = 0; for(m = 2; m = 100; m+) if ( prime(m) != 0 ) printf(%6d, m ); count+; if (count %10 = 0) printf (n)

20、; printf (n);,int prime (int m) int i, n; if ( m = 1 ) return 0; n = sqrt (m); for( i = 2; i = n; i+) if (m % i = 0) return 0; return 1;,33,五)、函数的嵌套调用,函数调用可以嵌套: 即:在调用一个函数的过程中,又可以调用另一个函数,调用a函数,结束,调用b函数,例如,某个c程序中定义了3个函数:main,a,b,程序从主函数开始执行。执行过程如下图所示,返回,返回,34,四、局部变量和全局变量,局部变量 在函数内定义的变量(包括形参) 作用范围:本函数内部

21、 定义在复合语句内的变量 作用范围:复合语句内部 全局变量 (外部变量) 在函数以外定义的变量,不从属于任一函数。 作用范围:从定义处到源文件结束(包括各函数,所以不同函数的 同名变量互不干扰,35,例6-7 在复合语句中定义局部变量,include void main () int a; a = 1; /* 复合语句开始 */ int b = 2; b = a + b; a = a + b; /* 复合语句结束 */ printf (%d , a );,b:小范围内的临时变量,4,36,include stdio.h int x; /* 定义全局变量x */ int f( ) int x =

22、 4; /* x为局部变量 */ return x; void main() int a = 1; x = a; /* 对全局变量 x 赋值 */ a = f( ); /* a的值为4 */ int b = 2; b = a + b; /* b的值为4 */ x = x + b; /* 全局变量运算 */ printf(%d %d , a, x);,4, 7,若局部变量与全局变量同名,局部变量优先,例6-7 全局变量定义,37,变量作用范围示例,int x=1; void main( ) int a=2; . int b=3; . f( ); . int t=4 ; void f( ) int

23、 x=5, b=6; . int a=7,x=? a=? b=,b=,x=5 b=6 t=4 a没定义,x=? b=? t=? a=,38,自动变量(auto): 普通的局部变量 int x, y; auto int x, y; char c1; auto char c1; 函数调用时,定义变量,分配存储单元。 函数调用结束,收回存储单元。 全局变量:从程序执行开始,到程序的结束,存储单元始终保持。 变量生命周期 变量从定义开始分配存储单元,到运行结束存储单元被回收的整个过程,变量生命周期,39,static 类型名 变量表; 作用范围:局部变量 生命周期:全局变量,静态局部变量,40,include void fun (int k);/* 函数原型 */ void main () in

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论