1 / 38

# 第 5 章 函数 - PowerPoint PPT Presentation

I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.

## PowerPoint Slideshow about ' 第 5 章 函数' - sari

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.

- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

5章 函数

#include <stdio.h>

void main( )

{ int I,m,n; double fm,fn;

scanf("%d%d", &m, &n);

fm=1;

for(i=1;i<=m;i=i+1)

fm=fm*i;

fn=1;

for(i=1;i<=n;i=i+1)

fn=fn*i;

printf("%f\n",fm+fn);

}

m!

f=1;

for(i=1;i<=k;i=i+1)

f=f*i;

n!

5.1.1 程序解析

#include <stdio.h>

double fact(int n);/*函数声明*/

void main( )

{ int m,n;scanf("%d%d",&m,&n);

printf("%f\n",fact(m)+fact(n));

}

double fact(int n) /* 定义求 n! 的函数*/

{int i;

double result=1;

for (i=1;i<=n;i++)

result=result*i;

return result;/* 把结果回送主函数 */

}

C程序由一个主函数或一个主函数与若干其它函数构成

5.1.2 函数定义

1. 函数定义格式

⑴返回函数值的函数定义

{ 说明语句

return 表达式;

}

return 表达式;计算函数返回值

double fact(int n)

{int i;

double result=1;

for (i=1;i<=n;i++)

result=result*i;

return result;

}

{ 说明语句

return; /* 可省略 */

}

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');

}

}

#include <stdio.h>

void main( )

{ void pyramid(int n);

pyramid(5);

}

#include <stdio.h>

main( )

{ printf("%d\n", fact(5));

}

fact(int n)

{int i,result=1;

for (i=1;i<=n;i++)

result=result*i;

return result;

}

{ 说明语句

return 表达式;

}

void main()

{....

}

main()

{....

}

int main()

{....

return 0;

}

2. 函数参数表

n是函数的参数，称形式参数或简称形参

⑴方式1类型标识符 函数名(形式参数表)

{ 函数体 }

⑵方式2类型标识符 函数名(形式参数名表)

{ 函数体 }

double expon(x,n)

float x;int n;

{double y;int i;

y=1;

for(i=0;i<n;i++)

y=y*x;

return y;

}

double expon(float x,int n)

{double y;int i;

y=1;

for(i=0;i<n;i++)

y=y*x;

return y;

}

两种定义方式书写不要混淆。

3. 函数返回值

double fact(int n)

{int i;

double result=1;

for (i=1;i<=n;i++)

result=result*i;

return result;/* 把结果回送主函数 */

}

在函数体内return语句个数不限

int even(int n)

{if(n%2==0) return 1;

else return 0;

}

当return(表达式)中表达式的值与函数类型不一致,强行转换成函数类型

return只能返回一个数值，

int fact(int n)

{int i;

double result=1;

for (i=1;i<=n;i++)

result=result*i;

return result;

}

当函数体内无return语句,函数体执

5.1.3 函数的调用

#include <stdio.h>

void main( )

{ void pyramid(int n);

pyramid(5);

}

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. 函数调用的方法

⑴函数语句

void main()

{int i, n; double s;

scanf("%d",&n);

s=fact(n);

printf("s=%f\n",s);

}

double fact(int n)

{int i;double result=1;

for (i=1;i<=n;i++)

result=result*i;

return result;

}

2. 函数参数的传递

double expon(float x,int n)

{double y;int i; y=1;

for(i=0;i<n;i++)

y=y*x;

return y;

}

{int a;double t;

scanf("%lf,%d",&t,&a);

t=expon(t,a);

printf("%f\n",t);

}

数据类型相对应

参数形式

void main()

{int a=1,b=2;

swap(a,b);

printf("a=%d,b=%d\n",&a,&b);

}

void swap(int x,int y)

{int t;

t=x;x=y;y=t;

}

void main()

{int a=1,b=2;

swap(&a,&b);

printf("a=%d,b=%d\n",&a,&b);

}

void swap(int *x,int *y)

{int t;

t=*x;*x=*y;*y=t;

}

3. 函数执行过程

(1)分配函数的内存单元

(2)虚实结合

(3)执行函数体

(4)函数结束或遇到return返回函数调用处

(5)收回分配函数的内存单元

double expon(float x,int n)

{double y;int i; y=1;

for(i=0;i<n;i++)

y=y*x;

return y;

}

{int a;double t;

scanf("%lf,%d",&t,&a);

t=expon(t,a);

printf("%f\n",t);

}

4. 被调用函数的声明

⑴使用库函数需要头文件中说明

#include "math.h"

⑵使用自定义函数需要在调用函数的模块中声明被调用函数

源程序文件 .cpp只适合第一种方式。

#include <stdio.h>

void main( )

{double fact();

printf("%f\n",fact(12)/(fact(5)+fact(7)));

}

double fact(int n)

{int i;

double result=1;

for (i=1;i<=n;i++)

result=result*i;

return result;

}

#include <stdio.h>

void main( )

{double fact(int n);

printf("%f\n",fact(12)/(fact(5)+fact(7)));

}

double fact(int n)

{int i;

double result=1;

for (i=1;i<=n;i++)

result=result*i;

return result;

}

定义的被调用函数出现在调用语句的模块之前

#include <stdio.h>

double fact(int n)

{int i;

double result=1;

for (i=1;i<=n;i++)

result=result*i;

return result;

}

void main( )

{ printf("%f\n",fact(12)/(fact(5)+fact(7)));

}

fact函数

#include <stdio.h>

main( )

{ printf("%d\n", fact(5));

}

int fact(int n)

{int i, result;

result=1;

for (i=1;i<=n;i++)

result=result*i;

return result;

}

#include <stdio.h>

double fact(int n);

void main( )

{

printf("%f\n",fact(12)/(fact(5)+fact(7)));

}

double fact(int n)

{int i;

double result=1;

for (i=1;i<=n;i++)

result=result*i;

return result;

}

fact函数

#include <stdio.h>

void main()

{double expon(float x,int n);

int n;float x;double s;

scanf("%f,%d",&x,&n);

s=expon(x,n);

printf("%lf\n",s);

}

(1)分配函数的内存单元

float y,int m; double z;int i;

(2)虚实结合

x->y,n->m

(3)执行函数体

(4)函数返回return z;

(5)收回分配函数的内存单元

float y,int m; double z;int i;

double expon(float y,int m)

{double z;int i;

z=1;

for(i=0,;i<m;i++)

z=z*y;

return z;

}

5.2 使用函数编写程序

#include <stdio.h>

#include <math.h>

void main( )

{

printf("pi=%f\n",pi);

}

double funpi(double e)；

double e,pi;

scanf("%lf",&e);

pi=funpi(e);

#include <stdio.h>

#include <math.h>

void main( )

{ int i,flag; double item,pi;

pi=0;flag=1;i=1;item=1;

while(fabs(item)>=1e-5)

{pi=pi+item;

i=i+1;flag=-flag;

item=flag*1.0/(2*i-1);

}

pi=pi*4;

printf("pi=%f\n",pi);

}

double funpi(double e)

{int i,flag; double item,pi;

pi=0;flag=1;i=1;item=1;

while(fabs(item)>=e)

{pi=pi+item;

i=i+1;flag=-flag;

item=flag*1.0/(2*i-1);

}

pi=pi*4;

return pi;

}

i=2,n,1

1

m%i==0

0

i

0

i≥n+1

1

#include "stdio.h"

#include "math.h"

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) break;

if(i>=n+1) return 1;

else return 0;

if(m%i==0) return 0;

return 1;

void main( )

{int m;

for(m=1;m<=100;m++)

if(prime(m))

printf("%d ",m);

}

5.3 变量与函数

5.3.1局部变量和全局变量

1.局部变量

int a;

{int b,c;

…...

}

char f2(x,y)

int x,y;

{int i,j;

…...

}

void main()

{int m,n;

…….

}

a,b,c

m,n

x,y,i,j

(1)在主函数中定义的变量仅在主函数内有效

(2)函数的形参是局部变量

(3)复合语句中定义的变量作用域只在复合语句内部

{int a;

a=1;

{int b=2;

b=a+b;

a=a+b;

}

printf("%d ",a);

}

b有效域

(4)不同函数中可以定义相同名字的变量，但代表的是不同对象

2.全局变量

int p=1,q=5;

float f1(a)

int a;

{int b,c;...

}

char c1,c2;

char f2(x,y)

int x,y;

{int i,j;

}

main()

{int m,n;

}

p,q

c1,c2

(1)当全局变量与局部变量同名时，在局部变量的有效域内全局

int a=1,b=5;

int max(int a,int b)

{int c;

c=a>b?a:b;

return(c);

}

main()

{int a=8;

printf("%d\n",max(a,b));

}

a,b

a

(2)全局变量的缺省值(初值)为0

(3)利用全局变量进行函数之间数据传递

void main()

{char c;float wt;int num;

while(1)

{switch(c=getchar())

{case 'b':scanf("%d",&num);

scanf("%f",&wt);

back(num,wt);break;

case 's':scanf("%d",&num);

scanf("%f",&wt);

sale(num,wt);break;

case 'q':exit(0);}

c=getchar();

printf("%d ", all_number);

printf("%f\n", all_weight);}}

#include <stdio.h>

float all_weight;

int all_number;

void sale(int number,float weight)

{all_number+=number;

all_weight+=weight;

}

void back(int number,float weight)

{all_number-=number;

all_weight-=weight;

}

(1)函数通用性不好，移植困难

(2)程序可读性差

(3)调试程序不方便

void sale(int number,float weight,int *all_number,float *all_weight)

{*all_number+=number;

*all_weight+=weight;

}

void back(int number,float weight, int *all_number,float *all_weight)

{*all_number-=number;

*all_weight-=weight;

}

5.3.2动态存储变量和静态存储变量

1. auto存储类

int f(a)

int a;

{int b,c=3;

...}

int f(a)

auto int a;

{auto int b,c=3;

...}

2.static存储类

static声明的变量属于静态存储，其用途让局部变量在退出它所在函数后仍保留存储单元,下一次进入该函数后,这些局部变量的值仍有效。称为静态局部变量。

#include<stdio.h>

void fun(int k)

{int a=0;

printf("%d, ",a);

a=a+k;

}

void main()

{int k;

for(k=1;k<=3;k++)

fun(k);

}

k a 输出 a+=k

1 0 0 0+1-->1

2 0 0 0+2-->2

3 0 0 0+3-->3

5-9阅读程序

#include<stdio.h>

void fun(int k)

{static int a=0;

printf("%d, ",a);

a=a+k;

}

void main()

{int k;

for(k=1;k<=3;k++)

fun(k);

}

k a 输出 a+=k

1 0 0 0+1-->1

2 1 1 1+2-->3

3 3 3 3+2-->5

auto动态分配存储空间

auto为随机值

3. register存储类

auto类变量。

#include<stdio.h>

void fun(int k)

{register int a=0;

printf("%d, ",a);

a+=k;

}

void main()

{int k;

for(k=1;k<=3;k++)

fun(k);

}

4. extern 变量

extern只是说明变量起作用，告诉C编译器该变量后面会定义。它不分配存储单元，所对应存储单元在变量定义处分配。

#include<stdio.h>

void main()

{int a;

extern x;

a=1;

x=a;

x=x+a;

printf("%d\n",x);

}

int x;