吉宏蘭
很多學習計算機的同學,對編程比較頭疼,更有甚者學習一學期甚至一年都不能入門,編程時無從下手,本人就一實例來談談如何進行編程。希望能給廣大學習編程的同學開啟智慧之門,早日跨入奇妙的程序世界。(以下程序在QBASIC環境下運行通過)
題目:輸入一個不超過五位的十六進制數,將其轉化為十進制輸出。
一般來說,一個完整的程序通常由輸入部分、處理部分和輸出三大部分組成,題目的已知條件通常確定程序輸入部分,目的確定程序的輸出,要求確定程序的處理部分,編程的一切都得從審題開始,然后認真分析得出程序的各部分關鍵語句。
第一步:審題(從已知條件、目的和要求三個方面來分析)
已知條件:輸入一個長度不超過五位的十六進制數
輸入一個未知數,用INPUT語句,運行時由鍵盤輸入。輸入后放入一個什么類型的變量?比如輸入[ZZ(Z]694[ZZ)]或者輸入D3B49,這兩者均符合題目要求。如果存入一個數值型變量,第一個數還可以,但第二個就出錯了,為了能考慮各種情況的輸入,應選用字符型的變量,這樣就可以存儲各種輸入的可能性數值。
如何保證長度不超過5位:
(1)在INPUT語句中用明確的提示性語言,如:
INPUT “請輸入長度不超過五位的十六進制數”;X$
(2)先輸入,然后用測試串長函數、檢測來檢查,如超過五個字節的長度,則要求重新輸入,如:
DO
INPUT“請輸入一個十六進制數”;X$
LOOP UNTILE LEN(X$)<=5
目的:在屏幕上打印出相對應的十進制值。
要求:該題只要完成將輸入的十六進制的值轉化為十進制數值,至于具體用什么方法來求出對應的十進制值并無具體要求。
我們可以用學過的進制互化的方法來進行,以具體例子來分析,若:輸入D3B49,其轉換方法應為D*164+3*163+B*162+4*161+9*160,其中D、B應轉化為13、11,計算后求和即可。
具體分析,我們只要將字符串逐位取出,取出后為一個一個的字符,只需將字符“D”、“3”、“B”、“4”“9”轉化為13、3、11、4、9,然后再乘以16的n次方(位權),其中n的取值與該字符在數中所處的位置有關,如串長為L,字符串左邊開始為第一位,則第I位應乘以16的(L-I)次方,乘積加入累加器。最后,累加器中的值,即為該十六進制數對應的十進制值。
在上面的分析中,只需將字符轉化為相應的數值,如果是數字字符,即“0-9”只要用字符型轉換為數值型函數VAL()即可,如果是字母字符“A-F”,則應將其轉換為“10—15”,即“A”轉換為10、“B”轉換為“11”……,字母向后一個,數值就大1,如何轉化呢?我們知道字母“A”的ASCII碼值為65,“B”的ASCII碼值為“66”,也是字母向后一個,數值就大1。
如果我們把字母的ASCII碼值減去55,就能得到與之相對應的數值,即“A”的ASCII碼值為65,減去55等于10,“B”的ASCII碼值為66,減去55,等于11……當然,還要考慮防止用戶輸入的是小寫字母,還應先用大寫轉換函數UCASE()轉換成大寫字母,才能保證程序的正確性。
第二步:根據審題及各部分的分析寫出對應的程序。
程序及相應注釋如下:
S=0 累加器顯性賦初值
INPUT “請輸入一個不超過五位的十六進制”;X$
L=LEN(X$) 求字符串長度
FOR I= 1 TO L 設置循環,逐一取出字符串串字符
T$=MID$(X$,I,1) 取出字符
IF T$>=“0” AND T$<=“9” THEN
M=VAL(T$) 是數值字符直接轉換
ELSE
M=ASC(UCASE(T$))-55
字母字符轉換為大字字母后
END IF 求ASCII值,再減去55
S=S+M*16^(L-I) 求出該項值后加入累加器
NEXT I
PRINT S
END
第三步:考慮各種輸入的可能,用大腦模擬計算機運行。
編寫完程序,不要急于上機調試運行,首先要在大腦內進行模擬運行,考慮各種輸入情況,并舉幾個特例來分析,這樣有利于查出程序的結構錯誤和邏輯錯誤。通過這種鍛煉也有助于提高編程能力、分析問題和解決問題的能力。
第四步:上機調試、運行、驗證。
用更多的輸入來檢驗程序的運行結果。
至此,程序編寫結束:上機運行調試通過。該程序雖然簡單,也可能有很多其他的編程方法,但本文主要是與大家交流編程思路及步驟。接到題目,認真審題,分析已知條件,確定輸入部分,分析程序要求確定處理部分,分析目的確定輸出部分,編寫程序,模擬計算機運行、檢驗程序正確性,直至上機調試通過。
參考文獻:
1. 李潔冰,《中職計算機程序設計課程教學探討》[J],電腦知識與技術,2008,(05)
2. 蔣慧,《構造類型論與計算機程序設計》[J],計算機科學,2002,(02)
3. 林小華,《計算機程序設計風格探討》 [J],軟件導刊,2006(09)