C語言課件第6章函數(shù)1new_第1頁
C語言課件第6章函數(shù)1new_第2頁
C語言課件第6章函數(shù)1new_第3頁
C語言課件第6章函數(shù)1new_第4頁
C語言課件第6章函數(shù)1new_第5頁
已閱讀5頁,還剩83頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第六章

模塊化程序設計---函數(shù)1第六章模塊化程序設計1一、函數(shù)概述二、函數(shù)的定義及調(diào)用三、局部變量和全局變量四、變量的存儲類別五、預編譯命令主要內(nèi)容:2一、函數(shù)概述主要內(nèi)容:2本章要點怎樣定義函數(shù)?如何調(diào)用函數(shù)?如何聲明函數(shù)?什么是函數(shù)的參數(shù)?在函數(shù)調(diào)用時,參數(shù)是如何傳遞的?在使用函數(shù)的過程中,要注意哪些問題?怎樣確定函數(shù)的參數(shù)?如何使用局部變量和全局變量?什么是靜態(tài)變量?3本章要點怎樣定義函數(shù)?如何調(diào)用函數(shù)?如何聲明函數(shù)?3怎樣把多個函數(shù)組織起來?怎樣用結構化程序設計的思想解決問題?怎樣用函數(shù)嵌套求解復雜的問題?怎樣用函數(shù)遞歸解決問題?預編譯命令的作用?44一、函數(shù)概述

使用結構化程序設計方法解決復雜的問題把大問題分解成若干小問題,小問題再進一步分解成若干更小的問題;寫程序時,用main()解決整個問題,用子函數(shù)解決小問題,main()調(diào)用解決小問題的子函數(shù);這些子函數(shù)又進一步調(diào)用解決更小問題的函數(shù),從而形成函數(shù)的嵌套調(diào)用。main()函數(shù)1函數(shù)2……函數(shù)m函數(shù)1_1函數(shù)1_2函數(shù)m_1函數(shù)m_n……程序結構:5一、函數(shù)概述使用結構化程序設計方法解決復雜的問題把大問題分C語言中的數(shù)學庫函數(shù)⑶使用數(shù)學庫中的函數(shù)時,應使用#include命令將數(shù)學頭文件math.h包含到程序中。⑴數(shù)學函數(shù)可用來完成一些常用的數(shù)學計算。⑵在使用函數(shù)時,通常按如下順序書寫:函數(shù)名、左圓括號、參數(shù)(或用逗號分開的參數(shù)列表)、右圓括號。例如:printf(“%8.2f”,sqrt(900.0));說明如下:①執(zhí)行這條語句時,就會通過調(diào)用函數(shù)sqrt計算900.0的平方根。②數(shù)900.0是函數(shù)sqrt的參數(shù);③函數(shù)sqrt的參數(shù)是double型;函數(shù)值也是double型。④上述語句的打印結果為30.00。6C語言中的數(shù)學庫函數(shù)⑶使用數(shù)學庫中的函數(shù)時,應使用#inc(一)、函數(shù)的定義(二)、函數(shù)的調(diào)用(三)、函數(shù)編程舉例(四)、函數(shù)的嵌套調(diào)用(五)、函數(shù)的遞歸調(diào)用二、函數(shù)的定義及調(diào)用7(一)、函數(shù)的定義二、函數(shù)的定義及調(diào)用7(一)函數(shù)的定義

定義:函數(shù)是可重復使用的程序段,從其他的程序段中均可通過調(diào)用該函數(shù)來執(zhí)行該函數(shù)所包括的程序段。函數(shù)的分類:庫函數(shù):由C語言系統(tǒng)提供定義如scanf()、printf()等函數(shù)自定義函數(shù):需要用戶自己定義如計算圓柱體體積函數(shù)cylinder()——————————————————無參函數(shù):不需要使用(代入)外來數(shù)據(jù)的函數(shù)有參函數(shù):需要使用(代入)外來數(shù)據(jù)的函數(shù)8(一)函數(shù)的定義定義:8(一)函數(shù)的定義

函數(shù)是指完成一個特定工作的獨立程序模塊。main()也是一個函數(shù),一個C程序由一個main()或多個函數(shù)構成。程序中一旦調(diào)用了某個函數(shù),該函數(shù)就會完成一些特定的工作,然后返回到調(diào)用它的地方。有的函數(shù)經(jīng)過運算,得到一個明確的運算結果,并需要回送該結果。例如,函數(shù)cylinder()返回圓柱的體積。有的函數(shù)完成一系列操作步驟,不需要回送任何運算結果。9(一)函數(shù)的定義函數(shù)是指完成一個特定工作的獨立程序模塊。91.不返回運算結果的函數(shù)定義void函數(shù)名(參數(shù)表) {

函數(shù)實現(xiàn)過程return; }這類函數(shù)通常用于屏幕輸出等表示不返回結果在VC環(huán)境下函數(shù)的返回值類型不能省略。/*函數(shù)首部*//*函數(shù)體*//*可以省略return*/101.不返回運算結果的函數(shù)定義void函數(shù)名(參數(shù)表) 例6-1輸出5之內(nèi)的數(shù)字金字塔。/*輸出數(shù)字金字塔*/#include<stdio.h>voidpyramid()

