




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、首頁首頁 上頁上頁 下頁下頁節節末頁末頁結束結束1第七章第七章 函數函數 C語言程序設計語言程序設計 課程講義課程講義 2006年年4月月首頁首頁 上頁上頁 下頁下頁節節末頁末頁結束結束2上一章節課程回顧上一章節課程回顧數組的基本概念數組的基本概念一維數組的定義和引用一維數組的定義和引用二維數組的定義和引用二維數組的定義和引用字符數組字符數組首頁首頁上頁上頁下頁下頁節節末頁末頁結束結束首頁首頁 上頁上頁 下頁下頁節節末頁末頁結束結束3 7.1概述概述 7.2函數定義的一般形式函數定義的一般形式 7.3函數參數和函數的值函數參數和函數的值 7.4數組作為函數參數數組作為函數參數 7.5函數的嵌套
2、調用和遞歸調用函數的嵌套調用和遞歸調用 7.6全局變量和局部變量全局變量和局部變量 7.7變量的存儲屬性變量的存儲屬性 第第7章章 函數函數首頁首頁上頁上頁下頁下頁節節末頁末頁結束結束首頁首頁 上頁上頁 下頁下頁節節末頁末頁結束結束4本次課主要內容本次課主要內容重點:重點:一、重點掌握函數的定義、聲明及傳值一、重點掌握函數的定義、聲明及傳值 與調用。與調用。二、二、熟悉函數熟悉函數的嵌套與遞歸調用。的嵌套與遞歸調用。三、掌握變量的作用域與存儲類別三、掌握變量的作用域與存儲類別難點:難點:一、形參與實參之間的值傳遞一、形參與實參之間的值傳遞二、函數的嵌二、函數的嵌套與遞歸調用套與遞歸調用本章主要
3、內容本章主要內容首頁首頁 上頁上頁 下頁下頁節節末頁末頁結束結束5函數一、函數C語言中,程序是由函數來實現的。函數可分為(1):標準庫函數(2)用戶自定義函數。在C語言中,至少要有一個main ( )函數,程序的執行是從main( )函數開始的,也是由主函數結束的。函數的調用過程如圖:f11( )f21( )f31( )f1( )f11( );f2( )f11( );f22( );main( )f1( );f2( );首頁首頁 上頁上頁 下頁下頁節節末頁末頁結束結束67.1函數的概述函數的概述其中,每個方框相當于一個模塊,而每個函數相當于一個輸入輸出系統。inout例如:要設計一個如下圖所示的
4、管理程序:高等院校事務管理辦公室管理教務管理科研管理財務管理圖書管理后勤管理人事管理首頁首頁 上頁上頁 下頁下頁節節末頁末頁結束結束7花括弧內是函數體,它包括聲明和語句部分8.2 函數定義的一般形式函數定義的一般形式一、函數的定義與聲明1、定義:存儲類型 數據類型 函數名(帶類型的形表) 聲明部分 語句 例如:int max(int x,int y) int z; z=xy?x:y; return(z); Return(z)的作用是將z的值作為函數值帶回到主調函數中。在函數定義時已指定函數max函數為整型,在函數體中定義了z為整型,兩者類型一致,將z作為函數max的值帶回調用函數。首頁首頁 上
5、頁上頁 下頁下頁節節末頁末頁結束結束88.2 函數定義的一般形式函數定義的一般形式例L8-2-1.C:計算表達式的值 x x+1 (x0)float y (float x ) if (x10) return (2*x+3); else return; 編譯時,由于第二個return語句而給出警告。說明:1)存儲類型(后面講) 2)數據類型:指函數返回值的類型。若缺省函數類型,一律按整型處理。若缺省函數類型,一律按整型處理。 3)只有自定義函數而沒有main()函數的程序是沒有意義的。(例L82-1)首頁首頁 上頁上頁 下頁下頁節節末頁末頁結束結束108.2 函數定義的一般形式函數定義的一般形式
6、2、函數的聲明 數據類型 函數名 (類型標記符 形參 , );注意后面的“;”不要丟了。它與定義不同,一個函數一般要經過聲明才能使用(就好象一個函數一般要經過聲明才能使用(就好象變量一樣必須先聲明才能使用),除非它在調用函數(變量一樣必須先聲明才能使用),除非它在調用函數(main函數)的前面定義。函數)的前面定義。只有當返回的數據類型為int,數據類型才可省略。如:main( ) double new_style ( int, double ); /*函數聲明*/ Double new_style (int a, double x) /*函數定義*/ 函數聲明后面有“;”函數定義后面沒有“;
7、”首頁首頁 上頁上頁 下頁下頁節節末頁末頁結束結束118.3函數參數和函數的值函數參數和函數的值一、關于形參和實參的說明:1、形參只有當調用時才臨時分配存儲元。2、實參一定要有確定的值,可以是表式。3、實參和形參的類型應相同或賦值相容,并且實參的個數與形參的個數一致。參數的傳遞是通過調用來完成的,分為按值傳遞和按址傳遞。首頁首頁 上頁上頁 下頁下頁節節末頁末頁結束結束128.3函數參數和函數的值函數參數和函數的值二、函數的返回(return 語句) return 返回值表達式;return后面表達式的類型必須和函數定義時函數名前的類型保持一致。后面表達式的類型必須和函數定義時函數名前的類型保持
8、一致。 return語句有三種形式: 1、return; (沒有返回值沒有返回值) 2、return 表達式; 3、return (表達式);首頁首頁 上頁上頁 下頁下頁節節末頁末頁結束結束13三、函數的調用函數名 (實參表);(如果是有返回值的函數,則可將調用結果賦值給別的變量,若是無值函數,則不能賦值,只能單獨調用;)四、形參、實參、參數的傳遞形參:定義函數的參數。實參:調用函數時有具體值的參數。首頁首頁 上頁上頁 下頁下頁節節末頁末頁結束結束148.3函數參數和函數的值函數參數和函數的值例L8_3_1.cmain( ) int a=3, b=5; void swap( int , int
9、 ); (函數申明) swap (a, b); printf(“a=%d, b=%dn”, a, b);void swap (int x, int y) int temp; temp=x; x=y; y=temp; printf(“x=%d , y=%d n”, x, y);是按值傳遞的按址傳遞放在指針里面講。Main()函數:調用Swap函數傳遞值35ab35xy 3temp程序運行結果:x=5,y=3a=3,b=5首頁首頁 上頁上頁 下頁下頁節節末頁末頁結束結束15函數調用函數聲明函數定義,其位置可以在main()前,這樣可以省略函數申明。也可以在main()后。Main() float
10、x,y; float y(float); scanf(“%f”,&x); Printf(“y=%8.2fn”,y(x);float y (float x ) if (x0) return (x*xx+1); else return (x*x*x+x+3);首頁首頁 上頁上頁 下頁下頁節節末頁末頁結束結束16實參為數組元素#include stdio.hmain()int a3,i,m; int max(int,int); printf(Please input 3 int:n); for(i=0;ib?a:b);8.4、數組作為函數參數數組元素和簡單變量具有相同的特性,因此可以作為函數
11、的實參來出現。(L8_4_1)形參為整形首頁首頁 上頁上頁 下頁下頁節節末頁末頁結束結束17二、數組名作為函數參數有一個一唯數組score,內放10個學生的分數,求平均成績。首頁首頁 上頁上頁 下頁下頁節節末頁末頁結束結束18形參形參實參實參#define N 10main()float scoreN,avg; float average(float arrN); int i; printf(Please input %d score:n,N); for(i=0;iN;i+)scanf(%f,&scorei); avg=average(score); printf(Average sc
12、ore is %7.2fn,avg);float average(float arrN)int i; float sum=0.0,aver; for(i=0;iN;i+) sum=sum+arri; aver=sum/N; return(aver);形參和實參都用數組名首頁首頁 上頁上頁 下頁下頁節節末頁末頁結束結束19數組名作為函數參數實參數組和形參數組類型應保持一致。在被調用函數中聲明的數組大小是不起任何作用的。因為C編譯系統對形參數組大小不作檢查,形參數組名只代表一個地址,形參數組名只代表一個地址,在調用時將實參數組的首地址傳到形參數組名,也就是說,形參數組并不在內存中重新申請數組的空間
13、,而是和實參數組共占存儲單形參數組并不在內存中重新申請數組的空間,而是和實參數組共占存儲單元。元。首頁首頁 上頁上頁 下頁下頁節節末頁末頁結束結束20根據需要另設一個參數傳遞需要處理的數組元素的個數數組元素要參加處理的實際個數#define N 10main()float scoreN,avg; float average(float arrN); int i; printf(Please input %d score:n,5); for(i=0;i5;i+)scanf(%f,&scorei); avg=average(score,5); printf(Average score is
14、 %7.2fn,avg);float average(float arr,int n)int i; float sum=0.0,aver; for(i=0;in;i+) sum=sum+arri; aver=sum/n; return(aver);首頁首頁 上頁上頁 下頁下頁節節末頁末頁結束結束21實參為數組名形參定義二維數組的維數及每一維的大小,可以缺省第一維的大小#include stdio.hmain()int a33=1,1,1,1,1,1,1,1,1; int s(int aa3); clrscr(); printf(sum=%dn,s(a);int s(int a3)int sum
15、=0; int i,j; for(i=0;i3;i+)for(j=0;jb?a:b; return c;main()int a=7,b=10; fun(a,b); printf(max=%dn,d);int d;d=fun(a,b);首頁首頁 上頁上頁 下頁下頁節節末頁末頁結束結束26在函數fun()中,雖然沒有定義變量a,b,但由于它們定義在程序的最前面,是全程變量,凡是在定義該變量的后面定義的函數均可以引用它們。8.6全局變量和局部變量全局變量和局部變量#include “stdio.h”int a=3, b=5; /*在函數體外定義的變量*/Main( ) void fun( ); pr
16、intf(“ a= %d , b=%d n ” , a, b); fun ( ); printf(“ a= %d , b=%d n ” , a, b);void fun (void) int c ; c=a; a=b; b=c; 例L8_6_1.c 交換兩個變量的值變量a,b是外部變量首頁首頁 上頁上頁 下頁下頁節節末頁末頁結束結束278.6全局變量和局部變量全局變量和局部變量 2、用extern聲明外部變量,用以擴充外部變量的作用域。(1)在一個文件內聲明外部變量:如:L8_6_1 main( ) void gx( ) int x, y; void gy( ) 還可用它在不同的程序中使用,如
17、 在 中引用 中定義的變量x, y。extern int x, y;x,y原作用域 x,y新的作用域首頁首頁 上頁上頁 下頁下頁節節末頁末頁結束結束288.7變量的存儲屬性變量的存儲屬性 變量的存儲類型有:register型:寄存器類型auto 型:自動型(缺省的都是auto型)static 型:靜態型一、自動變量 auto 數據類型 變量名=初值表達式 , ;不作特殊說明的變量都是自動變量不作特殊說明的變量都是自動變量。它用之則建、用完即撤,僅在函數體內或復合語句內建立和有效,存儲在內存的動態數據區中。例L8_7_1.c首頁首頁 上頁上頁 下頁下頁節節末頁末頁結束結束29程序一進入main(
18、)函數,變量x就被創建,當程序運行到此局部范圍內(即花括號內)時創建,用完即撤消,即釋放變量。當程序運行到函數prt()內部時,變量x才被創建,離開函數時,就被撤消main( )int x=1; clrscr(); void prt(void); int x=3; prt( ); printf(x=%dn,x); printf(%dn,x);void prt(void) int x=5; printf(%dn,x);總之,總之,auto變量是局部變量,變量是局部變量,在賦值之前,其值是不確定的,首頁首頁 上頁上頁 下頁下頁節節末頁末頁結束結束30 8.7變量的存儲屬性變量的存儲屬性二、regi
19、ster變量(寄存器變量)與auto變量完全相同,只是速度快,存儲在CPU的寄存器中。#include “stdio.h”void m_table(void) register int i, j; for (i=1 ; i=9 ; i+) for (j=1 ; j=i ; j+) printf(“%d * %d =%d ”, j, i, j*i); putchar ( I=j)? n : t ); Main() void m_table( ); m_table( );首頁首頁 上頁上頁 下頁下頁節節末頁末頁結束結束318.7變量的存儲屬性變量的存儲屬性三、static 變量(靜態變量)auto
20、變量是在程序運行過程中建立的,是動態建立、動態撤消。而靜態變量是在程序靜態變量是在程序一開始就建立的,不撤消直到程序結束。因而其值具有可繼承性,一開始就建立的,不撤消直到程序結束。因而其值具有可繼承性,但它只能在本程序內使用。結果為:1, 2, 3一般需要保留函數上一次的調用結果時,就定義成靜態變量Void incr(void) static int x=0; x+; printf(“%d n ” , x );例L8-7-2.cmain( ) void incr(void); incr( ); incr( ); incr( );首頁首頁 上頁上頁 下頁下頁節節末頁末頁結束結束32上一次的結果,
21、即n-1的階乘對靜態局部變量賦初值時在編譯時進行的,也就是整個程序的運行過程中,它已經有初值,以后每次調用函數時不再重新賦初值而保留了上一次的運行結果。Static變量例8-7-3.c:打印1到5的階乘值int fac(int n)static int f=1; f=f*n; return(f);main()int i; for(i=1;i=5;i+)printf(%d!=%dn,i,fac(i);首頁首頁 上頁上頁 下頁下頁節節末頁末頁結束結束33#include stdio.hint x,y;one()int a,b; a=25,b=10; x=a-b; y=a+b; return;mai
22、n()int a,b; a=9,b=5; x=a+b; y=a-b; one(); printf(%d,%dn,x,y);x,y是全局變量 a,b是局部變量,只在one函數體內有效運行結果:15,35a,b是只在main函數內有效的局部變量首頁首頁 上頁上頁 下頁下頁節節末頁末頁結束結束34#include stdio.hint x,y;two()int a=25,b=10; int x,y; a=25,b=10; x=a-b; y=a+b; return;main()int a=9,b=5; x=a+b; y=a-b; two(); printf(%d,%dn,x,y);x,y是全局變量a,
23、b,x,y是局部變量。在two函數體內有效a,b,x,y是在main()內有效的局部變量運行結果:14,4首頁首頁 上頁上頁 下頁下頁節節末頁末頁結束結束35#include stdio.hthree()extern int x,y; int a=25,b=10; x=a-b; y=a+b; return;int x,y;main()int a=9,b=5; x=a+b; y=a-b; three(); printf(%d,%dn,x,y);運行結果:15,35首頁首頁 上頁上頁 下頁下頁節節末頁末頁結束結束36 一個較大的程序一般應分為若干個程序模塊,每一個模塊用來實現一個特定的功能。一個較大的程序一般應分為若干個程序模塊,每一個模塊用來實現一個特定的功能。一個一個C程序可由一個主函數和若干個函數構成。由主函數調用其他函數,其他函數也可程序可由一個主函數和若干個函數構成。由主函數調用其他函數,其他函數也可以互相調用。同一個函數可以被一個或多個函數調用多次。要正確使用程序,一定要了以互相調用。同一個函數可以被一個或多個函數調用多次。要正確使用程序,一定要了解函
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 藥用包裝材料生產項目可行性研究報告(申請備案案例)
- 中國PBN棒行業市場全景監測及投資前景展望報告
- 中國車間除塵設備行業投資潛力分析及行業發展趨勢報告
- 2025年 德州慶云縣衛生健康系統招聘考試筆試試題附答案
- 2025年 北京大興區安定鎮委托招聘考試筆試試題附答案
- 年電解水制氫研究分析報告
- 2025年中國汽車用鍍鋅板行業市場深度分析及投資策略咨詢報告
- 2024年全球及中國儲能服務行業頭部企業市場占有率及排名調研報告
- 民政志愿者培訓課件
- 電動毛絨玩具行業深度研究分析報告(2024-2030版)
- 15-1外墻節能構造現場施工檢驗記錄
- YY/T 1908-2023核酸提取儀
- MSA-GRR數據自動生成工具(已經解密)
- 廣東省廣州市增城區2022-2023學年一年級下學期期末數學試卷
- 2.1.4-駕駛員、押運員安全生產責任制考核表
- 化工原理課件-兩流體間的熱量傳遞
- 《人工智能基礎概念》考試復習題庫(濃縮300題)
- 端子壓接技術標準
- 消費經濟學完整整套教學課件
- 機械特性測試儀操作規程
- 超星學習通藝術美學(蘇州大學)章節答案
評論
0/150
提交評論