函數(shù)省公開課金獎全國賽課一等獎微課獲獎?wù)n件_第1頁
函數(shù)省公開課金獎全國賽課一等獎微課獲獎?wù)n件_第2頁
函數(shù)省公開課金獎全國賽課一等獎微課獲獎?wù)n件_第3頁
函數(shù)省公開課金獎全國賽課一等獎微課獲獎?wù)n件_第4頁
函數(shù)省公開課金獎全國賽課一等獎微課獲獎?wù)n件_第5頁
已閱讀5頁,還剩67頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

函數(shù)1/72

§8-1C程序結(jié)構(gòu)§8-2函數(shù)定義§8-3函數(shù)調(diào)用§8-4在函數(shù)之間傳遞數(shù)據(jù)§8-5函數(shù)遞歸調(diào)用§8-6變量存放特征2/72本章要討論相關(guān)函數(shù)以下一些問題:函數(shù)定義函數(shù)定義普通形式、函數(shù)參數(shù)和函數(shù)返回值。函數(shù)調(diào)用函數(shù)調(diào)用方式、函數(shù)間參數(shù)傳遞、函數(shù)嵌套調(diào)用、函數(shù)遞歸調(diào)用等。變量存放特征函數(shù)內(nèi)說明變量及函數(shù)外說明變量使用問題。本章學習難點:函數(shù)間參數(shù)傳遞,函數(shù)遞歸調(diào)用。3/72例:輸入兩個整數(shù)數(shù)組,先將兩個數(shù)組分別按從大到小排序后,再將兩個數(shù)組元素按從大到小合并排序,在合并后數(shù)組中相同數(shù)字只出現(xiàn)一次。main(){變量定義;

輸入數(shù)組a;

輸入數(shù)組b;

數(shù)組a排序;

數(shù)組b排序;數(shù)組a和數(shù)組b合并排序到數(shù)組c;

輸出數(shù)組c;}第一節(jié)C程序結(jié)構(gòu)4/72變量定義;輸入數(shù)組a;輸入數(shù)組b;inti,j,k=0,m,n,a[20],b[20],c[40];printf(“Pleaseenterm,n”);scanf(“%d,%d”,&m,&n);for(i=0;i<m;i++)scanf(“%d”,&a[i]);for(i=0;i<m;i++)scanf(“%d”,&b[i]);第一節(jié)C程序結(jié)構(gòu)5/72數(shù)組a排序;數(shù)組b排序;for(i=0;i<m-1;i++)for(j=0;j<m-i-1;j++)if(a[j]>a[j+1]){temp=a[j];a[j]=a[j+1];a[j+1]=temp;}for(i=0;i<n-1;i++)for(j=0;j<n-i-1;j++)if(b[j]>b[j+1]){temp=b[j];b[j]=b[j+1];b[j+1]=temp;}例C8_101第一節(jié)C程序結(jié)構(gòu)6/72將重復部分,編寫為一個函數(shù),將合并排序也編寫為一個函數(shù)。main(){inti,j,k=0,m,n,a[20],b[20],c[40];input(a,m);input(b,n);

sort(a,m);

sort(b,n);combine(a,b,c);output(a);output(b);}第一節(jié)C程序結(jié)構(gòu)7/72sort(d,h)intd[],h;for(i=0;i<h-1;i++)for(j=0;j<h-i-1;j++)if(d[j]>d[j+1]){temp=d[j];

d[j]=d[j+1];

d[j+1]=temp;}第一節(jié)C程序結(jié)構(gòu)8/72合并排序思緒;假如數(shù)組a和數(shù)組b都沒有結(jié)束{比較a[i]和b[j]大小假如a[i]小,

則將a[i]賦給c[k],i++,k++;

不然則將b[j]賦給c[k],j++,k++;}假如數(shù)組a沒有結(jié)束,將數(shù)組a余下元素賦給數(shù)組c;假如數(shù)組b沒有結(jié)束,將數(shù)組b余下元素賦給數(shù)組c;刪除數(shù)組c中重復元素;第一節(jié)C程序結(jié)構(gòu)9/72合并程序:for(i=0,j=0;i<m&&j<n;)if(a[i]<b[j])c[k++]=a[i++];elsec[k++]=b[j++];第一節(jié)C程序結(jié)構(gòu)10/72combine(inta[],b[],c[],m,n){inti,j,k=0;for(i=0,j=0;i<m&&j<n;)c[k++]=a[i]<b[j]?a[i++]:b[j++];while(i<m)c[k++]=a[i++];while(j<n)c[k++]=b[j++];i=1;while(i<k){if(c[i]==c[i-1]){for(j=i+1;j<k;j++)c[j-1]=c[j]; k--;}elsei++;}}例C8_101b第一節(jié)C程序結(jié)構(gòu)11/72

