【blockly教程】Blockly編程案例


案例一 原碼反碼和補碼

 我們把一個數在計算機內被表示的二進制形式稱為機器數,該數稱為這個機器數的真值。機器數有固定的位數,具體是多少位與機器有關,通常是8位或16位。
原碼:是指符號位用0或1表示,0表示正,1表示負,數值部分就是該整數的絕對值的二進制表示。例如:假設機器數的位數是8,那么:[+17]原=00010001 [-39]原=10100111
反碼:在反碼的表示中,正數的表示方法與原碼相同;負數的反碼是把其原碼除符號位以外的各位取反(即0變1,1變0)。通常,用[X]反表示X的反碼。例如: [+45]反 = [+45]原 = 00101101,[-32]原 = 10100000,[-32]反 = 11011111
補碼:在補碼的表示中,正數的表示方法與原碼相同;負數的補碼在其反碼的最低有效位上加1。通常用[X]補表示X的補碼。例如: [+14]補 = 10100100,[-36]反 = 11011011,[-36]補 = 11011100
實事求是地說,引入補碼意義非同尋常,可以說是先輩們智慧的結晶。因為,通過補碼運算,可以把減法運算變成加法運算;而乘法可以用加法來做,除法可以轉變成減法。這樣一來,加、減、乘、除四種運算“九九歸一”了。這對簡化CPU的設計非常有意義,CPU里面只要有一個加法器就可以做算術運算了。

+

 

 因此只要能將數字轉化為二進制機器數,那么就可以模擬計算機完成各種數值運算,實現加減乘除的功能。下面我們來一起將正負數的十進制數轉化為二進制:
需求分析:輸入:一個十進制數,輸出:這個數的原碼,反碼和補碼。
實現:
1、正數的原碼反碼和補碼都是相同的,因此只要求出一個即可,我們通常用棧來實現向二進制的轉換,blockly提供list作為指針數組可以實現棧的操作,如下圖所示:

棧操作實際上就是一種先進后出的數據結構:

我們舉一個例子,比如求29的原碼,那么過程如下:

list數組提供從頭尾插入和刪除元素,並能在指定位置提取元素:

因此我們只要依次將求出的余數從數組頭處插入即可,讀取數組的時候從頭到尾開始閱讀。

2.負數的原碼其實內容上和正數是一樣的,只是符號位與正數是不同的,我們之所以把數設置成8位,就是為了留出1位作為符號位,因此8位數可以表示-128~127,第一位表示符號位,0為正數,1為負數,所以-29二進制表示為:10011101。
負數的反碼就是符號位不變,其余位取反,反碼的意義就在於進行下一步取補碼。負數的補碼就是反碼加1,求出補碼的算法就是從最后一位開始判斷,如果是0,就將其變為1,如果是1,就判斷倒數第二位,依次類推,你可以舉幾個例子自行判斷一下。

案例二 有限狀態機

 有限狀態機,(英語:Finite-state machine,FSM),又稱有限狀態自動機,簡稱狀態機,是表示有限個狀態以及在這些狀態之間的轉移和動作等行為的數學模型。它反映從系統開始到現在時刻的輸入變化,轉移指示狀態變更,並且用必須滿足來確使轉移發生的條件來描述它;動作是在給定時刻要進行的活動的描述。  我們舉一個例子,我們平時在自動售貨機上買飲料,自動售貨機的內部實際上就是一個有限狀態機:
假如有這樣一個自動售貨機,售賣蘇打汽水,它有如下五種輸入:

  • 輸入0 -- 存入25美分
  • 輸入1 -- 存入1美元
  • 輸入2 -- 取汽水
  • 輸入3 -- 退幣
  • 輸入4 -- 退出系統

實現如下:

 其實我們的小車就是通過有限狀態機來實現的,我們可以把小車的行為依依列舉出來,比如左右轉,前進,發出聲波,光線,聲音等,我們只要通過控制這些狀態就能控制小車完成各樣的工作:

你能自己設計出一個更加復雜的售貨機么?

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM