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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

C語言程序設(shè)計C語言程序設(shè)計第四章函數(shù)4.1庫函數(shù)4.2自定義函數(shù)4.3函數(shù)的參數(shù)傳遞與返回值4.4遞歸函數(shù)4.5局部變量、全局變量與變量作用域4.6函數(shù)綜合應(yīng)用第四章函數(shù)學(xué)習(xí)目標(biāo):理解函數(shù)在程序設(shè)計中的作用和地位掌握函數(shù)的定義、原型聲明和調(diào)用方法熟練掌握函數(shù)的參數(shù)傳遞與返回值理解局部變量、全局變量、靜態(tài)變量和變量的作用域掌握遞歸函數(shù)的編寫技術(shù)理解和掌握結(jié)構(gòu)設(shè)計和模塊化程序設(shè)計方法了解地址和指針的概念,了解地址做函數(shù)參數(shù)的特點和作用學(xué)習(xí)目標(biāo):為什么要用函數(shù)?問題:如果程序的功能比較多,規(guī)模比較大,把所有代碼都寫在main函數(shù)中,就會使主函數(shù)變得龐雜、頭緒不清,閱讀和維護變得困難有時程序中要多次實現(xiàn)某一功能,就需要多次重復(fù)編寫實現(xiàn)此功能的程序代碼,這使程序冗長,不精煉為什么要用函數(shù)?問題:解決的方法:用模塊化程序設(shè)計的思路采用“組裝”的辦法簡化程序設(shè)計的過程可以使用庫函數(shù):事先編好一批實現(xiàn)各種不同功能的函數(shù),把它們保存在函數(shù)庫中,需要時直接用可以使用自己編寫的函數(shù):在設(shè)計一個較大的程序時,往往把它分為若干個程序模塊,每一個模塊包括一個或多個函數(shù),每個函數(shù)實現(xiàn)一個特定的功能,函數(shù)的名字應(yīng)反映其代表的功能C程序可由一個主函數(shù)和若干個其他函數(shù)構(gòu)成,主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用,同一個函數(shù)可以被一個或多個函數(shù)調(diào)用任意多次在程序設(shè)計中要善于利用函數(shù),可以減少重復(fù)編寫程序段的工作量,同時可以方便地實現(xiàn)模塊化的程序設(shè)計解決的方法:用模塊化程序設(shè)計的思路C語言程序設(shè)計函數(shù)劉課件導(dǎo)例:平方根表1.問題描述輸出100以內(nèi)整數(shù)的平方根表,要求每行輸出10個。2.問題分析C語言提供了一個庫函數(shù)sqrt(),使用時直接調(diào)用該庫函數(shù)就可以計算出平方根值。導(dǎo)例:平方根表3.算法描述(1)定義兩個整型變量m,n。(2)輸出平方根表時,要注意格式。首先輸出表頭,輸出0~9的整數(shù)。(3)然后按照格式要求輸出平方根表,m為行數(shù)0~9,n為列數(shù)0~9,則表內(nèi)對應(yīng)第m行第n列的表值為sqrt(m*10+n),每行10個。3.算法描述1111#include<stdio.h>#include<math.h>//數(shù)學(xué)類頭文件intmain(){ intm,n;

for(n=0;n<10;n++)printf("%7d",n);//輸出表頭

printf("\n");for(m=0;m<10;m++){printf("%d",m);for(n=0;n<10;n++) printf("%7.4f",sqrt(m*10+n));//調(diào)用庫函數(shù)sqrt() printf("\n");}4.程序?qū)崿F(xiàn)return0;}#include<stdio.h>for(n=0;n<16.程序分析庫函數(shù)sqrt()原型放在文件math.h文件中,所在若在程序中使用該函數(shù),就需要在程序頭加上語句#include<math.h>。程序中語句段for(n=0;n<10;n++)是輸出表頭,輸出列號:0~9;表頭表示出0-9列的列號。用輸出函數(shù)printf(“%7.4f”)控制輸出的值為保留4位小數(shù)的實數(shù)。6.程序分析4.1.3庫函數(shù)使用方法庫函數(shù)的定義已經(jīng)在C語言提供的標(biāo)準(zhǔn)函數(shù)庫中,所以調(diào)用時,需要在程序的前面利用編譯預(yù)處理命令include將相應(yīng)的函數(shù)原型加入到程序中。#include指令的一般形式如下:

#include<文件名>或

#include“文件名”例如:#include<math.h>4.1.3庫函數(shù)使用方法C語言程序設(shè)計函數(shù)劉課件4.1.4常用的庫函數(shù)常用的函數(shù)頭文件,各自包含的函數(shù)類別如下:math.h:包含與數(shù)學(xué)相關(guān)的函數(shù)ctype.h:包含與字符處理有關(guān)的函數(shù)string.h:包含與字符串處理有關(guān)的函數(shù)stdio.h:包含與輸入輸出有關(guān)的函數(shù)stdlib.h:包含與動態(tài)分配存儲空間和數(shù)值轉(zhuǎn)換有關(guān)的函數(shù)process.h:包含與過程控制有關(guān)的函數(shù)4.1.4常用的庫函數(shù)4.2自定義函數(shù)

4.2.1導(dǎo)例:階乘累加和4.2.2導(dǎo)例:三色球問題 4.2.3函數(shù)的定義、聲明和調(diào)用 4.2.4函數(shù)調(diào)用過程分析

4.2自定義函數(shù) 導(dǎo)例:計算圓柱體積

輸入圓柱體的高和半徑,求圓柱體積,volume=π*r2*h。要求定義和調(diào)用函數(shù)cylinder(r,h)計算圓柱體的體積。導(dǎo)例:計算圓柱體積輸入圓柱體的高和半徑,求圓柱體積,/*計算圓柱體積*/#include<stdio.h>intmain(void){doubleheight,radius,volume;

doublecylinder(doubler,doubleh);/*函數(shù)聲明*/ printf("Enterradiusandheight:"); scanf("%lf%lf",&radius,&height); /*調(diào)用函數(shù),返回值賦給volume*/ volume=cylinder(radius,height); printf("Volume=%.3f\n",volume); return0;}/*計算圓柱體積*//*定義求圓柱體積的函數(shù)*/doublecylinder(doubler,doubleh)

{ doubleresult; result=3.1415926*r*r*h;/*計算體積*/

returnresult; /*返回結(jié)果*/}Enterradiusandheight:3.010Volume=282.743/*定義求圓柱體積的函數(shù)*/Enterradiusa#include<stdio.h>intmain(void){doubleheight,radius,volume;

doublecylinder(doubler,doubleh);/*函數(shù)聲明*/ printf("Enterradiusandheight:"); scanf("%lf%lf",&radius,&height); volume=cylinder(radius,height); printf("Volume=%.3f\n",volume); return0;}doublecylinder(doubler,doubleh)

{ doubleresult; result=3.1415926*r*r*h;

returnresult;

}Enterradiusandheight:3.010Volume=282.743問題:函數(shù)是如何運行的?#include<stdio.h>doublecylin4.2.1導(dǎo)例:階乘累加和1.問題描述