模塊化是結(jié)構(gòu)化程序設(shè)計基礎(chǔ)。采取模塊化設(shè)計有很多優(yōu)越性:控制程序設(shè)計復雜性,提升軟件可靠性,提升軟件開發(fā)效率,提升軟件可維護性,提升程序重用性。第一節(jié)C程序結(jié)構(gòu)12/72函數(shù)是C程序最小單元。C程序是由一個主函數(shù)以及若干個函數(shù)組成。主函數(shù)能夠調(diào)用其它函數(shù),其它函數(shù)能夠相互調(diào)用。比如:main(){printf(“ThisisCprogram\n”);}就是main函數(shù)調(diào)用了printf函數(shù)。為了完成一個特定任務(wù),在程序開發(fā)中普通要定義若干函數(shù)。第一節(jié)C程序結(jié)構(gòu)13/72例:求最大值

main(){inta,b,c;printf(“Entera,b\n”);scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“Max=%d”,c);}

intmax(x,

y

)intx,y;{intz;z

=

x

>

y

?

x

:

y

;return(z

);}例C8_102第一節(jié)C程序結(jié)構(gòu)14/72一、函數(shù)定義普通形式數(shù)據(jù)類型函數(shù)名(【形式參數(shù)表】)【形式參數(shù)說明】{【說明部分】

【語句】}例:intmax(x,y)intx,y;{intz;z

=

x

>

y

?

x

:

y;return(z

);}第二節(jié)函數(shù)定義15/72形式參數(shù)表是用逗號分開一組變量,用來接收調(diào)用時傳入數(shù)據(jù)。例中:intmax(x,y)形式參數(shù)類型

在‘{}’外面對形式參數(shù)類型進行說明。例中:intx,y;無參函數(shù)函數(shù)能夠沒有形式參數(shù)。二、函數(shù)形式參數(shù)第二節(jié)函數(shù)定義例:intmax(x,y)intx,y;{intz;z

=

x

>

y

?

x

:

y;return(z

);}16/72函數(shù)數(shù)據(jù)類型就是函數(shù)返回值類型,稱為函數(shù)類型。返回值靠return(表示式)語句,將表示式值返回給調(diào)用它函數(shù)。三、函數(shù)類型intmax(x,y)intx,y;{intz;z

=

x

>

y

?

x

:

y;return(z

);}main(){inta,b,c;printf(“Entera,b\n”);scanf(“%d,%d”,&a,&b);

c=max(a,b);printf(“Max=%d”,c);}第二節(jié)函數(shù)定義17/72返回語句格式:

return(表示式);或:return表示式;函數(shù)能夠沒有返回值,即void型函數(shù)。void型函數(shù)沒有return語句。假如return語句中表示式值類型和函數(shù)類型不一致,則表示式值類型被自動轉(zhuǎn)換成函數(shù)類型,然后在返回。第二節(jié)函數(shù)定義18/721.表示式方式

