模塊化程序設(shè)計(jì)方法_第1頁(yè)
模塊化程序設(shè)計(jì)方法_第2頁(yè)
模塊化程序設(shè)計(jì)方法_第3頁(yè)
模塊化程序設(shè)計(jì)方法_第4頁(yè)
模塊化程序設(shè)計(jì)方法_第5頁(yè)
已閱讀5頁(yè),還剩94頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

模塊化程序設(shè)計(jì)方法第1頁(yè),共99頁(yè),2023年,2月20日,星期五模塊化程序設(shè)計(jì)方法人們?cè)谇蠼庖粋€(gè)復(fù)雜問題時(shí),通常采用的是逐步分解、分而治之的方法也就是把一個(gè)大問題分解成若干個(gè)比較容易求解的小問題,然后分別求解。設(shè)計(jì)一個(gè)復(fù)雜的應(yīng)用程序時(shí),往往也是把整個(gè)程序劃分為若干功能較為單一的程序模塊,然后分別予以實(shí)現(xiàn)稱為模塊化(結(jié)構(gòu)化)程序設(shè)計(jì)方法第2頁(yè),共99頁(yè),2023年,2月20日,星期五模塊化程序設(shè)計(jì)方法是自頂向下、逐步求精的程序設(shè)計(jì)方法程序由程序單元構(gòu)成使用三種基本控制結(jié)構(gòu)(順序、選擇、重復(fù))構(gòu)造程序單元第3頁(yè),共99頁(yè),2023年,2月20日,星期五函數(shù)是C語(yǔ)言的程序模塊在C語(yǔ)言中,函數(shù)是程序的基本組成單位利用函數(shù),可以實(shí)現(xiàn)程序的模塊化,使程序設(shè)計(jì)簡(jiǎn)單和直觀,提高程序的易讀性和可維護(hù)性把程序中常用的一些計(jì)算或操作編成通用的函數(shù),以供隨時(shí)調(diào)用,大大減輕程序員的代碼實(shí)現(xiàn)工作量。第4頁(yè),共99頁(yè),2023年,2月20日,星期五函數(shù)是C語(yǔ)言的重要的語(yǔ)法單位;是C語(yǔ)言程序的組成單元。第5頁(yè),共99頁(yè),2023年,2月20日,星期五劃分函數(shù)的方法1程序中可能有重復(fù)出現(xiàn)的相同或相似的片段;從中抽取出共同的內(nèi)容,定義為函數(shù)使一項(xiàng)功能只定義一次,多次使用縮短程序,提高程序的可讀性和易修改性第6頁(yè),共99頁(yè),2023年,2月20日,星期五劃分函數(shù)的方法2程序中具有邏輯獨(dú)立性的片段即使這種片段只出現(xiàn)一次,也可以定義為函數(shù),在原來(lái)需要這段程序的地方寫函數(shù)使用。這種做法的主要作用是分解程序的復(fù)雜性,使之更容易理解和把握。第7頁(yè),共99頁(yè),2023年,2月20日,星期五函數(shù)分類在C語(yǔ)言中可從不同的角度對(duì)函數(shù)分類。1.從函數(shù)定義的角度看,函數(shù)可分為庫(kù)函數(shù)和用戶定義函數(shù)兩種。庫(kù)函數(shù)由C系統(tǒng)提供,只需包含有該函數(shù)定義的頭文件即可在程序中直接調(diào)用。

