版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、電電氣氣與與信信息息工工程程學(xué)學(xué)院院第七章第七章 用函數(shù)實(shí)現(xiàn)模塊化程序設(shè)計(jì)用函數(shù)實(shí)現(xiàn)模塊化程序設(shè)計(jì)電電氣氣與與信信息息工工程程學(xué)學(xué)院院2void main() : x=x*x*x; y=y*y*y; z=z*z*z; ans1=x+y+z; a=a*a*a; b=b*b*b; c=c*c*c; ans2=a+b+c; :重復(fù)多次的同一計(jì)算類型void main() : ans1=cube(x,y,z); ans2=cube(a,b,c); :int cube(int a,b,c) int ans; ans=(a*a*a)+(b*b*b)+(c*c*c); return ans;函數(shù)主程序ans
2、函數(shù)可以把相對獨(dú)立的某個(gè)功能抽象出來,使之成為程序中的一個(gè)獨(dú)立實(shí)體??梢栽谕粋€(gè)程序或其他程序中多次重復(fù)使用電電氣氣與與信信息息工工程程學(xué)學(xué)院院3q模塊化程序設(shè)計(jì)模塊化程序設(shè)計(jì)q基本思想:將一個(gè)大的程序按功能分割成一些小模塊基本思想:將一個(gè)大的程序按功能分割成一些小模塊,q特點(diǎn):特點(diǎn):各模塊相對獨(dú)立、功能單一、結(jié)構(gòu)清晰、接口簡各模塊相對獨(dú)立、功能單一、結(jié)構(gòu)清晰、接口簡單單控制了程序設(shè)計(jì)的復(fù)雜性控制了程序設(shè)計(jì)的復(fù)雜性提高元件的可靠性提高元件的可靠性縮短開發(fā)周期縮短開發(fā)周期避免程序開發(fā)的重復(fù)勞動(dòng)避免程序開發(fā)的重復(fù)勞動(dòng)易于維護(hù)和功能擴(kuò)充易于維護(hù)和功能擴(kuò)充q開發(fā)方法開發(fā)方法: 自上向下自上向下,逐步分
3、解,分而治之逐步分解,分而治之電電氣氣與與信信息息工工程程學(xué)學(xué)院院4函數(shù)機(jī)制的優(yōu)點(diǎn)q使程序變得更簡短而清晰 q有利于程序維護(hù)q可以提高程序開發(fā)的效率 q提高了代碼的重用性 電電氣氣與與信信息息工工程程學(xué)學(xué)院院5qC是模塊化程序設(shè)計(jì)語言是模塊化程序設(shè)計(jì)語言 源程序文件1預(yù)編譯命令說明部分執(zhí)行部分函數(shù)1函數(shù)n源程序文件i源程序文件nC程序C程序結(jié)構(gòu)電電氣氣與與信信息息工工程程學(xué)學(xué)院院6函數(shù)類型 庫函數(shù):由語言系統(tǒng)提供;用戶無須定義,也不必在程序中作類型說明;只需在程序前包含有該函數(shù)定義的頭文件; 自定義函數(shù):用戶在程序中根據(jù)需要而編寫的函數(shù);電電氣氣與與信信息息工工程程學(xué)學(xué)院院7問題描述:求自然數(shù)
4、110的平方根和立方。 內(nèi)置函數(shù)sqrt 和pow 示例2664#include #include void main() int x=1; double squareroot,power; while(x y?x:y; return m;該函數(shù)名為displayDiscount,無參數(shù),使用void說明無返回值,函數(shù)體內(nèi)的語句用于根據(jù)產(chǎn)品的價(jià)格求折扣后的價(jià)格。該函數(shù)名為max,它有兩個(gè)double類型的參數(shù),返回值為double類型。在函數(shù)體內(nèi)有三條語句實(shí)現(xiàn)了求兩個(gè)數(shù)中較大的數(shù),并將它返回。電電氣氣與與信信息息工工程程學(xué)學(xué)院院9q一般格式一般格式合法標(biāo)識(shí)符函數(shù)返回值類型缺省int型無返回值v
5、oid函數(shù)體函數(shù)類型函數(shù)類型 函數(shù)名(形參類型說明表)函數(shù)名(形參類型說明表) 說明部分說明部分語句部分語句部分 現(xiàn)代風(fēng)格現(xiàn)代風(fēng)格: : 有參函數(shù)(現(xiàn)代風(fēng)格) int max(int x,int y) int z; z=xy?x:y; return(z); 有參函數(shù)(現(xiàn)代風(fēng)格) int max(int x, y) int z; z=xy?x:y; return(z); 空函數(shù) dummy( ) 函數(shù)體為空無參函數(shù) printstar( ) printf(“*n”); 或 printstar(void ) printf(“*n”); 形式參數(shù)表形式參數(shù)表: :是用逗號(hào)分開的一組變量,是用逗號(hào)分開
6、的一組變量,用來接收調(diào)用時(shí)傳入的數(shù)據(jù)。用來接收調(diào)用時(shí)傳入的數(shù)據(jù)。電電氣氣與與信信息息工工程程學(xué)學(xué)院院10int divisibleCheck(int num) if (num % 5 = 0) return 1; else return 0; C語言中的函數(shù)至多可以返回一個(gè)值,不能返回多個(gè)值; 返回值的數(shù)據(jù)類型必須與函數(shù)原型中返回值的數(shù)據(jù)類型匹配; 當(dāng)遇到 return 語句時(shí),函數(shù)執(zhí)行將終止。程序控制流將立即返回調(diào)用函數(shù);函數(shù)返回值qC 語言中的 return 語句用于向調(diào)用函數(shù)返回值,語法如下: return (); 電電氣氣與與信信息息工工程程學(xué)學(xué)院院11q 返回語句返回語句q形式:形式
7、: return(表達(dá)式表達(dá)式); 或或 return 表達(dá)式表達(dá)式; 或或 return;q功能:使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同時(shí)把返功能:使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同時(shí)把返值帶給調(diào)用函數(shù)值帶給調(diào)用函數(shù)q說明:說明:函數(shù)中可有多個(gè)函數(shù)中可有多個(gè)return語句語句若無若無return語句,遇語句,遇時(shí),自動(dòng)返回調(diào)用函數(shù)時(shí),自動(dòng)返回調(diào)用函數(shù)若函數(shù)類型與若函數(shù)類型與return語句中表達(dá)式值的類型不一語句中表達(dá)式值的類型不一致,按前者為準(zhǔn),自動(dòng)轉(zhuǎn)換致,按前者為準(zhǔn),自動(dòng)轉(zhuǎn)換-函數(shù)調(diào)用轉(zhuǎn)換函數(shù)調(diào)用轉(zhuǎn)換void型函數(shù)型函數(shù)例:無返回值函數(shù) void swap(int x,in
8、t y ) int temp; temp=x; x=y; y=temp; 電電氣氣與與信信息息工工程程學(xué)學(xué)院院12 printstar() printf(*);main() int a; a=printstar(); printf(%d,a);例:函數(shù)帶回不確定值輸出:10void printstar() printf(*);main() int a; a=printstar(); printf(%d,a);編譯錯(cuò)誤!編譯錯(cuò)誤!電電氣氣與與信信息息工工程程學(xué)學(xué)院院13例:函數(shù)返回值類型轉(zhuǎn)換main() float a,b; int c; scanf(%f,%f,&a,&b); c=max(a,
9、b); printf(Max is %dn,c);max(float x, float y) float z; z=xy?x:y; return(z);電電氣氣與與信信息息工工程程學(xué)學(xué)院院14函數(shù)返回值示例#include int get_age();void main() int age1, age2, age3; age1 = get_age(); age2 = get_age(); age3 = get_age(); if ( (age1 age2) & (age1 age3) printf(n年齡為 %d 的人最大n, age1); else if( (age2 age1) & (ag
10、e2 age3)printf(n年齡為 %d 的人最大n, age2); else if( (age3 age1) & (age3 age2)printf(n年齡為 %d 的人最大n, age2);內(nèi)存age1age26578age3int get_age() int age; printf(n請輸入年齡: ); scanf(%d,&age); return age;請輸入年齡:65請輸入年齡:78請輸入年齡:54年齡為 78 歲的人最大54電電氣氣與與信信息息工工程程學(xué)學(xué)院院15q 函數(shù)是函數(shù)是C程序的最小單元。程序的最小單元。q C程序是由一個(gè)主函數(shù)以及若干個(gè)函數(shù)構(gòu)成。程序是由一個(gè)主函數(shù)以
11、及若干個(gè)函數(shù)構(gòu)成。q 主函數(shù)可以調(diào)用其它函數(shù),其它函數(shù)可以相互調(diào)用。主函數(shù)可以調(diào)用其它函數(shù),其它函數(shù)可以相互調(diào)用。q必須有且只能有一個(gè)名為main的主函數(shù)qC程序的執(zhí)行總是從main函數(shù)開始,在main中結(jié)束q 例如:例如:main()main() printf(“Thisprintf(“This is C programn”); is C programn”); 就是就是 mainmain 函數(shù)調(diào)用了函數(shù)調(diào)用了 printfprintf 函數(shù)。函數(shù)。printfprintf函函數(shù)是一個(gè)庫函數(shù)。為了完成一個(gè)特定的任務(wù),在數(shù)是一個(gè)庫函數(shù)。為了完成一個(gè)特定的任務(wù),在程序開發(fā)中一般要定義若干函數(shù)。程
12、序開發(fā)中一般要定義若干函數(shù)。電電氣氣與與信信息息工工程程學(xué)學(xué)院院16q 函數(shù)分類函數(shù)分類q從用戶角度從用戶角度標(biāo)準(zhǔn)函數(shù)(庫函數(shù)):由系統(tǒng)提供標(biāo)準(zhǔn)函數(shù)(庫函數(shù)):由系統(tǒng)提供用戶自定義函數(shù)用戶自定義函數(shù)q從函數(shù)形式從函數(shù)形式無參函數(shù)無參函數(shù)有參函數(shù)有參函數(shù)使用庫函數(shù)應(yīng)注意:1、函數(shù)功能2、函數(shù)參數(shù)的數(shù)目和順序,及各參數(shù)意義和類型3、函數(shù)返回值意義和類型4、需要使用的包含文件包含文件電電氣氣與與信信息息工工程程學(xué)學(xué)院院17q 通過在程序中使用函數(shù)名稱,可以執(zhí)行函數(shù)中包含的語句,這稱為調(diào)用函數(shù)q 函數(shù)之間允許相互調(diào)用,也允許嵌套調(diào)用q 函數(shù)還可以自己調(diào)用自己,稱為遞歸調(diào)用#includevoid ma
13、in():set_discount();displayDiscount();:float set_discount() : :float displayDiscount() : :7.3調(diào)用函數(shù)調(diào)用函數(shù)電電氣氣與與信信息息工工程程學(xué)學(xué)院院18問題描述:根據(jù)用戶的選擇求不同形狀的面積。函數(shù)調(diào)用示例#includevoid AreaOfRect();void AreaOfTriangle();void AreaOfRound();void main() int select; do printf( 0、退出n 1、長方形n 2、三角形n 3、圓形n);printf(請選擇功能:);scanf(%d
14、,&select);if(select = 0) break;switch(select) case 1 : AreaOfRect(); break; /長方形 case 2 : AreaOfTriangle(); break; /三角形 case 3 : AreaOfRound(); break; /圓形 default : printf(輸入有誤,請?jiān)?04 之間選擇。n); while(1);void AreaOfRect() int x,y; printf(請輸入長方形的長:); scanf(%d,&x); printf(請輸入長方形的寬:); scanf(%d,&y); printf
15、(面積為:%dn,(x * y); void AreaOfTriangle() int x,y; printf(請輸入三角形的底:); scanf(%d,&x); printf(請輸入三角形的高:); scanf(%d,&y); printf(面積為:%dn,(x * y)/2); void AreaOfRound() int r; printf(請輸入圓形的半徑:); scanf(%d,&r); printf(面積為:%dn,3.14*r*r); 函數(shù)原型演示:示例6電電氣氣與與信信息息工工程程學(xué)學(xué)院院19q調(diào)用形式調(diào)用形式 函數(shù)名函數(shù)名(實(shí)參表實(shí)參表);說明:說明:實(shí)參與形參實(shí)參與形參個(gè)數(shù)
16、相等,類型一致,按順序一一對應(yīng)個(gè)數(shù)相等,類型一致,按順序一一對應(yīng)實(shí)參表求值順序,因系統(tǒng)而定(實(shí)參表求值順序,因系統(tǒng)而定(Turbo C 自右向左自右向左)函數(shù)調(diào)用函數(shù)調(diào)用時(shí),可以使用時(shí),可以使用參數(shù)參數(shù)、返回值返回值、全全局變量局變量等方式在不同的函數(shù)之間傳遞數(shù)據(jù)。等方式在不同的函數(shù)之間傳遞數(shù)據(jù)。電電氣氣與與信信息息工工程程學(xué)學(xué)院院20main() int i=2,p; p=f(i,+i); printf(%d,p);int f(int a, int b) int c; if(ab) c=1; else if(a=b) c=0; else c=-1; return(c);例例:參數(shù)求值順序參數(shù)
17、求值順序main() int i=2,p; p=f(i, i+); printf(%d,p);int f(int a, int b) int c; if(ab) c=1; else if(a=b) c=0; else c=-1; return(c);運(yùn)行結(jié)果:0運(yùn)行結(jié)果:1電電氣氣與與信信息息工工程程學(xué)學(xué)院院21q調(diào)用方式調(diào)用方式q函數(shù)語句:函數(shù)語句: 例例:printstar(); printf(“Hello,World!n”);q函數(shù)表達(dá)式:函數(shù)表達(dá)式: 例例:m=max(a,b)*2;q函數(shù)參數(shù):函數(shù)參數(shù): 例例:printf(“%d”,max(a,b); m=max(a,max(b,c
18、);電電氣氣與與信信息息工工程程學(xué)學(xué)院院22q函數(shù)參數(shù)及其傳遞方式函數(shù)參數(shù)及其傳遞方式q形參與實(shí)參形參與實(shí)參q形式參數(shù):定義函數(shù)時(shí)函數(shù)名后面括號(hào)中的變量名形式參數(shù):定義函數(shù)時(shí)函數(shù)名后面括號(hào)中的變量名q實(shí)際參數(shù):調(diào)用函數(shù)時(shí)函數(shù)名后面括號(hào)中的表達(dá)式實(shí)際參數(shù):調(diào)用函數(shù)時(shí)函數(shù)名后面括號(hào)中的表達(dá)式c=max(a,b); (main 函數(shù))函數(shù)) (max 函數(shù))函數(shù))max(int x, int y) int z; z=xy?x:y; return(z); 例例: 比較兩個(gè)數(shù)并輸出大者比較兩個(gè)數(shù)并輸出大者main() int a,b,c; scanf(%d,%d,&a,&b); c=max(a,b);
19、printf(Max is %d,c);max(int x, int y) int z; z=xy?x:y; return(z);形參形參實(shí)參實(shí)參電電氣氣與與信信息息工工程程學(xué)學(xué)院院23q說明:說明:實(shí)參必須有確定的值實(shí)參必須有確定的值形參必須指定類型形參必須指定類型形參與實(shí)參形參與實(shí)參類型一致,個(gè)數(shù)相同類型一致,個(gè)數(shù)相同若形參與實(shí)參類型不一致,自動(dòng)按形參類型轉(zhuǎn)若形參與實(shí)參類型不一致,自動(dòng)按形參類型轉(zhuǎn)換換函數(shù)調(diào)用轉(zhuǎn)換函數(shù)調(diào)用轉(zhuǎn)換形參在函數(shù)被調(diào)用前不占內(nèi)存形參在函數(shù)被調(diào)用前不占內(nèi)存;函數(shù)調(diào)用時(shí)為形參函數(shù)調(diào)用時(shí)為形參分配內(nèi)存;調(diào)用結(jié)束,內(nèi)存釋放分配內(nèi)存;調(diào)用結(jié)束,內(nèi)存釋放q形參與實(shí)參q形式參數(shù):定
20、義函數(shù)時(shí)函數(shù)名后面括號(hào)中的變量名形式參數(shù):定義函數(shù)時(shí)函數(shù)名后面括號(hào)中的變量名q實(shí)際參數(shù):調(diào)用函數(shù)時(shí)函數(shù)名后面括號(hào)中的表達(dá)式實(shí)際參數(shù):調(diào)用函數(shù)時(shí)函數(shù)名后面括號(hào)中的表達(dá)式電電氣氣與與信信息息工工程程學(xué)學(xué)院院24例例:計(jì)算計(jì)算x的立方的立方#include float cube(float x) return(x*x*x);main() float a, product; printf(Please input value of a:); scanf(%f,&a); product=cube(a); printf(”Cube of %.4f is %.4fn,a,product);xaproduct
21、28電電氣氣與與信信息息工工程程學(xué)學(xué)院院25q參數(shù)傳遞方式參數(shù)傳遞方式q值傳遞值傳遞方式方式方式:函數(shù)調(diào)用時(shí)方式:函數(shù)調(diào)用時(shí),為形參分配單元為形參分配單元,并將實(shí)參的值并將實(shí)參的值復(fù)制復(fù)制到形參中;調(diào)用結(jié)束,形參單元被釋放,實(shí)參到形參中;調(diào)用結(jié)束,形參單元被釋放,實(shí)參單元仍保留并維持原值單元仍保留并維持原值特點(diǎn):特點(diǎn):形參與實(shí)參占用形參與實(shí)參占用不同不同的內(nèi)存單元的內(nèi)存單元單向單向傳遞傳遞電電氣氣與與信信息息工工程程學(xué)學(xué)院院26711x:y:調(diào)用前:調(diào)用結(jié)束:711x:y: 交換兩個(gè)數(shù)#include main() int x=7,y=11; printf(x=%d,ty=%
22、dn,x,y); printf(swapped:n); swap(x,y); printf(x=%d,ty=%dn,x,y);swap(int a,int b) int temp; temp=a; a=b; b=temp;調(diào)用:711a:b:711x:y:swap:711x:y:117a:b:temp電電氣氣與與信信息息工工程程學(xué)學(xué)院院27q地址傳遞地址傳遞方式:函數(shù)調(diào)用時(shí),將數(shù)據(jù)的方式:函數(shù)調(diào)用時(shí),將數(shù)據(jù)的存儲(chǔ)地址存儲(chǔ)地址作為參數(shù)作為參數(shù)傳遞給形參傳遞給形參特點(diǎn):特點(diǎn):形參與實(shí)參占用形參與實(shí)參占用同樣同樣的存儲(chǔ)單元的存儲(chǔ)單元“雙向雙向”傳遞傳遞實(shí)參和形參必須是實(shí)參和形參必須是地址地址常量或變
23、量常量或變量 參數(shù)傳遞方式參數(shù)傳遞方式 值傳遞值傳遞方式方式 數(shù)組名作函數(shù)參數(shù)數(shù)組名作函數(shù)參數(shù)地址傳遞地址傳遞在主調(diào)函數(shù)與被調(diào)函數(shù)分別定義數(shù)組在主調(diào)函數(shù)與被調(diào)函數(shù)分別定義數(shù)組,且類且類型應(yīng)一致型應(yīng)一致形參數(shù)組大小形參數(shù)組大小(多維數(shù)組第一維多維數(shù)組第一維)可不指定可不指定形參數(shù)組名是形參數(shù)組名是地址變量地址變量電電氣氣與與信信息息工工程程學(xué)學(xué)院院28例例:數(shù)組元素與數(shù)組名數(shù)組元素與數(shù)組名 作函數(shù)參數(shù)比較作函數(shù)參數(shù)比較12a調(diào)用前a0a112a調(diào)用a0a112xy21xy交換12a返回#include void swap2(int x,int y) int z; z=x; x=y; y=z;ma
24、in() int a2=1,2; swap2(a0,a1); printf(a0=%dna1=%dn,a0,a1);值傳遞值傳遞電電氣氣與與信信息息工工程程學(xué)學(xué)院院2912a調(diào)用前12ax調(diào)用21ax交換21a返回地址傳遞例例:數(shù)組元素與數(shù)組元素與 數(shù)組名數(shù)組名 作函數(shù)參數(shù)比較作函數(shù)參數(shù)比較#include void swap2(int x) int z; z=x0; x0=x1; x1=z;main() int a2=1,2; swap2(a); printf(a0=%dna1=%dn,a0,a1);例例: :數(shù)組排序數(shù)組排序-簡單選擇排序簡單選擇排序void sort(int array,
25、int n) int i,j,k,t; for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+) if(arrayjarrayk) k=j; if(k!=i) t=arrayi; arrayi=arrayk; arrayk=t; main() int a10,i; for(i=0;i10;i+)scanf(%d,&ai); sort(a,10); for(i=0;i10;i+) printf(%d ,ai); printf(n);0123456789a4968573299927137688arraykjjjkjkjjjjj949i=0例例: :數(shù)組排序數(shù)組排序-簡單選擇排序
26、簡單選擇排序void sort(int array,int n) int i,j,k,t; for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+) if(arrayjarrayk) k=j; if(k!=i) t=arrayi; arrayi=arrayk; arrayk=t; main() int a10,i; for(i=0;i10;i+)scanf(%d,&ai); sort(a,10); for(i=0;i10;i+) printf(%d ,ai); printf(n);kjjkjkjjjjj0123456789a4968573299927137688array9
27、49kk1368i=10123456789a9132732495768768899arrayi=8例例: :數(shù)組排序數(shù)組排序-簡單選擇排序簡單選擇排序void sort(int array,int n) int i,j,k,t; for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+) if(arrayjarrayk) k=j; if(k!=i) t=arrayi; arrayi=arrayk; arrayk=t; main() int a10,i; for(i=0;i10;i+)scanf(%d,&ai); sort(a,10); for(i=0;i10;i+) prin
28、tf(%d ,ai); printf(n);電電氣氣與與信信息息工工程程學(xué)學(xué)院院33函數(shù)原型#include float count (int, int);void main() . . . . . .float count(int x,int y) . . .q 函數(shù)原型說明在形式上與函數(shù)頭部類似,最后加一個(gè)分號(hào)。原型說明中參數(shù)表里的參數(shù)名可以不寫(只寫參數(shù)類型)。q 在C語言程序中用到的所有函數(shù),必須“先定義,后使用”q 指定函數(shù)名字、函數(shù)返回值類型、函數(shù)實(shí)現(xiàn)的功能以及參數(shù)的個(gè)數(shù)與類型,將這些信息通知編譯系統(tǒng)。7.4對被調(diào)函數(shù)的聲明和函數(shù)原對被調(diào)函數(shù)的聲明和函數(shù)原型型q函數(shù)說明函數(shù)說明q對
29、被調(diào)用函數(shù)要求:對被調(diào)用函數(shù)要求: 必須是必須是已存在已存在的函數(shù)的函數(shù) 庫函數(shù)庫函數(shù): #include 用戶自定義函數(shù)用戶自定義函數(shù): 函數(shù)類型說明函數(shù)類型說明q函數(shù)說明函數(shù)說明 一般形式:一般形式: 函數(shù)類型函數(shù)類型 函數(shù)名函數(shù)名(形參類型形參類型 形參名形參名,. ); 或或 函數(shù)類型函數(shù)類型 函數(shù)名函數(shù)名(); 作用:告訴編譯系統(tǒng)作用:告訴編譯系統(tǒng)函數(shù)類型、參數(shù)個(gè)數(shù)及類型,以便檢驗(yàn)函數(shù)類型、參數(shù)個(gè)數(shù)及類型,以便檢驗(yàn) 函數(shù)定義函數(shù)定義與與函數(shù)說明函數(shù)說明不同不同 函數(shù)說明位置:函數(shù)說明位置:程序的數(shù)據(jù)說明部分(函數(shù)內(nèi)或外)程序的數(shù)據(jù)說明部分(函數(shù)內(nèi)或外) 下列情況下,可不作函數(shù)說明下列
30、情況下,可不作函數(shù)說明 若函數(shù)返值是若函數(shù)返值是char或或int型型,系統(tǒng)自動(dòng)按,系統(tǒng)自動(dòng)按int型處理型處理 被調(diào)用函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前被調(diào)用函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前 有些系統(tǒng)有些系統(tǒng)(如如Borland C+)要求函數(shù)說明指出函數(shù)返值類型和要求函數(shù)說明指出函數(shù)返值類型和形參類型,并且對形參類型,并且對void 和和 int 型函數(shù)也要進(jìn)行函數(shù)說明型函數(shù)也要進(jìn)行函數(shù)說明電電氣氣與與信信息息工工程程學(xué)學(xué)院院35例例:函數(shù)說明舉例函數(shù)說明舉例main() float a,b; int c; scanf(%f,%f,&a,&b); c=max(a,b); printf(Max is %d
31、n,c);max(float x, float y) float z; z=xy?x:y; return(z);int型函數(shù)可不作函數(shù)說明(Borland C+不行)float add(float x, float y) float z; z=x+y; return(z);main() float a,b,c; scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %f,c);被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)之前,不必函數(shù)說明main() float add(float,float); /*function declaration*/ float a,b,c; sc
32、anf(%f,%f,&a,&b); c=add(a,b); printf(sum is %f,c);float add(float x, float y) float z; z=x+y; return(z);float add();電電氣氣與與信信息息工工程程學(xué)學(xué)院院36#include long sum(int a, int b); long factorial(int n);main() int n1,n2; long a; scanf(%d,%d,&n1,&n2); a=sum(n1,n2); printf(a=%1d,a); long sum(int a,int b) long c1,
33、c2; c1=factorial(a); c2=factorial(b); return(c1+c2); long factorial(int n) long rtn=1; int i; for(i=1;i=n;i+) rtn*=i; return(rtn); long sum(int a, int b);long factorial(int n);文件包含編譯預(yù)處理命令函數(shù)類型說明函數(shù)定義函數(shù)調(diào)用函數(shù)調(diào)用函數(shù)返回值形參實(shí)參電電氣氣與與信信息息工工程程學(xué)學(xué)院院37void reverse() : :#includevoid main():palindrome();:void palindrom
34、e() : reverse(); :7.5函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用從一個(gè)函數(shù)調(diào)用另一個(gè)函數(shù)稱為函數(shù)的嵌套調(diào)用 電電氣氣與與信信息息工工程程學(xué)學(xué)院院38C規(guī)定:規(guī)定:函數(shù)定義不可嵌套函數(shù)定義不可嵌套,但,但可以嵌套調(diào)用可以嵌套調(diào)用函數(shù)函數(shù)電電氣氣與與信信息息工工程程學(xué)學(xué)院院39求兩個(gè)正整數(shù)求兩個(gè)正整數(shù)a a、b b的最小公倍數(shù)。的最小公倍數(shù)。 最 最小公倍數(shù)可按下面的公式求出: 最小公倍數(shù)=的最大公約數(shù)和baba 若要求最小公倍數(shù)則必先求最大公約數(shù) 可分別用三個(gè)函數(shù)實(shí)現(xiàn)各部分功能(1) 用函數(shù)hcf(m,n)求m,n的最大公約數(shù);(2) 用函數(shù)lcd(x,y)求x,y的最小公倍數(shù);(3) 在
35、主函數(shù)中進(jìn)行輸入和輸出;電電氣氣與與信信息息工工程程學(xué)學(xué)院院40int hcf(int m,int n)int t,r;r=m%n;while(r!=0) m=n; n=r; r=m%n; return(n);int lcd(int x,int y) int h,l; h=hcf(x,y); l=(x*y)/h; return(l); main() int s,a,b; scanf(%d%d,&a,&b); s=lcd(a,b); printf(最小公倍數(shù)為:d,s); 設(shè)輸入為98 和32則x=98 y=32則m=98 n=32返回4電電氣氣與與信信息息工工程程學(xué)學(xué)院院41int hcf(i
36、nt m,int n)int t,r;r=m%n;while(r!=0) m=n; n=r; r=m%n; return(n);int lcd(int x,int y) int h,l; h=hcf(x,y); l=(x*y)/h; return(l); main() int s,a,b; scanf(%d%d,&a,&b); s=lcd(a,b); printf(最小公倍數(shù)為:d,s); 設(shè)輸入為98 和32則x=98 y=32h=4返回返回784電電氣氣與與信信息息工工程程學(xué)學(xué)院院42int lcd(int x,int y) int h,l; h=hcf(x,y); l=(x*y)/h;
37、return(l); main() int s,a,b; scanf(%d%d,&a,&b); s=lcd(a,b); printf(最小公倍數(shù)為:d,s); 設(shè)輸入為98 和32int hcf(int m,int n)int t,r;r=m%n;while(r!=0) m=n; n=r; r=m%n; return(n);s=784電電氣氣與與信信息息工工程程學(xué)學(xué)院院43例:求三個(gè)數(shù)中最大數(shù)和最小數(shù)的差值#include int dif(int x,int y,int z); int max(int x,int y,int z); int min(int x,int y,int z);voi
38、d main() int a,b,c,d; scanf(%d%d%d,&a,&b,&c); d=dif(a,b,c); printf(Max-Min=%dn,d); int dif(int x,int y,int z) return max(x,y,z)-min(x,y,z); int max(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z); int min(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z); main( )調(diào)用函數(shù)dif輸出結(jié)束dif函數(shù)max函數(shù)調(diào)用函數(shù)max調(diào)用函數(shù)m
39、inmin函數(shù)電電氣氣與與信信息息工工程程學(xué)學(xué)院院44例:用弦截法求方程根例:用弦截法求方程根08016523xxxxyf(x)0 x1x2xf(x1)f(x2)()()()(121221xfxfxfxxfxx略過略過電電氣氣與與信信息息工工程程學(xué)學(xué)院院45求f(x1)與f(x2)連線與x軸的交點(diǎn)x輸入x1,x2,求f(x1),f(x2)直到f(x1)與f(x2)異號(hào)y=f(x),y1=f(x1)y與y1同號(hào)真假x1=xy1=yx2=x直到 |y|root=x 輸出 rootroot函數(shù)運(yùn)行情況:Input x1,x2:2,6A root of equation is 5.0000main(
40、)調(diào)用函數(shù)root輸出根 x結(jié)束root函數(shù)xpoint函數(shù)調(diào)用函數(shù)xpoint調(diào)用函數(shù)ff函數(shù)電電氣氣與與信信息息工工程程學(xué)學(xué)院院46/* 此函數(shù)用于計(jì)算 a 的階乘 */int factorial(int a) if (a = 1) return 1; else a = a * factorial(a-1); return a; 在一個(gè)函數(shù)體內(nèi)調(diào)用自身稱為函數(shù)的遞歸調(diào)用 7.6函數(shù)的遞歸調(diào)用函數(shù)的遞歸調(diào)用電電氣氣與與信信息息工工程程學(xué)學(xué)院院47q定義:函數(shù)直接或間接的調(diào)用自身叫函數(shù)的遞歸調(diào)用定義:函數(shù)直接或間接的調(diào)用自身叫函數(shù)的遞歸調(diào)用f( )調(diào)f調(diào)f2調(diào)f1f1( )f2( )q說明說明
41、 C編譯系統(tǒng)對遞歸函數(shù)的自調(diào)用次數(shù)沒有限制編譯系統(tǒng)對遞歸函數(shù)的自調(diào)用次數(shù)沒有限制 每調(diào)用函數(shù)一次,在內(nèi)存堆棧區(qū)分配空間,用于存放函數(shù)變每調(diào)用函數(shù)一次,在內(nèi)存堆棧區(qū)分配空間,用于存放函數(shù)變量、返回值等信息,所以遞歸次數(shù)過多,可能引起堆棧溢出量、返回值等信息,所以遞歸次數(shù)過多,可能引起堆棧溢出int f(int x) int y,z; z=f(y); . return(2*z);int f1(int x) int y,z; z=f2(y); . return(2*z);int f2(int t) int a,c; c=f1(a); . return(3+c);電電氣氣與與信信息息工工程程學(xué)學(xué)院院4
42、8例:求例:求n的階乘的階乘) 1()!1() 1 , 0(1!nnnnnfac(int n) int f; if(n0) printf(n0,data error!); else if(n=0|n=1) f=1; else f=fac(n-1)*n; return(f);main() int n, y; printf(Input a integer number:); scanf(%d,&n); y=fac(n); printf(%d! =%15d,n,y);int fac(int n) int f; if(n0) printf(n0,data error!); else if(n=0|n=
43、1) return(1); else return (f=fac(n-1)*n);電電氣氣與與信信息息工工程程學(xué)學(xué)院院49fac(int n) int f; if(n0) printf(n0,data error!); else if(n=0|n=1) f=1; else f=fac(n-1)*n; return(f);main() int n, y; printf(Input a integer number:); scanf(%d,&n); y=fac(n); printf(%d! =%15d,n,y);設(shè)輸入n為4n=4fac(3)n=3電電氣氣與與信信息息工工程程學(xué)學(xué)院院50n n4
44、4= = 44fac(int n) int f; if(n0) printf(n0,data error!); else if(n=0|n=1) f=1; else f=fac(n-1)*n; return(f);fac(int n) int f; if(n0) printf(n0,data error!); else if(n=0|n=1) f=1; else f=fac(n-1)*n; return(f);fac(int n) int f; if(n0) printf(n0,data error!); else if(n=0|n=1) f=1; else f=fac(n-1)*n; ret
45、urn(f);fac(int n) int f; if(n0) printf(n%cn,getone,putone); void hanoi(int n,char one,char two,char three) if(n=1) move(one,three); else hanoi(n-1,one,three,two);move(one,three);hanoi(n-1,two,one,three); main() int m; printf(Input the number of disks:); scanf(%d,&m); printf(The steps to moving %3d d
46、isks:n,m); hanoi(m,A,B,C);ABC電電氣氣與與信信息息工工程程學(xué)學(xué)院院567.7數(shù)組作為函數(shù)參數(shù)數(shù)組作為函數(shù)參數(shù)電電氣氣與與信信息息工工程程學(xué)學(xué)院院57q 局部變量與全局變量局部變量與全局變量q局部變量局部變量-內(nèi)部變量內(nèi)部變量q定義:在定義:在函數(shù)內(nèi)定義函數(shù)內(nèi)定義,只在本函數(shù)內(nèi)有效只在本函數(shù)內(nèi)有效q說明:說明:main中定義的變量只在中定義的變量只在main中有效中有效不同函數(shù)中同名變量,占不同內(nèi)存單元不同函數(shù)中同名變量,占不同內(nèi)存單元形參屬于局部變量形參屬于局部變量可定義在復(fù)合語句中有效的變量可定義在復(fù)合語句中有效的變量float f1(int a) int b,c
47、; .char f2(int x,int y) int i,j; main() int m,n; .a,b,c有效x,y,i,j有效m,n有效不同函數(shù)中同名變量main() int a,b; a=3; b=4; printf(main:a=%d,b=%dn,a,b); sub(); printf(main:a=%d,b=%dn,a,b);sub() int a,b; a=6; b=7; printf(sub:a=%d,b=%dn,a,b);復(fù)合語句中變量#define N 5main() int i; int aN=1,2,3,4,5; for(i=0;iN/2;i+) int temp;te
48、mp=ai;ai=aN-i-1;aN-i-1=temp; for(i=0;iN;i+) printf(%d ,ai);運(yùn)行結(jié)果:5 4 3 2 1復(fù)合語句中變量#define N 5main() int i; int aN=1,2,3,4,5; for(i=0;iN/2;i+) int temp;temp=ai;ai=aN-i-1;aN-i-1=temp; for(i=0;iN;i+) printf(%d ,ai);不同函數(shù)中同名變量main() int a,b; a=3; b=4; printf(main:a=%d,b=%dn,a,b); sub(); printf(main:a=%d,b=
49、%dn,a,b);sub() int a,b; a=6; b=7; printf(sub:a=%d,b=%dn,a,b);運(yùn)行結(jié)果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4q7.8局部變量和全局變量局部變量和全局變量電電氣氣與與信信息息工工程程學(xué)學(xué)院院58q全局變量-外部變量q定義:在函數(shù)外定義,可為本文件所有函數(shù)共用q有效范圍:從定義變量的位置開始到本源文件結(jié)束,及有extern說明的其它源文件 應(yīng)盡量少使用全局變量,因?yàn)椋篩全局變量在程序全部執(zhí)行過程中占用存儲(chǔ)單元Y降低了函數(shù)的通用性、可靠性,可移植性Y降低程序清晰性,容易出錯(cuò)q若外部變量與局部變量同名,則外部
50、變量被屏蔽電電氣氣與與信信息息工工程程學(xué)學(xué)院院59float max,min;float average(float array, int n) int i; float sum=array0; max=min=array0; for(i=1;imax) max=arrayi; else if(arrayib?a:b; return(c);main() int a=8; printf(max=%d,max(a,b);例:全局變量與局部變量運(yùn)行結(jié)果:max=8電電氣氣與與信信息息工工程程學(xué)學(xué)院院61int i;main() void prt(); for(i=0;i5;i+) prt();voi
51、d prt() for(i=0;i5;i+) printf(“%c”,*); printf(“n”);全局變量副作用運(yùn)行結(jié)果:*電電氣氣與與信信息息工工程程學(xué)學(xué)院院62q變量的屬性q數(shù)據(jù)類型:變量所持有的數(shù)據(jù)的性質(zhì)(操作屬性)q存儲(chǔ)屬性存儲(chǔ)器類型:寄存器、靜態(tài)存儲(chǔ)區(qū)、動(dòng)態(tài)存儲(chǔ)區(qū)生存期:變量在某一時(shí)刻存在-靜態(tài)變量與動(dòng)態(tài)變量作用域:變量在某區(qū)域內(nèi)有效-局部變量與全局變量q變量的存儲(chǔ)類型auto -自動(dòng)型register-寄存器型static -靜態(tài)型extern -外部型q變量定義格式: 存儲(chǔ)類型 數(shù)據(jù)類型 變量表;7.9變量的存儲(chǔ)類別和生存期變量的存儲(chǔ)類別和生存期q概述如: int sum;
52、auto int a,b,c; register int i; static float x,y;電電氣氣與與信信息息工工程程學(xué)學(xué)院院63q變量存儲(chǔ)類型u局部變量默認(rèn)為auto型uregister型變量個(gè)數(shù)受限,且不能為long, double, float型u局部static變量具有全局壽命和局部可見性u局部static變量具有可繼承性uextern不是變量定義,可擴(kuò)展外部變量作用域 定義 說明u次數(shù): 只能1次 可說明多次u位置: 所有函數(shù)之外 函數(shù)內(nèi)或函數(shù)外u分配內(nèi)存: 分配內(nèi)存,可初始化 不分配內(nèi)存,不可初始化外部變量說明: extern 數(shù)據(jù)類型 變量表;外部變量定義與外部變量說明不同電電氣氣與與信信息息工工程程學(xué)學(xué)院院64int p=1,q=5;float f1(int a) int b,c; .int f3().char c1,c2;char f2(int x,int y) int i,j; main() int m,n; .c1,c2的作用范圍p,q的作用范圍extern char c1,c2;extern char c1,c2;c1,c2的作用范圍擴(kuò)展后c1,c2的作用范圍
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 小學(xué)信息技術(shù)四年級上冊第15課《綜合實(shí)踐活動(dòng)》說課稿
- 資產(chǎn)轉(zhuǎn)讓合同格式
- 專業(yè)借款合同樣本:工程
- 2024房屋裝修合同協(xié)議書個(gè)人范本
- 標(biāo)準(zhǔn)版店鋪?zhàn)赓U合同樣式
- 2024年度網(wǎng)絡(luò)安全服務(wù)合同標(biāo)的定義與執(zhí)行細(xì)則
- 水產(chǎn)養(yǎng)殖合同收購范例
- 2024衛(wèi)星遙感數(shù)據(jù)服務(wù)采購合同
- 2024人工智能在醫(yī)療診斷中的應(yīng)用合同
- 2024年廣告發(fā)布與 media buy 合同
- 輪扣式模板支撐架安全專項(xiàng)施工方案
- 酒店裝飾裝修工程驗(yàn)收表
- 中國行業(yè)分類代碼表
- 社會(huì)組織協(xié)會(huì)換屆選舉會(huì)議主持詞
- 呼吸科(呼吸與危重癥醫(yī)學(xué)科)出科理論試題及答案
- 清新個(gè)人工作述職報(bào)告PPT模板
- 公路工程通用(專用)合同條款匯編.
- 工程施工現(xiàn)場及常用對話場景英語集錦
- 肺癌的靶向治療法PPT課件.ppt
- 凸透鏡成像規(guī)律動(dòng)畫演示
- 專賣店空間設(shè)計(jì)(課堂PPT)
評論
0/150
提交評論