從鍵盤輸入1個整數(shù),計算1~n的各個數(shù)的階乘的累加和,即1+2!+3!+…+n!。2.問題分析

實現(xiàn)各個數(shù)的階乘的累加和,需要先計算每個數(shù)的階乘,然后累加到一起。4.2.1導(dǎo)例:階乘累加和sum=0;for(i=1;i<=n;i++){item=i!;sum=sum+item;}可用一個函數(shù)factorial()專門來計算每個數(shù)的階乘,然后用一個循環(huán)語句來計算1~n的各個階乘的累加的結(jié)果。sum=0;4.程序?qū)崿F(xiàn)#include<stdio.h>doublefactorial(inti);//函數(shù)聲明intmain(void){inti,n;doublesum=0;printf(“Enter1integers:”);scanf("%d",&n);for(i=1;i<=n;i++) sum=sum+factorial(i);//函數(shù)調(diào)用printf("1!+…+%d!=%.0f\n",n,sum);return0;}doublefactorial(inti)//函數(shù)定義{intj;doubleresult=1;for(j=1;j<=i;j++)result=result*j;

returnresult;

//返回結(jié)果}4.程序?qū)崿F(xiàn)doublefactorial(inti)一、函數(shù)的定義函數(shù)定義的基本形式是:函數(shù)類型函數(shù)名(形參表)

/*函數(shù)頭,沒有分號*/{函數(shù)實現(xiàn)過程/*函數(shù)體*/}形參表給出函數(shù)所有形參的名稱和類型,它的格式為:

類型1形參1,類型2形參2,……類型n形參n4.2.3函數(shù)的定義、聲明和調(diào)用一、函數(shù)的定義4.2.3函數(shù)的定義、聲明和調(diào)用函數(shù)類型函數(shù)名(形參表)

/*函數(shù)首部*/{ /*函數(shù)體*/

函數(shù)實現(xiàn)過程

return表達式;}把函數(shù)運算的結(jié)果回送給主函數(shù)只能返回一個值函數(shù)返回值的類型沒有分號doublecylinder(doubler,doubleh){doubleresult;result=3.1415926*r*r*h;returnresult;}函數(shù)類型函數(shù)名(形參表) /*函數(shù)首部*/把函數(shù)運算的doublecylinder(doubler,doubleh)

/*函數(shù)首部*/{

/*函數(shù)體,寫在一對大括號內(nèi)*/doubleresult; result=3.1415926*r*r*h;/*計算圓柱體積*/

returnresult; /*返回運算結(jié)果*/ }1、分析函數(shù)的定義函數(shù)類型函數(shù)名形參表與函數(shù)類型一致doublecylinder(doubler,dou形參類型1參數(shù)1,類型2參數(shù)2,……,類型n參數(shù)n參數(shù)之間用逗號分隔,每個參數(shù)前面的類型都必須分別寫明函數(shù)類型函數(shù)名(形參表){

函數(shù)實現(xiàn)過程

return表達式;}不能寫成doubler,hdoublecylinder(doubler,doubleh){doubleresult;result=3.1415926*r*r*h;returnresult;}形參類型1參數(shù)1,類型2參數(shù)2,……,類型ndoublefactorial(inti)//函數(shù)定義{

intj;doubleresult=1;for(j=1;j<=i;j++) result=result*j;

return

result;//返回結(jié)果}例:intmaxValue(intd1,intd2){if(d1>=d2)returnd1;elsereturnd2;}doublefactorial(inti)/2.函數(shù)原型聲明函數(shù)類型函數(shù)名(形參表);doublecylinder(doubler,doubleh);doublefactorial(intn);voidpyramid(intn);函數(shù)必須先定義后調(diào)用,將主調(diào)函數(shù)放在被調(diào)函數(shù)的后面,就像變量先定義后使用一樣。如果自定義函數(shù)在主調(diào)函數(shù)的后面,就需要在函數(shù)調(diào)用前,加上函數(shù)原型聲明。函數(shù)聲明:說明函數(shù)的類型和參數(shù)的情況,以保證程序編譯時能判斷對該函數(shù)的調(diào)用是否正確。只寫函數(shù)定義中的第1行(函數(shù)首部),并以分號結(jié)束。2.函數(shù)原型聲明函數(shù)類型函數(shù)名(形參表);只寫函數(shù)定義中的2、函數(shù)的聲明函數(shù)類型函數(shù)名(形參表);

//以分號結(jié)束doublefactorial(intn);voidball(intx);2、函數(shù)的聲明3、函數(shù)的調(diào)用定義一個函數(shù)后,就可以通過程序來調(diào)用這個函數(shù)。調(diào)用標(biāo)準(zhǔn)庫函數(shù)時,在程序的最前面用#include命令包含相應(yīng)的頭文件。調(diào)用自定義函數(shù)時,程序中必須有與調(diào)用函數(shù)相對應(yīng)的函數(shù)定義。3、函數(shù)的調(diào)用定義一個函數(shù)后,就可以通過程序來調(diào)用這個函數(shù)。函數(shù)調(diào)用的一般形式為:

函數(shù)名(實際參數(shù)表);

factorial(i);實際參數(shù)與形式參數(shù)的數(shù)據(jù)類型和個數(shù)一一對應(yīng),以分號結(jié)束函數(shù)調(diào)用的形式函數(shù)調(diào)用的一般形式為:函數(shù)調(diào)用的形式for(i=1;i<=n;i++) sum=sum+factorial(i);//函數(shù)調(diào)用

函數(shù)的調(diào)用doublefactorial(inti)//函數(shù)定義{

intj;doubleresult=1;for(j=1;j<=i;j++) result=result*j;

return

result;//返回結(jié)果}for(i=1;i<=n;i++)函數(shù)的調(diào)用例求兩個數(shù)中的最大值#include<stdio.h>voidmain(){inta,b,c,max(intx,inty);scanf(“%d,%d”,&a,&b);

c=max(a,b);printf(“Maxis%d”,c);}intmax(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}形參實參定義函數(shù)時,形參調(diào)用函數(shù)時,實參

函數(shù)的調(diào)用例求兩個數(shù)中的最大值形參實參定義函數(shù)時,形參函數(shù)的調(diào)用函數(shù)調(diào)用的形式對于實現(xiàn)計算功能的函數(shù),函數(shù)調(diào)用通常出現(xiàn)在兩種情況:賦值語句

volume=cylinder(radius,height);輸出函數(shù)的實參

printf(“%f”,cylinder(radius,height));函數(shù)調(diào)用的形式對于實現(xiàn)計算功能的函數(shù),函數(shù)調(diào)用通常出現(xiàn)在函數(shù)調(diào)用的過程計算機在執(zhí)行程序時,從主函數(shù)main開始執(zhí)行,如果遇到某個函數(shù)調(diào)用,主函數(shù)被暫停執(zhí)行,轉(zhuǎn)而執(zhí)行相應(yīng)的函數(shù),該函數(shù)執(zhí)行完后,將返回主函數(shù),然后再從原先暫停的位置繼續(xù)執(zhí)行。函數(shù)遇return返回主函數(shù)函數(shù)調(diào)用的過程計算機在執(zhí)行程序時,從主函數(shù)main開始執(zhí)行,分析函數(shù)調(diào)用的過程#include<stdio.h>intmain(void){doubleheight,radius,volume;

