- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
18
函数实现过程 return 表达式;
第八章 函数
分析函数的定义
函数类型 函数名
形参表
double cylinder (double r, double h) /* 函数首部 */ { /* 函数体,写在一对大括号内 */ double result; result =3.1415926 * r * r * h; /* 计算圆柱体积 */
return result;
} 与函数类型一致
/* 返回运算结果*/
19
第八章 函数
(三)函数的调用
• 定义一个函数后,就可以在程序中调用这个 函数。 • 调用标准库函数时,在程序的最前面用 #include命令包含相应的头文件。 • 调用自定义函数时,程序中必须有与调用函 数相对应的函数定义。
20
– – – – 单向传递
在参数传递过程中,实参把值复制给形参。 形参和实参一一对应:数量一致,类型一致,顺序一致 形参:变量,用于接受实参传递过来的值 实参:常量、变量或表达式
24
第八章 函数
3.函数结果返回
• 函数返回的两种情况
9
第八章 函数
表示不返回结果
1.不返回运算结果 的函数定义
/* 函数首部 */ /* 函数体*/ /* 可以省略return */
void 函数名(参数表) { 函数实现过程 return; }
这类函数通常用于屏幕输出等
在VC环境下函数的返回值类型不能省略。
10
第八章 函数
例6-1 输出5之内的数字金字塔。
• main() 也是一个函数,一个 C 程序由一个 main() 或多 个函数构成。
• 程序中一旦调用了某个函数,该函数就会完成一些 特定的工作,然后返回到调用它的地方。 • 有的函数经过运算,得到一个明确的运算结果,并 需要回送该结果。例如,函数 cylinder() 返回圆柱的 体积。 • 有的函数完成一系列操作步骤,不需要回送任何运 算结果。
5
第八章 函数
C语言中的数学库函数
⑴ 数学函数可用来完成一些常用的数学计算。
⑵ 在使用函数时,通常按如下顺序书写: 函数名、左圆括 号、 参数(或用逗号分开的参数列表)、右圆括号。 例如: printf(―%8.2f‖,sqrt( 900.0 ) ); 说明如下: ① 执行这条语句时,就会通过调用函数sqrt计算900.0 的平方根。 ② 数900.0 是函数sqrt的参数; ③ 函数sqrt的参数是double型;函数值也是double型。 ④ 上述语句的打印结果为30.00。 ⑶ 使用数学库中的函数时,应使用#include 命令将数学头文件 math.h 包含到程序中。
12
第八章 函数
举例-计算两个三角形面积
例6-3 输入两个三角形三边长,分别求这两个三 角形的面积。
p( p a)( p b)( p c) 面积公式:s = 其中,p=(a+b+c)/2
要求定义和调用函数 triangle(a,b,c) 计算三角形 的面积。
13
第八章 函数
#include <stdio.h> #include <math.h> int main( ) { double a1,b1,c1,a2,b2,c2,p1,p2,s1,s2;
15
第八章 函数
#include <stdio.h> #include <math.h> int main( ) { double a1,b1,c1,a2,b2,c2,p1,p2,s1,s2;
例6-3 该程 序的main函 数变为:
printf ("请输入第一个三角形的三边长: "); scanf ("%lf%lf%lf", &a1, &b1,&c1); printf ("请输入第二个三角形的三边长: "); scanf ("%lf%lf%lf", &a2, &b2,&c2); s1=triangle(a1,b1,c1); s2=triangle(a2,b2,c2); printf ("s1 = %.3f,s2=%.3f \n", s1,s2); return 0; } 例6-3的源程序由两个函数组成。他们之间是调用和被 调用的关系。main 函数调用triangle函数。
16
第八章 函数
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; }
函数 定义
函数 返回 函数类型 函数名(形参表) 值的 类型 {
21
第八章 函数
函数调用的过程
• 计算机在执行程序时,从主函数 main 开始 执行,如果遇到某个函数调用,主函数被 暂停执行,转而执行相应的函数,该函数 执行完后,将返回主函数,然后再从原先 暂停的位置继续执行。
• 函数遇return或最后的大括号,返回主函数
22
包含子函数的程序的执行过程
(1) 程序的执行从主函数的第一条语句 开始;
6
第八章 函数
二、函数的定义及调用
(一)、函数的定义
(二)、函数的调用 (三)、函数编程举例 (四)、函数的嵌套调用 (五)、函数的递归调用
7
第八章 函数
(一)函数的定义
• 定义:
– 函数是可重复使用的程序段,从其他的程序段中均可通过 调用该函数来执行该函数所包括的程序段。
• 函数的分类:
– 库函数:由C语言系统提供定义
不用自定义函数 的源程序
printf ("请输入第一个三角形的三边长: "); scanf ("%lf%lf%lf", &a1, &b1,&c1); printf ("请输入第二个三角形的三边长: "); scanf ("%lf%lf%lf", &a2, &b2,&c2); p1=(a1+b1+c1)/2; s1=sqrt(p1*(p1-a1)*(p1-b1)*(p1-c1)); p2=(a2+b2+c2)/2; s2=sqrt(p2*(p2-a2)*(p2-b2)*(p2-c2)); printf (“s1 = %.3f,s2=%.3f \n", s1,s2); return 0; }
出现
功能重复 的语句 需优化
14
第八章 函数
例6-3 自定义的函数triangle
分析:该函数须代入三边长度值,且有一结果值 /* 首先定义求三角形面积的函数 */ 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; /* 返回结果 */ }
第八章 函数
1.函数调用的形式和过程
函数名(实参表) • 使用返回值:
常量、变量、表达式 常用于返回结果的函数的调用
s = triangle(a,b,c); printf(“%f \n” , triangle(a,b,c););
• 完成操作:
pyramid(5);
常用于void类型函数的调用
//这也称为函数调用语句
/* 输出数字金字塔 */ 1 #include <stdio.h> 2 2 void pyramid ( ) /* 函数定义 */ 3 3 3 { 4 4 4 4 int i, j; 5 5 5 5 5 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'); } }
return ( z ) ;
} 实参: a 形参: x 2 b y 3
2 内部变量 z
3
程序的执行流程又转回到主调函数, 同时将return语句括号中表达式的值带回 主函数。
23
第八章 函数
2.参数传递
• 函数定义时的参数被称为形式参数(简称形参) double triangle (double a, double b, double c,); • 函数调用时的参数被称为实际参数(简称实参) s1 = triangle (a1, b1,c1); • 实参形参
第八章 函数
第六章
模块化程序设计 ---函数
1
第八章 函数
主要内容:
一、函数概述 二、函数的定义及调用
三、局部变量和全局变量
四、变量的存储类别
五、预编译命令
2
第八章 函数
本章要点
• 怎样定义函数?如何调用函数?如何声明 函数? • 什么是函数的参数?在函数调用时,参数 是如何传递的? • 在使用函数的过程中,要注意哪些问题? 怎样确定函数的参数? • 如何使用局部变量和全局变量? • 什么是静态变量?
11
第八章 函数
例6-2 输出 n 之内的数字金字塔。
/* 输出数字金字塔 */ 1 #include <stdio.h> 2 2 void pyramid (int n) /* 函数定义 */ 3 3 3 { 4 4 4 4 int i, j; 5 5 5 5 5 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'); } }