Thiết kế chương trình kiểm tra đánh máy mô phỏng các kỹ năng đánh máy của một người bình thường
KiÓm tra §¸nh m¸y NguyÔn TrÇn TuÊn Anh Lêi nãi ®Çu HiÖn nay cïng víi sù ph¸t triÓn cña C«ng nghÖ tin häc trªn thÕ giíi nãi chung vµ ViÖt Nam nãi riªng, nh÷ng n¨m gÇn ®©y tin häc ®ang chiÕm mét vai trß quan träng kh«ng thÓ thiÕu ®îc trong tÊt c¶ c¸c lÜnh vùc, vµ lu«n ®îc lµm môc tiªu hµng ®Çu ®Ó con ngêi nghiªn cøu, t×m tßi vµ ¸p dông nh÷ng thµnh tùu to lín cña tin häc vµo trong thùc tÕ, trong nh÷ng lÜnh vùc nh Khoa häc, Kinh tÕ, Kü thuËt,… Trong c«ng cuéc ®æi míi qu¶n lý kinh tÕ x· héi hiÖn nay, viÖc nghiªn cøu ph¸t triÓn hÖ thèng th«ng tin vÒ kinh tÕ x· héi vµ khoa häc kü thuËt cã vÞ trÝ ®Æc biÖt quan träng bëi hÖ thèng th«ng tin kinh tÕ x· héi cã chuÈn x¸c nhanh nh¹y, ®¸p øng ®îc mäi yªu cÇu ®iÒu hµnh th× c«ng t¸c qu¶n lý míi ®¹t hiÖu qu¶ thiÕt thùc Ngîc l¹i, th«ng tin thiÕu, th«ng tin chËm trÔ vµ kh«ng chuÈn x¸c sÏ kh«ng chØ lµm ¶nh h- ëng ®Õn c«ng cuéc ph¸t triÓn kinh tÕ x· héi tríc m¾t mµ ®«i khi cßn g©y t¸c h¹i cho c¶ mét thêi kú rÊt dµi V× vËy, nhu cÇu cÊp thiÕt ®Æt ra cho nh÷ng ngêi lµm c«ng t¸c vÒ c«ng nghÖ th«ng tin lµ ph¶i tæ chøc mét hÖ thèng th«ng tin ®iÒu hµnh s¾c bÐn, phôc vô kÞp thêi mäi yªu cÇu cña ngêi sö dông Do nhu cÇu thùc tÕ ®ßi hái, viÖc nghiªn cøu hÖ thèng th«ng tin kinh tÕ x· héi phôc vô ®iÒu hµnh ph¶i ®îc sím hoµn thµnh vµ ®a vµo thùc tiÔn ¸p dông Nã sÏ kh¾c phôc ®îc nhiÒu khã kh¨n trong viÖc qu¶n lý vµ xö lý th«ng tin Víi viÖc tin häc hãa trong mäi hÖ thèng, c¸c ng«n ng÷ lËp tr×nh ra ®êi ngµy cµng nhiÒu vµ hoµn thiÖn Ng«n ng÷ Pascal lµ 1 ng«n ng÷ thuËt gi¶i ,cã tÝnh cÊu tróc chÆt chÏ ,s¸ng sña HiÖn nay Pascal ®· trë thµnh mét trong c¸c ng«n ng÷ phæ biÕn nhÊt ,thÝch hîp víi nhiÒu øng dông khoa häc, kü thuËt, qu¶n ký vµ ®îc coi lµ ng«n ng÷ thÝch hîp nhÊt cho tÊt c¶ mäi ®èi tîng… X©y dùng mét ch¬ng tr×nh kiÓm tra ®¸nh m¸y m« pháng c¸c kü n¨ng ®¸nh m¸y cña mét ngêi b×nh thêng cho phÐp thùc hiÖn c¸c chøc n¨ng vÒ tèc ®é ®¸nh m¸y cña ngêi ®ã víi c¸c møc ®é khã kh¸c nhau vµ m¸y tÝnh sÏ ®a ra c¸c th«ng tin vÒ sè ký tù ®¸nh ®îc trong mét kho¶ng thêi gian nhÊt ®Þnh §©y lµ mét bµi tËp vÒ lËp tr×nh nh»m n©ng cao kü n¨ng vÒ lËp tr×nh Turbo Pascal vµ kü n¨ng ®å ho¹ §Ó hoµn thµnh bµi tËp nµy, t«i ®· tham kh¶o rÊt nhiÒu c¸c tµi liÖu, còng nh ®- îc sù híng dÉn tËn t×nh cña c¸c thÇy c« gi¸o trong khoa CNTH, ®Æc biÖt lµ thÇy ThS.Th¸i Thanh Tïng lµ ngêi chÞu tr¸ch nhiÖm híng dÉn chÝnh bµi tËp tùc hµnh tèt nghiÖp cho t«i.Tuy nhiªn trong qu¸ tr×nh lËp tr×nh còng nh thiÕt kÕ ®å ho¹ cßn cã nh÷ng sai sãt nªn t«i rÊt mong ®îc sù gãp ý cña c¸c thÇy c« vµ c¸c b¹n Em xin ch©n thµnh c¶m ¬n ! 1 KiÓm tra §¸nh m¸y NguyÔn TrÇn TuÊn Anh Ch¬ng I : c¸c kh¸i niÖm c¬ b¶n ®îc sö dông trong ch¬ng tr×nh Trong ch¬ng tr×nh nµy chØ dïng c¸c hµm vµ thñ tôc vÒ ®å ho¹ nªn t«i chØ tr×nh bµy mét sè kh¸i niÖm liªn quan I Mµn h×nh ®å ho¹ Mµn h×nh v¨n b¶n (Text) ®îc thiÕt lËp ®Ó hiÓn thÞ 25 dßng vµ mçi dßng cã thÓ chøa ®îc 80 ký tù Mµn h×nh ®å ho¹ ®îc cÊu thµnh tõ mét ma trËn c¸c chÊm ¶nh nhá (Pixel) Sù bè trÝ c¸c Pixel trªn mµn h×nh nh thÕ nµo vµ bao nhiªu ®îc gäi lµ ®é ph©n gi¶i cña mµn h×nh (Resolution) Do mçi kiÓu mµn h×nh cã c¸ch xö lý riªng nªn ta thiÕt lËp tËp tin ®iÒu khiÓn ®å ho¹ ( *.bgi ë trong th môc \BGI) vµ kiÓu ch÷ (Font) ( *.chr ë trong th môc \BGI ) §èi víi mµn h×nh VGA (hiÖn nay phæ biÕn ) th× hÖ to¹ ®é lµ 640 x 480 Cã nghÜa lµ chiÒu ngang cã 640 Pixel, chiÒu däc cã 480 Pixel II C¸c hµm ®å ho¹ Trong ch¬ng tr×nh sö dông rÊt nhiÒu hµm , c¸c hµm nµy ®îc ®Þnh nghÜa trong “graphics.h” ë trong th môc \INCLUDE : Setcolor( ) Setbkcolor( ) Setfillstyle( ) Settextstyle( ) Setviewport( ) getcolor() getbkcolor() 2 KiÓm tra §¸nh m¸y NguyÔn TrÇn TuÊn Anh line( ) rectangle( ) bar( ) bar3d( ) circle( ) elippse( ) 3 KiÓm tra §¸nh m¸y NguyÔn TrÇn TuÊn Anh ch¬ng II : ThiÕt kÕ ch¬ng tr×nh phÇn I : C¸c modul chÝnh trong ch¬ng tr×nh Các module chính trong chương trình bao gồm: + Function tg_phut:Word; + Ve_Banphim : thủ tục vẽ bàn phím + VephimNhan(phim:char;kieuve:integer): thủ tục vè phím được nhấn + SinhMa(level:integer):Char: thủ tục sinh một mã phím tuỳ theo mức độ nhất chọn trong chương trình + GoPhim : thủ tục thực hiện thao tác gõ một phím và các tính toán bên trong + Ketqua : thủ tục hiện kết quả của ths sinh đăng nhập kiêm tra gõ bàn phím Các kết quả tính toán như sau: Số ký tự /phút=Số ký tự đánh được trong một phút Độ chính xác của việc gõ phím: Độ chính xác= Số ký tự chính xác/Số ký tự sinh ra*100 4 KiÓm tra §¸nh m¸y NguyÔn TrÇn TuÊn Anh PhÇn II : hai thñ tôc quan träng trong ch¬ng tr×nh I-Thñ tôc Vephimnhan(phim :char,kieuve:integer) Thñ tôc nµy dïng ®Ó thùc hiÖn vÏ mét phÝm trªn bµn phÝm khi phÝm nµy ®îc nhÊn.Nªó c¸c phÝm ký tù ®Æc biÖt trªn bµn phÝm ®îc nhÊn VÝ dô: < , > ,? , +, \ , ( , ) th× ngoµi phÝm ký tù ,phÝm Shift còng ®îc nhÊn theo Thñ tôc nµy ®îc thùc hiÖn nh sau : Khi ngêi sö dông nhÊn mét phÝm trªn bµn phÝm sÏ sinh ra mét ký tù cña phÝm võa nhÊn Thñ tôc Vephimnhan sÏ quÐt qua toµn bé c¸c ký tù trªn bµn phÝm vµ kiÓm tra xem ®ã cã ph¶i lµ c¸c phÝm võa ®îc nhÊn kh«ng Nõu kh«ng ph¶i lµ phÝm ®îc nhÊn th× sÏ kh«ng vÏ l¹i phÝm ®ã.Nõu phÝm ®îc kiÓm tra lµ phÝm nhÊn th× ta sÏ vÏ l¹i phÝm ®ã theo kiÓu vÏ mµ ta ®a vµo KiÓu vÏ phÝm ë ®©y ®îc sö dông gåm cã 2 chÕ ®é: - ChÕ ®é phÝm ®ang ®îc nhÊn :phÝm ®ã sÏ bÞ lón xuèng víi mµu kh¸c tÊt c¶ c¸c phÝm kh¸c trªn bµn phÝm - ChÕ ®é phÝm kh«ng ®îc nhÊn :phÝm ®ã sÏ ®îc vÏ næi vµ cïng mµu víi c¸c phÝm cßn l¹i trªn bµn phÝm *Ta cã thÓ ®a ra ®o¹n m· Code cña ch¬ng tr×nh nh sau : Procedure VephimNhan(phim:char;kieuve:integer); Var i,j,k,x,y:integer; xhien,yhien:integer; Begin xhp2:=xhp1+3*dr div 2+kc; yhp2:=yhp1+ds+kc; xhp3:=xhp1+2*dr+kc; yhp3:=yhp2+ds+kc; xhp4:=xhp1+2*dr+2*kc; yhp4:=yhp3+ds+kc; xhp5:=xhp1+10*(dr+kc); yhp5:=yhp1+4*(ds+kc); xhien:=0;yhien:=0; {Hang 1} for k:=1 to 15 do if (chr(hp1[k])=phim) then 5 KiÓm tra §¸nh m¸y NguyÔn TrÇn TuÊn Anh begin then xhien:=xhp1+(k-1)*(dr+kc); yhien:=yhp1; end; {Hang 2} for k:=1 to 13 do if(chr(hp2[k])=phim) then begin xhien:=xhp2+(k-1)*(dr+kc); yhien:=yhp2; end; {Hang 3} for k:=1 to 12 do if(chr(hp3[k])=phim) then begin xhien:=xhp3+(k-1)*(dr+kc); yhien:=yhp3; end; {Hang 4} for k:=1 to 13 do if(chr(hp4[k])=phim) then begin xhien:=xhp4+(k-1)*(dr+kc); yhien:=yhp4; end; {Hang 5} for k:=1 to 5 do if(chr(hp5[k])=phim) then begin xhien:=xhp5+(k-1)*(dr+kc); yhien:=yhp5; end; if ((phim=#60) or (phim=#62) or (phim=#63) or (phim=#34) or (phim=#58)) if kieuve=1 then ve_shift(kieuve+1) else ve_shift(1); if(phim=#32) then if kieuve=1 then ve_space(kieuve+1) else ve_space(1) else if ((ord(phim) in [27,49,50,51,52,53,54,55,56,57,48,45,43,61,8]) or (ord(phim) in [81,87,69,82,84,89,85,73,79,80,91,93]) or (ord(phim) in [65,83,68,70,71,72,74,75,76,59,58]) 6 KiÓm tra §¸nh m¸y NguyÔn TrÇn TuÊn Anh or (ord(phim) in [90,88,67,86,66,78,77,44,46,39,92,42,47]) or (ord(phim) in [63,60,62,40,41])) then ve_o(kieuve,xhien,yhien,ds,dr,1); End; II – Thñ tôc GoPhim : §©y lµ thñ tôc chÝnh trong ch¬ng tr×nh gâ bµn phÝm Thñ tôc nµy sÏ thùc hiÖn chøc n¨ng gâ phÝm ,tÝnh to¸n sè ký tù mµ ch¬ng tr×nh sinh ra,sè ký tù mµ ngêi sö dông gâ chÝnh x¸c ®Ó tõ ®ã ®a ra ®îc tèc ®é gâ phÝm còng nh ®é chÝnh x¸c trong qu¸ tr×nh gâ phÝm cña ngêi sö dông Thñ tôc GoPhim ®îc thùc hiÖn nh sau : LÊy m· phÝm ®îc sinh ra th«ng qua thñ tôc sinh m· phÝm “SinhMa(Muc)” KiÓm tra xem ®ã cã ph¶i lµ phÝm ESC kh«ng ,nÕu ®óng lµ phÝm ESC th× sÏ dõng viÖc gâ phÝm Ngîc l¹i thñ tôc sÏ chê ngêi sö dông gâ mét phÝm trong mét kho¶ng thêi gian NÕu qu¸ thêi gian ®ã th× thñ tôc sÏ bá qua vµ sinh mét m· kh¸c NÕu ngêi sö dông gâ phÝm th× thñ tôc sÏ gäi l¹i thñ tôc Vephimnhan ®Ó vÏ l¹i phÝm võa ®îc nhÊn vµ kiÓm tra xem phÝm nhÊn ®· chÝnh x¸c víi phÝm võa ®îc sinh ra cha Qu¸ tr×nh nµy sÏ tiÕp tôc cho ®Õn khi ngêi sö dông nhÊn ESC ®Ó kÕt thóc qu¸ tr×nh gâ phÝm *Ta cã thÓ ®a ra ®o¹n m· Code cña ch¬ng tr×nh nh sau: Procedure GoPhim ; Var ch:char; MaDuocSinh:char; bd,kt:Word; Begin Sokytu:=0;SoKyTuSinh:=0; xchu:=30;ychu:=110; bd:=tg_phut; While true do Begin MaDuocSinh:=SinhMa(Muc); VietChu(xchu,ychu,MaDuocSinh); xchu:=xchu+textwidth('H')+1; if xchu>=getmaxx-20 then begin xchu:=30; ychu:=ychu+textheight('H')+10; end; if ychu>=180 then begin xchu:=30; ychu:=110; bar(10,80,80+getmaxx-90,170); Ve_O(1,10,80,100,getmaxx-20,1); end; Delay(1000);{Doi go phim va sinh ma} VephimNhan(Upcase(ch),1); if keypressed then 7 KiÓm tra §¸nh m¸y NguyÔn TrÇn TuÊn Anh begin ch:=readkey; if ch=#27 then break; if ch=#0 then ch:=readkey; SoKyTuSinh:=SoKyTuSinh+1; VephimNhan(Upcase(ch),2); if upcase(ch)=upcase(MaDuocSinh) then Sokytu:=Sokytu+1 else begin Sokytu:=Sokytu-1; sound(1000);delay(100);nosound; end; end; End; kt:=tg_phut; if (kt-bd)0 then TS.tocdo:=Sokytu/(kt-bd) else TS.tocdo:=0; if SokytuSinh=0 then TS.chinhxac:=0 else TS.chinhxac:=Sokytu/(SokytuSinh*100); End; 8 KiÓm tra §¸nh m¸y NguyÔn TrÇn TuÊn Anh Ch¬ng III : PhÇn thÓ hiÖn ch¬ng tr×nh PROGRAM GOBANPHIM; Uses Crt,Dos,Graph; Const yhp1 :integer=230; Const xhp1 :integer=30; Const ds :integer=32; {do sau cua phim} Const dr :integer=34; {do rong cua phim} Const kc :integer=5; {khoang cach giu cac phim} Const xmenu:integer=60; {toa do x cua menu} Const ymenu:integer=10; {toa do y cua menu} Const drm :integer=120; {do rong cua 1 o menu} Const dsm :integer=40; {do sau cua 1 o menu} Const h1:array[1 15]of string=('ESC','1','2','3','4','5','6','7','8','9','0','-','+','=','