版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第7章用函數實現模塊化程序設計2023/9/13第7章用函數實現模塊化程序設計第7章用函數實現模塊化程序設計2023/8/1第7章用函數實17.1為什么要用函數問題:如果程序的功能比較多,規(guī)模比較大,把所有代碼都寫在main函數中,就會使主函數變得龐雜、頭緒不清,閱讀和維護變得困難有時程序中要多次實現某一功能,就需要多次重復編寫實現此功能的程序代碼,這使程序冗長,不精煉第7章用函數實現模塊化程序設計7.1為什么要用函數問題:第7章用函數實現模塊化程序設計27.1為什么要用函數解決的方法:用模塊化程序設計的思路采用“組裝”的辦法簡化程序設計的過程事先編好一批實現各種不同功能的函數把它們保存在函數庫中,需要時直接用第7章用函數實現模塊化程序設計7.1為什么要用函數解決的方法:用模塊化程序設計的思路第7章37.1為什么要用函數解決的方法:用模塊化程序設計的思路函數就是功能每一個函數用來實現一個特定的功能函數的名字應反映其代表的功能第7章用函數實現模塊化程序設計7.1為什么要用函數解決的方法:用模塊化程序設計的思路第7章47.1為什么要用函數在設計一個較大的程序時,往往把它分為若干個程序模塊,每一個模塊包括一個或多個函數,每個函數實現一個特定的功能C程序可由一個主函數和若干個其他函數構成主函數調用其他函數,其他函數也可以互相調用同一個函數可以被一個或多個函數調用任意多次第7章用函數實現模塊化程序設計7.1為什么要用函數在設計一個較大的程序時,往往把它分為若干57.1為什么要用函數mainabcfghdeie第7章用函數實現模塊化程序設計7.1為什么要用函數mainabcfghdeie第7章用函數67.1為什么要用函數可以使用庫函數可以使用自己編寫的函數在程序設計中要善于利用函數,可以減少重復編寫程序段的工作量,同時可以方便地實現模塊化的程序設計第7章用函數實現模塊化程序設計7.1為什么要用函數可以使用庫函數第7章用函數實現模塊化程序77.1為什么要用函數例7.1輸出以下的結果,用函數調用實現。******************Howdoyoudo!******************第7章用函數實現模塊化程序設計7.1為什么要用函數例7.1輸出以下的結果,用函數調用實現87.1為什么要用函數解題思路:在輸出的文字上下分別有一行“*”號,顯然不必重復寫這段代碼,用一個函數print_star來實現輸出一行“*”號的功能。再寫一個print_message函數來輸出中間一行文字信息用主函數分別調用這兩個函數第7章用函數實現模塊化程序設計7.1為什么要用函數解題思路:第7章用函數實現模塊化程序設計9#include<stdio.h>intmain(){voidprint_star();voidprint_message();
print_star();print_message();
print_star();return0;}voidprint_star(){printf(“******************\n”);}voidprint_message(){printf(“Howdoyoudo!\n”);}輸出16個*輸出一行文字第7章用函數實現模塊化程序設計#include<stdio.h>voidprint_s10#include<stdio.h>intmain(){voidprint_star();voidprint_message();
print_star();print_message();
print_star();return0;}voidprint_star(){printf(“******************\n”);}voidprint_message(){printf(“Howdoyoudo!\n”);}聲明函數定義函數第7章用函數實現模塊化程序設計#include<stdio.h>voidprint_s11#include<stdio.h>intmain(){voidprint_star();voidprint_message();
print_star();print_message();
print_star();return0;}voidprint_star(){printf(“******************\n”);}voidprint_message(){printf(“Howdoyoudo!\n”);}第7章用函數實現模塊化程序設計#include<stdio.h>voidprint_s12說明:(1)一個C程序由一個或多個程序模塊組成,每一個程序模塊作為一個源程序文件。對較大的程序,一般不希望把所有內容全放在一個文件中,而是將它們分別放在若干個源文件中,由若干個源程序文件組成一個C程序。這樣便于分別編寫、分別編譯,提高調試效率。一個源程序文件可以為多個C程序共用。第7章用函數實現模塊化程序設計說明:第7章用函數實現模塊化程序設計13說明:(2)一個源程序文件由一個或多個函數以及其他有關內容(如預處理指令、數據聲明與定義等)組成。一個源程序文件是一個編譯單位,在程序編譯時是以源程序文件為單位進行編譯的,而不是以函數為單位進行編譯的。第7章用函數實現模塊化程序設計說明:第7章用函數實現模塊化程序設計14說明:(3)C程序的執(zhí)行是從main函數開始的,如果在main函數中調用其他函數,在調用后流程返回到main函數,在main函數中結束整個程序的運行。第7章用函數實現模塊化程序設計說明:第7章用函數實現模塊化程序設計15說明:(4)所有函數都是平行的,即在定義函數時是分別進行的,是互相獨立的。一個函數并不從屬于另一個函數,即函數不能嵌套定義。函數間可以互相調用,但不能調用main函數。main函數是被操作系統(tǒng)調用的。第7章用函數實現模塊化程序設計說明:第7章用函數實現模塊化程序設計16說明:(5)從用戶使用的角度看,函數有兩種。庫函數,它是由系統(tǒng)提供的,用戶不必自己定義而直接使用它們。應該說明,不同的C語言編譯系統(tǒng)提供的庫函數的數量和功能會有一些不同,當然許多基本的函數是共同的。用戶自己定義的函數。它是用以解決用戶專門需要的函數。第7章用函數實現模塊化程序設計說明:第7章用函數實現模塊化程序設計17說明:(6)從函數的形式看,函數分兩類。①無參函數。無參函數一般用來執(zhí)行指定的一組操作。無參函數可以帶回或不帶回函數值,但一般以不帶回函數值的居多。②有參函數。在調用函數時,主調函數在調用被調用函數時,通過參數向被調用函數傳遞數據,一般情況下,執(zhí)行被調用函數時會得到一個函數值,供主調函數使用。第7章用函數實現模塊化程序設計說明:第7章用函數實現模塊化程序設計187.2怎樣定義函數7.2.1為什么要定義函數7.2.2定義函數的方法第7章用函數實現模塊化程序設計7.2怎樣定義函數7.2.1為什么要定義函數第7章用函數197.2.1為什么要定義函數C語言要求,在程序中用到的所有函數,必須“先定義,后使用”指定函數名字、函數返回值類型、函數實現的功能以及參數的個數與類型,將這些信息通知編譯系統(tǒng)。第7章用函數實現模塊化程序設計7.2.1為什么要定義函數C語言要求,在程序中用到的所有函207.2.1為什么要定義函數指定函數的名字,以便以后按名調用指定函數類型,即函數返回值的類型指定函數參數的名字和類型,以便在調用函數時向它們傳遞數據指定函數的功能。這是最重要的,這是在函數體中解決的第7章用函數實現模塊化程序設計7.2.1為什么要定義函數指定函數的名字,以便以后按名調用217.2.1為什么要定義函數對于庫函數,程序設計者只需用#include指令把有關的頭文件包含到本文件模塊中即可程序設計者需要在程序中自己定義想用的而庫函數并沒有提供的函數第7章用函數實現模塊化程序設計7.2.1為什么要定義函數對于庫函數,程序設計者只需用#i227.2.2定義函數的方法1.定義無參函數定義無參函數的一般形式為:類型名函數名(void)
{函數體}類型名函數名(){函數體}包括聲明部分和語句部分包括聲明部分和語句部分第7章用函數實現模塊化程序設計7.2.2定義函數的方法1.定義無參函數類型名函數名(237.2.2定義函數的方法1.定義無參函數定義無參函數的一般形式為:類型名函數名(void)
{函數體}類型名函數名(){函數體}指定函數值的類型指定函數值的類型第7章用函數實現模塊化程序設計7.2.2定義函數的方法1.定義無參函數類型名函數名(247.2.2定義函數的方法2.定義有參函數定義有參函數的一般形式為:類型名函數名(形式參數表列){函數體}第7章用函數實現模塊化程序設計7.2.2定義函數的方法2.定義有參函數第7章用函數實現模257.2.2定義函數的方法3.定義空函數定義空函數的一般形式為:類型名函數名(){}先用空函數占一個位置,以后逐步擴充好處:程序結構清楚,可讀性好,以后擴充新功能方便,對程序結構影響不大第7章用函數實現模塊化程序設計7.2.2定義函數的方法3.定義空函數第7章用函數實現模267.3調用函數7.3.1函數調用的形式7.3.2函數調用時的數據傳遞7.3.3函數調用的過程7.3.4函數的返回值第7章用函數實現模塊化程序設計7.3調用函數7.3.1函數調用的形式第7章用函數實現模塊277.3.1函數調用的形式函數調用的一般形式為:函數名(實參表列)如果是調用無參函數,則“實參表列”可以沒有,但括號不能省略如果實參表列包含多個實參,則各參數間用逗號隔開第7章用函數實現模塊化程序設計7.3.1函數調用的形式函數調用的一般形式為:第7章用函數實287.3.1函數調用的形式按函數調用在程序中出現的形式和位置來分,可以有以下3種函數調用方式:1.函數調用語句把函數調用單獨作為一個語句如printf_star();這時不要求函數帶回值,只要求函數完成一定的操作第7章用函數實現模塊化程序設計7.3.1函數調用的形式按函數調用在程序中出現的形式和位置來297.3.1函數調用的形式按函數調用在程序中出現的形式和位置來分,可以有以下3種函數調用方式:2.函數表達式函數調用出現在另一個表達式中如c=max(a,b);這時要求函數帶回一個確定的值以參加表達式的運算第7章用函數實現模塊化程序設計7.3.1函數調用的形式按函數調用在程序中出現的形式和位置來307.3.1函數調用的形式按函數調用在程序中出現的形式和位置來分,可以有以下3種函數調用方式:3.函數參數函數調用作為另一函數調用時的實參如m=max(a,max(b,c));其中max(b,c)是一次函數調用,它的值作為max另一次調用的實參第7章用函數實現模塊化程序設計7.3.1函數調用的形式按函數調用在程序中出現的形式和位置來317.3.2函數調用時的數據傳遞1.形式參數和實際參數在調用有參函數時,主調函數和被調用函數之間有數據傳遞關系定義函數時函數名后面的變量名稱為“形式參數”(簡稱“形參”)主調函數中調用一個函數時,函數名后面參數稱為“實際參數”(簡稱“實參”)實際參數可以是常量、變量或表達式第7章用函數實現模塊化程序設計7.3.2函數調用時的數據傳遞1.形式參數和實際參數第7章327.3.2函數調用時的數據傳遞2.實參和形參間的數據傳遞在調用函數過程中,系統(tǒng)會把實參的值傳遞給被調用函數的形參或者說,形參從實參得到一個值該值在函數調用期間有效,可以參加被調函數中的運算第7章用函數實現模塊化程序設計7.3.2函數調用時的數據傳遞2.實參和形參間的數據傳遞337.3.2函數調用時的數據傳遞例7.2輸入兩個整數,要求輸出其中值較大者。要求用函數來找到大數。解題思路:(1)函數名應是見名知意,今定名為max(2)由于給定的兩個數是整數,返回主調函數的值(即較大數)應該是整型(3)max函數應當有兩個參數,以便從主函數接收兩個整數,因此參數的類型應當是整型第7章用函數實現模塊化程序設計7.3.2函數調用時的數據傳遞例7.2輸入兩個整數,347.3.2函數調用時的數據傳遞先編寫max函數:intmax(intx,inty){intz;z=x>y?x:y;return(z);}第7章用函數實現模塊化程序設計7.3.2函數調用時的數據傳遞先編寫max函數:第7章用函357.3.2函數調用時的數據傳遞在max函數上面,再編寫主函數#include<stdio.h>intmain(){intmax(intx,inty);inta,b,c;printf(“twointegernumbers:");scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“maxis%d\n”,c);}實參可以是常量、變量或表達式第7章用函數實現模塊化程序設計7.3.2函數調用時的數據傳遞在max函數上面,再編寫主函367.3.2函數調用時的數據傳遞
c=max(a,b);(main函數)intmax(intx,inty)(max函數){intz;z=x>y?x:y;return(z);}第7章用函數實現模塊化程序設計7.3.2函數調用時的數據傳遞c=max(a,b377.3.3函數調用的過程在定義函數中指定的形參,在未出現函數調用時,它們并不占內存中的存儲單元。在發(fā)生函數調用時,函數max的形參被臨時分配內存單元。2a3bxy23實參形參第7章用函數實現模塊化程序設計7.3.3函數調用的過程在定義函數中指定的形參,在未出現函387.3.3函數調用的過程調用結束,形參單元被釋放實參單元仍保留并維持原值,沒有改變如果在執(zhí)行一個被調用函數時,形參的值發(fā)生改變,不會改變主調函數的實參的值2a3bxy23實參形參第7章用函數實現模塊化程序設計7.3.3函數調用的過程調用結束,形參單元被釋放2a3bx397.3.4.函數的返回值通常,希望通過函數調用使主調函數能得到一個確定的值,這就是函數值(函數的返回值)函數的返回值是通過函數中的return語句獲得的。一個函數中可以有一個以上的return語句,執(zhí)行到哪一個return語句,哪一個就起作用return語句后面的括號可以不要第7章用函數實現模塊化程序設計7.3.4.函數的返回值通常,希望通過函數調用使主調函數能407.3.4.函數的返回值通常,希望通過函數調用使主調函數能得到一個確定的值,這就是函數值(函數的返回值)(2)函數值的類型。應當在定義函數時指定函數值的類型第7章用函數實現模塊化程序設計7.3.4.函數的返回值通常,希望通過函數調用使主調函數能417.3.4.函數的返回值通常,希望通過函數調用使主調函數能得到一個確定的值,這就是函數值(函數的返回值)(3)在定義函數時指定的函數類型一般應該和return語句中的表達式類型一致如果函數值的類型和return語句中表達式的值不一致,則以函數類型為準第7章用函數實現模塊化程序設計7.3.4.函數的返回值通常,希望通過函數調用使主調函數能427.3.4.函數的返回值例7.3將例7.2稍作改動,將在max函數中定義的變量z改為float型。函數返回值的類型與指定的函數類型不同,分析其處理方法。解題思路:如果函數返回值的類型與指定的函數類型不同,按照賦值規(guī)則處理。第7章用函數實現模塊化程序設計7.3.4.函數的返回值例7.3將例7.2稍作改動,將在m43#include<stdio.h>intmain(){intmax(floatx,floaty);floata,b;intc;scanf("%f,%f,",&a,&b);c=max(a,b);printf("maxis%d\n",c);return0;}intmax(floatx,floaty){floatz;z=x>y?x:y;return(z);}1.52.62.62變?yōu)?第7章用函數實現模塊化程序設計#include<stdio.h>1.52.62.62變?yōu)?47.4對被調用函數的聲明和函數原型在一個函數中調用另一個函數需要具備如下條件:(1)被調用函數必須是已經定義的函數(是庫函數或用戶自己定義的函數)(2)如果使用庫函數,應該在本文件開頭加相應的#include指令(3)如果使用自己定義的函數,而該函數的位置在調用它的函數后面,應該聲明第7章用函數實現模塊化程序設計7.4對被調用函數的聲明和函數原型在一個函數中調用另一個函數457.4對被調用函數的聲明和函數原型例7.4輸入兩個實數,用一個函數求出它們之和。解題思路:用add函數實現。首先要定義add函數,它為float型,它應有兩個參數,也應為float型。特別要注意的是:要對add函數進行聲明。第7章用函數實現模塊化程序設計7.4對被調用函數的聲明和函數原型例7.4輸入兩個實467.4對被調用函數的聲明和函數原型分別編寫add函數和main函數,它們組成一個源程序文件main函數的位置在add函數之前在main函數中對add函數進行聲明第7章用函數實現模塊化程序設計7.4對被調用函數的聲明和函數原型分別編寫add函數和mai47#include<stdio.h>intmain(){floatadd(floatx,floaty);floata,b,c;printf("Pleaseenteraandb:");scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f\n",c);return0;}floatadd(floatx,floaty){floatz;z=x+y;return(z);}求兩個實數之和,函數值也是實型對add函數聲明第7章用函數實現模塊化程序設計#include<stdio.h>floatadd(fl48#include<stdio.h>intmain(){floatadd(floatx,floaty);floata,b,c;printf("Pleaseenteraandb:");scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f\n",c);return0;}floatadd(floatx,floaty){floatz;z=x+y;return(z);}只差一個分號第7章用函數實現模塊化程序設計#include<stdio.h>floatadd(fl49#include<stdio.h>intmain(){floatadd(floatx,floaty);floata,b,c;printf("Pleaseenteraandb:");scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f\n",c);return0;}floatadd(floatx,floaty){floatz;z=x+y;return(z);}定義add函數調用add函數第7章用函數實現模塊化程序設計#include<stdio.h>floatadd(fl50函數原型的一般形式有兩種:如floatadd(floatx,floaty);floatadd(float,float);原型說明可以放在文件的開頭,這時所有函數都可以使用此函數第7章用函數實現模塊化程序設計函數原型的一般形式有兩種:第7章用函數實現模塊化程序設計517.5函數的嵌套調用C語言的函數定義是互相平行、獨立的即函數不能嵌套定義但可以嵌套調用函數即調用一個函數的過程中,又可以調用另一個函數第7章用函數實現模塊化程序設計7.5函數的嵌套調用C語言的函數定義是互相平行、獨立的第7527.5函數的嵌套調用main函數①調用a函數⑨結束a函數③調用b函數⑦②⑧b函數⑤④⑥第7章用函數實現模塊化程序設計7.5函數的嵌套調用main函數①調用a函數⑨結束a函數③537.5函數的嵌套調用例7.5輸入4個整數,找出其中最大的數。用函數的嵌套調用來處理。解題思路:main中調用max4函數,找4個數中最大者max4中再調用max2,找兩個數中的大者max4中多次調用max2,可找4個數中的大者,然后把它作為函數值返回main函數main函數中輸出結果第7章用函數實現模塊化程序設計7.5函數的嵌套調用例7.5輸入4個整數,找出其中54#include<stdio.h>intmain(){intmax4(inta,intb,intc,intd);inta,b,c,d,max;printf(“4intergernumbers:");scanf("%d%d%d%d",&a,&b,&c,&d);max=max4(a,b,c,d);printf("max=%d\n",max);return0;}主函數對max4
函數聲明第7章用函數實現模塊化程序設計#include<stdio.h>主函數對max4函數聲55#include<stdio.h>intmain(){intmax4(inta,intb,intc,intd);inta,b,c,d,max;printf(“4intergernumbers:");scanf("%d%d%d%d",&a,&b,&c,&d);max=max4(a,b,c,d);printf("max=%d\n",max);return0;}主函數輸入4個整數第7章用函數實現模塊化程序設計#include<stdio.h>主函數輸入4個整數第7章56#include<stdio.h>intmain(){intmax4(inta,intb,intc,intd);inta,b,c,d,max;printf(“4intergernumbers:");scanf("%d%d%d%d",&a,&b,&c,&d);max=max4(a,b,c,d);printf("max=%d\n",max);return0;}主函數調用后肯定是4個數中最大者輸出最大者第7章用函數實現模塊化程序設計#include<stdio.h>主函數調用后肯定是4個數57intmax4(inta,intb,intc,intd){intmax2(inta,intb);intm;m=max2(a,b);m=max2(m,c);m=max2(m,d);return(m);}max4函數對max2
函數聲明第7章用函數實現模塊化程序設計intmax4(inta,intb,intc,int58intmax4(inta,intb,intc,intd){intmax2(inta,intb);intm;m=max2(a,b);m=max2(m,c);m=max2(m,d);return(m);}max4函數a,b中較大者a,b,c中較大者a,b,c,d中最大者第7章用函數實現模塊化程序設計intmax4(inta,intb,intc,int59intmax4(inta,intb,intc,intd){intmax2(inta,intb);intm;m=max2(a,b);m=max2(m,c);m=max2(m,d);return(m);}max4函數intmax2(inta,intb){if(a>=b)returna;elsereturnb;}max2函數找a,b中較大者第7章用函數實現模塊化程序設計intmax4(inta,intb,intc,int60intmax4(inta,intb,intc,intd){intmax2(inta,intb);intm;m=max2(a,b);m=max2(m,c);m=max2(m,d);return(m);}max4函數intmax2(inta,intb){if(a>=b)returna;elsereturnb;}max2函數return(a>b?a:b);第7章用函數實現模塊化程序設計intmax4(inta,intb,intc,int61intmax4(inta,intb,intc,intd){intmax2(inta,intb);intm;m=max2(a,b);m=max2(m,c);m=max2(m,d);return(m);}max4函數intmax2(inta,intb){
return(a>b?a:b);}第7章用函數實現模塊化程序設計intmax4(inta,intb,intc,int62intmax4(inta,intb,intc,intd){intmax2(inta,intb);intm;m=max2(a,b);m=max2(m,c);m=max2(m,d);return(m);}max4函數m=max2(max2(a,b),c);intmax2(inta,intb){
return(a>b?a:b);}第7章用函數實現模塊化程序設計intmax4(inta,intb,intc,int63intmax4(inta,intb,intc,intd){intmax2(inta,intb);intm;m=max2(a,b);m=max2(m,c);m=max2(m,d);return(m);}max4函數m=max2(max2(max2(a,b),c),d);intmax2(inta,intb){
return(a>b?a:b);}第7章用函數實現模塊化程序設計intmax4(inta,intb,intc,int64intmax4(inta,intb,intc,intd){intmax2(inta,intb);intm;m=max2(a,b);m=max2(m,c);m=max2(m,d);return(m);}max4函數ruturnmax2(max2(max2(a,b),c),d);intmax2(inta,intb){
return(a>b?a:b);}第7章用函數實現模塊化程序設計intmax4(inta,intb,intc,int65intmax4(inta,intb,intc,intd){intmax2(inta,intb);ruturnmax2(max2(max2(a,b),c),d);}intmax2(inta,intb){return(a>b?a:b);}#include<stdio.h>intmain(){……max=max4(a,b,c,d);……}第7章用函數實現模塊化程序設計intmax4(inta,intb,intc,int667.6函數的遞歸調用在調用一個函數的過程中又出現直接或間接地調用該函數本身,稱為函數的遞歸調用。C語言的特點之一就在于允許函數的遞歸調用。第7章用函數實現模塊化程序設計7.6函數的遞歸調用在調用一個函數的過程中又出現直接或間接67f2函數調用f1函數7.6函數的遞歸調用intf(intx){inty,z;z=f(y);return(2*z);}f函數調用f函數f1函數調用f2函數應使用if語句控制結束調用直接調用本函數間接調用本函數第7章用函數實現模塊化程序設計f2函數7.6函數的遞歸調用intf(intx)687.6函數的遞歸調用例7.6有5個學生坐在一起問第5個學生多少歲?他說比第4個學生大2歲問第4個學生歲數,他說比第3個學生大2歲問第3個學生,又說比第2個學生大2歲問第2個學生,說比第1個學生大2歲最后問第1個學生,他說是10歲請問第5個學生多大第7章用函數實現模塊化程序設計7.6函數的遞歸調用例7.6有5個學生坐在一起第7章697.6函數的遞歸調用解題思路:要求第5個年齡,就必須先知道第4個年齡要求第4個年齡必須先知道第3個年齡第3個年齡又取決于第2個年齡第2個年齡取決于第1個年齡每個學生年齡都比其前1個學生的年齡大2第7章用函數實現模塊化程序設計7.6函數的遞歸調用解題思路:第7章用函數實現模塊化程序設707.6函數的遞歸調用解題思路:age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10第7章用函數實現模塊化程序設計7.6函數的遞歸調用解題思路:第7章用函數實現模塊化程序設71age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10age(2)=12age(3)=14age(4)=16age(5)=18回溯階段遞推階段第7章用函數實現模塊化程序設計age(5)age(4)age(3)72age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10age(2)=12age(3)=14age(4)=16age(5)=18回溯階段遞推階段結束遞歸的條件第7章用函數實現模塊化程序設計age(5)age(4)age(3)73#include<stdio.h>intmain(){intage(intn);printf("NO.5,age:%d\n",age(5));return0;}
intage(intn){intc;if(n==1)c=10;elsec=age(n-1)+2;return(c);}第7章用函數實現模塊化程序設計#include<stdio.h>第7章用函數實現模塊化程74age(5)輸出age(5)mainc=age(4)+2age函數n=5c=age(3)+2age函數n=4c=age(1)+2age函數n=2c=age(2)+2age函數n=3c=10age函數n=1age(1)=10age(2)=12age(3)=14age(4)=16age(5)=1818第7章用函數實現模塊化程序設計age(5)mainc=age(4)+2age函數c=age75例7.7用遞歸方法求n!。解題思路:求n!可以用遞推方法:即從1開始,乘2,再乘3……一直乘到n。遞推法的特點是從一個已知的事實(如1!=1)出發(fā),按一定規(guī)律推出下一個事實(如2!=1!*2),再從這個新的已知的事實出發(fā),再向下推出一個新的事實(3!=3*2!)。n!=n*(n-1)!。第7章用函數實現模塊化程序設計例7.7用遞歸方法求n!。第7章用函數實現模塊化程序設計76例7.7用遞歸方法求n!。解題思路:求n!也可以用遞歸方法,即5!等于4!×5,而4!=3!×4…,1!=1可用下面的遞歸公式表示:第7章用函數實現模塊化程序設計例7.7用遞歸方法求n!。第7章用函數實現模塊化程序設計77#include<stdio.h>intmain(){intfac(intn);intn;inty;printf("inputanintegernumber:");scanf("%d",&n);y=fac(n);printf("%d!=%d\n",n,y);return0;}第7章用函數實現模塊化程序設計#include<stdio.h>第7章用函數實現模塊化程78intfac(intn){intf;if(n<0) printf("n<0,dataerror!");elseif(n==0||n==1) f=1;elsef=fac(n-1)*n;return(f);}注意溢出第7章用函數實現模塊化程序設計intfac(intn)注意溢出第7章用函數實現模塊化79fac(5)輸出fac(5)mainf=fac(4)×5fac函數n=5f=fac(3)×4fac函數n=4f=fac(1)×2fac函數n=2f=fac(2)×3fac函數n=3f=1fac函數n=1fac(1)=1fac(2)=2fac(3)=6fac(4)=24fac(5)=120120第7章用函數實現模塊化程序設計fac(5)mainf=fac(4)×5fac函數f=fac80例7.8Hanoi(漢諾)塔問題。古代有一個梵塔,塔內有3個座A、B、C,開始時A座上有64個盤子,盤子大小不等,大的在下,小的在上。有一個老和尚想把這64個盤子從A座移到C座,但規(guī)定每次只允許移動一個盤,且在移動過程中在3個座上都始終保持大盤在下,小盤在上。在移動過程中可以利用B座。要求編程序輸出移動一盤子的步驟。第7章用函數實現模塊化程序設計例7.8Hanoi(漢諾)塔問題。古代有一個梵塔,塔81ABC第7章用函數實現模塊化程序設計ABC第7章用函數實現模塊化程序設計82解題思路:要把64個盤子從A座移動到C座,需要移動大約264次盤子。一般人是不可能直接確定移動盤子的每一個具體步驟的老和尚會這樣想:假如有另外一個和尚能有辦法將上面63個盤子從一個座移到另一座。那么,問題就解決了。此時老和尚只需這樣做:第7章用函數實現模塊化程序設計解題思路:第7章用函數實現模塊化程序設計83解題思路:(1)命令第2個和尚將63個盤子從A座移到B座(2)自己將1個盤子(最底下的、最大的盤子)從A座移到C座(3)再命令第2個和尚將63個盤子從B座移到C座第7章用函數實現模塊化程序設計解題思路:第7章用函數實現模塊化程序設計84ABC……將63個從A到B第1個和尚的做法第7章用函數實現模塊化程序設計ABC……將63個從A到B第1個和尚的做法第7章用函數實現模85……ABC將63個從A到B第1個和尚的做法第7章用函數實現模塊化程序設計……ABC將63個從A到B第1個和尚的做法第7章用函數實現模86……ABC將1個從A到C第1個和尚的做法第7章用函數實現模塊化程序設計……ABC將1個從A到C第1個和尚的做法第7章用函數實現模塊87……ABC將1個從A到C第1個和尚的做法第7章用函數實現模塊化程序設計……ABC將1個從A到C第1個和尚的做法第7章用函數實現模塊88……ABC將63個從B到C第1個和尚的做法第7章用函數實現模塊化程序設計……ABC將63個從B到C第1個和尚的做法第7章用函數實現模89……ABC將63個從B到C第1個和尚的做法第7章用函數實現模塊化程序設計……ABC將63個從B到C第1個和尚的做法第7章用函數實現模90ABC……將62個從A到C第2個和尚的做法第7章用函數實現模塊化程序設計ABC……將62個從A到C第2個和尚的做法第7章用函數實現模91ABC……將62個從A到C第2個和尚的做法第7章用函數實現模塊化程序設計ABC……將62個從A到C第2個和尚的做法第7章用函數實現模92ABC……將1個從A到B第2個和尚的做法第7章用函數實現模塊化程序設計ABC……將1個從A到B第2個和尚的做法第7章用函數實現模塊93ABC……將1個從A到B第2個和尚的做法第7章用函數實現模塊化程序設計ABC……將1個從A到B第2個和尚的做法第7章用函數實現模塊94ABC……將62個從C到B第2個和尚的做法第7章用函數實現模塊化程序設計ABC……將62個從C到B第2個和尚的做法第7章用函數實現模95ABC……將62個從C到B第2個和尚的做法第7章用函數實現模塊化程序設計ABC……將62個從C到B第2個和尚的做法第7章用函數實現模96第3個和尚的做法第4個和尚的做法第5個和尚的做法第6個和尚的做法第7個和尚的做法……第63個和尚的做法第64個和尚僅做:將1個從A移到C第7章用函數實現模塊化程序設計第3個和尚的做法第64個和尚僅做:將1個從A移到C第7章用函97ABC將3個盤子從A移到C的全過程將2個盤子從A移到B第7章用函數實現模塊化程序設計ABC將3個盤子從A移到C的全過程將2個盤子從A移到B第7章98ABC將3個盤子從A移到C的全過程將2個盤子從A移到B第7章用函數實現模塊化程序設計ABC將3個盤子從A移到C的全過程將2個盤子從A移到B第7章99ABC將3個盤子從A移到C的全過程將1個盤子從A移到C第7章用函數實現模塊化程序設計ABC將3個盤子從A移到C的全過程將1個盤子從A移到C第7章100ABC將3個盤子從A移到C的全過程將1個盤子從A移到C第7章用函數實現模塊化程序設計ABC將3個盤子從A移到C的全過程將1個盤子從A移到C第7章101ABC將3個盤子從A移到C的全過程將2個盤子從B移到C第7章用函數實現模塊化程序設計ABC將3個盤子從A移到C的全過程將2個盤子從B移到C第7章102ABC將3個盤子從A移到C的全過程將2個盤子從B移到C第7章用函數實現模塊化程序設計ABC將3個盤子從A移到C的全過程將2個盤子從B移到C第7章103ABC將2個盤子從A移到B的過程將1個盤子從A移到C第7章用函數實現模塊化程序設計ABC將2個盤子從A移到B的過程將1個盤子從A移到C第7章用104ABC將2個盤子從A移到B的過程將1個盤子從A移到C第7章用函數實現模塊化程序設計ABC將2個盤子從A移到B的過程將1個盤子從A移到C第7章用105ABC將2個盤子從A移到B的過程將1個盤子從A移到B第7章用函數實現模塊化程序設計ABC將2個盤子從A移到B的過程將1個盤子從A移到B第7章用106ABC將2個盤子從A移到B的過程將1個盤子從A移到B第7章用函數實現模塊化程序設計ABC將2個盤子從A移到B的過程將1個盤子從A移到B第7章用107ABC將2個盤子從A移到B的過程將1個盤子從C移到B第7章用函數實現模塊化程序設計ABC將2個盤子從A移到B的過程將1個盤子從C移到B第7章用108ABC將2個盤子從A移到B的過程將1個盤子從C移到B第7章用函數實現模塊化程序設計ABC將2個盤子從A移到B的過程將1個盤子從C移到B第7章用109ABC將2個盤子從B移到C的過程第7章用函數實現模塊化程序設計ABC將2個盤子從B移到C的過程第7章用函數實現模塊化程序設110ABC將2個盤子從B移到C的過程第7章用函數實現模塊化程序設計ABC將2個盤子從B移到C的過程第7章用函數實現模塊化程序設111ABC將2個盤子從B移到C的過程第7章用函數實現模塊化程序設計ABC將2個盤子從B移到C的過程第7章用函數實現模塊化程序設112ABC將2個盤子從B移到C的過程第7章用函數實現模塊化程序設計ABC將2個盤子從B移到C的過程第7章用函數實現模塊化程序設113由上面的分析可知:將n個盤子從A座移到C座可以分解為以下3個步驟:(1)將A上n-1個盤借助C座先移到B座上(2)把A座上剩下的一個盤移到C座上(3)將n-1個盤從B座借助于A座移到C座上第7章用函數實現模塊化程序設計由上面的分析可知:將n個盤子從A座移到C座可以分解為以下3個114可以將第(1)步和第(3)步表示為:將“one”座上n-1個盤移到“two”座(借助“three”座)。在第(1)步和第(3)步中,one、two、three和A、B、C的對應關系不同。對第(1)步,對應關系是one對應A,two對應B,three對應C。對第(3)步,對應關系是one對應B,two對應C,three對應A。第7章用函數實現模塊化程序設計可以將第(1)步和第(3)步表示為:第7章用函數實現模塊化程115把上面3個步驟分成兩類操作:(1)將n-1個盤從一個座移到另一個座上(n>1)。這就是大和尚讓小和尚做的工作,它是一個遞歸的過程,即和尚將任務層層下放,直到第64個和尚為止。(2)將1個盤子從一個座上移到另一座上。這是大和尚自己做的工作。第7章用函數實現模塊化程序設計把上面3個步驟分成兩類操作:第7章用函數實現模塊化程序設計116編寫程序。用hanoi函數實現第1類操作(即模擬小和尚的任務)用move函數實現第2類操作(模擬大和尚自己移盤)函數調用hanoi(n,one,two.three)表示將n個盤子從“one”座移到“three”座的過程(借助“two”座)函數調用move(x,y)表示將1個盤子從x座移到y(tǒng)座的過程。x和y是代表A、B、C座之一,根據每次不同情況分別取A、B、C代入第7章用函數實現模塊化程序設計編寫程序。第7章用函數實現模塊化程序設計117#include<stdio.h>intmain(){voidhanoi(intn,charone,chartwo,charthree);intm;printf(“thenumberofdiskes:");scanf("%d",&m);printf("move%ddiskes:\n",m);
hanoi(m,'A','B','C');}第7章用函數實現模塊化程序設計#include<stdio.h>第7章用函數實現模塊化程118voidhanoi(intn,charone,chartwo,charthree){voidmove(charx,chary);if(n==1)
move(one,three);else{hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);}}第7章用函數實現模塊化程序設計voidhanoi(intn,charone,char119voidmove(charx,chary){printf("%c-->%c\n",x,y);}第7章用函數實現模塊化程序設計voidmove(charx,chary)第7章用1207.7數組作為函數參數7.7.1數組元素作函數實參7.7.2數組名作函數參數7.7.3多維數組名作函數參數第7章用函數實現模塊化程序設計7.7數組作為函數參數7.7.1數組元素作函數實參第7章用函1217.7.1數組元素作函數實參例7.9輸入10個數,要求輸出其中值最大的元素和該數是第幾個數。第7章用函數實現模塊化程序設計7.7.1數組元素作函數實參例7.9輸入10個數,要求1227.7.1數組元素作函數實參解題思路:定義數組a,用來存放10個數設計函數max,用來求兩個數中的大者在主函數中定義變量m,初值為a[0],每次調用max函數后的返回值存放在m中用“打擂臺”算法,依次將數組元素a[1]到a[9]與m比較,最后得到的m值就是10個數中的最大者第7章用函數實現模塊化程序設計7.7.1數組元素作函數實參解題思路:第7章用函數實現模塊化123#include<stdio.h>intmain(){intmax(intx,inty);inta[10],m,n,i;printf(“10integernumbers:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);printf("\n");第7章用函數實現模塊化程序設計#include<stdio.h>第7章用函數實現模塊化程124for(i=1,m=a[0],n=0;i<10;i++){if(max(m,a[i])>m) {m=max(m,a[i]); n=i; }}printf(“l(fā)argestnumberis%d\n",m);printf(“%dthnumber.\n“,n+1);}intmax(intx,inty){return(x>y?x:y);}第7章用函數實現模塊化程序設計for(i=1,m=a[0],n=0;i<10;i++1257.7.2數組名作函數參數除了可以用數組元素作為函數參數外,還可以用數組名作函數參數(包括實參和形參)用數組元素作實參時,向形參變量傳遞的是數組元素的值用數組名作函數實參時,向形參傳遞的是數組首元素的地址第7章用函數實現模塊化程序設計7.7.2數組名作函數參數除了可以用數組元素作為函數參數外,1267.7.2數組名作函數參數例7.10有一個一維數組score,內放10個學生成績,求平均成績。解題思路:用函數average求平均成績,用數組名作為函數實參,形參也用數組名在average函數中引用各數組元素,求平均成績并返回main函數第7章用函數實現模塊化程序設計7.7.2數組名作函數參數例7.10有一個一維數組sc127#include<stdio.h>intmain(){floataverage(floatarray[10]);
floatscore[10],aver;inti;printf("input10scores:\n");for(i=0;i<10;i++)scanf("%f",&score[i]);printf("\n");aver=average(score);printf("%5.2f\n",aver);return0;}定義實參數組第7章用函數實現模塊化程序設計#include<stdio.h>定義實參數組第7章用函數128floataverage(float
array[10]){inti;floataver,sum=array[0];for(i=1;i<10;i++)sum=sum+array[i];aver=sum/10;return(aver);}定義形參數組相當于score[0]相當于score[i]第7章用函數實現模塊化程序設計floataverage(floatarray[10])129例7.11有兩個班級,分別有35名和30名學生,調用一個average函數,分別求這兩個班的學生的平均成績。第7章用函數實現模塊化程序設計例7.11有兩個班級,分別有35名和30名學生,調用130解題思路:需要解決怎樣用同一個函數求兩個不同長度的數組的平均值的問題定義average函數時不指定數組的長度,在形參表中增加一個整型變量i從主函數把數組實際長度從實參傳遞給形參i這個i用來在average函數中控制循環(huán)的次數為簡化,設兩個班的學生數分別為5和10第7章用函數實現模塊化程序設計解題思路:第7章用函數實現模塊化程序設計131#include<stdio.h>intmain(){floataverage(floatarray[],intn);floatscore1[5]={98.5,97,91.5,60,55};floatscore2[10]={67.5,89.5,99,69.5,77,89.5,76.5,54,60,99.5};printf(“%6.2f\n”,average(score1,5));printf(“%6.2f\n”,average(score2,10));return0;}第7章用函數實現模塊化程序設計#include<stdio.h>第7章用函數實現模塊化程132floataverage(floatarray[],intn){inti;floataver,sum=array[0];for(i=1;i<n;i++)sum=sum+array[i];aver=sum/n;return(aver);}調用形式為average(score1,5)時相當于score1[0]相當于score1[i]相當于5第7章用函數實現模塊化程序設計floataverage(floatarray[],i133floataverage(floatarray[],intn){inti;floataver,sum=array[0];for(i=1;i<n;i++)sum=sum+array[i];aver=sum/n;return(aver);}調用形式為average(score2,10)時相當于score2[0]相當于score2[i]相當于10第7章用函數實現模塊化程序設計floataverage(floatarray[],i134例7.12用選擇法對數組中10個整數按由小到大排序。解題思路:所謂選擇法就是先將10個數中最小的數與a[0]對換;再將a[1]到a[9]中最小的數與a[1]對換……每比較一輪,找出一個未經排序的數中最小的一個共比較9輪第7章用函數實現模塊化程序設計例7.12用選擇法對數組中10個整數按由小到大排序。第135a[0]a[1]a[2]a[3]a[4]36194
16394
1
3694
1
3
496
1
3
4
69小到大排序第7章用函數實現模塊化程序設計a[0]a[1]a[2]a[3]a[136#include<stdio.h>intmain(){voidsort(intarray[],intn);inta[10],i;printf("enterarray:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);
sort(a,10);printf("Thesortedarray:\n");for(i=0;i<10;i++)printf("%d",a[i]);printf("\n");return0;}第7章用函數實現模塊化程序設計#include<stdio.h>第7章用函數實現模塊化程137voidsort(intarray[],intn){inti,j,k,t;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++)if(array[j]<array[k])k=j; t=array[k];
array[k]=array[i];
array[i]=t; }}在sort[i]~sort[9]中,最小數與sort[i]對換第7章用函數實現模塊化程序設計voidsort(intarray[],intn)在s1387.7.3多維數組名作函數參數例7.13有一個3×4的矩陣,求所有元素中的最大值。解題思路:先使變量max的初值等于矩陣中第一個元素的值,然后將矩陣中各個元素的值與max相比,每次比較后都把“大者”存放在max中,全部元素比較完后,max的值就是所有元素的最大值。第7章用函數實現模塊化程序設計7.7.3多維數組名作函數參數例7.13有一個3×4的139#include<stdio.h>intmain(){intmax_value(intarray[][4]);inta[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}};printf(“Maxvalueis%d\n”,
max_value(a));return0;}可以省略不能省略要與形參數組第二維大小相同第7章用函數實現模塊化程序設計#include<stdio.h>可以省略不能省略第7章用140intmax_value(intarray[][4]){inti,j,max;max=array[0][0];for(i=0;i<3;i++)for(j=0;j<4;j++)if(array[i][j]>max)max=array[i][j];return(max);}要與實參數組第二維大小相同第7章用函數實現模塊化程序設計intmax_value(intarray[][4])要1417.8局部變量和全局變量7.8.1局部變量7.8.2全局變量第7章用函數實現模塊化程序設計7.8局部變量和全局變量7.8.1局部變量第7章用函數實現1427.8.1局部變量定義變量可能有三種情況:在函數的開頭定義在函數內的復合語句內定義在函數的外部定義第7章用函數實現模塊化程序設計7.8.1局部變量定義變量可能有三種情況:第7章用函數實現1437.8.1局部變量在一個函數內部定義的變量只在本函數范圍內有效在復合語句內定義的變量只在本復合語句范圍內有效在函數內部或復合語句內部定義的變量稱為“局部變量”第7章用函數實現模塊化程序設計7.8.1局部變量在一個函數內部定義的變量只在本函數范圍內144floatf1(inta){intb,c;……}charf2(intx,inty){inti,j;……}intmain(){intm,n;……return0;}a、b、c僅在此函數內有效x、y、i、j僅在此函數內有效m、n僅在此函數內有效第7章用函數實現模塊化程序設計floatf1(inta)a、b、c僅在此145floatf1(inta){intb,c;……}charf2(intx,inty){inti,j;……}intmain(){inta,b;……return0;}類似于不同班同名學生a、b也僅在此函數內有效第7章用函數實現模塊化程序設計floatf1(inta)類似于不同班同名146intmain(){inta,b;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 44957-2024人工影響天氣作業(yè)點防雷技術規(guī)范
- 2025年上海市徐匯區(qū)高三語文一模作文解析與范文:突破與接受自身局限
- 持久性隆起性紅斑的臨床護理
- 部編人教版八年級歷史上冊教案
- 《證劵技術分析》課件
- 《數學規(guī)劃》課件
- 《第一章》課件-1.2人生智能的發(fā)展
- 2021年動力鋰電行業(yè)億緯鋰能分析報告
- 《機床電氣線路的安裝與調試》課件-第2章
- 《自動控制原理》課件第11章
- 《報批報建工作》課件
- 2024年商業(yè)流通倉儲服務項目立項申請報告模板
- 統(tǒng)編版(2024版)七年級上冊歷史期末復習課件
- 國家開放大學??啤稒C械制圖》一平臺機考真題及答案(第一套)
- 2024青海海東市水務集團限責任公司招聘27人易考易錯模擬試題(共500題)試卷后附參考答案
- 2024年世界職業(yè)院校技能大賽高職組“智慧金融組”賽項參考試題庫(含答案)
- 2024房地產中介經紀人勞動合同
- 光伏發(fā)電系統(tǒng)設計
- 2024-2030年中國電梯維修保養(yǎng)行業(yè)運營現狀及投資戰(zhàn)略研究報告
- 小學二年級數學上冊-加減乘除法口算題800道
- 國開2024年秋《機械制圖》形考作業(yè)1-4答案
評論
0/150
提交評論