我不時戲稱自己不懂現今的電腦編程,就只懂16bit年代的Pascal語言。我當然不是跟大家說笑而已,實情是我在學期間就只學過這個,其他都是看過些少書本後胡亂剪貼而成,只懂修改而不懂原生創作。
好,我承認我不只懂得Pascal,其實我還懂得玩LOGO(OLPC上也有預裝到這一套軟件)。中四中五備戰會考,繼初中嘗過LOGO後認真學習編程,首試Pascal後就已愛不釋手,到中五期間更寫下兩個得意之作。
不要期望會有甚麼神奇的作品,我可沒有Mist Ho在會考期間編寫Game Master那麼強大。那個時候就是學到哪寫到哪,但寫著總是不知用來作啥,我就在課堂中從老師教學得到靈感,自發寫一些真能夠用的軟件。我的首個作品是一個模擬Assembly Language的程式,難用得已經忘記如何操作 – 大概要尋回當年的教學筆記才能解封。另一個就是今天要分享的、利用簡單計算去推算香港身分証號碼括號字符的小程式。
我已經丟失了Pascal的compiler,目前就只有當年的程式碼和一個16bit的exe檔案。身分証check digit算式早已被公開,搜尋一下就發現輸入hkid的話,check digit就是排名首位。這個網址解釋得頗清楚,雖然複雜了一點。原文不想直錄,倒想直接將我的程式碼完全公開,讓大家自行參透一下~別怪我寫得太低能就好了,呵呵。
Program idcard(input,output);
uses wincrt;
var input:string[7];
y:string;
continue:char;
a,b,c,d,e,f,g,x,z,output:integer;
Begin
repeat
clrscr;
writeln(‘你試下輸入你個身份證號碼頭七個數值丫∼’);
writeln(‘好似咁:a123456,明嘛?’);
write(‘你入錯數唔關我事架∼∼∼’);
readln(input);
y:=copy(input,2,1);
val(y,b,z);
y:=copy(input,3,1);
val(y,c,z);
y:=copy(input,4,1);
val(y,d,z);
y:=copy(input,5,1);
val(y,e,z);
y:=copy(input,6,1);
val(y,f,z);
y:=copy(input,7,1);
val(y,g,z);
y:=copy(input,1,1);
if (copy(input,1,1)=’a’)or(copy(input,1,1)=’A’) then a:=1;
if (copy(input,1,1)=’b’)or(copy(input,1,1)=’B’) then a:=2;
if (copy(input,1,1)=’c’)or(copy(input,1,1)=’C’) then a:=3;
if (copy(input,1,1)=’d’)or(copy(input,1,1)=’D’) then a:=4;
if (copy(input,1,1)=’e’)or(copy(input,1,1)=’E’) then a:=5;
if (copy(input,1,1)=’f’)or(copy(input,1,1)=’F’) then a:=6;
if (copy(input,1,1)=’g’)or(copy(input,1,1)=’G’) then a:=7;
if (copy(input,1,1)=’h’)or(copy(input,1,1)=’H’) then a:=8;
if (copy(input,1,1)=’i’)or(copy(input,1,1)=’I’) then a:=9;
if (copy(input,1,1)=’j’)or(copy(input,1,1)=’J’) then a:=10;
if (copy(input,1,1)=’k’)or(copy(input,1,1)=’K’) then a:=11;
if (copy(input,1,1)=’l’)or(copy(input,1,1)=’L’) then a:=12;
if (copy(input,1,1)=’m’)or(copy(input,1,1)=’M’) then a:=13;
if (copy(input,1,1)=’n’)or(copy(input,1,1)=’N’) then a:=14;
if (copy(input,1,1)=’o’)or(copy(input,1,1)=’O’) then a:=15;
if (copy(input,1,1)=’p’)or(copy(input,1,1)=’P’) then a:=16;
if (copy(input,1,1)=’q’)or(copy(input,1,1)=’Q’) then a:=17;
if (copy(input,1,1)=’r’)or(copy(input,1,1)=’R’) then a:=18;
if (copy(input,1,1)=’s’)or(copy(input,1,1)=’S’) then a:=19;
if (copy(input,1,1)=’t’)or(copy(input,1,1)=’T’) then a:=20;
if (copy(input,1,1)=’u’)or(copy(input,1,1)=’U’) then a:=21;
if (copy(input,1,1)=’v’)or(copy(input,1,1)=’V’) then a:=22;
if (copy(input,1,1)=’w’)or(copy(input,1,1)=’W’) then a:=23;
if (copy(input,1,1)=’x’)or(copy(input,1,1)=’X’) then a:=24;
if (copy(input,1,1)=’y’)or(copy(input,1,1)=’Y’) then a:=25;
if (copy(input,1,1)=’z’)or(copy(input,1,1)=’Z’) then a:=26;
output:=a*8+b*7+c*6+d*5+e*4+f*3+g*2;
output:=output mod 11;
output:=11-output;
if (output>0)and(output<10)then
writeln(‘嘿嘿嘿...你個身份證號碼係:’,input,'(‘,output,’),係唔係?’)
else if (output=11)then
writeln(‘嘿嘿嘿...你個身份證號碼係:’,input,'(0),係唔係?’)
else writeln(‘嘿嘿嘿...你個身份證號碼係:’,input,'(a),係唔係?’);
writeln(‘=======================================’);
writeln(‘想唔想試多次(Y/N): ’);
continue:=readkey;
until (continue=’N’) or (continue=’n’);
clrscr;
writeln(‘感謝!’);
writeln(‘著作者 clm’);
write(‘二零零一年三月二十五日 製’)
end.
隨文附送軟件下載(保證沒有病毒)…要支持運作16bit程式的Windows才能打開,目前流通的大概就只有Windows XP吧。大家可按下圖下載。
本來想試用Free Pascal編譯成32bit,但失敗多遍,唯有暫時放棄了。
十月底Windows 7派對 | 影.腦.者
2009年11月5日 @ 02時22分
[…] XP底下運作,所以我想兩者並存的日子將會不短,至少我自行編寫的那個軟件目前就只有XP支援嘛~(Windows […]