当前位置:文档之家› 《C语言程序设计教程》.

《C语言程序设计教程》.

f (a,b); 说 1、可不写形参名:double func(double, int, float); … 明 2、不能只写形参名而不写类型: }
double func(x,y,z); fun2( ) 3、只有函数返回值为 … 或char时,函数值类型才可以省略。 ① { int 4、函数定义的声明中形参的次序与类型要一致。如: f (c,d); ③ 错误 double func(int y, … float z, double x); } 5、当某函数要被多个函数调用时,可将函数的调用声明写在 所有函数前。如: float f(float x,float y)
P136习题2:画正弦曲线
算法分析: 若画下列形式的正弦 曲线,则每行应输出: y个空格、1个*号、换行 空格数y与sin值有关。 而sin值在[-1,1] 内,故 应将放大同样倍数的 sin 值作为y值。
* * * * * *
sin(x)
* * *
# define PI 3.14 # include “math.h” main( ) { int x,y,i; double rd=PI/180; for (x=0;x<=360;x=x+15) { y=(int)(10+10*sin(x*rd)); for (i=1;i<=y;i++) y个空格 printf(“ ”); printf(“*\n”); } }
main( )
f21( ) { … }
f22( ) { … }
f1( )
f2( )
f11( )
f21( )
f22( )
较大的程序一般分为若干个程序模块。每个模块实现一个特定的功能。 常将一些常用的功能模块编写成函数,以被多个程序调用。
二、函数定义与函数声明
1、函数定义(自定义函数,即程序模块)
P106例5:编写求表达式值的函数:y=
函数定义 float f(float x) 形参 { ② if (x<0) 执行函数体 return(x*x+x+1); else return(x*x*x+x+3); }
① 实参形参 ③ main( ) 返回调用处 { float x,y; scanf(“%f”,&x); y=f(x); 实参 函数调用 printf(“%f\n”,y); }
f2函数

return(x);
课堂练习
P136习题1:指出程序中的错误
main( ) { int x,n,s; s=power(x,n); }
求 yn power(y) { int i,p=1; for (i=1;i<=n;++i) p=p*y; };
①power函数的调用未声明。 ②实参x、n未赋值。 ③实参x、n与形参y个数不符。 ④整个程序无输出。 ⑤未说明形参y的类型。 ⑥变量n未定义,应将之作为 形参定义。 ⑦通过主函数对power函数的 调用可以看出该函数有返回值, 因此power函数定义中应有 return(p);语句,且在第一行 应说明函数值的类型。 ⑧最后的;号多余。
main( ) 例:函数定义:double { func(double a, int b, float c) … { /*函数体 } */ }
函数值类型 函数名(类型 形参,…);
float f(float x,float y);
函数原型(函数 定义的第一行)
函数声明应为: double fun1( func(double a, int b, float c); ) 或:double func(double x, int y, float z); {…
P136习题9:写出程序的输出结果
main( ) {int i,j,x,y,n,g; i=2; j=3; g=x=5; y=9; n=7; fun(n,6); 实参 printf(“g=%d;i=%d;j=%d;\n”, g, i, j); printf(“x=%d;y=%d\n”, x, y); fun(n,6); }

{ … }
函数名(实参,实参,…)
三、函数的(传值)调用
无返回值:函数名(实参表); 有返回值:变量=函数名(实参表);
P109例7:main( ) { int a=3,b=5; void swap(int x,int y); 函数声明 swap(a,b); 函数调用
实参
程序的运行:
a 3
b 5
高等教育出版社
《C语言程序设计教程》
谭浩强 张基温等编著
主讲:傅 丰 黄淮学院计算机科学系
Huanghuai University Department of Computer Science
第四章 模块化程序设计
• §1 函数
– – – – – §4.1.1 C程序结构 §4.1.2 函数定义与函数声明 §4.1.3 函数的(传值)调用 §4.1.4 函数的嵌套调用 §4.1.5 函数的递归调用
2学时
本节
2学时 2学时 2学时
• §2 变量的存储属性 • §3 编译预处理
§1 函数(程序模块)
一、C程序的结构
f1( ) { … f11( ); … } f2( ) { … f21( ); … f22( ); … } f11( ) { … }
P102例1(略)
main( ) { … f1( ); … f2( ); … }
P104例2:找出函数定义部分
main( ) {…
double new_style(int a,double x); …
P107: 函数不能嵌套定义
} double new_style(int a,double x) { … /*函数体*/ }
func1( ) {… func2( ) { … } … } 错
P136习题3:编写一个函数重复打印给定的字符n次
void p(char c,int n) { int i; for (i=1;i<=n;i++) printf(“%c”,c); printf(“\n”); } main( ) { int n; char ch; scanf(“%c%d”,&ch,&n); p(ch,n); }

g=8;i=7;j=6; x=7;y=2 g=5;i=2;j=3; x=5;y=9 g=8;i=7;j=6; ② x=7;y=2
四、函数的嵌套调用
函数不能嵌套定义,但可以嵌套调用
main函数 main( ) { u=f1(i,t); }


f1函数 { ② c=f2(b-1,b+1); }

③ ⑤
也可用数组实现
输出每一位对应的字符 switch (n) { case 5: printf(“%c”,ch5); case 4: printf(“%c”,ch4); case 3: printf(“%c”,ch3); case 2: printf(“%c”,ch2); case 1: printf(“%c”,ch1); }
函数值类型 函数名(类型 形参,…) { 声明部分 函数体 语句部分 } 所需的已知量
return(表达式);
说 1、函数值类型:即函数体中return语句中表达式值的类型。无返回值时 明 (无return语句),函数值类型为void。默认为int型。 2、形式参数:形参间用逗号分隔,无参时括号不能省。编译时不为形参 分配存储空间,调用时才临时为其分配存储空间,从调用函数的实参得 到值,称为“虚实结合”。调用结束时,形参所占空间被释放。 3、函数体:由声明部分和语句部分组成。函数体中定义的变量只在执行 该函数时才存在。声明部分和语句部分都省略时,为空函数:void f( ) { } 4、函数的返回:函数执行到最后一个操作或遇到return语句时,返回主 调函数,同时撤消为函数体中变量及形参分配的存储空间。 5、函数不能嵌套定义,一个函数不能定义在别的函数内部。
实参
① 实参形参
printf(“a=%d,b=%d\n”,a,b); }
① 值传递
void swap(int x,int y)
形参 ② 执行函数体
函数定义
{ int temp; temp=x, x=y, y=temp;
③返回函数值 释放相应空间
x 3 5


y 5 3
形参
temp 3
printf(“x=%d,y=%d\n”,x,y); }
x y 1.5 -5.7
实参
float add(unsigned int a,unsigned int b)
② 执行 函数 体
{
形参
a 0
b 0

形参
printf(“a=%u,b=%u\n”, a, b); return(a+b);
③返回函数值 释放相应空间
}
a=0,b=0 1.500000+-5.700000=0.000000
程序的运行:
n7

6

i 7
fun(int i,int j) 形参 {int x,y,g; ③ ② g=8; x=7; y=2; printf(“g=%d;i=%d;j=%d\n”, g, i, j); printf(“x=%d;y=%d\n”, x, y); }


j 6
实参 i 2 j 3 g5 x5 y9 形参 g8 x7 y2
x2-x+1 x<0 x3+x+3 x≥0
一个函数中允许有一 个或多个reutrn语句。 每个return语句中表 达式的类型应相同。
P107例6: func(int n) { if (n>10) return(2*n+3); else return( ); } 错
相关主题