doublecylinder(doubler,doubleh);

printf("Enterradiusandheight:"); scanf("%lf%lf",&radius,&height); volume=cylinder(radius,height); printf("Volume=%.3f\n",volume); return0;}doublecylinder(doubler,doubleh)

{ doubleresult; result=3.1415926*r*r*h;

returnresult;}調(diào)用函數(shù)實參形參執(zhí)行函數(shù)中的語句返回調(diào)用它的地方分析函數(shù)調(diào)用的過程#include<stdio.h>調(diào)用函參數(shù)傳遞函數(shù)定義時的參數(shù)被稱為形式參數(shù)(簡稱形參)doublecylinder(doubler,doubleh);函數(shù)調(diào)用時的參數(shù)被稱為實際參數(shù)(簡稱實參)volume=cylinder(radius,height);參數(shù)傳遞:實參形參在參數(shù)傳遞過程中,實參把值復(fù)制給形參。形參和實參一一對應(yīng):數(shù)量一致,類型一致,順序一致形參:變量,用于接受實參傳遞過來的值實參:常量、變量或表達式單向傳遞參數(shù)傳遞函數(shù)定義時的參數(shù)被稱為形式參數(shù)(簡稱形參)單向傳遞函數(shù)結(jié)果返回完成確定的運算,將運算結(jié)果返回給主調(diào)函數(shù)。函數(shù)結(jié)果返回的形式:return表達式;return(表達式);函數(shù)結(jié)果返回完成確定的運算,將運算結(jié)果返回給主調(diào)函數(shù)。在執(zhí)行函數(shù)調(diào)用時,實參把值計算出來,拷貝給相應(yīng)位置的形參;函數(shù)執(zhí)行完后,通過

return(),可返回一個結(jié)果值。

實參與形參有多個實參時形參的改變個數(shù)相同、類型一致后面的先計算不影響實參變量的值只能返回一個結(jié)果,類型與函數(shù)定義時一致要調(diào)用函數(shù),必須先要聲明!小結(jié):要調(diào)用函數(shù),小結(jié):4.3函數(shù)的參數(shù)傳遞與返回值4.3.1導(dǎo)例:爬動的蠕蟲 4.3.2導(dǎo)例:日K蠟燭圖 4.3.3函數(shù)的參數(shù)傳遞 4.3.4函數(shù)的返回值4.3函數(shù)的參數(shù)傳遞與返回值從函數(shù)是否有參數(shù)和返回值的角度,可以將函數(shù)分為:①有參數(shù)有返回值函數(shù)②有參數(shù)無返回值函數(shù)

③無參數(shù)有返回值函數(shù)④無參數(shù)無返回值函數(shù)從函數(shù)是否有參數(shù)和返回值的角度,可以將函數(shù)分為:導(dǎo)例:判斷素數(shù)的函數(shù)求100以內(nèi)的全部素數(shù),每行輸出10個。素數(shù)就是只能被1和自身整除的正整數(shù),1不是素數(shù),2是素數(shù)。要求定義和調(diào)用函數(shù)prime(m)判斷m是否為素數(shù),當(dāng)m為素數(shù)時返回1,否則返回0。

算法描述:對2~100之間的每個數(shù)進行判斷,若是素數(shù),則輸出該數(shù)。for(m=2;m<=100;m++)if(m是素數(shù))printf("%d",m);prime(m)!=0①有參數(shù)有返回值函數(shù)導(dǎo)例:判斷素數(shù)的函數(shù)求100以內(nèi)的全部素數(shù),每行輸出10個。例5-4源程序#include<stdio.h>#include<math.h>intmain(void){ intcount,m;

intprime(intm); count=0; for(m=2;m<=100;m++){ if(prime(m)!=0){ printf("%6d",m); count++; if(count%10==0) printf("\n");} } printf("\n");}intprime(intm){inti,n;if(m==1)return

0;

n=sqrt(m);for(i=2;i<=n;i++)if(m%i==0){

return

0; }

return

1;}例5-4源程序#include<stdio.h>int輸出5之內(nèi)的數(shù)字金字塔。/*輸出數(shù)字金字塔*/#include<stdio.h>intmain(void){

voidpyramid(intn); /*函數(shù)聲明*/

pyramid(5); /*調(diào)用函數(shù),輸出數(shù)字金字塔*/ return0;}voidpyramid(intn) /*函數(shù)定義*/{ inti,j; for(i=1;i<=n;i++){ /*需要輸出的行數(shù)*/ for(j=1;j<=n-i;j++) /*輸出每行左邊的空格*/ printf(""); for(j=1;j<=i;j++) /*輸出每行的數(shù)字*/ printf("%d",i); /*每個數(shù)字的前后各有一個空格*/ putchar('\n'); }}

122333444455555

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

for(j=1;j<=n-i;j++) printf(“”);

一行中的數(shù)字顯示}②有參數(shù)無返回值函數(shù)for(i=1;i<=n;i++){

一行的處理}一行中的空格處理;一行中的數(shù)字顯示}輸出5之內(nèi)的數(shù)字金字塔。/*輸出數(shù)字金字塔*/不返回運算結(jié)果的函數(shù)定義void

函數(shù)名(參數(shù)表) /*函數(shù)首部*/{ /*函數(shù)體*/

函數(shù)實現(xiàn)過程

return;

/*可以省略return*/}這類函數(shù)通常用于屏幕輸出等表示不返回結(jié)果不能省略,否則函數(shù)類型被默認(rèn)定義為int不返回運算結(jié)果的函數(shù)定義void函數(shù)名(參數(shù)表) /*#include<stdio.h>intmain(void){

intin();intn; /*函數(shù)聲明*/

n=in();/*函數(shù)調(diào)用*/printf(“%d”,n); return0;}intin(){intx;scanf(“%d”,&x);returnx;}③無參數(shù)有返回值函數(shù)#include<stdio.h>③無參數(shù)有返回值函數(shù)函數(shù)沒有返回值——在聲明函數(shù)的時候,函數(shù)名前使用了保留字void。用函數(shù)調(diào)用語句調(diào)用。#include<stdio.h>voidmain(){voidprintstar();/*函數(shù)聲明*/voidprint_message();/*函數(shù)聲明*/printstar();print_message();printstar();}voidprintstar()

{printf(“*********\n”);

}

voidprint_message(){printf(“Howdoyoudo!\n”);}輸出:*****************