printf、sqrt、strcat等函數(shù)。第8頁(yè),共99頁(yè),2023年,2月20日,星期五用戶自定義函數(shù):必須通過函數(shù)定義(或函數(shù)說明)才能被調(diào)用由程序員自己定義第9頁(yè),共99頁(yè),2023年,2月20日,星期五2.從功能角度看,又可把函數(shù)分為有返回值函數(shù)和無(wú)返回值函數(shù)兩種。(1)有返回值函數(shù)此類函數(shù)被調(diào)用執(zhí)行完后將向調(diào)用者返回一個(gè)執(zhí)行結(jié)果,稱為函數(shù)返回值。由用戶定義的有返回值的函數(shù),必須明確返回值的類型。第10頁(yè),共99頁(yè),2023年,2月20日,星期五(2)無(wú)返回值函數(shù)此類函數(shù)用于完成某項(xiàng)特定的處理任務(wù),執(zhí)行完成后沒有計(jì)算的結(jié)果。用戶在定義此類函數(shù)時(shí)需要指定它的返回類型為空類型---void。第11頁(yè),共99頁(yè),2023年,2月20日,星期五3.從主調(diào)函數(shù)和被調(diào)函數(shù)之間數(shù)據(jù)傳送的角度看可分為無(wú)參函數(shù)和有參函數(shù)兩種(1)無(wú)參函數(shù)函數(shù)不需要外部信息;可以返回或不返回函數(shù)值。第12頁(yè),共99頁(yè),2023年,2月20日,星期五(2)有參函數(shù)(帶參函數(shù))函數(shù)需要外部信息,通過參數(shù)形式傳遞信息可以返回或不返回函數(shù)值第13頁(yè),共99頁(yè),2023年,2月20日,星期五主函數(shù)每個(gè)C程序里必須有一個(gè)名為main的特殊函數(shù),稱為主函數(shù)。主函數(shù)規(guī)定了整個(gè)程序執(zhí)行的起點(diǎn)(程序入口)程序執(zhí)行從main函數(shù)開始執(zhí)行,一旦它執(zhí)行結(jié)束,整個(gè)程序就執(zhí)行結(jié)束。程序不能調(diào)用主函數(shù),它將在程序開始執(zhí)行時(shí)被自動(dòng)調(diào)用。第14頁(yè),共99頁(yè),2023年,2月20日,星期五除了主函數(shù)外,程序里的其他函數(shù)只有在被調(diào)用時(shí)才能進(jìn)入執(zhí)行狀態(tài)。一個(gè)函數(shù)要在程序執(zhí)行過程中起作用,要么它是被主函數(shù)直接調(diào)用的,要么是被另外一個(gè)被調(diào)用正在執(zhí)行的函數(shù)所調(diào)用的。沒有被調(diào)用的函數(shù)在程序執(zhí)行中不會(huì)起任何作用。第15頁(yè),共99頁(yè),2023年,2月20日,星期五C不允許函數(shù)嵌套定義。一個(gè)函數(shù)中再定義一個(gè)函數(shù)是非法的函數(shù)與函數(shù)之間通過傳遞參數(shù)和返回值相聯(lián)系。第16頁(yè),共99頁(yè),2023年,2月20日,星期五6.1函數(shù)定義和調(diào)用6.1.1函數(shù)定義一般形式:

(返回值)類型說明符函數(shù)名(形式參數(shù)表){

類型說明執(zhí)行語(yǔ)句

}函數(shù)體函數(shù)原型\函數(shù)首部(頭)第17頁(yè),共99頁(yè),2023年,2月20日,星期五函數(shù)原型類型說明符是指函數(shù)返回值的數(shù)據(jù)類型。函數(shù)名—給自定義的函數(shù)取的名字。形式參數(shù)表—函數(shù)被調(diào)用時(shí),接收調(diào)用函數(shù)傳遞的實(shí)參數(shù)。函數(shù)體—說明語(yǔ)句、執(zhí)行語(yǔ)句塊。通過return語(yǔ)句返回函數(shù)計(jì)算結(jié)果。第18頁(yè),共99頁(yè),2023年,2月20日,星期五定義函數(shù)時(shí)必須指明返回值類型(缺省時(shí),為int)如果函數(shù)沒有返回值,函數(shù)返回類型應(yīng)該為void第19頁(yè),共99頁(yè),2023年,2月20日,星期五1.無(wú)參函數(shù)的一般形式類型說明符函數(shù)名()

{類型說明執(zhí)行語(yǔ)句

}第20頁(yè),共99頁(yè),2023年,2月20日,星期五無(wú)參函數(shù)