/*函數(shù)定義*/{ inti,j;

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

/*需要輸出的行數(shù)*/

{

for(j=1;j<=5-i;j++)

/*輸出每行左邊的空格*/

printf("");

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

/*輸出每行的數(shù)字*/

printf("%d",i);

/*每個數(shù)字的前后各有一個空格*/

putchar('\n'); }}

122333444455555

11例6-1輸出5之內(nèi)的數(shù)字金字塔。/*輸出數(shù)字金字塔*例6-2輸出n之內(nèi)的數(shù)字金字塔。/*輸出數(shù)字金字塔*/#include<stdio.h>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

12例6-2輸出n之內(nèi)的數(shù)字金字塔。/*輸出數(shù)字金字塔舉例-計算兩個三角形面積

例6-3輸入兩個三角形三邊長,分別求這兩個三角形的面積。面積公式:s=其中,p=(a+b+c)/2

要求定義和調(diào)用函數(shù)triangle(a,b,c)計算三角形的面積。13舉例-計算兩個三角形面積例6-3輸入兩個三角形三邊#include<stdio.h>#include<math.h>intmain(){doublea1,b1,c1,a2,b2,c2,p1,p2,s1,s2; printf("請輸入第一個三角形的三邊長:"); scanf("%lf%lf%lf",&a1,&b1,&c1);

printf("請輸入第二個三角形的三邊長:"); scanf("%lf%lf%lf",&a2,&b2,&c2);

p1=(a1+b1+c1)/2;s1=sqrt(p1*(p1-a1)*(p1-b1)*(p1-c1));

p2=(a2+b2+c2)/2;s2=sqrt(p2*(p2-a2)*(p2-b2)*(p2-c2));

printf(“s1=%.3f,s2=%.3f\n",s1,s2);return0;}不用自定義函數(shù)的源程序出現(xiàn)功能重復的語句需優(yōu)化14#include<stdio.h>不用自定義函數(shù)的源程序出例6-3自定義的函數(shù)triangle分析:該函數(shù)須代入三邊長度值,且有一結果值/*首先定義求三角形面積的函數(shù)*/doubletriangle(doublea,doubleb,doublec)

{ doublep,s;/*對語句中使用的變量進行定義*/

p=(a+b+c)/2; s=sqrt(p*(p-a)r*(p-b)*(p-c);/*計算面積*/

returns; /*返回結果*/}15例6-3自定義的函數(shù)triangle分析:該函數(shù)須代入三#include<stdio.h>#include<math.h>intmain(){doublea1,b1,c1,a2,b2,c2,p1,p2,s1,s2; printf("請輸入第一個三角形的三邊長:"); scanf("%lf%lf%lf",&a1,&b1,&c1);

printf("請輸入第二個三角形的三邊長:"); scanf("%lf%lf%lf",&a2,&b2,&c2);

s1=triangle(a1,b1,c1);s2=triangle(a2,b2,c2);

printf("s1=%.3f,s2=%.3f\n",s1,s2);return0;}例6-3該程序的main函數(shù)變?yōu)椋豪?-3的源程序由兩個函數(shù)組成。他們之間是調(diào)用和被調(diào)用的關系。main

函數(shù)調(diào)用triangle函數(shù)。16#include<stdio.h>例6-3該程序的madoubletriangle(doublea,doubleb,doublec){doubles,p;p=(a+b+c)/2;result=sqrt(p*(p-a)*(p-b)*(p-c));

returns;}函數(shù)定義函數(shù)類型函數(shù)名(形參表)

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

/*函數(shù)體*/

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