函數(shù)調(diào)用出現(xiàn)在表示式中,函數(shù)返回值參加表示式運算。例C8_102一、函數(shù)調(diào)用方式第三節(jié)函數(shù)調(diào)用main(){inta,b,c;printf(“Entera,b\n”);scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“Max=%d”,c);}

intmax(x,y)intx,y;{intz;z=x>y?x:y;return(z);}19/722.函數(shù)語句

例:

main(){inta;scanf("%d",&a);disp(a);}

voiddisp(intx){if(x>0)printf("Thisispositive.\n");elseif(x==0)printf("Thisiszero.\n"); elseprintf(“Thisisnegative.\n”);}例C8_301第三節(jié)函數(shù)調(diào)用20/723.作為函數(shù)參數(shù)main(){inta,b;printf("Entera,b:\n");scanf("%d,%d",&a,&b);printf("Max=%d",max(a,b));}例C8_302intmax(x,y)intx,y;{intz;z=x>y?x:y;return(z);}第三節(jié)函數(shù)調(diào)用21/72依據(jù)C語言標識符必須先說明后使用要求,函數(shù)調(diào)用時:在主調(diào)函數(shù)中,要說明被調(diào)函數(shù)類型。在主調(diào)函數(shù)中所說明被調(diào)函數(shù)類型,必須和被調(diào)函數(shù)實際類型一致。重新考查例C8_301得到結(jié)論例C8_301二、對被調(diào)函數(shù)說明第三節(jié)函數(shù)調(diào)用22/721.在同一個源程序文件中被調(diào)函數(shù)定義在前,主調(diào)函數(shù)定義在后,則在主調(diào)函數(shù)中無須再對被調(diào)函數(shù)進行說明。主調(diào)函數(shù)定義在前,被調(diào)函數(shù)定義在后,則在主調(diào)函數(shù)中必須對被調(diào)函數(shù)進行說明。被調(diào)函數(shù)定義在后,但被調(diào)函數(shù)類型是整型或字符型,則對被調(diào)函數(shù)說明能夠被省略。第三節(jié)函數(shù)調(diào)用23/722.主調(diào)函數(shù)和被調(diào)函數(shù)不在同一個源程序文件中要進行函數(shù)調(diào)用,首先要做兩件事:必須給出被調(diào)函數(shù)原型,將被調(diào)函數(shù)引入到主調(diào)函數(shù)所在文件。按照主調(diào)函數(shù)和被調(diào)函數(shù)在同一個源程序文件中要求,對被調(diào)函數(shù)進行說明。調(diào)用庫函數(shù)時,在文件開始“#include*.h”就是說明被調(diào)函數(shù)原型。第三節(jié)函數(shù)調(diào)用24/72例:主、被調(diào)函數(shù)不在同一個源程序文件中。源程序文件1:源程序文件2:main(

){inta,b,c;printf(“Entera,b\n”);scanf(“

%

d,

%

d

”,&

a,

&

b

);c

=

max(

a

,b

);printf(“Max=&d”,c);}