voidSay_Hello(){

printf("Hello,howdoyoudo.\n");

return;}第21頁(yè),共99頁(yè),2023年,2月20日,星期五無(wú)參函數(shù)voidshow-five-row-stars(){inti;for(i=1;i<=5;i++)printf(“%s\n”,“******”);

return;}第22頁(yè),共99頁(yè),2023年,2月20日,星期五2有參函數(shù)的一般形式類型說明符函數(shù)名(形式參數(shù)表){類型說明語(yǔ)句}以“,”隔開形參說明

type形參變量名第23頁(yè),共99頁(yè),2023年,2月20日,星期五有參函數(shù)voidshow-many-row-stars(intn){inti;for(i=1;i<=n;i++)printf(“%s\n”,“******”);

return;}第24頁(yè),共99頁(yè),2023年,2月20日,星期五有參函數(shù)intabs(inta){return((a>0)?a:-a);}第25頁(yè),共99頁(yè),2023年,2月20日,星期五有參函數(shù)

intarea_s(inta,intb){return(a*b);

}第26頁(yè),共99頁(yè),2023年,2月20日,星期五求兩個(gè)數(shù)中較小的數(shù)intmin(inta,intb){if(a>b)returnb;

elsereturna;}第27頁(yè),共99頁(yè),2023年,2月20日,星期五對(duì)于用戶自己定義的函數(shù)函數(shù)需要先定義,再調(diào)用。否則,需要對(duì)函數(shù)進(jìn)行聲明。第28頁(yè),共99頁(yè),2023年,2月20日,星期五函數(shù)聲明

函數(shù)聲明:函數(shù)原型;

返回類型函數(shù)名(形參表);

參數(shù)表省略變量名

intmin(inta,intb);

intmin(int,int);第29頁(yè),共99頁(yè),2023年,2月20日,星期五注意:如果使用庫(kù)函數(shù),必須在源文件前部用#include命令包含必要的頭文件。對(duì)所有未能在使用前給出定義的函數(shù),都應(yīng)給出函數(shù)原型聲明。把函數(shù)聲明放在所有函數(shù)的定義之前(不要寫在函數(shù)內(nèi)部)第30頁(yè),共99頁(yè),2023年,2月20日,星期五6.1.2函數(shù)調(diào)用通過對(duì)函數(shù)的調(diào)用來(lái)執(zhí)行對(duì)應(yīng)的函數(shù)體

C語(yǔ)言中,函數(shù)調(diào)用的一般形式為:函數(shù)名(實(shí)際參數(shù)表)對(duì)無(wú)參函數(shù)調(diào)用時(shí)則無(wú)實(shí)參表實(shí)參可以是常數(shù)、變量及表達(dá)式各實(shí)參之間用逗號(hào)分隔。第31頁(yè),共99頁(yè),2023年,2月20日,星期五函數(shù)調(diào)用過程執(zhí)行流程轉(zhuǎn)向由函數(shù)名指定的被調(diào)用函數(shù)實(shí)參一一對(duì)應(yīng)地傳遞給函數(shù)的形參執(zhí)行函數(shù)定義中的函數(shù)體。執(zhí)行結(jié)束,通過return語(yǔ)句將值返回到調(diào)用處執(zhí)行流程返回調(diào)用處;執(zhí)行后面的語(yǔ)句第32頁(yè),共99頁(yè),2023年,2月20日,星期五

函數(shù)B函數(shù)調(diào)用及返回函數(shù)Areturn…callBendA返回地址第33頁(yè),共99頁(yè),2023年,2月20日,星期五函數(shù)調(diào)用的幾種情況(1)函數(shù)表達(dá)式函數(shù)調(diào)用作為表達(dá)式中的一個(gè)操作數(shù),以函數(shù)返回值參與表達(dá)式的運(yùn)算。這種方式要求函數(shù)是有返回值的。

