c语言第五讲
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
只能返回一个值
形参
不能写成 double r, h 函数类型 函数名(形参表){ 函数实现过程 return 表达式; }
double cylinder (double r, double h){ double result; result =3.1415926 * r * r * h; return result; }
• 实参 形参
单向传递
– 在参数传递过程中,实参把值复制给形参。 – 形参和实参一一对应:数量一致,类型一致,顺序一 致 – 形参:变量,用于接受实参传递过来的值 – 实参:常量、变量或表达式
3.函数结果返回 . • 函数返回的两种情况
– 完成确定的运算,有一个运算结果返回给主 调函数。 – 完成指定工作,没有确定的运算结果需返回 给主调函数(函数类型void)。
1. 返回运算结果的函数定义
函数返回值的类型
函数类型 函数名(形参表){ /* 函数体 */ 函数实现过程 return 表达式; }
把函数运算的结果回送给主函数
Baidu Nhomakorabea
/* 函数首部 */
double cylinder (double r, double h){ double result; result = 3.1415926 * r * r * h; return result; }
/*【例5-2】输出5之内的数字金字塔。*/ /* 输出数字金字塔 */ #include <stdio.h> int main(void){ void pyramid(int n); /* 函数声明 */ pyramid(5); /* 调用函数,输出数字金字塔 */ return 0; } 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); 1 putchar('\n'); 2 2 } 3 3 3 4 4 4 4 }
• • • • • • • • • • • • • • • • • • • • • • • • • • • •
/*【例5-5】求100以内的全部素数,每行输出10个。素数就是只能被1和自身整除的正整数,1不是素数,2是素数。要求 定义和调用函数prime(m)判断m是否为素数,当m为素数时返回1,否则返回0。*/ /* 使用函数求100以内的全部素数 */ #include <stdio.h> #include <math.h> /* 调用求平方根函数,需要包含数学 库 */ int main(void){ int count, m; int prime(int m); /* 函数声明 */ count = 0; /* count记录素数的个数,用于控制输出格式 */ for(m = 2; m <= 100; m++){ if(prime(m)){ /* 调用prime(m)判断m是否为素数 */ printf("%6d", m); /* 输出m */ count++; /* 累加已经输出的素数个数 */ if (count %10 == 0) printf("\n"); /* 如果count是10的倍数,换行 */ } } printf("\n"); } /* 定义判断素数的函数,如果x是素数则返回1("真");否则返回0("假")*/ int prime(int m){ int i, n; if(m == 1) return 0; /* 1不是素数,返回0 */ n = sqrt(m); for( i = 2; i <= n; i++) if (m % i == 0){ /* 如果m不是素数 */ return 0; /* 返回0 */ } return 1; /* m是素数,返回1 */ }
• 函数结果返回的形式:
– return 表达式; – return (表达式);
• /*【例5-3】定义一个判断奇偶数的函数even(n),当n为 偶数时返回1,否则返回0。*/ • /* 判断奇偶数的函数 */ • int even(int n){ /* 函数首部 */ • if(n%2 == 0) /* 判别奇偶数 */ • return 1; /* 偶数返回1 */ • else • return 0; /* 奇数返回0 */ • }
与函数类型一致
2. 不返回运算结果的函数定义
表示不返回结果
void 函数名(参数表){ /* 函数首部 */ /* 函数体 */ 函数实现过程 return; /* 可以省略return */ }
不能省略 否则 函数类型被默认定义为int 这类函数通常用于屏幕输出等
• • • • • • • • • • • • • • • • • •
调用函数 实参 形参
执行函数中的语句 返回调用它的地方
2.参数传递 .
• 函数定义时的参数被称为形式参数(简称形参)
double cylinder (double r, double h);
• 函数调用时的参数被称为实际参数(简称实参)
volume = cylinder (radius, height);
类型1 参数1 ,类型2 参数2 ,……,类型n 参数n 参数之间用逗号分隔,每个参数前面的类型都必须分别写明
分析函数的定义
函数类型 函数名 形参表
double cylinder (double r, double h) { /* 函数首部 */ /* 函数体,写在一对大括号内 */ double result; result =3.1415926 * r * r * h; /* 计算圆柱体积 */ return result; /* 返回运算结果*/ }
函数的定义
• 函数是指完成一个特定工作的独立程序模块。 – 库函数:由C语言系统提供定义 如scanf()、printf()等函数 – 自定义函数:需要用户自己定义 如计算圆柱体体积函数cylinder() • main()也是一个函数,C程序由一个main()或多个函数构成 。 • 程序中一旦调用了某个函数,该函数就会完成一些特定的 工作,然后返回到调用它的地方。 – 函数经过运算,得到一个明确的运算结果,并需要回送 该结果。例如,函数cylinder()返回圆柱的体积。 – 函数完成一系列操作步骤,不需要回送任何运算结果。
分析函数调用的过程
#include <stdio.h> int main( void ) { double height, radius, volume; double cylinder (double r, double h); printf ("Enter radius and height: "); scanf ("%lf%lf", &radius, &height); volume = cylinder (radius, height ); printf ("Volume = %.3f\n", volume); return 0; } double cylinder (double r, double h) { double result; result =3.1415926 * r * r * h; return result; }
5 5 5 5 5
函数的调用 • 定义一个函数后,就可以在程序中调用这 个函数。 • 调用标准库函数时,在程序的最前面用 #include命令包含相应的头文件。 • 调用自定义函数时,程序中必须有与调用 函数相对应的函数定义。
1.函数调用的形式和过程 . 函数名(实参表) • 使用返回值:
常量、变量、表达式
函数
引例
• • • • • • • • • • • • • • • • • • • /*【例5-1】输入圆柱的高和半径,求圆柱体积,volume=3.1415926*r*r*h。 要求定义和调用函数cylinder (r, h )计算圆柱体的体积。 */ /* 计算圆柱体积 */ #include <stdio.h> int main( void ){ double height, radius, volume; double cylinder(double r, double h); /* 函数声明*/ printf("Enter radius and height: "); /* 输入提示 */ scanf("%lf%lf", &radius, &height); /* 输入圆柱的半径和高度 */ volume = cylinder(radius, height ); /* 调用函数,返回值赋给volume */ printf("Volume = %.3f\n", volume); /*输出圆柱的体积 */ return 0; } /* 定义求圆柱体积的函数 */ double cylinder(double r, double h){ double result; result =3.1415926 * r * r * h; /* 计算圆柱体积 */ return result; /* 返回结果 */ }
4.函数原型声明 . 函数类型 函数名(参数表);
double cylinder (double r, double h); void pyramid (int n);
• 函数必须先定义后调用,将主调函数放在被调函 数的后面,就像变量先定义后使用一样。 • 如果自定义函数在主调函数的后面,就需要在函 数调用前,加上函数原型声明。 • 函数声明:说明函数的类型和参数的情况,以保 证程序编译时能判断对该函数的调用是否正确。
• • • • • • • • • • • • • • • • • • • • • • • • • • • • •
/*【例5-4】 输入精度e,使用格里高利公式求π的近似值,精确到最后一项的绝对值小于e。要求定义和调用函数funpi(e) 求π的近似值。*/ /* 用格里高利公式计算π的近似值,精度为e */ #include <stdio.h> #include <math.h> int main(void){ double e, pi; /* e 代表精度 */ double funpi(double e); /* 函数声明 */ printf("Enter e:"); /* 提示用户输入精度 */ scanf("%lf", &e); pi = funpi(e); /* 调用函数,把返回值赋值给pi */ printf ("pi = %.4f\n", pi); return 0; } double funpi(double e){ /* 定义计算pi的函数 */ int denominator, flag; double item, sum; flag = 1; /* flag 表示第 i 项的符号,初始为正 */ denominator = 1; /* denominator表示第 i 项的分母,初始为1 */ item = 1.0; /* item 中存放第 i 项的值,初值取 1 */ sum = 0; /* 置累加和 pi 的初值为0 */ /* 当|item| ≥ e时,执行循环 */ while(fabs(item) >= e){ item = flag * 1.0 / denominator; /* 计算第 i 项的值 */ sum = sum + item; /* 累加第 i 项的值 */ flag = -flag; /* 改变符号,为下一次循环做准备 */ denominator = denominator + 2; /* 分母递增2 ,为下一次循环做准备 */ } return sum * 4; }
常用于返回结果的函数的调用
volume = cylinder (radius, height ); printf(“%f \n” , cylinder (radius, height ));
• 完成操作:
pyramid(5);
常用于void类型函数的调用
函数调用的过程 • 计算机在执行程序时,从主函数main开始 执行,如果遇到某个函数调用,主函数被 暂停执行,转而执行相应的函数,该函数 执行完后,将返回主函数,然后再从原先 暂停的位置继续执行。 • 函数遇return或最后的大括号,返回主函 数