return表達式;}把函數(shù)運算的結果回送給主函數(shù)只能返回一個值函數(shù)返回值的類型沒有分號17doubletriangle(doublea,do形參變量的定義類型1參數(shù)1,類型2參數(shù)2,……,類型n參數(shù)n參數(shù)之間用逗號分隔,每個參數(shù)前面的類型都必須分別寫明函數(shù)類型函數(shù)名(形參表){函數(shù)實現(xiàn)過程return表達式;}不能寫成doubler,hdoubletriangle(doublea,doubleb,doublec){doubles,p;p=(a+b+c)/2;result=sqrt(p*(p-a)*(p-b)*(p-c));

returns;}18形參變量的定義類型1參數(shù)1,類型2參數(shù)2,……,doublecylinder(doubler,doubleh)/*函數(shù)首部

*/{

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

returnresult;

/*返回運算結果*/

}分析函數(shù)的定義函數(shù)類型函數(shù)名形參表與函數(shù)類型一致19doublecylinder(doubler,d(三)函數(shù)的調(diào)用定義一個函數(shù)后,就可以在程序中調(diào)用這個函數(shù)。調(diào)用標準庫函數(shù)時,在程序的最前面用#include命令包含相應的頭文件。調(diào)用自定義函數(shù)時,程序中必須有與調(diào)用函數(shù)相對應的函數(shù)定義。20(三)函數(shù)的調(diào)用定義一個函數(shù)后,就可以在程序中調(diào)用這個函數(shù)。1.函數(shù)調(diào)用的形式和過程使用返回值:s=triangle(a,b,c);printf(“%f\n”,triangle(a,b,c););完成操作:pyramid(5);//這也稱為函數(shù)調(diào)用語句常用于void類型函數(shù)的調(diào)用常用于返回結果的函數(shù)的調(diào)用常量、變量、表達式函數(shù)名(實參表)211.函數(shù)調(diào)用的形式和過程使用返回值:常用于void類型函數(shù)的函數(shù)調(diào)用的過程計算機在執(zhí)行程序時,從主函數(shù)main開始執(zhí)行,如果遇到某個函數(shù)調(diào)用,主函數(shù)被暫停執(zhí)行,轉(zhuǎn)而執(zhí)行相應的函數(shù),該函數(shù)執(zhí)行完后,將返回主函數(shù),然后再從原先暫停的位置繼續(xù)執(zhí)行。函數(shù)遇return或最后的大括號,返回主函數(shù)22函數(shù)調(diào)用的過程計算機在執(zhí)行程序時,從主函數(shù)main開始執(zhí)行,包含子函數(shù)的程序的執(zhí)行過程(1)程序的執(zhí)行從主函數(shù)的第一條語句開始;⑵遇到函數(shù)調(diào)用時,暫停在主調(diào)函數(shù)中的執(zhí)行,轉(zhuǎn)去處理函數(shù)調(diào)用;⑶為被調(diào)函數(shù)的形參變量分配內(nèi)存單元,并將實參的值賦給形參變量.⑷為函數(shù)內(nèi)定義的內(nèi)部變量分配內(nèi)存單元。⑸執(zhí)行被調(diào)函數(shù)的函數(shù)體,直到遇到return語句;⑹此時,將釋放為形參變量和內(nèi)部變量分配的內(nèi)存單元。程序的執(zhí)行流程又轉(zhuǎn)回到主調(diào)函數(shù),同時將return語句括號中表達式的值帶回主函數(shù)。#include<stdio.h>voidmain(){inta,b,c;scanf(“%d%d”,&a,&b);c=max(a,b);printf(“Themaxis%d”,c);}intmax(intx,inty){intz;z=x>y?x:y;return(z);}形參:xy實參:a2b3內(nèi)部變量z形參:xy2323包含子函數(shù)的程序的執(zhí)行過程(1)程序的執(zhí)行從主函數(shù)的第一條2.參數(shù)傳遞函數(shù)定義時的參數(shù)被稱為形式參數(shù)(簡稱形參)doubletriangle(doublea,doubleb,doublec,);函數(shù)調(diào)用時的參數(shù)被稱為實際參數(shù)(簡稱實參)s1=triangle(a1,b1,c1);實參形參在參數(shù)傳遞過程中,實參把值復制給形參。形參和實參一一對應:數(shù)量一致,類型一致,順序一致形參:變量,用于接受實參傳遞過來的值實參:常量、變量或表達式單向傳遞242.參數(shù)傳遞函數(shù)定義時的參數(shù)被稱為形式參數(shù)(簡稱形參)單向傳3.函數(shù)結果返回函數(shù)返回的兩種情況完成確定的運算,有一個運算結果返回給主調(diào)函數(shù)。完成指定工作,沒有確定的運算結果需返回給主調(diào)函數(shù)(函數(shù)類型void)。函數(shù)結果返回的形式:return表達式;return(表達式);253.函數(shù)結果返回函數(shù)返回的兩種情況25對被調(diào)函數(shù)的聲明和函數(shù)原型當被調(diào)函數(shù)的定義出現(xiàn)在主調(diào)函數(shù)之后時,在主調(diào)函數(shù)中,使用函數(shù)原型對被調(diào)函數(shù)進行聲明。函數(shù)原型的作用函數(shù)原型告訴編譯器函數(shù)返回值的數(shù)據(jù)類型,函數(shù)所要接收的參數(shù)個數(shù)、參數(shù)類型和參數(shù)順序。編譯器用函數(shù)原型校驗函數(shù)調(diào)用。函數(shù)原型的兩種書寫格式類型標識符函數(shù)名(參數(shù)1的數(shù)據(jù)類型,參數(shù)2的數(shù)據(jù)類型,…);類型標識符函數(shù)名(參數(shù)1的數(shù)據(jù)類型參數(shù)名1,參數(shù)2的數(shù)據(jù)類型參數(shù)名2,…);函數(shù)原型---用于聲明被調(diào)函數(shù)26對被調(diào)函數(shù)的聲明和函數(shù)原型當被調(diào)函數(shù)的定義出現(xiàn)在主調(diào)函數(shù)之后【例6-4】定義判斷奇偶數(shù)的函數(shù)even(n)定義一個判斷奇偶數(shù)的函數(shù)even(n),當n為偶數(shù)時返回整數(shù)值1,否則返回整數(shù)值0。/*判斷奇偶數(shù)的函數(shù)*/inteven(intn) /*函數(shù)首部*/ { if(n%2==0) /*判別n的奇偶性*/

return1;

/*偶數(shù)返回1*/ else

return0; /*奇數(shù)返回0*/} 如何調(diào)用該函數(shù)?27【例6-4】定義判斷奇偶數(shù)的函數(shù)even(n)定義一個判斷例6.5:編寫程序:輸入變量m,n的值,計算組合數(shù):C(m,n)=m!/(n!*(m-n)!)(m>n)floatfac(intx){inti;floatt=1;for(i=1;i<=x;i++)t=t*i;

return(t);}inputm,n:53Theresultis10.0分析:將求階乘的任務用子函數(shù)實現(xiàn)。主函數(shù)負責輸入、調(diào)用函數(shù)進行計算、輸出結果。#include<stdio.h>voidmain(){floatc;intm,n;

floatfac(intx);printf(“inputm,n:”);scanf(“%d%d”,&m,&n);c=fac(m)/(fac(n)*fac(m-n));printf(“Theresultis%8.1f”,c);}28例6.5:編寫程序:輸入變量m,n的值,計算組合數(shù):C(m

(四)函數(shù)編程舉例例6-6:輸入精度值e,使用格里高利公式求π的近似值,精確到最后一項的絕對值小于e。要求定義和調(diào)用函數(shù)funpi(e)求π的近似值。29(四)函數(shù)編程舉例例6-6:輸入精度值e,使用格里高利公例6-6源程序/*用格里高利公式計算π的近似值,精度為e*/#include<stdio.h>#include<math.h>intmain(void){ doublee,pi;

doublefunpi(doublee); printf("Entere:"); scanf("%lf",&e); pi=funpi(e); printf("pi=%f\n",pi); return0;}doublefunpi(doublee){ intdenominator,flag;doubleitem,sum; flag=1; denominator=1; item=1.0; sum=0;while(fabs(item)>=e){ item=flag*1.0/denominator;sum=sum+item;flag=-flag; denominator=denominator+2;}

returnsum*4;}Entere:0.0001pi=3.141830例6-6源程序/*用格里高利公式計算π的近似值,精度為e例6-7判斷素數(shù)的函數(shù)例6-7:求100以內(nèi)的全部素數(shù),每行輸出10個。素數(shù)就是只能被1和自身整除的正整數(shù),1不是素數(shù),2是素數(shù)。要求定義和調(diào)用函數(shù)prime(m)判斷m是否為素數(shù),當m為素數(shù)時返回整數(shù)值1,否則返回整數(shù)值0。

算法描述:對2~100之間的每個數(shù)進行判斷,若是素數(shù),則輸出該數(shù)。for(m=2;m<=100;m++)if(m是素數(shù))printf("%d",m);prime(m)!=031例6-7判斷素數(shù)的函數(shù)例6-7:求100以內(nèi)的全部素例6-7源程序#include<stdio.h>#include<math.h>voidmain(){ 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)return0;

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

return0;

return1;}32例6-7源程序#include<stdio.h>int(五)、函數(shù)的嵌套調(diào)用函數(shù)調(diào)用可以嵌套:即:在調(diào)用一個函數(shù)的過程中,又可以調(diào)用另一個函數(shù)。調(diào)用a函數(shù)結束調(diào)用b函數(shù)main函數(shù)a函數(shù)b函數(shù)①②③④⑤⑥⑦⑧⑨例如,某個c程序中定義了3個函數(shù):main,a,b,程序從主函數(shù)開始執(zhí)行。執(zhí)行過程如下圖所示。返回返回33(五)、函數(shù)的嵌套調(diào)用函數(shù)調(diào)用可以嵌套:調(diào)用a函數(shù)結束調(diào)用b四、局部變量和全局變量局部變量在函數(shù)內(nèi)定義的變量(包括形參)作用范圍:本函數(shù)內(nèi)部定義在復合語句內(nèi)的變量作用范圍:復合語句內(nèi)部全局變量(外部變量) 在函數(shù)以外定義的變量,不從屬于任一函數(shù)。作用范圍:從定義處到源文件結束(包括各函數(shù))所以不同函數(shù)的同名變量互不干擾34四、局部變量和全局變量局部變量所以不同函數(shù)的34例6-7在復合語句中定義局部變量。#include<stdio.h>voidmain(){

int a;a=1;

{ /*復合語句開始*/

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

} /*復合語句結束*/ printf("%d",a);

}b:小范圍內(nèi)的臨時變量

