电竞比分网-中国电竞赛事及体育赛事平台

分享

西北大學(xué)計(jì)算機(jī)基礎(chǔ)與c語言程序設(shè)計(jì)精品課程網(wǎng)

 夢中家園 2013-01-27

著名的計(jì)算機(jī)科學(xué)家wirth(沃思)提出了一個著名的公式表達(dá)了程序設(shè)計(jì)的實(shí)質(zhì):

算法+數(shù)據(jù)結(jié)構(gòu)=程序

即“程序是在數(shù)據(jù)的特定的表示方式的基礎(chǔ)上,對抽象算法的具體描述”。

程序結(jié)構(gòu)=控制結(jié)構(gòu)+數(shù)據(jù)結(jié)構(gòu)

結(jié)構(gòu)化程序設(shè)計(jì):是為使程序具有合理的結(jié)構(gòu),以保證程序正確性而規(guī)定的一套程序設(shè)計(jì)的方法,是人們多年來研究與實(shí)踐的結(jié)晶。

①結(jié)構(gòu)化程序設(shè)計(jì)目的:通過設(shè)計(jì)結(jié)構(gòu)良好的程序,以程序的靜態(tài)良好結(jié)構(gòu)保證程序動態(tài)執(zhí)行的正確性,使程序易理解、易調(diào)試、易維護(hù),以提高軟件開發(fā)的效率,減少出錯率。

②結(jié)構(gòu)化程序設(shè)計(jì)的構(gòu)成單元

任何程序都可由順序、選擇、重復(fù)三種基本控制結(jié)構(gòu)來組成。如圖1.5所示 。

處理1

處理2

條件

處理1

處理2

條件

  處理

 

 

 

 

 

 

 

 

 

 

 

 

 


 

a  順序結(jié)構(gòu)                    b 選擇結(jié)構(gòu)                             c 重復(fù)結(jié)構(gòu)

表示“處理1”先             表示當(dāng)條件滿足時執(zhí)行“處理1” 首先判斷條件是否滿足,若滿足

于“處理2”執(zhí)行    否則執(zhí)行“處理2”                      執(zhí)行“處理”,返回“判斷”條件,直至條件不

滿足為止

三種基本的結(jié)構(gòu)程序設(shè)計(jì)圖

 

三種控制結(jié)構(gòu)可表示其它結(jié)構(gòu),采用基本結(jié)構(gòu)組合的方法,產(chǎn)生所需要的程序。

三種基本的控制結(jié)構(gòu)共有的特點(diǎn)是單入口單出口。(如虛線部分)

程序語言中也可引入其它控制結(jié)構(gòu)設(shè)施,為靈活、方便的處理問題。

限制GOTO 句的意義:

goto 語句為無條件轉(zhuǎn)向語句,其一般格式為:goto 語句標(biāo)號

含義是無條件跳轉(zhuǎn)到語句標(biāo)號所處位置開始繼續(xù)執(zhí)行后面的語句。顯然goto語句改變了程序的執(zhí)行順序。如果程序中不限制goto 語句的使用,則使得程序的靜態(tài)結(jié)構(gòu)與程序的動態(tài)執(zhí)行差異很大,程序難閱讀、難理解,破壞了單入口/單出口的原則,使程序的正確性難以證明,錯誤難以局部化。

③結(jié)構(gòu)化程序設(shè)計(jì)方法

結(jié)構(gòu)化程序設(shè)計(jì)的概念是E.W.Dijkstra于1969年首先提出的,他強(qiáng)調(diào)了從程序結(jié)構(gòu)和風(fēng)格上來研究程序設(shè)計(jì)問題。也將此方法稱為“自頂向下”或“逐步求精”法。其一是“自頂向下,逐步求精”的設(shè)計(jì)思想,即整個設(shè)計(jì)應(yīng)分為若干層次,逐步加以解決;而每一步實(shí)在前一步的基礎(chǔ)上,對前一步設(shè)計(jì)的細(xì)化。其二是“獨(dú)立功能,一個入口,一個出口“的模塊化結(jié)構(gòu),即把大而復(fù)雜的問題層層細(xì)化分解成若干個相對獨(dú)立、功能單一的問題處理模塊,而每個模塊與外界聯(lián)系只有一個單入口與單出口。其三是“僅用三種基本控制結(jié)構(gòu)”的設(shè)計(jì)原則,即每個模塊都只用三個基本結(jié)構(gòu)來描述。

 

