![大學課件語言大一上第6章_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/25/69393924-b706-4459-9277-db42c5dffb3d/69393924-b706-4459-9277-db42c5dffb3d1.gif)
![大學課件語言大一上第6章_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/25/69393924-b706-4459-9277-db42c5dffb3d/69393924-b706-4459-9277-db42c5dffb3d2.gif)
![大學課件語言大一上第6章_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/25/69393924-b706-4459-9277-db42c5dffb3d/69393924-b706-4459-9277-db42c5dffb3d3.gif)
![大學課件語言大一上第6章_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/25/69393924-b706-4459-9277-db42c5dffb3d/69393924-b706-4459-9277-db42c5dffb3d4.gif)
![大學課件語言大一上第6章_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/25/69393924-b706-4459-9277-db42c5dffb3d/69393924-b706-4459-9277-db42c5dffb3d5.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、C語言程序設計 2022-4-2512022-4-252第六章 函數(shù)主講主講: : 計算機學院計算機學院 吳敏吳敏2022-4-253內容提要2022-4-252022-4-253 32022-4-2542022-4-252022-4-254 4大家想一想 如果每個printf()函數(shù)由20行代碼替換,每個scanf()函數(shù)由50行代碼替換,那么你見過的程序會是什么樣子? 讀多少行的程序能讓你不頭疼?怎么團隊合作? 如果所有代碼都在main()當中,2022-4-2552022-4-252022-4-255 5數(shù)學函數(shù) 我們可以將像sin(x)那樣的數(shù)學函數(shù)想象成一個黑盒子,或一個小機器。如果
2、你在它的上面放入一個“值”,在它的下面就會掉出“結果” 對應于程序函數(shù),上面的值稱為參數(shù),下面的值稱為返回值2022-4-2562022-4-252022-4-256 6調用sin(x)函數(shù) 如果我們改變了輸入的參數(shù),函數(shù)就能返回不同的值。 圖中我們將調用4次sin的結果加起來,并將其和存入變量total中。2022-4-2572022-4-252022-4-257 7函數(shù)的本質 函數(shù)是這樣一種運算: 函數(shù)名說明運算規(guī)則 參數(shù)是運算的操作數(shù) 返回值是運算的結果x =x =a + b + c;add(a, b, c);int add(int a, int b, int c)return a+b+
3、c; 2011年3月23日星期三2022-4-2582022-4-252022-4-258 8函數(shù)的分類函數(shù)生來平等,沒有高低貴賤之分,只有main()函數(shù)作為入口函數(shù)稍微特殊一點世界上只有10種函數(shù),一種是別人寫的,一種是自己寫的2011年3月23日星期三2022-4-2592022-4-252022-4-259 9別人寫的函數(shù) 庫函數(shù) ANSI C定義的標準庫函數(shù)符合標準的C語言編譯器必須提供這些函數(shù)I/O、數(shù)學、字符字符串、圖形、內存、時間、. 第三方庫函數(shù)有其它廠商自行開發(fā)的C語言函數(shù)庫不在標準范圍內,能擴充C語言的功能2011年3月23日星期三2022-4-25102022-4-25
4、2022-4-251010自己寫的函數(shù) 自定義函數(shù) 包裝后,也可以成為庫函數(shù),供別人使用 注意:“自己”和“別人”是相對而言的2011年3月23日星期三2022-4-2511函數(shù)概述2022-4-252022-4-2511 11 在在C語言中,往往把程序需要實現(xiàn)的一些功能分別編寫成若語言中,往往把程序需要實現(xiàn)的一些功能分別編寫成若干個函數(shù),在不同情況下,調用不同的模塊。干個函數(shù),在不同情況下,調用不同的模塊。按層次組織模塊按層次組織模塊主模塊主模塊模塊模塊1模塊模塊2模塊模塊3模塊模塊4模塊模塊5模塊模塊6需要指出總任務需要指出總任務分別指出各自的子任務分別指出各自的子任務精確描述精確描述怎么
5、做怎么做2022-4-25122022-4-252022-4-251212函數(shù)的作用 分解問題,使程序結構更加清晰在解決復雜問題時,先將問題劃分或化解成一些子問題分別加以解決,從而降低問題的復雜度。在程序實現(xiàn)時可針對這些子問題分別編程實現(xiàn)和測試。 避免重復勞動在解決不同的實際問題時,常常需要用到許多相同的子方法或子技術。它們對于不同問題可能只是選擇參數(shù)的不同,而內部功能完全相同。如果能將這些子方法或子技術形成一個經(jīng)過測試的優(yōu)化的固定程序模塊,讓用戶在解決問題時直接調用,就會比較方便。2022-4-25132022-4-252022-4-251313學習函數(shù)的三個要素函數(shù)的聲明、定義與調用201
6、1年3月23日星期三2022-4-25142022-4-252022-4-251414#include #include void void ()() int max(int int max(int ,int int ) ); int int ,;,; scanfscanf(,);(,); (,);(,); printfprintf( ,);,); int max(int ,int )*定義有參函數(shù)max * int ; ?; return(); 運行情況如下:運行情況如下:, 2022-4-25152022-4-252022-4-251515通過函數(shù)調用,可使兩個函數(shù)中的數(shù)據(jù)發(fā)生聯(lián)系。202
7、2-4-25162022-4-252022-4-251616函數(shù)聲明2011年3月23日星期三2022-4-25172022-4-252022-4-251717函數(shù)聲明返回值類型標志符參數(shù)表類型 函數(shù)名(類型 參數(shù)1, 類型 參數(shù)2, .);int max(int x, int y);例:2022-4-25182022-4-252022-4-251818函數(shù)聲明注意事項 C語言是一門編譯語言,它在使用某個函數(shù)之前,必須知道函數(shù)在哪里,即編譯器需要看到該函數(shù)的聲明或定義 不同的編譯器處理函數(shù)聲明的方式不同Textmate工具: warningDev-cpp工具:error2011年3月23日星期
8、三2022-4-25192022-4-252022-4-251919函數(shù)定義2011年3月23日星期三2022-4-25202022-4-252022-4-252020函數(shù)定義(函數(shù)的實現(xiàn))類型 函數(shù)名(類型 參數(shù)1, 類型 參數(shù)2,.).return 表達式;int max(int x, int y) int max;if(xy) max =x;elsemax =y;return max; 2011年3月23日星期三2022-4-25212022-4-252022-4-252121函數(shù)定義(函數(shù)的實現(xiàn))類型 函數(shù)名(類型 參數(shù)1, 類型 參數(shù)2,.).返回值類型標志符參數(shù)表.return 表
9、達式;函數(shù)出口返回值int max(int x, int y) int max;if(xy) max =x;elsemax =y;return max; 2011年3月23日星期三2022-4-25222022-4-252022-4-252222函數(shù)定義的三種形式類型 函數(shù)名(類型 參數(shù)1, 類型 參數(shù)2,.).return 表達式;類型 函數(shù)名().return 表達式;void 函數(shù)名().有參函數(shù)無參函數(shù)空函數(shù)2011年3月23日星期三2022-4-25232022-4-252022-4-252323請點評#include int main()int a,b;scanf(%d %d, &
10、amp;a, &b);printf(%dn, max(a,b);return 0;/求最大值函數(shù)int max(int x, y)int max;if(xy) max =x; elsemax =y;return max;max.c2011年3月23日星期三2022-4-25242022-4-252022-4-252424函數(shù)的定義:對函數(shù)功能的確立,包括指定函數(shù)名,函數(shù)值類型、形參名稱及其類型、函數(shù)體等,它是一個完整的、獨立的函數(shù)單位。l 函數(shù)的聲明:則是把函數(shù)的名字、函數(shù)類型以及形參的類型、個數(shù)和順序通知編譯系統(tǒng),以便在調用該函數(shù)時系統(tǒng)按此進行對照檢查。 2022-4-2525202
11、2-4-252022-4-252525函數(shù)的返回值 函數(shù)通過return語句將函數(shù)計算結果返回 當函數(shù)執(zhí)行到return語句或時,函數(shù)的運算停止。程序從當此調用函數(shù)的地方int max(int x, int y)if(xy) return x; elsereturn y; int max(int x, int y)int max;if(xy)max =x;elsemax =y;return max; 繼續(xù)執(zhí)行 函數(shù)可以有多個return, 但最好只有一個且放在最后一行2011年3月23日星期三2022-4-25262022-4-252022-4-252626不返回任何值的函數(shù)空函數(shù)(void)
12、 有時某些函數(shù)沒有返回值,調用過程的輸出已經(jīng)在被調函數(shù)體內完成,這時要用void定義這些“無返回值”類型的函數(shù)void print_star()printf(*n,);void print_message()printf(how are u?n); 此時,return語句可以省略2011年3月23日星期三2022-4-25272022-4-252022-4-252727請點評#include void print_message( ) printf(How are u?n);int main() char str20= How do u do?;str20 = print_message();
13、printf(%s,str);return 0;void_demo.c2011年3月23日星期三2022-4-25282022-4-252022-4-252828(1 1)函數(shù)的返回值通過函數(shù)中的)函數(shù)的返回值通過函數(shù)中的returnreturn語句獲得。語句獲得。 一個函數(shù)中可以有一個以上的一個函數(shù)中可以有一個以上的returnreturn語句,執(zhí)語句,執(zhí)行到哪一個行到哪一個returnreturn語句,哪一個語句起作用。語句,哪一個語句起作用。(2 2)函數(shù)的返回值應當屬于某一個確定的類型,在)函數(shù)的返回值應當屬于某一個確定的類型,在定義函數(shù)時指定函數(shù)返回值的類型。定義函數(shù)時指定函數(shù)返回值
14、的類型。注意:注意:凡凡不加不加類型說明的函數(shù),自動按類型說明的函數(shù),自動按整型整型處理。處理。函數(shù)類型一般應該和函數(shù)類型一般應該和returnreturn語句中的表達式類型語句中的表達式類型一致一致,否則否則以函數(shù)類型為準以函數(shù)類型為準。對于對于不帶回值不帶回值的函數(shù),函數(shù)類型為的函數(shù),函數(shù)類型為“voidvoid”2022-4-25292022-4-252022-4-252929函數(shù)調用2011年3月23日星期三2022-4-25302022-4-252022-4-253030函數(shù)名(參數(shù)1,參數(shù)2,.)函數(shù)調用 函數(shù)調用的形式:int main() int a,b;scanf(%d %d
15、,&a, &b);printf(%dn, max(a,b);return 0;2011年3月23日星期三2022-4-25312022-4-252022-4-253131函數(shù)嵌套調用實例#include int bar(int c, int d) int res = c + d; printf(bar:%dn,res); return res;int foo(int a, int b) int res = bar(a, b); printf(foo:%dn,res); return res;int main() printf(main:startn); int res = fo
16、o(2, 3); printf(main:%dn,res); main()調用foo()結束()foo()bar()調用bar()returnreturn return 0;foo_bar.c2011年3月23日星期三2022-4-25322022-4-252022-4-253232函數(shù)調用的示意圖老婆洗菜燒水入鍋炒起鍋操作系統(tǒng)做菜主函數(shù)切菜炒菜子函數(shù)子函數(shù)2011年3月23日星期三2022-4-25332022-4-252022-4-253333函數(shù)調用的注意事項調用一個函數(shù)之前,先要對其返回值類型、函數(shù)名和參數(shù)進行聲明或定義調用函數(shù)時,提供的參數(shù)(實際參數(shù))和該函數(shù)定義中的參數(shù)(形式參數(shù))
17、必須匹配數(shù)目一致類型一一對應(會發(fā)生自動類型轉換)把實際參數(shù)的值復制給形式參數(shù)foo_bar.c2011年3月23日星期三2022-4-25342022-4-252022-4-253434函數(shù)參數(shù)傳遞2011年3月23日星期三2022-4-25352022-4-252022-4-253535int bar(int c, int d) int res = c + d; return res;int foo(int a, int b) int res = bar(a, b); return res;int main()函數(shù)參數(shù) 函數(shù)參數(shù):就是一個變量,它隨著使用者的不同而發(fā)生變化。 形參:函數(shù)定義
18、中的形式參數(shù)。 實參:就是在函數(shù)調用時,傳遞給函數(shù)的參數(shù),也就是參數(shù)的實際值foo(2, 3);return 0;2011年3月23日星期三2022-4-25362022-4-252022-4-253636 函數(shù)參數(shù):就是一個變量,它隨著使用者的不同而發(fā)生變化。 形參:函數(shù)定義中的形式參數(shù)。 實參:就是在函數(shù)調用時,傳遞給函數(shù)的參數(shù),也就是參數(shù)的實際值int bar(int c, int d) int res = c + d; return res; a,bint foo(int a, int b)為形參2, 3 為實參 int res = bar(a, b); return res;a,b的
19、值為實參int main()foo(2, 3);return 0;函數(shù)參數(shù)c,d 為形參2011年3月23日星期三2022-4-25372022-4-252022-4-253737形參、實參的注意事項 在定義函數(shù)中指定的形參變量,在未出現(xiàn)函數(shù)調用時,它們并不占內存單元。只有在發(fā)生函數(shù)調用時函數(shù)中的參數(shù)才被分配內存單元。在調用結束后,形參所占的內存單元才被釋放。 在被定義的函數(shù)中,必須指定形參的類型。 實參和形參類型應一致,實參可以是整型、實型、字符型或表達式,但要求它們有確定的值。2011年3月23日星期三2022-4-25382022-4-252022-4-253838請點評#include
20、 /* 形參和實參swap演示 */void Swap(int x, int y);int main()int a=123;int b=456; Swap(a,b);/交換a,b的值 return 0;/求最大值函數(shù)void Swap(int x, int y)int tmp;tmp = x;x = y;y= tmp;swap.c2011年3月23日星期三2022-4-25392022-4-252022-4-253939請點評#include /* 形參和實參swap演示 */void Swap(int x, int y);int main()int a=123;int b=456; Swap
21、(a,b);/交換a,b的值 return 0;/求最大值函數(shù)void Swap(int x, int y)int tmp;tmp = x;x = y;y= tmp;swap.c2011年3月23日星期三2022-4-25402022-4-252022-4-254040int main()int a=123; int b=456;printf(VartAddresstValuen);printf(-n);printf(at%pt%dn, &a, a);printf(bt%pt%dn, &b, b);Swap(a,b); printf(-n); printf(at%pt%dn,
22、&a, a);printf(bt%pt%dn, &b, b);用火焰金睛看一看#include /* 通過內存地址觀察形參和實參 */void Swap(int x, int y);void Swap(int x, int y)int tmp; printf(-n); printf(xt%pt%dn, &x, x);printf(yt%pt%dn, &y, y);tmp = x;x = y;y= tmp;printf(-n);printf(xt%pt%dn, &x, x);printf(yt%pt%dn, &y, y); return 0;swa
23、p_inside.c2011年3月23日星期三2022-4-25412022-4-252022-4-254141函數(shù)參數(shù)的傳遞 C語言規(guī)定,實參變量對形參變量的數(shù)據(jù)傳遞是“值傳遞”,即單向傳遞,只能由實參傳給形參,而不能由形參傳給實參,在內存中實參單元與形參單元是不同的單元。2011年3月23日星期三2022-4-25422022-4-252022-4-254242實參可以是常量、變量、表達式,只要有確定的值。在函數(shù)調用時才給形參分配存儲空間,且調用結束后所占空間立即釋放。實參和形參必須類型相同。若不同時,按賦值規(guī)定自動進行類型轉換。(5 5)單向值傳遞)單向值傳遞: :(復印功能)(復印功能
24、)發(fā)生函數(shù)調用時,實參數(shù)值被復發(fā)生函數(shù)調用時,實參數(shù)值被復印傳遞給對應形參,從此形參的變化與實參無印傳遞給對應形參,從此形參的變化與實參無關關 2022-4-25432022-4-252022-4-254343函數(shù)設計原則2011年3月23日星期三2022-4-25442022-4-252022-4-254444函數(shù)的設計原則每個函數(shù)只完成一個功能對函數(shù)的功能可以用不含連詞的一句話描述函數(shù)不能過長1986年IBM在OS/360的研究結果:大多數(shù)有錯誤的函數(shù)都大于500行1991年對于48,000行代碼的研究表明:小于143行的函數(shù)比更長的函數(shù)更容易維護函數(shù)一定要對傳進來的非法參數(shù)做點什么向調用
25、者提供錯誤信息2011年3月23日星期三2022-4-2545無參函數(shù)舉例-P106例6.2l思考l(1) 刪除語句return 對程序有無影響?l(2)區(qū)分函數(shù)的定義和函數(shù)的調用(函數(shù)名(實參表列) )l(2)如果將Star函數(shù)的定義放到main函數(shù)之后,編譯時會有什么現(xiàn)象?不改變兩個函數(shù)的定義位置,如何修改使程序正確?-函數(shù)聲明2022-4-252022-4-2545452022-4-2546函數(shù)調用時控制流及數(shù)據(jù)流傳輸(1)為被調函數(shù)形參分配空間(2)主調函數(shù)將實參拷貝一份,傳給對應形參(3)控制流轉到被調函數(shù)起始位置,開始執(zhí)行 (4)被調函數(shù)執(zhí)行到return語句,系統(tǒng)根據(jù)函數(shù)返回值類
26、型創(chuàng)建一個該類型的臨時變量,并將return后的表達式的值賦值給此臨時變量,被調函數(shù)中形參和局部變量所分配的空間被回收,控制流返回主調函數(shù)中下一步語句; (5)主調函數(shù)從這個臨時變量取值,然后臨時變量被系統(tǒng)銷毀。2022-4-252022-4-2546462022-4-2547課堂練習lP139 二、(3)l編程:定義一個求階乘的函數(shù),原型為l,并在主函數(shù)中調用它,求從鍵盤輸入的一個任意正整數(shù)的階乘2022-4-252022-4-2547472022-4-25482022-4-252022-4-254848#include stdio.h#include stdio.h“ main() / m
27、ain() /* *主函數(shù)主函數(shù)* */ / int m int m; long p(int)long p(int); scanf( scanf(“%d%d”,m);,m); printf( printf(d!=d!=ldn,m,p(m)ldn,m,p(m); 2022-4-2549函數(shù)定義與調用舉例l(一)程序6.4:判斷質數(shù)函數(shù)的定義與調用 l例4.7 已講過如何判斷一個整數(shù)為質數(shù),回顧l本程序需要定義一個函數(shù)l(1)功能:判斷一個整數(shù)是否為質數(shù)l(2)參數(shù):一個整數(shù),為待判斷的數(shù)l(3)返回值:整型值,為質數(shù)返回1,否則返回0l(4)因此,函數(shù)原型為:int primeInt(int m
28、);2022-4-252022-4-2549492022-4-2550例4.7 核心代碼2022-4-252022-4-255050k=(int)sqrt(m); for (i=2; prime &i=k;i+) if (m%i=0) prime=0; if (prime) printf(%d is a primen,m);else printf(%d is not a primen,m);程序程序6.4:6.4:int main( )int main( ) if (if (primeInt(m)primeInt(m) ) int primeInt(int m) return prim
29、e; 2022-4-25512022-4-252022-4-255151#include#includeint primeInt(int m); /判斷質數(shù)函數(shù)聲明int main( ) int m;scanf(%d,&m); if (primeInt(m) /判斷質數(shù)函數(shù)調用 printf(%d is a primen,m);else printf(%d is not a primen,m);return 0;int primeInt(int m)int primeInt(int m) return prime; return prime; 2022-4-2552函數(shù)定義與調用舉例l
30、(四)程序6.7:查找一個數(shù)組元素的函數(shù)的定義與調用l程序5.9:查找數(shù)組元素的主函數(shù)形式,回顧l本程序需要定義一個函數(shù)l(1)功能:查找一個元素是否在數(shù)組中l(wèi)(2)參數(shù):三個參數(shù),第一個參數(shù)是指針,用來接受待查找的數(shù)組的首地址,第二個參數(shù),接受待查找的值,第三個參數(shù),整型值,接受待查找的元素個數(shù)l(3)返回值:整型值, 存在則返回在數(shù)組中的下標,否則返回-1。l(4)因此,函數(shù)原型為:lint Find(int* pa,int x,int n); 2022-4-252022-4-2552522022-4-2553例5.9 核心代碼2022-4-252022-4-255353 scanf(%d
31、,&x); p=a; while(in) if (x=*(p+i)break;i+; if(in) printf(value=%d, index=%dn,x,i);elseprintf(Not present!n);return 0;程序程序6.76.7函數(shù)原型:函數(shù)原型: int Find(intint Find(int* * pa,int x,int n); pa,int x,int n); 2022-4-25542022-4-252022-4-255454#include int Find(int* pa,int x,int n); /查找數(shù)組元素函數(shù)聲明int main() i
32、nt a10,n=10,x,*p,i; printf(Input %d elements:n,n);for (p=a;pa+10;p+) scanf(%d,p); printf(Input x be searched:n,n);scanf(%d,&x); i=Find(a,x,n); /查找數(shù)組元素函數(shù)的調用if(in&i!=-1) printf(value=%d, index=%dn,x,i);elseprintf(Not present!n);return 0;2022-4-2555 2022-4-252022-4-255555 根據(jù)實參傳遞給形參值的不同,通常有值傳遞方式
33、和根據(jù)實參傳遞給形參值的不同,通常有值傳遞方式和地址傳遞方式兩種。地址傳遞方式兩種。 方式方式: 函數(shù)調用時函數(shù)調用時, ,為形參分配單元為形參分配單元, ,并將實參的值復制到并將實參的值復制到形參中;調用結束,形參單元被釋放,實參單元仍保形參中;調用結束,形參單元被釋放,實參單元仍保留并維持原值。留并維持原值。 特點:特點: 形參與實參占用不同的內存單元形參與實參占用不同的內存單元 單向傳遞單向傳遞2022-4-25562022-4-252022-4-2556567x11y 調用#include #include void swap (int a, int b);void swap (int
34、 a, int b); void main ( )void main ( ) int x = 7, y = 11; int x = 7, y = 11; printf (before swapped: ); printf (before swapped: ); printf (x=%d, y=%dn, x, y); printf (x=%d, y=%dn, x, y); swap (x, y); swap (x, y); printf (after swapped: );printf (after swapped: ); printf (x=%d, y=%dn, x, y); printf (
35、x=%d, y=%dn, x, y);void swap (int a, int b)void swap (int a, int b) int temp; int temp; temp = a; temp = a; a = b; a = b; b = temp; b = temp;7x11y 調用前 swap7x11y7a11btemp2022-4-25572022-4-252022-4-255757 方式:方式: 函數(shù)調用時,將函數(shù)調用時,將數(shù)據(jù)的存儲地址數(shù)據(jù)的存儲地址作為參數(shù)傳遞給形參作為參數(shù)傳遞給形參 特點:特點: 形參與實參占用同樣的存儲單元形參與實參占用同樣的存儲單元 雙向傳遞雙向傳
36、遞 實參和形參必須是地址常量或變量實參和形參必須是地址常量或變量注意以下幾點:注意以下幾點: 形參數(shù)組和實參數(shù)組的形參數(shù)組和實參數(shù)組的類型必須一致類型必須一致,否則將引起錯誤。,否則將引起錯誤。 形參數(shù)組和實參數(shù)組的形參數(shù)組和實參數(shù)組的長度可以不相同,因為在調用時,長度可以不相同,因為在調用時,只傳送首地址而不檢查形參數(shù)組的長度。只傳送首地址而不檢查形參數(shù)組的長度。 2022-4-25582022-4-252022-4-255858float float average(float array10)average(float array10),并在主函數(shù)中調用,并在主函數(shù)中調用它求一維數(shù)組它求
37、一維數(shù)組scorescore(從鍵盤輸入(從鍵盤輸入1010個學生成績)個學生成績)的平均成績。的平均成績。 float average(float array10)float average(float array10) int i; int i; float aver,sum=array0; float aver,sum=array0; for(i=1;i10;i+) for(i=1;i10;i+) sum=sum+arrayi; sum=sum+arrayi; aver=sum/10; aver=sum/10; return(aver); return(aver); 2022-4-255
38、92022-4-252022-4-255959#include void main() float average(float array10); float score10,aver; int i; printf(input 10 scores:n); for(i=0;i10;i+) scanf(%f,&scorei); printf(n); aver=average(score); printf(average score is %5.2fn,aver);2022-4-25602022-4-252022-4-256060 編寫一個函數(shù),用來分別求數(shù)組編寫一個函數(shù),用來分別求數(shù)組sc
39、ore_1score_1(有(有5 5個個元素)和數(shù)組元素)和數(shù)組score_2score_2(有(有1010個元素)各元素的平個元素)各元素的平均值均值 。分析:分析: 要求兩個不同大小的數(shù)組中元素的要求兩個不同大小的數(shù)組中元素的均值,均值,在函數(shù)中設一個整型形參接受調用時在函數(shù)中設一個整型形參接受調用時傳遞過來的元素個數(shù)傳遞過來的元素個數(shù); 用數(shù)組名作函數(shù)的實參時,用數(shù)組名作函數(shù)的實參時,傳遞數(shù)傳遞數(shù)組的首地址,使形參數(shù)組與實參數(shù)組占用同組的首地址,使形參數(shù)組與實參數(shù)組占用同一段內存單元。一段內存單元。當形參數(shù)組元素的值變化時,當形參數(shù)組元素的值變化時,對應的實參數(shù)組元素的值也發(fā)生了改變。
40、對應的實參數(shù)組元素的值也發(fā)生了改變。2022-4-25612022-4-252022-4-256161#include void main() float average(float array ,int n); float score_15=98.5,97,91.5,60,55; float score_210=67.5,89.5,99,69.5,77,89.5,76.5,54,60,99.5; printf(The average of class A is %6.2fn,average(score_1,5); printf(The average of class B is %6.2fn
41、,average(score_2,10); float average(float array ,int n) int i; float aver,sum=array0; for(i=1;in;i+) sum=sum+arrayi; aver=sum/n; return(aver);2022-4-2562函數(shù)調用與變量的存儲類別 l自定義函數(shù)引出了兩個問題:l第一,不同函數(shù)的變量(包括實參與形參)如果同名,是否會發(fā)生沖突?l第二,一個函數(shù)的變量空間在內存中存在多長時間。要有效地利用系統(tǒng)空間資源,這段時間就不能太長。l這兩個問題分別引出了變量作用域和變量生命周期的概念。2022-4-252022
42、-4-2562622022-4-2563變量的存儲方式和生存期2022-4-252022-4-256363從變量的從變量的作用域作用域(即從空間)角度來分,可以分為(即從空間)角度來分,可以分為全局變量和局部變量。全局變量和局部變量。從變量值的從變量值的生存期生存期(即存在的時間)角度來分,又(即存在的時間)角度來分,又可以分為靜態(tài)存儲方式和動態(tài)存儲方式??梢苑譃殪o態(tài)存儲方式和動態(tài)存儲方式。2022-4-25642022-4-252022-4-256464 一是數(shù)據(jù)類型:一是數(shù)據(jù)類型: 如整型如整型(int)(int)、實型、實型(float)(float)、字符型、字符型(char)(cha
43、r) 等。等。 二是數(shù)據(jù)的存儲類型:二是數(shù)據(jù)的存儲類型: 分為自動類型分為自動類型(auto)(auto)、靜態(tài)類型、靜態(tài)類型(static)(static)、寄存器類型、寄存器類型(register)(register)、外部類型、外部類型(extern)(extern)。數(shù)據(jù)的存儲類別決定了該數(shù)據(jù)的。數(shù)據(jù)的存儲類別決定了該數(shù)據(jù)的存儲區(qū)域。存儲區(qū)域。默認默認供用戶使用的內存空間可以分為三部分:2022-4-25652022-4-252022-4-256565數(shù)據(jù)分別存放在靜態(tài)存儲區(qū)和動態(tài)存儲區(qū)。其中:數(shù)據(jù)分別存放在靜態(tài)存儲區(qū)和動態(tài)存儲區(qū)。其中: 在動態(tài)存儲區(qū)存放:在動態(tài)存儲區(qū)存放:在靜態(tài)存儲
44、區(qū)存放全部在靜態(tài)存儲區(qū)存放全部全局變量和靜態(tài)變量全局變量和靜態(tài)變量。在程序開始執(zhí)行時為其分配存儲空間,程序執(zhí)行完畢就釋放。在程序執(zhí)行的整在程序開始執(zhí)行時為其分配存儲空間,程序執(zhí)行完畢就釋放。在程序執(zhí)行的整個過程中始終占固定的存儲單元。個過程中始終占固定的存儲單元。 函數(shù)的形參函數(shù)的形參 調用函數(shù)時為形參分配存儲空間調用函數(shù)時為形參分配存儲空間 函數(shù)中定義的未加函數(shù)中定義的未加staticstatic的變量的變量 函數(shù)調用時的現(xiàn)場保護和返回地址等函數(shù)調用時的現(xiàn)場保護和返回地址等2022-4-25662022-4-252022-4-256666 自動變量自動變量 函數(shù)中的局部變量,如不專門聲明函數(shù)
45、中的局部變量,如不專門聲明staticstatic存儲類存儲類別,都是動態(tài)地分配存儲空間的,數(shù)據(jù)存儲在動態(tài)存別,都是動態(tài)地分配存儲空間的,數(shù)據(jù)存儲在動態(tài)存儲區(qū)中。儲區(qū)中。函數(shù)中的形參和在函數(shù)中定義的變量函數(shù)中的形參和在函數(shù)中定義的變量( (包括在包括在復合語句中定義的變量復合語句中定義的變量) ), 在調用函數(shù)時系統(tǒng)會給它在調用函數(shù)時系統(tǒng)會給它們分配存儲空間,在函數(shù)調用結束時就自動釋放這些們分配存儲空間,在函數(shù)調用結束時就自動釋放這些存儲空間。存儲空間。局部變量的存儲類別局部變量的存儲類別例如:例如:int fint f(int int ) auto int auto int , ,; ; 2
46、022-4-2567自動局部變量 2022-4-252022-4-256767n自動局部變量的作用域與生命期:自動局部變量的作用域與生命期:n從執(zhí)行其定義語句時創(chuàng)建,同時開始了它的作用域。從執(zhí)行其定義語句時創(chuàng)建,同時開始了它的作用域。n當函數(shù)執(zhí)行結束,其自變量空間被撤銷,當函數(shù)執(zhí)行結束,其自變量空間被撤銷,n生命周期和作用域同時結束。生命周期和作用域同時結束??梢允褂玫姆秶嬖诘臅r間2022-4-2568自動局部變量l程序6.10 自動局部變量的生存周期和作用域示例 l思考下列問題:l(1)動態(tài)演示顯示自動局部變量的生存周期起止為?l(2)main中的自動局部變量生命期與作用域一致嗎?l(3)
47、為什么a,b的地址與n,m的地址相同?l(4)如果將AB和NM函數(shù)中的輸出語句復制到main函數(shù)中,程序還正確嗎?為什么?l(5)如果將AB和NM函數(shù)中的變量名統(tǒng)一都改為int x,y;程序還正確嗎?為什么?2022-4-252022-4-2568682022-4-2569靜態(tài)局部變量 l靜態(tài)局部變量:存儲類別static(不可缺省) 表示l生命期:只在函數(shù)第1次被調用時分配空間并初始化(初值若未指定,自動為0),程序結束時生命期結束l存儲位置:在內存數(shù)據(jù)區(qū)的靜態(tài)存儲區(qū)域 l作用域:它所在的函數(shù),只有該函數(shù)被調用時起作用,其余時候處于“休眠”狀態(tài),保持其當前值(“記憶”)l程序6.12 定義函
48、數(shù)fac求n! ,主函數(shù)調用該函數(shù)輸出1!至7!并求階乘之和。l此題充分利用靜態(tài)局部變量的記憶能力,函數(shù)fac無需通過循環(huán)語句就可以計算n!。 2022-4-252022-4-2569692022-4-2570#include double fac(int n)static double f=1.0; f=f*n; return f;int main( )int i; double t,sum=0.0; t=fac(i);printf(“nsum=%10.0fn”,sum); return 0;2022-4-252022-4-2570702022-4-25712022-4-252022-4-2
49、57171教學進程教學進程寄存器變量寄存器變量registerregister變變量量 變量的值是存放在內存中的。變量的值是存放在內存中的。 當程序中用到哪一個變量的值時,當程序中用到哪一個變量的值時,由控制器發(fā)出指令將內存中該變量的由控制器發(fā)出指令將內存中該變量的值送到運算器中。值送到運算器中。 經(jīng)過運算器進行經(jīng)過運算器進行運算,如果需要存數(shù),再從運算器將運算,如果需要存數(shù),再從運算器將數(shù)據(jù)送到內存存放。數(shù)據(jù)送到內存存放。寄存器變量2022-4-25722022-4-252022-4-257272如果有一些變量使用頻繁,為提高執(zhí)行效率,語如果有一些變量使用頻繁,為提高執(zhí)行效率,語言允許將局部
50、變量的值放在言允許將局部變量的值放在CPUCPU中的寄存器中,需中的寄存器中,需要用時直接從寄存器取出參加運算,不必再到內存要用時直接從寄存器取出參加運算,不必再到內存中去存取。中去存取。2022-4-25732022-4-252022-4-257373 三種局部變量的存儲位置是不同的:三種局部變量的存儲位置是不同的:自動變量存儲在動態(tài)存儲區(qū);自動變量存儲在動態(tài)存儲區(qū);靜態(tài)局部變量存儲在靜態(tài)存儲區(qū);靜態(tài)局部變量存儲在靜態(tài)存儲區(qū);寄存器存儲在寄存器存儲在CPUCPU中的寄存器中。中的寄存器中。2022-4-2574外部變量 l外部變量:為克服兩種局部變量的作用域只在某一個函數(shù)內的缺陷,若變量定義
51、在所有函數(shù)之外則為外部變量,也稱為全局變量l生命期:從編譯階段開始,直到程序結束 l存儲位置:在內存數(shù)據(jù)區(qū)的靜態(tài)存儲區(qū)域 l作用域:從其定義點開始以下的所有函數(shù)中去掉同名局部變量所在的部分。l優(yōu)點:多個函數(shù)之間可以方便地實現(xiàn)數(shù)據(jù)共享l缺點:各個函數(shù)之間的數(shù)據(jù)獨立性減弱,通用性降低.l程序6.13 外部變量與局部變量的作用域示例 l注意:外部變量在同名局部量所在的部分不起作用,其余部分連續(xù)變化! 2022-4-252022-4-2574742022-4-2575課堂練習lP137 -138 (一)1-6lP138 二 (2,4)2022-4-252022-4-2575752022-4-2576遞
52、歸的思想 2022-4-252022-4-257676從前有座山,山上有座廟,廟里有一個老和尚從前有座山,山上有座廟,廟里有一個老和尚和一個小和尚,老和尚正在給小和尚講故事。和一個小和尚,老和尚正在給小和尚講故事。講的是什么故事呢?他說,從前講的是什么故事呢?他說,從前2022-4-25772022-4-252022-4-257777void tell_story( )void tell_story( ) int old_monk, young_monk; int old_monk, young_monk; tell_story ( ); tell_story ( ); / / tell_st
53、ory tell_story 函數(shù)的遞歸調用函數(shù)的遞歸調用 封閉的遞歸調用循環(huán),真正的遞歸程序中,一封閉的遞歸調用循環(huán),真正的遞歸程序中,一般度會有一些條件語句進行判斷,當滿足某個般度會有一些條件語句進行判斷,當滿足某個條件時就會終止這個遞歸調用,以免陷入無休條件時就會終止這個遞歸調用,以免陷入無休止的死循環(huán)中止的死循環(huán)中2022-4-25782022-4-252022-4-257878函數(shù)的嵌套調用有一個特例,即遞歸調用,也就函數(shù)的嵌套調用有一個特例,即遞歸調用,也就是說,在調用一個函數(shù)的過程中,又出現(xiàn)了直接是說,在調用一個函數(shù)的過程中,又出現(xiàn)了直接或間接地去調用該函數(shù)本身。或間接地去調用該
54、函數(shù)本身。函數(shù)的遞歸調用函數(shù)的遞歸調用用小整數(shù)的階乘計算大整數(shù)的階乘用小整數(shù)的階乘計算大整數(shù)的階乘:n!=:n!=用小實數(shù)的乘冪計算大實數(shù)的乘冪用小實數(shù)的乘冪計算大實數(shù)的乘冪:xn=:xn=2022-4-25792022-4-252022-4-257979在語法上(簡單)J遞歸即為普通的函數(shù)調用。在算法上(難)J如何找到遞歸形式?J如何找到遞歸邊界?如何編寫遞歸程序?如何編寫遞歸程序? 2022-4-2580分而治之2022-4-252022-4-258080分而治之(分而治之(divide-and-conquerdivide-and-conquer)的算法)的算法設計思想:設計思想:1.1.
55、DivideDivide:把問題劃分為若干個子問題;:把問題劃分為若干個子問題;2.2.ConquerConquer:以同樣的方式分別去處理各:以同樣的方式分別去處理各個子問題;個子問題;3.3.CombineCombine:把各個子問題的處理結果綜:把各個子問題的處理結果綜合起來,形成最終的處理結果。合起來,形成最終的處理結果。2022-4-25812022-4-252022-4-258181如何編寫基于分治策略的遞歸程序?J在算法分析上,要建立分治遞歸的思維方式。J在編程實現(xiàn)上,要建立遞歸信心(To turst the recursion, Jerry Cain, stanford)。20
56、22-4-25822022-4-252022-4-258282如何建立分治遞歸的思維方式?J基本原則:目標驅動!J計算n!:n! = n * (n-1)!,且1! = 1。遞歸形式遞歸形式遞歸邊界遞歸邊界2022-4-25832022-4-252022-4-258383void main( ) int n; printf(請輸入一個整數(shù):請輸入一個整數(shù):); scanf(%d, &n); printf(%d! = %d n, n, fact(n);int fact(int n) if(n = 1) return(1); else return(n * fact(n-1);請輸入一個整數(shù)
57、:請輸入一個整數(shù):33! = 62022-4-25842022-4-252022-4-258484分析?J函數(shù)的遞歸調用到底是如何進行的呢?在遞歸調用時,執(zhí)行的是不是相同的代碼?訪問的是不是相同的數(shù)據(jù)?如果是的話,那么大家會不會相互干擾、相互妨礙?2022-4-25852022-4-252022-4-258585main的棧幀m3void main( ) int m; printf(請輸入一個整數(shù):請輸入一個整數(shù):); scanf(%d, &m); printf(%d! = %dn, m, fact(m);int fact(int n) if(n = 1) return(1); els
58、e return(n * fact(n-1);3nfact的棧幀2nfact的棧幀1nfact的棧幀2022-4-25862022-4-252022-4-258686調用和返回的遞歸示意圖調用和返回的遞歸示意圖 B Bfact(2)fact(2)=2=2* *fact(1)fact(1)=2=2* *1 1=2=2返回返回 D DA Afact(3)fact(3)=3=3* *fact(2)fact(2)=3=3* *2 2=6=6E E返回返回 C Cfact(1)fact(1)=1=1調用調用調用調用2022-4-25872022-4-252022-4-258787調用調用調用調用fact
59、(3)fact(3)fact(2)fact(2)fact(1)fact(1)2022-4-2588遞 歸 l遞歸避免死循環(huán):有明確的遞歸終止條件,每一層遞歸參數(shù)在每次遞歸調用時的取值是不同的,而且它的取值變化可以保證遞歸調用在有限次之后停止l遞歸包含兩個過程:2022-4-252022-4-2588882022-4-25892022-4-252022-4-258989瑪特露什卡瑪特露什卡2022-4-25902022-4-252022-4-259090調用調用調用調用調用調用調用調用調用調用調用調用2022-4-2591課堂練習一lP138 二(1)l 2022-4-252022-4-2591
60、912022-4-2592課堂練習2l 編程:在main函數(shù)中定義一個一維數(shù)組,定義下列函數(shù)并在主函數(shù)中對各函數(shù)進行調用和測試,各函數(shù)原型如下:l (1)輸入函數(shù) void input(int array,int lenth)l (2)打印函數(shù)void print(int array,int lenth)l (3)int GetMax(int array,int lenth)l (4)int Retrieve(int array,int length,int x)l (5)void sort(int array,int lenth)l double average(int array,int lenth)2022-4-252022-4-2592922022-4-25932022-4-252022-4-259393#include#includevoidvoid I
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 箱變開關柜交接試驗報告
- 公寓管家租客合同范本
- 寫好保密合同范本
- ktv店長勞務合同范本
- 買房公示合同范本
- 2022-2027年中國食道癌鱗癌靶向藥物行業(yè)發(fā)展監(jiān)測及發(fā)展戰(zhàn)略規(guī)劃報告
- 農村村民合同范本
- 勞務分包消防合同范例
- 醫(yī)用內窺鏡保修合同范本
- 倉庫代管理服務合同范本
- (高清版)DB43∕T 1147-2015 太陽能果蔬烘干機
- 醫(yī)院人體器官捐獻及獲取流程
- 結腸造瘺還納手術配合
- 2024年云南省中考物理真題含解析
- 《安防監(jiān)控培訓》課件
- 2025年中國艾草行業(yè)市場現(xiàn)狀、發(fā)展概況、未來前景分析報告
- (閩教版)六年級下英語教學計劃
- 人教版英語高考試卷與參考答案(2024年)
- 河砂、碎石生產(chǎn)質量保證措施方案
- 全國教育科學規(guī)劃課題申報書:02.《鑄牢中華民族共同體意識的學校教育研究》
- 三位數(shù)除以兩位數(shù)過關練習口算題大全附答案
評論
0/150
提交評論