C語言程序設計第7單元_第1頁
C語言程序設計第7單元_第2頁
C語言程序設計第7單元_第3頁
C語言程序設計第7單元_第4頁
C語言程序設計第7單元_第5頁
已閱讀5頁,還剩59頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第7單元

函數(shù)摘要

7.1函數(shù)定義7.2函數(shù)調用7.2.1函數(shù)調用的形式7.2.2參數(shù)的傳遞方式7.2.3函數(shù)的返回值7.2.4函數(shù)的參數(shù)類型7.3函數(shù)的嵌套調用7.4函數(shù)的遞歸調用7.5函數(shù)的聲明7.6變量的作用域和存儲類別7.6.1變量的作用域7.6.2變量的存儲類別問題1:如何定義函數(shù)?問題2:如何調用函數(shù)7.1函數(shù)定義7.1函數(shù)定義庫函數(shù)格式化輸入、輸出函數(shù)printf()scanf()字符串連接函數(shù)strcat(str1,str2)求字符串長度函數(shù)strlen(str)用戶自定義函數(shù)函數(shù)名字函數(shù)參數(shù)函數(shù)返回值函數(shù)功能返回值類型

函數(shù)名([形式參數(shù)列表]){

函數(shù)體}7.1函數(shù)定義返回值類型:指定函數(shù)返回值的數(shù)據(jù)類型。如果函數(shù)沒有返回值,則為void。函數(shù)名:指定函數(shù)的名稱,是用戶自定義的標識符。形式參數(shù)列表:參數(shù)是調用函數(shù)時傳入的數(shù)據(jù),函數(shù)定義時需要指定函數(shù)參數(shù)的名稱和數(shù)據(jù)類型。函數(shù)體:大括號“{}”括起來的部分,用于實現(xiàn)該函數(shù)的功能,是C語言語句7.1函數(shù)定義【例】定義一個函數(shù),實現(xiàn)兩個整數(shù)的求和運算。voidadd(intx,inty){ intresult; result=x+y; printf("%d",result);}voidadd(){ intx,y,result; scanf("%d%d",&x,&y); result=x+y; printf("%d",result);}有返回值函數(shù)無返回值函數(shù)有參函數(shù)無參函數(shù)7.1函數(shù)定義7.1函數(shù)定義函數(shù)時構成C程序的基本單位一個源程序文件可以有多個函數(shù)一個源程序文件只能有一個main函數(shù),而且必須有一個main函數(shù)C99標準中對main函數(shù)的返回值類型定義是int。main函數(shù)intmain(){…….

return0;}7.2函數(shù)調用7.2.1函數(shù)調用的形式

要想執(zhí)行函數(shù),需要在main()函數(shù)中調用它。C語言程序必須有一個主函數(shù)main(),而且只有一個主函數(shù)main(),程序的運行從主函數(shù)開始,主函數(shù)調用其它的函數(shù)。無參函數(shù)的調用有參函數(shù)的調用7.2.1函數(shù)調用的形式7.2.1函數(shù)調用的形式1.無參函數(shù)的調用7.2.1函數(shù)調用的形式1.無參函數(shù)的調用【例】輸出以下結果如圖所示,通過函數(shù)調用實現(xiàn)。7.2.1函數(shù)調用的形式

在輸出的結果中,第一行和第三行分別是一行“_”號,使用模塊化編程思想,用一個函數(shù)show_single實現(xiàn)輸出一行“_”號的功能,用一個函數(shù)show_txt實現(xiàn)輸出第二行的信息,main函數(shù)中調用這兩個函數(shù)。#include<stdio.h>voidadd(intx,inty){ intresult; result=x+y; printf("x+y=%d\n",result);}main(){ add(5,10);}7.2.1函數(shù)調用的形式2.有參函數(shù)的調用與無參函數(shù)相比,有參函數(shù)在調用時,需要調用者傳入?yún)?shù)值。7.2函數(shù)調用7.2.2參數(shù)的傳遞方式7.2.2參數(shù)的傳遞方式#include<stdio.h>voidadd(intx,inty){ intresult; result=x+y; printf("%d+%d=%d\n",x,y,result);}intmain(){ add(5,10);//調用函數(shù)add return0;}【例】定義一個函數(shù),實現(xiàn)兩個整數(shù)的求和運算。形參實參7.2.2參數(shù)的傳遞方式1、實參可以是常量、變量或表達式,但是必須有確定的值。2、實參與形參必須:

個數(shù)相等

順序對應

類型匹配7.2.2參數(shù)的傳遞方式(1)函數(shù)add被調用前,形參x和y并不占用內存空間。(2)函數(shù)add被main函數(shù)調用時,形參x和y被分配內存空間,并且被實參5和10分別賦值。函數(shù)調用過程中的參數(shù)傳遞如圖所示。(3)函數(shù)add執(zhí)行期間,由于形參x和y已有值,所以可以執(zhí)行x+y操作,并且將結果輸出。(4)函數(shù)add執(zhí)行結束后,形參x和y的內存空間被釋放。