z=min(x,y)*2;第34頁(yè),共99頁(yè),2023年,2月20日,星期五(2)函數(shù)語(yǔ)句函數(shù)調(diào)用加上分號(hào)即構(gòu)成函數(shù)語(yǔ)句。這種方式要求函數(shù)沒有返回值。

printf("%d",a);

show-five-row-stars();第35頁(yè),共99頁(yè),2023年,2月20日,星期五(3)函數(shù)實(shí)參函數(shù)作為另一個(gè)函數(shù)調(diào)用的實(shí)參。要求該函數(shù)必須是有返回值的

a=min(min(x,y),z);第36頁(yè),共99頁(yè),2023年,2月20日,星期五實(shí)參的求值順序在函數(shù)調(diào)用中還應(yīng)該注意的一個(gè)問題是求值順序的問題。所謂求值順序是指對(duì)實(shí)參表中各量是自左至右使用呢,還是自右至左使用。對(duì)此,各系統(tǒng)的規(guī)定不一定相同。第37頁(yè),共99頁(yè),2023年,2月20日,星期五函數(shù)返回值被調(diào)用之后,將執(zhí)行函數(shù)體中的程序段,取得并返回給主調(diào)函數(shù)一個(gè)值,稱這個(gè)值為函數(shù)返回值,函數(shù)計(jì)算結(jié)構(gòu)只能通過return語(yǔ)句返回return語(yǔ)句的一般形式為:

return表達(dá)式;或return(表達(dá)式);第38頁(yè),共99頁(yè),2023年,2月20日,星期五return語(yǔ)句在函數(shù)中允許有多個(gè)return語(yǔ)句但每次調(diào)用只能有一個(gè)return語(yǔ)句被執(zhí)行,因此只能返回一個(gè)函數(shù)值。第39頁(yè),共99頁(yè),2023年,2月20日,星期五參數(shù)匹配(2)函數(shù)值的類型和函數(shù)定義中函數(shù)的類型應(yīng)保持一致。如果兩者不一致,則以函數(shù)定義類型為準(zhǔn),自動(dòng)進(jìn)行類型轉(zhuǎn)換。(3)不返回函數(shù)值的函數(shù),可以明確定義為void。第40頁(yè),共99頁(yè),2023年,2月20日,星期五6.2函數(shù)參數(shù)傳遞主調(diào)函數(shù)和被調(diào)函數(shù)之間通過參數(shù)傳遞數(shù)據(jù)C語(yǔ)言參數(shù)傳遞方式為傳值調(diào)用。函數(shù)的參數(shù)分為形參和實(shí)參兩種。實(shí)參的值單向傳遞給函數(shù)的形參,作為形參的值實(shí)參形參值第41頁(yè),共99頁(yè),2023年,2月20日,星期五變量的作用域能夠訪問變量的程序范圍—變量的作用域變量按作用域分為全局變量和局部變量全局變量:任何函數(shù)外定義的變量作用域?yàn)檎麄€(gè)程序局部變量:函數(shù)內(nèi)部定義的變量和形參作用域?yàn)椋憾x該變量的函數(shù)第42頁(yè),共99頁(yè),2023年,2月20日,星期五變量的作用域還可以在符合語(yǔ)句中定義變量作用域僅為該復(fù)合語(yǔ)句第43頁(yè),共99頁(yè),2023年,2月20日,星期五形參出現(xiàn)在函數(shù)定義中,在整個(gè)函數(shù)體內(nèi)都可以使用,離開該函數(shù)則不能使用。實(shí)參出現(xiàn)在主調(diào)函數(shù)中,進(jìn)入被調(diào)函數(shù)后,實(shí)參變量也不能使用。第44頁(yè),共99頁(yè),2023年,2月20日,星期五函數(shù)的形參和實(shí)參的特點(diǎn)形參只有在被調(diào)用時(shí)才分配內(nèi)存單元函數(shù)結(jié)束時(shí),釋放所分配的內(nèi)存單元形參只有在函數(shù)內(nèi)部有效。實(shí)參可以是常量、變量、表達(dá)式和函數(shù)調(diào)用函數(shù)調(diào)用時(shí),實(shí)參必須具有確定的值第45頁(yè),共99頁(yè),2023年,2月20日,星期五函數(shù)的形參和實(shí)參的特點(diǎn)

