版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
分校課件第講函數(shù)第一頁(yè),共四十八頁(yè),2022年,8月28日簡(jiǎn)介分而治之與程序的模塊化C語(yǔ)言的基本思想,就是將一個(gè)規(guī)模較大的問(wèn)題分解成若干較小的相對(duì)獨(dú)立的部分來(lái)解決,前一章介紹采用結(jié)構(gòu)化程序設(shè)計(jì)。本章介紹函數(shù),它可以把一個(gè)規(guī)模較大的問(wèn)題分解成若干個(gè)較小的相對(duì)獨(dú)立的部分,對(duì)每一個(gè)部分使用一個(gè)較小的程序段,即程序模塊(module)來(lái)處理。而且可以反復(fù)調(diào)用。從較小的程序段或組件來(lái)構(gòu)建程序。這些小片段或組件比原始程序更容易實(shí)現(xiàn)和管理。這些小組件可以被重復(fù)使用。被本程序和其他程序使用。函數(shù)第二頁(yè),共四十八頁(yè),2022年,8月28日C語(yǔ)言的函數(shù)在C語(yǔ)言中,函數(shù)(function)是構(gòu)成程序的基本模塊。一個(gè)C程序由一個(gè)或多個(gè)函數(shù)組成,有且僅有一個(gè)主函數(shù),即main()函數(shù)。每個(gè)函數(shù)完成一個(gè)相對(duì)獨(dú)立且功能明確的任務(wù)。由主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用。同一個(gè)函數(shù)可以被一個(gè)或多個(gè)函數(shù)調(diào)用任意多次。函數(shù)mainfun_afun_bfun_cfun_cfun_dfun_efun_ffun_d第三頁(yè),共四十八頁(yè),2022年,8月28日二.用戶自定義函數(shù)1.函數(shù)分類(從函數(shù)的形式看)無(wú)參函數(shù)有參函數(shù)◆函數(shù)定義時(shí)無(wú)參數(shù)說(shuō)明◆調(diào)用無(wú)參函數(shù)一般用來(lái)執(zhí)行指定的一組操作◆主調(diào)函數(shù)不傳送數(shù)據(jù)給被調(diào)函數(shù)●函數(shù)定義時(shí)定義了一個(gè)或一個(gè)以上的參數(shù)●調(diào)用時(shí)將要處理的數(shù)據(jù)傳送給被調(diào)函數(shù)空函數(shù)◆定義時(shí)既無(wú)參數(shù)也無(wú)執(zhí)行語(yǔ)句◆被調(diào)用時(shí),不執(zhí)行任何操作就立即返回6.2函數(shù)的定義第四頁(yè),共四十八頁(yè),2022年,8月28日C語(yǔ)言的函數(shù)C語(yǔ)言的函數(shù)有兩大類:標(biāo)準(zhǔn)庫(kù)函數(shù)編譯系統(tǒng)提供了豐富的函數(shù)。例如數(shù)學(xué)計(jì)算:sqrt(),abs()輸入/輸出:scanf(),printf()自定義函數(shù)程序員自己可以編寫函數(shù)來(lái)完成特定的任務(wù)。應(yīng)該熟悉C系統(tǒng)中的標(biāo)準(zhǔn)函數(shù)庫(kù)。應(yīng)該避免從零開始構(gòu)建一切。注意使用時(shí)要按規(guī)定的格式進(jìn)行使用。函數(shù)第五頁(yè),共四十八頁(yè),2022年,8月28日為什么使用函數(shù)函數(shù)使程序模塊化。程序采用模塊化結(jié)構(gòu)的好處:分而治之提高程序開發(fā)的效率。改進(jìn)性能。使程序易于管理和集中控制。代碼重用使用現(xiàn)有的函數(shù)作為構(gòu)件來(lái)創(chuàng)建程序。函數(shù)可以被重復(fù)使用。避免重復(fù)代碼段降低了復(fù)雜性。抽象隱藏了實(shí)現(xiàn)的細(xì)節(jié)(數(shù)據(jù)結(jié)構(gòu),順序、指針,全局變量)。進(jìn)行參數(shù)傳遞。函數(shù)我們使用庫(kù)函數(shù)(printf()),并不知道它的具體實(shí)現(xiàn)方法,卻并不影響對(duì)他的使用。例如第六頁(yè),共四十八頁(yè),2022年,8月28日案例分析:一個(gè)簡(jiǎn)單的函數(shù)編寫和使用一個(gè)簡(jiǎn)單的函數(shù)(cw0801.c)定義一個(gè)函數(shù)square,用來(lái)計(jì)算任意整數(shù)的平方。然后,使用該函數(shù)計(jì)算從1到10所有整數(shù)的平方。函數(shù)#include<stdio.h>intsquare(int);intmain(){
intx;for(x=1;x<=10;x++)printf("%d",square(x));
return0;}intsquare(inty)//定義平方函數(shù){
returny*y;}聲明函數(shù)使用函數(shù)149162536496481100如果函數(shù)在主調(diào)函數(shù)之后定義,則使用前必須先聲明函數(shù)原形。第七頁(yè),共四十八頁(yè),2022年,8月28日函數(shù)的定義定義函數(shù)的格式<函數(shù)類型><函數(shù)名>(<參數(shù)表>){<函數(shù)體語(yǔ)句>}函數(shù)名:一個(gè)有效的標(biāo)識(shí)符。函數(shù)類型:返回值的類型說(shuō)明符。如果不指定,即缺省,就是int。最好不省略。C99不允許省。void:表示函數(shù)不返回任何值。不可省。參數(shù)表:聲明參數(shù),多個(gè)參數(shù)用逗號(hào)分隔。接收傳遞進(jìn)來(lái)的數(shù)據(jù)。必須為每個(gè)參數(shù)指定數(shù)據(jù)類型。int可以省略。但最好不要省略。函數(shù)函數(shù)頭函數(shù)體Void能用在:1、對(duì)函數(shù)返回的限定;2、對(duì)函數(shù)參數(shù)的限定。3、指針的限定第八頁(yè),共四十八頁(yè),2022年,8月28日函數(shù)的定義函數(shù)體:包括聲明語(yǔ)句和可執(zhí)行語(yǔ)句。在函數(shù)體內(nèi)可以定義變量。不能定義函數(shù),即函數(shù)的定義不允許嵌套??刂品祷兀航Y(jié)束執(zhí)行,把程序的控制交還主調(diào)函數(shù),也可以用return返回一個(gè)數(shù)值。}return;return<表達(dá)式>;如:return(x>y?x:y);函數(shù)無(wú)返回值,只返回控制權(quán)有返回值如果函數(shù)無(wú)參數(shù),那么應(yīng)聲明其參數(shù)為void:Intfunction(void){
return1;}第九頁(yè),共四十八頁(yè),2022年,8月28日案例分析:函數(shù)的定義函數(shù)的定義(cw0802.c)定義函數(shù)找出三個(gè)數(shù)中的大數(shù)。函數(shù)#include<stdio.h>intmaximum(intx,inty,intz);intmain(){
inta,b,c;printf(“inputthreeintegers:");scanf("%d%d%d",&a,&b,&c);printf(“Maximumis:%d\n”,maximum(a,b,c));
return0;}intmaximum(intx,inty,intz){
intmax=x;
if(y>max)max=y;
if(z>max)max=z;
returnmax;}maximumintintintint函數(shù)原型接口(interface)聲明函數(shù)原形必須加;return(max)括號(hào)可省return(x>y?x:y);第十頁(yè),共四十八頁(yè),2022年,8月28日函數(shù)原型函數(shù)原型
<函數(shù)類型><函數(shù)名>(<參數(shù)表>);用來(lái)對(duì)函數(shù)進(jìn)行聲明。編譯器使用函數(shù)原型來(lái)檢查函數(shù)調(diào)用的合法性。注意:函數(shù)原型要與函數(shù)的定義一致。例如
intmaximum(inta,intb,intc); intmaximum(int,int,int);函數(shù)在使用自定義函數(shù)時(shí),除了進(jìn)行定義之外,還要對(duì)被調(diào)用函數(shù)進(jìn)行說(shuō)明,說(shuō)明函數(shù)類型、名稱和參數(shù)類型,這稱為函數(shù)原形。如果被調(diào)用函數(shù)在調(diào)用函數(shù)之后定義,則必須先聲明原形.第十一頁(yè),共四十八頁(yè),2022年,8月28日函數(shù)原型函數(shù)原型在程序文件中的位置不同,作用范圍不同在所有函數(shù)的外面在調(diào)用函數(shù)內(nèi)部函數(shù)main(){…}voidfuncA(){
intfuncB(int);…}intfuncB(int){…}函數(shù)原形在函數(shù)外聲明,其作用范圍從聲明處開始,至程序結(jié)束。在函數(shù)中聲明,只能在函數(shù)中起作用。第十二頁(yè),共四十八頁(yè),2022年,8月28日函數(shù)原型如果程序中沒有包含函數(shù)原型。編譯程序會(huì)使用該函數(shù)第一次出現(xiàn)的情形來(lái)形成自己的函數(shù)原型。函數(shù)的定義在前函數(shù)的調(diào)用在后默認(rèn)情況下,編譯程序假定函數(shù)返回int型的結(jié)果,但不會(huì)對(duì)參數(shù)進(jìn)行任何假定。如果傳遞給函數(shù)的參數(shù)不正確,編譯程序不會(huì)檢查到這些錯(cuò)誤。函數(shù)不要省略返回值的類型,如果函數(shù)沒有返回值,那么應(yīng)聲明為void類型。第十三頁(yè),共四十八頁(yè),2022年,8月28日函數(shù)原型函數(shù)原型強(qiáng)迫參數(shù)采用正確的數(shù)據(jù)類型。舉例printf(“%.3f”,sqrt(4));函數(shù)原型使編譯程序把整數(shù)值4轉(zhuǎn)換為double型的值4.0沒有與函數(shù)原型中的參數(shù)類型完全對(duì)應(yīng)的參數(shù)值會(huì)在調(diào)用函數(shù)之前被轉(zhuǎn)換成合適的數(shù)據(jù)類型。遵守C語(yǔ)言的提升規(guī)則。函數(shù)doublesqrt(double);第十四頁(yè),共四十八頁(yè),2022年,8月28日函數(shù)原型與頭文件頭文件每個(gè)標(biāo)準(zhǔn)庫(kù)函數(shù)都有對(duì)應(yīng)的頭文件。包含了標(biāo)準(zhǔn)庫(kù)中所有函數(shù)的函數(shù)原型,以及那些函數(shù)所需的數(shù)據(jù)類型和常量的定義。使用#include命令把頭文件包含到程序文件中:#include<文件名>例如,#include<math.h>程序員可以創(chuàng)建自己的頭文件使用.h擴(kuò)展名。使用下面的命令格式包含頭文件:#include“文件名”例如,#include“abc.h”函數(shù)尖括號(hào)指只在include文件夾下查找引號(hào)指先在本程序所在文件夾查找,再在include文件夾下查找第十五頁(yè),共四十八頁(yè),2022年,8月28日形參形參函數(shù)intmax(int
a,int
b){
intc=a>=b?a:b;
returnc;}intmain(){
inta,b,c;scanf(“%d%d”,&a,&b);c=max(a,b);
return0;}實(shí)參實(shí)參形式參數(shù)簡(jiǎn)稱“形參”。在定義被調(diào)函數(shù)時(shí)定義,表示可以接受傳遞過(guò)來(lái)的值。只能是變量形式。只有在函數(shù)被調(diào)用、啟動(dòng)后,才臨時(shí)為其分配存儲(chǔ)單元,并接受主調(diào)函數(shù)傳來(lái)的數(shù)據(jù)。在函數(shù)調(diào)用結(jié)束后,形參所占存儲(chǔ)單元被釋放,即值不保留。實(shí)際參數(shù):簡(jiǎn)稱“實(shí)參”。在函數(shù)調(diào)用時(shí)給出。實(shí)參是函數(shù)調(diào)用時(shí)主調(diào)函數(shù)傳送給被調(diào)函數(shù)形參的實(shí)際值。實(shí)參可以是常量、變量和表達(dá)式但實(shí)參必須有確定的值。如有多個(gè)形參或者多個(gè)實(shí)參,參數(shù)之間用逗號(hào)分隔。不能用其他符號(hào)。第十六頁(yè),共四十八頁(yè),2022年,8月28日參數(shù)傳遞參數(shù)傳遞的順序。函數(shù)intmax(inta,intb){
intc=a>=b?a:b;printf("%d,%d,%d\n",c,a,b);
returnc;}intmain(){
intx=6,y;y=max(x,x++);printf(“x=%d,y=%d\n",x,y);
return0;}當(dāng)實(shí)參表列中有多個(gè)實(shí)參時(shí),對(duì)實(shí)參的求值順序,C語(yǔ)言未規(guī)定。VC和BC是按從右往左的順序求值。b=x++;a=x;6,6,6X=7,y=6在參數(shù)傳遞時(shí)x=6,傳遞完成后才加1b=++x;a=x;7,7,7X=7,y=7cw0802_x.c如改為在參數(shù)傳遞時(shí)x=7,傳遞的a,b都為7第十七頁(yè),共四十八頁(yè),2022年,8月28日參數(shù)傳遞參數(shù)傳遞的影響。函數(shù)intmax(inta,intb){
intc=a>=b?a:b;
a++;b++;
printf("%d,%d,%d\n",a,b,c);
returnc;}intmain(){
inta=6,b=5,c;c=max(a,b);printf(“%d,%d,%d”,a,b,c);
return0;}實(shí)參與形參不共用存儲(chǔ)單元。參數(shù)傳遞時(shí),把實(shí)參的值復(fù)制一份給形參。形參值的變化不影響實(shí)參的值。所以,形參和實(shí)參可以同名。max6a5b7a6bmaincw0802_y.c而返回值總是67,6,66,5,6主函數(shù)main中函數(shù)max中第十八頁(yè),共四十八頁(yè),2022年,8月28日值傳遞和引用傳遞函數(shù)間參數(shù)的傳遞有兩種類型:值傳遞主調(diào)函數(shù)把實(shí)參的值的副本傳遞給被調(diào)函數(shù)的形參。在被調(diào)函數(shù)內(nèi)改變形參的值不會(huì)改變主調(diào)函數(shù)中實(shí)參的值。如果函數(shù)不需要修改參數(shù)的值,就采用這種調(diào)用方式。引用傳遞主調(diào)函數(shù)把實(shí)參“自身”傳遞給被調(diào)函數(shù)的形參。在被調(diào)函數(shù)內(nèi)改變形參的值將改變主調(diào)函數(shù)中實(shí)參的值。用于可信的函數(shù)。函數(shù)但C語(yǔ)言的數(shù)組名作為參數(shù)傳遞時(shí),則是傳址,此時(shí)在被調(diào)函數(shù)內(nèi)形參變化將影響實(shí)參值。這將在數(shù)組章中講授。在指針一章中講指針傳遞。第十九頁(yè),共四十八頁(yè),2022年,8月28日參數(shù)傳遞實(shí)參和形參的類型應(yīng)該相同或賦值兼容。(cw0803.c)定義函數(shù)找出二個(gè)數(shù)(字符)中的大數(shù)。函數(shù)intmax(int
a,int
b){
intc=a>=b?a:b;returnc;}intmain(){
intx=6,y=5,z;z=max(x,y);printf(“%d”,z);
return0;}如果x,y是整型,則結(jié)果正確;如果x,y是字符型,則自動(dòng)進(jìn)行類型轉(zhuǎn)換,結(jié)果正確;如果x,y是短整型,則自動(dòng)進(jìn)行類型轉(zhuǎn)換,結(jié)果正確;如果x或y是實(shí)數(shù),則自動(dòng)進(jìn)行類型轉(zhuǎn)換,有數(shù)據(jù)丟失,結(jié)果可能不正確。b=y;a=x;即b=5a=6在參數(shù)傳遞時(shí)第二十頁(yè),共四十八頁(yè),2022年,8月28日函數(shù)的返回值函數(shù)返回值的類型應(yīng)該與函數(shù)的類型一致。如果不一致,采用函數(shù)的類型,對(duì)返回值進(jìn)行類型轉(zhuǎn)換。函數(shù)#include<stdio.h>intmax(floata,floatb){
floatc=a>=b?a:b;
printf("c=%f\n",c);
returnc;}intmain(){
floatx=6.5,y=5.6,z;z=2*max(x,y);printf(“z=%f”,z);
return0;}c的類型?返回值的類型?max(x,y)的類型?Z=2*max(x,y)的類型?(cw0803-x.c)注意:被調(diào)用函數(shù)如果在主函數(shù)的后面,則結(jié)果不正確,因?yàn)槲凑f(shuō)明函數(shù)原形,必須加一語(yǔ)句函數(shù)原形聲明:intmax(floata,floatb);C=6.500000Z=12.00000第二十一頁(yè),共四十八頁(yè),2022年,8月28日函數(shù)的嵌套調(diào)用嵌套調(diào)用在調(diào)用一個(gè)函數(shù)的過(guò)程中又調(diào)用另一個(gè)函數(shù)函數(shù)主函數(shù)調(diào)用函數(shù)1函數(shù)1調(diào)用函數(shù)2函數(shù)2123456789第二十二頁(yè),共四十八頁(yè),2022年,8月28日案例分析:函數(shù)的嵌套調(diào)用計(jì)算圓環(huán)的面積分析圓環(huán)的面積=外圓的面積–內(nèi)圓的面積可以定義兩個(gè)函數(shù)circleArea計(jì)算圓的面積ringArea計(jì)算圓環(huán)的面積函數(shù)r1r2circleAreadoubledoubleringAreadoubledoubledoubledoublecircleArea(doubler);doubleringArea(doubler1,doubler2);第二十三頁(yè),共四十八頁(yè),2022年,8月28日案例分析:函數(shù)的嵌套調(diào)用計(jì)算圓環(huán)的面積源代碼(cw0804.c)函數(shù)#include<stdio.h>#definePI3.14doublecircleArea(doubler);doubleringArea(doubler1,doubler2);intmain(){
doubler1,r2,s;printf("\tinputr1,r2:");scanf("%lf%lf",&r1,&r2);s=ringArea(r1,r2);printf("\n\tTheareais:%.2lf\n",s);
return0;}第二十四頁(yè),共四十八頁(yè),2022年,8月28日案例分析:函數(shù)的嵌套調(diào)用計(jì)算圓環(huán)的面積源代碼(續(xù))函數(shù)double
circleArea(doubler){returnPI*r*r;}double
ringArea(doubler1,doubler2){
if(r1<=r2)returncircleArea(r2)-circleArea(r1);
elsereturncircleArea(r1)-circleArea(r2);}Inputr1,r2:12Theareais:9.42被調(diào)函數(shù)中可用多個(gè)return語(yǔ)句。第二十五頁(yè),共四十八頁(yè),2022年,8月28日遞歸函數(shù)遞歸函數(shù)直接或間接調(diào)用自己的函數(shù)。函數(shù)函數(shù)1調(diào)用函數(shù)1函數(shù)1調(diào)用函數(shù)2函數(shù)2調(diào)用函數(shù)1第二十六頁(yè),共四十八頁(yè),2022年,8月28日案例分析:遞歸函數(shù)用遞歸方法計(jì)算n!。分析5!=5*4*3*2*15!=5*4!4!=4*3!...遞歸公式函數(shù)n!=1(n=0或1)n*(n-1)!
(n>1)基本情形簡(jiǎn)化問(wèn)題s=1;n=1;while(n<=20)
s=n*s;迭代n!
=n*
(n-1)!
第二十七頁(yè),共四十八頁(yè),2022年,8月28日案例分析:遞歸函數(shù)舉例:用遞歸方法計(jì)算n!。函數(shù)/*用遞歸方法計(jì)算n!(cw0805.c)*/#include<stdio.h>long
fac(intn){longs;//聲明長(zhǎng)整變量f
if(n==0||n==1)
s=1;
elses=n*fac(n-1);//反復(fù)自調(diào)用fac并輸出
printf("\t%d!=%ld\n",n,s);
returns;}intmain(){printf("\n\t5!=%ld\n",fac(5));
return0;}1!=12!=23!=64!=245!=1205!=120遞歸調(diào)用源代碼(cw0805.c)第二十八頁(yè),共四十八頁(yè),2022年,8月28日案例分析:遞歸函數(shù)舉例:用遞歸方法計(jì)算n!。分析函數(shù)5!5*4!4*3!3*2!2*1!11205*244*63*22*11遞歸調(diào)用從遞歸調(diào)用返回值第二十九頁(yè),共四十八頁(yè),2022年,8月28日//求1!+2!+3!+4!+….+20!#include<stdio.h>floatsum(int);floatfac(int);intmain(){ floatsum(int);
floatadd; add=sum(20); printf("add=%e",add);
return0;}floatsum(intn){floatfac(int);
inti;
floats=0;for(i=1;i<=n;i++) s+=fac(i);
returns;}floatfac(inti){floatt=1;
intn=1;
do{ t=t*n; n++;}
while(n<=i);
returnt;}//運(yùn)行結(jié)果為:s=2.56133e+18,可能最后一位不準(zhǔn)確。(cw0806.c)第三十頁(yè),共四十八頁(yè),2022年,8月28日用遞歸方案解決問(wèn)題小結(jié)用遞歸(函數(shù))方案解決問(wèn)題遞歸函數(shù)只知道如何去解最簡(jiǎn)單的情形(基本情形)簡(jiǎn)單的返回一個(gè)值把復(fù)雜的問(wèn)題分成兩部分:函數(shù)知道如何去做的部分函數(shù)不知道如何去做的部分這一部分與原問(wèn)題相似,且更簡(jiǎn)單函數(shù)可以調(diào)用自己的新形式來(lái)解決這個(gè)更小的問(wèn)題(遞歸調(diào)用)最終遇到基本情形函數(shù)識(shí)別出基本情形,將結(jié)果返回給前一個(gè)情形一系列的結(jié)果按順序返回直到把最終結(jié)果返回給原始的調(diào)用者(可能是main()函數(shù))函數(shù)第三十一頁(yè),共四十八頁(yè),2022年,8月28日案例分析:遞歸方案使用遞歸方法計(jì)算斐波拉契(Fibonacci)數(shù)列。
0112358…分析從第三個(gè)數(shù)開始,每個(gè)數(shù)是前兩個(gè)數(shù)的和。第一、二個(gè)數(shù)是確定的。遞歸公式fib(n)=fib(n-1)+fib(n-2)(當(dāng)n>1時(shí))fib(0)=0fib(1)=1函數(shù)寫成遞歸函數(shù)有:intfib(intn){
if(n==0)return0;
if(n==1)return1;
if(n>1)returnfib(n-1)+fib(n-2);}注意編程時(shí)計(jì)項(xiàng)數(shù)是從第0項(xiàng)開始計(jì)數(shù),第4、5、6……項(xiàng)為3、5、8……#include<stdio.h>intmain(void){
intn;printf("inpitn=?");scanf("%d",&n);//for(n=0;n<9;n++)printf("第%d項(xiàng)為%d\n",n,fib(n));return0;}(cw0807fib.c)第三十二頁(yè),共四十八頁(yè),2022年,8月28日#include<stdio.h>#include<math.h>intmain(){
floata,x1,x2;scanf("%f",&a);x1=1;x2=a;
while(fabs(x1-x2)>=1e-5){x1=x2;x2=(x1+a/x1)/2;}printf("%f,%f",x1,x2);
return0;}/*求平方根的迭代公式為Xn+1=1/2(Xn+a/Xn);要求前后兩次求出的x的差的絕對(duì)值小于1e-5;*/用迭代法求a的平方根利用迭代算法解決問(wèn)題,需要做好以下三個(gè)方面的工作:一、確定迭代變量。至少存在一個(gè)直接或間接地不斷由舊值遞推出新值的變量,這個(gè)變量就是迭代變量。二、建立迭代關(guān)系式。如何從變量的前一個(gè)值推出其下一個(gè)值的公式(或關(guān)系)。這是建立迭代問(wèn)題的關(guān)鍵,通??梢允褂眠f推或倒推的方法來(lái)完成。三、對(duì)迭代過(guò)程進(jìn)行控制。在什么時(shí)候結(jié)束迭代過(guò)程?(cw0806x.c)x1=1,a, (1+a)/2,Sqrt(5)=2.236067977x2=a,(1+a)/2,((1+a)/2+a/(1+a)/2)/2, 1,5, 3,2.3333, 2.23815,3, (3+5/3)/2=2.3333,(2.3333+5/2.3333)/2=2.2381, (2.2381+5/2.2381)/2=2.23606889第三十三頁(yè),共四十八頁(yè),2022年,8月28日遞歸與迭代遞歸與迭代的比較循環(huán)迭代:明確使用了循環(huán)結(jié)構(gòu)遞歸:重復(fù)調(diào)用遞歸函數(shù)終止條件迭代:循環(huán)條件不滿足遞歸:遇到基本情形都有可能出現(xiàn)無(wú)限循環(huán)如何選擇迭代:性能好遞歸:可讀性好函數(shù)迭代遞歸迭代和遞歸各基于一種控制結(jié)構(gòu),都涉及到循環(huán),都可無(wú)限進(jìn)行是循環(huán)求值是調(diào)用本身使用循環(huán)結(jié)構(gòu)使用選擇結(jié)構(gòu)當(dāng)循環(huán)條件不滿足時(shí)終止當(dāng)滿足基本條件時(shí)終止用計(jì)數(shù)器控制循環(huán),不停地修改計(jì)數(shù)器的值,直到不滿足條件為止逐漸逼近基本條件而終止,不斷地對(duì)問(wèn)題進(jìn)行簡(jiǎn)化直到可以直接計(jì)算基本問(wèn)題為止包含多個(gè)源文件的程序放到下一次再講第三十四頁(yè),共四十八頁(yè),2022年,8月28日編輯函數(shù)要注意的事項(xiàng)每一個(gè)函數(shù)都必須有注釋,即使函數(shù)短到可能只有幾行。每個(gè)函數(shù)定義結(jié)束之后以及每個(gè)文件結(jié)束之后都要加一個(gè)或若干個(gè)空行。在一個(gè)函數(shù)體內(nèi),變量定義與函數(shù)語(yǔ)句之間要加空行。復(fù)雜的函數(shù)中,在分支語(yǔ)句,循環(huán)語(yǔ)句結(jié)束之后需要適當(dāng)?shù)淖⑨?,方便區(qū)分各分支或循環(huán)體。如果函數(shù)中的參數(shù)較長(zhǎng),則要進(jìn)行適當(dāng)?shù)膭澐?。用正確的反義詞組命名具有互斥意義的變量或相反動(dòng)作的函數(shù)等。如:min(),max()第三十五頁(yè),共四十八頁(yè),2022年,8月28日參數(shù)的書寫要完整,不要貪圖省事只寫參數(shù)的類型而省略參數(shù)名字。如果函數(shù)沒有參數(shù)則用void填充。不要省略返回值的類型,如果函數(shù)沒有返回值,那么應(yīng)聲明為void類型。函數(shù)的功能要單一,不要設(shè)計(jì)多用途的函數(shù)。函數(shù)體的規(guī)模要小,盡量控制在80行代碼之內(nèi)。相同的輸入應(yīng)當(dāng)產(chǎn)生相同的輸出。盡量避免函數(shù)帶有“記憶”功能。建議盡量少用static局部變量,除非必需。避免函數(shù)有太多的參數(shù),參數(shù)個(gè)數(shù)盡量控制在4個(gè)或4個(gè)以內(nèi)。函數(shù)名與返回值類型在語(yǔ)義上不可沖突。編輯函數(shù)要注意的事項(xiàng)(續(xù))第三十六頁(yè),共四十八頁(yè),2022年,8月28日小結(jié)函數(shù)可以作為大型程序的組成模塊。每個(gè)函數(shù)應(yīng)該實(shí)現(xiàn)某個(gè)明確的功能。使用參數(shù)可以向函數(shù)傳遞數(shù)據(jù),通過(guò)return讓函數(shù)返回一個(gè)數(shù)據(jù)。使用函數(shù)原型聲明函數(shù),以便編譯器檢查函數(shù)調(diào)用時(shí)所傳遞的參數(shù)個(gè)數(shù)及類型是否正確。函數(shù)可以調(diào)用自身,這種調(diào)用方式稱為遞歸。有些問(wèn)題使用遞歸解決方案,但是遞歸會(huì)在內(nèi)存使用和時(shí)間花費(fèi)方面效率低下。函數(shù)const修飾符也可以修飾函數(shù)的返回值,返回值不可被改變。例如:ConstintFun(void);第三十七頁(yè),共四十八頁(yè),2022年,8月28日請(qǐng)自學(xué)本章教材內(nèi)容并預(yù)習(xí)下一章的內(nèi)容與實(shí)驗(yàn)請(qǐng)自己做本章的習(xí)題與實(shí)驗(yàn)體驗(yàn)本章到此結(jié)束,謝謝您的光臨!THANKYOUVERYMUCH!第三十八頁(yè),共四十八頁(yè),2022年,8月28日程序設(shè)計(jì)舉例:擲骰子擲骰子問(wèn)題每個(gè)玩家擲兩個(gè)骰子。每個(gè)骰子都有6個(gè)面。這些面中包含了1點(diǎn)、2點(diǎn)、3點(diǎn)、4點(diǎn)、5點(diǎn)和6點(diǎn)。當(dāng)骰子靜止下來(lái)之后,計(jì)算兩個(gè)朝上的面中的點(diǎn)數(shù)和(本次投擲的結(jié)果)。如果第一次投擲的結(jié)果是7或11,那么這個(gè)玩家就獲勝。如果第一次投擲的結(jié)果是2、3或1、2,那么這個(gè)玩家就輸了(即莊家獲勝)。如果第一次投擲的結(jié)果是4、5、6、8、9或10,那么這個(gè)結(jié)果就是該玩家的“點(diǎn)數(shù)”。為了獲勝,玩家必須繼續(xù)擲骰子,直到“擲出了點(diǎn)數(shù)”。在擲出點(diǎn)數(shù)之前,如果玩家擲出了7,那么玩家就輸了。函數(shù)第三十九頁(yè),共四十八頁(yè),2022年,8月28日程序設(shè)計(jì)舉例:擲骰子擲骰子初始設(shè)計(jì)定義一個(gè)函數(shù)rollDice,用來(lái)模擬擲一次骰子產(chǎn)生兩個(gè)隨機(jī)數(shù)(1..6),返回它們的和(點(diǎn)數(shù))函數(shù)擲第一次勝輸擲一次勝輸?第四十頁(yè),共四十八頁(yè),2022年,8月28日程序設(shè)計(jì)舉例:擲骰子擲骰子細(xì)化設(shè)計(jì)定義一個(gè)變量保存游戲進(jìn)展的狀態(tài)gamestatus0:繼續(xù)1:勝利(游戲結(jié)束)2:失?。ㄓ螒蚪Y(jié)束)函數(shù)否rollDice結(jié)束?rollDice結(jié)束?否是是贏或輸?shù)谒氖豁?yè),共四十八頁(yè),2022年,8月28日程序設(shè)計(jì)舉例:擲骰子擲骰子實(shí)現(xiàn)(cw0807.c)函數(shù)#include<stdio.h>#include<stdlib.h>#include<time.h>introllDice(void);intmain(){
intgameStatus,sum,myPoint;
srand(time(NULL));sum=rollDice();擲第一次第四十二頁(yè),共四十八頁(yè),2022年,8月28日程序設(shè)計(jì)舉例:擲骰子擲骰子實(shí)現(xiàn)函數(shù)switch(sum){
case7:
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年精密陶瓷劈刀項(xiàng)目建議書
- 離職員工解除勞動(dòng)合同協(xié)議
- 借用資質(zhì)承諾書:供應(yīng)鏈穩(wěn)定性
- 紡織行業(yè)技能提升培訓(xùn)
- 時(shí)尚模特經(jīng)紀(jì)人聘用協(xié)議
- 醫(yī)院周邊減速帶建設(shè)項(xiàng)目協(xié)議
- 防水工程師崗位協(xié)議樣本
- 環(huán)保項(xiàng)目運(yùn)輸租約
- 道路改造招投標(biāo)活動(dòng)規(guī)范須知
- 專賣店硅藻泥施工合同
- 穴位貼敷護(hù)理培訓(xùn)
- 腰椎間盤突出癥護(hù)理查房課件
- JJF(陜) 085-2022 全自動(dòng)容量稀釋配標(biāo)儀校準(zhǔn)規(guī)范
- DB45T 2866-2024 靈芝菌種制備技術(shù)規(guī)程
- 2024年度區(qū)塊鏈軟件產(chǎn)品知識(shí)產(chǎn)權(quán)共享協(xié)議3篇
- 人教版九年級(jí)上學(xué)期物理期末復(fù)習(xí)(壓軸60題28大考點(diǎn))
- 粉末銷售合同范例
- 齊魯名家 談方論藥知到智慧樹章節(jié)測(cè)試課后答案2024年秋山東中醫(yī)藥大學(xué)
- 人教版(2024版)七年級(jí)上冊(cè)英語(yǔ)期末模擬測(cè)試卷(含答案)
- 2024年度企業(yè)環(huán)境、社會(huì)及治理(ESG)咨詢合同6篇
- 大學(xué)生職業(yè)生涯規(guī)劃與就業(yè)創(chuàng)業(yè)指導(dǎo)知到智慧樹章節(jié)測(cè)試課后答案2024年秋四川水利職業(yè)技術(shù)學(xué)院
評(píng)論
0/150
提交評(píng)論