/*
求出整數123的各位數字相應的字符ASCII碼編號並輸出。
*/
#include <stdio.h>
#include <stdlib.h>
#define ZHENGSHU_3 123 //問題中的常數一般應該用符號常量表示
#define GE 1
#define SHI 10
#define BAI 100
#define QIAN 1000
int main( void )
{
printf("%c的ASCII碼值為%d
",
ZHENGSHU_3 %QIAN / BAI + 0 , ZHENGSHU_3 % QIAN / BAI + 0);
printf("%c的ASCII碼值為%d
",
ZHENGSHU_3 % BAI / SHI + 0 , ZHENGSHU_3 % BAI / SHI + 0);
printf("%c的ASCII碼值為%d
",
ZHENGSHU_3 % SHI / GE + 0 , ZHENGSHU_3 % SHI / GE + 0);
system("PAUSE");
return 0;
}
首先,問題中的常數一般都應該寫成符號常量。這是編寫C程序的一個常識。
理由:
為常數取一個有意義的名字,代碼可讀性更好。代碼的可讀性是代碼質量的一項重要指標。
減少了出錯的可能性。把常數嵌入到代碼中寫錯的可能性很大,甚至很難發覺。譬如把某個123誤寫成了12,由於123和12都是合法的int類型常量,所以編譯時不會報錯。但是如果把符號常量的標識符寫錯的幾率相對來說要小得多,尤其是標識符有“字面意義”的情況下,而且即使寫錯了也更容易被發覺,編譯器會發現代碼中有沒有定義或說明的標識符。
程序便於修改和擴充。這種便利來自於“數據與代碼的分離”, 數據與代碼分離是現代程序設計的一條重要原則。橋歸橋,路歸路,上帝的還給上帝,魔鬼的還給魔鬼。數據與代碼之間的耦合越弱越好,這樣的代碼質量更高。在工業設計中,人們早就懂得這個道理,但在軟件業,人們付出了很多代價之後才懂得這個道理。
有助於培養抽象思維的能力。只會盯著123寫代碼就如同小學生只會算術而不會代數一樣。抽象思維能力在編程中是必須的。所以,盡管這只是一個具體的針對整數123的問題,也應該學著用抽象的方法描述它並解決它。
其次,算法方面:
算法主要有兩個,其一是求出一個整數的各位數字,其二是求出某個數字的ASCII碼。
求出一個整數的各位數字可以通過求余和除法運算完成。例如求123的十位數,可以用123%100/10得到。
顯然,求123的百位數字可以直接123/100而不必123%1000/100,同樣求123的個位數字可以直接123%10而不必123%10/1。然而把求各位數字的算法統一起來,對於學習寫程序是一個特別重要的訓練。否則在學寫循環語句和函數時就會產生巨大的困難。此外,寫出形式一致的求各位數字的算法,代碼也更整潔、美觀。
代碼也可以借助變量來寫,每次只求出個位數字。
#include <stdio.h>
#include <stdlib.h>
#define ZHENGSHU_3 123
#define SHI 10
int main( void )
{
int temp = ZHENGSHU_3 ;
printf("%c的ASCII碼值為%d
", temp % SHI + 0 , temp % SHI + 0);
temp /= SHI ;
printf("%c的ASCII碼值為%d
", temp % SHI + 0 , temp % SHI + 0);
temp /= SHI ;
printf("%c的ASCII碼值為%d ", temp % SHI + 0 , temp % SHI + 0);
system("PAUSE");
return 0;
}
C語言要求運行環境中所使用的字符集(不論是否使用ASCII碼)中,0、1、2、3、4、5、6、7、8、9這些字符的編碼是連續的,由於字符0的編碼在代碼中可以寫為0,所以只要求出了各位數字的值,再加上0就可以得到該數字對應字符的編碼,且無論運行環境是否使用ASCII碼。
第三,不足:如果從更抽象的角度提出問題,比如給出一個3位N進制整數(2<=N<=10),求其各位數字相應的ASCII碼編號並輸出,就會發現GE、SHI、BAI、QIAN這樣的名字有些尴尬——它們太具體了,只適用於十進制。從一般的角度來說,它們應該是各種進制中各個位的權值。