C語言重要知識點總結【3】:算法的概念和特點(程序的靈魂)
目錄:
- 算法的概念1. 算法的特征1. 算法的表示方式1. 結構化程序設計方法

一、算法的概念
在不同的書中對於算法的描述各有千秋,下面用一句簡單的話來描述算法:
算法:解決問題的方法和步驟
一個程序主要包塊兩個方面的信息:
(1)數據:在程序中要用到那些數據,以及這些數據的類型和數據的組成形式。
(2)算法:解決某個問題所選用的方法,以及用該方法解決問題的步驟。
算法解決的不僅僅是 數值計算 問題,更多的是解決 非數值運算 問題;
(1)數值運算: 對於數值運算往往有現成的模型,因為人們對數值運算研究比較深入,算法比較成熟,幾乎所用數值運算都可以找到問題解決方法。問題:加減乘除、判斷閏年、求方程的根……
(2)非數值運算: 非數值運算的種類繁多,要求各異,難以做到全部都有現成的答案,因此只有一些典型的非數值運算(例如排序算法、查找搜索算法等)有現成的、成熟的算法可供使用。非數值運算最常見的就是用於事務管理領域,如:圖書檢索、學生電子信息檔案、人事管理和行車調查管理……
二、算法的特征
1.有窮性:一個算法必須總是在執行有窮步后結束,且每一步都必須在有窮時間內完成。 一個算法應包括有限的操作步驟,這里的有窮性意思是指“在合理的范圍之內”,比如讓計算機運算10000年才結束,那該計算就不能算有效的算法,究竟什么算是“合理限度”,由人們的常識和需要判讀。
2.確定性:算法中的每一個步驟都應當是確定的,不能是含糊和模棱兩可,使算法的執行者或閱讀者都能明確其含義及如何執行 。例如“手舉過頭頂”,這個步驟就是不確定的,沒有說明是右手、左手、還是雙手舉過頭頂。
3.有效性(可行性): 算法中每一個步驟都應當能有效地執行,並得到確定的結果。 例如,若b=0,則執行a/b是不能有效執行的,因為分母不能為0。
4.有0個或多個輸入:所謂輸入是指在執行算法時需要從外界取得必要的信息。 例如,求任意兩個整數的最小值,則需要用鍵盤輸入2個整數,然后才能輸出最小值。當然,一個算法也可以沒有輸入,比如直接輸出一行信息“Hello world!"。
5.有1個或多個輸出:算法的目的就是為了求解,“解”就是輸出,無輸出的算法沒有任何意義。 注意,算法的解,不僅僅是通過運算得到的數值,還可以是文字。
三、算法的表示方式
表示一個算法常用的方法有:自然語言、傳統流程圖、結構化流程圖(N-S流程圖)、偽代碼、計算機語言等
1.自然語言:用人們日常使用的語言(漢語、英語等其他語言)表示算法,但此方法表示的含義往往不太嚴格,而且描述分支和循環的算法不太方便。因此,除了簡單的問題外,一般不用自然語言表示算法。
2.傳統流程圖:直觀形象、易於理解。流程圖是用一些圖框來表示各種操作。常用流程圖符號:

菱形框:根據給定條件是否成立決定如何執行其后的操作,它有一個入口,兩個出口。
其它流程框就不作介紹了,大家應該都知道,不懂得可以搜一下看看。
下面是一個例子:
判斷2000-2500年中的每一年是否為閏年,將結果輸出。

傳統流程圖弊端:沒有嚴格限制,使用者可以不受限制使流程圖轉來轉去,毫無規律,難以讀懂。
隨着發展,在1966年,Bohra和Jacopini提出來3中基本結構:順序結構、選擇結構、循環結構。由以上3種基本結構組成的算法結構,可以解決任何復雜問題。
3.N-S流程圖
1973年,美國學者I.Nassi和B.Shneiderman提出來一種新的流程圖形式,將使用3種基本結構的流程圖中的箭頭完全去掉,全部算法寫在一個矩形大框內。這種流程圖又稱 N-S結構化流程圖 (N、S是2位學者的英文姓氏首字母)

例子:判斷2000-2500年中的每一年是否為閏年,將結果輸出。

4.偽代碼
用傳統的流程圖和N-S圖表示算法直觀易懂,但畫起來比較費事,而在修改比較麻煩。因此,流程圖適合於表示一個算法,但在設計算法過程中使用就是不很理想。為了設計算法方便,常用一種稱為偽代碼(peseudo code)的工具。
偽代碼:介於自然語言和計算機語言之間的文字和符號來描述算法。優點:書寫方便,格式緊湊,修改方便。缺點:偽代碼寫算法並無固定的、嚴格的語法規則。
總結:
以上是4種原始的表示算法的方式,在程序設計中可根據需要和習慣選用。個人認為以上4種表示算法的方式只需了解,能看懂以上4種方式表示的簡單算法問題即可。(當然,如果對所學專業有用或感興趣可鍛煉一下你的畫畫能力)
通過以上4種表示算法的方法介紹,一是讓我們了解算法表示方式的發展歷程,二是讓我們明白好算法的重要性。
5.用計算機語言表示算法
用計算機語言(C語言等)表示算法必須嚴格遵循所用的語言的語法規則,在前面寫的最簡單的程序(Hello world!及詳解)文章中就介紹了C語言最簡單程序,以及C語言的一些最基本語法規則。
四、結構化程序設計方法
結構化程序設計方法的基本思路:把一個復雜問題過程分階段進行,每個階段處理的問題都控制在人們容易理解和處理的范圍內。
得到結構化的程序一般包括以下4個步驟:
(1)自頂而下
(2)逐步細化
自上而下、逐步細化:將問題求解由抽象逐步具體化的過程。(類似寫文章時擬提綱)

(3)模塊化設計:將程序模塊,分成若干個子模塊(一般不超過50行),划分子模塊時要注意模塊的獨立性(每一個模塊完成一項功能)
(4)結構化編碼:將以設計好的算法用計算機語言來表示(結構化語言:C語言、Visual Basic等)
其它有關文章:
1.C語言重要知識點總結【1】:C語言與計算機語言(內含Hello world!詳解)
2.C語言重要知識點總結【2】:程序設計概念
了解了 程序設計、C語言 和 算法 的基本知識之后,接下來我們將正式進入C語言程序設計的學習:順序結構設計、選擇結構設計、循環結構設計、數組、函數、指針、結構體……

