2.1 Blockly的數據類型
2.1.1 數據的含義
在計算機程序的世界里,程序的基本任務就是處理數據,無論是數值還是文字、圖像、圖形、聲音、視頻等信息,如果要在計算機中處理的話,就必須將它們轉換成所謂的數字信息,因為計算機中只能存儲數字,甚至連計算機程序都是由數字組成的,所以在使用計算機程序解決問題的時候,首先需要把需要處理的信息數字化,即使用數字表示需要處理的信息。如果我們要處理圖像信息,可以把一副圖像可以看做是由m行n列的點組成的,每一個點是一種顏色,每一種顏色可以使用三個數據(R、G、B)來表示,R表示紅色的比例、G表示綠色的比例、B表示藍色的比例,這樣就可以用個數據表示一副圖像了。如果我們需要處理文字信息,例如英文,文字是由字母及一些標點符號組成的,我們可以將每一個符號用一個數字來表示,例如在ASCII編碼標准中,用65表示字母“A”,用66表示字母“B”等等,只要把我們所使用的每個符號都進行編碼(數字化),我們就可以在計算機中處理文字信息了,總之,不論什么信息,如果要使用計算機程序來處理的話,就必須進行數字化,即將它們轉換成數字表示的形式,才能夠在計算機中處理。如果我們使用BLOCKLY書寫的程序處理數據,由於任何信息在計算機中都是以數據的形式存在的,表示數據的形式可能就多種多樣,於是就出現了這樣一些基本問題,在BLOCKLY可以使用那些種類的數據?每一種類型的數據的書寫形式是怎樣的?本章的其余部分將詳細討論這些問題。
2.1.2 Blockly中的數據
1.計算機中數據的表示形式
(1)二進制表示
眾所周知,在計算機中,采用二進制代碼表示字母、數字字符以及各種各樣的符號、漢字等。在處理信息的過程中,可將若干位的二進制代碼組合起來表示各種各樣的信息。但由於二進制數不直觀,人們在計算機上實際操作時,輸入、輸出的數值數據都是十進制,而具體轉換成二進制編碼的工作則由計算機軟件系統自動完成。字母和各種字符在計算機中的傳輸普遍采用ASCII碼,即美國標准信息交換碼,它用了7位二進制數來表達字母和各種常用字符。對於漢字信息的表示比較復雜,我國有漢字幾萬個,常用的漢字也有7000多個,為了統一,我國制定了漢字編碼標准,規定了一、二級漢字共6763個,用兩個字節來表示一個漢字。
(2)十進制表示
十進制形式是我們最熟悉的表達形式,十進制數的書寫規則是由正負號開頭,后跟一個自然數的形式,如果是正數,正號可以省略。例如:-213、0、415、76、+83都是合法的整數。在BLOCKLY中,如不特殊定義,所有數一般默認為十進制。

(3)八進制形式
使用八進制形式表示一個整數,八進制數的書寫規則是以數字0開頭,后跟一個八進制形式的數,如果是負數,則以負號開頭。例如:0123、-087、00、+0327等都是合法的八進制形式。
(4)十六進制形式
以“0x”開頭,后跟一個十六進制數,例如:0xFF03、0x123、0xAC7等都是合法的十六進制形式,而x37、287都是非法的十六進制形式。
2.Blockly中的數據類型
(1)實數
程序中所有的數據都有特定類型,數據的表示方式、取值范圍以及對數據可以使用的操作都由數據所屬的類型決定。類型可以幫助編譯程序生成高效的目標代碼,編譯程序在生成目標代碼時,可按需分配存儲空間可如何引用這個數據。一個數據屬於某個特定的類型后,在數據上允許操作的運算也確定了。例如,整數可以做四則運算等;字符串則可以進行比較、連接、判斷子串等,但不能做四則運算。

在BLOCKLY中,提供了數據輸入模塊,其默認一定的存儲長度,默認數值為0。 在一些計算公式中提供了的數據輸入模塊,如下。

各模塊數據輸入只區分數字、字符類型,也就是說在允許輸入數字的模塊中不允許輸入字符,可以輸入任何數字。但是在程序具體執行過程中,程序會對輸入數字類型的合法性進行檢查。

(2)字符
字符類型的數據,字符在內存中存儲的是該字符的ASCII編碼值,由於字符數據存儲的就是一個字符的編碼數值,所以字符數據也可以當做一個整數。在BLOCKLY中的基本表示形式是用“”引用起來,比如“A”、“”Q、“a”、“b”、“#”、“-”、“。”等。使用雙引號將一個數字放在引號里面,其意義也表示該數字,和不用引號表示的意義相同,如“65”和65的意義相同。但是大寫字母和對應的小寫字母對應的ASCII編碼值不同,因此為不同的字符。如“A”、 “a”為不同字母。
同樣的,在BLOCKLY的字符輸入模塊中,允許輸入任何形式的字符和數字,只要不超出特定的長度都是合法的。只有在程序執行的時候才檢查輸入是否正確。
(3)字符串
在BLOCKLY中字符串的表示和單個字符的表示形式是一樣的
下面幾個模塊是BLOCKLY提供的字符串輸入模塊。