實(shí)參和形參在數(shù)量上、類型上和順序上應(yīng)嚴(yán)格一致第46頁(yè),共99頁(yè),2023年,2月20日,星期五函數(shù)調(diào)用例子intcube(intx)/*自定義函數(shù)*/{intcb;cb=x*x*x;return(cb);}/*函數(shù)返回值*/voidmain(){inti,v;scanf(”%d”,&i);

v=cube(i);/*函數(shù)調(diào)用返回值賦給變量v*/printf(”cube=%d\n”,v);}第47頁(yè),共99頁(yè),2023年,2月20日,星期五兩個(gè)電阻的串聯(lián)值和并聯(lián)值floatseries(float,float);floatparallel(float,float);voidmain(){floatr1,r2,se,pa;scanf(”%f%f”,&r1,&r2);se=series(r1,r2);/*函數(shù)調(diào)用*/pa=parallel(r1,r2);/*函數(shù)調(diào)用*/printf(“%f%f\n”,se,pa);}第48頁(yè),共99頁(yè),2023年,2月20日,星期五floatseries(floatrs1,floatrs2)/*自定義函數(shù)*/{floatrs;rs=rs1+rs2;return(rs);}floatparallel(floatrp1,floatrp2)/*自定義函數(shù)*/{floatrp;rp=(rp1*rp2)/(rp1+rp2);return(rp);}第49頁(yè),共99頁(yè),2023年,2月20日,星期五函數(shù)調(diào)用中發(fā)生的數(shù)據(jù)傳送是單向的只能把實(shí)參的值傳送給形參。因此在函數(shù)調(diào)用過程中,形參的值發(fā)生改變,而實(shí)參中的值不會(huì)變化。第50頁(yè),共99頁(yè),2023年,2月20日,星期五voidswap(intx,inty){inttemp=x;x=y;y=temp;}swap(a,b)第51頁(yè),共99頁(yè),2023年,2月20日,星期五如果函數(shù)需要對(duì)實(shí)參進(jìn)行修改,則形參的類型應(yīng)該為指針類型:指針做參數(shù);實(shí)參的值應(yīng)該為地址。參數(shù)傳遞傳的是地址值通過修改形參指向的目標(biāo)變量,達(dá)到修改實(shí)參數(shù)據(jù)的目的(間接訪問方式)。第52頁(yè),共99頁(yè),2023年,2月20日,星期五voidswap(int*x,int*y){inttemp=*x;*x=*y;*y=temp;}swap(&a,&b)第53頁(yè),共99頁(yè),2023年,2月20日,星期五完整程序#include<stdio.h>voidswap(int*,int*);/*函數(shù)聲明*/voidmain(){inta=3,b=8;printf(”a=%d,b=%d\n”,a,b);