intmax(

x,y

)intx,y;{intz;z

=

x

>

y

?

x

:

y;return(

z

);}例C8_303第三節(jié)函數(shù)調(diào)用25/72intmax(

x,y

)intx,y;{intz;z

=

x

>

y

?

x

:

y;return(

z

);}intmax(intx,inty);main(

){inta,b,c;printf(“Entera,b\n”);scanf(“

%

d,

%

d”,

&

a,

&

b

);c

=

max(

a,b

);printf(“Max=&d”,c);}第三節(jié)函數(shù)調(diào)用26/72main函數(shù){…………調(diào)用函數(shù)A;

……}函數(shù)A{…………

調(diào)用函數(shù)B;

……}函數(shù)B{………………}函數(shù)嵌套調(diào)用第三節(jié)函數(shù)調(diào)用27/72main(){inta;voiddisp();

printf(“Enteraninteger:\n”);

scanf(“%d”,&a);

disp(a);}printf返回地址Printf返回地址scanf返回地址Scanf返回地址disp返回地址prinf返回地址prinf返回地址prinf返回地址printf函數(shù)……scanf函數(shù)……voiddisp(x)intx;{if(x>0)printf(“Thisispositive.\n”);elseif(x==0)printf(“Thisiszero.\n”);elseprintf(“Thisisnegative.\n”);}printf函數(shù)……第三節(jié)函數(shù)調(diào)用嵌套調(diào)用調(diào)用執(zhí)行過程示意堆棧28/72函數(shù)調(diào)用時,不一樣函數(shù)之間需要傳遞數(shù)據(jù)。傳遞數(shù)據(jù)方式能夠分為三類。返回值方式全局變量方式參數(shù)方式第四節(jié)在函數(shù)之間傳遞參數(shù)main(){inta

=

5,b

=

10;swap(a,b

);

printf("a=%d,b=%d

\n",a,b);}swap(intx,inty){inttemp;temp

=

x;x

=

y;y

=

temp;}形式參數(shù)實際參數(shù)29/72main(){inta

=

5,b

=

10;printf("brfortswapa=%d,b=%d

\n",a,b

);

swap(a,b

);

printf("afterswapa=%d,b=%d

\n",a,b

);}swap(x,y)intx,y;{inttemp;printf("inswapx=%d,y=%d

\n",x,y

);temp

=

x;x

=

y;y

=

temp;printf(”outswapx=%

d,y=%d

\n",x,y

);}例C8_304第四節(jié)在函數(shù)之間傳遞參數(shù)30/72main函數(shù)swap函數(shù)510變量a變量b形參x形參y105變量temp5105swap(a,b);main函數(shù)變量a5變量b10temp=x;x=y;y=temp;無參返回第四節(jié)在函數(shù)之間傳遞參數(shù)31/72函數(shù)間參數(shù)傳遞方式一:值傳遞方式(也稱數(shù)據(jù)復制方式)值傳遞優(yōu)點:被調(diào)用函數(shù)不可能改變調(diào)用函數(shù)中變量值,而只能改變它局部暫時副本。這么就能夠防止被調(diào)用函數(shù)操作對調(diào)用函數(shù)中變量可能產(chǎn)生副作用。值傳遞缺點:

在值傳遞方式下,每個形式參數(shù)僅能傳遞一個數(shù)據(jù),當需要在函數(shù)之間傳遞大量數(shù)據(jù)時,值傳遞方式顯然不適用。函數(shù)執(zhí)行結(jié)果不能經(jīng)過參數(shù)方式返回。第四節(jié)在函數(shù)之間傳遞參數(shù)32/72函數(shù)間參數(shù)傳遞方式二:

數(shù)組名作為函數(shù)參數(shù)數(shù)組名表示數(shù)組在內(nèi)存中起始地址。比如數(shù)組

a,printf(“%d”,a);則顯示數(shù)組首地址。實參是數(shù)組名,而形參是接收該數(shù)組名一個變量。注意:形參本身不是重新建立一個數(shù)組,實際是接收了實參傳給地址。

參數(shù)傳遞方式二實質(zhì)是地址傳遞方式。第四節(jié)在函數(shù)之間傳遞參數(shù)33/72#defineN5main(

){inti,j,a[

N

];for(

i

=

0

;i

<

N

;

i

+

+

){printf(

"Enter%

2

d

:",i

+

1

);scanf("

%

d

",

&

a[

i

]

);}sort(

a,N

);for(i

=

0

;

i

<

N

;

i

+

+

)printf("

%

d",a[

i

]);}sort(

b

,

m

)intm

,b[

]

