C语言程序设计 课件 第6章-函数_第1页
C语言程序设计 课件 第6章-函数_第2页
C语言程序设计 课件 第6章-函数_第3页
C语言程序设计 课件 第6章-函数_第4页
C语言程序设计 课件 第6章-函数_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章函数理解函数的定义和声明掌握函数的调用方法掌握递归函数的原理与应用理解变量的作用域和生命周期掌握不同存储类型的变量理解内部函数和外部函数的概念及应用本章目标例子1:卫星舱内包裹重力问题6.1函数的定义、声明与调用#include<stdio.h>#definePI3.1415926intmain(){doubledD1=7.874,dD2=8.96,dD3=4.54,dD4=7.44;intiR1=50,iR2=60,iR3=80,iR4=20;intiH1=100,iH2=200,iH3=800,iH4=500;doubledg1,dg2,dg3,dg4;doubledVolume;dVolume=PI*(iR1/1000.)*(iR1/1000.)*(iH1/1000.);dg1=dD1*1000.*dVolume;dVolume=PI*(iR2/1000.)*(iR2/1000.)*(iH2/1000.);dg2=dD2*1000.*dVolume;dVolume=PI*(iR3/1000.)*(iR3/1000.)*(iH3/1000.);dg3=dD3*1000.*dVolume;dVolume=PI*(iR4/1000.)*(iR4/1000.)*(iH4/1000.);dg4=dD4*1000.*dVolume;printf("dg1=%.3lfN\ndg2=%.3lfN\ndg3=%.3lfN\ndg4=%.3lfN\n", 9.8*dg1,9.8*dg2,9.8*dg3,9.8*dg4);return0;}函数定义格式:类型标识符、函数名、形式参数、函数体。函数的调用规则:先定义后调用。

类型标识符函数名([形式参数定义表列]){

声明部分

语句部分 }6.1函数的定义、声明与调用6.1.2函数的定义与调用函数体局部变量:只有在本函数内才能引用这些变量,在该函数外是无法引用它们的,这样的变量称为局部变量。6.1函数的定义、声明与调用6.1.3局部变量6.1.4函数返回值函数返回值:被调用函数执行结束后能够向主调函数返回一个确定的值,被称为函数的返回值。过程:当程序执行到函数调用语句时,会跳转到函数定义的位置执行相应的代码。在函数调用过程中,需要按照调用约定传递参数,并保存返回地址。调用结束后,程序会返回到调用处继续执行。函数的调用规则:先定义后调用。

6.1函数的定义、声明与调用6.1.5函数调用值传递:调用函数时,将实参的值复制给形参,形参和实参在内存中独立。

优点:形参的修改不影响实参。

缺点:对于大对象效率较低。地址传递:传递变量的地址,形参和实参指向相同的内存空间,形参的修改会影响实参。优点:节省内存,效率高。缺点:需要注意防止修改不该修改的数据。6.1函数的定义、声明与调用6.1.6函数参数的传递方式例子6-6:使用函数交换变量的值6.1函数的定义、声明与调用#include<stdio.h>voidswap(doublea,doubleb){doublet;t=a;a=b;b=t;/*a、b值互换*/}intmain(){doubleg1=60.605,g2=198.617;printf("调用前\n");printf("g1=%.3f,g2=%.3f\n",g1,g2);swap(g1,g2);printf("调用后\n");printf("g1=%.3f,g2=%.3f\n",g1,g2);return0;}

例6‑6实参和形参运行中的内存状态60.605g1g2

ab

(a)开始调用时(b)子函数调用结束60.605198.617198.61760.605198.617198.61760.605

(b)被调用函数执行完时

g1g2

ab

#include<stdio.h>#definePi3.1415926voidGravity(doubleDensity[],intRadius[],intHeight[],doubleg[],intn){inti;for(i=0;i<n;i++) g[i]=9.8*Density[i]*Pi*Radius[i]*Radius[i]*Height[i]/1e6;}voidGravityCentre(doubleDensity[],intRadius[],intHeight[],doubleg[],intx[],inty[],intn){inti;doubleSumX=0,SumY=0,SumG=0.;floatxc,yc;Gravity(Density,Radius,Height,g,4);for(i=0;i<n;i++){SumX+=x[i]*g[i];6.2卫星舱系统重心在哪里?6.2.1程序解析SumY+=y[i]*g[i];SumG+=g[i]; }xc=SumX/SumG;yc=SumY/SumG;printf("xc=%.1fmmyc=%.1fmm\n",xc,yc);}intmain(){doubleD[]={7.874,8.96,4.54,7.44};intR[]={50,60,80,20};intH[]={100,200,800,500};doubleg[4];intx[]={-100,-150,50,105};inty[]={-100,75,50,-75};GravityCentre(D,R,H,g,x,y,4);printf("g1=%.3lfN\ng2=%.3lfN\ng3=%.3lfN\ng4=%.3lfN",g[0],g[1],g[2],g[3]);return0;}1.数组元素作函数参数#include<stdio.h>intJudge(intk){if(k%2)return1;/*奇数*/elsereturn0;/*偶数*/}intmain(){inta[7]={2,3,4,5,6,7,8},i;intSumOdd=0,SumEven=0;/*奇偶数求和变量*/for(i=0;i<7;i++)6.2卫星舱系统重心在哪里?6.2.2数组作函数参数if(Judge(a[i]))/*数组a的元素做函数参数*/SumOdd+=a[i];elseSumEven+=a[i];printf("奇数和=%4d\n偶数和=%4d\n",SumOdd,SumEven);return0;}奇数和=15偶数和=202.数组名作函数参数#include<stdio.h>intmax(intb[][3]){intm,i,j;m=b[0][0];for(i=0;i<3;i++)for(j=0;j<3;j++)if(b[i][j]>m)m=b[i][j];returnm;}6.2卫星舱系统重心在哪里?6.2.2数组作函数参数intmain(){inta[3][3]={-8,2,3,4,-5,13,6,7,10};printf("数组最大元素的值:%4d\n",max(a));return0;}数组最大元素的值:13实参和形参的传递方式数组元素:单向值传递。

