程序與算法

課程導言

【從本篇開始,就要學習編程知識了。編程,顧名思義就是編寫程序。學習之前,要先弄明白什麼是程序?解決問題的步驟就是程序嗎?算法和程序的關係是什麼?本篇將一一給出答案。通過本篇的學習,你將瞭解到程序及算法的概念及其關係


1、什麼是計算機程序?

程序是指完成某些事物的一種既定方式和過程,可以將程序看成是一系列動作的執行過程的描述。在百度百科中,計算機程序被定義爲“一組指示計算機執行動作或做出判斷的指令,通常用某種程序設計語言編寫,運行於某種目標體系結構上”①。

在生活中,可以見到許多計算機程序實例。下面,我們看一個生活片段:

清晨六點十分,伴隨着準時而優美的起牀鈴聲,我邁出宿舍,走進了第一餐廳。餐廳里人很多,沒有辦法,我只買了兩個包子做爲我的早餐罷了。隨着我的餐卡在打卡機上輕輕掠過,六毛錢便不翼而飛了。當我走到超市的時候,突然感覺只吃包子是不是太單調了,於是在超市裏拿了一包早餐奶,但付錢的時候卻發現超市的收銀機壞掉了,沒奈何,我只得忍痛把剛拿到手的早餐奶又放了回去,真鬱悶!

在上面的生活片段中,我們能找出幾處計算機程序爲我們生活服務的痕跡來呢?

●  餐廳打卡機

●  超市收銀機

前面關於計算機程序的定義提到了“計算機程序是一組執行動作或作出判斷的指令並且運行於某種目標體系結構上”。定義有點晦澀難懂,但是隻要我們結合實際運行的程序並稍微略加分析,就能夠做到瞭然於心。

首先考察(餐廳打卡機)

餐廳打卡機一般採用了射頻識別技術,“射頻識別(RFID)是一種無線通信技術,可以通過無線電訊號識別特定目標並讀寫相關數據,而無需識別系統與特定目標之間建立機械或者光學接觸。”②

打卡機利用射頻識別技術將餐卡信息讀取到打卡機,由打卡機的處理程序對讀取的信息做進一步處理。打卡機中的處理程序就是計算機程序,它需要執行下述動作和指令完成一次打卡操作:

1)  接受輸入的餐費金額

2)  讀取卡內金額

3)  判斷卡內金額是否大於餐費金額

4)  如果卡內金額小於餐費金額,給出餘額不足提示

5)  如果卡內金額大於餐費金額,將卡內金額減去餐費金額後,回寫到卡內

文字描述其動作或流程不夠清晰或理解的話,我們可以用流程圖來描述打卡機程序的執行動作或流程:


 

blob.png

圖 1  餐廳打卡機程序流程圖

採用流程圖描述打卡機程序的執行動作,是不是更直觀和清晰一些。

再來考察(超市收銀機)

超市收銀機的工作原理類似餐廳打卡機,也是採用射頻識別技術讀取商品條碼,獲取商品價格、名稱等信息,並由收銀機內置的計算機程序對商品價格等信息進行彙總處理,給出所購商品金額等信息。其處理流程要比餐廳打卡機複雜一些,它需要執行下述動作和指令完成一次收費操作:

1) 讀取商品條碼

2) 獲取商品價格、名稱等信息並顯示到收銀機屏幕上

3) 計算所掃商品總金額

4) 等待操作員按鍵

5) 操作員按下“商品”按鍵,繼續讀取商品條碼

6) 操作員按下“等金額”或“找零”按鍵,錢櫃自動開啓

其流程圖描述如下:


blob.png

 

圖 2  超市收銀機程序流程圖

從餐廳打卡機和超市收銀機的內置的程序可以看出,人們使用計算機,就是要利用計算機程序處理各種不同的問題,爲了讓計算機能夠按照我們的意願去工作,人們在設計計算機時,爲計算機提供了一套指令,其中的每一種指令對應着計算機能執行的一個基本動作,爲讓計算機完成某項任務而編寫的指令序列就稱爲計算機程序。


2、什麼是程序算法?


我們知道,程序是用來解決問題的,是由多個步驟或過程組成的,這些步驟和過程就是解決問題的算法。

同學們都下過象棋吧,圖3給出的是江湖迷局一書的一個殘局棋譜,棋譜給出了每一步棋的走法,按照棋譜規定的步驟行棋,就能破解這個殘局,棋譜給出的行棋規則就是算法。

 

0028.png

                                             圖3  棋譜殘局

