本章從簡單的程序開始,逐步介紹與程序設計緊密相關的算法、C語言程序的基本組成結構、常見的輸入/輸出函數和C語言程序設計的過程等,使讀者逐步領會和掌握C語言程序設計的基本方法。對於本章節例題中涉及到的C語言的語法細節,讀者不必深入研究,學到相關章節自然會理解。
計算機所做的工作就是按指定的步驟執行一係列的操作來完成某一特定的任務。因此要讓計算機為我們做事,就必須事先設計一些操作步驟,並用計算機語言寫成程序。在學習用C語言進行程序設計之前,我們首先要了解程序、算法和結構化程序設計方麵的知識,它們是學習後續章節的基礎。
程序是用某種計算機編程語言編寫的、能夠完成一定功能的代碼,而設計、編製、調試程序的過程則稱為程序設計。程序以文件的形式存儲在計算機中,在運行後完成某一確定的任務,從這一角度來看,程序靜態表現為保存在存儲器中的文檔,動態表現為可以被調到內存由CPU執行的一連串指令。通過在計算機上運行程序,便可讓計算機按照用戶的意圖進行信息處理,從而完成相應的任務,解決特定的問題。計算機可以通過執行不同的程序來完成不同的任務,即使執行同一個程序,當輸入不同數據時輸出的結果也有可能不同。
采用C語言等高級語言編寫的程序都具有一些典型的特點,如程序需要編譯轉化成機器代碼後才能由計算機執行;程序必須嚴格按照計算機語言設定的拚寫、語法和標點規則來編寫;程序作為一個整體是有意義的,它能夠解決特定問題。
通常,一個程序應包含對數據的描述和對操作的描述。對數據的描述是指在程序中要指定數據的類型和數據的組織形式,即數據結構。對操作的描述是指問題求解的步驟,即算法。著名計算機科學家沃思提出一個公式:數據結構+算法=程序。這個公式的重要性在於它說明了數據結構與算法是程序的兩大要素,兩者相輔相成,缺一不可。
剛接觸程序設計的讀者會有這樣一種感覺:通常讀別人編的程序比較容易,但自己編寫程序時就難了,雖然學了程序設計語言,可還是不知道從何下手,這是為什麼呢?其中重要原因之一就是沒有掌握基本的算法。事實上,生活中幾乎每一件事都是遵循著一定的算法來完成的,也就是說要按照事先想好的步驟有條不紊地進行。就拿生活中最常見的例子來說,你雖然認識地鐵站,但是不知道按照怎樣的路線才能到達目的地,當別人告訴你一條線路,如先坐1號線在某一站下車,再轉2號線,這就相當於提出了一個解決問題的算法,於是你就可以沿著這條路線到達目的地。當你下次再去相同的地方時,就不會再有疑問了。所以,當我們麵對一個需要解決的問題時,不要急於編寫程序,應該先思考解決該問題的方法和步驟。在學習程序設計語言的過程中,我們應該注重一些常用算法的積累。
當然,我們所說的算法僅指計算機算法,具體地說,它就是一個有窮規則的集合,即為解決一個具體問題而采取的確定的有限的操作步驟。通常情況下,解決某個問題的算法不是唯一的,正如前麵所說,到達目的地的公交線路或者地鐵線路有很多,在這些線路中,有些價格優惠,有些節省時間。由此可見,對於相同的問題,不同的用戶可能會設計出不同的算法,那麼算法性能也會有所差別。
設計完一個算法後,怎樣衡量它的正確性呢?一般可用以下五種特性來進行衡量。
(1)有窮性:一個算法必須保證執行有限步之後結束。一個無窮的算法並不能得到我們所需要的結果,那麼這個算法將毫無意義。
(2)確定性:算法的每一步驟都應是確定、沒有歧義的,從而保證算法能安全正確地被執行。
(3)可行性:算法中的每一個步驟原則上都應是可以正確執行的,而且能得到確定的結果。
(4)輸入:一個算法可以有0個或多個輸入。輸入為算法指定了初始條件,當然這個條件並不是必須的。
(5)輸出:一個算法可以有1個或多個輸出。算法的實現是以得到計算結果為目的,沒有輸出的算法是毫無意義的。
隨著計算機的發展,人們編寫的程序越來越複雜。對於一個包含數千萬條代碼、結構複雜的程序,其程序的可讀性往往較低,而程序的質量和可靠性也很難得到保證。為了解決這一問題,意大利的Bobra和Jacopini於1966年提出了結構化程序設計的思想,它是軟件發展的一個重要裏程碑。結構化程序設計的實質是控製編程的複雜性,其基本思想是像搭積木一樣,隻要有幾種簡單的結構即可構成任意複雜的程序。Bobra和Jacopini所提到的簡單結構即順序、選擇和循環三種結構,由這三種控製結構組成的程序就是結構化程序。
1.三種基本結構
(1)順序結構:程序流程沿著一個方向進行,它是最簡單的一種結構。
(2)選擇結構:程序的流程發生分支,根據一定的條件選擇執行其中某一模塊,也可稱為分支結構。
(3)循環結構:程序流程是不斷重複執行某一模塊後退出循環,也可稱為重複結構。循環結構可以分為當型(while)循環和直到型(until)循環兩種類型。它的流程是先判斷條件是否成立,若成立,則執行循環體模塊A,否則退出循環。
2.結構化流程圖(N-S圖)