当前位置:文档之家› 嵌入式c语言 函数与程序结构

嵌入式c语言 函数与程序结构

第三章函数与程序结构3.1 概述C语言的程序除主函数外,还可以有若干个其他函数—块状结构。

一般把其中相对独立的算法和功能定义成一个独立的函数,以供需要的地方调用。

优点:(1)减少代码的重复现象。

(2)便于分工合作。

(3)便于阅读。

(4)便于独立算法的代码移植。

3.2函数的定义和调用举例说明:对于求两个数中的最大值,有三个步骤:(1)从键盘输入两个数给a和b。

(2)求a和b中的最大值。

(3)输出结果。

把求最大值的算法部分定义成一个独立的函数:函数类型函数名函数参数(形参)int max(int x,int y) main(){int z;{int a,b,c;if(x>y)z=x;scanf(“%d%d”,&a,&b);else z=y;c=max(a,b);return(z);printf(“%d”,c);}}x y z a b c35说明:(1)程序由两个函数组成,它们逻辑上相互独立(功能、变量)。

(2)程序的执行总是从主函数开始,主函数总是被执行一次,其他函数只有在被调用时才获得控制。

(3)函数调用有两个作用:转移控制权和传递参数。

(4)return的作用也有两个:交回控制权和返回结果。

(5)实参可以是常量、变量或表达式,但类型要一致。

定义一个函数除考虑算法外就是:如何设计函数的参数,通过何种途径交回结果。

例:求自然数1—100中的素数之和。

?prime(?)main(){int i;{int i,s=0;for(i=2;i<m;i++)for(i=1;i<=100;i++)if(m%i==0)?if(prime(i))s+=i;?printf(“\n %d ”,s);} }int m)intreturn 0;else return 1;return 1;例:求5!+7!+4!的值。

?fac(?){int i,s=1;for(i=1;i<=n;i++)s*=i;return(s);}main(){printf(“\n%d ”,fac(5)+fac(7)+fac(4));}int n intmain(){float s,fac();对被调函数声明s=fac(5)+fac(7)+fac(4);printf(“\n%f”,s);}float fac(int n){int i;float s=1;for(i=1;i<=n;i++)s*=i;return(s);}不需声明的情况:int char 主调函数在后若被调用的函数是库函数,则应用#include 命令将所调用函数的有关信息包含进来,如:例:#include “math.h”main(){ float x,y;scanf(%f”,&x);y=sin(x);printf(“%f”,y);}3.3函数的嵌套调用C语言的函数定义虽然相互平行、相互独立的,但可以嵌套调用,形如:主函数函数A 函数B例:求多项式S= ∑i!+ ∑i !+ ∑i !的值。

float fac(int n) {…}? sum( ? ){ int i; float s=0;for( i=? ) s+=fac(i);return(s);}main(){printf(“%f ”,sum(1,5)+sum(7,11)+sum(15,20);}157111520int a, int b float i=a;i<=b;i++3.4函数的递归调用在函数调用的过程中,出现直接或间接地调用该函数本身。

如:f1()f2()f3(){{{f1();f3();f2();} }}直接间接递归调用递归调用在实际应用中,有些问题既可用递归实现,也可不用递归(如求n!);也有些问题非有递归不可(如汉诺塔问题);不少问题使用递归显得很方便。

用递归方法求n!:递推公式:1 当n=0或n=1时n!=n(n-1)! 当n>1时float fac(int n) main(){ float f; { float f;if(n==0||n==1) f=1; f=fac(4);else f= ?printf(“\n%f”,f);n*fac(n-1);return(f); }}递归调用的执行过程:主函数函数fac 函数fac函数fac 函数fac问题:4个return 的执行顺序?后进先出!f=fac(4);n=4if(n==0||n==1)f=1;else f=n*fac(n-1);return(f )n=3if(n==0||n==1)f=1;else f=n*fac(n-1);return(f )n=2if(n==0||n==1)f=1;else f=n*fac(n-1);return(f)n=1if(n==0||n==1)f=1;else f=n*fac(n-1);return(f)3.5 数组作为函数的参数当要传递的参数较少时,用简单变量作为函数的参数是方便的,但当要传递的参数是批量时,需要用数组作为函数的参数。

例:编写函数,求100个数的平均数。

float aver(int a[] ){ int i; float s=0;for(i=0;i<100;i++) s+=a[i] ;return(s/100);}main(){ int x[100]; float av;输入x;av=aver(x); }对应的实参也应为数组型参数组的长度可省略通用函数考虑:float aver(int a[],int n)main(){int i;float s=0;{int x[100],n=100;for(i=0;i<n;i++)float av;s+=a[i];输入xreturn(s/n);av=aver(x,n);}}xa100n n值传递地址传递100n=5;5 a[0]=3;3例:阅读程序:main()swap(int a,int b){int a=3,b=5;{int t;swap(a,b);t=a;a=b;b=t;printf(“\n%d,%d”,a,b);printf(“\n%d,%d”,a,b); }}a b a b35以下程序的运行结果是?main()f(int b[],int x) {int a[2]={2,4},x=5;{x++;f(a,x);b[0]+=2;printf(“%d,%d,%d”,b[1]+=3;x,a[0],a[1]);}}A)5,2,4B)6,4,7C)6,2,4D)5,4,7例:排序。