7.2.2參數(shù)的傳遞方式#include<stdio.h>voidswap(intx,inty){

inttemp;

printf("函數(shù)內部

交換之前:x=%d,y=%d\n",x,y);

temp=x;

x=y;

y=temp;

printf("函數(shù)內部

交換之后:x=%d,y=%d\n",x,y);}intmain(){

intnum1,num2;

scanf("%d%d",&num1,&num2);

printf("交換之前:num1=%d,num2=%d\n",num1,num2);

swap(num1,num2);

printf("交換之后:num1=%d,num2=%d\n",num1,num2);

return0;}7.2.2參數(shù)的傳遞方式值傳遞思考num1和num2的值為什么沒有交換?7.2函數(shù)調用7.2.3函數(shù)的返回值7.2.3函數(shù)的返回值返回值類型

函數(shù)名([形式參數(shù)列表]){

……… return(表達式);}void函數(shù)名([形式參數(shù)列表]){

………}

如果想要通過函數(shù)調用使主調函數(shù)得到一個值,這個值就是函數(shù)的返回值。函數(shù)的返回值通過函數(shù)體中的return語句獲得。7.2.3函數(shù)的返回值#include<stdio.h>intadd(intx,inty){ intresult; result=x+y; returnresult;}intmain(){ intsum; sum=add(5,10); printf("%d\n",sum); return0;}【例】7.2.3函數(shù)的返回值函數(shù)被調用的位置可以有三種方式:(1)函數(shù)語句例如:fun();(2)函數(shù)表達式

例如:sum=add(5,10)。(3)函數(shù)參數(shù)

例如:printf("處理結果1::%d\n",add(5,10));7.2函數(shù)調用7.2.4函數(shù)的參數(shù)類型7.2.4函數(shù)的參數(shù)類型intmin(intarray[5])找出最低分intmax(intarray[5])找出最高分【例】使用函數(shù)實現(xiàn)下面功能。某位同學一學期有5門課程,根據(jù)每門課程的得分情況,找出其最低分和最高分。7.2.4函數(shù)的參數(shù)類型

當函數(shù)的參數(shù)類型是數(shù)組時,實參向形參傳遞的是數(shù)組首元素的地址,這種傳遞方式被稱為“地址傳遞”。值傳遞:實參和形參占用不同的存儲單元,只是存儲的值相同。地址傳遞:實參和形參占用相同的存儲單元。地址傳遞7.2.4函數(shù)的參數(shù)類型【例】某位同學第一學期有3門課程,第二學期有5門課程,根據(jù)每門課程的得分情況,找出每個學期中最高分和最低分。intmin(intarray[],intlen)//定義函數(shù)時不指定形參數(shù)組array的大小{ intminnum=array[0]; for(inti=1;i<len;i++) { if(array[i]<minnum) minnum=array[i]; } returnminnum;}7.3函數(shù)的嵌套調用7.3函數(shù)的嵌套調用#include<stdio.h>voidfun2(){

printf("調用fun2()函數(shù)\n");}voidfun1(){

printf("調用fun1()函數(shù)\n");

fun2();}intmain(){

fun1();

return0;}

函數(shù)的定義是獨立的,在一個函數(shù)中不能嵌套定義另外一個函數(shù)。但是,函數(shù)可以嵌套調用,即在一個函數(shù)中調用另一個函數(shù)?!纠?.4函數(shù)的遞歸調用7.4函數(shù)的遞歸調用voidfun(){ fun();}

在調用fun函數(shù)時,又要調用fun函數(shù),這就是fun函數(shù)的遞歸調用。但是,這里fun函數(shù)的調用是無終止的,程序中不應該出現(xiàn)。函數(shù)的遞歸調用必須要有終止條件,通常在函數(shù)定義時通過if語句控制。

【例】計算1~n之間整數(shù)之和。7.4函數(shù)的遞歸調用

7.4函數(shù)的遞歸調用#include<stdio.h>intfun(intn){ if(n==1)//遞歸調用結束條件 return1; else returnn+fun(n-1);//fun函數(shù)的遞歸調用}intmain(){ intsum; sum=fun(4); printf("1~4之間的整數(shù)和是%d\n",sum); return0; }

7.4函數(shù)的遞歸調用