;{inti

,

j

,t

;for(

i

=

0;

i

<

N

-

1;

i

+

+

)

for(

j

=

0;

j

<

N

-

i

-

1;

j

+

+

)

if(

b[

j

]

>

b

[

j

+

1

]

){t

=

b

[

j

];b[

j

]

=

b

[

j

+

1

]

;b[

j

+

1

]

=

t

;}}第四節(jié)在函數(shù)之間傳遞參數(shù)34/72main函數(shù)sort函數(shù)

a[0]a[1]a[2]a[3]a[4]a[5]數(shù)組名就是首元素地址ab形參b實質(zhì)是一個變量,內(nèi)容是數(shù)組a起始地址對數(shù)組名作為參數(shù)解釋第四節(jié)在函數(shù)之間傳遞參數(shù)35/72main(){inta

=

5,b

=

10;printf("brfortswapa=%d,b=%d

\n",a,b

);

swap(&a,&b

);

printf("afterswapa=%d,b=%d

\n",a,b

);}swap(x,y)int*x,*y;{inttemp;printf("inswapx=%d,y=%d

\n",*x,*y

);temp

=

*x;*x

=

*y;*y

=

*temp;printf(”outswapx=%

d,y=%d

\n",*x,*y

);}例C8_304第四節(jié)在函數(shù)之間傳遞參數(shù)36/72

C語言允許函數(shù)遞歸調(diào)用,也就是說允許函數(shù)自己調(diào)用自己。以N階乘為例,認識什么是遞歸調(diào)用。例C8_5011.遞歸調(diào)用時程序執(zhí)行過程。2.為何要用遞歸?對一些問題本身蘊涵了遞歸關(guān)系且結(jié)構(gòu)復雜,用非遞歸算法實現(xiàn)可能使程序結(jié)構(gòu)非常復雜,而用遞歸算法實現(xiàn),可使程序簡練,提升程序可讀性。3.遞歸調(diào)用會增加存放空間和執(zhí)行時間上開銷。4.全部遞歸問題一定能夠用非遞歸算法實現(xiàn)。第五節(jié)函數(shù)遞歸調(diào)用37/72什么是遞歸例C8_501以10階乘為例。遞推:從0階乘為1開始0!=11!=1!*1=1*1=12!=1!*2=1*2=23!=2!*3=2*3=64!=3!*4=6*4=245!=4!*5=24*5=120…………10!=9!*10=362880*10=3628800第五節(jié)函數(shù)遞歸調(diào)用38/7210階乘遞推過程:10!=10*9!9!=9*8!8!=8*7!7!=7*6!6!=6*5!5!=5*4!4!=4*3!3!=3*2!2!=2*1!1!=1*0!0!=1第五節(jié)函數(shù)遞歸調(diào)用1=11=22=66=2424=120120=720720=50405040=4032040320=362880362880=36288000!=12!=1*2=23!=2*3=64!=6*4=245!=24*5=1205!=24*5=1205!=24*5=1205!=24*5=1205!=24*5=12010!=362880*10=3628800例C8_50139/72遞歸調(diào)用執(zhí)行過程facto(intn){if(n==0)return(1);elsereturn(n*facto(n-1));}facto(intn){ints;if(n=

=0)s=1;else{s=facto(n-1);s=n*s;}return(s);}等價于了解程序思緒:n!就是n*(n-1)!第五節(jié)函數(shù)遞歸調(diào)用40/72┌──┐│n4=

4│└──┘facto(intn){ints;if(n==0)s=1;else{s=facto(n-1);s=n*s;}return(s);}facto(intn)ints;if(n==0)s=facto(n-1)┌──┐│n3=

3│└──┘facto(intn){ints;if(n==0)s=1;else{s=facto(n-1);s=n*s;}return(s);}facto(intn)ints;s=facto(n-1)if(n==0)┌──┐│n2=

2│└──┘facto(intn){ints;if(n==0)s=1;else{s=facto(n-1);s=n*s;}return(s);}┌──┐│n1=