数组名:地址传递。定义:将程序的控制权转移到函数。目的:代码复用,提高程序结构的可读性和维护性。6.2卫星舱系统重心在哪里?6.2.3嵌套调用#include<stdio.h>intPowers(intm,intn){intj,p=1;for(j=1;j<=n;j++)p=p*m;return(p);}intSum(inta,intb){inti,s=0;

for(i=1;i<=b;i++)s=s+Powers(i,a);return(s);}intmain(){intsum,n=6,k=2;printf("sum:%d",Sum(k,n));return0;};

sum=:91#include<stdio.h>longfac(intn){longt=1;if(n==1||n==0)t=1;elset=n*fac(n-1);returnt;}intmain(){intn;intnc;printf("请输入包裹的个数\n");6.3

卫星舱内包裹排列问题6.3.1程序解析scanf("%d",&n);nc=fac(n);printf("系统重心总数nc=%ld",nc);return0;}在上例中,fac(intn)函数内部出现了调用fac(n-1),即函数自己调用自己的情况,这种调用称为递归调用。6.3

卫星舱内包裹排列问题6.3.2阶乘方法阶乘的数学定义:n的阶乘是所有小于等于n的正整数的乘积。符号:n!公式:6.3

卫星舱内包裹排列问题6.3.3递归调用定义:在被调函数体中直接或间接调用该函数本身,称为函数的递归调用。分类:直接递归调用:

间接递归调用:fac函数调用fac函数直接递归调用a函数调用b函数间接递归调用b函数调用a函数#include<stdio.h>intsum(intn){ints;if(n==1)s=1;elses=n+sum(n-1);returns;}6.3

卫星舱内包裹排列问题6.3.3递归调用intmain(){intn;printf("请输入累加上限n\n");scanf("%d",&n);printf("sum=%d\n",sum(n));return0;}请输入累加上限n100Sum=5050例6-13利用递归调用,计算sum=1+2+3+…+99+100。#include<stdio.h>#definePi3.1415926intn=4;doubleg[4];voidGravity(doubleDensity[],intRadius[],intHeight[]){inti;for(i=0;i<n;i++) g[i]=9.8*Density[i]*Pi*Radius[i]*Radius[i]*Height[i]/1e6;}voidGravityCentre(doubleDensity[],intRadius[],intHeight[],intx[],inty[]){inti;doubleSumX=0,SumY=0,SumG=0.;floatxc,yc;Gravity(Density,Radius,Height);for(i=0;i<n;i++){6.4函数数据共享问题6.4.1程序解析SumX+=x[i]*g[i];SumY+=y[i]*g[i];SumG+=g[i]; }xc=SumX/SumG;yc=SumY/SumG;printf("xc=%.1fmmyc=%.1fmm\n",xc,yc);}intmain(intargc,char**argv){doubleD[]={7.874,8.96,4.54,7.44};intR[]={50,60,80,20};intH[]={100,200,800,500};intx[]={-100,-150,50,105};inty[]={-100,75,50,-75};GravityCentre(D,R,H,x,y);printf("g1=%.3lfN\ng2=%.3lfN\ng3=%.3lfN\ng4=%.3lfN",g[0],g[1],g[2],g[3]);return0;}6.4函数数据共享问题6.4.2变量的作用域局部变量:

定义:在函数或代码块内部定义的变量。

作用范围:仅在定义它的函数或代码块内部有效。

生命周期:从声明开始到函数或代码块结束。全局变量:

定义:在所有函数外部定义的变量。

作用范围:从定义开始到程序结束。

生命周期:从程序开始到程序结束。6.4函数数据共享问题6.4.3变量的存储类型属性:数据类型和存储类型。存储类型:决定变量在内存中的存储方式和生存期。分类:静态存储类型和动态存储类型。内存分区:程序区:存放机器指令。

数据区:①静态存储区:存放全局变量、静

态局部变量。

②动态存储区:存放局部变量、形

参变量。6.4函数数据共享问题6.4.3变量的存储类型局部变量的存储类型自动变量(auto)定义:用auto关键字声明的局部变量。特点:存放在动态存储区、生存期在函数调用期间、默认初值不确定、auto关键字可以省略。静态局部变量(static)定义:用static关键字声明的局部变量。特点:存放在静态存储区、生存期贯

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论