【例】輸出斐波那契數(shù)列(FibonacciSequence)的前20個數(shù)。斐波那契數(shù)列,又稱黃金分割數(shù)列,因它是數(shù)學家萊昂納多?斐波那契以兔子繁殖為例子而引入的,故又稱為“兔子數(shù)列”。斐波那契數(shù)列可以這樣描述,數(shù)列的第1個數(shù)是1,第2個數(shù)是1,以后每個數(shù)是其前面兩個數(shù)的和,即1,1,2,3,5,8,13,21,34,55,…。利用遞歸的方法分析斐波那契數(shù)列,可以得到遞歸公式:7.4函數(shù)的遞歸調用7.5函數(shù)的聲明7.5函數(shù)的聲明1.函數(shù)聲明的方法

函數(shù)定義時的首行被稱為函數(shù)原型,函數(shù)聲明時只需要在函數(shù)的原型后面加上“;”。例如: intadd(intx,inty);

在函數(shù)聲明時,形參名也可以省略。例如:intadd(int,int);7.5函數(shù)的聲明2.函數(shù)聲明的位置函數(shù)聲明在主調函數(shù)的內部。#include<stdio.h>intmain(){intadd(int,int); intsum; sum=add(5,10); printf("%d\n",sum); return0;}#include<stdio.h>intadd(int,int);intmain(){

………….}函數(shù)聲明在主調函數(shù)的外部。7.5函數(shù)的聲明用戶自定義函數(shù)的使用包括3個環(huán)節(jié):函數(shù)聲明函數(shù)定義函數(shù)調用7.5變量的作用域和存儲類別7.5.1變量的作用域7.6.1變量的作用域1.局部變量

在函數(shù)內定義的變量,它的作用域是本函數(shù)內。2.全局變量

在函數(shù)外定義的變量,它的作用域是整個源程序文件內。7.6.1變量的作用域1.局部變量#include<stdio.h>voidfun(){ intx=6; printf("fun函數(shù):x=%d\n",x);}intmain(){ intx=8; fun(); printf("main函數(shù):x=%d\n",x); return0;}7.6.1變量的作用域1.局部變量函數(shù)內定義的變量函數(shù)的形參復合語句內定義的變量7.6.1變量的作用域1.局部變量#include<stdio.h>main(){inti=1,j=3;{inti=0;i+=j*2;printf("i=%d,j=%d\n",i,j);}printf("i=%d,j=%d\n",i,j);}7.6.1變量的作用域2.全局變量#include<stdio.h>intx=10;//全局變量xvoidfun(){ printf("fun函數(shù):x=%d\n",x);}intmain(){ fun(); printf("main函數(shù):x=%d\n",x); return0;}7.6.1變量的作用域2.全局變量【例】分析程序中全局變量與局部變量同名時各自的作用范圍。inta=3,b=5;//定義全局變量a,bintmax(inta,intb)//定義局部變量a,b,只在max函數(shù)中有效{

intc;c=a>b?a:b;returnc;}intmain(){ inta=10;//定義局部變量a,只在main函數(shù)中有效 printf("%d\n",max(a,b)); return0;}7.5變量的作用域和存儲類別7.5.2變量的存儲類別7.6.2變量的存儲類別動態(tài)存儲方式在程序運行期間由系統(tǒng)動態(tài)的分配存儲空間靜態(tài)存儲方式在程序運行期間由系統(tǒng)分配固定的存儲空間7.6.2變量的存儲類別變量定義的完整形式是:

存儲類別

數(shù)據(jù)類型

變量名;變量的存儲類別:自動的(auto)靜態(tài)的(static)寄存器的(register)外部的(extern)7.6.2變量的存儲類別1.局部變量的存儲類別自動變量(auto)

在調用函數(shù)時,系統(tǒng)為這些變量分配存儲空間,當函數(shù)調用結束時就自動釋放這些空間。靜態(tài)變量(static)

在函數(shù)調用結束后并不釋放存儲空間,而在下一次再調用該函數(shù)時,該變量已有值。寄存器變量(register)7.6.2變量的存儲類別#include<stdio.h>intfun(intn){ autointx=0;//自動變量x staticinty=3;//靜態(tài)變量y x++; y++; returnn+x+y;}intmain(){ intn=2,i; for(i=0;i<3;i++) printf("%d,",fun(2)); return0;}7.6.2變量的存儲類別2.全局變量的存儲類別靜態(tài)存儲類別7.6.2變量的存儲類別(1)將全局變量的作用域擴展到一個文件內#include<stdio.h>voidfun();intmain(){

externintx;//把全局變量的作用域擴展到從此處開始

fun(); printf("main函數(shù):x=%d\n",x);

//函數(shù)main中不能引用全局變量x,程序編譯會報錯。 return0;}

intx=10;voidfun(){ printf("fun函數(shù):x=%d\n",x);}7.6.2變量的存儲類別(2)將全局變量的作用域擴展到其他文件文件file1:#include<stdio.h>#include"file2.cpp"intx=10;//全局變量xintmain(){

print

溫馨提示

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

評論

0/150

提交評論