435例6-7在復合語句中定義局部變量。#include<s#include"stdio.h"intx; /*定義全局變量x*/intf(){

intx=4;/*x為局部變量*/returnx;}voidmain(){

inta=1;

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

intb=2;

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

x=x+b; /*全局變量運算*/}printf("%d%d",a,x);

}4,7若局部變量與全局變量同名,局部變量優(yōu)先例6-7全局變量定義36#include"stdio.h"4,7若局部變量與全局變量作用范圍示例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=?37變量作用范圍示例intx=1;x=?a=?b=?自動變量(auto):普通的局部變量intx,y;

autointx,y;charc1;

autocharc1;函數(shù)調(diào)用時,定義變量,分配存儲單元。函數(shù)調(diào)用結束,收回存儲單元。全局變量:從程序執(zhí)行開始,到程序的結束,存儲單元始終保持。變量生命周期變量從定義開始分配存儲單元,到運行結束存儲單元被回收的整個過程。變量生命周期38自動變量(auto):普通的局部變量變量生命周期38static類型名變量表;作用范圍:局部變量生命周期:全局變量靜態(tài)局部變量39static類型名變量表;靜態(tài)局部變量39#include<stdio.h>voidfun(intk);/*函數(shù)原型*/voidmain(){intk;for(k=1;k<=3;k++)fun(k);}voidfun(intk){

staticinta;printf("%d,",a);a+=k; }0,1,3,/*靜態(tài)局部變量會記住前一次調(diào)用時留下來的值*//*靜態(tài)局部變量的初值為0*/例6-8靜態(tài)局部變量示例

