程序設計基礎(第六章)_第1頁
程序設計基礎(第六章)_第2頁
程序設計基礎(第六章)_第3頁
程序設計基礎(第六章)_第4頁
程序設計基礎(第六章)_第5頁
已閱讀5頁,還剩36頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、LOGO程序設計基礎程序設計基礎LOGO第六章第六章 函數與模塊化程序設計函數與模塊化程序設計 函數的定義和調用函數的定義和調用6.1 變量的作用域與存儲類型變量的作用域與存儲類型6.2 利用函數進行模塊化程序設計利用函數進行模塊化程序設計6.3LOGO6.1 函數的定義和調用函數的定義和調用v函數是構成函數是構成C程序的基本構件。程序的基本構件。C程序是程序是一系列函數的集合,每個函數都具有相對一系列函數的集合,每個函數都具有相對獨立的單一功能。獨立的單一功能。v一個完整的一個完整的C程序由程序由主函數主函數被調函數被調函數來來構成構成。LOGO6.1 函數的定義和調用函數的定義和調用 一個

2、一個C C程序可以分為若干個函數。程序可以分為若干個函數。 每個程序有且只能有一個主函數(每個程序有且只能有一個主函數(mainmain),其他),其他函數都是函數都是“字函數字函數”。 子函數可以互相調用,但主函數不能被調用。子函數可以互相調用,但主函數不能被調用。 一個一個C C源程序由一個或多個文件構成,一個源程源程序由一個或多個文件構成,一個源程序是一個編譯單位。序是一個編譯單位。 C C語言中允許一個函數被多次調用,也允許函數語言中允許一個函數被多次調用,也允許函數調用自己本身調用自己本身( (遞歸調用遞歸調用) )LOGO6.1 函數的定義和調用函數的定義和調用6.1.1 函數分類

3、函數分類 從用戶角度 標準函數(庫函數):由系統提供 用戶自定義函數 從函數形式 無參函數 有參函數使用庫函數應注意:1、函數功能2、函數參數的數目和順序,及各參數意義和類型3、函數返回值意義和類型4、需要使用的包含文件LOGO6.1 函數的定義和調用函數的定義和調用 6.1.2 函數的定義函數的定義 一般格式一般格式合法標識符合法標識符函數返回值類型函數返回值類型缺省缺省int型型無返回值無返回值void函數體函數體函數類型函數類型 函數名函數名(形參類型說明表形參類型說明表)說明部分說明部分語句部分語句部分現代風格現代風格: :例例 有參函數(現代風格)有參函數(現代風格) int max

4、(int x,int y) int z; z=xy?x:y; return(z); 例例 有參函數(現代風格)有參函數(現代風格) int max(int x, y) int z; z=xy?x:y; return(z); 例例 空函數空函數 dummy( ) 函數體為空函數體為空例例 無參函數無參函數 printstar( ) printf(“*n”); 或或 printstar(void ) printf(“*n”); LOGO6.1 函數的定義和調用函數的定義和調用6.1.3 函數傳統風格和例子函數傳統風格和例子函數類型函數類型 函數名(形參表)函數名(形參表)形參類型說明形參類型說明說

5、明部分說明部分語句部分語句部分傳統風格傳統風格: :例例 有參函數(傳統風格)有參函數(傳統風格) int max(x,y) int x,y; int z; z=xy?x:y; return(z); LOGO6.1 函數的定義和調用函數的定義和調用 6.1.4 函數的返回值函數的返回值 返回語句返回語句 形式:形式: return(表達式表達式); 或或 return 表達式表達式; 或或 return; 功能:使程序控制從被調用函數返回到調用函數中,功能:使程序控制從被調用函數返回到調用函數中,同時把返值帶給調用函數同時把返值帶給調用函數 說明:說明: 函數中可有多個函數中可有多個retur