1│└──┘facto(intn){ints;if(n==0)s=1;else{s=facto(n-1);s=n*s;}return(s);}┌──┐│n0=

0│└──┘facto(intn){ints;if(n==0)s=1;else{s=facto(n-1);s=n*s;}return(s);}facto(intn)facto(intn)facto(intn)ints;ints;ints;if(n==0)if(n==0)if(n==0)s=facto(n-1)s=facto(n-1)s=1return(1)return(1)s=n*s=1*1s=n*s=2*1return(2)return(6)s=n*s=3*2s=n*s=4*6return(24)123454321第五節(jié)函數(shù)遞歸調(diào)用41/72facto(intn){ints;if(n==0)s=1;else{s=facto(n-1);s=n*s;}return(s);}facto(intn)ints;elses=facto(n-1)2N=4main函數(shù)第1次調(diào)用facto3ADD(main)堆棧40E2(n=4)40E2第五節(jié)函數(shù)遞歸調(diào)用42/72facto(intn){ints;if(n==0)s=1;else{s=facto(n-1);s=n*s;}return(s);}N=3facto(intn)ints;elses=facto(n-1)3Facto1函數(shù)第2次調(diào)用facto3ADD(main)堆棧40E2(n=4)40E2(n=3)40E2第五節(jié)函數(shù)遞歸調(diào)用43/72facto(intn){ints;if(n==0)s=1;else{s=facto(n-1);s=n*s;}return(s);}s=1N=0facto(intn)ints;if(n==0)Facto4函數(shù)第5次調(diào)用factoreturn(1)3ADD(main)堆棧40E2(n=4)40E2(n=3)40E2(n=2)40E2(n=1)40E2第五節(jié)函數(shù)遞歸調(diào)用44/72facto(intn){ints;if(n==0)s=1;else{s=facto(n-1);s=n*s;}return(s);}s=facto(1-1)=0!=1s=1*1return(1)N=13ADD(main)堆棧40E2(n=4)40E2(n=3)40E2(n=2)

恢復facto4現(xiàn)場40E240E2(n=1)

0!=1第五節(jié)函數(shù)遞歸調(diào)用45/72facto(intn){ints;if(n==0)s=1;else{s=facto(n-1);s=n*s;}return(s);}return(24)N=4s=facto(4-1)=3!=6s=4*63ADD(main)堆棧恢復facto1現(xiàn)場40E23!=6

40E2(n=4)

返回主函數(shù)第五節(jié)函數(shù)遞歸調(diào)用46/72編寫遞歸程序思緒可將遞歸問題分為兩類:一類是數(shù)值問題,編寫數(shù)值問題程序,關(guān)鍵在于找出所要處理問題遞推算法。另一類是非數(shù)值問題,編寫非數(shù)值問題程序,要將所要處理問題分成兩部分:明確解法最基本部分,原問題性質(zhì)相同小問題。按照縮小問題規(guī)模思緒分解原問題,重復遞歸調(diào)用函數(shù)本身,以處理原問題。下面經(jīng)過例題學習編寫遞歸程序思緒。第五節(jié)函數(shù)遞歸調(diào)用47/72例:編寫程序,求數(shù)列1、1、2、3、5、8、13、21、……第N項。這是一個數(shù)值問題。第一步:找出表示數(shù)列第N項遞歸公式:

FN

