C語言程序設計基礎課件 第7章函數_第1頁
C語言程序設計基礎課件 第7章函數_第2頁
C語言程序設計基礎課件 第7章函數_第3頁
C語言程序設計基礎課件 第7章函數_第4頁
C語言程序設計基礎課件 第7章函數_第5頁
已閱讀5頁,還剩25頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

C語言程序設計

第7章函數main(){

準備東西;

打車(去公園);

玩;

點菜(魚香肉絲);

吃;

}打車(去哪){

油門;

轉彎;

剎車;}去公園玩的程序點菜(吃什么){

if(蔥沒了)打車(去買蔥);

洗菜;

切菜;

炒;

return

做好的菜;}暫停暫停暫停函數的調用調用

main函數其他函數

調用

其他函數

其他函數調用

其他函數

main函數調用

主調函數

被調函數

C源程序由函數組成:一個main函數若干其他函數函數概述除main函數外,其他函數都不能獨立執行;其他函數只有在被調用時才執行,不調用不執行;同一函數可被反復多次調用;調用返回:函數結束后,誰調用的,返回誰,不一定都返回main函數。函數概述(2)參數:

0~多個 有的函數有1~多個參數,有的函數沒有參數返回值:0~1個 有的函數有1個返回值,有的函數沒有返回值sin(30)0.5函數名參數返回值(實際應使用弧度)系統函數又稱標準函數或庫函數,如sqrt()、fabs()、rand()等;需要包含對應的頭文件才能調用:#include<xxx>我們自己編寫的函數,需要定義后才能調用;定義就是由我們自己把函數“這段話”在程序中寫出來自定義函數函數分兩種:函數的定義和調用函數的定義函數返回值類型

函數名(參數類型1

參數1,參數類型2

參數2,...){

語句;

語句;

語句;}intmax

(inta,intb){ if(a>b)

returna;

else

returnb;}voidPrintStar(){printf("*****\n");}intmax(inta,b){...}每個參數都必須有類型main(){...

intmax(inta,intb) { … } …}函數不能嵌套定義函數體()

必不可少參數無;不寫返回值類型int表示無返回值時應寫void函數定義頭部:函數名前寫void

的是無返回值的函數;函數名前寫其他類型說明(如int、float、double、char等)或不寫的是有返回值的函數。函數名(參數1,參數2,…);函數的調用調用,就是使用。要調用函數,直接喊名()對有參數的函數還要同時給出參數,即:函數名(實參1,實參2,…);形式參數(簡稱形參): 在函數定義頭部中的參數,在函數未被調用時,此參數無具體值;實際參數(簡稱實參): 調用函數時給出的具體參數,是有具體值的。打車(去哪){

油門;

轉彎;

剎車;}點菜(吃什么){ if(蔥沒了)… 洗菜;

…;}intmain(){ …;

打車(去公園);

點菜(魚香肉絲);}實參實參形參形參形參必須是一個變量實參可以是一個表達式sin(30*3.14/180)

()萬不可省!實參

main的空間函數調用的過程獨立空間,激活形參。當做變量,單向值傳。變量其間,同名不亂。函數結束,全部完蛋。#include<stdio.h>voidfun(intp){

intd=2; p=d++;printf("%d",p);}main(){

inta=1; fun(a); printf("%d\n",a);}a:1fun的空間形參p:1d:22322暫停21實參#include<stdio.h>voidswap(intx,inty){ inttemp; printf("swap中交換前:x=%d

y=%d",x,y); temp=x;x=y;y=temp; printf("swap中交換后:x=%d

y=%d",x,y);}main(){ inta=15,b=18; printf("main中調用swap前:a=%db=%d\n",a,b); swap(a,b); printf("main中調用swap后:a=%db=%d\n",a,b);}實參到形參的單向值傳遞main的空間a:15b:18swap的空間main中調用swap前:a=15b=18x:

y:

1518temp:?main中調用swap前:a=15b=18swap中交換前:x=15y=18151815main中調用swap前:a=15b=18swap中交換前:x=15y=18swap中交換后:x=18y=15main中調用swap前:a=15b=18swap中交換前:x=15y=18swap中交換后:x=18y=15main中調用swap后:a=15b=18實參形參單向傳遞12sin函數返回了算好的0.5給main函數。函數的返回值函數在執行之后,可以返回一個值給“調用它的函數”。return

表達式;這是通過return語句實現的:doublesin(求幾的正弦){ ……; ……; ……; ……;

return0.5;}main(){ …… t=sin(30*3.14/180);}0.5main(){ …… printf("%f",sqrt(4));}2doublesqrt(求幾的平方根){ ……; ……; ……; ……;

return2;}美食型點菜(吃什么){

if(蔥沒了)打車(去買蔥);

洗菜;

切菜;

炒;

return

做好的菜;}main(){

點菜(魚香肉絲);

吃;}sqrt函數返回了算好的2給main函數。“點菜”函數返回了做好的魚香肉絲給main函數。return有兩個作用①將表達式的值作為函數值返回給調用它的主調函數;

②執行return后,函數立即結束(本函數后面的語句也都不執行了),

返回到主調函數,繼續運行主調函數中剛才調用函數語句的下一語句。return表達式;說的對!但return也有層次性,僅能返回調用它的函數——誰調用它返回誰,不能越級返回,不一定都返到main函數哦。return類似break,但比break強大!嵌套循環內的break只能跳出一層;而若return在嵌套循環內,有多少層都能跳出,因為整個函數都跳出啦!#include<stdio.h>intmax(inta,intb){

if(a>b)returna;

else

returnb;}voidPrintStar(){ printf("*****\n");}main(){ intx,y,z; PrintStar(); printf("輸入2數:\n"); scanf("%d%d",&x,&y); z=max(x,y); printf("%d較大\n",z); PrintStar();}main的空間x:?y:?z:?PrintStar的空間*****

*****輸入2數:_

*****輸入2數:1020

max的空間a:10b:2010202020*****輸入2數:102020較大

PrintStar的空間*****輸入2數:102020較大*****臨時空間可有多個return語句,但只能有一個被執行

#include<stdio.h>intmax(inta,intb){

if(a>b)returna;

else

returnb;}voidPrintStar(){ printf("*****\n");}main(){ intx,y,z; PrintStar(); printf("輸入2數:\n"); scanf("%d%d",&x,&y); z=max(x,y); printf("%d較大\n",z); PrintStar();}printf才會輸出到屏幕z=max(x,y);

函數返回值20,z被賦值20,但屏幕上不會有任何輸出如執行:printf("%d",max(x,y));直接輸出20

20

截然不同

函數的返回值

程序的輸出結果

(屏幕輸出結果)max2個數大數sqrt1個數平方根sin

弧度正弦值函數的作用:黑匣子罐頭廠函數的調用函數有兩種調用方式:①語句

②表達式中對無返回值的函數(void)只能用第①種方式調用;對有返回值的函數(非void或省略)

2種調用方式均可。intmax

(inta,intb){ if(a>b)

returna;

else

returnb;}voidPrintStar(){printf("*****\n");}此函數有返回值

此函數無返回值

z=max(5,3)*2;//z=10;b=sqrt(4)*2;//b=4;printf("%d",max(5,3));

//輸出5z=PrintStar()*2;printf("%d",PrintStar());使用函數的好處

主函數

(main函數)

函數1

函數3

函數4函數2

命令命令命令命令協調相互調用程序功能被細分為若干函數,每個函數負責一個小功能。main()是“節目主持人”,負責調度、指揮各函數工作。return語句

有return語句無return語句有返回值的函數(名前非void)

返回表達式的值,函數結束

返回系統默認值,函數結束函數中語句執行結束后(執行到最后的}),返回系統默認值,函數結束無返回值的函數(名前有void)

函數結束(無返回值)函數中語句執行結束后(執行到最后的}),函數結束(無返回值)return表達式;return;return;return表達式;無論函數有/無返回值,均可有/無

return語句。return語句的兩種用法:

return

表達式;

return; 無返回值的函數只能用后者的用法。

max

(inta,intb){

if(a>b) …PrintStar(){……voidint必須返回一個值永遠無法返回值#include<stdio.h>voidfun(intp){

intd=0; d=d+p; printf("%d",p);}main(){

inta=1; fun(a); printf(%d\n",a);}無返回值的函數使用return語句

if(d>0)return;main的空間a:1fun的空間p:

1d:01此語句未執行1無返回值的函數使用return語句1#include<stdio.h>voidfun(intp){

intd=0; d=d+p; printf("%d",p);}main(){

inta=1; fun(a); printf(%d\n",a);}main的空間a:1fun的空間p:

1d:0111變量其間,同名不亂(1:函數內變量同名)1#include<stdio.h>voidfun(intp){

int

a=0;

a=a+p; printf("%d",p);}main(){

inta=1; fun(a); printf(%d\n",a);}

if(a>0)return;此語句未執行main的空間a:1fun的空間p:

1a:01變量其間,同名不亂(2:形參實參同名)1#include<stdio.h>voidfun(inta){

intd=0; d=d+a; printf("%d",a);}main(){

inta=1; fun(a); printf(%d\n",a);}

if(d>0)return;此語句未執行main的空間a:1fun的空間a:

1d:01形參也是變量也可與其他函數的變量同名函數的聲明#include<stdio.h>voidfun(intp){

intd=0; d=d+p;

if(d>0)return; printf("%d",p);}main(){

inta=1; fun(a); printf("%d\n",a);}函數的聲明#include<stdio.h>

main(){

inta=1; fun(a); printf("%d\n",a);}voidfun(intp){

intd=0; d=d+p;

if(d>0)return; printf("%d",p);}?fun

是什么?程序有錯!fun是我定義的函數啊,為什么不往下看?這兒已經出錯,出錯了我就不往下看了!剛才的程序定義fun函數,了解!fun是你定義的函數,我認得,正確!順序編譯順序編譯笨死了!函數的聲明(2)#include<stdio.h>main(){

inta=1; fun(a); printf("%d\n",a);}voidfun(intp){

intd=0; d=d+p;

if(d>0)return; printf("%d",p);}voidfun(int)喂!我有個函數fun,將下面定義,聽到了嗎?聽到了!fun?剛才有人喊過,這是下面會定義的函數,不是錯誤。果然是在這里定義的嘛!程序沒錯,可以運行嘍!p;順序編譯#include<stdio.h>main(){

inta=1; fun(a); printf("%d\n",a);}voidfun(intp){

intd=0; d=d+p;

if(d>0)return; printf("%d",p);}voidfun(int)函數的聲明(2);函數的聲明函數的聲明是

函數定義頭部+;聲明被調函數,目的就是“告訴”計算機該函數的“樣式”(也稱函數的原型),使計算機今后可以識別該函數。可省略形參名,但只可省略形參名,其他均不可省!最后的;

不可省!(可以省略形參名,或隨意另起名);pxam聲明時的形參名既可省略,也可隨意另起名函數聲明的位置在函數外聲明:使得位于聲明位置之后的所有函數內都可以調用被聲明的函數。在函數內聲明:使得僅在本函數內可以調用被聲明的函數;main(){

floatadd(floatx,floaty); …… add(1,2); //能調用add函數}intfun(){ …… add(3,4); //未聲明add,不能調用add}floatadd(floatx,floaty){ ……}doublefun2(intm){

add(5,6); //在定義之后,也能調用}函數的聲明調用調用調用能調用add函數的區域函數的定義

函數的遞歸講故事...從前有座山,山里有座廟,廟里有個老和尚講故事,故事是什么呢?“從前有座山,山里有座廟,廟里有個老和尚講故事,故事是什么呢?”‘從前有座山,山里有座廟,廟里有個老和尚講故事,故事是什么呢?’……函數的遞歸調用調用函數1

函數1調用函數1

函數2

函數1

調用函數直接或間接地自己調用自己,稱為遞歸

intf(intx){ ……f(y);……}遞歸的分析方法與嵌套調用類似。盡管每次調用的都是自身(同一函數),但要把每次所調用的函數都看作是不同的函數,這些函數都具有相同的參數、返回值和語句。直接調用自己間接調用自己求階乘n!=n*(n-1)*(n-2)*…*3*2*1(1!=1,0!=1)n!=n*(n-1)!

我要算4!趙錢孫李4!=4*3!錢,你去算3!,算好后告訴我哦!①要是有人問我1或0的階乘,我就直接告訴他1。②要不我就再找個人,讓他去算(n-1)的階乘,我再乘n就行了,我才不一個個乘哩,嘿嘿。3!=3*2!孫,你去算2!,算好后告訴我哦!2!=2*1!李,你去算1!,算好后告訴我哦!1!就是1啊。12*1=223*2=6244*6=246int

ff(intn){ intf=0; if(n==0||n==1) f=1;

else returnf;}求階乘的人(要算n的階乘?){ if(問1或0的階乘)

結果=1; else

{

再找個人求(n-1)的階乘;

結果=n*他算的(n-1)的階乘; } return

結果;}ffnn!的結果 f=n

*

;ff(n-1)int

ff(intn){ intf=0; if(n==0||n==1) f=1;

else returnf;} f=n

*

;ff(n-1)求階乘

#include<stdio.h>intff(intn);main(){ intn;inty; scanf("%d",&n);y=ff(n); printf("%d!=%d",n,y);}main的空間ff的空間n:

溫馨提示

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

評論

0/150

提交評論