C程序?qū)崿F(xiàn)的結(jié)構(gòu)及特點(diǎn)

一個完整的、可執(zhí)行的C程序文件一般結(jié)構(gòu)如下:

[包含文件語句]

[預(yù)編譯語句]

[宏定義語句]

[子函數(shù)1]

[子函數(shù)2]

[子函數(shù)3]

.

.

.

[子函數(shù)n]

主函數(shù)

以上每行表示一段語句或程序,[ ]中的內(nèi)容表示可選。所謂可選,并不是說可有可無,而是要根據(jù)實(shí)際情況看是否需要它們,但對一個完整的、可執(zhí)行的C程序而言,主函數(shù)是必不可少的,它是一個程序的入口。換句話說,計(jì)算機(jī)執(zhí)行一個程序的時候,是從主函數(shù)的位置開始執(zhí)行的。還有一點(diǎn)需要說明的是,主函數(shù)的函數(shù)名必須使用main()。

不管是子函數(shù)還是主函數(shù),它都是一個函數(shù),對一個函數(shù)而言,一般是這樣一個結(jié)構(gòu):

[返回類型] 函數(shù)名([參數(shù)列表]){

[說明性語句]

[操作性語句]

}

與上面所講的內(nèi)容相似,[ ] 中的內(nèi)容表示可選,對于主函數(shù)而言,返回類型和參數(shù)列表一般情況下可以不明確的寫出來,系統(tǒng)會執(zhí)行一些默認(rèn)的操作,但對于子函數(shù)而言,返回類型是必不可少的,其他的內(nèi)容比如參數(shù)列表則要根據(jù)實(shí)際情況而定(需要就用,不需要就不用。但是什么時候需要,什么時候不需要,就屬于程序的功能設(shè)計(jì)范疇,這在以后還要做進(jìn)一步的討論)。

C語言程序結(jié)構(gòu)有如下特點(diǎn):

1.C程序由函數(shù)構(gòu)成。一個C程序至少要包括一個函數(shù),即main函數(shù),也可以包含一個main函數(shù)和若干個其它函數(shù)。因此,函數(shù)是C程序的基本單位。被調(diào)用的函數(shù)可以是系統(tǒng)提供的庫函數(shù),如printf和scanf函數(shù),也可以是用戶自定義的函數(shù)。C的函數(shù)相當(dāng)于其它語言中的子程序。用函數(shù)來實(shí)現(xiàn)特定的功能。C語言的函數(shù)庫十分豐富,Turbo C提供三百多個庫函數(shù)。C語言的這種特點(diǎn)易于實(shí)現(xiàn)程序的模塊化。

2.            每個函數(shù)由兩部分組成:函數(shù)的說明部分和函數(shù)體。函數(shù)的一般形式為:

函數(shù)類型 函數(shù)名(參數(shù)表)

參數(shù)說明;

{

  函數(shù)體;

}

其中說明部分包括函數(shù)名、函數(shù)類型、函數(shù)屬性、形參名、形參類型。一個函數(shù)名后面必須跟一對圓括弧,可以沒有參數(shù),如main();函數(shù)體即函數(shù)說明部分下面的大括弧{}內(nèi)的部分,如果一個函數(shù)中有多對大括弧,則最外層的一對{}為函數(shù)體的范圍。函數(shù)體一般包括變量的定義和執(zhí)行部分。

3.            main函數(shù)是整個C程序的入口。一個C程序總是從main函數(shù)開始執(zhí)行的。main函數(shù)可以在程序最前面,也可以在程序最后,或在一些函數(shù)之前、另一些函數(shù)之后。

4.            C程序書寫格式自由,一行內(nèi)可以寫幾個語句,一個語句也可以分開寫在多行上。各語句之間用分號分隔。分號是C語句的必要組成部分。語句結(jié)束標(biāo)志分號不可缺省,即使是程序的最后一個語句也必須要有分號。

5.            C語言本身沒有輸入輸出語句。其輸入和輸出功能是由庫函數(shù)scanf和printf等函數(shù)來實(shí)現(xiàn)的,即C對輸入輸出實(shí)行“函數(shù)化”。