swap(&a,&b);/*函數(shù)調(diào)用*/printf(”a=%d,b=%d\n”,a,b);}voidswap(int*x,int*y)/*函數(shù)定義,形參定義為指針*/{inttemp=*x;*x=*y;*y=temp;}第54頁(yè),共99頁(yè),2023年,2月20日,星期五6.3函數(shù)與數(shù)組數(shù)組可以作為函數(shù)的實(shí)參有兩種形式:數(shù)組元素(下標(biāo)變量)作為實(shí)參;數(shù)組名作為函數(shù)的實(shí)參第55頁(yè),共99頁(yè),2023年,2月20日,星期五6.3.1數(shù)組元素作函數(shù)實(shí)參數(shù)組元素作為實(shí)參與普通變量作為實(shí)參是完全相同的在發(fā)生函數(shù)調(diào)用時(shí),把作為實(shí)參的數(shù)組元素的值傳送給形參,實(shí)現(xiàn)單向的值傳送第56頁(yè),共99頁(yè),2023年,2月20日,星期五6.3.2數(shù)組作為函數(shù)參數(shù)實(shí)參是數(shù)組名;形參是數(shù)組;用數(shù)組作函數(shù)參數(shù)時(shí),則要求形參和實(shí)參都必須是類型相同的數(shù)組。形參數(shù)組和實(shí)參數(shù)組為同一數(shù)組,共同擁有一段內(nèi)存空間。對(duì)形參數(shù)組的操作就是對(duì)實(shí)參數(shù)組的操作第57頁(yè),共99頁(yè),2023年,2月20日,星期五floataver(floata[5]){inti;floatav,s=a[0];for(i=1;i<5;i++)s=s+a[i];av=s/5;returnav;}voidmain(){floatsco[5],av;inti;for(i=0;i<5;i++)scanf("%f",&sco[i]);av=aver(sco);printf("%6.2f\n",av);}第58頁(yè),共99頁(yè),2023年,2月20日,星期五形參數(shù)組和實(shí)參數(shù)組的長(zhǎng)度可以不相同,

voidnzp(inta[8]);…intb[5];nzp(b);第59頁(yè),共99頁(yè),2023年,2月20日,星期五形參也可以不指定數(shù)組的長(zhǎng)度

voidnzp(inta[])或用一個(gè)變量來(lái)表示數(shù)組元素的個(gè)數(shù)。

voidnzp(inta[],intn)

形參數(shù)組由n值動(dòng)態(tài)地表示數(shù)組的長(zhǎng)度。

n的值由主調(diào)函數(shù)的實(shí)參進(jìn)行傳送。第60頁(yè),共99頁(yè),2023年,2月20日,星期五

多維數(shù)組也可以作為函數(shù)的參數(shù)。在函數(shù)定義時(shí)對(duì)形參數(shù)組可以指定每一維的長(zhǎng)度,也可省去第一維的長(zhǎng)度。

intfun(inta[3][10])或

intfun(inta[][10])第61頁(yè),共99頁(yè),2023年,2月20日,星期五指針作為形參實(shí)參是變量地址voidswap(int*x,int*y){inttemp=*x;*x=*y;*y=temp;}swap(&a,&b)第62頁(yè),共99頁(yè),2023年,2月20日,星期五指針作為形參,實(shí)參是數(shù)組名數(shù)組名就是數(shù)組的首地址實(shí)參向形參傳送數(shù)組的地址值形參得到該地址后也指向同一數(shù)組第63頁(yè),共99頁(yè),2023年,2月20日,星期五求數(shù)組各項(xiàng)的累加和。#include<stdio.h>voidsum(int*array,intn);voidmain(){inta[10]={1,2,3,4,5,6,7,8,9,10};sum(a,6);}voidsum(int*array,intn){intsum=0;for(inti=0;i<n;i++){sum+=*array;array++;}printf(”%d\n”,sum);}第64頁(yè),共99頁(yè),2023年,2月20日,星期五6.4函數(shù)與指針返回指針的函數(shù)和指向函數(shù)的指針。第65頁(yè),共99頁(yè),2023年,2月20日,星期五6.4.1返回指針的函數(shù)函數(shù)的返回類型可以指針類型該函數(shù)返回的是地址返回指針的函數(shù)稱為指針型函數(shù)第66頁(yè),共99頁(yè),2023年,2月20日,星期五類型說明符

*

