




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第六章
模塊化程序設計---函數1第六章模塊化程序設計1一、函數概述二、函數的定義及調用三、局部變量和全局變量四、變量的存儲類別五、預編譯命令主要內容:2一、函數概述主要內容:2本章要點怎樣定義函數?如何調用函數?如何聲明函數?什么是函數的參數?在函數調用時,參數是如何傳遞的?在使用函數的過程中,要注意哪些問題?怎樣確定函數的參數?如何使用局部變量和全局變量?什么是靜態(tài)變量?3本章要點怎樣定義函數?如何調用函數?如何聲明函數?3怎樣把多個函數組織起來?怎樣用結構化程序設計的思想解決問題?怎樣用函數嵌套求解復雜的問題?怎樣用函數遞歸解決問題?預編譯命令的作用?44一、函數概述
使用結構化程序設計方法解決復雜的問題把大問題分解成若干小問題,小問題再進一步分解成若干更小的問題;寫程序時,用main()解決整個問題,用子函數解決小問題,main()調用解決小問題的子函數;這些子函數又進一步調用解決更小問題的函數,從而形成函數的嵌套調用。main()函數1函數2……函數m函數1_1函數1_2函數m_1函數m_n……程序結構:5一、函數概述使用結構化程序設計方法解決復雜的問題把大問題分C語言中的數學庫函數⑶使用數學庫中的函數時,應使用#include命令將數學頭文件math.h包含到程序中。⑴數學函數可用來完成一些常用的數學計算。⑵在使用函數時,通常按如下順序書寫:函數名、左圓括號、參數(或用逗號分開的參數列表)、右圓括號。例如:printf(“%8.2f”,sqrt(900.0));說明如下:①執(zhí)行這條語句時,就會通過調用函數sqrt計算900.0的平方根。②數900.0是函數sqrt的參數;③函數sqrt的參數是double型;函數值也是double型。④上述語句的打印結果為30.00。6C語言中的數學庫函數⑶使用數學庫中的函數時,應使用#inc(一)、函數的定義(二)、函數的調用(三)、函數編程舉例(四)、函數的嵌套調用(五)、函數的遞歸調用二、函數的定義及調用7(一)、函數的定義二、函數的定義及調用7(一)函數的定義
定義:函數是可重復使用的程序段,從其他的程序段中均可通過調用該函數來執(zhí)行該函數所包括的程序段。函數的分類:庫函數:由C語言系統(tǒng)提供定義如scanf()、printf()等函數自定義函數:需要用戶自己定義如計算圓柱體體積函數cylinder()——————————————————無參函數:不需要使用(代入)外來數據的函數有參函數:需要使用(代入)外來數據的函數8(一)函數的定義定義:8(一)函數的定義
函數是指完成一個特定工作的獨立程序模塊。main()也是一個函數,一個C程序由一個main()或多個函數構成。程序中一旦調用了某個函數,該函數就會完成一些特定的工作,然后返回到調用它的地方。有的函數經過運算,得到一個明確的運算結果,并需要回送該結果。例如,函數cylinder()返回圓柱的體積。有的函數完成一系列操作步驟,不需要回送任何運算結果。9(一)函數的定義函數是指完成一個特定工作的獨立程序模塊。91.不返回運算結果的函數定義void函數名(參數表) {
函數實現過程return; }這類函數通常用于屏幕輸出等表示不返回結果在VC環(huán)境下函數的返回值類型不能省略。/*函數首部*//*函數體*//*可以省略return*/101.不返回運算結果的函數定義void函數名(參數表) 例6-1輸出5之內的數字金字塔。/*輸出數字金字塔*/#include<stdio.h>voidpyramid()
/*函數定義*/{ inti,j;
for(i=1;i<=5;i++)
/*需要輸出的行數*/
{
for(j=1;j<=5-i;j++)
/*輸出每行左邊的空格*/
printf("");
for(j=1;j<=i;j++)
/*輸出每行的數字*/
printf("%d",i);
/*每個數字的前后各有一個空格*/
putchar('\n'); }}
122333444455555
11例6-1輸出5之內的數字金字塔。/*輸出數字金字塔*例6-2輸出n之內的數字金字塔。/*輸出數字金字塔*/#include<stdio.h>voidpyramid(intn)
/*函數定義*/{ inti,j;
for(i=1;i<=n;i++)
/*需要輸出的行數*/
{
for(j=1;j<=n-i;j++)
/*輸出每行左邊的空格*/
printf("");
for(j=1;j<=i;j++)
/*輸出每行的數字*/
printf("%d",i);
/*每個數字的前后各有一個空格*/
putchar('\n'); }}
122333444455555
12例6-2輸出n之內的數字金字塔。/*輸出數字金字塔舉例-計算兩個三角形面積
例6-3輸入兩個三角形三邊長,分別求這兩個三角形的面積。面積公式:s=其中,p=(a+b+c)/2
要求定義和調用函數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;}不用自定義函數的源程序出現功能重復的語句需優(yōu)化14#include<stdio.h>不用自定義函數的源程序出例6-3自定義的函數triangle分析:該函數須代入三邊長度值,且有一結果值/*首先定義求三角形面積的函數*/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自定義的函數triangle分析:該函數須代入三#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函數變?yōu)椋豪?-3的源程序由兩個函數組成。他們之間是調用和被調用的關系。main
函數調用triangle函數。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;}函數定義函數類型函數名(形參表)
/*函數首部*/{
/*函數體*/
函數實現過程
return表達式;}把函數運算的結果回送給主函數只能返回一個值函數返回值的類型沒有分號17doubletriangle(doublea,do形參變量的定義類型1參數1,類型2參數2,……,類型n參數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參數1,類型2參數2,……,doublecylinder(doubler,doubleh)/*函數首部
*/{
/*函數體,寫在一對大括號內*/doubleresult; result=3.1415926*r*r*h;/*計算圓柱體積*/
returnresult;
/*返回運算結果*/
}分析函數的定義函數類型函數名形參表與函數類型一致19doublecylinder(doubler,d(三)函數的調用定義一個函數后,就可以在程序中調用這個函數。調用標準庫函數時,在程序的最前面用#include命令包含相應的頭文件。調用自定義函數時,程序中必須有與調用函數相對應的函數定義。20(三)函數的調用定義一個函數后,就可以在程序中調用這個函數。1.函數調用的形式和過程使用返回值:s=triangle(a,b,c);printf(“%f\n”,triangle(a,b,c););完成操作:pyramid(5);//這也稱為函數調用語句常用于void類型函數的調用常用于返回結果的函數的調用常量、變量、表達式函數名(實參表)211.函數調用的形式和過程使用返回值:常用于void類型函數的函數調用的過程計算機在執(zhí)行程序時,從主函數main開始執(zhí)行,如果遇到某個函數調用,主函數被暫停執(zhí)行,轉而執(zhí)行相應的函數,該函數執(zhí)行完后,將返回主函數,然后再從原先暫停的位置繼續(xù)執(zhí)行。函數遇return或最后的大括號,返回主函數22函數調用的過程計算機在執(zhí)行程序時,從主函數main開始執(zhí)行,包含子函數的程序的執(zhí)行過程(1)程序的執(zhí)行從主函數的第一條語句開始;⑵遇到函數調用時,暫停在主調函數中的執(zhí)行,轉去處理函數調用;⑶為被調函數的形參變量分配內存單元,并將實參的值賦給形參變量.⑷為函數內定義的內部變量分配內存單元。⑸執(zhí)行被調函數的函數體,直到遇到return語句;⑹此時,將釋放為形參變量和內部變量分配的內存單元。程序的執(zhí)行流程又轉回到主調函數,同時將return語句括號中表達式的值帶回主函數。#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內部變量z形參:xy2323包含子函數的程序的執(zhí)行過程(1)程序的執(zhí)行從主函數的第一條2.參數傳遞函數定義時的參數被稱為形式參數(簡稱形參)doubletriangle(doublea,doubleb,doublec,);函數調用時的參數被稱為實際參數(簡稱實參)s1=triangle(a1,b1,c1);實參形參在參數傳遞過程中,實參把值復制給形參。形參和實參一一對應:數量一致,類型一致,順序一致形參:變量,用于接受實參傳遞過來的值實參:常量、變量或表達式單向傳遞242.參數傳遞函數定義時的參數被稱為形式參數(簡稱形參)單向傳3.函數結果返回函數返回的兩種情況完成確定的運算,有一個運算結果返回給主調函數。完成指定工作,沒有確定的運算結果需返回給主調函數(函數類型void)。函數結果返回的形式:return表達式;return(表達式);253.函數結果返回函數返回的兩種情況25對被調函數的聲明和函數原型當被調函數的定義出現在主調函數之后時,在主調函數中,使用函數原型對被調函數進行聲明。函數原型的作用函數原型告訴編譯器函數返回值的數據類型,函數所要接收的參數個數、參數類型和參數順序。編譯器用函數原型校驗函數調用。函數原型的兩種書寫格式類型標識符函數名(參數1的數據類型,參數2的數據類型,…);類型標識符函數名(參數1的數據類型參數名1,參數2的數據類型參數名2,…);函數原型---用于聲明被調函數26對被調函數的聲明和函數原型當被調函數的定義出現在主調函數之后【例6-4】定義判斷奇偶數的函數even(n)定義一個判斷奇偶數的函數even(n),當n為偶數時返回整數值1,否則返回整數值0。/*判斷奇偶數的函數*/inteven(intn) /*函數首部*/ { if(n%2==0) /*判別n的奇偶性*/
return1;
/*偶數返回1*/ else
return0; /*奇數返回0*/} 如何調用該函數?27【例6-4】定義判斷奇偶數的函數even(n)定義一個判斷例6.5:編寫程序:輸入變量m,n的值,計算組合數: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分析:將求階乘的任務用子函數實現。主函數負責輸入、調用函數進行計算、輸出結果。#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的值,計算組合數:C(m
(四)函數編程舉例例6-6:輸入精度值e,使用格里高利公式求π的近似值,精確到最后一項的絕對值小于e。要求定義和調用函數funpi(e)求π的近似值。29(四)函數編程舉例例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判斷素數的函數例6-7:求100以內的全部素數,每行輸出10個。素數就是只能被1和自身整除的正整數,1不是素數,2是素數。要求定義和調用函數prime(m)判斷m是否為素數,當m為素數時返回整數值1,否則返回整數值0。
算法描述:對2~100之間的每個數進行判斷,若是素數,則輸出該數。for(m=2;m<=100;m++)if(m是素數)printf("%d",m);prime(m)!=031例6-7判斷素數的函數例6-7:求100以內的全部素例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(五)、函數的嵌套調用函數調用可以嵌套:即:在調用一個函數的過程中,又可以調用另一個函數。調用a函數結束調用b函數main函數a函數b函數①②③④⑤⑥⑦⑧⑨例如,某個c程序中定義了3個函數:main,a,b,程序從主函數開始執(zhí)行。執(zhí)行過程如下圖所示。返回返回33(五)、函數的嵌套調用函數調用可以嵌套:調用a函數結束調用b四、局部變量和全局變量局部變量在函數內定義的變量(包括形參)作用范圍:本函數內部定義在復合語句內的變量作用范圍:復合語句內部全局變量(外部變量) 在函數以外定義的變量,不從屬于任一函數。作用范圍:從定義處到源文件結束(包括各函數)所以不同函數的同名變量互不干擾34四、局部變量和全局變量局部變量所以不同函數的34例6-7在復合語句中定義局部變量。#include<stdio.h>voidmain(){
int a;a=1;
{ /*復合語句開始*/
intb=2;b=a+b;a=a+b;
} /*復合語句結束*/ printf("%d",a);
}b:小范圍內的臨時變量
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;函數調用時,定義變量,分配存儲單元。函數調用結束,收回存儲單元。全局變量:從程序執(zhí)行開始,到程序的結束,存儲單元始終保持。變量生命周期變量從定義開始分配存儲單元,到運行結束存儲單元被回收的整個過程。變量生命周期38自動變量(auto):普通的局部變量變量生命周期38static類型名變量表;作用范圍:局部變量生命周期:全局變量靜態(tài)局部變量39static類型名變量表;靜態(tài)局部變量39#include<stdio.h>voidfun(intk);/*函數原型*/voidmain(){intk;for(k=1;k<=3;k++)fun(k);}voidfun(intk){
staticinta;printf("%d,",a);a+=k; }0,1,3,/*靜態(tài)局部變量會記住前一次調用時留下來的值*//*靜態(tài)局部變量的初值為0*/例6-8靜態(tài)局部變量示例
局部靜態(tài)變量的值在函數調用結束后不消失,保留原值,其占用的存儲單元不釋放,在下一次調用該函數時,該變量已有值,就是上一次函數調用結束時的值。40#include<stdio.h>0,1,3,/*靜態(tài)局部全局變量的有關說明:(2)建議不在必要時不要用全局變量,因為:使函數的通用性降低,因為函數在執(zhí)行時依賴外部變量。使用全局變量過多,降低函數的清晰性。人們難以清楚地判斷每個瞬間各個外部變量的值。在各函數執(zhí)行時,都可能改變外部變量的值,程序容易出錯。
所以要限制使用全局變量。(1)全局變量增加了函數間數據聯系的渠道;但增加了函數間的關聯。(3)如果同一源文件中外部變量與局部變量同名,則在局部變量的作用范圍內,全局變量被“屏蔽”,即它不起作用。
41全局變量的有關說明:(2)建議不在必要時不要用全局變量,因為六、變量的存儲類別一.內存中供用戶使用的存儲區(qū)包括:
程序區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)二.用戶的數據存儲在動態(tài)存儲區(qū)和靜態(tài)存儲區(qū)靜態(tài)存儲區(qū)存儲以下數據:全局變量,靜態(tài)局部變量動態(tài)存儲區(qū)存放以下數據:函數形參變量、自動變量、以及函數調用時的現場保護和返回地址等。靜態(tài)存儲區(qū)中的數據在整個程序運行期間都有效,即此存儲區(qū)中變量的生存期為整個程序的執(zhí)行周期動態(tài)存儲區(qū)中的數據只在它所在的函數被調用時才有效,隨著調用結束,它們就被釋放了。42六、變量的存儲類別一.內存中供用戶使用的存儲區(qū)包括:用extern聲明外部變量用于擴展外部變量的作用域。(1)在外部變量定義的文件內,擴展其作用范圍;(2)在一個文件中,使用另一個文件中定義的外部變量參見例8.20,8.2143用extern聲明外部變量43P142-150:1,2,3作業(yè)44P142-150:1,2,3作業(yè)44第六章
模塊化程序設計---函數45第六章模塊化程序設計1一、函數概述二、函數的定義及調用三、局部變量和全局變量四、變量的存儲類別五、預編譯命令主要內容:46一、函數概述主要內容:2本章要點怎樣定義函數?如何調用函數?如何聲明函數?什么是函數的參數?在函數調用時,參數是如何傳遞的?在使用函數的過程中,要注意哪些問題?怎樣確定函數的參數?如何使用局部變量和全局變量?什么是靜態(tài)變量?47本章要點怎樣定義函數?如何調用函數?如何聲明函數?3怎樣把多個函數組織起來?怎樣用結構化程序設計的思想解決問題?怎樣用函數嵌套求解復雜的問題?怎樣用函數遞歸解決問題?預編譯命令的作用?484一、函數概述
使用結構化程序設計方法解決復雜的問題把大問題分解成若干小問題,小問題再進一步分解成若干更小的問題;寫程序時,用main()解決整個問題,用子函數解決小問題,main()調用解決小問題的子函數;這些子函數又進一步調用解決更小問題的函數,從而形成函數的嵌套調用。main()函數1函數2……函數m函數1_1函數1_2函數m_1函數m_n……程序結構:49一、函數概述使用結構化程序設計方法解決復雜的問題把大問題分C語言中的數學庫函數⑶使用數學庫中的函數時,應使用#include命令將數學頭文件math.h包含到程序中。⑴數學函數可用來完成一些常用的數學計算。⑵在使用函數時,通常按如下順序書寫:函數名、左圓括號、參數(或用逗號分開的參數列表)、右圓括號。例如:printf(“%8.2f”,sqrt(900.0));說明如下:①執(zhí)行這條語句時,就會通過調用函數sqrt計算900.0的平方根。②數900.0是函數sqrt的參數;③函數sqrt的參數是double型;函數值也是double型。④上述語句的打印結果為30.00。50C語言中的數學庫函數⑶使用數學庫中的函數時,應使用#inc(一)、函數的定義(二)、函數的調用(三)、函數編程舉例(四)、函數的嵌套調用(五)、函數的遞歸調用二、函數的定義及調用51(一)、函數的定義二、函數的定義及調用7(一)函數的定義
定義:函數是可重復使用的程序段,從其他的程序段中均可通過調用該函數來執(zhí)行該函數所包括的程序段。函數的分類:庫函數:由C語言系統(tǒng)提供定義如scanf()、printf()等函數自定義函數:需要用戶自己定義如計算圓柱體體積函數cylinder()——————————————————無參函數:不需要使用(代入)外來數據的函數有參函數:需要使用(代入)外來數據的函數52(一)函數的定義定義:8(一)函數的定義
函數是指完成一個特定工作的獨立程序模塊。main()也是一個函數,一個C程序由一個main()或多個函數構成。程序中一旦調用了某個函數,該函數就會完成一些特定的工作,然后返回到調用它的地方。有的函數經過運算,得到一個明確的運算結果,并需要回送該結果。例如,函數cylinder()返回圓柱的體積。有的函數完成一系列操作步驟,不需要回送任何運算結果。53(一)函數的定義函數是指完成一個特定工作的獨立程序模塊。91.不返回運算結果的函數定義void函數名(參數表) {
函數實現過程return; }這類函數通常用于屏幕輸出等表示不返回結果在VC環(huán)境下函數的返回值類型不能省略。/*函數首部*//*函數體*//*可以省略return*/541.不返回運算結果的函數定義void函數名(參數表) 例6-1輸出5之內的數字金字塔。/*輸出數字金字塔*/#include<stdio.h>voidpyramid()
/*函數定義*/{ inti,j;
for(i=1;i<=5;i++)
/*需要輸出的行數*/
{
for(j=1;j<=5-i;j++)
/*輸出每行左邊的空格*/
printf("");
for(j=1;j<=i;j++)
/*輸出每行的數字*/
printf("%d",i);
/*每個數字的前后各有一個空格*/
putchar('\n'); }}
122333444455555
55例6-1輸出5之內的數字金字塔。/*輸出數字金字塔*例6-2輸出n之內的數字金字塔。/*輸出數字金字塔*/#include<stdio.h>voidpyramid(intn)
/*函數定義*/{ inti,j;
for(i=1;i<=n;i++)
/*需要輸出的行數*/
{
for(j=1;j<=n-i;j++)
/*輸出每行左邊的空格*/
printf("");
for(j=1;j<=i;j++)
/*輸出每行的數字*/
printf("%d",i);
/*每個數字的前后各有一個空格*/
putchar('\n'); }}
122333444455555
56例6-2輸出n之內的數字金字塔。/*輸出數字金字塔舉例-計算兩個三角形面積
例6-3輸入兩個三角形三邊長,分別求這兩個三角形的面積。面積公式:s=其中,p=(a+b+c)/2
要求定義和調用函數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;}不用自定義函數的源程序出現功能重復的語句需優(yōu)化58#include<stdio.h>不用自定義函數的源程序出例6-3自定義的函數triangle分析:該函數須代入三邊長度值,且有一結果值/*首先定義求三角形面積的函數*/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自定義的函數triangle分析:該函數須代入三#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函數變?yōu)椋豪?-3的源程序由兩個函數組成。他們之間是調用和被調用的關系。main
函數調用triangle函數。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;}函數定義函數類型函數名(形參表)
/*函數首部*/{
/*函數體*/
函數實現過程
return表達式;}把函數運算的結果回送給主函數只能返回一個值函數返回值的類型沒有分號61doubletriangle(doublea,do形參變量的定義類型1參數1,類型2參數2,……,類型n參數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參數1,類型2參數2,……,doublecylinder(doubler,doubleh)/*函數首部
*/{
/*函數體,寫在一對大括號內*/doubleresult; result=3.1415926*r*r*h;/*計算圓柱體積*/
returnresult;
/*返回運算結果*/
}分析函數的定義函數類型函數名形參表與函數類型一致63doublecylinder(doubler,d(三)函數的調用定義一個函數后,就可以在程序中調用這個函數。調用標準庫函數時,在程序的最前面用#include命令包含相應的頭文件。調用自定義函數時,程序中必須有與調用函數相對應的函數定義。64(三)函數的調用定義一個函數后,就可以在程序中調用這個函數。1.函數調用的形式和過程使用返回值:s=triangle(a,b,c);printf(“%f\n”,triangle(a,b,c););完成操作:pyramid(5);//這也稱為函數調用語句常用于void類型函數的調用常用于返回結果的函數的調用常量、變量、表達式函數名(實參表)651.函數調用的形式和過程使用返回值:常用于void類型函數的函數調用的過程計算機在執(zhí)行程序時,從主函數main開始執(zhí)行,如果遇到某個函數調用,主函數被暫停執(zhí)行,轉而執(zhí)行相應的函數,該函數執(zhí)行完后,將返回主函數,然后再從原先暫停的位置繼續(xù)執(zhí)行。函數遇return或最后的大括號,返回主函數66函數調用的過程計算機在執(zhí)行程序時,從主函數main開始執(zhí)行,包含子函數的程序的執(zhí)行過程(1)程序的執(zhí)行從主函數的第一條語句開始;⑵遇到函數調用時,暫停在主調函數中的執(zhí)行,轉去處理函數調用;⑶為被調函數的形參變量分配內存單元,并將實參的值賦給形參變量.⑷為函數內定義的內部變量分配內存單元。⑸執(zhí)行被調函數的函數體,直到遇到return語句;⑹此時,將釋放為形參變量和內部變量分配的內存單元。程序的執(zhí)行流程又轉回到主調函數,同時將return語句括號中表達式的值帶回主函數。#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內部變量z形參:xy2367包含子函數的程序的執(zhí)行過程(1)程序的執(zhí)行從主函數的第一條2.參數傳遞函數定義時的參數被稱為形式參數(簡稱形參)doubletriangle(doublea,doubleb,doublec,);函數調用時的參數被稱為實際參數(簡稱實參)s1=triangle(a1,b1,c1);實參形參在參數傳遞過程中,實參把值復制給形參。形參和實參一一對應:數量一致,類型一致,順序一致形參:變量,用于接受實參傳遞過來的值實參:常量、變量或表達式單向傳遞682.參數傳遞函數定義時的參數被稱為形式參數(簡稱形參)單向傳3.函數結果返回函數返回的兩種情況完成確定的運算,有一個運算結果返回給主調函數。完成指定工作,沒有確定的運算結果需返回給主調函數(函數類型void)。函數結果返回的形式:return表達式;return(表達式);693.函數結果返回函數返回的兩種情況25對被調函數的聲明和函數原型當被調函數的定義出現在主調函數之后時,在主調函數中,使用函數原型對被調函數進行聲明。函數原型的作用函數原型告訴編譯器函數返回值的數據類型,函數所要接收的參數個數、參數類型和參數順序。編譯器用函數原型校驗函數調用。函數原型的兩種書寫格式類型標識符函數名(參數1的數據類型,參數2的數據類型,…);類型標識符函數名(參數1的數據類型參數名1,參數2的數據類型參數名2,…);函數原型---用于聲明被調函數70對被調函數的聲明和函數原型當被調函數的定義出現在主調函數之后【例6-4】定義判斷奇偶數的函數even(n)定義一個判斷奇偶數的函數even(n),當n為偶數時返回整數值1,否則返回整數值0。/*判斷奇偶數的函數*/inteven(intn) /*函數首部*/ { if(n%2==0) /*判別n的奇偶性*/
return1;
/*偶數返回1*/ else
return0; /*奇數返回0*/} 如何調用該函數?71【例6-4】定義判斷奇偶數的函數even(n)定義一個判斷例6.5:編寫程序:輸入變量m,n的值,計算組合數: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分析:將求階乘的任務用子函數實現。主函數負責輸入、調用函數進行計算、輸出結果。#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的值,計算組合數:C(m
(四)函數編程舉例例6-6:輸入精度值e,使用格里高利公式求π的近似值,精確到最后一項的絕對值小于e。要求定義和調用函數funpi(e)求π的近似值。73(四)函數編程舉例例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判斷素數的函數例6-7:求100以內的全部素數,每行輸出10個。素數就是只能被1和自身整除的正整數,1不是素數,2是素數。要求定義和調用函數prime(m)判斷m是否為素數,當m為素數時返回整數值1,否則返回整數值0。
算法描述:對2~100之間的每個數進行判斷,若是素數,則輸出該數。for(m=2;m<=100;m++)if(m是素數)printf("%d",m);prime(m)!=075例6-7判斷素數的函數例6-7:求100以內的全部素例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(五)、函數的嵌套調用函數調用可以嵌套:即:在調用一個函數的過程中,又可以調用另一個函數。調用a函數結束調用b函數main函數a函數b函數①②③④⑤⑥⑦⑧⑨例如,某個c程序中定義了3個函數:main,a,b,程序從主函數開始執(zhí)行。執(zhí)行過程如下圖所示。返回返回77(五)、函數的嵌套調用函數調用可以嵌套:調用a函數結束調用b四、局部變量和全局變量局部變量在函數內定義的變量(包括形參)作用范圍:本函數內部定義在復合語句內的變量作用范圍:復合語句內部全局變量(外部變量) 在函數以外定義的變量,不從屬于任一函數。作用范圍:從定義處到源文件結束(包括各函數)所以不同函數的同名變量互不干擾78四、局部變量和全局變量局部變量所以不同函數的34例6-7在復合語句中定義局部變量。#include<stdio.h>voidmain(){
int a;a=1;
{
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 黑龍江省哈爾濱師范大學附中2025年高三壓軸卷化學試卷含解析
- 醫(yī)學資料 2021年手外傷的護理與康復演示學習課件
- 護理質量敏感指標
- 安徽省蕪湖縣一中2025屆高三最后一卷化學試卷含解析
- 湖南省岳陽市2025屆高三下學期一模考試化學試題含解析
- 護理質量管理情況
- 云南省上海新紀元2024-2025學年高二下學期3月月考地理試題(含答案)
- 人教版四年級下冊數學期末測試滿分沖刺卷(含答案)
- 2025年UV激光打孔機項目合作計劃書
- 2025屆山東省決勝新高考化學五模試卷含解析
- 《池塘養(yǎng)魚學》第五章-魚苗、魚種的培育-教學課件
- 經典的咨詢服務合同協(xié)議書2024年
- 模擬電子技術教程課后習題答案大全
- 中班音樂《粉刷匠》
- 2020年全國1卷-語文真題(解析版)
- 控告虛假訴訟書范文
- 省級行業(yè)產教融合共同體申報書、申報書、參與建設證明
- 北京市海淀區(qū)2023-2024學年八年級下學期期末考試英語試題(解析版)
- 第十三課 中望3D-裝配系列2講解
- 未被列入違法失信名單承諾書
- DL-T5394-2021電力工程地下金屬構筑物防腐技術導則
評論
0/150
提交評論