6、n語句語句 若無若無return語句,遇語句,遇時,自動返回調用函數時,自動返回調用函數 若函數類型與若函數類型與return語句中表達式值的類型不一致,按語句中表達式值的類型不一致,按前者為準,自動轉換前者為準,自動轉換-函數調用轉換函數調用轉換 void型函數型函數例例 無返回值函數無返回值函數 void swap(int x,int y ) int temp; temp=x; x=y; y=temp; LOGO6.1 函數的定義和調用函數的定義和調用 6.1.5 函數的調用函數的調用 調用形式調用形式 函數名函數名(實參表實參表); 說明:說明: 實參與形參個數相等,類型一致,按順序一一

7、對應實參與形參個數相等,類型一致,按順序一一對應 實參表求值順序,因系統而定(實參表求值順序,因系統而定(Turbo C 自右向左)自右向左) 調用方式調用方式(1)直接以函數引用語句的形式出現直接以函數引用語句的形式出現例如:例如: call_function(x,y, z); scanf(%d%d%d“,&i,&j,&k)LOGO6.1 函數的定義和調用函數的定義和調用 (2) 函數在表達式中出現函數在表達式中出現例如:例如: y = 8.25*min(x,y)*function(n); (3) 在函數引用中以實參的形式出現在函數引用中以實參的形式出現例如:例如:y=cos(tg(x);/

8、也稱嵌套調用也稱嵌套調用 main( ) a( ) b( )調用調用a( ) 調用調用b( ) ENDLOGO6.1 函數的定義和調用函數的定義和調用 在一個函數中調用另一函數(即被在一個函數中調用另一函數(即被調用函數)需要具備哪些條件呢?調用函數)需要具備哪些條件呢?被調用的函數必須是已經存在的被調用的函數必須是已經存在的函數函數(是庫函數或用戶自己定義函是庫函數或用戶自己定義函數數).(2) 如果使用庫函數,一般應在本文件如果使用庫函數,一般應在本文件開頭用開頭用include 預包含。預包含。(3) 如果使用用戶自己定義的函數,而如果使用用戶自己定義的函數,而且該函數與調用它的函數(即

9、主調函且該函數與調用它的函數(即主調函數)在同一個文件中,一般還應該在數)在同一個文件中,一般還應該在主調函數中對被調用的函數作聲明。主調函數中對被調用的函數作聲明。例例 對被調用的函數作聲明對被調用的函數作聲明main( ) float add (float x, float y); float a,b,c; scanf(f,f,a,b);); cadd(a,b);); printf (“sum isf”, c);float add(float x,float y) float ; xy; return();();LOGO6.1 函數的定義和調用函數的定義和調用LOGO6.1 函數的定義和調

10、用函數的定義和調用(1)(1)轉展相除法求最大公約數的函數轉展相除法求最大公約數的函數#include stdio.hgcd(int m, int n) int temp,k; while(n!=0) temp=m%n; m=n; n=temp; k=m; return(k); (2) (2) 調用調用gcdgcd函數的主函數函數的主函數main() int m,n,j,temp; scanf(%d%d,&m,&n); if(mn) temp=m; m=n; n=temp; j=gcd(m,n); printf(gcd is: %dn,j); LOGO6.1 函數的定義和調用函數的定義和調用v

11、 C程序的執行從main函數開始,調用其他函數后仍回到main函數,程序在main函數結束時結束。v 所有的子函數都是平行的,任何子函數都不屬于其他函數.v 從用戶的角度看,函數可以分為: 標準函數即庫函數 自定義函數v 從函數的形式看,可分為: 無參數函數: 有參數函數LOGO6.1 函數的定義和調用函數的定義和調用函數說明函數說明 對被調用函數要求:對被調用函數要求: 必須是已存在的函數必須是已存在的函數 庫函數庫函數: #include 用戶自定義函數用戶自定義函數: 函數類型說明函數類型說明 函數說明函數說明 一般形式:一般形式: 函數類型函數類型 函數名函數名(形參類型形參類型 形參