函數(shù)名(形參表){…/*函數(shù)體*/}類型說明符表示了返回的指針值所指向的數(shù)據(jù)類型第67頁(yè),共99頁(yè),2023年,2月20日,星期五例在一個(gè)字符串中查找一個(gè)給定的字符若找到,則從該字符開始打印余下的字符,及該字符是字符串的第幾個(gè)字符否則輸出“nomatchfound”。第68頁(yè),共99頁(yè),2023年,2月20日,星期五#include<stdio.h>intcount;char*match(charc,char*sp);/*指針型函數(shù)*/voidmain(){chars[80],ch,*p;gets(s);ch=getchar();p=match(ch,s);/*函數(shù)調(diào)用,返回地址賦p指針*/if(p)printf(”%s%d\n”,p,(count+1));elseprintf(”nomatchfound”);}第69頁(yè),共99頁(yè),2023年,2月20日,星期五char*match(charc,char*sp){/*定義指針型函數(shù)*/count=0;while(c!=sp[count]&&sp[count]!=‘\0’)count++;if(!sp[count])return(0);return(&sp[count]);}/*返回子字符串的地址*/輸入:programminga

輸出:amming6第70頁(yè),共99頁(yè),2023年,2月20日,星期五6.5.2指向函數(shù)的指針(函數(shù)指針)略第71頁(yè),共99頁(yè),2023年,2月20日,星期五6.5函數(shù)與結(jié)構(gòu)結(jié)構(gòu)可以整體賦值可以將結(jié)構(gòu)作為值參數(shù)傳遞給函數(shù),也可以定義返回結(jié)構(gòu)值的函數(shù)。1.將結(jié)構(gòu)成員的值傳遞給函數(shù)--結(jié)構(gòu)成員參數(shù)2.將整個(gè)結(jié)構(gòu)作為參數(shù)值傳遞給函數(shù),將這種參數(shù)稱做結(jié)構(gòu)參數(shù)。3.將結(jié)構(gòu)的地址傳給函數(shù),也就是說傳遞指向結(jié)構(gòu)的指針值,這稱為結(jié)構(gòu)指針參數(shù)。第72頁(yè),共99頁(yè),2023年,2月20日,星期五后兩種方式把結(jié)構(gòu)作為整體處理兩種參數(shù)的作用方式和效果不同第73頁(yè),共99頁(yè),2023年,2月20日,星期五6.6.1結(jié)構(gòu)指針在ANSIC標(biāo)準(zhǔn)中允許用結(jié)構(gòu)變量作函數(shù)參數(shù)進(jìn)行整體傳送。但是這種傳送要將全部成員逐個(gè)傳送,特別是成員為數(shù)組時(shí)將會(huì)使傳送的時(shí)間和空間開銷很大,嚴(yán)重地降低了程序的效率。最好的辦法就是使用指針做參數(shù);實(shí)參傳向形參的只是地址值,從而減少了時(shí)間和空間的開銷。第74頁(yè),共99頁(yè),2023年,2月20日,星期五一組學(xué)生的平均成績(jī)和不及格人數(shù)structstu{intnum;char*name;charsex;floatscore;}boy[5]={{101,"Liping",'M',45},{102,"Zhangping",'M',62.5}, {103,"Hefang",'F',92.5},{104,"Chengling",'F',87},{105,"Wangming",'M',58},};voidave(structstu*ps);第75頁(yè),共99頁(yè),2023年,2月20日,星期五voidmain(){ voidave(structstu*ps); ave(boy);}第76頁(yè),共99頁(yè),2023年,2月20日,星期五voidave(structstu*ps){intc=0,i;floatave,s=0; for(i=0;i<5;i++,ps++){s+=ps->score; if(ps->score<60)c+=1; }printf("s=%f\n",s);ave=s/5; printf("average=%f\nNopass%d\n",ave,c);}第77頁(yè),共99頁(yè),2023年,2月20日,星期五6.5.2結(jié)構(gòu)型函數(shù)結(jié)構(gòu)型函數(shù):返回類型為結(jié)構(gòu)類型的函數(shù)略第78頁(yè),共99頁(yè),2023年,2月20日,星期五6.6遞歸函數(shù)函數(shù)的遞歸調(diào)用是指調(diào)用一個(gè)函數(shù)的過程中直接或間接的調(diào)用該函數(shù)自身這種函數(shù)稱為遞歸函數(shù)。C語(yǔ)言允許函數(shù)的遞歸調(diào)用。在遞歸調(diào)用中,主調(diào)函數(shù)又是被調(diào)函數(shù),執(zhí)行遞歸函數(shù)將反復(fù)調(diào)用其自身,每調(diào)用一次就進(jìn)入新的一層。第79頁(yè),共99頁(yè),2023年,2月20日,星期五遞歸調(diào)用的過程分為:①遞歸過程:將原始問題不斷轉(zhuǎn)化為規(guī)模小了一級(jí)的新問題,從未知向已知推進(jìn),最終達(dá)到遞歸終結(jié)條件;②回溯過程:從已知條件出發(fā),沿遞歸的逆過程,逐一求值返回,直至遞歸初始處,完成遞歸調(diào)用。第80頁(yè),共99頁(yè),2023年,2月20日,星期五例如:求n的階乘