Howdoyoudo!*****************④無參數(shù)無返回值函數(shù)函數(shù)沒有返回值——在聲明函數(shù)的時候,函數(shù)名前使用了保留字vo4.3.3函數(shù)的參數(shù)傳遞在調(diào)用函數(shù)時,實參與形參結(jié)合的具體過程是:計算實參表達式的值;將實參的值按賦值轉(zhuǎn)換規(guī)則轉(zhuǎn)換成對應(yīng)形參的數(shù)據(jù)類型;為形參分配存儲空間;將類型轉(zhuǎn)換后的實參的值傳遞給對應(yīng)的形參變量,然后執(zhí)行函數(shù)。4.3.3函數(shù)的參數(shù)傳遞

C語言中,函數(shù)的參數(shù)傳遞有兩種方式,即傳值和傳地址。

傳值:簡單地將實參的值復(fù)制一份給形參,一旦復(fù)制完成,實參與其對應(yīng)的形參便沒有任何關(guān)系,這時在函數(shù)內(nèi)對形參的任何改變都不會影響到實參。

傳地址:將實參地址傳遞給形參,在函數(shù)內(nèi)對形參所對應(yīng)數(shù)據(jù)的處理實際上就是處理對應(yīng)的實參。簡單地理解就是此時實參和形參同一的,對形參的處理就是對對應(yīng)的實參的處理。

C語言中,當(dāng)函數(shù)的參數(shù)為指針類型或數(shù)組類型時采用傳地址的方式,其他類型采用傳值方式。C語言中,函數(shù)的參數(shù)傳遞有兩種方式,即傳值和傳地址。4.3.4函數(shù)的返回值

函數(shù)的調(diào)用本質(zhì)上是一個表達式,它將返回特定類型數(shù)據(jù)的值(即返回值),因此只要該值能出現(xiàn)的位置,都可以使用該函數(shù)調(diào)用表達式。從函數(shù)返回值的類型看,有兩種類型:①是完成確定的運算,并由運算結(jié)果返回給主調(diào)函數(shù),稱為有返回值的函數(shù);函數(shù)類型用返回值類型指定。②是完成指定的工作,沒有確定的運算結(jié)果需返回給主調(diào)函數(shù),稱為無返回值的函數(shù)。函數(shù)類型用void指定。4.3.4函數(shù)的返回值1、有返回值函數(shù)有返回值函數(shù)在函數(shù)定義時必須說明返回值的類型,在函數(shù)體中由return語句給出具體的返回值。有返回值return語句的一般形式如下:return表達式;

return(表達式);先求解表達式的值,再返回其值。通常表達式的結(jié)果類型與函數(shù)的返回值類型一致return語句的作用有兩個:一是結(jié)束函數(shù)的運行;二是帶著運算結(jié)果(表達式的值)返回主調(diào)函數(shù)。1、有返回值函數(shù)函數(shù)有返回值:函數(shù)執(zhí)行完畢后,返回一個相應(yīng)類型的數(shù)值。用return語句返回該值:return表達式;用函數(shù)調(diào)用表達式調(diào)用。如:printf(“Theaverageis%6.2f”,average(dataArray,n));ave=average(dataArray,n);函數(shù)有返回值:函數(shù)執(zhí)行完畢后,返回一個相應(yīng)類型的數(shù)值。如:2、無返回值函數(shù)無返回值函數(shù)只完成某種特定的處理,函數(shù)執(zhí)行后無須向調(diào)用者返回計算結(jié)果。

無返回值函數(shù)在函數(shù)定義時必須將返回值的類型說明為void(即空類型),函數(shù)體中的return語句只結(jié)束函數(shù)的執(zhí)行。如果函數(shù)類型為void,則函數(shù)返回直接用return語句,不必跟上一個表達式。

無返回值return語句的一般形式如下:return;在函數(shù)定義中也可以沒有return語句,此時函數(shù)執(zhí)行到最后一條語句。2、無返回值函數(shù)4.4遞歸函數(shù)4.4.1導(dǎo)例:假幣問題(三分法) 4.4.2導(dǎo)例:Fibonacci數(shù)列 4.4.3遞歸函數(shù)的執(zhí)行過程 4.4.4遞歸函數(shù)的效率分析4.4遞歸函數(shù)4.4.2導(dǎo)例:Fibonacci數(shù)列1.問題描述從鍵盤輸入一個整數(shù)n,輸出斐波那契數(shù)列(fibonacci)的前n項。要求每行打印10個數(shù)后換行。2.問題分析斐波那契數(shù)列為1,1,2,3,5,8,13……即從第三項開始,各項值都等于前兩項值之和。斐波那契數(shù)列的定義為:1n=0f(n)=1n=1f(n-1)+f(n-2)n>14.4.2導(dǎo)例:Fibonacci數(shù)列采用非遞歸方法,程序片段如下:

first=1,second=1;scanf("%d",&n);for(i=0;i<n;i++){result=first+second; printf("%.0f",result);first=second;

second=result;

}采用非遞歸方法,程序片段如下:#include<stdio.h>intfib(intk);main(){intn,i,count=0;printf("Enter1integers\n:");scanf("%d",&n);for(i=0;i<n;i++){printf("%10d",fib(i));count++;if(count%5==0)printf("\n");}}intfib(intn){intf;if(n==0)f=1;elseif(n==1)f=1;else

f=fib(n-1)+fib(n-2);returnf;}#include<stdio.h>intfib(int6.程序分析6.程序分析4.4.3遞歸函數(shù)的執(zhí)行過程遞歸函數(shù)要注意兩點:

①遞歸出口:遞歸的結(jié)束條件,說明到何時不再遞歸調(diào)用;否則無限制遞歸,終將使棧空間溢出;

②遞歸公式:當(dāng)前函數(shù)結(jié)果與準(zhǔn)備調(diào)用的函數(shù)結(jié)果之間的關(guān)系,即原問題是如何分解為子問題的。

1n=0fact(1)=1遞歸出口n!=n×(n-1)!n>1fact(n)=n*fact(n-1)遞歸公式

4.4.3遞歸函數(shù)的執(zhí)行過程實現(xiàn)階乘遞歸算法的遞歸函數(shù)

longfact(intn){ if(n==0)return1; elsereturnn*fact(n-1);}

實現(xiàn)階乘遞歸算法的遞歸函數(shù)y=fact(3)