局部靜態(tài)變量的值在函數(shù)調(diào)用結束后不消失,保留原值,其占用的存儲單元不釋放,在下一次調(diào)用該函數(shù)時,該變量已有值,就是上一次函數(shù)調(diào)用結束時的值。40#include<stdio.h>0,1,3,/*靜態(tài)局部全局變量的有關說明:(2)建議不在必要時不要用全局變量,因為:使函數(shù)的通用性降低,因為函數(shù)在執(zhí)行時依賴外部變量。使用全局變量過多,降低函數(shù)的清晰性。人們難以清楚地判斷每個瞬間各個外部變量的值。在各函數(shù)執(zhí)行時,都可能改變外部變量的值,程序容易出錯。

所以要限制使用全局變量。(1)全局變量增加了函數(shù)間數(shù)據(jù)聯(lián)系的渠道;但增加了函數(shù)間的關聯(lián)。(3)如果同一源文件中外部變量與局部變量同名,則在局部變量的作用范圍內(nèi),全局變量被“屏蔽”,即它不起作用。

41全局變量的有關說明:(2)建議不在必要時不要用全局變量,因為六、變量的存儲類別一.內(nèi)存中供用戶使用的存儲區(qū)包括:

程序區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)二.用戶的數(shù)據(jù)存儲在動態(tài)存儲區(qū)和靜態(tài)存儲區(qū)靜態(tài)存儲區(qū)存儲以下數(shù)據(jù):全局變量,靜態(tài)局部變量動態(tài)存儲區(qū)存放以下數(shù)據(jù):函數(shù)形參變量、自動變量、以及函數(shù)調(diào)用時的現(xiàn)場保護和返回地址等。靜態(tài)存儲區(qū)中的數(shù)據(jù)在整個程序運行期間都有效,即此存儲區(qū)中變量的生存期為整個程序的執(zhí)行周期動態(tài)存儲區(qū)中的數(shù)據(jù)只在它所在的函數(shù)被調(diào)用時才有效,隨著調(diào)用結束,它們就被釋放了。42六、變量的存儲類別一.內(nèi)存中供用戶使用的存儲區(qū)包括:用extern聲明外部變量用于擴展外部變量的作用域。(1)在外部變量定義的文件內(nèi),擴展其作用范圍;(2)在一個文件中,使用另一個文件中定義的外部變量參見例8.20,8.2143用extern聲明外部變量43P142-150:1,2,3作業(yè)44P142-150:1,2,3作業(yè)44第六章

模塊化程序設計---函數(shù)45第六章模塊化程序設計1一、函數(shù)概述二、函數(shù)的定義及調(diào)用三、局部變量和全局變量四、變量的存儲類別五、預編譯命令主要內(nèi)容:46一、函數(shù)概述主要內(nèi)容:2本章要點怎樣定義函數(shù)?如何調(diào)用函數(shù)?如何聲明函數(shù)?什么是函數(shù)的參數(shù)?在函數(shù)調(diào)用時,參數(shù)是如何傳遞的?在使用函數(shù)的過程中,要注意哪些問題?怎樣確定函數(shù)的參數(shù)?如何使用局部變量和全局變量?什么是靜態(tài)變量?47本章要點怎樣定義函數(shù)?如何調(diào)用函數(shù)?如何聲明函數(shù)?3怎樣把多個函數(shù)組織起來?怎樣用結構化程序設計的思想解決問題?怎樣用函數(shù)嵌套求解復雜的問題?怎樣用函數(shù)遞歸解決問題?預編譯命令的作用?484一、函數(shù)概述

使用結構化程序設計方法解決復雜的問題把大問題分解成若干小問題,小問題再進一步分解成若干更小的問題;寫程序時,用main()解決整個問題,用子函數(shù)解決小問題,main()調(diào)用解決小問題的子函數(shù);這些子函數(shù)又進一步調(diào)用解決更小問題的函數(shù),從而形成函數(shù)的嵌套調(diào)用。main()函數(shù)1函數(shù)2……函數(shù)m函數(shù)1_1函數(shù)1_2函數(shù)m_1函數(shù)m_n……程序結構:49一、函數(shù)概述使用結構化程序設計方法解決復雜的問題把大問題分C語言中的數(shù)學庫函數(shù)⑶使用數(shù)學庫中的函數(shù)時,應使用#include命令將數(shù)學頭文件math.h包含到程序中。⑴數(shù)學函數(shù)可用來完成一些常用的數(shù)學計算。⑵在使用函數(shù)時,通常按如下順序書寫:函數(shù)名、左圓括號、參數(shù)(或用逗號分開的參數(shù)列表)、右圓括號。例如:printf(“%8.2f”,sqrt(900.0));說明如下:①執(zhí)行這條語句時,就會通過調(diào)用函數(shù)sqrt計算900.0的平方根。②數(shù)900.0是函數(shù)sqrt的參數(shù);③函數(shù)sqrt的參數(shù)是double型;函數(shù)值也是double型。④上述語句的打印結果為30.00。50C語言中的數(shù)學庫函數(shù)⑶使用數(shù)學庫中的函數(shù)時,應使用#inc(一)、函數(shù)的定義(二)、函數(shù)的調(diào)用(三)、函數(shù)編程舉例(四)、函數(shù)的嵌套調(diào)用(五)、函數(shù)的遞歸調(diào)用二、函數(shù)的定義及調(diào)用51(一)、函數(shù)的定義二、函數(shù)的定義及調(diào)用7(一)函數(shù)的定義

