版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
C語言程序設(shè)計(jì)活頁式教程項(xiàng)目5面向過程編程經(jīng)驗(yàn)豐富的中學(xué)班主任在開家長會(huì)前,會(huì)將家長會(huì)的準(zhǔn)備工作安排得井井有條。比如,安排兩名學(xué)生負(fù)責(zé)黑板報(bào),安排六名學(xué)生負(fù)責(zé)課室清潔,安排兩名學(xué)生負(fù)責(zé)粘貼學(xué)生名牌,安排兩名學(xué)生負(fù)責(zé)準(zhǔn)備茶水,安排四名學(xué)生進(jìn)行接待指引等等。如此一來,開家長會(huì)這個(gè)“龐大”的項(xiàng)目就被分解成了一個(gè)個(gè)小“任務(wù)”,只需完成所有任務(wù),就能保證家長會(huì)的順利進(jìn)行。在程序設(shè)計(jì)中,也會(huì)采用類似的操作,將一個(gè)較大的程序分解成若干個(gè)程序模塊,一個(gè)程序模塊實(shí)現(xiàn)某個(gè)特定的功能。在C語言中,用函數(shù)來實(shí)現(xiàn)模塊功能。函數(shù)是構(gòu)成C語言程序的基本單位,程序從主函數(shù)main開始執(zhí)行,最后由main()函數(shù)結(jié)束整個(gè)程序。C語言程序一般由一個(gè)主函數(shù)和若干個(gè)其他函數(shù)共同構(gòu)成。主函數(shù)調(diào)用其他函數(shù)實(shí)現(xiàn)特定功能,其他函數(shù)之間也可以相互調(diào)用。在程序的開發(fā)過程中,常將多次用到的功能模塊編寫成函數(shù)。程序設(shè)計(jì)人員通過函數(shù)調(diào)用,可以大大減少重復(fù)的工作量,從而提高編程工作的效率。到目前為止,我們所編寫的程序都只有一個(gè)main()函數(shù)。但在編寫程序的過程中,都在不斷地使用scanf()、printf()、getchar()和putchar()等輸入輸出函數(shù),這些函數(shù)都稱為C語言的標(biāo)準(zhǔn)庫函數(shù),它們由系統(tǒng)提供可以直接使用。由于標(biāo)準(zhǔn)庫函數(shù)只包括一些基本的、通用的功能函數(shù),而在實(shí)際應(yīng)用中需要解決具體復(fù)雜的問題時(shí),標(biāo)準(zhǔn)庫函數(shù)不能滿足要求,這就要求程序員根據(jù)實(shí)際情況來編寫函數(shù),實(shí)現(xiàn)某些特定的功能。綜上所述,函數(shù)可分為標(biāo)準(zhǔn)庫函數(shù)和自定義函數(shù)。對(duì)于標(biāo)準(zhǔn)庫函數(shù),重點(diǎn)要了解有哪些庫函數(shù),分別能完成什么功能及如何調(diào)用。而對(duì)于自定義函數(shù),重點(diǎn)要根據(jù)需求來劃分功能,并將功能定義成函數(shù)。項(xiàng)目任務(wù)知識(shí)目標(biāo)學(xué)習(xí)目標(biāo)任務(wù)1:定義和調(diào)用函數(shù)任務(wù)2:用函數(shù)解決數(shù)學(xué)難題任務(wù)3:用遞歸函數(shù)解決特殊問題任務(wù)4:使用主函數(shù)的參數(shù)(1)了解函數(shù)的定義和調(diào)用。(2)了解全局變量和局部變量的特點(diǎn)。(3)掌握程序模塊劃分。(4)掌握遞歸函數(shù)的定義、調(diào)用以及適用的場景。(5)能夠設(shè)計(jì)并使用程序的參數(shù)。任務(wù)準(zhǔn)備任務(wù)實(shí)施任務(wù)描述任務(wù)1定義和調(diào)用函數(shù)任務(wù)描述模塊化的程序設(shè)計(jì)方法通常是將比較復(fù)雜的問題分解成若干個(gè)相對(duì)簡單的子問題,然后分別求解,以降低解決問題的復(fù)雜度。一個(gè)C語言程序由一個(gè)或多個(gè)程序模塊組成,每個(gè)程序模塊由一個(gè)或多個(gè)函數(shù)組成。將一段很長的代碼按功能拆分成若干個(gè)函數(shù),有以下優(yōu)點(diǎn):(1)有利于代碼閱讀。函數(shù)給一組語句命名,讓它們成為一個(gè)代碼塊,這樣更有利閱讀代碼和調(diào)試。(2)減少重復(fù)代碼的使用。函數(shù)讓程序代碼總行數(shù)變的更少,之后如果需要修改代碼,只需要改很少的地方。(3)方便拆分調(diào)試。將一段很長的代碼拆分成幾個(gè)函數(shù)之后,可以對(duì)每一個(gè)函數(shù)進(jìn)行單獨(dú)的調(diào)試。單個(gè)函數(shù)調(diào)試通過后,再將它們組合起來形成一個(gè)完整的軟件產(chǎn)品。(4)通用性強(qiáng)。一個(gè)設(shè)計(jì)良好的函數(shù),可以在很多程序中被反復(fù)調(diào)用,不需要重新編寫或修改。本任務(wù)會(huì)將一些常見功能編寫成函數(shù),如判斷素?cái)?shù)、求一維整型數(shù)組的最大值、對(duì)一維整型數(shù)組排序等。通過這些例子,向?qū)W生講解函數(shù)的定義、聲明和調(diào)用規(guī)則,讓學(xué)生掌握函數(shù)的相關(guān)操作,具備模塊化程序設(shè)計(jì)能力。任務(wù)準(zhǔn)備任務(wù)實(shí)施Part
1Part
2Part
3任務(wù)描述任務(wù)準(zhǔn)備1.函數(shù)的定義函數(shù)本質(zhì)是一段可以被重復(fù)調(diào)用、功能相對(duì)獨(dú)立的程序段。函數(shù)的定義形式如下:返回類型函數(shù)名1(){
函數(shù)體;}或:返回類型函數(shù)名2(類型1形參1,類型2形參2,…,類型n形參n){
函數(shù)體;}任務(wù)準(zhǔn)備一個(gè)函數(shù)由函數(shù)名、參數(shù)、函數(shù)體、返回類型組成。定義函數(shù)時(shí)要注意以下幾點(diǎn):(1)函數(shù)名要避免與標(biāo)準(zhǔn)庫函數(shù)同名。(2)參數(shù)可以有0個(gè)或多個(gè),以逗號(hào)隔開。沒有參數(shù)的函數(shù)叫“無參函數(shù)”,如“函數(shù)名1”就是無參函數(shù);有參數(shù)的函數(shù)叫“有參函數(shù)”,如“函數(shù)名2”就是有參函數(shù)。(3)每個(gè)參數(shù)都是以“類型變量”形式給出。“形參n”就是一個(gè)變量名,它被稱為“形式參數(shù)”。顧名思義,形式參數(shù)只是一個(gè)形式,它的名字不重要,重要是的它的類型。形式參數(shù)告訴調(diào)用者,此處應(yīng)該放一個(gè)指定類型的數(shù)據(jù)。可以這么理解,形式參數(shù)就像電影里的“路人甲”,他叫什么名字、長得怎么樣都無關(guān)緊要,他站在那里的意義是充當(dāng)一個(gè)士兵的角色,即他代表一個(gè)士兵類型。(4)函數(shù)體必須在一對(duì)大括號(hào)中,它是函數(shù)名所代表的代碼段,可以是一句或多句代碼。(5)函數(shù)的返回類型可以是void類型或非void類型。返回類型是void的函數(shù),它執(zhí)行完函數(shù)體后不會(huì)返回?cái)?shù)據(jù)。非void類型可以是int、char、double、結(jié)構(gòu)體、指針等類型,返回類型不是void的函數(shù),它的函數(shù)體內(nèi)必須有一個(gè)return語句。return后跟一個(gè)表達(dá)式,表達(dá)式的類型與函數(shù)的返回類型一致。(6)函數(shù)的功能必須單一。初學(xué)者最容易犯的錯(cuò)誤是將函數(shù)實(shí)現(xiàn)某功能后得出的結(jié)果輸出,按函數(shù)功能單一的原則,該函數(shù)只需要將得出的結(jié)果返回,將結(jié)果輸出是多此一舉、畫蛇添足。(7)函數(shù)不能嵌套定義,即不能在一個(gè)函數(shù)中定義另一個(gè)函數(shù)。任務(wù)準(zhǔn)備定義一個(gè)函數(shù)時(shí),重點(diǎn)要弄清楚這個(gè)函數(shù)應(yīng)該代入什么參數(shù),返回什么類型的數(shù)據(jù)。以設(shè)計(jì)世界上第一臺(tái)豆?jié){機(jī)為例,比較好的設(shè)計(jì)是,往豆?jié){機(jī)里放入水和黃豆,啟動(dòng)豆?jié){機(jī),不久后就能從豆?jié){機(jī)里倒出豆?jié){來。如果把豆?jié){機(jī)比作一個(gè)函數(shù),它應(yīng)該代入什么、返回什么呢?很顯然,它代入的形式參數(shù)是水和黃豆,返回類型是豆?jié){。定義豆?jié){機(jī)的函數(shù)偽代碼如下:豆?jié){豆?jié){機(jī)(水x,黃豆y){
制作豆?jié){的代碼段;}任務(wù)準(zhǔn)備以定義一個(gè)求兩個(gè)整數(shù)的最大公約數(shù)的函數(shù)為例,它需要代入這兩個(gè)整數(shù),返回整型的最大公約數(shù)。求最大公約數(shù)的思路是:找出兩個(gè)整數(shù)的較小的那一個(gè),從1循環(huán)到較小數(shù),記錄能被兩個(gè)整數(shù)都除盡的最大值。求最大公約數(shù)的函數(shù)定義如下:intgys(inta,intb){ inti,x=1; intc=(a<b?a:b);/*條件表達(dá)式,返回a與b中的較小者*/ for(i=1;i<=c;i++)/*i從1開始*/ { if(a%i==0&&b%i==0)/*a和b都能把i除盡,說明找到公約數(shù)*/ x=i; } returnx;}任務(wù)準(zhǔn)備初學(xué)者最容易犯的錯(cuò)誤就是,將求得的最大公約數(shù)輸出,錯(cuò)誤地將求兩數(shù)的最大公約數(shù)的函數(shù)定義成如下形式:voidgys2(inta,intb){ inti,x=1; intc=(a<b?a:b); for(i=1;i<=c;i++) { if(a%i==0&&b%i==0) x=i; } printf("%d和%d的最大公約數(shù)是%d\n",a,b,x);}函數(shù)gys()能應(yīng)用在任何需要求兩數(shù)的最大公約數(shù)的場合,而函數(shù)gys2()只能應(yīng)用在輸出兩個(gè)數(shù)的最大公約數(shù)的情形下。很顯然,功能單一的gys()函數(shù)應(yīng)用范圍更廣。任務(wù)準(zhǔn)備再以定義一個(gè)輸出一維整型數(shù)組所有元素的函數(shù)為例,它需要代入整型數(shù)組的首地址和元素個(gè)數(shù),不需要返回任何數(shù)據(jù)。該函數(shù)的定義如下:voidshuchu(inta[],intn){ inti; for(i=0;i<n;i++) printf("%d,",a[i]);}當(dāng)一維數(shù)組作函數(shù)參數(shù)時(shí),代入的是該數(shù)組的首地址,即數(shù)組名。但數(shù)組名只是一個(gè)地址,編譯系統(tǒng)并不知道它有多少個(gè)元素,因此,當(dāng)要把一維數(shù)組傳入函數(shù)時(shí),要代入函數(shù)名和元素個(gè)數(shù)。任務(wù)準(zhǔn)備2.函數(shù)的調(diào)用定義函數(shù)的目的是為了重復(fù)使用某種功能或某段代碼,我們將函數(shù)的使用稱為函數(shù)調(diào)用。定義函數(shù)時(shí)需要寫清楚代入?yún)?shù)、返回類型和實(shí)現(xiàn)代碼,而調(diào)用函數(shù)則簡單很多,函數(shù)的調(diào)用形式如下:函數(shù)名1(實(shí)際參數(shù)列表);或:數(shù)據(jù)類型變量=函數(shù)名2(實(shí)際參數(shù)列表);任務(wù)準(zhǔn)備函數(shù)的定義不同,調(diào)用時(shí)的寫法也不相同。調(diào)用函數(shù)時(shí)要注意以下幾點(diǎn):(1)形式參數(shù)是定義函數(shù)時(shí)給出的參數(shù),它們必須指明數(shù)據(jù)類型和順序,而形式參數(shù)的名字最好能代表實(shí)際的意義,如age、height、maxIndex。(2)實(shí)際參數(shù)是調(diào)用函數(shù)時(shí)給出的參數(shù),它們必須與形式參數(shù)的類型和順序?qū)?yīng)。實(shí)際參數(shù)的前面不用再寫數(shù)據(jù)類型,也不需要與形式參數(shù)同名。實(shí)際參數(shù)可以是常量、變量、表達(dá)式甚至另一個(gè)函數(shù)。(3)無參函數(shù)不需要代入?yún)?shù)。(4)有參函數(shù)在代入實(shí)際參數(shù)時(shí),必須保證實(shí)際參數(shù)的類型和順序與定義的形式參數(shù)的類型和順序一致。(5)void函數(shù)由于沒有返回值,它的調(diào)用一般單獨(dú)成行,如“函數(shù)名1”。(6)非void函數(shù)有返回值,調(diào)用時(shí)一般用變量接收它的返回值,如“函數(shù)名2”。但也存在調(diào)用非void函數(shù)后不接收它的返回值的情況。(7)由于非void函數(shù)有返回值,它可以被當(dāng)作一個(gè)變量使用,如與其它常量或變量組成表達(dá)式,或被當(dāng)成另一個(gè)函數(shù)的實(shí)際參數(shù)。任務(wù)準(zhǔn)備以求兩數(shù)最大公約數(shù)的gys()函數(shù)和輸出一維整型數(shù)組的shuchu()函數(shù)為例,它們的調(diào)用可以是如下幾種形式:intx=6,y=14,z;intsz[10]={0,1,2,3,4,5,6,7,8,9};z=gys(5,10);z=gys(x,y)+2;z=gys(5,y+1);z=gys(5,gys(15,45));/*非void函數(shù)作為函數(shù)的參數(shù)*/gys(7,y);/*不接收函數(shù)返回值的情況*/shuchu(sz,10);/*void函數(shù)的調(diào)用*/任務(wù)準(zhǔn)備3.函數(shù)的聲明在C語言中,函數(shù)的定義順序是有講究的。默認(rèn)情況下,只有后面定義的函數(shù)才可以調(diào)用前面定義過的函數(shù)。如果想把函數(shù)的定義寫在main()函數(shù)后面,而且main()函數(shù)能正常調(diào)用這些函數(shù),那就必須在main()函數(shù)的前面進(jìn)行函數(shù)的聲明。在調(diào)用標(biāo)準(zhǔn)庫函數(shù)時(shí),不需要預(yù)先聲明,但必須在程序的開頭用“#include”命令將庫函數(shù)所在的頭文件包含進(jìn)來。調(diào)用用戶自定義函數(shù)時(shí),則要對(duì)函數(shù)進(jìn)行聲明,聲明函數(shù)的格式有如下兩種:數(shù)據(jù)類型函數(shù)名(類型1,類型2,…);數(shù)據(jù)類型函數(shù)名(類型1形參1,類型2形參2,…);函數(shù)的聲明可以只給出形式參數(shù)的類型,也可以像定義函數(shù)時(shí)一樣同時(shí)給出參數(shù)的類型和名稱,而且聲明時(shí)的參數(shù)名可以與定義時(shí)的參數(shù)名不一樣。但無論是哪種寫法,對(duì)應(yīng)參數(shù)的類型必須一致。任務(wù)準(zhǔn)備以求兩數(shù)最大公約數(shù)的gys()函數(shù)和輸出一維整型數(shù)組的shuchu()函數(shù)為例,它們的聲明可以是如下幾種形式:intgys(int,int);intgys(intc,intd);voidshuchu(int[],int);/*int[]代表一維整型數(shù)組的類型*/voidshuchu(intx[],inty);函數(shù)聲明的作用是告知編譯軟件,某標(biāo)識(shí)符(函數(shù)名)代表一個(gè)自定義函數(shù),它必須代入幾個(gè)參數(shù),參數(shù)類型是什么,該自定義函數(shù)返回什么類型的數(shù)據(jù)。函數(shù)聲明通常寫在程序的開頭(或頭文件中),執(zhí)行函數(shù)的代碼在函數(shù)聲明之后。在C語言中,返回類型為int的函數(shù)默認(rèn)可以不用聲明,但推薦初學(xué)者養(yǎng)成編程的好習(xí)慣,在自定義函數(shù)時(shí)先聲明再調(diào)用。任務(wù)準(zhǔn)備【實(shí)例1】寫一個(gè)函數(shù),判斷某個(gè)正整數(shù)是不是素?cái)?shù)。然后在main()函數(shù)中要求用戶輸入一個(gè)正整數(shù),調(diào)用該函數(shù)判斷用戶輸入的正整數(shù)是不是素?cái)?shù)。#include<stdio.h>intsushu(intn); /*聲明函數(shù)*/intmain(){ intx,f; printf("請(qǐng)輸入一個(gè)正整數(shù):"); scanf("%d",&x); f=sushu(x); /*調(diào)用函數(shù)*/ if(f==1) printf("%d是素?cái)?shù)!",x); else printf("%d不是素?cái)?shù)!",x); return1;}intsushu(intn) /*定義函數(shù)*/{ /*先假定n是素?cái)?shù).flag=1代表n是素?cái)?shù),flag=0代表n不是素?cái)?shù)*/ inti,flag=1; for(i=2;i<n;i++) { /*除盡了*/ if(n%i==0) { flag=0; break; } } returnflag;}任務(wù)準(zhǔn)備編譯運(yùn)行,分別輸入13和25的結(jié)果如圖5-1所示:在定義判斷素?cái)?shù)的sushu()函數(shù)時(shí),需要代入一個(gè)正整數(shù),返回該正整數(shù)是不是素?cái)?shù)的結(jié)果,即“是”或“否”。在C語言中沒有專用于表示是或否的類型,一般用1代表“是”,0代表“否”。判斷正整數(shù)n是不是素?cái)?shù)的思路是:先假定n是素?cái)?shù),再用n去除以2~n-1的每一個(gè)數(shù),只要有一次除盡就證明n不是素?cái)?shù)。由于自定義函數(shù)sushu()返回int類型的數(shù)據(jù),所以在調(diào)用它時(shí)用變量f接收了它的返回值。圖5-1判斷素?cái)?shù)任務(wù)準(zhǔn)備【實(shí)例2】定義函數(shù),求一維整型數(shù)組元素的最小值。然后在main()函數(shù)中定義并初始化一個(gè)一維整型數(shù)組,調(diào)用該函數(shù)求出最小值并輸出。#include<stdio.h>intzuixiao(inta[],intn); /*聲明函數(shù)*/intmain(){ intsz[]={1,2,3,4,5,-6,7,8,9,45,99,-100,33}; intc; /*調(diào)用函數(shù),帶入數(shù)組名和元素個(gè)數(shù)*/ c=zuixiao(sz,13); printf("數(shù)組元素的最小值是:%d\n",c); return0;}/*定義函數(shù)*/intzuixiao(inta[],intn) { /*先假定最小值是某個(gè)數(shù)組元素*/ intmin=a[0],i; for(i=0;i<n;i++) { if(min>a[i])/*用min記錄更小的*/ min=a[i]; } returnmin;}任務(wù)準(zhǔn)備編譯運(yùn)行的結(jié)果如圖5-2所示:在定義求一維整型數(shù)組元素最小值的zuixiao()函數(shù)時(shí),需要代入一維數(shù)組的首地址(即數(shù)組名)和元素個(gè)數(shù)(即數(shù)組長度),返回求得的元素最小值。自定義函數(shù)zuixiao()能求所有給定的一維整型數(shù)組的元素最小值,在要用到該功能的場合直接調(diào)用該函數(shù)即可,不需要去重新修改和編譯該函數(shù)的代碼,具有通用性。初學(xué)者很容易犯的一個(gè)錯(cuò)誤是將一維整型數(shù)組定義在函數(shù)zuixiao()內(nèi)部,這樣的做法不可取,因?yàn)槊慨?dāng)要求另一個(gè)一維整型數(shù)組的最小值時(shí),都要去修改函數(shù)內(nèi)部的數(shù)組元素,這樣就失去了函數(shù)能重復(fù)使用的優(yōu)點(diǎn)。圖5-2求一維整型數(shù)組的最小值任務(wù)準(zhǔn)備4.return語句return語句一般用在有返回值的函數(shù)(非void函數(shù))中,用于返回一個(gè)與函數(shù)返回類型一致的數(shù)據(jù)。return語句也可以用在沒有返回值的函數(shù)(void函數(shù))中,作用是退出所在的函數(shù),它后面不跟任何表達(dá)式,寫法為“return;”。任務(wù)準(zhǔn)備5.全局變量與局部變量根據(jù)變量的作用范圍,可將變量分為全局變量和局部變量。全局變量在函數(shù)外定義,一般在#include語句后定義,它在定義時(shí)會(huì)自動(dòng)初始化(即有默認(rèn)值),在整個(gè)程序運(yùn)行過程中可隨時(shí)訪問,每個(gè)函數(shù)都可以使用全局變量。局部變量在函數(shù)內(nèi)部定義,它不會(huì)自動(dòng)初始化(即無默認(rèn)值),只能在函數(shù)內(nèi)部使用。任務(wù)準(zhǔn)備以下面的代碼為例,變量x就是全局變量,變量a、b、c、y和z都是局部變量。#include<stdio.h>intadd(inta,intb);intx=10; /*全局變量*/intmain(){ inty=5,z; /*局部變量*/ z=add(x,y); printf("z=%d\n",z); return0;}intcal(inta,intb){ intc=a+b; /*a,b,c均為局部變量*/ c=c*x; /*訪問全局變量*/ returnc;}局部變量a、b、c、y、z在進(jìn)入它所在的函數(shù)時(shí)獲得內(nèi)存空間,退出函數(shù)時(shí)釋放內(nèi)存空間,也從側(cè)面說明局部變量只在定義它的函數(shù)內(nèi)有效。而全局變量x則在整個(gè)程序執(zhí)行過程中都有效。任務(wù)準(zhǔn)備6.靜態(tài)變量由于局部變量在退出定義它的函數(shù)后內(nèi)存空間被釋放,當(dāng)再次調(diào)用并進(jìn)入該函數(shù)時(shí),局部變量會(huì)被重新分配內(nèi)存空間,無法保留上一次的值。如果希望局部變量能保持上一次的值,可以將它定義成靜態(tài)變量,一般的定義格式如下:static數(shù)據(jù)類型變量名;任務(wù)準(zhǔn)備例如在函數(shù)add()中定義一個(gè)靜態(tài)變量c并初始化為0,再在主函數(shù)中調(diào)用它,實(shí)現(xiàn)求1+2+3+4+5的值,代碼如下:#include<stdio.h>intadd(inta);intmain(){ inti,z; /*局部變量*/ for(i=1;i<=5;i++) z=add(i); printf("z=%d\n",z); return0;}intadd(inta){ staticintc=0; /*靜態(tài)變量c*/ c=c+a; returnc;}上述代碼輸出的結(jié)果為“z=15”,說明函數(shù)add()并沒有在每次調(diào)用時(shí)將靜態(tài)變量c初始化為0,而是將c的值進(jìn)行了累加。任務(wù)準(zhǔn)備7.參數(shù)的傳值與傳址當(dāng)函數(shù)的參數(shù)是基本數(shù)據(jù)類型(整型、字符型、浮點(diǎn)型、結(jié)構(gòu)體類型)時(shí),屬于傳值調(diào)用。傳值調(diào)用是將實(shí)際參數(shù)的值復(fù)制一份給對(duì)應(yīng)的形式參數(shù),當(dāng)在函數(shù)中修改形式參數(shù)的值,并不會(huì)影響原實(shí)際參數(shù)的值。可以認(rèn)為傳值調(diào)用的實(shí)際參數(shù)是原件,而形式參數(shù)是實(shí)際參數(shù)的復(fù)印件,在復(fù)印件上亂畫并不會(huì)影響到原件。當(dāng)函數(shù)的參數(shù)是數(shù)組類型、指針類型時(shí),屬于傳址調(diào)用,也稱傳地址調(diào)用。傳址調(diào)用是將實(shí)際參數(shù)的地址復(fù)制一份給對(duì)應(yīng)的形式參數(shù),在函數(shù)中就可以通過副本地址來修改原地址中的數(shù)據(jù)。可以認(rèn)為傳址調(diào)用的實(shí)際參數(shù)是一把鑰匙(地址),函數(shù)調(diào)用時(shí)會(huì)配一把相同的鑰匙給形式參數(shù),通過鑰匙副本也能打開相同的房間,修改房間內(nèi)的數(shù)據(jù)。綜上所述,傳值調(diào)用無法修改原數(shù)據(jù),但傳址調(diào)用能修改原數(shù)據(jù)。任務(wù)準(zhǔn)備【實(shí)例3】定義一個(gè)傳值函數(shù)和一個(gè)傳址函數(shù),在main()函數(shù)中調(diào)用它們,輸出調(diào)用前后的數(shù)據(jù)值。voidchangeVar(inta,intb);voidchangeArray(inta[]);intmain(){ intx=5,y=10,z[5]={8,4,9,12,7}; printf("調(diào)用函數(shù)前:x=%d,y=%d\n",x,y); changeVar(x,y); printf("調(diào)用函數(shù)后:x=%d,y=%d\n",x,y); printf("調(diào)用函數(shù)前:z[0]=%d,z[1]=%d\n",z[0],z[1]); changeArray(z); printf("調(diào)用函數(shù)后:z[0]=%d,z[1]=%d\n",z[0],z[1]); return0;}voidchangeVar(inta,intb) /*傳值*/{ a=a+1; b=b+1; printf("在函數(shù)中:a=%d,b=%d\n",a,b);}voidchangeArray(inta[]) /*傳址*/{ a[0]=a[0]+1; a[1]=a[1]+1;}任務(wù)準(zhǔn)備編譯運(yùn)行的結(jié)果如圖5-3所示:函數(shù)changeVar()的參數(shù)都是傳值,在該函數(shù)中修改了形式參數(shù)a和b的值,但并不影響實(shí)際參數(shù)x和y的值。函數(shù)changeArray()的參數(shù)是一維數(shù)組,是傳址調(diào)用,在該函數(shù)中通過下標(biāo)就能修改數(shù)組中的數(shù)據(jù)。圖5-3傳值調(diào)用和傳址調(diào)用任務(wù)準(zhǔn)備任務(wù)實(shí)施Part
1Part
2Part
3任務(wù)描述任務(wù)實(shí)施【任務(wù)1】定義一個(gè)函數(shù),用冒泡排序法對(duì)一維整型數(shù)組進(jìn)行排序。在main()函數(shù)中調(diào)用該函數(shù)對(duì)給定數(shù)組排序,然后輸出排序后的數(shù)組。1.任務(wù)分析本任務(wù)考查函數(shù)的定義、聲明和調(diào)用。凡是對(duì)一維數(shù)組進(jìn)行操作的函數(shù),都需要將數(shù)組的首地址和元素個(gè)數(shù)作為參數(shù)代入。因此,對(duì)一維整型數(shù)組進(jìn)行冒泡排序的函數(shù)應(yīng)該代入數(shù)組名和元素個(gè)數(shù),通過數(shù)組名和下標(biāo)可以實(shí)現(xiàn)數(shù)組元素的交換。函數(shù)不需要返回任何數(shù)據(jù),返回類型是void。由于經(jīng)常要輸出整個(gè)一維整型數(shù)組,所以也可以定義函數(shù)專用于輸出一維整型數(shù)組的元素。任務(wù)實(shí)施2.任務(wù)實(shí)現(xiàn)實(shí)現(xiàn)代碼如下,請(qǐng)將代碼中空白處補(bǔ)充完整。#include<stdio.h>voidmaopao(inta[],intn);/*聲明函數(shù)*/voidshuchu(inta[],intn);intmain(){ inttemp,i,j;inta[10]={76,66,23,19,-5,44,33,22,9,13}; printf("排序前:"); shuchu(a,10); maopao(a,10); /*調(diào)用函數(shù)進(jìn)行排序*/ printf("\n排序后:"); shuchu(a,10); return0;}voidmaopao(inta[],intn)/*定義函數(shù)*/{ inti,j,temp; for(i=0;i<
;i++) for(j=0;j<
;j++) if(
) { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; }}voidshuchu(inta[],intn)/*定義函數(shù)*/{ inti; for(i=0;i<10;i++) printf("%d,",a[i]);}任務(wù)實(shí)施編譯運(yùn)行的結(jié)果如圖5-4所示:圖5-4冒泡排序任務(wù)實(shí)施3.任務(wù)總結(jié)冒泡排序的原理在項(xiàng)目四的任務(wù)1中有詳細(xì)的介紹,在此不再贅述。自定義函數(shù)maopao()之所以能交換數(shù)組元素,實(shí)現(xiàn)對(duì)一維數(shù)組排序,是因?yàn)楹瘮?shù)將數(shù)組首地址作為參數(shù)傳入,通過數(shù)組的首地址和下標(biāo),可以修改數(shù)組中的任何數(shù)據(jù)。同理,調(diào)用函數(shù)對(duì)二維數(shù)組進(jìn)行操作時(shí),需要代入二維數(shù)組名、行數(shù)和列數(shù)。二維數(shù)組名代表第0行的首地址,通過行下標(biāo)和列下標(biāo)就能訪問二維數(shù)組中的每一個(gè)元素。任務(wù)實(shí)施【任務(wù)2】定義函數(shù)統(tǒng)計(jì)某整數(shù)中指定數(shù)字出現(xiàn)的次數(shù),并在main()函數(shù)中調(diào)用。1.任務(wù)分析統(tǒng)計(jì)某整數(shù)中指定數(shù)字出現(xiàn)的次數(shù),如整數(shù)-21252中數(shù)字2的出現(xiàn)的次數(shù)為3。當(dāng)整數(shù)或數(shù)字為負(fù)數(shù)時(shí),難以判斷數(shù)字是否相等,因此需要將兩個(gè)數(shù)都變成正數(shù)。本任務(wù)中分別采用條件表達(dá)式和庫函數(shù)abs()來實(shí)現(xiàn)。判斷整數(shù)21252中是否出現(xiàn)數(shù)字2的思路是:從個(gè)位開始循環(huán)取出21252中的每個(gè)數(shù)字,再與數(shù)字2比較,如果相等就將數(shù)字2出現(xiàn)的次數(shù)加1。每次循環(huán)取出的個(gè)位數(shù)字、剩下的數(shù)和出現(xiàn)的次數(shù)如表5-1所示:表5-1循環(huán)詳情表第幾次循環(huán)取出的個(gè)位剩下整數(shù)是否等于22出現(xiàn)的次數(shù)第1次22125是1第2次5212否1第3次221是2第4次12否2第5次20是3循環(huán)結(jié)束
任務(wù)實(shí)施2.任務(wù)實(shí)現(xiàn)實(shí)現(xiàn)代碼如下,請(qǐng)將代碼中空白處補(bǔ)充完整。#include<stdio.h>#include<math.h>intcishu(intx,intsz); /*聲明函數(shù)*/intmain03(){ intx,sz,y; printf("請(qǐng)輸入一個(gè)整數(shù)和一個(gè)數(shù)字,以空格隔開:"); scanf("%d%d",&x,&sz); y=cishu(
,
); /*調(diào)用函數(shù)*/ printf("數(shù)字%d在整數(shù)%d中出現(xiàn)的次數(shù)是:%d\n",sz,x,y); return0;}intcishu(intx,intsz) /*定義函數(shù)*/{ /*gw存儲(chǔ)每次從x中取出的個(gè)位上的數(shù)字,cs用于記錄sz出現(xiàn)的次數(shù)*/ intgw,cs=0; /*先把x和sz都變成絕對(duì)值*/ sz=(sz>0?sz:-1*sz);/*條件表達(dá)式*/ x=abs(x); /*調(diào)用庫函數(shù)求絕對(duì)值*/ /*循環(huán)取出x個(gè)位上的數(shù)字*/ while(x!=0) { gw=
;/*取出x的個(gè)位數(shù)字*/ /*個(gè)位gw與數(shù)字sz相等,次數(shù)加1*/ if(
) cs++; x=
;/*去掉x的個(gè)位數(shù)字*/ } returncs;}任務(wù)實(shí)施編譯運(yùn)行的結(jié)果如圖5-5所示:圖5-5統(tǒng)計(jì)數(shù)字出現(xiàn)的次數(shù)任務(wù)實(shí)施3.任務(wù)總結(jié)統(tǒng)計(jì)某整數(shù)中指定數(shù)字出現(xiàn)次數(shù)的cishu()函數(shù),需要代入某整數(shù)和數(shù)字,返回?cái)?shù)字出現(xiàn)的次數(shù)。循環(huán)取出某整數(shù)的個(gè)位數(shù)字后,再通過除以10去除個(gè)位數(shù)字,直到該整數(shù)等于0為止。這種逐個(gè)取出個(gè)位數(shù)字的算法很高效且實(shí)用。任務(wù)準(zhǔn)備任務(wù)實(shí)施任務(wù)描述任務(wù)2用函數(shù)解決數(shù)學(xué)難題任務(wù)描述有到這樣一道數(shù)學(xué)題:求滿足abcd*e=fghi的式子,其中a~i是1~9之間的數(shù)字且各不相等,即一個(gè)四位數(shù)乘以一個(gè)數(shù)字等于另一個(gè)四位數(shù)。與數(shù)學(xué)的解法不同,程序更傾向于用循環(huán)、比較和判斷來解決問題,通過多次嘗試和比較來找出答案。初學(xué)者容易犯的錯(cuò)誤是用九層嵌套循環(huán)來拼湊出符合等式的數(shù),這樣做雖然能得出答案,但不推薦這種“蠻力”式編程。在學(xué)習(xí)了函數(shù)的定義和調(diào)用后,我們可以將解這道數(shù)學(xué)題的過程進(jìn)行模塊(或功能)劃分,將每個(gè)模塊(或功能)編寫成函數(shù),這樣就能將問題大大簡化。任務(wù)準(zhǔn)備任務(wù)實(shí)施Part
1Part
2Part
3任務(wù)描述任務(wù)準(zhǔn)備由題目“a~i是1~9之間的數(shù)字且各不相等”的要求可得出如下限制條件:(1)四位數(shù)abcd和fghi不能包含數(shù)字e。(2)四位數(shù)abcd和fghi不能包含0。(3)四位數(shù)abcd中不能有重復(fù)的數(shù)字,四位數(shù)fghi中不能有重復(fù)的數(shù)字。(4)四位數(shù)abcd與fghi不能有相同的數(shù)字。經(jīng)過上述分析,可以從解這道數(shù)學(xué)題的過程中劃分出三個(gè)小功能,定義成如下三個(gè)函數(shù):(1)判斷一個(gè)四位數(shù)是否包含某個(gè)數(shù)字的函數(shù)。判斷四位數(shù)abcd是否包含數(shù)字e、判斷四位數(shù)abcd是否包含0,都可以調(diào)用該函數(shù)。(2)判斷一個(gè)四位數(shù)中是否有重復(fù)數(shù)字的函數(shù)。(3)判斷一個(gè)四位數(shù)是否與另一個(gè)四位數(shù)有相同數(shù)字的函數(shù)。完成上述三個(gè)函數(shù)的編寫,基本就能解出這道數(shù)學(xué)題的答案了。任務(wù)準(zhǔn)備1.判斷一個(gè)四位數(shù)是否包含某個(gè)數(shù)字的函數(shù)定義判斷一個(gè)四位數(shù)是否包含某個(gè)數(shù)字的函數(shù),需要將這個(gè)四位數(shù)、某個(gè)數(shù)字作為參數(shù)代入,返回“是”或“否”。在C語言中,一般用“1”代表“是”,用“0”代表“否”,因此,該函數(shù)的返回類型應(yīng)該是int。在實(shí)現(xiàn)該函數(shù)代碼時(shí),初學(xué)者最先想的就是分別求出這個(gè)四位數(shù)的個(gè)、十、百、千位上的數(shù)字,再與代入的數(shù)字比較,判斷它們是否相等,就知道這個(gè)四位數(shù)是否包含某個(gè)數(shù)字。這種做法不推薦,因?yàn)橄麓涡枰袛嘁粋€(gè)九位數(shù)是否包含某個(gè)數(shù)字時(shí),就需要定義9個(gè)變量存儲(chǔ)各位上的數(shù)字,它們與代入的數(shù)字比較的條件也變得很繁瑣。簡而言之,這種做法不具有通用性。任務(wù)準(zhǔn)備可以考慮將函數(shù)功能設(shè)計(jì)成判斷一個(gè)多位數(shù)是否包含某個(gè)數(shù)字,實(shí)現(xiàn)的思路是:從多位數(shù)的個(gè)位開始,循環(huán)依次取出該多位數(shù)中的數(shù)字與某數(shù)字比較,只要有相等的情況出現(xiàn),就說明該多位數(shù)包含某個(gè)數(shù)字。函數(shù)的定義如下:intbaohan(intabcd,inte){ intgw,flag=0; /*假定flag=0代表不包含*/ while(abcd>0){ gw=abcd%10; /*取出個(gè)位*/ abcd=abcd/10; /*去掉個(gè)位*/ if(gw==e){ flag=1; /*flag=1代表包含*/ break; /*跳出while循環(huán)*/ }
} returnflag;}任務(wù)準(zhǔn)備在baohan()函數(shù)的實(shí)現(xiàn)代碼中,將變量flag賦值為0,用于假定多位數(shù)abcd不包含數(shù)字e。在while循環(huán)中,每次將abcd切割成個(gè)位數(shù)字和其余部分,個(gè)位數(shù)字存于變量gw中,其余部分仍然存到abcd中。每次循環(huán)都將個(gè)位數(shù)字gw與數(shù)字e比較,如果它們相等就說明這個(gè)多位數(shù)包含數(shù)字e,將變量flag修改為1,并跳出循環(huán)。如果gw始終沒有與e相等,循環(huán)會(huì)在abcd等于0時(shí)結(jié)束。循環(huán)結(jié)束后,變量flag的值為1就代表包含,為0就代表不包含。以判斷多位數(shù)123456是否包含數(shù)字2為例,循環(huán)過程中各變量的值如表5-2所示:表5-2baohan()函數(shù)的循環(huán)過程第幾次循環(huán)變量gw變量abcd數(shù)字egw與e變量flag第1次6123452不等0第2次512342不等0第3次41232不等0第4次3122不等0第5次212相等1跳出循環(huán)
任務(wù)準(zhǔn)備【實(shí)例1】輸入一個(gè)多位數(shù)和一個(gè)數(shù)字,定義并調(diào)用自定義函數(shù),判斷多位數(shù)是否包含輸入的數(shù)字。#include<stdio.h>intbaohan(intabcd,inte); /*聲明函數(shù)*/intmain(){ intx,y,f; printf("請(qǐng)輸入一個(gè)多位整數(shù)和一個(gè)數(shù)字:"); scanf("%d,%d",&x,&y); f=baohan(x,y);/*調(diào)用函數(shù)*/ if(f==1) printf("多位數(shù)%d包含數(shù)字%d\n",x,y); else printf("多位數(shù)%d不包含數(shù)字%d\n",x,y); return1;}intbaohan(intabcd,inte) /*定義函數(shù)*/{ intgw,flag=0; while(abcd>0) { gw=abcd%10; if(gw==e) { flag=1; break; } abcd=abcd/10; } returnflag;}任務(wù)準(zhǔn)備編譯運(yùn)行,分別輸入“123456,2”和“123456,7”的結(jié)果如圖5-6所示:函數(shù)baohan()只返回1或0來代表包含或不包含,而不是以文字形式輸出是否包含,體現(xiàn)了函數(shù)功能應(yīng)該單一的原則。而它能判斷一個(gè)多位數(shù)是否包含某個(gè)數(shù)字,而不僅僅局限于四位數(shù),體現(xiàn)了函數(shù)應(yīng)該具有通用性的原則。圖5-6判斷多位數(shù)是否包含數(shù)字任務(wù)準(zhǔn)備2.判斷一個(gè)四位數(shù)中是否有重復(fù)數(shù)字的函數(shù)定義判斷一個(gè)四位數(shù)中是否有重復(fù)數(shù)字的函數(shù),需要將這個(gè)四位數(shù)作為參數(shù)代入,返回“1”或“0”,分別代表“有重復(fù)數(shù)字”和“無重復(fù)數(shù)字”,因此返回類型應(yīng)該是int。同樣,將此函數(shù)拓展成判斷一個(gè)多位整數(shù)中是否有重復(fù)數(shù)字,實(shí)現(xiàn)的思路是:循環(huán)多次,每次將多位數(shù)切割成個(gè)位數(shù)字和其余部分,調(diào)用自定義函數(shù)baohan()判斷其余部分是否包含個(gè)位數(shù)字,直到其余部分變成0時(shí)循環(huán)結(jié)束,或其余部分包含個(gè)位數(shù)字時(shí)跳出循環(huán)。任務(wù)準(zhǔn)備函數(shù)的定義如下:intchongfu(intabcd){ intgw,flag=0;/*先假定沒有重復(fù)數(shù)字,用flag=0表示*/ while(abcd>0) { gw=abcd%10; /*將多位數(shù)切割成個(gè)位和其余部分*/ abcd=abcd/10; if(baohan(abcd,gw)==1) /*調(diào)用另一個(gè)自定義函數(shù)baohan()*/ { flag=1;/*其余部分包含個(gè)位數(shù)字,說明有重復(fù)數(shù)字*/ break; } } returnflag;}任務(wù)準(zhǔn)備在chongfu()函數(shù)的實(shí)現(xiàn)代碼中,將變量flag賦值為0,用于假定多位數(shù)abcd中沒有重復(fù)數(shù)字。在while循環(huán)中,每次將abcd切割成個(gè)位數(shù)字和其余部分,個(gè)位數(shù)字存于變量gw中,其余部分仍然存到abcd中。每次循環(huán)都調(diào)用自定義函數(shù)baohao()判斷其余部分abcd是否包含個(gè)位數(shù)字gw,如果包含就說明多位數(shù)中有重復(fù)數(shù)字,將變量flag修改為1,并跳出循環(huán)。如果始終沒有出現(xiàn)包含的情況,循環(huán)會(huì)在abcd等于0時(shí)結(jié)束。循環(huán)結(jié)束后,變量flag的值為1就代表多位數(shù)有重復(fù)數(shù)字,為0就代表沒有重復(fù)數(shù)字。以判斷多位數(shù)12324567是否有重復(fù)數(shù)字為例,循環(huán)過程中各變量的值如表5-3所示:表5-3chongfu()函數(shù)的循環(huán)過程第幾次循環(huán)變量gw變量abcdabcd是否包含gw變量flag第1次71232456否0第2次6123245否0第3次512324否0第4次41232否0第5次2123是1跳出循環(huán)
任務(wù)準(zhǔn)備【實(shí)例2】輸入一個(gè)多位數(shù),定義并調(diào)用自定義函數(shù),判斷輸入的多位數(shù)中是否有重復(fù)數(shù)字。#include<stdio.h>intbaohan(intabcd,inte);intchongfu(intabcd);intmain(){ intx,f; printf("請(qǐng)輸入一個(gè)多位整數(shù):"); scanf("%d",&x); f=chongfu(x); if(f==1) printf("多位數(shù)%d中有重復(fù)數(shù)字",x); else printf("多位數(shù)%d中沒有重復(fù)數(shù)字",x); return1;}/*判斷多位數(shù)abcd中是否有重復(fù)的數(shù)字*/intchongfu(intabcd){ intgw,flag=0; while(abcd>0) { gw=abcd%10; abcd=abcd/10; if(baohan(abcd,gw)==1) { flag=1; break; } } returnflag;}任務(wù)準(zhǔn)備編譯運(yùn)行,分別輸入“12324567”和“1234567”的結(jié)果如圖5-7所示:本實(shí)例中省略了函數(shù)baohan()的定義代碼。在定義chongfu()函數(shù)時(shí)調(diào)用了另一個(gè)自定義函數(shù)baohan(),充分說明各函數(shù)之間可以相互調(diào)用,但唯獨(dú)main()函數(shù)不能被其他函數(shù)調(diào)用。圖5-7判斷一個(gè)多位數(shù)是否有重復(fù)數(shù)字任務(wù)準(zhǔn)備3.判斷兩個(gè)四位數(shù)是否有相同的數(shù)字的函數(shù)定義判斷兩個(gè)四位數(shù)是否有相同的數(shù)字的函數(shù),需要將兩個(gè)四位數(shù)作為參數(shù)代入,返回“1”或“0”,分別代表“有相同數(shù)字”和“無相同數(shù)字”,因此返回類型應(yīng)該是int。將此函數(shù)拓展成判斷兩個(gè)多位整數(shù)是否有相同的數(shù)字,實(shí)現(xiàn)的思路是:假設(shè)兩個(gè)多位整數(shù)分別是abcd和fghi,循環(huán)多次,每次取出fghi中的一個(gè)數(shù)字,調(diào)用自定義函數(shù)baohan()判斷abcd是否包含這個(gè)數(shù)字,直到取完fghi中的數(shù)字時(shí)循環(huán)結(jié)束,或abcd包含fghi中的某個(gè)數(shù)字時(shí)跳出循環(huán)。任務(wù)準(zhǔn)備函數(shù)的定義如下:intxiangtong(intabcd,intfghi){ intgw,flag=0; /*先假定abcd不包含fghi中的數(shù)字*/ while(fghi>0) { gw=fghi%10; /*取出fghi中的個(gè)位數(shù)字*/ fghi=fghi/10; /*去掉fghi中的個(gè)位數(shù)字*/ if(baohan(abcd,gw)==1) /*abcd包含fghi中的數(shù)字*/ { flag=1; break; } } returnflag;}任務(wù)準(zhǔn)備在xiangtong()函數(shù)的實(shí)現(xiàn)代碼中,將變量flag賦值為0,用于假定多位數(shù)abcd不包含多位數(shù)fghi中的數(shù)字。在while循環(huán)中,每次將fghi切割成個(gè)位數(shù)字和其余部分,個(gè)位數(shù)字存于變量gw中,其余部分仍然存到fghi中。每次循環(huán)都調(diào)用自定義函數(shù)baohao()判斷abcd是否包含個(gè)位數(shù)字gw,如果包含就說明兩個(gè)多位數(shù)有相同數(shù)字,將變量flag修改為1,并跳出循環(huán)。如果始終沒有出現(xiàn)包含的情況,循環(huán)會(huì)在fghi等于0時(shí)結(jié)束。循環(huán)結(jié)束后,變量flag的值為1就代表兩個(gè)多位數(shù)有相同的數(shù)字,為0就代表沒有相同數(shù)字。以判斷多位數(shù)123456與456789是否有重復(fù)數(shù)字為例,循環(huán)過程中各變量的值如表5-4所示:表5-4chongfu()函數(shù)的循環(huán)過程第幾次循環(huán)變量gw變量fghi變量abcdabcd是否包含gw變量flag第1次945678123456否0第2次84567123456否0第3次7456123456否0第4次645123456是1跳出循環(huán)
任務(wù)準(zhǔn)備【實(shí)例3】輸入兩個(gè)多位數(shù),定義并調(diào)用自定義函數(shù),判斷兩個(gè)多位數(shù)是否有相同數(shù)字。#include<stdio.h>intbaohan(intabcd,inte);intxiangtong(intabcd,intfghi);intmain(){ intx,y,f; printf("請(qǐng)輸入兩個(gè)多位整數(shù):"); scanf("%d,%d",&x,&y); f=xiangtong(x,y); if(f==1) printf("%d與%d有相同的數(shù)字",x,y); else printf("%d與%d沒有相同的數(shù)字",x,y); return1;}/*判斷兩個(gè)多位數(shù)abcd與fghi是否有相同的數(shù)字*/intxiangtong(intabcd,intfghi){ intgw,flag=0; while(fghi>0) { gw=fghi%10; fghi=fghi/10; if(baohan(abcd,gw)==1) { flag=1; break; } } returnflag;}任務(wù)準(zhǔn)備編譯運(yùn)行,分別輸入“123456,456789”和“123456,7890”的結(jié)果如圖5-8所示:本實(shí)例中也省略了函數(shù)baohan()的定義代碼。從實(shí)例2和實(shí)例3可以看出,自定義函數(shù)chongfu()和xiangtong()依賴調(diào)用函數(shù)baohan()提供的基礎(chǔ)功能,使自身的實(shí)現(xiàn)代碼變得簡單易懂。圖5-8判斷兩個(gè)多位數(shù)是否有相同數(shù)字任務(wù)準(zhǔn)備任務(wù)實(shí)施Part
1Part
2Part
3任務(wù)描述任務(wù)實(shí)施【任務(wù)1】a~i是1~9中的各不相同的數(shù)字,且滿足式子abcd*e=fghi。請(qǐng)輸出滿足要求的式子。1.任務(wù)分析在任務(wù)準(zhǔn)備中,我們已經(jīng)將解決這道數(shù)學(xué)題會(huì)用到的三個(gè)功能寫成了函數(shù),它們分別是判斷一個(gè)四位數(shù)是否包含某個(gè)數(shù)字的函數(shù)、判斷一個(gè)四位數(shù)中是否有重復(fù)數(shù)字的函數(shù)、判斷兩個(gè)四位數(shù)是否有相同的數(shù)字的函數(shù)。接下來梳理解決這道數(shù)學(xué)題的思路,通過調(diào)用這三個(gè)功能,得出解決問題的流程。任務(wù)實(shí)施解決該題的流程如下:(1)讓abcd取每一個(gè)四位數(shù)的值,即從1000遞增到9999。(2)如果abcd包含0,或者abcd中有重復(fù)數(shù)字,說明abcd不符合題意的要求,舍棄當(dāng)前值后,取下一個(gè)值。(3)如果abcd不包含0且abcd中沒有重復(fù)數(shù)字,則讓e的值從2遞增到9。(4)如果abcd包含數(shù)字e,說明e不符合題意的要求,舍棄e的當(dāng)前值后,取下一個(gè)值。(5)如果abcd不包含數(shù)字e,則計(jì)算它們的乘積,用fghi存儲(chǔ)。(6)根據(jù)題意的要求,如果乘積fghi滿足以下五個(gè)條件,則找到了滿足題意的一個(gè)式子。必須滿足的五個(gè)條件如下:①fghi是一個(gè)四位數(shù)。②fghi不包含0。③fghi不包含數(shù)字e。④fghi中沒有重復(fù)數(shù)字。⑤fghi與abcd沒有相同數(shù)字。任務(wù)實(shí)施根據(jù)上述流程分析,得出解決這道數(shù)學(xué)題的偽代碼如下:intabcd,e,fghi;for(abcd=1000;abcd<10000;abcd++){ if(abcd中有重復(fù)數(shù)字||abcd包含0) continue; /*不再向下執(zhí)行,直接跳轉(zhuǎn)到abcd++*/ for(e=2;e<10;e++) /*e取值2~9*/ { if(abcd包含數(shù)字e) continue; /*跳轉(zhuǎn)到e++*/ fghi=abcd*e; if(fghi是四位數(shù)&&fghi不包含0 &&fghi不包含數(shù)字e&&fghi中沒有重復(fù)數(shù)字&&fghi與abcd沒有相同數(shù)字) /*輸出滿足條件的等式*/ }}任務(wù)實(shí)施2.任務(wù)實(shí)現(xiàn)實(shí)現(xiàn)代碼如下,請(qǐng)將代碼中空白處補(bǔ)充完整。#include<stdio.h>intbaohan(intabcd,inte);intchongfu(intabcd);intxiangtong(intabcd,intfghi);intmain(){ intabcd,e,fghi; for(abcd=1000;abcd<10000;abcd++) { if(chongfu(abcd)==1||baohan(abcd,0)==1) /*不再向下執(zhí)行,直接跳轉(zhuǎn)到abcd++*/
; for(e=2;e<10;e++) { if(
) continue; /*跳轉(zhuǎn)到e++*/ fghi=abcd*e;/*求出乘積*/ if(fghi<10000&&baohan(fghi,0)==
&&baohan(fghi,e)==
&&chongfu(fghi)==
&&xiangtong(abcd,fghi)==
) printf("%d*%d=%d\n",abcd,e,fghi); } } return0;}/*函數(shù)baohan()、chongfu()、xiangtong()代碼省略*/任務(wù)實(shí)施編譯運(yùn)行的結(jié)果如圖5-9所示:圖5-9滿足abcd*e=fghi的式子任務(wù)實(shí)施3.任務(wù)總結(jié)本任務(wù)列出了式子abcd*e=fghi中,乘數(shù)abcd、乘數(shù)e和乘積fghi必須滿足的要求,針對(duì)它們的每一個(gè)取值都進(jìn)行嚴(yán)格的檢測(cè),只有通過檢測(cè)才能進(jìn)入下一個(gè)環(huán)節(jié)的運(yùn)算。continue語句的使用極大地簡化的程序,當(dāng)abcd或e不滿足要求時(shí),調(diào)用continue語句便不再往下執(zhí)行,而是跳轉(zhuǎn)到abcd++或e++,舍棄當(dāng)前取值,直接進(jìn)入下一個(gè)取值的判斷。返回值為int類型的函數(shù),可以當(dāng)作一個(gè)int類型的變量使用。因此,類似“baohan(fghi,0)==0”或“chongfu(abcd)==1”的關(guān)系表達(dá)式的用法與“x==1”是一樣的,可以將函數(shù)baohan()和chongfu()直接當(dāng)作變量使用。任務(wù)準(zhǔn)備任務(wù)實(shí)施任務(wù)描述任務(wù)3用遞歸函數(shù)解決特殊問題任務(wù)描述大家小時(shí)候或許聽過這樣一個(gè)故事:“從前有座山,山上有座廟,廟里有個(gè)老和尚。老和尚他說:從前有座山,山上有座廟,廟里有個(gè)老和尚。老和尚他說:……”這個(gè)故事的特點(diǎn)是故事里的人物講述了故事本身,這導(dǎo)致故事陷入無限循環(huán)之中,永遠(yuǎn)講不完。那么這個(gè)故事在什么情況下會(huì)結(jié)束呢?如果在第n個(gè)的故事中講故事的老和尚去世了,那么這個(gè)故事就可以完結(jié)了。像這種故事中講述了故事本身的現(xiàn)象,我們稱之為“遞歸”。同樣,如果一個(gè)函數(shù)在定義時(shí)調(diào)用了它本身,我們稱這種函數(shù)為“遞歸函數(shù)”。本任務(wù)將會(huì)定義一些遞歸函數(shù)解決一些特殊類型的問題,例如求某數(shù)的階乘、求第幾個(gè)Fibonacci數(shù)、解決猴子吃桃的問題等。通過這些例子,向?qū)W生講解遞歸函數(shù)的定義、遞歸函數(shù)的使用條件,讓學(xué)生掌握使用遞歸函數(shù)解決特殊問題的能力。任務(wù)準(zhǔn)備任務(wù)實(shí)施Part
1Part
2Part
3任務(wù)描述任務(wù)準(zhǔn)備遞歸是一個(gè)在數(shù)學(xué)和計(jì)算機(jī)科學(xué)領(lǐng)域常用的概念,它指的是在定義函數(shù)或解決問題時(shí),該函數(shù)會(huì)調(diào)用自身作為一個(gè)參數(shù)或者解決方案的一部分。這個(gè)過程可以被視為一種自我參照的方式,通過不斷調(diào)用自身來處理越來越小的部分,直到最終能夠完全解決問題。遞歸的一個(gè)關(guān)鍵特性是它可以避免重復(fù)計(jì)算,因?yàn)樗偸且蕾囉谥暗挠?jì)算結(jié)果。任務(wù)準(zhǔn)備1.遞歸函數(shù)的定義函數(shù)在定義的時(shí)候直接或間接調(diào)用了它本身,這種函數(shù)叫遞歸函數(shù)。正整數(shù)n的階乘指1*2*3*…*n的結(jié)果,用n!來表示,記作:n!=1*2*3*…*n。將求n!的過程定義成一個(gè)遞歸函數(shù),代碼如下:intjc(intn){ intsum; if(n==1) sum=1; else sum=n*jc(n-1);/*調(diào)用函數(shù)本身*/ returnsum;}從jc()函數(shù)的函數(shù)體代碼可以看出,該函數(shù)在定義時(shí)調(diào)用了它本身,符合遞歸函數(shù)的定義。任務(wù)準(zhǔn)備【實(shí)例1】分別輸入一個(gè)正整數(shù),定義并調(diào)用普通函數(shù)和遞歸函數(shù),求該整數(shù)的階乘并輸出。#include<stdio.h>intjc(intn);intjc02(intn);intmain(){ intx,s; printf("請(qǐng)輸入一個(gè)12以內(nèi)的正整數(shù):"); scanf("%d",&x); s=jc02(x); printf("普通函數(shù)求階乘:%d!=%d\n",x,s); printf("請(qǐng)輸入一個(gè)12以內(nèi)的正整數(shù):"); scanf("%d",&x); s=jc(x); printf("遞歸函數(shù)求階乘:%d!=%d\n",x,s) return1;}/*定義遞歸函數(shù),用于求n的階乘*/intjc(intn){ intsum; if(n==1) sum=1; else sum=n*jc(n-1); returnsum;}/*定義普通函數(shù),用于求n的階乘*/intjc02(intn){ intsum=1,i; for(i=1;i<=n;i++) sum=sum*i; returnsum;}任務(wù)準(zhǔn)備編譯運(yùn)行,分別輸入“5”和“6”的結(jié)果圖5-10所示:從結(jié)果圖可以看出,調(diào)用普通函數(shù)和遞歸函數(shù)求階乘,都能得出正確的結(jié)果。普通函數(shù)jc02()采用循環(huán)求n!。將循環(huán)變量i從1遞增到n,每次循環(huán)都將i的取值乘到sum上,循環(huán)結(jié)束就能得到1*2*3*…*n的值。遞歸函數(shù)jc()采用遞推方法將求n!變成求(n-1)!,因?yàn)閚!=n*(n-1)!。以此類推可得遞推關(guān)系:n!→(n-1)!→(n-2)!→…→2!→1!。而1的階乘很容易得出結(jié)果是1,經(jīng)過回歸運(yùn)算能得到2!=2、3!=6……最終能求得n!的值。圖5-10求階乘任務(wù)準(zhǔn)備2.遞歸函數(shù)的推導(dǎo)能用遞歸函數(shù)解決的問題,必須滿足以下兩個(gè)條件:(1)問題規(guī)??梢赞D(zhuǎn)化。即可以將原問題的求解轉(zhuǎn)化成一個(gè)新問題的求解,兩個(gè)問題解決方法一樣,只是規(guī)模大小不同的情況。如將求n!轉(zhuǎn)化成求(n-1)!,再將求(n-1)!轉(zhuǎn)化成求(n-2)!,直至最后轉(zhuǎn)化成求1!。(2)有明確的結(jié)束遞歸的條件。即在適當(dāng)?shù)臈l件下可以結(jié)束遞歸調(diào)用。如當(dāng)n為1時(shí)得出1!為1,遞歸調(diào)用在這里結(jié)束,經(jīng)過回歸運(yùn)算就能依次求出2!、3!…n!。根據(jù)遞歸問題的適用條件,可以歸納出定義遞歸函數(shù)的兩個(gè)步驟:(1)尋找遞歸表達(dá)式。尋找遞歸表達(dá)式就是找出問題規(guī)模轉(zhuǎn)化的式子。以求n!為例,f(n)表示求n的階乘,遞歸表達(dá)式為f(n)=n*f(n-1),該式子成功將求n!轉(zhuǎn)化為求(n-1)!,使將求n!最終轉(zhuǎn)化成求1!成為可能。(2)尋找遞歸的出口。尋找遞歸的出口就是找出遞歸的結(jié)束條件。以求n!為例,當(dāng)n等于1時(shí)得出1!等于1,遞歸調(diào)用在這里結(jié)束。任務(wù)準(zhǔn)備經(jīng)過上述兩個(gè)步驟的分析,最終可以得出求解遞歸問題的遞推公式,該公式簡明地給出了遞歸表達(dá)式和遞歸的結(jié)束條件。以f(n)表示求n的階乘,遞推公式如下:斐波那契(Fibonacci)數(shù)列是指這樣一個(gè)數(shù)列:1,1,2,3,5,8,13,21,34,55,89……這個(gè)數(shù)列的前兩項(xiàng)均定義為1,從第3項(xiàng)開始,每一項(xiàng)都等于前兩項(xiàng)之和。由Fibonacci數(shù)列的規(guī)律可以推斷出它的遞推公式如下:任務(wù)準(zhǔn)備由Fibonacci數(shù)列的遞推公式可以輕松寫出對(duì)應(yīng)遞歸函數(shù)的定義:intfibo(intn){ ints; if(n==1||n==2) s=1; /*第1、2項(xiàng)都是1*/ else s=fibo(n-1)+fibo(n-2); /*從第3項(xiàng)開始,每項(xiàng)是前2項(xiàng)之和*/ returns;}任務(wù)準(zhǔn)備【實(shí)例2】分別輸入一個(gè)正整數(shù)n,定義并調(diào)用普通函數(shù)和遞歸函數(shù),求第n個(gè)Fibonacci數(shù)并輸出。#include<stdio.h>intfibo(intn);intfibo02(intn);intmain(){ intn,result; printf("請(qǐng)輸入一個(gè)正整數(shù):"); scanf("%d",&n); result=fibo02(n); printf("普通函數(shù)求得第%d個(gè)Fibonacci數(shù)是:%d\n",n,result); printf("請(qǐng)輸入一個(gè)正整數(shù):"); scanf("%d",&n); result=fibo(n); printf("遞歸函數(shù)求得第%d個(gè)Fibonacci數(shù)是:%d\n",n,result); return1;}intfibo(intn){ ints; if(n==1||n==2) s=1; else s=fibo(n-1)+fibo(n-2); returns;}任務(wù)準(zhǔn)備intfibo02(intn){ intx1,x2,x,i; if(n==1||n==2) x=1; else{ x1=1; x2=1; for(i=3;i<=n;i++) {/*第3項(xiàng)開始,每項(xiàng)是前2項(xiàng)之和*/ x=x1+x2; x1=x2; x2=x; } } returnx;}圖5-11求第n個(gè)Fibonacci數(shù)編譯運(yùn)行,分別輸入“6”和“7”的結(jié)果如圖5-11所示:任務(wù)準(zhǔn)備與Fibonacci數(shù)列(1,1,2,3,5,8,13,21,34,55,89……)對(duì)比,實(shí)例2的輸出結(jié)果是正確的。普通函數(shù)fibo02()中定義x、x1和x2三個(gè)變量,分別存儲(chǔ)第n項(xiàng)和它前面兩項(xiàng)的數(shù)值。當(dāng)n等于1或2時(shí),第n項(xiàng)的數(shù)值為1。當(dāng)n大于等于3時(shí),第n項(xiàng)的數(shù)值為前面兩項(xiàng)的數(shù)值之和,用循環(huán)來實(shí)現(xiàn),在循環(huán)過程中不斷修改x、x1和x2的值。遞歸函數(shù)fibo()的實(shí)現(xiàn)思路就比較簡單,當(dāng)n等于1或2時(shí),第n項(xiàng)的數(shù)值為1。當(dāng)n大于等于3時(shí),將求第n項(xiàng)轉(zhuǎn)化為求第n-1項(xiàng)和第n-2項(xiàng)的和,即將求fibo(n)轉(zhuǎn)化為求fibo(n-1)+fibo(n-2)之和。從此,對(duì)于n大于等于3的某項(xiàng),都可以遞推成求前面兩項(xiàng)之和,直到最終轉(zhuǎn)化成若干個(gè)fibo(1)和fibo(2)之和,就能輕易得出某項(xiàng)的數(shù)值,再經(jīng)過回歸運(yùn)算,算出fibo(n)的結(jié)果。任務(wù)準(zhǔn)備3.遞歸函數(shù)的執(zhí)行過程一個(gè)遞歸函數(shù)的調(diào)用過程類似于多個(gè)函數(shù)的嵌套的調(diào)用,只不過調(diào)用函數(shù)和被調(diào)用函數(shù)是同一個(gè)函數(shù)。遞歸函數(shù)調(diào)用的執(zhí)行過程分為兩個(gè)階段:(1)遞推階段:從原問題出發(fā),按遞歸公式遞推,最終達(dá)到遞歸終止條件。(2)回歸階段:按遞歸終止條件求出結(jié)果,逆向逐步代入遞歸公式,回歸到原問題求解。為了保證遞歸函數(shù)的正確執(zhí)行,系統(tǒng)需設(shè)立一個(gè)工作棧。棧(stack)是一種運(yùn)算受限的線性表,限定僅在表尾進(jìn)行插入和刪除操作的線性表。棧的一端被稱為棧頂,另一端稱為棧底。向一個(gè)棧插入新元素又稱作進(jìn)棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個(gè)棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。棧內(nèi)數(shù)據(jù)遵循“先進(jìn)后出,后進(jìn)先出”的原則,即最先存入棧里的數(shù)據(jù)最后才能取出來。由于棧的大小不是無限的,所以,遞歸調(diào)用的次數(shù)過多會(huì)導(dǎo)致棧溢出,程序無法正常運(yùn)行。可以把棧比作一個(gè)杯子,杯口的大小剛好能放入一個(gè)雞蛋,把雞蛋比作棧內(nèi)的元素。因此,每次向杯里放入雞蛋時(shí),該雞蛋都處于最頂端;而對(duì)于杯里的雞蛋來說,最先放進(jìn)去的雞蛋最后才能取出,遵循“先進(jìn)后出,后進(jìn)先出”的原則;將雞蛋放入杯里叫“入?!?,從杯里取出雞蛋叫“出?!薄H蝿?wù)準(zhǔn)備以在某函數(shù)中執(zhí)行遞歸調(diào)用為例,將該函數(shù)稱為A,它執(zhí)行的遞歸函數(shù)稱為B,那么在A中遞歸調(diào)用B的內(nèi)部執(zhí)行過程如下:(1)運(yùn)行開始時(shí),首先為遞歸調(diào)用建立一個(gè)工作棧,其結(jié)構(gòu)包括參數(shù)、局部變量和返回地址。(2)每次執(zhí)行遞歸調(diào)用B之前,把函數(shù)A的參數(shù)、局部變量的當(dāng)前值以及調(diào)用后的返回地址壓棧;(3)每次遞歸調(diào)用B結(jié)束后,將棧頂元素出棧,使相應(yīng)的參數(shù)和局部變量恢復(fù)為調(diào)用前的值,然后轉(zhuǎn)向返回地址指定的位置繼續(xù)執(zhí)行函數(shù)A。任務(wù)準(zhǔn)備以用遞歸函數(shù)jc()求6!的執(zhí)行過程為例,先是將求jc(6)遞推到求jc(1),在得出jc(1)的結(jié)果為1后,又回歸進(jìn)行代入運(yùn)算,求出jc(6)的結(jié)果。該遞歸函數(shù)的遞推和回歸過程、出入棧情況如表5-5所示:表5-5jc(6)的執(zhí)行過程jc(6)過程階段出入棧=>6*jc(5)遞推參數(shù)6、局部變量s、jc(6)地址入棧=>6*(5*jc(4))遞推參數(shù)5、局部變量s、jc(5)地址入棧=>6*(5*(4*jc(3)))遞推參數(shù)4、局部變量s、jc(4)地址入棧=>6*(5*(4*(3*jc(2))))遞推參數(shù)3、局部變量s、jc(3)地址入棧=>6*(5*(4*(3*(2*jc(1)))))遞推參數(shù)2、局部變量s、jc(2)地址入棧=>6*(5*(4*(3*(2*1))))
=>6*(5*(4*(3*2)))回歸參數(shù)2、局部變量s、jc(2)地址出棧=>6*(5*(4*6))回歸參數(shù)3、局部變量s、jc(3)地址出棧=>6*(5*24)回歸參數(shù)4、局部變量s、jc(4)地址出棧=>6*120回歸參數(shù)5、局部變量s、jc(5)地址出棧=>720回歸參數(shù)6、局部變量s、jc(6)地址出棧任務(wù)準(zhǔn)備2010年上映的美國電影《盜夢(mèng)空間》,是一部萊昂納多·迪卡普里奧主演的科幻電影,它所講述的故事情節(jié)就類似遞歸函數(shù)的執(zhí)行過程。該電影的主線情節(jié)是:日本大亨齋藤給男主角柯布(萊昂納多·迪卡普里奧飾)的任務(wù)是,讓競爭對(duì)手的繼承人費(fèi)舍放棄繼承家業(yè),那樣齋藤的公司就可以生存下去。所以柯布需要做的就是把“放棄繼承家業(yè)”這種想法植入到費(fèi)舍的潛意識(shí)中。為了在夢(mèng)中向費(fèi)舍的潛意識(shí)植入放棄繼承家業(yè)的想法,柯布和他的團(tuán)隊(duì)一共創(chuàng)造了四層夢(mèng)境,即夢(mèng)中還有夢(mèng)。第一層夢(mèng)是在城市街道上,柯布團(tuán)隊(duì)遭遇追殺,在大巴即將墜河時(shí),他們創(chuàng)造并進(jìn)入了第二層夢(mèng)境;第二層夢(mèng)是在賓館里,在這里柯布團(tuán)隊(duì)創(chuàng)造并進(jìn)入了第三層夢(mèng)境;第三層夢(mèng)是在雪地堡壘里,在這里柯布團(tuán)隊(duì)又創(chuàng)造并進(jìn)入了第四層夢(mèng)境;第四層夢(mèng)來到奇幻海灘,在這層夢(mèng)里成功將想法植入到費(fèi)舍的潛意識(shí)中;最后柯布團(tuán)隊(duì)從一層層的夢(mèng)境中醒來,回到了現(xiàn)實(shí)世界。在電影《盜夢(mèng)空間》中,每次進(jìn)入一層夢(mèng)境,就好比調(diào)用了一次遞歸函數(shù)。當(dāng)在第一層夢(mèng)中無法達(dá)到植入潛意識(shí)的目的時(shí),將實(shí)現(xiàn)該目的遞推給第二層夢(mèng),以此類推,直到遞推到第四層夢(mèng)時(shí)才實(shí)現(xiàn)了植入潛意識(shí)的目的。于是,從夢(mèng)境中層層回歸,最終回到現(xiàn)實(shí)世界。因此,可以認(rèn)為電影《盜夢(mèng)空間》拍出了遞歸函數(shù)的執(zhí)行過程。任務(wù)準(zhǔn)備任務(wù)實(shí)施Part
1Part
2Part
3任務(wù)描述任務(wù)實(shí)施【任務(wù)1】分別定義普通函數(shù)和遞歸函數(shù),解決猴子吃桃問題:猴子第1天摘了若干個(gè)桃子,當(dāng)即吃了一半,還不解饞,又多吃了一個(gè);第2天,吃剩下的桃子的一半,還不過癮,又多吃了一個(gè);以后每天都吃前一天剩下的一半多一個(gè),到第10天想再吃時(shí),只剩下一個(gè)桃子了。問第1天共摘了多少個(gè)桃子?。任務(wù)實(shí)施1.任務(wù)分析定義函數(shù)時(shí),首先要分析函數(shù)帶入什么參數(shù),返回什么類型。針對(duì)猴子吃桃的問題,不應(yīng)該于僅局限于求第1天有多少桃子,而應(yīng)該定義函數(shù)求第幾天有多少桃子。因此,本任務(wù)中的自定義函數(shù)應(yīng)該代入第幾天作為參數(shù),返回這一天的桃子數(shù)量。由于第10天桃子數(shù)量為1,定義普通函數(shù)tz02()求第n天的桃子數(shù)量時(shí),可以利用循環(huán)從第9天遞減到第n天,每天的桃子數(shù)量都等于前一天桃子數(shù)量加1后乘以2。由于第10天桃子數(shù)量為1,定義遞歸函數(shù)tz()求第n天的桃子數(shù)量時(shí),遞推公式有如下兩種:tz(n)=2*(tz(n+1)+1) ……①tz(n)=tz(n-1)/2-1 ……②那么哪一個(gè)遞推公式是正確的呢?前面有提到,定義遞歸函數(shù)時(shí)有兩個(gè)步驟:尋找遞歸表達(dá)式和遞歸出口。公式①和②都是遞歸表達(dá)式,而遞歸的出口是n=10時(shí)桃子數(shù)量為1,n的取值范圍是1≤n<10。遞推公式②只會(huì)讓n的取值越推越小,無法到達(dá)遞歸的出口n=10;而遞推公式①會(huì)讓n的取值越推越大,當(dāng)n=10時(shí)得到結(jié)果1,結(jié)束遞歸調(diào)用。因此,遞推公式①才是正確的遞歸表達(dá)式。任務(wù)實(shí)施2.任務(wù)實(shí)現(xiàn)本任務(wù)實(shí)現(xiàn)代碼如下,請(qǐng)將代碼中空白處補(bǔ)充完整。#include<stdio.h>inttz(intn);inttz02(intn);intmain(){ intn,s; printf("第幾天(1-10):"); scanf("%d",&n); s=tz02(n); printf("普通函數(shù)求得第%d天的桃子數(shù)量是:%d\n",n,s); printf("第幾天(1-10):"); scanf("%d",&n); s=tz(n); printf("遞歸函數(shù)求得第%d天的桃子數(shù)量是:%d\n",n,s); return1;}/*遞歸函數(shù),求第n天的桃子數(shù)量*/inttz(intn) /*n屬于1~10*/{ intsum; if(n==10) sum=; /*第10天只剩下1個(gè)*/ else sum=; returnsum;}任務(wù)實(shí)施/*普通函數(shù),求第n天的桃子數(shù)量*/inttz02(intn){ inti,sum=1; for(i=;i>=;i--) { sum=2*(sum+1); } returnsum;}編譯運(yùn)行的結(jié)果如圖5-12所示:圖5-12猴子吃桃問題任務(wù)實(shí)施3.任務(wù)總結(jié)在用遞歸算法解決問題時(shí),必須確定遞推公式和遞歸出口條件。遞推公式或許有多種寫法,但只有能遞推到遞歸出口條件的公式才能作為遞歸表達(dá)式。任務(wù)準(zhǔn)備任務(wù)實(shí)施任務(wù)描述任務(wù)4使用主函數(shù)的參數(shù)任務(wù)描述在C語言中,main()函數(shù)是程序的入口,是程序執(zhí)行的第一個(gè)函數(shù)。main()函數(shù)的參數(shù)可以用來接收外部傳入的數(shù)據(jù),這些數(shù)據(jù)可以用來控制程序的執(zhí)行,或者用來傳遞程序所需要的參數(shù)。本任務(wù)會(huì)介紹Windows自帶的命令以及命令
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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年消防設(shè)施設(shè)備租賃與維護(hù)合同6篇
- 2025年辦公室照明設(shè)計(jì)服務(wù)合同
- 基于2025年度業(yè)務(wù)的房地產(chǎn)買賣合同2篇
- 2025年醫(yī)療保健心理咨詢合同
- 2025年農(nóng)業(yè)龍頭企業(yè)扶持基金抵押協(xié)議
- 2025年培訓(xùn)方案制作合同
- 二零二五年酒店場地租賃及活動(dòng)策劃合同樣本6篇
- 2025版鋁單板原材料供應(yīng)鏈采購合同4篇
- 2025年度羅馬柱工程古建筑遺址考古合同4篇
- 2025年暑期輔導(dǎo)班安全保障與教師職責(zé)協(xié)議8篇
- 專題6.8 一次函數(shù)章末測(cè)試卷(拔尖卷)(學(xué)生版)八年級(jí)數(shù)學(xué)上冊(cè)舉一反三系列(蘇科版)
- GB/T 4167-2024砝碼
- 老年人視覺障礙護(hù)理
- 《腦梗塞的健康教育》課件
- 《請(qǐng)柬及邀請(qǐng)函》課件
- 中小銀行上云趨勢(shì)研究分析報(bào)告
- 遼寧省普通高中2024-2025學(xué)年高一上學(xué)期12月聯(lián)合考試語文試題(含答案)
- 青海原子城的課程設(shè)計(jì)
- 常州大學(xué)《新媒體文案創(chuàng)作與傳播》2023-2024學(xué)年第一學(xué)期期末試卷
- 麻醉蘇醒期躁動(dòng)患者護(hù)理
- 英語雅思8000詞匯表
評(píng)論
0/150
提交評(píng)論