05.20 編程核心思想與概念

開發一個程序或一個系統首先都要了解需要哪些輸入、輸出數據,中間會產生哪些數據,此即數據內容。然後分析數據間的關係,形成數據模型,此即數據結構。接著考慮數據在程序或系統中如何傳送和變換,此即數據流。

1 建模問題:主要是數值計算問題涉及到建模,如建立公式與方程組,而對於非數值計算問題,主要考慮的數據結構的問題;(數學模型(變量及邏輯關係)→抽象數據類型→數據結構)

2 數據結構(問題描述和數據處理的對象);

數據表示→數據結構(關係、存、取):數據與數據關係(表、樹、圖)的線性或鏈式存儲;

3 確定輸入、輸出的數據(硬件、文件←→內存)及方式(控制檯或圖形界面的表單)

4 算法:輸入到輸出的操作與轉換

5 程序語言的選擇與對數據結構與算法的描述;

編程核心思想與概念

以上各個部分其實沒有一個嚴格的先後順序,都是相互影響,相互作用。

輸入輸出方式和算法步驟都是基於相應的數據結構設計的,相應的數據結構要能很方便地將原始問題轉換成數據結構中的各個屬性,也要能很方便地將數據結構中的結果以人們能夠理解的方式輸出。同時,也要為算法轉換過程中各個步驟的演化提供便利的支持。使用線性表還是關聯結構,使用樹還是圖,都是設計輸入輸出和算法步驟時就要考慮的問題。

編程核心思想與概念

面向過程與面向對象

面向過程:程序 = 數據結構 + 算法,以函數形成模塊化;

編程核心思想與概念

面向對象:程序 = {對象}(對象 =(封裝) 數據 + 操作),數據結構和算法體現在類或對象中;

OO=objects+classes+inheritance+communication with messages(事件觸發)

a class defines both the type of data and the operations that can be applied to that data. Including both the data and functions into one unit, the class, is called encapsulation.

類同時定義了數據的類型和可作用於這些數據之上的操作。類把數據和函數包含在一起,成為一個整體。這個過程稱為封裝。

編程核心思想與概念

grouping together data with the code that processes it, and having some fancy ways of treating it as a unit. Many programming languages refer to this type of thing as a "class".

When you bundle together an abstract data type with its operations, it is termed "encapsulation". Non-OOP languages don't have adequate mechanisms for doing this. There is no way to tell a C compiler, "These three functions are the only valid operations on this particular struct type." There is no way to prevent a programmer from defining additional functions that access the struct in an unchecked or inconsistent manner.

Object-oriented programming languages that enforce data integrity by bundling together the user-defined data structures plus the user-defined functions that are allowed to operate on them. No other functions are allowed to access the data. This extends strong typing from built-in data types to user-defined data types. A class is just a user-type with all the operations on it. A class is often implemented as a struct of data, groupd together with pointers-to-functions that operate on that data. The compiler imposes strong typing-ensuring that these functions are only invoked for objects of the class, and that no other functions are invoked for the objects.

面向過程與面向對象比較

編程核心思想與概念

數據結構(data structure)

邏輯結構:數據元素之間的邏輯關係:(一對一的線性關係,一對多的樹形關係,多對多的圖形關係)

編程核心思想與概念

存儲結構:是邏輯結構在存儲器中的表現形式:(線性存儲、鏈式存儲、哈希存儲(key map address space));

編程核心思想與概念

數據運算(數據結構的算法(小算法)):每種邏輯結構都可以歸納一個運算的集合,包括檢索、插入、刪除、更新、排序;

數據結構的分類:數組 (Array)、棧 (Stack)、 隊列 (Queue)、鏈表 (Linked List)、樹 (Tree)、堆 (Heap)、圖(graph)、集合(set)、哈希表(hash)與映射(map)

Basic Type = Value set + Operation set

Data Structure = ①Data Elements + ②Data Logic Relation + ③Data Operation;

