1. ALGORITHM INTRODUCTION /算法簡介
- 單詞解釋:Algorithm(法語algorithme)通常意義上被翻譯成“算法”或“演算法”。 “算法”一詞源自波斯數學家
全名:Muhammad ibn Musa al-Khwarizmi 穆罕默德·伊本·穆薩·花拉子密 (大約780年—850年),波斯-阿拉伯著名的數學家和天文學家。代數學的創始人,現代數學的重要奠基人。曾任“巴格達智慧之家”大學士,翻譯,鑽研,總結如阿基米德,歐幾里德等希臘數學家的著作後發表著名的《代數論》。至此開闢了現代數學兩大門類之一的代數學(Algebra,即阿拉伯語的‘平衡’之意)。
花拉子密被認為被第十代哈里發——穆塔瓦基勒(在位847——861)即位後推行強硬伊斯蘭教法後遭到迫害,普遍認為他死於公元850年。事實上瓦基勒早在穆阿臺綏姆末期就掌握大權並推行伊斯蘭教法造成大量學者出走或被迫流亡,被視為歐洲文藝復興的原因之一,同時終結了阿拔斯王朝的黃金時代。
- 1.1 Algorithm definition/算法的定義
算法(Algorithm)是指一組有限的、可行的步驟,用於解決特定類型的問題。一個算法應滿足以下特性:
- 通用性:能夠解決某一類問題,而非單一問題。
- 有限性:算法必須在有限的步驟內結束。
- 明確性:每一步操作必須清晰、無歧義。
- 可執行性:每一步操作都能夠被執行,最終得到結果。
- 1.2 Algorithm properties /算法的屬性:可讀性,通用性,精確性,簡潔性,結構性。
- 算法的五大屬性:
- 可讀性:算法的邏輯應當清晰易懂,即使是非專業人士也能通過簡單解釋理解其核心思想。
- 通用性:算法應具有抽象性,能夠適用於不同的編程語言和環境。
- 精確性:每一步都必須明確且無歧義,能夠被精確執行。
- 簡潔性:應儘量精煉,避免複雜的冗餘步驟。如果算法過於複雜,可以分解為多個子算法。
- 結構性:算法應具有清晰的模塊化設計,便於理解和實現。
- 1.3 Algorithm method/算法方法論
算法方法論可以總結為三大步驟(注意:這三步並非獨立存在,彼此相關聯):
- 輸入(INPUT):確定問題的性質與範圍,描述其基本要素。通常包括整數、實數、字符串、數組等數據類型。
- 輸出(OUTPUT):明確問題的目標,即希望得到的結果。例如求和、求餘、排序、嵌套等。
- 方法(PROCESS):通過一系列的邏輯步驟,從輸入得出輸出。常用的方法包括條件判斷(if-else)、循環(for/while)、遞歸等。
- 1.4 ALGORITHM VS PROGRAMMING LANGUAGE
ALGORITHM(算法):
- 一系列明確的、有限的指令,用於解決某類問題。
- 用抽象的語言描述,按邏輯順序執行。
- 與具體編程語言無關,但可以被任何編程語言實現。
PROGRAMMING LANGUAGE(編程語言):
- 人與機器的橋樑,用於將算法翻譯為機器可以理解的指令。
- 提供語法和語義,用於編寫過程、函數或模塊以執行算法。
- 不同語言適用於不同的應用場景,例如 C 適用於系統編程,Python 適用於快速開發。例如【平均數】
- ALGORITHM(實例演示為偽代碼) & PROGRAMMING LANGUAGE(以C++示例):
2.THE INSTRUCTION, THE SEQUENCE OF ALGORITHIC/算法的指令與序列
- 2.1 指令/THE INSTRUCTION:
- 程序中的一個步驟
- 指示計算機在執行下一條指令之前需要執行的操作
- 基本操作
- 由處理器理解和執行
- 2.2 序列/THE SEQUENCE:
- 一系列按順序執行的指令,在所有處理情況下都按它們的書寫順序執行
- 由開始和結束(即bloc)界定
- 開始
- 指令1
- 指令2
- …
- 指令N
- 結束
3.C與C++相關
- 3.1C與C++的歷史:
C語言誕生於1972年由 丹尼斯·麥卡利斯泰爾·裡奇(英語:Dennis MacAlistair Ritchie,1941年9月9日—2011年10月12日) 和 肯尼斯·藍·湯普遜(英語:Kenneth Lane Thompson,1943年2月4日—) 為了移植,開發UNIX,于貝爾實驗室,基於B語言開發。
丹尼斯·麥卡利斯泰爾·裡奇
肯尼斯·藍·湯普遜,於1983年測試著名象棋程序“貝爾”
而C++是1983年基於C語言,由丹麥數學家,計算機科學家比雅尼·斯特勞斯特魯普 ( Bjarne Stroustrup 1950年12月30日— )開發而來。
比雅尼·斯特勞斯特魯普於2013,與此同時,他也是《C++程序語言與設計》一書的作者
值得一提的是,大量的C語言的Unix使用者,也包括C語言之父湯普遜並不喜歡C++,認為它繁瑣。更令人難以忍受的是,C++還將程序的本身分為了“函數Fonction”與“過程 Procedure”兩類(這是一個很重要的概念,但今天與我們的主題無關暫且不表)。巧的是,不僅是他們這麼認為,用C++的人和設計C++的人也是這麼認為的。
使用C的程序員在Windows環境下編程後正在評價Windows
儘管如此,C++ 的廣泛應用不可否認。它被稱為“一用就罵,罵完就用”的工業編程語言,承載著現代工業軟件開發的許多任務。
- 3.2 C與C++的異同,以求a+b的平均值為例
C語言中的平均值計算,使用scanf 和printf實現輸入與輸出
C++計算平均值,使用cin和cout實現輸入與輸出,接下來我們要著重介紹C++的代碼含義
在 C 語言中,平均值的計算通常使用 scanf 和 printf 實現輸入和輸出。它們基於格式化字符串,雖然語法簡單直接,但需要手動管理輸入輸出的格式,不夠靈活。
在 C++ 中,則使用 cin 和 cout 進行輸入輸出。cin 和 cout 是基於流的輸入輸出機制,提供了更現代化的接口,且更加面向對象。但它們的語法略顯冗長,例如需要通過 ‘<< ’ 和‘ >>’ 操作符分隔輸入輸出。
在 C++ 中,#include 是一個預處理指令,表示在編譯之前將指定的頭文件內容包含到程序中。<iostream> 是一個標準庫頭文件,它提供了輸入輸出流(input/output stream)的功能。通過它,我們可以使用 cin 和 cout 進行輸入輸出操作。
值得注意的是,iostream 是由 io(input/output)和 stream(流)兩個部分組成的,而不是 ios-tream,和蘋果無關。
隨後的:
using namespace std;翻譯為:使用/using 命名空間/namespace 標準/std, (stand)的簡寫。std 是 C++ 標準庫的命名空間,包含了常用的標準庫功能,比如 cin、cout 和 vector 等。
什麼是命名空間?舉個例子:
一覺醒來的老白終於穿越到了他夢想的國度——蘇聯。還成了一名光榮的蘇聯紅軍戰士。老白高興地走在路上,迎面也走來一名軍人。
軍人:你哪個部隊的?
老白:我是一營二連二排三班的!
對面的軍人Bia一槍就把老白給斃了說:“我就是我就是一營二連二排的排長,我沒見過你!你一看就是契丹人派來的間諜!”
蘇聯解體之後終於真相大白,源瀨老白(不是錯別字)是另一個團一營二連二排三班的。團就是命名空間的一種。
順便科普一個軍事常識,絕大多數情況下當有人問某個人是“哪個部隊的”,在全世界絕大多數情況下這個“部隊”都是指“團或及其以下。(即番號)”
類似地,命名空間也是用來區分不同“團”的機制。例如:
可見19行,和21行,特殊的命名空間需要調用‘::’來做作用域解析而無法像std那樣直接使用cout<<輸出流
命名空間的作用是為了區分不同模塊中的同名對象,避免命名衝突。類似於“部隊編號”系統,能夠確保每個代碼模塊都有唯一的標識。
程序執行過程的內存分佈代碼解釋
main函數
float a, b; // 聲明局部變量 (棧區)
cin >> a >> b; // 從輸入緩衝區獲取數據
cout << (a + b) / 2 << endl; // 輸出平均值
return 0; // 棧區釋放
- 單詞:stack/棧
一看中文,你就懵逼了。但在英語種stack的含義十分清晰而且直觀。就是堆疊的意思。例如
stack on,指飛機降落,尤其是體型龐大的客機或運輸機。
更有意思的是,編程中擁有一個原則,後進先出(LIFO),也和它的直觀感受一樣符合程序運行原理。
如上圖,最下面的是Ice-bear,他是最先進入‘棧’的,其次是胖達(Panda),Grizz灰熊是最後一個入棧,入棧被稱為push。而它們要下來(出棧)的話則是相反,Grizz先下,胖達隨後,Ice-bear最後,這個被叫做“出棧”,英語即pop,這就是程序中所謂的“後進先出”(LIFO Last In First Out )原則。
舉個例子:你在寫文章,修圖片的時候不小心誤操作下意識地按下CTRL+Z,這就是棧的經典的應用,回溯上一步操作的行為叫做pop/出棧,記錄上一步操作叫做push/入棧。
每次你的操作都會進入內存,簡稱入棧(push)就像你輸入HELLO的時候
此時,棧底 [H, E, L, L, O] 棧頂
CTRL+Z,即將O彈出(pop),稱為出棧,從而回到
HELL
總結
- Push(入棧): 將數據放到棧的頂部。
- Pop(出棧): 從棧的頂部取出數據。
Chat GPT生成的內存區域的起止點示意圖(中文)
當用戶輸入a=5, b=7時,圖示化內存佈局
注意:具體的地址分配會因操作系統和編譯器而異
完
今天沒有作業,因為快超字數了。下一課我們來講算法和C++的布爾運算,變量,常量類型,書寫規範以及語法。
推薦讀物,可以幫你瞭解pseudocode的書寫規範:
偽代碼(加拿大滑鐵盧大學)
Pseudocode: An Introduction (偽代碼,介紹),西密歇根大學,英語