版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第一章半導體元件1.1程序設計語言
1.2程序設計
1.3C語言概述習題1
本章學習要求:
1.了解程序設計的語言分類,掌握算法的概念、算法描述方法、流程圖的三種基本結構、結構化流程圖的畫法以及結構化程序設計的方法。
2.了解C語言的發(fā)展及應用現(xiàn)狀,認識C程序的結構,掌握C語言的特點及其編譯,熟練運用C程序的上機步驟。
人們要利用計算機解決實際問題,比如數(shù)值計算問題就需要人與計算機之間的交流,這種交流能使計算機按照人的意愿完成一系列的操作,實現(xiàn)這種交流的一種橋梁就是計算機語言,又稱為程序設計語言。由程序設計語言編寫,用來使計算機完成一定操作任務的“文章”稱為程序,編寫程序的工作稱為程序設計。
隨著計算機技術的迅速發(fā)展,程序設計語言經(jīng)歷了由低級到高級的多個發(fā)展階段,程序設計方法也得到了不斷的發(fā)展和提高。
程序設計語言是人們根據(jù)計算機的特點以及描述問題的需要設計出來的。隨著計算機技術的發(fā)展,不同風格的語言不斷出現(xiàn),逐步形成了計算機語言體系。
計算機語言按其發(fā)展過程一般分為機器語言、匯編語言和高級語言。1.1程序設計語言1.1.1機器語言
機器語言是最底層的計算機語言。用機器語言編寫的程序,計算機硬件可以直接識別。在用機器語言編寫的程序中,每一條機器指令都是二進制形式的指令代碼,即由一連串的二進制0和1組合起來的編碼,每一條指令規(guī)定了計算機要完成的某個操作。在指令代碼中,一般包括操作碼和地址碼,其中操作碼告訴計算機進行何種操作,即“干什么”;地址碼則指出被操作的對象存放在哪里。機器語言程序都是由二進制0和1組成的系列,程序編寫起來非常繁瑣,可以用“難學、難記、難寫、難檢查、難調試”來概括,尤其是用機器語言編寫的程序完全依賴于機器,程序的可移植性差。但是,由于用機器語言編寫的程序直接針對計算機硬件,因此它的執(zhí)行效率比較高,能充分發(fā)揮出計算機的速度性能,這也是機器語言的優(yōu)點。1.1.2匯編語言
為了克服機器語言的缺點,人們對機器語言進行了改進,用一些容易記憶和辨別的有意義的符號代替機器指令,如:用指令助記符來代替機器語言指令代碼中的操作碼,用地址符號來代替地址碼。用這樣一些符號代替機器指令所產(chǎn)生的語言就稱為匯編語言,也稱為符號語言。
例如:為了計算表達式“9
+
8”的值,用匯編語言編寫的程序與用機器語言(8086CPU的指令系統(tǒng))編寫的程序如表1.1所示。
表1.1匯編語言程序與機器語言程序舉例從表1.1中可以看出,在該匯編語言程序中,以MOV(MOVE的縮寫)代表“數(shù)據(jù)傳送”,ADD代表“加”,HLT
(HALT的縮寫)代表“停止”等。這些符號含義明確,容易記憶,因而又稱為助記符。由這些助記符編寫的程序,可讀性好,容易查錯,修改方便;但計算機硬件不能直接識別,必須由一種專門的翻譯程序將匯編語言程序翻譯成機器語言程序后,計算機才能識別并執(zhí)行。這種翻譯的過程稱為“匯編”,負責翻譯的程序稱為匯編程序,翻譯出的程序稱為目標程序,而翻譯前的程序稱為源程序。匯編程序的作用如圖1.1所示。
圖1.1匯編程序的作用匯編語言也是一種面向機器的語言,但比機器語言易讀、易改,執(zhí)行速度與機器語言相當,比高級語言快很多,因此直到現(xiàn)在仍在實時控制、實時處理領域中廣泛應用。1.1.3高級語言
機器語言和匯編語言都是面向機器的語言,一般稱為低級語言。低級語言對機器的依賴性很大,而且與自然語言相距甚遠,不符合人們的表達習慣。
為了從根本上改變語言體系,必須從兩方面入手:一方面是力求接近于自然語言;另一方面是力求脫離具體機器,使語言與指令系統(tǒng)無關,達到程序通用的目的,這就要求程序的可移植性好,一個可移植性好的程序,應用在各種計算機和操作環(huán)境中都能運行,并得到同樣的結果。因此,從20世紀50年代中期開始逐步發(fā)展出面向問題的程序設計語言,稱為高級語言。高級語言與具體的計算機硬件無關,其表達方式接近于被描述的問題,易為人們接受和調試,使編程效率得到大幅度的提高。高級語言的顯著特點是獨立于具體的計算機硬件,通用性和可移植性好。例如前面計算“9
+
8”的問題,如果使用BASIC、C語言或PASCAL語言來編程,就變得十分簡單,而且易于理解,如表1.2所示。
表1.2高級語言程序舉例在使用高級語言設計程序時,可以有兩種設計方法:一種是面向過程的程序設計方法,另一種是面向對象的程序設計方法。例如:早期出現(xiàn)的BASIC、PASCAL、FORTRAN、COBOL、C等高級語言,采用的是面向過程的程序設計方法;而較新的VisualBasic、VisualC++、VisualFoxpro、Delphi、Java等采用的是面向對象的程序設計方法。
必須指出,用任何一種高級語言編寫的程序(源程序),都要通過編譯程序翻譯成機器語言程序(稱為目標程序)后計算機才能執(zhí)行,如C語言程序;或者通過解釋程序邊解釋邊執(zhí)行,如BASIC語言程序。
從程序設計語言的發(fā)展過程和上述的例子可以看出,程序設計語言越低級,就越靠近計算機硬件,其描述的程序就越復雜,其中的每一條指令(或語句)也就越難懂。反之,程序設計語言越高級,就越靠近人的表達與思維方式,其描述的程序就越簡單,其中的每一條語句也就越容易理解,也越接近人的自然語言。
程序是由程序設計語言編寫的,用于完成特定的任務。計算機之所以能夠自動地、有條不紊地工作,正是因為計算機能夠按照程序所規(guī)定的步驟一步一步地執(zhí)行相應的操作。什么是程序設計?對于初學計算機的人來說,往往簡單地把它理解為編制一個程序。其實不然,至少是不全面的。實際上,程序設計包括多方面的內容,而具體編制程序只是其中的一個方面。著名的計算機科學家沃思(NikiklausWirth)提出:
程序
=
數(shù)據(jù)結構
+
算法1.2程序設計
實際上隨著程序設計技術的發(fā)展,一個程序除了有以上兩個主要要素之外,還應涉及到程序設計方法和語言工具等。因此,可以這樣表示:
程序
=
算法
+
數(shù)據(jù)結構
+
程序設計方法
+
語言工具和環(huán)境
也就是說,以上四個方面是一個程序設計人員所應具備的知識。在設計一個程序時要綜合運用這幾方面的知識。在這四個方面中,算法是靈魂,數(shù)據(jù)結構是加工對象,語言是工具,編程需要采用合適的方法。1.2.1算法
算法是解決“做什么”和“怎么做”的問題。算法體現(xiàn)在程序中就是程序操作語句。
1.算法及其特性
1)算法
所謂算法,就是解決某類問題的方法。確切地說,就是對某一類特定的問題,給出解決該問題的一系列(有窮的)操作,而每一操作都有其確定的意義,并在有限時間內可以計算出結果。一個算法有多個輸入量,它是問題給出的初始數(shù)據(jù),經(jīng)過算法的實現(xiàn),它有一個或多個輸出量,這就是算法對輸入運算的結果,即問題的解答。本書中所關心的只限于計算機算法,即計算機能執(zhí)行的算法。例如:讓計算機計算1+2+3+4,或將100個學生的C語言成績按高低分排序,這些計算機可以做到,而讓計算機去執(zhí)行諸如“買一份報紙”或“炒青菜”,則是做不到的(至少目前還做不到,除非以后人工智能達到一定程度才行)。
計算機算法可分為兩大類:數(shù)值算法和非數(shù)值算法。數(shù)值算法是為了解決求數(shù)值解的問題,例如求方程的根、求方程組的解和求定積分等,數(shù)值算法的研究將在“數(shù)值計算方法”(或稱“計算方法”)這門課中解決。非數(shù)值算法能解決的問題非常廣泛,最常見的是用于事務管理領域,如財務管理、人事管理、行車調度管理等,一部分非數(shù)值算法(如排序、查找等)將在“數(shù)據(jù)結構”這門課中得到體現(xiàn)。
2)算法的特點
算法具有如下特點:
(1)確定性。算法中的每一個步驟都應當是確定的,而不應當是含糊的、模棱兩可的。也就是說,每一個操作步驟都有確切的含義,無二義性。
(2)有窮性。一個算法必須在有限步驟后結束,要么計算出結果,要么非正常結束(說明算法有問題)。總之,算法的步驟不能是無限的。
(3)可執(zhí)行性。算法中的每一個步驟對計算機來說都應當是可以有效執(zhí)行的,并得到確定的結果。
(4)輸入。輸入是執(zhí)行算法時需要從外界取得必要的信息。一個算法可以沒有輸入,也可以有一個或多個輸入。
(5)輸出。算法是用來解問題的,使用算法就是要得到問題的“解”,即輸出。因此,一個算法必須得到結果,也就是算法的輸出。一個算法必須有一個或多個輸出,如果沒有輸出,算法就沒有意義,等于問題沒有得到解決。
3)算法的評價
如何評價一個算法呢?對算法的要求有:必須是正確的,必須能高效率執(zhí)行,即占用內存空間少,所需運行時間短。于是,對算法的評價可以從兩個方面進行:①執(zhí)行算法所需的時間長短;②執(zhí)行算法所需的計算機內存容量大小。
要想確切評價一個算法,必須采用算法分析方法。算法分析的標準是算法的時間復雜度和空間復雜度。這些概念可以參閱數(shù)據(jù)結構相關資料,這里不再一一贅述。
2.算法的描述
一個算法設計好后,可以采用不同的表示形式,以便交流和閱讀。常用描述算法的方法有自然語言、偽代碼、流程圖。
1)自然語言
自然語言就是人們日常使用的語言,可以是漢語、英語或其他語言。用自然語言描述算法具有通俗易懂的優(yōu)點,但缺點也比較多,體現(xiàn)在以下幾個方面:
(1)比較繁瑣。往往要用一段繁瑣的文字才能說清楚程序所要進行的操作。
(2)容易出現(xiàn)“歧義性”。自然語言往往要根據(jù)上下文才能正確判斷出其含義,不太嚴謹。
(3)用自然語言容易描述順序執(zhí)行的步驟,但如果算法中包含判斷和轉移情況時,用自然語言就不那么直觀清晰了。
例1.1
將兩個變量x和y的值互換。
問題分析:兩個人交換座位,只要各自去坐對方的座位就行了,這是直接交換。一瓶酒和一瓶醋互換,就不能直接從一個瓶子倒入另一個瓶子,必須借助一個空瓶子,先把酒倒入空瓶,再把醋倒入已倒空的酒瓶,最后把酒倒入已倒空的醋瓶,這樣才能實現(xiàn)酒和醋的交換,這是間接交換。
在計算機中交換兩個變量的值不能用兩個變量直接交換的方法,而必須采用間接交換的方法。因此,這里需設一個中間變量z(相當于空瓶子)。
用自然語言描述如下:
步驟1,將x值存入中間變量z中:x→z。
步驟2,將y值存入變量x中:y→x。
步驟3,將中間變量z的值存入y中:z→y。
2)偽代碼
偽代碼(pseudocode)一般介于自然語言與程序設計語言之間,它具有自然語言靈活的特點,同時又接近于程序設計語言的描述。但需指出,用偽代碼所描述的算法,一般不能直接作為程序來執(zhí)行,最后還需轉換成用某種程序設計語言所描述的程序。偽代碼與程序設計語言最大的區(qū)別就在于,偽代碼描述比較自由,不像程序設計語言那樣受語法的約束,只要使得人們能理解就行,而不必考慮計算機處理時所要遵循的規(guī)定或其他一些細節(jié)。例如,在例1.1中,將兩個變量x和y的值互換,可以用偽代碼描述如下:
BEGIN
xz
yx
zy
END
在偽代碼描述算法中,關鍵字可以使用英文,也可以用中文,還可以使用一些符號來表示,并無固定的、嚴格的語法規(guī)則,只要將意思表達清楚,并且書寫的格式要清晰易讀就可以了,總之,在偽代碼描述算法時只需遵循便于書寫和閱讀的原則即可。
3)流程圖
流程圖是用一些圖框、流程線以及文字說明來表示算法。用流程圖來表示算法,更加直觀、形象、容易理解。
(1)傳統(tǒng)流程圖。美國國家標準化協(xié)會ANSI(AmericanNationalStandardInstitute)規(guī)定了一些常用的流程圖符號,各種流程圖符號表示如下:
例1.2
判斷一個數(shù)n是否是素數(shù)的算法用流程圖表示,如圖1.2所示。
這種傳統(tǒng)流程圖雖然形象直觀,但對流程線的使用沒有限制,流程隨意轉移,甚至可能變得毫無規(guī)律,難以閱讀和維護。
圖1.2判斷n是否是素數(shù)
(2)結構化流程圖。傳統(tǒng)流程圖中流程線的用法不受限制,可能會導致流程圖毫無規(guī)律。針對以上問題,1966年,Bohra和Jacopini提出了三種基本結構:順序結構、選擇結構、循環(huán)結構。用這三種基本結構作為表示一個良好算法的基本單元,可以改進傳統(tǒng)流程圖,使傳統(tǒng)流程圖結構化,從而大大提高了流程圖的規(guī)律性,也便于人們閱讀和維護。
①順序結構。順序結構是最簡單的一種基本結構,計算機在執(zhí)行順序結構的程序時,按語句出現(xiàn)的先后次序依次執(zhí)行。如圖1.3(a)所示,計算機將先執(zhí)行A操作,再執(zhí)行B操作。
圖1.3順序結構與選擇結構流程圖②選擇結構。當程序在執(zhí)行過程中需要根據(jù)某種條件的成立與否有選擇地執(zhí)行一些操作時,就需要使用選擇結構。圖1.3(b)表示了選擇結構的流程圖。這種結構包含一個判斷框,根據(jù)給定的條件是否滿足,從兩個分支路徑中選擇執(zhí)行其中的一個。從圖1.3(b)中可以看出,無論執(zhí)行哪一個分支路徑都將通過匯合點b,b點是選擇結構的出口點。
③循環(huán)結構。循環(huán)結構用于規(guī)定重復執(zhí)行一些相同或相似的操作。要使計算機能夠正確地完成循環(huán)操作,就必須使循環(huán)在執(zhí)行有限次數(shù)后退出,因此,循環(huán)的執(zhí)行要在一定的條件下進行。根據(jù)對條件的判斷位置不同,可以有兩類循環(huán)結構:當型循環(huán)和直到型循環(huán)。當型循環(huán)結構如圖1.4(a)所示。當程序運行到a點時,從a點進入當型循環(huán)。首先判斷條件是否成立,如果條件成立,則執(zhí)行A操作;執(zhí)行完A操作后,再判斷條件是否成立,若仍然成立,再執(zhí)行A操作。如此反復執(zhí)行,直到某次條件不成立時為止,這時不再執(zhí)行A操作,而是從b點退出循環(huán)。顯然,在進入當型循環(huán)時,如果一開始條件就不成立,則A操作一次都不執(zhí)行。直到型循環(huán)結構如圖1.4(b)所示。當程序運行到a點時,從a點進入直到型循環(huán)。首先執(zhí)行A操作,然后判斷條件是否成立,如果條件成立,則繼續(xù)執(zhí)行A操作;再判斷條件是否成立,若仍然成立,再執(zhí)行A操作。如此反復執(zhí)行,直到某次條件不成立時為止,這時不再執(zhí)行A操作,而是從b點退出循環(huán)。顯然,在進入直到型循環(huán)時,A操作至少執(zhí)行一次。
圖1.4循環(huán)結構流程圖以上三種基本結構有以下共同的特點:
●只有一個入口。
●只有一個出口。
●每一個基本結構中的每一部分都有機會被執(zhí)行到。也就是說,對每一個框來說,都應當有一條從入口到出口的路徑通過它。
●結構內不存在“死循環(huán)”(即無終止的循環(huán))。
已經(jīng)證明,由以上三種基本結構組成的算法,可以解決任何復雜的問題,并且由基本結構構成的算法屬于“結構化”的算法,不存在無規(guī)律的轉移。
(3)
N-S流程圖。1973年,美國學者I.Nassi和B.Shneiderman提出了另一種流程圖形式。在這種流程圖中完全去掉了流程線,全部算法寫在一個矩形框內,在框內還可以包含其他的框,該流程圖稱為N-S流程圖。這種流程圖用以下三種基本元素框來表示程序設計中的三種基本結構。
①順序結構。如圖1.5(a)所示,A和B兩個框組成一個順序結構。A框或B框可以是一個簡單的操作(如讀入數(shù)據(jù)或輸出等),也可以是三種基本結構之一。
②選擇結構。如圖1.5(b)所示,當條件P成立時執(zhí)行A框操作,P不成立時則執(zhí)行B框操作。這里A和B不可能同時都操作,這是兩個分支的選擇結構。
圖1.5順序結構與選擇結構③循環(huán)結構。當型循環(huán)如圖1.6(a)所示,當條件P1成立時反復執(zhí)行A框中的操作,直到P1條件不成立時為止。直到型循環(huán)如圖1.6(b)所示,反復執(zhí)行A框中的操作,直到P1條件不成立時為止。當型循環(huán)與直到型循環(huán)的區(qū)別:當型循環(huán)先判斷條件是否成立,再執(zhí)行循環(huán)中的A框;而直到型循環(huán)先執(zhí)行一次A框,再判斷條件是否成立;直到型循環(huán)最少會執(zhí)行一次A框,而當型循環(huán)中如果第一次判斷時條件就不成立,則A框一次都不執(zhí)行。
例1.1算法的流程可以表示為圖1.7所示的形式。
圖1.6循環(huán)結構
例1.3
求最大公約數(shù)的算法用N-S流程圖描述,如圖1.8所示。
N-S流程圖具有以下明顯的優(yōu)點:
●功能明確,即圖中的每個矩形框所代表的特定作用域可以明確地分辨出來。
●能夠保證程序整體是結構化的,它不允許任意轉移和設置出口,因此可以保證單入口、單出口的程序結構。
●很容易實現(xiàn)和表示嵌套結構,這為較復雜的程序設計提供了方便的途徑。
但由于N-S流程圖僅使用三種基礎結構形成流程,因此在某些程序設計時可能會比較繁瑣,有一定的困難。
圖1.7交換變量x和y的值
圖1.8求m、n的最大公約數(shù)1.2.2結構化程序設計
結構化程序設計方法要求將程序的結構規(guī)定為順序、選擇和循環(huán)三種基本結構。一個結構化程序就是用高級語言表示的結構化算法。用三種基本結構組成的程序必然是結構化的程序,這種程序便于編寫、閱讀、修改和維護,并且會減少程序出錯的機會,從而提高程序的可靠性,保證程序的質量。
結構化程序設計強調程序設計風格和程序結構的規(guī)范化,提倡清晰的結構。怎樣才能得到一個結構化的程序呢?具體說,采取以下方法可以保證得到結構化的程序。
1.自頂向下、逐步細化的設計過程
自頂向下、逐步細化的設計過程包括以下兩個方面:
(1)將一個復雜問題的解法分解和細化成由若干模塊組成的層次結構。
(2)將一個模塊的功能逐步分解細化為一系列的處理步驟,直到細化為某種程序設計語言的語句或某種機器指令。自頂向下、逐步細化的設計過程具有以下兩個優(yōu)點:
(1)自頂向下、逐步細化的方法符合人們解決復雜問題的普遍規(guī)律,可以顯著提高程序設計的效率。
(2)用先全局后局部、先整體后細節(jié)、先抽象后具體的逐步細化過程,設計出的程序具有清晰的層次結構,容易閱讀和理解。
正如我們要寫好一篇文章那樣,首先要訂出總綱,初步擬訂好文章分為哪幾部分,然后考慮每一部分中應包括哪幾方面內容。這樣一直細分下去,最后確定出章、節(jié)、段的目錄提綱。這種先確定總綱,再細分確定詳細提綱,最后才開始動手寫文章的方法同樣適用于程序設計。
2.模塊化設計
模塊化設計是指把一個大程序按人們能理解的大小規(guī)模進行分解。由于經(jīng)過分解后的各模塊比較小,因此容易實現(xiàn),也容易調試。
在進行模塊化程序設計時,應重點考慮以下兩個問題:
(1)按什么原則劃分模塊?
(2)如何組織好各模塊之間的聯(lián)系?
1)按功能劃分模塊
劃分模塊的基本原則是使每個模塊都易于理解。按照人類思維的特點,按功能來劃分模塊最為自然。在按功能劃分模塊時,要求各模塊的功能盡量單一,各模塊之間的聯(lián)系盡量少。滿足這些要求的模塊有以下幾個優(yōu)點:
(1)模塊間的接口關系比較簡單,并且每個模塊都是人的智力所能及的。因此,這種程序的可讀性和可理解性都比較好。
(2)各模塊的功能比較單一,當需要修改某一功能時,一般只涉及到一個模塊,不會影響到其他模塊。因此,這種程序的可修改性和可維護性比較好。
(3)人們脫離程序的上下文也能單獨驗證一個模塊的正確性,便于對程序進行模塊化測試。因此,這種程序的可驗證性比較好。
(4)在擴充系統(tǒng)或建立新系統(tǒng)時,可以充分利用已有的一些模塊,用積木式的方法進行開發(fā)。因此,這種程序的可重組性比較好。
在C程序設計語言中,函數(shù)是實現(xiàn)程序模塊化的有力工具。
2)按層次組織模塊
結構化程序設計方法要求在設計程序時按層次結構組織各模塊。
在按層次組織模塊時,一般上層模塊只指出“做什么”,只有在最底層的模塊中才精確地描述“怎么做”。例如,在圖1.9所示的層次結構中,主模塊只需要指出總任務就可以了,而子模塊1、子模塊2與子模塊3分別指出各自的子任務,子模塊4、子模塊5與子模塊6才精確描述“怎么做”。
圖1.9按層次組織的模塊調用結構圖
3.結構化編碼
結構化編碼是指在設計好一個結構化的算法之后,用高級語言正確地實現(xiàn)三種基本結構。如果所用的語言是結構化的語言(如C、PASCAL等),則直接用與三種基本結構對應的語句,進行結構化編程就不困難了。1.2.3程序設計的步驟
1.編程概念
編程,又稱程序設計,就是為了借助于計算機來達到某一目的或解決某個問題,而使用某種程序設計語言編寫程序代碼,并最終得到結果的過程。
計算機雖然功能十分強大,可以用于上網(wǎng)、娛樂、數(shù)據(jù)管理等等,但是沒有程序,它就等于是一堆廢鐵,不會理會我們對它下達的“命令”。于是,只有通過一種方式——程序,我們才能和計算機之間進行溝通。程序就是指令的集合,它告訴計算機如何執(zhí)行特殊的任務。我們要通過程序的方式來讓計算機為我們“效勞”,而這個過程就是我們“編”出來的。編程可以使用某一種程序設計語言來實現(xiàn),按照這種語言的語法來描述計算機需要做的事情。C語言就是眾多編程語言中的一種。
2.程序設計的步驟
程序設計是一種解決問題的方式。一般來說,解決問題的過程可分為三步:第一步是分析問題,設計一種解決方案;第二步是用程序語言嚴格描述這個解決方案;第三步是在計算機上調試這個程序,運行它,看它能否解決問題。如果在第三步發(fā)現(xiàn)錯誤,那么就需要仔細分析錯誤原因,弄清問題后退到前面的步驟去糾正錯誤。如果發(fā)現(xiàn)程序有問題,就要修改它,然后重新在計算機上調試運行;如果發(fā)現(xiàn)求解方案有誤,就要修改方案,重新編寫程序。程序設計過程見圖1.10。
圖1.10程序設計過程
(1)分析問題:對任務的要求、要給出什么結果、提供什么資源、有無解決的可能等進行分析。
(2)編寫程序:選擇一種計算機語言,根據(jù)前一步的算法編寫程序。
(3)運行、調試程序:上機運行程序,用各種不同的數(shù)據(jù)測試在不同的情況下能否得到正確的結果。
(4)整理文檔:寫出一份技術報告或程序說明書,其中應包括題目、任務要求、原始數(shù)據(jù)、數(shù)據(jù)結構、算法、程序清單、運行結果、所用計算機系統(tǒng)配置、使用的編程方法及工具、操作說明等,以便作為資料交流或保存。程序設計是計算機應用人員的基本功。一個有一定經(jīng)驗和水平的計算機應用人員不應當只滿足于能使用某些現(xiàn)成的軟件,利用菜單和鼠標去選擇現(xiàn)成的方案,還應當具備能夠根據(jù)工作的需要進行必要的開發(fā)工作的能力。C語言是一種結構化程序設計語言,是學習程序設計的計算機入門語言,它能很好地訓練計算機應用人員關于程序設計的思想。在后面的章節(jié)中將詳細介紹C語言的使用。
1.3.1C語言的發(fā)展與應用現(xiàn)狀
C語言是國際上廣泛流行的一種計算機高級語言,它自從20世紀70年代誕生以來已經(jīng)使用了30多年,它既可以用來編寫系統(tǒng)軟件,也可以用來編寫應用軟件。1.3C?語?言?概?述
1.C語言的發(fā)展史
C語言可以說是伴隨著對操作系統(tǒng)的改寫而產(chǎn)生的,早期的操作系統(tǒng)等系統(tǒng)軟件主要是用匯編語言編寫的(特別是當時使用較多的UNIX操作系統(tǒng))。因為匯編語言過分依賴計算機硬件,而且程序的可讀性和可移植性比較差,所以人們就想找到既具有匯編語言某些特性(如直接對硬件地址進行操作),又有一般高級語言特性(如可讀性和可移植性好)的語言,C語言就是在這種情況下產(chǎn)生的。
1)
C語言是從B語言發(fā)展來的
(1)
ALGOL60語言:1960年出現(xiàn)的ALGOL60語言是一種面向問題的高級語言,它距硬件比較遠,不宜用來編寫系統(tǒng)軟件。
(2)
CPL語言:1963年英國的劍橋大學推出了CPL(CombinedProgrammingLanguage)語言。CPL語言在ALGOL60的基礎上更接近硬件一些,但規(guī)模比較大,難以實現(xiàn)。
(3)
BCPL語言:1967年英國劍橋大學的MatinRichards對CPL語言進行簡化得到BCPL(BasicCombinedProgrammingLanguage)語言。
(4)
B語言:1970年美國貝爾實驗室的KenThompson以BCPL語言為基礎,進一步簡化,設計出簡單而又接近硬件的B語言(取BCPL的第一個字母)。但B語言過于簡單,功能有限。
(5)
C語言:1972年至1973年間,貝爾實驗室的D.M.Ritchie在B語言的基礎上設計出C語言(取BCPL的第二個字母)。C語言保持了BCPL和B語言的優(yōu)點(如接近硬件、精練),又克服了它們的缺點(如過于簡單、數(shù)據(jù)無類型等)。1973年,K.Thompson和D.M.Richie兩人合作把UNIX的90%以上用C改寫,即UNIX第5版。
2)
C語言的使用及其標準化
1978年以UNIX第7版中的C編譯程序為基礎,BrianW.kernighan和DennisM.Ritchie(合稱K&R)合著了影響深遠的名著《TheCProgrammingLanguage》,這本書介紹的C語言成為了以后各種版本的基礎,稱為標準C。
1983年,美國國家標準化協(xié)會(ANSI)根據(jù)C的發(fā)展變化和擴充,制定了新的標準,稱為ANSIC。1988年K&R按ANSIC標準重新修改了《TheCProgrammingLanguage》一書(這本書國內可以買到影印版和中譯版,有興趣的讀者可以查閱一下)。
1987年,ANSI又公布了新標準——87ANSIC。這個標準在1990年時被國際標準化組織ISO(InternationalStandardOrganization)所接受,成為以后流行的C語言的基礎。
2.?C語言的應用現(xiàn)狀
C語言作為一門結構化程序設計語言,在許多方面得到應用,主要有:
(1)
C語言在底層編程中的應用。C語言由于比較貼近硬件,因此,在單片機編程、通信接口編程、自動化控制方面的編程、手機/POS機/銀行自動存取款機等方面的編程中使用較多。包括現(xiàn)在比較流行的嵌入式程序開發(fā)(如DSP)也更多地使用的是C語言。
(2)C語言在圖形編程中的應用。C語言應用中很大部分是在圖形編程上,如圖形化的游戲開發(fā)、圖形界面的設計等。
(3)
C語言在普通信息系統(tǒng)方面的應用。在數(shù)據(jù)庫技術普及之前,使用C語言編寫信息系統(tǒng)比比皆是,因為C語言是一種很好的結構化程序設計語言,并且C語言中有豐富的數(shù)據(jù)類型,如數(shù)組、結構體類型等,為數(shù)據(jù)的處理提供了很好的工具。
以上列出了C語言的幾個主要應用方面,當然,C語言在其他很多方面都有應用。1.3.2C語言的特點
C語言從產(chǎn)生到現(xiàn)在已經(jīng)30多年了,如今還在使用,它之所以具有如此強大的生命力,是因為它有不同于(或優(yōu)于)其他語言的特點,C語言的特點如下:
(1)
C語言能實現(xiàn)匯編語言的大部分功能。C語言可以直接對硬件進行操作,能進行位(bit)操作。因此,C語言既有高級語言的功能,又有低級語言的許多功能,可以用來編寫系統(tǒng)軟件,又可以用來編寫應用軟件。
(2)用C語言編寫的程序可移植性好。當然,C程序可移植性好主要是和匯編語言相比較而言的。用標準C語言編寫的程序幾乎不做修改就能用于各種型號的計算機和各種操作系統(tǒng)。
(3)
C程序生成的目標代碼質量高,程序執(zhí)行效率高。與其他高級語言相比(如PASCAL、BASIC等),C程序的代碼效率和質量更高,但仍比匯編程序生成的目標代碼效率低10%~20%。
(4)
C語言具有結構化的控制語句,是一種結構化程序設計語言。C語言中有三種基本結構的語句,如if…else語句、while語句、switch語句、for語句,并且用函數(shù)作為程序的模塊單位,實現(xiàn)模塊化程序設計。
(5)語言簡潔、緊湊,使用方便、靈活。C語言中一共只有32個關鍵字,9種控制語句,程序書寫形式自由(如一行可以寫多個語句,一個語句也可以分成幾行寫),壓縮了一切不必要的成分,減少了代碼中關鍵字所占用的存儲空間。
(6)運算符豐富。C語言中的運算符共有34種,包括算術運算符、邏輯運算符、關系運算符、位運算符、自增自減運算符等,并且將括號、賦值、強制類型轉換等都作為運算符處理,從而使C的運算類型極其豐富,表達式類型多樣化。
(7)數(shù)據(jù)結構豐富。C語言中數(shù)據(jù)類型有整型、實型、字符型、數(shù)組類型、指針類型、結構體類型、枚舉類型等,還可以自定義類型。可以用來實現(xiàn)各種復雜數(shù)據(jù)結構,如鏈表、樹、棧等的運算。
(8)
C語法限制不太嚴格,程序設計自由度大。這一特點對于一個不熟練的程序員來說,不是一個好事。比如:在C語言中對數(shù)組下標越界不做檢查(因數(shù)組下標從0開始,經(jīng)常造成錯誤),而是由程序編寫者自己保證程序的正確。再如:在C語言中整型數(shù)據(jù)與字符型數(shù)據(jù)可以通用。1.3.3C語言程序的組成
C程序到底是什么樣子的呢?下面我們通過例子來認識C程序的特性以及基本組成。
例1.4
編寫一個程序,其功能是顯示字符串“WelcometoCworld!”。其C程序如下:
#include<stdio.h>/*將標準輸入輸出頭文件包含 到程 序中來*/
main()
{
printf(“WelcometoCworld!”); /*輸出字符串 "WelcometoC world!"*/
}
這是一個最簡單而完整的C語言程序,如果輸入計算機,并經(jīng)過編譯和連接后,運行結果是在屏幕上顯示如下字符串:
WelcometoCworld!
例1.5
將變量x與y的值互換。
#include<stdio.h> /*將標準輸入輸出頭文件包含到程序中來*/
main()
{
intx,y,z; /*定義三個整型變量*/
scanf(“%d,%d”,&x,&y); /*從鍵盤輸入x和y的值*/
z=x; /*將變量x的值放到變量z中*/
x=y; /*將變量y的值放到x中*/
y=z; /*再將臨時存放在z中的原x的值放 到y(tǒng)中*/
printf(“x=%d,y=%d\n”,x,y); /*將交換后x和y的值分別 輸出*/
}
程序運行情況如下:
8,5↙(輸入8和5分別給變量x和y)
x=5,y=8(輸出交換后的結果)
當輸入8和5時,程序輸出:x=5,y=8,將x與y的值交換了。
例1.6
求a、b兩個實數(shù)中的最大數(shù),并輸出。
#include<stdio.h> /*將標準輸入輸出頭文件包含到程 序中來*/
floatmax(floatx,floaty) /*max函數(shù)的頭部,最前面的float表 示返回值的類型,x和y是形參,類 型都為float*/
{
floatm; /*定義變量m*/
if(x>y)m=x; /*如果x大于y,則將x的值賦給m*/
elsem=y; /*如果x小于等于y,則將y的值賦給m*/
return(m); /*將m的值返回(即帶回主函數(shù))*/
}
main() /*主函數(shù)*/
{floata,b,c; /*定義三個實型變量*/
scanf(“%f,%f”,&a,&b); /*輸入變量a和b的值*/
c=max(a,b); /*調用max函數(shù),并將返回的值賦 給變量c*/
printf("Max=%f",c); /*輸出變量c的值*/
}
本例子包括兩個函數(shù):主函數(shù)main和自定義函數(shù)max。max函數(shù)完成的功能:將x和y中較大者的值賦給變量m,并將m的值作為返回值返回調用函數(shù)main。main函數(shù)主要是輸入兩個實數(shù),并調用max函數(shù),同時將max函數(shù)返回的值賦給變量c,最后輸出變量c的值。
程序運行情況如下:
71.5,62.9↙ (輸入71.5和62.9分別給變量a和b)
Max=71.500000(輸出變量c的值)
通過以上幾個例子,我們可以看出:
(1)一個完整的C程序可以由多個函數(shù)組成,但必須包含一個且只能包含一個名為main的函數(shù)(主函數(shù)),可以有若干個(零個或多個)其他函數(shù)。程序在執(zhí)行時總是從main函數(shù)開始,并且到main函數(shù)結束。main函數(shù)可以放在程序中的不同位置,但不能放到其他函數(shù)體內。
C語言程序是以函數(shù)作為模塊單位的。在上述例子中main和max都是函數(shù)名,函數(shù)名后的括號中可以指出一些與外界交換的參數(shù)(形參),如例1.6中自定義函數(shù)max的參數(shù)x和y。
在函數(shù)中輸入用到的是scanf(),輸出用到的是printf(),這兩個也是函數(shù),分別是用來輸入/輸出的函數(shù)。它們是C語言的庫函數(shù)(標準函數(shù)),這類函數(shù)在頭文件中已經(jīng)定義,即在程序最前面的#include<stdio.h>就是將標準輸入/輸出庫函數(shù)的定義部分包含到C程序中來。
(2)在一個C函數(shù)模塊中,由左右花括號{}括起來的部分是函數(shù)體,其中的語句系統(tǒng)實現(xiàn)函數(shù)的預定功能。在C語言中用{}括起來的還有復合語句。
floatmax(floatx,floaty)
返回值類型函數(shù)名形參定義
{
floatm;
if(x>y)m=x;
elsem=y;
return(m);
}函數(shù)頭函數(shù)體
(3)
C語言中的每個語句必須以“;”(分號)結束,可以說分號是C語言語句的標志。C語言書寫比較自由,一行可以寫多個語句(每個語句以“;”結束),一個C語句也可以寫在多行上(注意:作為一個獨立參數(shù)不能拆開成幾行,如例1.4的pritnf()函數(shù)中的字符串“WelcometoCworld!”就是一個獨立參數(shù))。
(4)
C程序中的“/*……*/”是用作注釋的。注釋是用來給讀程序的人看的,在程序編譯中并不編譯。注釋可以在一行(如例1.3和例1.4中的注釋),也可以分成多行(如例1.6中的第二個注釋),但必須“/*”和“*/”成對使用,在它們之間的內容是注釋內容。C程序中的注釋可以提高程序的可讀性,編程中每三行語句有一行注釋是一個很好的習慣。
(5)
C語言中沒有輸入/輸出語句。C程序中的輸入/輸出是由標準函數(shù)來完成的,如:scanf()函數(shù)是用來輸入的,而printf()函數(shù)是用來輸出的。1.3.4C語言的編譯
1.?C程序上機調試過程
C語言是一種編譯型的高級程序設計語言(BASIC是解釋型的),開發(fā)一個C程序要經(jīng)過編輯、編譯、連接和運行四個步驟,才能得到運行結果。
1)編輯
編輯是指使用文本編輯工具軟件輸入和修改C語言的源程序,最后以文本文件的形式存放在磁盤上,文件名由用戶自己選定,擴展名一般為“.c”,例如:sample1.c,sort.c等。
2)編譯
編譯是將C源程序翻譯成二進制目標程序。編譯是由編譯程序來完成的,編譯程序對源程序自動進行句法和語法檢查,當發(fā)現(xiàn)錯誤時,就將錯誤的類型和程序中出錯的位置顯示出來,以幫助用戶修改源程序。如果未發(fā)現(xiàn)句法和語法錯誤,就自動形成目標代碼并對目標代碼進行優(yōu)化后生成目標文件。在TurboC2.0環(huán)境下,目標文件的擴展名為“.obj”;其他編譯環(huán)境下,目標文件的擴展名由系統(tǒng)自動確定。
3)連接
連接是用連接程序將編譯過的目標程序和程序中用到的庫函數(shù)連接裝配在一起,形成可執(zhí)行的程序代碼(二進制代碼)。可執(zhí)行文件的擴展名一般為“.exe”。
4)運行
運行是將可執(zhí)行文件調入內存執(zhí)行,以獲得程序的執(zhí)行結果。通常,在DOS操作系統(tǒng)提示符下直接鍵入可執(zhí)行文件名,或在Windows操作系統(tǒng)下用鼠標雙擊可執(zhí)行文件圖標即可。
上面的四個步驟見圖1.11,帶箭頭的實線表示操作流程,帶箭頭的虛線表示操作所需要的條件和產(chǎn)生的結果。
圖1.11C程序上機調
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度環(huán)保型鋼管扣件運輸與回收利用協(xié)議3篇
- 二零二五版電子元件采購合同數(shù)量取消及供應鏈調整補充協(xié)議3篇
- 2024建造師勞動合同
- 2025年度民族特色餐廳租賃及文化傳承合作協(xié)議3篇
- 二零二五年房地產(chǎn)糾紛調解估價委托合同模板3篇
- 2024年項目聯(lián)合開發(fā)協(xié)議3篇
- 二零二五年度高品質建筑材料租賃與運輸管理合同3篇
- 二零二五版商用空調租賃與能源消耗優(yōu)化合同3篇
- 威海職業(yè)學院《突發(fā)公衛(wèi)事件應急處理》2023-2024學年第一學期期末試卷
- 天津城市職業(yè)學院《災害防御與避險應急》2023-2024學年第一學期期末試卷
- DB22T 5005-2018 注塑夾芯復合保溫砌塊自保溫墻體工程技術標準
- 醫(yī)院手術室醫(yī)院感染管理質量督查評分表
- 心內電生理導管及器械
- 稱量與天平培訓試題及答案
- 超全的超濾與納濾概述、基本理論和應用
- 2020年醫(yī)師定期考核試題與答案(公衛(wèi)專業(yè))
- 2022年中國育齡女性生殖健康研究報告
- 各種靜脈置管固定方法
- 消防報審驗收程序及表格
- 教育金規(guī)劃ppt課件
- 呼吸機波形分析及臨床應用
評論
0/150
提交評論