①可以是1個簡單的基本數據類型,也可以是基本數據類型+一個或多個指針域;

Linear & Non-Linea Structure - Sequential & Non-Sequential Storage;

如果②是線性關係:對於③進行特殊定義就有棧、隊列等數據結構;對於①進行特殊限制就有字符串等數據結構;對於①的數量和類型進行限定就有數組、廣義表等數據結構;

如果②是非線性的層次關係,則是樹這種數據結構;

如果②是非線性的網狀關係,則是圖這種數據結構;

算法(algorithm)

算法按照應用分:基本算法、數據結構相關算法(小算法)、數論與代數算法、幾何算法、圖論算法、動態規劃與數值算法、數值分析算法、加密/解密算法、排序算法、查找算法、並行算法、檢索算法、隨機化算法;

算法按思路分:遞推(Recurrence)算法、遞歸(recursion)算法、窮舉(Enumeration)算法、貪婪算法(Greedy)、分治(Divide and Conquer)算法、動態規劃(Dynamic Programming)算法、迭代(iterated)算法、回溯法(Backtracking)、分枝界限(Branch and Bound Algorithm)算法、概率( probabilistic)算法。

算法都遵循特定的方法和模式,就算法的模式而言,處理各種求最優解問題時,人們常用貪婪法、動態規劃法等算法模式,處理迷宮類問題時,窮舉式的枚舉和回溯是常用的模式。

就算法的實現方式而言,如果算法需要頻繁地查表操作,那麼數據結構的設計通常會選擇有序表來實現;反過來,當設計的算法用到了樹和圖這樣的數據結構時,含有遞歸結構的方法就常常伴隨它們左右。

算法 = 操作 + 控制結構

編程核心思想與概念

模塊與封裝

面向過程的模塊化思想:函數:功能、輸入(局部變量與參數及全局變量)、輸出(函數帶出值的四種方法),輸入的數據的操作與轉換形成輸出(函數內算法);

一個函數包裝一段代碼並給予命名,引進參數將其通用化。

函數的內部觀點:關心函數的定義,1 採用什麼計算方法;2 採用什麼實現結構;3 實際參數如何使用;4 怎樣得到所需要的返回值;

函數的外部觀點:關心函數的使用,1 實現了什麼功能;2 名字是什麼;3 要求幾個參數,各參數的意義和作用;4 返回什麼值;

面向對象的封裝:對象的屬性,類方法(處理對象的屬性,事件觸發);

數據存儲與訪問

數據類型 變量

類 對象

基於值的變量(變量→值)與基於指針或引用地址的變量(變量→地址→值);

組合數據類型的訪問:基於基準元素的地址:

1 用整數索引,如數組或列表;

2 結構體的指針域;

3 用key索引value,如字典、哈希表。(key map address sapce)

編程思想

1 避免冗餘:自定義函數和類、繼承、泛型、模板

2 不重複造輪子:利用內置函數、模板庫函數、模板類;

數據模型、數據表示、數據結構、數據處理;

數據表示(描述)→數據結構→數據輸入→數據操作(操作符、函數、類方法)→數據輸出

數據結構的算法(小算法):對數據元素有如“增、查、刪、改”等的運算並能保持原有的映射才能對數據進行進一步的利用。

方法和函數是一回事,只是它是調用在一個值上。例如,如果一個列表值存儲在spam 中,你可以在這個列表上調用index()列表方法,就像spam.index('hello')一樣。方法部分跟在這個值後面,以一個句點分隔。

每種數據類型都有它自己的一組方法。例如,列表數據類型有一些有用的方法,用來查找、添加、刪除或操作列表中的值。

數據(分類)與數據操作及其結合(data and operations that manipulate the data;)

(基本數據類型 ← 運算符)→ 表達式

(函數內部局部變量、函數參數、全局變量) ← 函數

類的數據成員 ← 類方法(類實例名稱.類成員,前綴相當於是對後綴的限定)