3*fact(2)2*fact(1)1*fact(0)111*112*123*26遞歸函數(shù)的調(diào)用過程y=fact(3)3*fact(2)2*fact(1)1*遞歸程序的內(nèi)部執(zhí)行過程函數(shù)的遞歸調(diào)用類似于多個函數(shù)的嵌套調(diào)用,只不過調(diào)用函數(shù)和被調(diào)用函數(shù)是同一個函數(shù)。遞歸調(diào)用的內(nèi)部執(zhí)行過程如下:①運行開始時,系統(tǒng)設(shè)立工作棧來保存每次調(diào)用的運行環(huán)境,包括形參、局部變量和返回地址;②遞歸調(diào)用前,將調(diào)用函數(shù)的形參、局部變量以及調(diào)用后的返回地址進棧;③調(diào)用結(jié)束后,將棧頂數(shù)據(jù)出棧,恢復(fù)調(diào)用前的運行環(huán)境,使相應(yīng)的形參和局部變量恢復(fù)為調(diào)用前的值,然后從返回地址指定的位置繼續(xù)執(zhí)行調(diào)用函數(shù)。遞歸程序的內(nèi)部執(zhí)行過程4.4.4遞歸函數(shù)的效率分析遞歸函數(shù)如果很緩慢地逼近到遞歸結(jié)束條件,會使性能大大下降。遞歸增加了系統(tǒng)開銷,時間上,執(zhí)行調(diào)用與返回的額外工作要占用CPU時間??臻g上,隨著每遞歸一次,棧內(nèi)存就多占一塊,即要分配相應(yīng)的存儲空間,并完成參數(shù)的傳遞、函數(shù)的返回等,在程序的執(zhí)行效率和所消耗的存儲空間上,和非遞歸相比沒有任何優(yōu)勢。一般的遞歸都可以通過相應(yīng)的方法轉(zhuǎn)化為非遞歸的,所以不推薦使用遞歸,特別是不推薦使用遞歸層次較多的遞歸。4.4.4遞歸函數(shù)的效率分析4.5C局部變量、全局變量與變量作用域4.5.1導(dǎo)例:富翁與騙子 4.5.2導(dǎo)例:簡易庫存存取貨管理 4.5.3局部變量和全局變量 4.5.4變量的作用域和生存期4.5C局部變量、全局變量與變量作用域分別輸入2個復(fù)數(shù)的實部與虛部,用函數(shù)實現(xiàn)計算2個復(fù)數(shù)之和與之積。分析若2個復(fù)數(shù)分別為: c1=x1+y1i,c2=x2+y2i,則:

c1+c2=(x1+x2)+(y1+y2)i

c1*c2=(x1*x2-y1*y2)+(x1*y2+x2*y1)i

復(fù)數(shù)運算分別輸入2個復(fù)數(shù)的實部與虛部,用函數(shù)實現(xiàn)計算2個復(fù)數(shù)之和與之#include<stdio.h>floatresult_real,result_imag; /*全局變量,用于存放函數(shù)結(jié)果*/intmain(void){ floatimag1,imag2,real1,real2;/*兩個復(fù)數(shù)的實、虛部變量*/

/*函數(shù)聲明*/ voidcomplex_prod(floatreal1,floatimag1,floatreal2,floatimag2); voidcomplex_add(floatreal1,floatimag1,floatreal2,floatimag2); printf("Enter1stcomplexnumber(realandimaginary):"); scanf("%f%f",&real1,&imag1); /*輸入第一個復(fù)數(shù)*/ printf("Enter2ndcomplexnumber(realandimaginary):"); scanf("%f%f",&real2,&imag2); /*輸入第兩個復(fù)數(shù)*/

complex_add(real1,imag1,real2,imag2); /*求復(fù)數(shù)之和*/

printf("additionofcomplexis%f+%fi\n",result_real,result_imag);

complex_prod(real1,imag1,real2,imag2);/*求復(fù)數(shù)之積*/

printf("productofcomplexis%f+%fi\n",result_real,result_imag); return0;}運行結(jié)果Enter1stcomplexnumber(realandimaginary):11Enter2ndcomplexnumber(realandimaginary):-23additionofcomplexis-1.000000+4.000000iproductofcomplexis-5.000000+1.000000i#include<stdio.h>運行結(jié)果voidcomplex_add(floatreal1,floatimag1,floatreal2,floatimag2){ result_real=real1+real2; result_imag=imag1+imag2;}voidcomplex_prod(floatreal1,floatimag1,floatreal2,floatimag2){ result_real=real1*real2-imag1*imag2; result_imag=real1*imag2+real2*imag1;}voidcomplex_add(floatreal1,局部變量在函數(shù)內(nèi)定義的變量(包括形參)作用范圍:本函數(shù)內(nèi)部定義在復(fù)合語句內(nèi)的變量作用范圍:復(fù)合語句內(nèi)部全局變量 在函數(shù)以外定義的變量,不從屬于任一函數(shù)。作用范圍:從定義處到源文件結(jié)束(包括各函數(shù))4.5.3局部變量和全局變量局部變量4.5.3局部變量和全局變量在復(fù)合語句中定義局部變量#include<stdio.h>intmain(void){

int a;a=1;

{ /*復(fù)合語句開始*/

intb=2;b=a+b;a=a+b;

} /*復(fù)合語句結(jié)束*/ printf("%d",a); return0;}b:小范圍內(nèi)的臨時變量

輸出:4改成b會如何?在復(fù)合語句中定義局部變量#include<stdio.h>

全局變量定義#include"stdio.h"intx; /*定義全局變量x*/intf(){

intx=4;/*x為局部變量*/returnx;}intmain(void){inta=1;

x=a; /*對全局變量x賦值*/a=f(); /*a的值為4*/{

intb=2;

b=a+b; /*b的值為6*/

x=x+b; /*全局變量運算*/}printf("%d%d",a,x);return0;}若局部變量與全局變量同名,局部變量優(yōu)先輸出:4,7全局變量定義#include"stdio.h"若局部變量變量作用范圍示例intx=1;voidmain(){inta=2;……..{intb=3;…..}f();………..}intt=4;voidf(){intx=5,b=6;…….}inta=7;

x=?a=?b=?b=?

x=5b=6t=4a沒定義

x=?b=?t=?a=?變量作用范圍示例intx=1;x=?a=?b用函數(shù)實現(xiàn)財務(wù)現(xiàn)金記賬。先輸入操作類型(1收入,2支出,0結(jié)束),再輸入操作金額,計算現(xiàn)金剩余額,經(jīng)多次操作直到輸入操作為0結(jié)束。要求定義并調(diào)用函數(shù),其中現(xiàn)金收入與現(xiàn)金支出分別用不同函數(shù)實現(xiàn)。分析:設(shè)變量cash保存現(xiàn)金余額值,由于它被主函數(shù)、現(xiàn)金收入與現(xiàn)金支出函數(shù)共用,任意使用場合其意義與數(shù)值都是明確和唯一的,因此令其為全局變量。財務(wù)現(xiàn)金記賬用函數(shù)實現(xiàn)財務(wù)現(xiàn)金記賬。先輸入操作類型(1收入,2支出,#include<stdio.h>floatcash; /*定義全局變量,保存現(xiàn)金余額*/intmain(void){ intchoice; floatvalue; voidincome(floatnumber),expend(floatnumber); /*函數(shù)聲明*/

cash=0; /*初始金額=0*/ printf("Enteroperatechoice(0--end,1--income,2--expend):"); scanf("%d",&choice); /*輸入操作類型*/ while(choice!=0){ /*若輸入類型為0,循環(huán)結(jié)束*/ if(choice==1||choice==2){ printf("Entercashvalue:"); /*輸入操作現(xiàn)金額*/ scanf("%f",&value); if(choice==1)income(value);/*函數(shù)調(diào)用,計算現(xiàn)金收入*/ else expend(value); /*函數(shù)調(diào)用,計算現(xiàn)金支出*/ printf("currentcash:%.2f\n",cash); } printf("Enteroperatechoice(0--end,1--income,2--expend):"); scanf("%d",&choice); /*繼續(xù)輸入操作類型*/ } return0;}