12、名形參名,. ); 或或 函數類型函數類型 函數名函數名(); 作用:告訴編譯系統函數類型、參數個數及類型,以便檢驗作用:告訴編譯系統函數類型、參數個數及類型,以便檢驗 函數定義與函數說明不同函數定義與函數說明不同 函數說明位置:程序的數據說明部分(函數內或外)函數說明位置:程序的數據說明部分(函數內或外) 下列情況下,可不作函數說明下列情況下,可不作函數說明 若函數返值是若函數返值是char或或int型,系統自動按型,系統自動按int型處理型處理 被調用函數定義出現在主調函數之前被調用函數定義出現在主調函數之前 有些系統有些系統(如如Borland C+)要求函數說明指出函數返值類型和要求函

13、數說明指出函數返值類型和形參類型,并且對形參類型,并且對void 和和 int 型函數也要進行函數說明型函數也要進行函數說明LOGO6.1 函數的定義和調用函數的定義和調用6.1.6 函數參數及其傳遞方式函數參數及其傳遞方式 形參與實參 形式參數:定義函數時函數名后面括號中的變量名 實際參數:調用函數時函數名后面括號中的表達式c=max(a,b);(main 函數)(max 函數)max(int x, int y) int z; z=xy?x:y; return(z); 例 比較兩個數并輸出大者main() int a,b,c; scanf(%d,%d,&a,&b); c=max(a,b);

14、printf(Max is %d,c);max(int x, int y) int z; z=xy?x:y; return(z);形參實參LOGO6.1 函數的定義和調用函數的定義和調用 函數參數及其傳遞方式函數參數及其傳遞方式形參與實參形參與實參形式參數:定義函數時函數名后面括號中的變量名形式參數:定義函數時函數名后面括號中的變量名實際參數:調用函數時函數名后面括號中的表達式實際參數:調用函數時函數名后面括號中的表達式說明:說明:實參必須有確定的值實參必須有確定的值形參必須指定類型形參必須指定類型形參與實參形參與實參類型一致,個數相同類型一致,個數相同若形參與實參類型不一致,自動按形參類型轉

15、換若形參與實參類型不一致,自動按形參類型轉換函數調用轉換函數調用轉換形參在函數被調用前不占內存形參在函數被調用前不占內存;函數調用時為形參分函數調用時為形參分配內存;調用結束,內存釋放配內存;調用結束,內存釋放LOGO6.1 函數的定義和調用函數的定義和調用參數傳遞方式參數傳遞方式 值傳遞方式值傳遞方式 方式:函數調用時方式:函數調用時,為形參分配單元為形參分配單元,并將實參的值復制到形參并將實參的值復制到形參中;調用結束,形參單元被釋放,實參單元仍保留并維持原中;調用結束,形參單元被釋放,實參單元仍保留并維持原值值 特點:特點: 形參與實參占用不同的內存單元形參與實參占用不同的內存單元 單向

16、傳遞單向傳遞LOGO6.1 函數的定義和調用函數的定義和調用例例 交換兩個數交換兩個數711x:y:調用前:調用結束:711x:y:/*ch7_2.c*/#include main() int x=7,y=11; printf(x=%d,ty=%dn,x,y); printf(swapped:n); swap(x,y); printf(x=%d,ty=%dn,x,y);swap(int a,int b) int temp; temp=a; a=b; b=temp;調用:711a:b:711x:y:swap:711x:y:117a:b:tempLOGO6.1 函數的定義和調用函數的定義和調用函數