如字符串輸入模塊:

如求字符串的長度:

如小寫字符變大寫字母:

如添加字符串:

(4)數據使用
前面講過,在BLOCKLY中,數據和字符定義過程中程序給了一定的存儲空間,BLOCKLY不計較輸入數據或字符的類型和長度,程序員不需要考慮非法輸入帶來的麻煩,這給了程序員極大的方便。如下:


但是,在程序運行過程中,如果數據輸入錯誤或當數據超過程序可表示的范圍,數據將會產生錯誤。例如:

如圖可見,當超過16位后的數據不再進行計算,而是原數據輸出。例如:

在該循環語句中的重復次數輸入模塊默認輸入數據為正整數。如果輸入負數,程序默認為0;如果輸入小數,默認在其整數部分上加1。
2.2變量的定義和賦值
上一節講的數據和字符,當給定一個值后,在程序中是確定的不能改變的量,我們稱為常量,而與之對應的就是變量,顧名思義,就是在程序中經常需要改變的量。
2.2.1變量定義

上圖為BLOCKLY提供的變量表定義方式,變量的命名方式比較隨便,不受限於數字或字符,但是我們為了使用方便,盡量選用簡單明了的字符,避免與程序中的其他名稱重復。並且BLOCKLY提供的變量定義不區分類型,只是在內存中分配一定的存儲空間。
2.2.2變量的初始化
部分變量需要進行初始化,變量的初始化不是必須的,根據需要可初始化或者不初始化。

2.3表達式和數據的運算
2.3.1表達式的概念
運算符是指用來表示在數據上執行某些特定操作的符號。參與運算的數據稱為操作數。
根據參與運算的操作數的個數是一個、兩個或三個,運算符分為一元運算符、二元運算符和三元運算符。表達式是指用運算符和圓括號把常量、變量和函數等運算成分連接起來的有意義的式子。單個常量、變量和函數也都可以看成是一個表達式。表達式經過計算后都會得到一個確定的值,這個值就是表達式的值。每個表達式都具有唯一確定的值和唯一確定的類型。
BLOCKLY中每一個單獨的模塊即為一個表達式。如:

以上模塊在輸入正確的數據后均為合法的表達式。
2.3.2運算符運算表達式
BLOCKLY中含蓋了日常使用的所有運算符,我們主要認識一下常用的幾類運算符:
(1)算術運算符 (+ - * / % ^)
(2)關系運算符 (> < >= <= = !=)
(3)邏輯運算符 (&& || !)
(4)賦值運算符 (=)
1.基本算術運算符
基本算術運算有6種運算符:
(1)+ 加法運算符
(2)- 減法運算符
(3)* 乘法運算符
(4)/ 除法運算符
(5)% 求余數運算符
(6)^ 次方冪運算
基本算術運算符的表達式格式為:<操作數>運算符<操作數>。BLOCKLY中給出的模塊為:

2.關系運算
關系運算符有6種:
(1)= 等於運算符
(2)≠ 不等於法運算符
(3)≤ 小於等於運算符
(4)< 小於運算運算符
(5)≥ 大於運算符
(6)> 大於運算符
關系運算符的表達式格式為:<操作數>運算符<操作數>。BLOCKLY中給出的模塊為:

3.邏輯運算
邏輯運算符有3種:
(1)&& 邏輯或運算符
(2)|| 邏輯與運算符
(3)! 邏輯非運算符
邏輯運算符的表達式格式為:<操作數>運算符<操作數>和運算符<操作數>兩種形式。BLOCKLY中給出的模塊為:

4.賦值運算
BLOCKLY中賦值運算與變量初始化的表達式相同。
2.3.3運算表達式的值
(1)單個常量或變量的表達式,其值為常量或變量的值。如98、“8”、X,其值分別為98、8、X的值。
(2)算術運算表達式的值為其運算結果。如3+2、5-6、4*8,值分別為5、-1、32。
(3)關系運算表達式的值只有兩個:1和0(真或假)。如4<2、2>1、1=2,值分別為0、1、0。
(4)邏輯運算表達式的值只有兩個:1和0(真或假)。如(x<10) ||="" (x="">20)、!(3>2),其值為0、0。
(5)賦值運算的值即為所賦的值。如a=3,b=6,其值為3、6。
2.3.4運算符的優先級
BLOCKLY中與其他編程語言不同,不需要太多的考慮運算符的優先級問題,因為BLOCKLY將不同的運算符集成在不同的模塊中,在使用中以模塊嵌套的形式形式出現,因此其運算順序只能是由里到外。如:

課后練習
1.對於計算機而言,無論是數字、字母、符號,在計算機中都是以0、1的形式存儲和計算,但是他們在BLOCKLY中有不同的運算規則,為什么?
2.分別求出a=3,b=a+3,b>a三個表達式的值和變量a或b的值,認真思考表達式的值和變量的值有什么區別?
知識梳理