/*定義計算現(xiàn)金收入函數(shù)*/voidincome(floatnumber){cash=cash+number; /*改變?nèi)肿兞縞ash*/} /*定義計算現(xiàn)金支出函數(shù)*/voidexpend(floatnumber){cash=cash-number; /*改變?nèi)肿兞縞ash*/}Enteroperatechoice(0--end,1--income,2--expend):1Entercashvalue:1000currentcash:1000.000000Enteroperatechoice(0--end,1--income,2--expend):2Entercashvalue:456currentcash:544.000000Enteroperatechoice(0--end,1--income,2--expend):0#include<stdio.h> /*定義計算現(xiàn)金收入4.5.3局部變量和全局變量全局變量:定義在函數(shù)(包括main函數(shù))外而不屬于任意函數(shù)的變量。作用范圍是從定義開始到程序所在文件的結(jié)束,其對作用范圍內(nèi)的所有函數(shù)都起作用。局部變量:是指在某個函數(shù)之內(nèi)或語句塊內(nèi)定義的變量;函數(shù)的形參列表中的變量也是局部變量;只能在某個函數(shù)內(nèi)部使用。塊變量(局部變量):在復(fù)合語句中定義的變量。4.5.3局部變量和全局變量4.5.4變量的作用域和生存期變量是存儲空間在程序中的一種表示對變量的操作就是對變量所對應(yīng)的存儲空間中所存放的數(shù)據(jù)的操作。生存期:變量占據(jù)存儲空間的時間,即變量在什么時間段內(nèi)存在作用域:變量可以引用的區(qū)域,即變量在哪些代碼塊中能夠訪問4.5.4變量的作用域和生存期塊變量:在復(fù)合語句中定義的變量,其生存期為所在的復(fù)合語句塊中。例:if(x>y){inttemp;temp=x;x=y;y=temp;}塊變量:在復(fù)合語句中定義的變量,其生存期為所在的復(fù)合語句塊中局部變量:在函數(shù)內(nèi)部和形式參數(shù)表中定義的變量都屬于局部變量。作用域是定義這些變量的函數(shù)。計算兩個整數(shù)的最小公倍數(shù)#include<stdio.h>intlcm(intx,inty);main(){intm,n,common;scanf(“%d%d”,&m,&n);common=lcm(m,n);printf(“\n%d,%dleasecommonmultipleis%d”,m,n,common);}intlcm(intx,inty){inttemp,multiple;if(x>=y)temp=x;elsetemp=y;multiple=temp;while(temp%x!=0||temp%y!=0){temp+=multip;}returntemp;}局部變量:在函數(shù)內(nèi)部和形式參數(shù)表中定義的變量都屬于局部變量。全局變量全局變量的生存期是定義這個變量的程序文件作用域是從定義處開始到程序文件的結(jié)束處為止如果程序文件中的某些局部變量與之同名,則全局變量的作用域應(yīng)該去除這部分區(qū)域。靜態(tài)存儲:在程序開始運行時系統(tǒng)就為之分配存儲空間,等到程序結(jié)束時才將為其分配的存儲空間回收。變量的生存期是由存儲類別控制的自動變量和靜態(tài)變量全局變量全局變量的生存期是定義這個變量的程序文件靜態(tài)存儲:在自動存儲:在函數(shù)開始執(zhí)行時為之分配存儲空間,函數(shù)執(zhí)行完畢后,立即回收這些存儲空間。在默認(rèn)情況下,局部變量都屬于自動變量。靜態(tài)局部變量(static變量)格式:static數(shù)據(jù)類型變量名;在局部變量說明前加上static構(gòu)成靜態(tài)局部變量。靜態(tài)存儲,在整個程序運行期間存儲空間都不釋放。 局部靜態(tài)變量局部于定義它的函數(shù)。出了函數(shù),靜態(tài)變量的值仍然保存,但不能引用。自動存儲:在函數(shù)開始執(zhí)行時為之分配存儲空間,函數(shù)執(zhí)行完畢后,全局變量是靜態(tài)存儲。函數(shù)的形式參數(shù)必須是自動變量。采用下面的語句段調(diào)用上面的函數(shù)

for(i=1;i<=10;i++){fun();}將會再屏幕上看到12345678910voidfun(){staticcount=0;count++;printf(“%4d”,count);}全局變量是靜態(tài)存儲。采用下面的語句段調(diào)用上面的函數(shù)將會再屏4.6函數(shù)綜合應(yīng)用4.6.1導(dǎo)例:模擬銀行ATM機存取款 4.6.2導(dǎo)例:貸款計算器 4.6.3程序主體框架的設(shè)計與實現(xiàn) 4.6.4模塊化程序設(shè)計的基本特征4.6函數(shù)綜合應(yīng)用4.6.1導(dǎo)例:模擬銀行ATM機存取款1.問題描述模擬銀行ATM機存取款,實現(xiàn)單個帳戶的查詢、存款、取款、轉(zhuǎn)帳、修改密碼等功能。4.6.1導(dǎo)例:模擬銀行ATM機存取款2.問題分析

進行模塊化設(shè)計,上述各項需求:查詢、存款、取款、轉(zhuǎn)帳、修改密碼分別用不同函數(shù)實現(xiàn)。由main()函數(shù)調(diào)用各函數(shù)來實現(xiàn)上述需求。首先輸入密碼進行判斷,密碼正確后輸出一個簡單菜單顯示項,操作有(1查詢,2存款,3取款,4轉(zhuǎn)帳,修改密碼,0退出),讀取用戶的操作選擇;再根據(jù)操作選擇項,分別調(diào)用各自函數(shù),經(jīng)多次操作直到輸入操作為0結(jié)束。2.問題分析3.算法描述(1)設(shè)全局變量balance保存存款余額,key保存密碼(2)模塊劃分,確定各函數(shù)的功能、參數(shù)和返回值。menu()函數(shù):顯示菜單選擇項,讀取操作選擇。check()函數(shù):返回存款余額。deposit()函數(shù):存款,根據(jù)輸入的金額增加存款余額。withdraw()函數(shù):取款,根據(jù)輸入的金額減少存款余額;如果金額不足,則提示不能進行取款操作。transfer()函數(shù):轉(zhuǎn)帳,根據(jù)用戶輸入的帳戶名和金額,減少存款余額,該帳戶增加余額。如果金額不足,則提示不能進行取款操作。changekey()函數(shù):修改密碼,連續(xù)輸入兩次,如果相同則修改成功,否則修改失敗。(3)主函數(shù):調(diào)用menu函數(shù),根據(jù)選擇的菜單項編號,用一個switch語句,分別執(zhí)行check()、deposit()、withdraw()、transfer()、changekey()和退出系統(tǒng)。3.算法描述C語言程序設(shè)計函數(shù)劉課件4.程序?qū)崿F(xiàn)4.程序?qū)崿F(xiàn)4.程序分析(1)該程序功能相對較多,采用模塊化設(shè)計更容易理解、測試、維護。考慮設(shè)計成每個功能用一個函數(shù)實現(xiàn)。main()作為主控模塊分別調(diào)用其它函數(shù)。(2)從程序中可以看出,對于全局變量balance、key的使用,各函數(shù)可直接使用,看似很方便;確實使用全局變量比局部變量自由度大,更方便,一旦定義,所有函數(shù)都可以直接使用,有些函數(shù)連參數(shù)都可以省略,甚至函數(shù)返回結(jié)果個數(shù)也不受限制,不需要使用return語句,可以直接通過全局變量回送結(jié)果。但對于規(guī)模較大的程序,過多使用全局變量會帶來副作用,導(dǎo)致個函數(shù)相互干擾,程序的可理解性、可測試性和可維護性都會很差。因此在變量使用中,盡量使用局部變量,提高程序的質(zhì)量。4.程序分析4.6.2導(dǎo)例:貸款計算器1.問題描述