n!=n(n-1)!(當(dāng)n>1時(shí))n!=1(當(dāng)n=0,1時(shí))longfact(intn){if(n==1)return1;elsereturn(n*fact(n-1));}第81頁(yè),共99頁(yè),2023年,2月20日,星期五由于自調(diào)用過程在函數(shù)內(nèi)必須設(shè)置某些條件,當(dāng)條件成立時(shí)終止自調(diào)用過程,并使程序控制逐步從函數(shù)中返回。遞歸調(diào)用機(jī)制是棧數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的。函數(shù)之間由參數(shù)傳遞和返回值聯(lián)系。第82頁(yè),共99頁(yè),2023年,2月20日,星期五n等于3遞歸調(diào)用過程如下;

fact(3)=3*fact(2)2*fact(1)1*fact(0)1

1*123*26第83頁(yè),共99頁(yè),2023年,2月20日,星期五圖6-2遞歸調(diào)用示意圖第84頁(yè),共99頁(yè),2023年,2月20日,星期五大多數(shù)遞歸函數(shù)都能用非遞歸函數(shù)代替例如:求兩個(gè)整數(shù)a,b的最大公約數(shù)遞歸:longgcd1(inta,intb){if(a%b==0)returnb;returngcd1(b,a%b);}第85頁(yè),共99頁(yè),2023年,2月20日,星期五非遞歸longgcd2(inta,intb){inttemp;while(b!=0){temp=a%b;a=b;b=temp;}returna;}

使用遞歸函數(shù)簡(jiǎn)化了程序設(shè)計(jì)提高程序的可讀性,但增加系統(tǒng)開銷。第86頁(yè),共99頁(yè),2023年,2月20日,星期五6.7命令行參數(shù)main()函數(shù)也可以帶有參數(shù)。從操作系統(tǒng)傳遞信息到main()中最常用的方法是使用命令行參數(shù)。使用命令行參數(shù),可以使一個(gè)可執(zhí)行程序的執(zhí)行過程,像使用操作系統(tǒng)命令一樣,在命令行中提供運(yùn)行參數(shù)。第87頁(yè),共99頁(yè),2023年,2月20日,星期五使用命令行參數(shù)的形式為:voidmain(intargc,char*argv[]){……}argc參數(shù)個(gè)數(shù),比實(shí)際參數(shù)個(gè)數(shù)多1;*argv[]字符型指針數(shù)組每個(gè)元素是指向參數(shù)(字符串常量)的指針

第88頁(yè),共99頁(yè),2023年,2月20日,星期五打印命令行參數(shù)。/*cla.c*/#include<stdio.h>main(intargc,char*argv[]){inticount=0;while(icount<argc){printf(“arg%d;%s\n”,icount,argv[icount]);icount++;}}第89頁(yè),共99頁(yè),2023年,2月20日,星期五編譯、連接,生成可執(zhí)行文件cla.exeC>cla.exedataelementstatement運(yùn)行結(jié)果:arg0:claarg1:dataarg2:elementarg3:statement第90頁(yè),共99頁(yè),2023年,2月20日,星期五6.8標(biāo)準(zhǔn)庫(kù)函數(shù)標(biāo)準(zhǔn)庫(kù)函數(shù)是指由C

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論