定義:函數(shù)是可重復使用的程序段,從其他的程序段中均可通過調(diào)用該函數(shù)來執(zhí)行該函數(shù)所包括的程序段。函數(shù)的分類:庫函數(shù):由C語言系統(tǒng)提供定義如scanf()、printf()等函數(shù)自定義函數(shù):需要用戶自己定義如計算圓柱體體積函數(shù)cylinder()——————————————————無參函數(shù):不需要使用(代入)外來數(shù)據(jù)的函數(shù)有參函數(shù):需要使用(代入)外來數(shù)據(jù)的函數(shù)52(一)函數(shù)的定義定義:8(一)函數(shù)的定義

函數(shù)是指完成一個特定工作的獨立程序模塊。main()也是一個函數(shù),一個C程序由一個main()或多個函數(shù)構成。程序中一旦調(diào)用了某個函數(shù),該函數(shù)就會完成一些特定的工作,然后返回到調(diào)用它的地方。有的函數(shù)經(jīng)過運算,得到一個明確的運算結果,并需要回送該結果。例如,函數(shù)cylinder()返回圓柱的體積。有的函數(shù)完成一系列操作步驟,不需要回送任何運算結果。53(一)函數(shù)的定義函數(shù)是指完成一個特定工作的獨立程序模塊。91.不返回運算結果的函數(shù)定義void函數(shù)名(參數(shù)表) {

函數(shù)實現(xiàn)過程return; }這類函數(shù)通常用于屏幕輸出等表示不返回結果在VC環(huán)境下函數(shù)的返回值類型不能省略。/*函數(shù)首部*//*函數(shù)體*//*可以省略return*/541.不返回運算結果的函數(shù)定義void函數(shù)名(參數(shù)表) 例6-1輸出5之內(nèi)的數(shù)字金字塔。/*輸出數(shù)字金字塔*/#include<stdio.h>voidpyramid()

/*函數(shù)定義*/{ inti,j;

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

/*需要輸出的行數(shù)*/

{

for(j=1;j<=5-i;j++)

/*輸出每行左邊的空格*/

printf("");

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

/*輸出每行的數(shù)字*/

printf("%d",i);

/*每個數(shù)字的前后各有一個空格*/

putchar('\n'); }}

122333444455555

55例6-1輸出5之內(nèi)的數(shù)字金字塔。/*輸出數(shù)字金字塔*例6-2輸出n之內(nèi)的數(shù)字金字塔。/*輸出數(shù)字金字塔*/#include<stdio.h>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

56例6-2輸出n之內(nèi)的數(shù)字金字塔。/*輸出數(shù)字金字塔舉例-計算兩個三角形面積

例6-3輸入兩個三角形三邊長,分別求這兩個三角形的面積。面積公式:s=其中,p=(a+b+c)/2

要求定義和調(diào)用函數(shù)triangle(a,b,c)計算三角形的面積。57舉例-計算兩個三角形面積例6-3輸入兩個三角形三邊#include<stdio.h>#include<math.h>intmain(){doublea1,b1,c1,a2,b2,c2,p1,p2,s1,s2; printf("請輸入第一個三角形的三邊長:"); scanf("%lf%lf%lf",&a1,&b1,&c1);

printf("請輸入第二個三角形的三邊長:"); scanf("%lf%lf%lf",&a2,&b2,&c2);

p1=(a1+b1+c1)/2;s1=sqrt(p1*(p1-a1)*(p1-b1)*(p1-c1));

p2=(a2+b2+c2)/2;s2=sqrt(p2*(p2-a2)*(p2-b2)*(p2-c2));

printf(“s1=%.3f,s2=%.3f\n",s1,s2);return0;}不用自定義函數(shù)的源程序出現(xiàn)功能重復的語句需優(yōu)化58#include<stdio.h>不用自定義函數(shù)的源程序出例6-3自定義的函數(shù)triangle分析:該函數(shù)須代入三邊長度值,且有一結果值/*首先定義求三角形面積的函數(shù)*/doubletriangle(doublea,doubleb,doublec)

{ doublep,s;/*對語句中使用的變量進行定義*/

p=(a+b+c)/2; s=sqrt(p*(p-a)r*(p-b)*(p-c);/*計算面積*/

returns; /*返回結果*/}59例6-3自定義的函數(shù)triangle分析:該函數(shù)須代入三#include<stdio.h>#include<math.h>intmain(){doublea1,b1,c1,a2,b2,c2,p1,p2,s1,s2; printf("請輸入第一個三角形的三邊長:"); scanf("%lf%lf%lf",&a1,&b1,&c1);

printf("請輸入第二個三角形的三邊長:"); scanf("%lf%lf%lf",&a2,&b2,&c2);

s1=triangle(a1,b1,c1);s2=triangle(a2,b2,c2);

printf("s1=%.3f,s2=%.3f\n",s1,s2);return0;}例6-3該程序的main函數(shù)變?yōu)椋豪?-3的源程序由兩個函數(shù)組成。他們之間是調(diào)用和被調(diào)用的關系。main

函數(shù)調(diào)用triangle函數(shù)。60#include<stdio.h>例6-3該程序的madoubletriangle(doublea,doubleb,doublec){doubles,p;p=(a+b+c)/2;result=sqrt(p*(p-a)*(p-b)*(p-c));

returns;}函數(shù)定義函數(shù)類型函數(shù)名(形參表)

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

/*函數(shù)體*/

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

return表達式;}把函數(shù)運算的結果回送給主函數(shù)只能返回一個值函數(shù)返回值的類型沒有分號61doubletriangle(doublea,do形參變量的定義類型1參數(shù)1,類型2參數(shù)2,……,類型n參數(shù)n參數(shù)之間用逗號分隔,每個參數(shù)前面的類型都必須分別寫明函數(shù)類型函數(shù)名(形參表){函數(shù)實現(xiàn)過程return表達式;}不能寫成doubler,hdoubletriangle(doublea,doubleb,doublec){doubles,p;p=(a+b+c)/2;result=sqrt(p*(p-a)*(p-b)*(p-c));

returns;}62形參變量的定義類型1參數(shù)1,類型2參數(shù)2,……,doublecylinder(doubler,doubleh)/*函數(shù)首部

*/{

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

returnresult;

/*返回運算結果*/

}分析函數(shù)的定義函數(shù)類型函數(shù)名形參表與函數(shù)類型一致63doublecylinder(doubler,d(三)函數(shù)的調(diào)用定義一個函數(shù)后,就可以在程序中調(diào)用這個函數(shù)。調(diào)用標準庫函數(shù)時,在程序的最前面用#include命令包含相應的頭文件。調(diào)用自定義函數(shù)時,程序中必須有與調(diào)用函數(shù)相對應的函數(shù)定義。64(三)函數(shù)的調(diào)用定義一個函數(shù)后,就可以在程序中調(diào)用這個函數(shù)。1.函數(shù)調(diào)用的形式和過程使用返回值:s=triangle(a,b,c);printf(“%f\n”,triangle(a,b,c););完成操作:pyramid(5);//這也稱為函數(shù)調(diào)用語句常用于void類型函數(shù)的調(diào)用常用于返回結果的函數(shù)的調(diào)用常量、變量、表達式函數(shù)名(實參表)651.函數(shù)調(diào)用的形式和過程使用返回值:常用于void類型函數(shù)的函數(shù)調(diào)用的過程計算機在執(zhí)行程序時,從主函數(shù)main開始執(zhí)行,如果遇到某個函數(shù)調(diào)用,主函數(shù)被暫停執(zhí)行,轉(zhuǎn)而執(zhí)行相應的函數(shù),該函數(shù)執(zhí)行完后,將返回主函數(shù),然后再從原先暫停的位置繼續(xù)執(zhí)行。函數(shù)遇return或最后的大括號,返回主函數(shù)66函數(shù)調(diào)用的過程計算機在執(zhí)行程序時,從主函數(shù)main開始執(zhí)行,包含子函數(shù)的程序的執(zhí)行過程(1)程序的執(zhí)行從主函數(shù)的第一條語句開始;⑵遇到函數(shù)調(diào)用時,暫停在主調(diào)函數(shù)中的執(zhí)行,轉(zhuǎn)去處理函數(shù)調(diào)用;⑶為被調(diào)函數(shù)的形參變量分配內(nèi)存單元,并將實參的值賦給形參變量.⑷為函數(shù)內(nèi)定義的內(nèi)部變量分配內(nèi)存單元。⑸執(zhí)行被調(diào)函數(shù)的函數(shù)體,直到遇到return語句;⑹此時,將釋放為形參變量和內(nèi)部變量分配的內(nèi)存單元。程序的執(zhí)行流程又轉(zhuǎn)回到主調(diào)函數(shù),同時將return語句括號中表達式的值帶回主函數(shù)。#include<stdio.h>voidmain(){inta,b,c;scanf(“%d%d”,&a,&b);c=max(a,b);printf(“Themaxis%d”,c);}intmax(intx,inty){intz;z=x>y?x:y;return(z);}形參:xy實參:a2b3內(nèi)部變量z形參:xy2367包含子函數(shù)的程序的執(zhí)行過程(1)程序的執(zhí)行從主函數(shù)的第一條2.參數(shù)傳遞函數(shù)定義時的參數(shù)被稱為形式參數(shù)(簡稱形參)doubletriangle(doublea,doubleb,doublec,);函數(shù)調(diào)用時的參數(shù)被稱為實際參數(shù)(簡稱實參)s1=triangle(a1,b1,c1);實參形參在參數(shù)傳遞過程中,實參把值復制給形參。形參和實參一一對應:數(shù)量一致,類型一致,順序一致形參:變量,用于接受實參傳遞過來的值實參:常量、變量或表達式單向傳遞682.參數(shù)傳遞函數(shù)定義時的參數(shù)被稱為形式參數(shù)(簡稱形參)單向傳3.函數(shù)結果返回函數(shù)返回的兩種情況完成確定的運算,有一個運算結果返回給主調(diào)函數(shù)。完成指定工作,沒有確定的運算結果需返回給主調(diào)函數(shù)(函數(shù)類型void)。函數(shù)結果返回的形式:return表達式;return(表達式);693.函數(shù)結果返回函數(shù)返回的兩種情況25對被調(diào)函數(shù)的聲明和函數(shù)原型當被調(diào)函數(shù)的定義出現(xiàn)在主調(diào)函數(shù)之后時,在主調(diào)函數(shù)中,使用函數(shù)原型對被調(diào)函數(shù)進行聲明。函數(shù)原型的作用函數(shù)原型告訴編譯器函數(shù)返回值的數(shù)據(jù)類型,函數(shù)所要接收的參數(shù)個數(shù)、參數(shù)類型和參數(shù)順序。編譯器用函數(shù)原型校驗函數(shù)調(diào)用。函數(shù)原型的兩種書寫格式類型標識符函數(shù)名(參數(shù)1的數(shù)據(jù)類型,參數(shù)2的數(shù)據(jù)類型,…);類型標識符函數(shù)名(參數(shù)1的數(shù)據(jù)類型參數(shù)名1,參數(shù)2的數(shù)據(jù)類型參數(shù)名2,…);函數(shù)原型---用于聲明被調(diào)函數(shù)70對被調(diào)函數(shù)的聲明和函數(shù)原型當被調(diào)函數(shù)的定義出現(xiàn)在主調(diào)函數(shù)之后【例6-4】定義判斷奇偶數(shù)的函數(shù)even(n)定義一個判斷奇偶數(shù)的函數(shù)even(n),當n為偶數(shù)時返回整數(shù)值1,否則返回整數(shù)值0。/*判斷奇偶數(shù)的函數(shù)*/inteven(intn) /*函數(shù)首部*/ { if(n%2==0) /*判別n的奇偶性*/

return1;

/*偶數(shù)返回1*/ else

return0; /*奇數(shù)返回0*/} 如何調(diào)用該函數(shù)?71【例6-4】定義判斷奇偶數(shù)的函數(shù)even(n)定義一個判斷例6.5:編寫程序:輸入變量m,n的值,計算組合數(shù):C(m,n)=m!/(n!*(m-n)!)(m>n)floatfac(intx){inti;floatt=1;for(i=1;i<=x;i++)t=t*i;

return(t);}inputm,n:53Theresultis10.0分析:將求階乘的任務用子函數(shù)實現(xiàn)。主函數(shù)負責輸入、調(diào)用函數(shù)進行計算、輸出結果。#include<stdio.h>voidmain(){floatc;intm,n;

floatfac(intx);printf(“inputm,n:”);scanf(“%d%d”,&m,&n);c=fac(m)/(fac(n)*fac(m-n));printf(“Theresultis%8.1f”,c);}72例6.5:編寫程序:輸入變量m,n的值,計算組合數(shù):C(m

(四)函數(shù)編程舉例例6-6:輸入精度值e,使用格里高利公式求π的近似值,精確到最后一項的絕對值小于e。要求定義和調(diào)用函數(shù)funpi(e)求π的近似值。73(四)函數(shù)編程舉例例6-6:輸入精度值e,使用格里高利公例6-6源程序/*用格里高利公式計算π的近似值,精度為e*/#include<stdio.h>#include<math.h>intmain(void){ doublee,pi;

doublefunpi(doublee); printf("Entere:"); scanf("%lf",&e); pi=funpi(e); printf("pi=%f\n",pi); return0;}doublefunpi(doublee){ intdenominator,flag;doubleitem,sum; flag=1; denominator=1; item=1.0; sum=0;while(fabs(item)>=e){ item=flag*1.0/denominator;sum=sum+item;flag=-flag; denominator=denominator+2;}

returnsum*4;}Entere:0.0001pi=3.141874例6-6源程序/*用格里高利公式計算π的近似值,精度為e例6-7判斷素數(shù)的函數(shù)例6-7:求100以內(nèi)的全部素數(shù),每行輸出10個。素數(shù)就是只能被1和自身整除的正整數(shù),1不是素數(shù),2是素數(shù)。要求定義和調(diào)用函數(shù)prime(m)判斷m是否為素數(shù),當m為素數(shù)時返回整數(shù)值1,否則返回整數(shù)值0。

算法描述:對2~100之間的每個數(shù)進行判斷,若是素數(shù),則輸出該數(shù)。for(m=2;m<=100;m++)if(m是素數(shù))printf("%d",m);prime(m)!=075例6-7判斷素數(shù)的函數(shù)例6-7:求100以內(nèi)的全部素例6-7源程序#include<stdio.h>#include<math.h>voidmain(){ 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)return0;

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

return0;

return1;}76例6-7源程序#include<stdio.h>int(五)、函數(shù)的嵌套調(diào)用函數(shù)調(diào)用可以嵌套:即:在調(diào)用一個函數(shù)的過程中,又可以調(diào)用另一個函數(shù)。調(diào)用a函數(shù)結束調(diào)用b函數(shù)main函數(shù)a函數(shù)b函數(shù)①②③④⑤⑥⑦⑧⑨例如,某個c程序中定義了3個函數(shù):main,a,b,程序從主函數(shù)開始執(zhí)行。執(zhí)行過程如下圖所示。返回返回77(五)、函數(shù)的嵌套調(diào)用函數(shù)調(diào)用可以嵌套:調(diào)用a函數(shù)結束調(diào)用b四、局部變量和全局變量局部變量在函數(shù)內(nèi)定義的變量(包括形參)作用范圍:本函數(shù)內(nèi)部定義在復合語句內(nèi)的變量作用范圍:復合語句內(nèi)部全局變量(外部變量) 在函數(shù)以外定義的變量,不從屬于任一函數(shù)。作用范圍:從定義處到源文件結束(包括各函數(shù))所以不同函數(shù)的同名變量互不干擾78四、局部變量和全局變量局部變量所以不同函數(shù)的34例6-7在復合語句中定義局部變量。#include<stdio.h>voidmain(){

int a;a=1;

{

溫馨提示

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

評論

0/150

提交評論