編程核心思想與概念

編程核心思想與概念

控制、抽象、分解

基本操作→組合機制→抽象機制

為計算機編寫程序,編程者需要從實際問題出發,從高層開始設計程序,然後逐步分解程序功能。分解到一定細節程度後,就可以用編程語言的已有結構直接描述了。與之相對應,編程語言也需要為程序的分層構造提供支持。

1 需要一組基本操作,作為複雜計算活動的基礎。機器和彙編語言裡的基本操作就是各種基本指令,高級語言也提供了一組基本操作。 (基本類型+操作符)

2 需要一套描述計算的流程如何進行的組合機制。機器的彙編語言裡的基本機制是順序執行,以及完成有條件轉換或無條件轉換的專門指令。高級語言也提供一套用於組合簡單計算,構造出任意複雜的計算描述的結構。(選擇和循環等控制結構)

3 為了支持複雜開發,高級語言提供了抽象機制,能夠把一些複雜的功能包裝成為一個整體,用於支持程序的分層次構造。(函數和類封裝)

在設計一處程序時,經常需要根據問題的情況,將其劃分為順序的一系列小計算片段(順序計算模式),每個片段看作一個抽象的操作。對每個較小片段,又可能需要按某種模式進一步分解,採用if、for、while結構進一步分解。這樣分解下去,直至計算中的條件和操作都能用高級語言的基本功能描述。為避免冗餘,需要使用函數或類封裝的抽象機制,讓眾多的代碼顯得結構清晰。

(一些複雜的程序或軟件一開始也可能只是一個簡單的版本,然後功能逐漸增加,版本逐步更新換代。)

編程核心思想與概念

存儲程序(stored program)概念

指令代碼和數據同等存儲到內存,隨機訪問。

編程核心思想與概念

內存屬於存儲層次中較中間的位置:向內有緩存、寄存器;往外有外存儲器,如硬磁盤、U盤等;

數據分類與操作

1 基本類型,C語言需要在變量前聲明;

Each one of these data types has a unique range of allowable values and a set of allowable operations and functions. For example, the float data type has a range of positive and negative values which are different from the range of numbers that can be held with an int data type. An allowable operation on both the int and float data types is the square root function sqrt(). A string function such as length() is not applicable to either float or int and is consequently not allowed.

每一種數據類型都有一個唯一的允許聚會範圍及一組允許的操作和函數。例如,浮點型所允許的正負取值範圍與整型所允許的取值範圍就是不同的。平方根函數sqrt()既適用於整型數據,也適用於浮點型數據。像length()這樣的字符串處理函數就不能應用於整型或浮點型數據。

2 複合數據類型,如結構體,先定義結構體,對元素的訪問是,先聲明結構體變量struct 結構體名,再通過結構體變量名、點號.去訪問結構體成員;

3 類,先定義類,對類成員的訪問是,先聲明類實例,再通過實例名、點號.去訪問類成員;

計算的抽象

編程語言裡的變量是最基本抽象機制,用於給對象命名。算出一個所需要的值,可能要做很多工作,如果不給它命名,用過就丟了,再次使用就必須重新計算,至少要花費一些代價,程序也會變得更長。把計算出的值(對象)賦給變量,就為其建立了一個抽象。後面再需要這個值就不必重新計算,只需要寫出相應的變量名,就可以方便地使用了。這是建立抽象的第一層意義:一次計算,可以任意多次使用;

函數定義能夠建立起一般計算過程的抽象,寫一次代碼,任意多次重複使用,包括對不同的數據做同樣計算;基於一段代碼定義一個具有計算功能的實體並給予命名,就是定義函數抽象。函數調用也並不是簡單重複,因為可以替代不同的參數。

從字面量到變量量,就如同從算術到代數,函數及其參數的引入,更是通用化的進一步抽象。

類是一種更高層次的抽象,數據與數據操作的結合也更加緊密。

-End-


分享到:


相關文章: