C語言程序設計 課件 第6章-函數(shù)_第1頁
C語言程序設計 課件 第6章-函數(shù)_第2頁
C語言程序設計 課件 第6章-函數(shù)_第3頁
C語言程序設計 課件 第6章-函數(shù)_第4頁
C語言程序設計 課件 第6章-函數(shù)_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第6章函數(shù)理解函數(shù)的定義和聲明掌握函數(shù)的調用方法掌握遞歸函數(shù)的原理與應用理解變量的作用域和生命周期掌握不同存儲類型的變量理解內部函數(shù)和外部函數(shù)的概念及應用本章目標例子1:衛(wèi)星艙內包裹重力問題6.1函數(shù)的定義、聲明與調用#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;}函數(shù)定義格式:類型標識符、函數(shù)名、形式參數(shù)、函數(shù)體。函數(shù)的調用規(guī)則:先定義后調用。

類型標識符函數(shù)名([形式參數(shù)定義表列]){

聲明部分

語句部分 }6.1函數(shù)的定義、聲明與調用6.1.2函數(shù)的定義與調用函數(shù)體局部變量:只有在本函數(shù)內才能引用這些變量,在該函數(shù)外是無法引用它們的,這樣的變量稱為局部變量。6.1函數(shù)的定義、聲明與調用6.1.3局部變量6.1.4函數(shù)返回值函數(shù)返回值:被調用函數(shù)執(zhí)行結束后能夠向主調函數(shù)返回一個確定的值,被稱為函數(shù)的返回值。過程:當程序執(zhí)行到函數(shù)調用語句時,會跳轉到函數(shù)定義的位置執(zhí)行相應的代碼。在函數(shù)調用過程中,需要按照調用約定傳遞參數(shù),并保存返回地址。調用結束后,程序會返回到調用處繼續(xù)執(zhí)行。函數(shù)的調用規(guī)則:先定義后調用。

6.1函數(shù)的定義、聲明與調用6.1.5函數(shù)調用值傳遞:調用函數(shù)時,將實參的值復制給形參,形參和實參在內存中獨立。

優(yōu)點:形參的修改不影響實參。

缺點:對于大對象效率較低。地址傳遞:傳遞變量的地址,形參和實參指向相同的內存空間,形參的修改會影響實參。優(yōu)點:節(jié)省內存,效率高。缺點:需要注意防止修改不該修改的數(shù)據(jù)。6.1函數(shù)的定義、聲明與調用6.1.6函數(shù)參數(shù)的傳遞方式例子6-6:使用函數(shù)交換變量的值6.1函數(shù)的定義、聲明與調用#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實參和形參運行中的內存狀態(tài)60.605g1g2

ab

(a)開始調用時(b)子函數(shù)調用結束60.605198.617198.61760.605198.617198.61760.605

(b)被調用函數(shù)執(zhí)行完時

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衛(wèi)星艙系統(tǒng)重心在哪里?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.數(shù)組元素作函數(shù)參數(shù)#include<stdio.h>intJudge(intk){if(k%2)return1;/*奇數(shù)*/elsereturn0;/*偶數(shù)*/}intmain(){inta[7]={2,3,4,5,6,7,8},i;intSumOdd=0,SumEven=0;/*奇偶數(shù)求和變量*/for(i=0;i<7;i++)6.2衛(wèi)星艙系統(tǒng)重心在哪里?6.2.2數(shù)組作函數(shù)參數(shù)if(Judge(a[i]))/*數(shù)組a的元素做函數(shù)參數(shù)*/SumOdd+=a[i];elseSumEven+=a[i];printf("奇數(shù)和=%4d\n偶數(shù)和=%4d\n",SumOdd,SumEven);return0;}奇數(shù)和=15偶數(shù)和=202.數(shù)組名作函數(shù)參數(shù)#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衛(wèi)星艙系統(tǒng)重心在哪里?6.2.2數(shù)組作函數(shù)參數(shù)intmain(){inta[3][3]={-8,2,3,4,-5,13,6,7,10};printf("數(shù)組最大元素的值:%4d\n",max(a));return0;}數(shù)組最大元素的值:13實參和形參的傳遞方式數(shù)組元素:單向值傳遞。

數(shù)組名:地址傳遞。定義:將程序的控制權轉移到函數(shù)。目的:代碼復用,提高程序結構的可讀性和維護性。6.2衛(wèi)星艙系統(tǒng)重心在哪里?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("請輸入包裹的個數(shù)\n");6.3

衛(wèi)星艙內包裹排列問題6.3.1程序解析scanf("%d",&n);nc=fac(n);printf("系統(tǒng)重心總數(shù)nc=%ld",nc);return0;}在上例中,fac(intn)函數(shù)內部出現(xiàn)了調用fac(n-1),即函數(shù)自己調用自己的情況,這種調用稱為遞歸調用。6.3

衛(wèi)星艙內包裹排列問題6.3.2階乘方法階乘的數(shù)學定義:n的階乘是所有小于等于n的正整數(shù)的乘積。符號:n!公式:6.3

衛(wèi)星艙內包裹排列問題6.3.3遞歸調用定義:在被調函數(shù)體中直接或間接調用該函數(shù)本身,稱為函數(shù)的遞歸調用。分類:直接遞歸調用:

間接遞歸調用:fac函數(shù)調用fac函數(shù)直接遞歸調用a函數(shù)調用b函數(shù)間接遞歸調用b函數(shù)調用a函數(shù)#include<stdio.h>intsum(intn){ints;if(n==1)s=1;elses=n+sum(n-1);returns;}6.3

衛(wèi)星艙內包裹排列問題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函數(shù)數(shù)據(jù)共享問題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函數(shù)數(shù)據(jù)共享問題6.4.2變量的作用域局部變量:

定義:在函數(shù)或代碼塊內部定義的變量。

作用范圍:僅在定義它的函數(shù)或代碼塊內部有效。

生命周期:從聲明開始到函數(shù)或代碼塊結束。全局變量:

定義:在所有函數(shù)外部定義的變量。

作用范圍:從定義開始到程序結束。

生命周期:從程序開始到程序結束。6.4函數(shù)數(shù)據(jù)共享問題6.4.3變量的存儲類型屬性:數(shù)據(jù)類型和存儲類型。存儲類型:決定變量在內存中的存儲方式和生存期。分類:靜態(tài)存儲類型和動態(tài)存儲類型。內存分區(qū):程序區(qū):存放機器指令。

數(shù)據(jù)區(qū):①靜態(tài)存儲區(qū):存放全局變量、靜

態(tài)局部變量。

②動態(tài)存儲區(qū):存放局部變量、形

參變量。6.4函數(shù)數(shù)據(jù)共享問題6.4.3變量的存儲類型局部變量的存儲類型自動變量(auto)定義:用auto關鍵字聲明的局部變量。特點:存放在動態(tài)存儲區(qū)、生存期在函數(shù)調用期間、默認初值不確定、auto關鍵字可以省略。靜態(tài)局部變量(static)定義:用static關鍵字聲明的局部變量。特點:存放在靜態(tài)存儲區(qū)、生存期貫

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論