1. 程式人生 > 實用技巧 >C語言重要知識點總結【3】:演算法的概念和特點(程式的靈魂)

C語言重要知識點總結【3】:演算法的概念和特點(程式的靈魂)

C語言重要知識點總結【3】:演算法的概念和特點(程式的靈魂)

目錄:

  1. 演算法的概念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語言程式設計的學習:順序結構設計、選擇結構設計、迴圈結構設計、陣列、函式、指標、結構體……