著名的計算機科學家wirth(沃思)提出了一個著名的公式表達了程序設計的實質: 算法+數(shù)據(jù)結構=程序 即“程序是在數(shù)據(jù)的特定的表示方式的基礎上,,對抽象算法的具體描述”,。 程序結構=控制結構+數(shù)據(jù)結構 結構化程序設計:是為使程序具有合理的結構,以保證程序正確性而規(guī)定的一套程序設計的方法,,是人們多年來研究與實踐的結晶,。 ①結構化程序設計目的:通過設計結構良好的程序,,以程序的靜態(tài)良好結構保證程序動態(tài)執(zhí)行的正確性,使程序易理解,、易調試,、易維護,以提高軟件開發(fā)的效率,,減少出錯率,。 ②結構化程序設計的構成單元 任何程序都可由順序、選擇,、重復三種基本控制結構來組成,。如圖1.5所示 。
a 順序結構 b 選擇結構 c 重復結構 表示“處理1”先 表示當條件滿足時執(zhí)行“處理1” 首先判斷條件是否滿足,,若滿足 于“處理2”執(zhí)行 否則執(zhí)行“處理2” 執(zhí)行“處理”,,返回“判斷”條件,直至條件不 滿足為止 三種基本的結構程序設計圖
三種控制結構可表示其它結構,,采用基本結構組合的方法,,產(chǎn)生所需要的程序。 三種基本的控制結構共有的特點是單入口單出口,。(如虛線部分) 程序語言中也可引入其它控制結構設施,,為靈活、方便的處理問題,。 限制GOTO 句的意義: goto 語句為無條件轉向語句,,其一般格式為:goto 語句標號 含義是無條件跳轉到語句標號所處位置開始繼續(xù)執(zhí)行后面的語句。顯然goto語句改變了程序的執(zhí)行順序,。如果程序中不限制goto 語句的使用,,則使得程序的靜態(tài)結構與程序的動態(tài)執(zhí)行差異很大,程序難閱讀,、難理解,,破壞了單入口/單出口的原則,使程序的正確性難以證明,,錯誤難以局部化,。 ③結構化程序設計方法 結構化程序設計的概念是E.W.Dijkstra于1969年首先提出的,他強調了從程序結構和風格上來研究程序設計問題,。也將此方法稱為“自頂向下”或“逐步求精”法,。其一是“自頂向下,逐步求精”的設計思想,,即整個設計應分為若干層次,,逐步加以解決;而每一步實在前一步的基礎上,對前一步設計的細化,。其二是“獨立功能,,一個入口,一個出口“的模塊化結構,,即把大而復雜的問題層層細化分解成若干個相對獨立、功能單一的問題處理模塊,,而每個模塊與外界聯(lián)系只有一個單入口與單出口,。其三是“僅用三種基本控制結構”的設計原則,即每個模塊都只用三個基本結構來描述,。
C程序實現(xiàn)的結構及特點一個完整的,、可執(zhí)行的C程序文件一般結構如下: [包含文件語句] [預編譯語句] [宏定義語句] [子函數(shù)1] [子函數(shù)2] [子函數(shù)3] . . . [子函數(shù)n] 主函數(shù) 以上每行表示一段語句或程序,[ ]中的內容表示可選,。所謂可選,,并不是說可有可無,而是要根據(jù)實際情況看是否需要它們,,但對一個完整的,、可執(zhí)行的C程序而言,主函數(shù)是必不可少的,,它是一個程序的入口,。換句話說,計算機執(zhí)行一個程序的時候,,是從主函數(shù)的位置開始執(zhí)行的,。還有一點需要說明的是,主函數(shù)的函數(shù)名必須使用main(),。 不管是子函數(shù)還是主函數(shù),,它都是一個函數(shù),對一個函數(shù)而言,,一般是這樣一個結構: [返回類型] 函數(shù)名([參數(shù)列表]){ [說明性語句] [操作性語句] } 與上面所講的內容相似,[ ] 中的內容表示可選,,對于主函數(shù)而言,,返回類型和參數(shù)列表一般情況下可以不明確的寫出來,系統(tǒng)會執(zhí)行一些默認的操作,,但對于子函數(shù)而言,,返回類型是必不可少的,其他的內容比如參數(shù)列表則要根據(jù)實際情況而定(需要就用,,不需要就不用,。但是什么時候需要,什么時候不需要,就屬于程序的功能設計范疇,,這在以后還要做進一步的討論),。 C語言程序結構有如下特點: 1.C程序由函數(shù)構成。一個C程序至少要包括一個函數(shù),,即main函數(shù),也可以包含一個main函數(shù)和若干個其它函數(shù),。因此,,函數(shù)是C程序的基本單位,。被調用的函數(shù)可以是系統(tǒng)提供的庫函數(shù),,如printf和scanf函數(shù),,也可以是用戶自定義的函數(shù),。C的函數(shù)相當于其它語言中的子程序。用函數(shù)來實現(xiàn)特定的功能,。C語言的函數(shù)庫十分豐富,,Turbo C提供三百多個庫函數(shù)。C語言的這種特點易于實現(xiàn)程序的模塊化,。 2. 每個函數(shù)由兩部分組成:函數(shù)的說明部分和函數(shù)體,。函數(shù)的一般形式為: 函數(shù)類型 函數(shù)名(參數(shù)表) 參數(shù)說明,; { 函數(shù)體,; } 其中說明部分包括函數(shù)名、函數(shù)類型,、函數(shù)屬性,、形參名、形參類型,。一個函數(shù)名后面必須跟一對圓括弧,,可以沒有參數(shù),如main(),;函數(shù)體即函數(shù)說明部分下面的大括弧{}內的部分,,如果一個函數(shù)中有多對大括弧,則最外層的一對{}為函數(shù)體的范圍,。函數(shù)體一般包括變量的定義和執(zhí)行部分,。 3. main函數(shù)是整個C程序的入口。一個C程序總是從main函數(shù)開始執(zhí)行的。main函數(shù)可以在程序最前面,,也可以在程序最后,,或在一些函數(shù)之前、另一些函數(shù)之后,。 4. C程序書寫格式自由,,一行內可以寫幾個語句,一個語句也可以分開寫在多行上,。各語句之間用分號分隔,。分號是C語句的必要組成部分。語句結束標志分號不可缺省,,即使是程序的最后一個語句也必須要有分號。 5. C語言本身沒有輸入輸出語句,。其輸入和輸出功能是由庫函數(shù)scanf和printf等函數(shù)來實現(xiàn)的,,即C對輸入輸出實行“函數(shù)化”。 6. 可以用/*……*/對C程序中的任何部分作注釋,,以提高程序的可讀性,。 與參數(shù)傳遞的相關技術
程序的編譯單位是源程序文件,一個源程序文件可以包含一個或若干個子函數(shù),,在函數(shù)內定義的變量是內部變量,,在函數(shù)外定義的變量是外部變量,又叫全局變量或全程變量,。 全局變量可以為本文件中其它函數(shù)所共用,,其作用域從定義該變量的位置開始一直到文件結束。全局變量可以實現(xiàn)參數(shù)傳遞的某些功能,,在其作用域范圍內,,全局變量可以將子函數(shù)中的值帶出到其它函數(shù),但如果在一個子函數(shù)中作了改變,,將會影響全局變量的值,。局部變量只在本函數(shù)范圍內有效,也就是說只有在本函數(shù)內才能使用它們,,本函數(shù)以外不能使用,。需要注意的是,不同函數(shù)中可以使用相同名字的變量,,由于其作用域的范圍不同,,盡管有相同的名字,但它們代表不同的對象,,作用域不同,,互不干擾。在一個函數(shù)內部,可以在復合語句中定義變量,,但這種變量只在本復合語句中有效,。簡單來說,變量作用域就是指包含該變量定義的最小范圍,。比如說,,在子函數(shù)定義的變量其作用域就在該子函數(shù)體內,在復合語句中定義的變量其作用域就在該復合語句中,,在文件開始定義的變量在整個文件內有效,。
參數(shù)傳遞是函數(shù)之間進行信息通訊的重要渠道。其參數(shù)傳遞的主要方式有傳值和傳地址兩類方式,。C語言中調用函數(shù)時,,實參代替形參的過程是一個單向的傳值過程,在編譯技術中稱為值傳遞方式,。C語言中指針類型的參數(shù)傳遞可以看作是傳地址方式,。下面是一個關于參數(shù)傳遞以及變量作用域的源程序: #include <stdio.h> int b=10; /*定義全局變量*/ int fun1(int a1){ b=a1+1; /*改變全局變量*/ printf("in fun1:the addr of a is %X,the value of a is %d.\n",&a1,a1); return(a1=a1+1); } int fun2(int *a2){ printf("in fun1:the addr of a is %X,the value of a is %d.\n",a2,*a2); return(*a2=*a2+1); /*地址方式改變變量的值*/ } main(){ int a,c,d; a=0; /*定義局部變量*/ c=3; /*定義局部變量*/ printf("in main:the addr of a,b,c,d is %X,%X,%X.\n",&a,&b,&c,&d); printf("a=%d,b=%d,c=%d\n",a,b,c); d=fun1(a); printf("a=%d,b=%d,d=%d\n",a,b,d); c=fun2(&a); printf("a=%d,b=%d,c=%d\n",a,b,c); } 下面是該程序的運行結果: in main:the addr of a,b,c,d is 12FF7C,422D8C,12FF78. a=0,b=10,c=3 in fun1:the addr of a is 12FF24,the value of a is 0. a=0,b=1,d=1 in fun1:the addr of a is 12FF7C,the value of a is 0. a=1,b=1,c=1 在該程序中,a1,、a2,、a、c,、d是局部變量,,而b是全局變量??梢钥闯?,由于fun1()函數(shù)的調用改變了全局變量b,fun2()函數(shù)的調用改變了局部變量c,。
值傳遞方式最大的缺點是被調用函數(shù)不能通過參數(shù)向調用函數(shù)返值,,原因是出了函數(shù)體,值參數(shù)的作用域相當是該函數(shù)的局部變量,,無法帶出結果值,,如果返回一個結果值,可以使用return方式返回函數(shù)結果值,。 如果函數(shù)結果需要帶出多個值,,該怎樣實現(xiàn)?可以有以下兩類方式:①全局變量方式帶出,②通過地址傳遞帶出(數(shù)組方式,、結構體方式,、指針方式)。 ①全局變量方式:上面源程序中的fun1()函數(shù)對b的改變就是一個全局變量方式帶出的例子,。 ②數(shù)組方式:如果要返回的是多個相同類型的值,,則可以將這些值放到一個數(shù)組當中,,然后返回數(shù)組的指針或首地址。 ③結構體方式:如果要返回的是多個不同類型的值,,則可以將這些值放到一個結構體當中,,然后返回結構體的指針或全局變量,但必須注意的是該結構體必須是在全局范圍內定義的結構體,。 ④指針方式:像改變上源程序中的fun2()函數(shù)對a一樣改變相關需要改變的變量,。 注:通過參數(shù)表的參數(shù)傳遞是一種參數(shù)顯式傳遞方式,而通過全局變量可一種隱式參數(shù)傳遞,,一個函數(shù)中對全局變量的改變會影響其它程序的調用,,使用全局變量必須注意這個問題。 |
|