去超市購物時,人們經常會對需要購買的同類商品做價格的比較,例如商品A、商品B、商品C在同樣質量的情況下,人們會傾向於比較價格,優先購買價格便宜的商品,這個比較過程是在大腦進行的,比較的過程就是排序算法,從三個數中找出最小的數。

0029.png

圖4 超市購買貨物時進行價格比較

圖3的棋譜殘局需要走11手,就能破解殘局,圖4的價格排序也僅需要對3個數進行排序,在大腦比對一下數的大小就完成了。它們都是算法,算法有沒有明確的概念和特徵呢?

要想弄清楚算法的概念和特徵。先看看算法能給人們的生活帶來哪些幫助?前面的棋譜殘局和價格比對是生活中的算法,可以幫助人們解決生活中的一些問題,讓我們變成象棋高手,或者買到最實惠的商品。

如果讓計算機執行算法,會給人們帶來什麼幫助呢?在學習方面,把解方程的步驟輸入到計算機,可以幫助人們解方程;在工作方面,把英漢詞庫及檢索算法輸入到計算機,可以幫助人們自動進行英漢詞語翻譯;在生活方面,把遊戲規則和算法輸入到計算機,可以讓人們娛樂等等。計算機有了算法,纔有了大腦和靈魂,沒有算法的計算機,只能是一臺機器。

爲了讓計算機能夠完成前面所說的任務,就需要事先對各類問題進行分析,確定解決問題的具體方法和步驟。再編制好一組讓計算機執行的指令,交給計算機,讓計算機按人們指定的步驟有效地工作。這些具體的方法和步驟,其實就是一個問題的算法。例如,讓計算機幫助我們解方程,就需要把解方程的步驟和方程參數輸入到計算機,計算機根據輸入的步驟和參數完成方程的求解。

嚴格來說,計算機程序是爲讓計算機完成某項任務而編寫的指令序列,指令序列就是解決問題的算法。

0030.png

圖5 算法的概念

 

前面理解了算法的概念,在來看看算法有哪些特徵。

算法是由有限多個步驟組成的,它有下述兩個基本特徵:第一個特徵是每個步驟都明確地規定要執行何種操作;第二個特徵是每個步驟都可以被人或機器在有限的時間內完成。算法除了上述兩個基本特徵外,還要具有第三個基本特徵:雖然有些步驟可能被反覆執行多次,但是在執行有限多次之後,就一定能夠得到問題的解答。

0031.png


圖6 算法的特徵

算法比較抽象,下面講解一個實際的算法案例,讓同學們對算法有個感性認識。對一組無序的數字進行排序,比較經典的排序算法就是冒泡排序。

冒泡排序是將一組數字多趟順序比較,一次比較兩個數字,如果他們的順序錯誤就把他們交換過來,小數或(大數)逐漸往上冒,當再沒有需要交換的數字時,說明該組數已經排序完成。

【例題:冒泡排序算法實例】

對下面的一組數字利用冒泡排序算法,按照從大到小進行排序。爲敘述方便和清晰,在每個數字前加上標號,當比較或交換兩個數字時,稱爲下標①和下標②交換位置,或者下標②與下標③比較大小。

① 23,②34,③5,④7,⑤56

算法具體步驟是從下標①開始,首先比較下標②,如果下標①數值小於下標②數值,則交換兩數位置,如果下標①數值大於下標②數值,則不交換,繼續比較下標②和下標③兩數,依次類推分別比較下標③和下標④、下標④和下標⑤,比較完畢,最小的數下標③5在右側最前面,完成第一趟比對,然後依次進行第二趟、第三趟、第N趟比對,直到沒有數字進行交換,排序完成。

●  第一趟比對

下標①23和下標②34比較大小,下標①23小於下標②34,兩數交換位置,交換位置後的數字排列如下:

②34,①23,③5,④7,⑤56

繼續比較下標①23和下標③5,因爲①23大於③5,因此兩數不作交換。

繼續比較下標③5和④7,因爲下標③5小於④7,因此兩數交換位置,交換位置後的數字排列如下:

②34,①23,④7,③5,⑤56

繼續比較下標③5和⑤56,因爲下標③5小於⑤56,因此兩數交換位置,交換位置後的數字排列如下:

②34,①23,④7,⑤56,③5

●  第二趟比對

下標②34和下標①23比較大小,下標②34大於下標①23,因此,兩數位置不變。

繼續比較下標①23和下標④7,因爲①23大於④7,因此兩數不作交換。