17、的地址傳遞函數的地址傳遞 方式:函數調用時,將數據的存儲地址作為參數傳遞給形參方式:函數調用時,將數據的存儲地址作為參數傳遞給形參 特點:特點: 形參與實參占用同樣的存儲單元形參與實參占用同樣的存儲單元 “雙向雙向”傳遞傳遞 實參和形參必須是地址常量或變量實參和形參必須是地址常量或變量LOGO6.1 函數的定義和調用函數的定義和調用/*ch9_3.c*/swap(p1,p2)int *p1,*p2; int p; p=*p1; *p1=*p2; *p2=p;main()int a,b; scanf(%d,%d,&a,&b); printf(“a=%d,b=%dn”,a,b); printf(“

18、swapped:n”); swap(&a,&b); printf(”a=%d,b=%dn,a,b);例 交換兩個數a59b調前:a59b調swap:p1&a&bp2a95b交換:p1&a&bp2a95b返回:例子圖解例子圖解LOGO6.2 變量的作用域與存儲類型變量的作用域與存儲類型運行棧運行棧C程序程序運行時運行時所用存所用存儲空間儲空間程序區程序區靜態存儲區靜態存儲區存放執行程序存放執行程序的代碼和靜態的代碼和靜態變量變量存放外存放外部變量部變量系統為運行程系統為運行程序分配的存儲序分配的存儲空間空間LOGO6.2 變量的作用域與存儲類型變量的作用域與存儲類型變量的存儲屬性變量的存儲屬性

19、概述 變量是對程序中數據的存儲空間的抽象內存.main() int a; a=10; printf(“%d”,a);編譯或函數調用時為其分配內存單元1020002001程序中使用變量名對內存操作LOGO6.2 變量的作用域與存儲類型變量的作用域與存儲類型變量的存儲屬性變量的存儲屬性概述變量是對程序中數據的存儲空間的抽象變量的屬性數據類型:變量所持有的數據的性質(數據類型:變量所持有的數據的性質(操作屬性操作屬性)存儲屬性存儲屬性存儲器類型:寄存器、靜態存儲區、動態存儲區存儲器類型:寄存器、靜態存儲區、動態存儲區生存期生存期:變量在某一時刻存在:變量在某一時刻存在-靜態變量與動態變量靜態變量與動

20、態變量作用域作用域:變量在某區域內有效:變量在某區域內有效-局部變量與全局變量局部變量與全局變量變量的存儲類型auto -自動型自動型register-寄存器型寄存器型static -靜態型靜態型extern -外部型外部型變量定義格式: 存儲類型 數據類型 變量表;如如: int sum; auto int a,b,c; register int i; static float x,y;LOGO6.2 變量的作用域與存儲類型變量的作用域與存儲類型auto型變量型變量v auto型變量在函數內部定義,它局限于所在的函數。也型變量在函數內部定義,它局限于所在的函數。也稱為局部變量。稱為局部變量。

21、v auto型變量定義的形式:型變量定義的形式:v auto 數據類型標識符數據類型標識符 變量名表;變量名表; func (int a,int b) int i1,i2; char c1,c2; float a1,a2; int p1,p2; double d1,d2; auto int k; autoauto型變量的作用范圍局型變量的作用范圍局限于所在的花括號。函數的限于所在的花括號。函數的形參屬于形參屬于autoauto型變量其生命型變量其生命期在執行所屬的函數這段時期在執行所屬的函數這段時間區間。同名變量在不同函間區間。同名變量在不同函數中代表不同的含義。數中代表不同的含義。LOGO6

22、.2 變量的作用域與存儲類型變量的作用域與存儲類型extern型變量型變量v extern型變量也稱為外部變量,它是一種全局變量,在型變量也稱為外部變量,它是一種全局變量,在函數之外定義,其定義格式如下:函數之外定義,其定義格式如下:v extern 數據類型標識符數據類型標識符 變量名表變量名表;int f2(int a) a=a+b+c; return (a); #include stdio.hint b=1,c=2;int f1(int a,int c) int b=8; scanf(%d,&a); a=a+b+c; return (a);LOGO6.2 變量的作用域與存儲類型變量的作用

23、域與存儲類型register型變量型變量v由于CPU對寄存器的操作速度要遠遠快于對內存的操作,為了加快操作速度,可以使用寄存器型變量。 寄存器變量定義的一般形式為:寄存器變量定義的一般形式為: register 數據類型標識符數據類型標識符 變量名表變量名表;LOGO6.2 變量的作用域與存儲類型變量的作用域與存儲類型局部變量與全局變量局部變量與全局變量 局部變量-內部變量 定義:在函數內定義,只在本函數內有效 說明: main中定義的變量只在main中有效 不同函數中同名變量,占不同內存單元 形參屬于局部變量 可定義在復合語句中有效的變量 局部變量可用存儲類型:auto register s

24、tatic (默認為auto)float f1(int a) int b,c; .char f2(int x,int y) int i,j; main() int m,n; .a,b,c有效有效x,y,i,j有效有效m,n有效有效例例 不同函數中同名變量不同函數中同名變量main() int a,b; a=3; b=4; printf(main:a=%d,b=%dn,a,b); sub(); printf(main:a=%d,b=%dn,a,b);sub() int a,b; a=6; b=7; printf(sub:a=%d,b=%dn,a,b);例例 不同函數中同名變量不同函數中同名變量m

25、ain() int a,b; a=3; b=4; printf(main:a=%d,b=%dn,a,b); sub(); printf(main:a=%d,b=%dn,a,b);sub() int a,b; a=6; b=7; printf(sub:a=%d,b=%dn,a,b);運行結果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4例例 復合語句中變量復合語句中變量#define N 5main() int i; int aN=1,2,3,4,5; for(i=0;iN/2;i+) int temp;temp=ai;ai=aN-i-1;aN-i-1=temp; fo

26、r(i=0;iN;i+) printf(%d ,ai);運行結果:5 4 3 2 1例例 復合語句中變量復合語句中變量#define N 5main() int i; int aN=1,2,3,4,5; for(i=0;iN/2;i+) int temp;temp=ai;ai=aN-i-1;aN-i-1=temp; for(i=0;iN;i+) printf(%d ,ai);LOGO6.2 變量的作用域與存儲類型變量的作用域與存儲類型 全局變量全局變量 -外部變量外部變量 定義:在函數外定義,可為本文件所有函數共用定義:在函數外定義,可為本文件所有函數共用 有效范圍:從定義變量的位置開始到本源

27、文件結束,及有有效范圍:從定義變量的位置開始到本源文件結束,及有extern說明的其它源文件說明的其它源文件外部變量說明: extern 數據類型 變量表;外部變量定義與外部變量說明不同 定義定義 說明u次數: 只能1次 可說明多次u位置: 所有函數之外 函數內或函數外u分配內存: 分配內存,可初始化 不分配內存,不可初始化若外部變量與局部變量同名,則外部變量被屏蔽 應盡量少使用全局變量,因為:Y全局變量在程序全部執行過程中占用存儲單元Y降低了函數的通用性、可靠性,可移植性Y降低程序清晰性,容易出錯外部變量可用存儲類型:缺省:缺省 或 staticLOGO6.2 變量的作用域與存儲類型變量的作

28、用域與存儲類型全局變量在程序的整個執行過程都占用內存注注意意考慮程序的模塊性、通用性、可讀性,應少用全局變量全局變量太多,當程序長且大時往往難以清楚的判斷出各個瞬時各個全局變量的值。若函數中用到以前未定義過的參數,要用 extern 作外部變量說明LOGO6.2 變量的作用域與存儲類型變量的作用域與存儲類型float max,min;float average(float array, int n) int i; float sum=array0; max=min=array0; for(i=1;imax) max=arrayi; else if(arrayiy?x:y; return(z);

29、main() extern int a,b; printf(max=%d,max(a,b);int a=13,b=-8;運行結果:max=13extern int a,b;int max() int z; z=ab?a:b; return(z);main() printf(max=%d,max();int a=13,b=-8;例例 外部變量定義與說明外部變量定義與說明LOGO6.2 變量的作用域與存儲類型變量的作用域與存儲類型動態變量與靜態變量動態變量與靜態變量 存儲方式 靜態存儲:程序運行期間分配固定存儲空間 動態存儲:程序運行期間根據需要動態分配存儲空間 內存用戶區程序區靜態存儲區動態存儲

30、區全局變量、局部靜態變量形參變量局部動態變量(auto register)函數調用現場保護和返回地址等生存期靜態變量:從程序開始執行到程序結束動態變量:從包含該變量定義的函數開始執行至函數執行結束LOGO靜態動態存儲方式程序整個運行期間函數調用開始至結束生存期編譯時賦初值,只賦一次每次函數調用時賦初值自動賦初值0或空字符不確定未賦初值靜態存儲區動態區存儲區寄存器局部變量外部變量作用域定義變量的函數或復合語句內本文件其它文件u局部變量默認為auto型uregister型變量個數受限,且不能為long, double, float型u局部static變量具有全局壽命和局部可見性u局部static變

31、量具有可繼承性uextern不是變量定義,可擴展外部變量作用域register局部staticauto外部static外部存儲類別變變量量存存儲儲類類型型6.2 變量的作用域與存儲類型變量的作用域與存儲類型LOGO6.2 變量的作用域與存儲類型變量的作用域與存儲類型靜態靜態變量變量內部靜態變量內部靜態變量外部靜態變量外部靜態變量 靜態變量定義的一般形式為:靜態變量定義的一般形式為: static 數據類型標識符數據類型標識符 變量名表;變量名表;函數內定義函數內定義在源文件的開始和所在源文件的開始和所有函數之外定義有函數之外定義 static和全局變量若不初始化和全局變量若不初始化,自動賦自動

32、賦0 static和全局變量初始化時必須用常量為其賦初值和全局變量初始化時必須用常量為其賦初值 static型局部變量的初始化僅執行一次型局部變量的初始化僅執行一次 若進入某程序塊后若進入某程序塊后auto和和register型變量要被初始化,型變量要被初始化,則每次執行該程序塊都要進行初始化則每次執行該程序塊都要進行初始化 未初始化的未初始化的auto和和register變量,其初值不定,不能直變量,其初值不定,不能直接在程序中使用接在程序中使用extern型的變量不能進行初始化。型的變量不能進行初始化。LOGO6.3 利用函數進行模塊化程序設計利用函數進行模塊化程序設計 模塊化程序設計模塊

33、化程序設計 基本思想:將一個大的程序按功能分割成一些小模塊基本思想:將一個大的程序按功能分割成一些小模塊, 特點:特點: 各模塊相對獨立、功能單一、結構清晰、接口簡單各模塊相對獨立、功能單一、結構清晰、接口簡單 控制了程序設計的復雜性控制了程序設計的復雜性 提高元件的可靠性提高元件的可靠性 縮短開發周期縮短開發周期 避免程序開發的重復勞動避免程序開發的重復勞動 易于維護和功能擴充易于維護和功能擴充 開發方法開發方法: 自上向下自上向下,逐步分解,分而治之逐步分解,分而治之LOGO6.3 利用函數進行模塊化程序設計利用函數進行模塊化程序設計C是模塊化程序設計語言是模塊化程序設計語言源程序文件1預

34、編譯命令說明部分執行部分函數1函數n源程序文件i源程序文件nC程序C程序結構&C是函數式函數式語言&必須有且只能有一個名為mainmain的主函數&C程序的執行總是從從mainmain函數開始,在函數開始,在mainmain中結束中結束&函數不能嵌套定義不能嵌套定義, ,可以嵌套調用可以嵌套調用LOGO6.3 利用函數進行模塊化程序設計利用函數進行模塊化程序設計例例 求三個數中最大數和最小數的差值求三個數中最大數和最小數的差值#include int dif(int x,int y,int z); int max(int x,int y,int z); int min(int x,int y,int z);void main() int a,b,c,d; scanf(%d%d%d,&a,&b,&c); d=dif(a,b,c); printf(Max-Min=%dn,d); int dif(int x,int y,int z) return max(x,y,z)-min(x,y,z); int max(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z); int min(int x,int y,int z) int r; r=xy?x:

溫馨提示

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

評論

0/150

提交評論