6.            可以用/*……*/對C程序中的任何部分作注釋,以提高程序的可讀性。

與參數(shù)傳遞的相關(guān)技術(shù)

 

變量的作用域

程序的編譯單位是源程序文件,一個源程序文件可以包含一個或若干個子函數(shù),在函數(shù)內(nèi)定義的變量是內(nèi)部變量,在函數(shù)外定義的變量是外部變量,又叫全局變量或全程變量。

全局變量可以為本文件中其它函數(shù)所共用,其作用域從定義該變量的位置開始一直到文件結(jié)束。全局變量可以實(shí)現(xiàn)參數(shù)傳遞的某些功能,在其作用域范圍內(nèi),全局變量可以將子函數(shù)中的值帶出到其它函數(shù),但如果在一個子函數(shù)中作了改變,將會影響全局變量的值。局部變量只在本函數(shù)范圍內(nèi)有效,也就是說只有在本函數(shù)內(nèi)才能使用它們,本函數(shù)以外不能使用。需要注意的是,不同函數(shù)中可以使用相同名字的變量,由于其作用域的范圍不同,盡管有相同的名字,但它們代表不同的對象,作用域不同,互不干擾。在一個函數(shù)內(nèi)部,可以在復(fù)合語句中定義變量,但這種變量只在本復(fù)合語句中有效。簡單來說,變量作用域就是指包含該變量定義的最小范圍。比如說,在子函數(shù)定義的變量其作用域就在該子函數(shù)體內(nèi),在復(fù)合語句中定義的變量其作用域就在該復(fù)合語句中,在文件開始定義的變量在整個文件內(nèi)有效。

 

參數(shù)傳遞方式

參數(shù)傳遞是函數(shù)之間進(jìn)行信息通訊的重要渠道。其參數(shù)傳遞的主要方式有傳值和傳地址兩類方式。C語言中調(diào)用函數(shù)時,實(shí)參代替形參的過程是一個單向的傳值過程,在編譯技術(shù)中稱為值傳遞方式。C語言中指針類型的參數(shù)傳遞可以看作是傳地址方式。下面是一個關(guān)于參數(shù)傳遞以及變量作用域的源程序:

#include <stdio.h>

int b=10;                                  /*定義全局變量*/

int fun1(int a1){

       b=a1+1;                               /*改變?nèi)肿兞?/

       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);

}

下面是該程序的運(yùn)行結(jié)果:

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ù)的調(diào)用改變了全局變量b,fun2()函數(shù)的調(diào)用改變了局部變量c。

 

函數(shù)結(jié)果的帶出方式

值傳遞方式最大的缺點(diǎn)是被調(diào)用函數(shù)不能通過參數(shù)向調(diào)用函數(shù)返值,原因是出了函數(shù)體,值參數(shù)的作用域相當(dāng)是該函數(shù)的局部變量,無法帶出結(jié)果值,如果返回一個結(jié)果值,可以使用return方式返回函數(shù)結(jié)果值。

如果函數(shù)結(jié)果需要帶出多個值,該怎樣實(shí)現(xiàn)?可以有以下兩類方式:①全局變量方式帶出,②通過地址傳遞帶出(數(shù)組方式、結(jié)構(gòu)體方式、指針方式)。

①全局變量方式:上面源程序中的fun1()函數(shù)對b的改變就是一個全局變量方式帶出的例子。

②數(shù)組方式:如果要返回的是多個相同類型的值,則可以將這些值放到一個數(shù)組當(dāng)中,然后返回?cái)?shù)組的指針或首地址。

③結(jié)構(gòu)體方式:如果要返回的是多個不同類型的值,則可以將這些值放到一個結(jié)構(gòu)體當(dāng)中,然后返回結(jié)構(gòu)體的指針或全局變量,但必須注意的是該結(jié)構(gòu)體必須是在全局范圍內(nèi)定義的結(jié)構(gòu)體。

④指針方式:像改變上源程序中的fun2()函數(shù)對a一樣改變相關(guān)需要改變的變量。

注:通過參數(shù)表的參數(shù)傳遞是一種參數(shù)顯式傳遞方式,而通過全局變量可一種隱式參數(shù)傳遞,一個函數(shù)中對全局變量的改變會影響其它程序的調(diào)用,使用全局變量必須注意這個問題。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多