繼續比較下標④7和下標⑤56,因爲④7小於⑤56,因此兩數交換位置,交換位置後的數字排列如下:

② 34,①23,⑤56, ④7, ③5

繼續比較下標④7和下標③5,因爲④7大於③5,因此兩數不作交換。

●  第三趟比對

下標②34和下標①23比較大小,下標②34大於下標①23,因此,兩數位置不變。

繼續比較下標①23和下標⑤56,因爲①23小於下標⑤56,因此兩數交換位置,交換位置後的數字排列如下:

②34,⑤56,①23,④7,③5

繼續比較下標①23和下標④7,因爲①23大於下標④7,因此,兩數位置不變。

繼續比較下標④7和下標③5,因爲④7大於下標③5,因此,兩數位置不變。

第三趟比對完成後的排序:

②34,⑤56,①23,④7,③5

●  第四趟比對

下標②34和下標⑤56比較大小,下標②34小於下標⑤56,因此兩數交換位置,交換位置後的數字排列如下:

⑤56, ②34,①23,④7,③5

第四趟首次比對,排序已經完成。

冒泡排序的基本思想就是:從無序序列頭部開始,進行兩兩比較,根據大小交換位置,直到最後將最大(小)的數據元素交換到了無序隊列的隊尾,下一次繼續這個過程,直到所有數據元素都排好序。

算法是解決問題的步驟,在前面也談到了程序是執行過程的描述,那麼,算法和程序是什麼關係呢?

先請同學們思考一個計算長方形面積的問題,並給出算法。

第一步,設置num1和num2兩個變量,接收用戶輸入的長度和寬度,並存儲到num1和num2兩個變量;

第二步,判斷num1和num2是否大於0,如果大於0,繼續下一個步驟,否則提示用戶長度和寬度輸入錯誤,算法結束;

第三步,計算num1和num2的乘積,並將乘積結果存儲到result變量;

第四步,顯示result變量的值到屏幕。

算法非常簡單,四個步驟,如何讓計算機執行這個算法呢?

實現算法的僞代碼:

1
2
3
4
5
6
7
8
9
10
11
Begin(算法開始)
     聲明  num1、num2;
     輸入  num1、num2;
     IF num1 <=0 || num2 <=0
     {
        Print(“輸入的長度和寬度不能小於0”);
       退出程序
     }
     result = num1 * num2;
     Print  result;
End (算法結束)

要讓計算機執行算法,就必須要把算法用編程語言編寫出來,如Java語言,如實現計算長方形面積算法的僞代碼,僞代碼是一種算法描述語言,可以很容易地轉換爲編程語言,如Java、C語言等。可見,程序是算法的實現,算法通過某一種編程語言實現後,就是程序。


■ 課程小結

1、人們使用計算機,就是要利用計算機解決現實世界的問題。爲了讓計算機能夠按照人們的意願去工作,需要爲計算機提供一組指令,人們把解決問題的步驟用指令來描述,並把指令輸入到計算機中,計算機就會按照指令來工作,這些描述工作步驟的指令就是程序。

2、算法是解決問題的思路和步驟,這些步驟是有限的,每個步驟都可以在有限時間內由人或計算機完成,並能輸出執行後的結果,所有步驟執行完畢後,一定能夠得到算法的最終解答。

3、算法與程序的關係是相互依附的關係,算法要在計算機上執行,必須將算法的步驟用編程語言的語法描述出來,編譯通過後,方可在計算機上執行。用編程語言語法描述算法的過程就是編寫程序,編寫的程序編譯通過後,就是可以在計算機上執行的程序了。


■ 思考與練習

1、請列舉一些你在生活中經常使用的計算機程序。

2、計算機程序和算法有什麼區別?

3、對下面的一組數字用冒泡排序算法進行排序,請用文字詳細描述排序過程。

36,29,101,12,33

4、現實問題模擬:《停車場的看門人》   

某大型停車場對於進入該場地的車輛有如下的規定: 

(1)進入該停車場的車輛必須爲客運車輛,貨運車輛謝絕入內。

(2)如果該車的乘員數量小於等於4人,則收費五元。

(3)如果該車的乘員數量大於4人,則收費八元。

作業要求:請根據該停車場的規定,用文字給出判斷進入該場的車輛是否符合規定,應該收費多少的算法。

5、請用文字給出一個計算長方形面積問題的算法。

要求:接受用戶輸入的長度和寬度,輸入的長度和寬度不能爲零,如果爲零,提示用戶重新輸入,最後將計算結果顯示到顯示器上。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章