=FN-1+FN-2第二步:遞歸結(jié)束條件,當N=1或N=2時,F(xiàn)N=1。依據(jù)以上思緒考慮編程。longfib(intn){if

(n<=2

)return(1);elsereturn(fib(n

-

1

)

+

fib(n

-

2

);}fib(n)=fib(n-1)+fib(n-2)第N項=第N-

1項+第N-

2項return(fib(n-1)+fib(n-2));第五節(jié)函數(shù)遞歸調(diào)用48/72例:用遞歸方法計算以下函數(shù)值:(n>0)

px(x,n)=x-x2+x3-x4+……+(-1)n-1xn這是數(shù)值問題,首先要找到給定函數(shù)遞推形式。而其遞推形式需要對所給函數(shù)進行一定變形才能找到。px(x,n)=x

-

x2+

x3-

x4+

……

+

(-1)n-1

xn

=x*(1

-

x

+

x2

-

x3

+

……

+

(-1)n-1

xn-1

)=x*(1

-(x

-

x2

+

x3

+

……

+

(-1)n-2

xn-1

)=x*(1

-

px(x

,n-1

)

)(n>1)注意:n

=

1時px(x

,n

)

=

1.doublepx(doublex,intn){if(n==1)return(1);elsereturn(x*(1-px(x,n-1));}第五節(jié)函數(shù)遞歸調(diào)用49/72例:

反向輸出給定整數(shù)。比如:給定整數(shù)是12345,要求輸出54321。這是非數(shù)值問題,處理非數(shù)值思緒:“有明確解法部分+性質(zhì)相同小問題”分析:(1)輸出給定N

位整數(shù)個位上數(shù)字,(2)前N-1位除以十,(3)原問題被縮減為N-1

位整數(shù)反向輸出問題。(4)假如?(結(jié)束條件)執(zhí)行(5),不然循環(huán)再執(zhí)行(1)。(6)遞歸調(diào)用結(jié)束。第五節(jié)函數(shù)遞歸調(diào)用50/721

2

3

4551

2

345

41

235

4

3125

4

3

215

4

3

2

1反向輸出(整數(shù)

N){

if(N>=10)then

{輸出最終一位;

N除以10取整得NN-1;調(diào)用反向輸出(NN-1);

}

else

輸出N;

}第五節(jié)函數(shù)遞歸調(diào)用51/72例C8_504main(){intx;printf(“\nEnterN=”);scanf(%d”,&x);int_turn(x);}int_turn(n)intn;{if(n>=10){printf(“%d”,n%10);int_turn(n/10);}elseprintf(“%d”,n);}第五節(jié)函數(shù)遞歸調(diào)用52/72例:漢諾塔問題漢諾塔(Hanoi)問題是一個著名問題,其初始模型如圖所表示。其起源聽說是在約19世紀末歐洲商店中出售一個智力玩具,在一塊銅板上有三根桿,最左邊桿上自上而下、由小到大次序串著由64個圓盤組成塔,游戲目標是將最左邊A桿上圓盤,借助最右邊C桿,全部移到中間B桿上,條件是一次僅能移動一個盤,且不允許大盤放在小盤上面。64片初始桿中間桿目標桿18,446,744,073,709,551,615次1844億億次。每次1微秒,需要60萬年1

n第五節(jié)函數(shù)遞歸調(diào)用53/72先考慮二片情況:A桿B桿C桿移動方法:1.將上面小片移到B桿上。2.將下面大片由A桿移到C桿上。3.將B桿上小片移到C桿上。第五節(jié)函數(shù)遞歸調(diào)用54/72A桿B桿C桿以移動二片思緒,考慮

N片情況:移動方法:1.將上面(N-1)片移到B桿上。2.將下面第N片由A桿移到C桿上。3.將B桿上(N-1)片移到C桿上。第五節(jié)函數(shù)遞歸調(diào)用55/72例C8_505hanoi(n,one,two,three){

hanoi(n-1,one,three,two);move(one,three);

hanoi(n-1,two,one,three);}If(n==1)move(one,three);else{}第五節(jié)函數(shù)遞歸調(diào)用56/72變量數(shù)據(jù)類型:

char型

int型

float型

double型總結(jié):數(shù)據(jù)類型決定為變量分配內(nèi)存單元長度,數(shù)據(jù)存放形式。(從程序設(shè)計角度,決定了能夠表示數(shù)范圍)。問題:1.何時為變量分配內(nèi)存單元?

2.

變量位于內(nèi)存什么位置?

3.變量有效作用范圍?第六節(jié)變量存放特征57/72一、自動變量存放特征main(){inta,b,c,i;for(i=0;i<3;i++){printf(“Entera,b:\n”);scanf(“%d%d”,&a,&b);c=sum(a,b);printf(“Sum=%d\n”,c);}}以下例說明sum(a,b)inta,b;{intc=0;c=c+a+b;return(c);}第六節(jié)變量存放特征58/72main(){inta,b,c,i;for(i=0;i<3;i++){printf(“Entera,b:\n”);scanf(“%d%d”,&a,&b);c=sum(a,b);printf(“Sum=%d\n”,c);}}sum(a,b)inta,b;{intc=0;c=c+a+b;return(c);}內(nèi)存用戶區(qū)程序區(qū)靜態(tài)存放區(qū)動態(tài)存放區(qū)

程序abciabc第六節(jié)變量存放特征59/72main(){inta,b,c,i;for(i=0;i<3;i++){printf(“Entera,b:\n”);scanf(“%d%d”,&a,&b);c=sum(a,b);printf(“Sum=%d\n”,c);}}sum(a,b)inta,b;{intc=0;c=c+a+b;return(c);}內(nèi)存用戶區(qū)程序區(qū)靜態(tài)存放區(qū)動態(tài)存放區(qū)

程序abcabciabci第六節(jié)變量存放特征60/72main(){inta,b,c,i;for(i=0;i<3;i++){printf(“Entera,b:\n”);scanf(“%d%d”,&a,&b);c=sum(a,b);printf(“Sum=%d\n”,c);}}sum(a,b)inta,b;{intc=0;c=c+a+b;return(c);}內(nèi)存用戶區(qū)程序區(qū)靜態(tài)存放區(qū)動態(tài)存放區(qū)

程序abcabciabci第六節(jié)變量存放特征61/72從上例看出,關(guān)于自動變量存放特征可歸納為:1.定義自動變量函數(shù)被調(diào)用時,才為自動變量分配內(nèi)存。2.函數(shù)調(diào)用結(jié)束時,為自動變量分配內(nèi)存被釋放。3.自動變量僅在定義它函數(shù)內(nèi)部有效。4.可在定義自動變量時候,為它賦初值。5.自動變量被存放在內(nèi)存動態(tài)存放區(qū)。結(jié)論:自動變量生存期和可見性(作用域)僅限于定義它函數(shù)內(nèi)部。自動變量是一個局部變量。函數(shù)形參存放特征和自動變量相同。main函數(shù)里變量a

和Sum函數(shù)里變量a

是兩個不一樣變量。問題:在函數(shù)內(nèi)部說明變量是否都有這么存放特征嗎?第六節(jié)變量存放特征62/72二、局部靜態(tài)變量存放特征例C9_602main(){inta,b,c,i;for(i=0;i<3;i++){printf(“Entera,b:\n”);scanf(“%d%d”,&a,&b);c=sum(a,b);printf(“Sum=%d\n”,c);}}sum(a,b)inta,b;{intstaticc=0;c=c+a+b;return(c);}static第六節(jié)變量存放特征63/72main(){int

a,b,c,i;for(i=0;i<3;i++){printf(“Entera,b:\n”);scanf(“%d%d”,&a,&b);c=sum(a,b);printf(“Sum=%d\n”,c);}}sum(a,b)inta,b;{intstaticc=0;c=c+a+b;return(c);}內(nèi)存用戶區(qū)程序區(qū)靜態(tài)存放區(qū)動態(tài)存放區(qū)

程序C=0abC=0abci第六節(jié)變量存放特征64/72main(){int

a,b,c,i;for(i=0;i<3;i++){printf(“Entera,b:\n”);scanf(“%d%d”,&a,&b);c=sum(a,b);printf(“Sum

溫馨提示

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

評論

0/150

提交評論