void sort(int a[],int n)x a { int i,j,t;for(i=0;i<n-1;i++)for(j=i+1;j<n;j++)if(a[i]>a[j]){t=a[i];a[i]=a[j];a[j]=t;}}main(){int x[5],i;for(i=0;i<5;i++)scanf(“%d”,&x[i]);sort(x,5);for(i=0;i<5;i++)printf(“%4d”,x[i]);}例:方阵转置(二维数组情况)。

at(int a[3][3])x a{int i,j,t;for(i=0;i<3;i++)for(j=i+1;i<3;i++){t=a[i][j];a[i][j]=a[j][i];a[j][i]=t;}}int x[3][3];at(x); 行长不等情况?通用函数的处理?通用函数,按一维数组处理:at(int a[],int n){int i,j,t;for(i=0;i<n;i++)for(j=i+1;i<n;i++){t=a[i*n+j];a[i*n+j]=a[j*n+i];a[j*n+i]=t;} }int x[3][3];at(x,3);3.6局部变量和全局变量1、局部变量在函数内定义的变量称局部变量。

局部变量只在该函数内使用。

float f1(int x)int f2()main(){int i,j;{int a,b,c;{int m,n;┊┊{int i,j;┊┊┊}}}}说明:(1)任何函数(包括主函数)内定义的变量都是局部变量。

(2)不同函数内定义的变量即使同名也互不干扰。

(3)复合语句中定义的变量只在该复合语句中有效。

2、全局变量在函数以外定义的变量,也称外部变量。

全局变量可以为为本文件中其它函数所共用。

它的作用范围是从定义变量的位置开始到本源文件结束。

int p=1,q=5;float f1(int a){int b,c;┊}char c1,c2;char f2(int x,int y){int i,j;┊}main(){int m,n;┊}全局变量c1,c2的作用范围全局变量p,q的作用范围全局变量主要用于作为不同函数间数据传递的桥梁。

例:编写一个函数,求n个数中的最大值、最小值和平均值。

并编写主函数完成:输入100个数,调用该函数进行统计,输出结果。

int max,min;float aver(int a[],int n)用全局变量传递结果{int i;float s=0;for(i=0;i<n;i++){if(a[i]>max)max=a[i];if(a[i]<min)min=a[i];s+=a[i];}return(s/n);}main(){int x[100],i;float av;for(i=0;i<100;i++)scanf(“%d”,&x[i]);av=aver(x,100);printf(“\n%d,%d,%f”,max,min,av);}分析不用全局变量的情况:float aver(int a[],int n){int i;float s=0;int max,min;for(i=0;i<n;i++){if(a[i]>max)max=a[i];if(a[i]<min)min=a[i];s+=a[i];}return(s/n);}main(){int x[100],i;float av;int max,min;for(i=0;i<100;i++)scanf(“%d”,&x[i]);av=aver(x,100);printf(“\n%d,%d,%f”,max,min,av);}int max,min;float aver(int a[],int n) {int i;float s=0;for(i=0;i<n;i++){if(a[i]>max)max=a[i];if(a[i]<min)min=a[i];s+=a[i];}return(s/n);}main(){int x[100],i;float av;int max,min; for(i=0;i<100;i++)scanf(“%d”,&x[i]); av=aver(x,100);printf(“\n%d,%d,%f”,max,min,av); }分析全局变量与局部变量同名的情况max minmax min阅读程序,给出运行结果:int a=4,b=5,c=6;int f(int a,int b){ a/=2; c+=b-a;return(a+b+c);}main(){ int a=2,d;d=f(a+2,a+b);printf(“\n %d,%d,%d,%d ”,a,b,c,d);}4526a bc a ba d 47211203.7 变量存储类别1、动态存储方式和静态存储方式静态存储方式:在程序运行期间分配固定存储单元的方式。

相关主题