貸款計算器是根據(jù)貸款情況計算還款情況的計算器。貸款計算器有很多種,這里設(shè)計一款簡單的貸款計算器:選擇等額本金或等額本息的還款方式時,計算每月的月供、利息總額和還款總額。4.6.2導(dǎo)例:貸款計算器2.問題分析簡易貸款計算器的功能如下:錄入貸款信息,即輸入貸款方式(等額本息、等額本金)、貸款總額、按揭年數(shù)、年利率、利率折扣等信息。顯示貸款信息,即輸出貸款方式(等額本息、等額本金)、貸款總額、按揭年數(shù)、年利率、利率折扣等信息。計算還款信息。即計算出每月的月供、利息總額、還款總額等信息。退出系統(tǒng)。2.問題分析3.算法描述(1)編寫一個菜單驅(qū)動的貸款計算程序,設(shè)計菜單函數(shù)menu(),根據(jù)菜單項選擇要調(diào)用的函數(shù),設(shè)計input()、show()、pay()函數(shù)分別實現(xiàn)貸款信息輸入、顯示貸款信息和顯示還款信息。(2)定義全局變量,pattern表示還款方式,

loan表示貸款總額,year表示按揭年數(shù),rate表示年利率,discount表示利率折扣。(3)input()函數(shù)輸入貸款信息,輸入5個數(shù)并保存于變量pattern,loan,year,rate,discount中,分別表示貸款方式、貸款總額、、年利率、利率折扣。(4)show()函數(shù)輸出貸款的信息,輸出pattern,loan,year,rate,discount的值,因為是全局變量,所以沒有參數(shù)和返回值。(5)pay()函數(shù)專門計算還款信息,計算每月的月供、利息總額、還款總額?,F(xiàn)在銀行最常用的中長期貸款的還款方法有兩種:等額本息還款法和等額本金還款法。按照等額本息還款法和等額本金還款法分別計算每月的月供、利息總額、還款總額等還款信息。(6)退出系統(tǒng)。

3.算法描述C語言程序設(shè)計函數(shù)劉課件4.程序?qū)崿F(xiàn)4.程序?qū)崿F(xiàn)4.6.3程序主體框架的設(shè)計與實現(xiàn)模塊化(Modularization)是把系統(tǒng)分割成能完成獨立功能的模塊,明確規(guī)定各模塊的輸入輸出規(guī)格,使模塊的界面清楚,功能明確,每個模塊可獨立命名和編址。模塊有以下基本屬性:名稱:模塊的名稱必須表達該模塊的功能,指明每次調(diào)用它時應(yīng)完成的功能。接口:模塊的輸入和輸出。功能:模塊實現(xiàn)的功能。邏輯:模塊內(nèi)部如何實現(xiàn)功能及所需要的數(shù)據(jù)。狀態(tài):模塊的調(diào)用與被調(diào)用關(guān)系。通常,模塊從調(diào)用者那里獲得輸入數(shù)據(jù),然后把產(chǎn)生的輸出數(shù)據(jù)返回給調(diào)用者。4.6.3程序主體框架的設(shè)計與實現(xiàn)4.6.4模塊化程序設(shè)計的基本特征自頂向下:程序設(shè)計時,應(yīng)先考慮總體步驟,后考慮步驟的細(xì)節(jié);先考慮全局目標(biāo),后考慮局部目標(biāo)。先從最上層總目標(biāo)開始設(shè)計,逐步使問題具體化。不要一開始就追求眾多的細(xì)節(jié)。逐步求精:對于復(fù)雜的問題,其中大的操作步驟應(yīng)該再將其分解為一些子步驟的序列,逐步明晰實現(xiàn)過程。函數(shù)實現(xiàn):通過逐步求精,把程序要解決的全局目標(biāo)分解為局部目標(biāo),再進一步分解為具體的小目標(biāo),把最終的小目標(biāo)用函數(shù)來實現(xiàn)。問題的逐步分解關(guān)系,構(gòu)成了函數(shù)間的調(diào)用關(guān)系。4.6.4模塊化程序設(shè)計的基本特征C語言程序設(shè)計函數(shù)劉課件C語言程序設(shè)計C語言程序設(shè)計第四章函數(shù)4.1庫函數(shù)4.2自定義函數(shù)4.3函數(shù)的參數(shù)傳遞與返回值4.4遞歸函數(shù)4.5局部變量、全局變量與變量作用域4.6函數(shù)綜合應(yīng)用第四章函數(shù)學(xué)習(xí)目標(biāo):理解函數(shù)在程序設(shè)計中的作用和地位掌握函數(shù)的定義、原型聲明和調(diào)用方法熟練掌握函數(shù)的參數(shù)傳遞與返回值理解局部變量、全局變量、靜態(tài)變量和變量的作用域掌握遞歸函數(shù)的編寫技術(shù)理解和掌握結(jié)構(gòu)設(shè)計和模塊化程序設(shè)計方法了解地址和指針的概念,了解地址做函數(shù)參數(shù)的特點和作用學(xué)習(xí)目標(biāo):為什么要用函數(shù)?問題:如果程序的功能比較多,規(guī)模比較大,把所有代碼都寫在main函數(shù)中,就會使主函數(shù)變得龐雜、頭緒不清,閱讀和維護變得困難有時程序中要多次實現(xiàn)某一功能,就需要多次重復(fù)編寫實現(xiàn)此功能的程序代碼,這使程序冗長,不精煉為什么要用函數(shù)?問題:解決的方法:用模塊化程序設(shè)計的思路采用“組裝”的辦法簡化程序設(shè)計的過程可以使用庫函數(shù):事先編好一批實現(xiàn)各種不同功能的函數(shù),把它們保存在函數(shù)庫中,需要時直接用可以使用自己編寫的函數(shù):在設(shè)計一個較大的程序時,往往把它分為若干個程序模塊,每一個模塊包括一個或多個函數(shù),每個函數(shù)實現(xiàn)一個特定的功能,函數(shù)的名字應(yīng)反映其代表的功能C程序可由一個主函數(shù)和若干個其他函數(shù)構(gòu)成,主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用,同一個函數(shù)可以被一個或多個函數(shù)調(diào)用任意多次在程序設(shè)計中要善于利用函數(shù),可以減少重復(fù)編寫程序段的工作量,同時可以方便地實現(xiàn)模塊化的程序設(shè)計解決的方法:用模塊化程序設(shè)計的思路C語言程序設(shè)計函數(shù)劉課件導(dǎo)例:平方根表1.問題描述輸出100以內(nèi)整數(shù)的平方根表,要求每行輸出10個。2.問題分析C語言提供了一個庫函數(shù)sqrt(),使用時直接調(diào)用該庫函數(shù)就可以計算出平方根值。導(dǎo)例:平方根表3.算法描述(1)定義兩個整型變量m,n。(2)輸出平方根表時,要注意格式。首先輸出表頭,輸出0~9的整數(shù)。(3)然后按照格式要求輸出平方根表,m為行數(shù)0~9,n為列數(shù)0~9,則表內(nèi)對應(yīng)第m行第n列的表值為sqrt(m*10+n),每行10個。3.算法描述1111#include<stdio.h>#include<math.h>//數(shù)學(xué)類頭文件intmain(){ intm,n;

for(n=0;n<10;n++)printf("%7d",n);//輸出表頭

printf("\n");for(m=0;m<10;m++){printf("%d",m);for(n=0;n<10;n++) printf("%7.4f",sqrt(m*10+n));//調(diào)用庫函數(shù)sqrt() printf("\n");}4.程序?qū)崿F(xiàn)return0;}#include<stdio.h>for(n=0;n<16.程序分析庫函數(shù)sqrt()原型放在文件math.h文件中,所在若在程序中使用該函數(shù),就需要在程序頭加上語句#include<math.h>。程序中語句段for(n=0;n<10;n++)是輸出表頭,輸出列號:0~9;表頭表示出0-9列的列號。用輸出函數(shù)printf(“%7.4f”)控制輸出的值為保留4位小數(shù)的實數(shù)。6.程序分析4.1.3庫函數(shù)使用方法庫函數(shù)的定義已經(jīng)在C語言提供的標(biāo)準(zhǔn)函數(shù)庫中,所以調(diào)用時,需要在程序的前面利用編譯預(yù)處理命令include將相應(yīng)的函數(shù)原型加入到程序中。#include指令的一般形式如下:

#include<文件名>或

#include“文件名”例如:#include<math.h>4.1.3庫函數(shù)使用方法C語言程序設(shè)計函數(shù)劉課件4.1.4常用的庫函數(shù)常用的函數(shù)頭文件,各自包含的函數(shù)類別如下:math.h:包含與數(shù)學(xué)相關(guān)的函數(shù)ctype.h:包含與字符處理有關(guān)的函數(shù)string.h:包含與字符串處理有關(guān)的函數(shù)stdio.h:包含與輸入輸出有關(guān)的函數(shù)stdlib.h:包含與動態(tài)分配存儲空間和數(shù)值轉(zhuǎn)換有關(guān)的函數(shù)process.h:包含與過程控制有關(guān)的函數(shù)4.1.4常用的庫函數(shù)4.2自定義函數(shù)

4.2.1導(dǎo)例:階乘累加和4.2.2導(dǎo)例:三色球問題 4.2.3函數(shù)的定義、聲明和調(diào)用 4.2.4函數(shù)調(diào)用過程分析

4.2自定義函數(shù) 導(dǎo)例:計算圓柱體積

輸入圓柱體的高和半徑,求圓柱體積,volume=π*r2*h。要求定義和調(diào)用函數(shù)cylinder(r,h)計算圓柱體的體積。導(dǎo)例:計算圓柱體積輸入圓柱體的高和半徑,求圓柱體積,/*計算圓柱體積*/#include<stdio.h>intmain(void){doubleheight,radius,volume;

doublecylinder(doubler,doubleh);/*函數(shù)聲明*/ printf("Enterradiusandheight:"); scanf("%lf%lf",&radius,&height); /*調(diào)用函數(shù),返回值賦給volume*/ volume=cylinder(radius,height); printf("Volume=%.3f\n",volume); return0;}/*計算圓柱體積*//*定義求圓柱體積的函數(shù)*/doublecylinder(doubler,doubleh)

{ doubleresult; result=3.1415926*r*r*h;/*計算體積*/

returnresult; /*返回結(jié)果*/}Enterradiusandheight:3.010Volume=282.743/*定義求圓柱體積的函數(shù)*/Enterradiusa#include<stdio.h>intmain(void){doubleheight,radius,volume;

doublecylinder(doubler,doubleh);/*函數(shù)聲明*/ printf("Enterradiusandheight:"); scanf("%lf%lf",&radius,&height); volume=cylinder(radius,height); printf("Volume=%.3f\n",volume); return0;}doublecylinder(doubler,doubleh)

{ doubleresult; result=3.1415926*r*r*h;

returnresult;

}Enterradiusandheight:3.010Volume=282.743問題:函數(shù)是如何運行的?#include<stdio.h>doublecylin4.2.1導(dǎo)例:階乘累加和1.問題描述

從鍵盤輸入1個整數(shù),計算1~n的各個數(shù)的階乘的累加和,即1+2!+3!+…+n!。2.問題分析

實現(xiàn)各個數(shù)的階乘的累加和,需要先計算每個數(shù)的階乘,然后累加到一起。4.2.1導(dǎo)例:階乘累加和sum=0;for(i=1;i<=n;i++){item=i!;sum=sum+item;}可用一個函數(shù)factorial()專門來計算每個數(shù)的階乘,然后用一個循環(huán)語句來計算1~n的各個階乘的累加的結(jié)果。sum=0;4.程序?qū)崿F(xiàn)#include<stdio.h>doublefactorial(inti);//函數(shù)聲明intmain(void){inti,n;doublesum=0;printf(“Enter1integers:”);scanf("%d",&n);for(i=1;i<=n;i++) sum=sum+factorial(i);//函數(shù)調(diào)用printf("1!+…+%d!=%.0f\n",n,sum);return0;}doublefactorial(inti)//函數(shù)定義{intj;doubleresult=1;for(j=1;j<=i;j++)result=result*j;

returnresult;

//返回結(jié)果}4.程序?qū)崿F(xiàn)doublefactorial(inti)一、函數(shù)的定義函數(shù)定義的基本形式是:函數(shù)類型函數(shù)名(形參表)

/*函數(shù)頭,沒有分號*/{函數(shù)實現(xiàn)過程/*函數(shù)體*/}形參表給出函數(shù)所有形參的名稱和類型,它的格式為:

類型1形參1,類型2形參2,……類型n形參n4.2.3函數(shù)的定義、聲明和調(diào)用一、函數(shù)的定義4.2.3函數(shù)的定義、聲明和調(diào)用函數(shù)類型函數(shù)名(形參表)

/*函數(shù)首部*/{

溫馨提示

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

最新文檔

評論

0/150

提交評論