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ạ.
25 trang |
Chia sẻ: luyenbuizn | Lượt xem: 1398 | Lượt tải: 0
Bạn đang xem trước 20 trang nội dung tài liệu 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, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
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 !
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()
...
line(...)
rectangle(...)
bar(...)
bar3d(...)
circle(...)
elippse(...)
...
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
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
begin
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)) then
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])
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
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;
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','-','+','=','<-');
Const hp1:array[1..15] of integer=(27,49,50,51,52,53,54,55,56,57,48,45,43,61,8);
Const h2:array[1..12] of string=('Q','W','E','R','T','Y','U','I','O','P','[',']');
Const hp2:array[1..12] of integer=(81,87,69,82,84,89,85,73,79,80,91,93);
Const h3:array[1..11]of string=('A','S','D','F','G','H','J','K','L',';',':');
Const hp3:array[1..11]of integer=(65,83,68,70,71,72,74,75,76,59,58);
Const h4:array[1..13] of string=('Z','X','C','V','B','N','M',',','.','`','\','*','/');
Const hp4:array[1..13] of integer=(90,88,67,86,66,78,77,44,46,39,92,42,47);
Const h5:array[1..5]of string=('?','','(',')');
Const hp5:array[1..5]of integer=(63,60,62,40,41);
Const mnu:array[1..4]of string=('CHU CAI','CHU CAI & SO','TOAN BO','THOAT');
Type Thisinh=Record
HoTen :string[25];
Tocdo :real;
Chinhxac:real;
End;
Var mh,mode:integer;
tg_doi :integer; {thoi gian doi go mot phim}
chu :array[1..154] of string; {xau in ra de go phim}
machu :array[1..100] of integer;
xchu,ychu:integer; {xchu=30,ychu=160;//vi tri in ra hang chu ngau nhien}
xhp4,yhp4,xhp2,yhp2,xhp3,yhp3,xhp5,yhp5:integer;
Muc :integer;{Muc go phim}
SoKytu :integer;{So ky tu go duoc}
SoKyTuSinh :integer;{So ky tu sinh cua chuong trinh}
TenFile :String;
TS :ThiSinh;
F :text;
{-------------------------------------------------------------}
Function tg_phut:Word;
Var Hour, Minute,Second,Sec100,Timer: Word;
Begin
GetTime(Hour,Minute,Second,Sec100);
Timer:=Hour*60+Minute;
tg_phut:=Timer;
End;
{-------------------------------------------------------------}
Procedure GioiThieu(mau:integer);
Begin
setcolor(15);
settextstyle(1,0,1);
settextjustify(1,1);
outtextxy(getmaxx div 2,25,'VIEN DAI HOC MO HA NOI');
outtextxy(getmaxx div 2,45,'KHOA CNTH');
setcolor(mau);
settextstyle(1,0,4);
outtextxy(getmaxx div 2,150,'BAI TAP TOT NGHIEP');
settextstyle(1,0,1);
outtextxy(getmaxx div 2 -165,190,'NOI DUNG:');
line(getmaxx div 2-210,202,getmaxx div 2-120,202);
settextstyle(1,0,1);
outtextxy(getmaxx div 2,210,'lap chuong trinh tap go ban phim don gian');
outtextxy(getmaxx div 2,280,'Ngon ngu lap trinh: Turbo Pascal');
outtextxy(getmaxx div 2,getmaxy-120,'Giao vien huong dan: thay ThS.Thai Thanh Tung');
outtextxy(getmaxx div 2,getmaxy-100,'Sinh vien: Nguyen Tran Tuan Anh ');
outtextxy(getmaxx div 2-30,getmaxy-80,'Lop: 00B3');
if(mau=7) then setcolor(mau)
else setcolor(4);
outtextxy(getmaxx div 2,getmaxy-10,'Nhan phim Enter de tiep tuc.....');
{tra ve kieu chu default}
settextstyle(0,0,0);
settextjustify(0,0);
End;
{-------------------------------------------------------------}
Procedure Ve_O(i,x1,y1,ds1,dr1,dam:integer);
Begin
If(dam=0) then setlinestyle(0,1,1)
Else setlinestyle(0,1,3);
If (i=1) then
Begin {to mau cho phim}
setlinestyle(0,1,3);
setcolor(1);
rectangle(x1,y1,x1+dr1,y1+ds1);
setfillstyle(1,7);
floodfill(x1+10,y1+8,1);
setcolor(15);
line(x1,y1,x1+dr1,y1);
line(x1,y1,x1,y1+ds1);
setcolor(8);
line(x1,y1+ds1,x1+dr1,y1+ds1);
line(x1+dr1,y1,x1+dr1,y1+ds1);
End
Else
Begin
setcolor(8);
line(x1,y1,x1+dr1,y1);
line(x1,y1,x1,y1+ds1);
setcolor(15);
line(x1,y1+ds1,x1+dr1,y1+ds1);
line(x1+dr1,y1,x1+dr1,y1+ds1);
setcolor(1);
{to mau cho cac phim khi phim duoc chon}
setlinestyle(0,1,1);
rectangle(x1,y1,x1+dr1,y1+ds1);
setfillstyle(1,14);
floodfill(x1+10,y1+8,1);
End;
setcolor(1);
setlinestyle(0,1,1);
End;
{-------------------------------------------------------------}
Procedure ve_tab(chon:integer);
Var x,y,ds1,dr1:integer;
Begin
x:=xhp1;
y:=yhp1+ds+kc;
ds1:=ds;
dr1:=3*dr div 2;
if(chon=1) then
ve_o(2,x,y,ds1,dr1,3)
else
ve_o(1,x,y,ds1,dr1,1);
settextstyle(0,0,1);
settextjustify(1,1);
{setcolor(15);}
outtextxy(x+dr1 div 2,y+ds1 div 2,'Tab');
End;
{-------------------------------------------------------------}
{*****thu tuc ve phim capslock******}
Procedure Ve_capslock(chon:integer);
Var x,y,ds1,dr1:integer;
Begin
x:=xhp1;
y:=yhp1+2*(ds+kc);
ds1:=ds;
dr1:=2*dr;
if(chon=1) then
ve_o(2,x,y,ds1,dr1,3)
else
ve_o(1,x,y,ds1,dr1,1);
settextstyle(0,0,1);
settextjustify(1,1);
outtextxy(x+dr1 div 2,y+ds1 div 2,'Capslock');
End;
{-------------------------------------------------------------}
{*****thu tuc ve phim shift******}
Procedure ve_shift(chon:integer);
Var x,y,ds1,dr1:integer;
Begin
x:=xhp1;
y:=yhp1+3*(ds+kc);
ds1:=ds;
dr1:=2*dr+kc;
if(chon=1) then
ve_o(2,x,y,ds1,dr1,3)
else
ve_o(1,x,y,ds1,dr1,1);
settextstyle(0,0,1);
settextjustify(1,1);
outtextxy(x+dr1 div 2,y+ds1 div 2,'Shift');
End;
{-------------------------------------------------------------}
{***thu tuc ve phim Ctrl *****}
Procedure ve_ctrl(chon:integer);
Var x,y,ds1,dr1:integer;
Begin
x:=xhp1;
y:=yhp1+4*(ds+kc);
ds1:=ds;
dr1:=2*dr+kc;
if(chon=1) then
ve_o(2,x,y,ds1,dr1,1)
else
ve_o(1,x,y,ds1,dr1,1);
settextstyle(0,0,1);
settextjustify(1,1);
outtextxy(x+dr1 div 2,y+ds1 div 2,'Ctrl');
End;
{-------------------------------------------------------------}
{****thu tuc ve phim Alt***}
Procedure ve_alt(chon:integer);
Var x,y,ds1,dr1:integer;
Begin
x:=xhp1+2*(dr+kc);
y:=yhp1+4*(ds+kc);
ds1:=ds;
dr1:=2*dr+kc;
if(chon=1) then
ve_o(2,x,y,ds1,dr1,1)
else
ve_o(1,x,y,ds1,dr1,1);
settextstyle(0,0,1);
settextjustify(1,1);
outtextxy(x+dr1 div 2,y+ds1 div 2,'Alt');
End;
{-------------------------------------------------------------}
Procedure ve_space(chon:integer);
Var x,y,ds1,dr1:integer;
Begin
x:=xhp1+4*(dr+kc);
y:=yhp1+4*(ds+kc);
ds1:=ds;
dr1:=5*(dr+kc)+dr;
if(chon=1) then
ve_o(2,x,y,ds1,dr1,3)
else
begin
setcolor(1);
setlinestyle(0,1,1);
rectangle(x,y,x+dr1,y+ds1);
setfillstyle(1,7);
floodfill(x+10,y+8,1);
ve_o(1,x,y,ds1,dr1,1);
end;
settextstyle(0,0,1);
settextjustify(1,1);
outtextxy(x+dr1 div 2,y+ds1 div 2,'');
End;
{-------------------------------------------------------------}
{thu tuc ve phim Enter}
Procedure ve_enter(chon:integer);
Var x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6:integer;
Begin
x1:=xhp1+13*(dr+kc)+dr div 2;
y1:=yhp1+ds+kc;
x2:=xhp1+15*dr+14*kc;
y2:=y1;
x3:=x2;
y3:=y2+2*ds+kc;
x4:=x3-2*dr-2*kc;
y4:=y3;
x5:=x4;
y5:=y4-ds;
x6:=x1;
y6:=y5;
setlinestyle(0,0,3);
if(chon=1) then
begin
setcolor(1);
setlinestyle(0,1,1);
line(x1,y1,x2,y2);
line(x1,y1,x6,y6);
line(x5,y5,x6,y6);
setcolor(1);
line(x5,y5,x4,y4);
line(x4,y4,x3,y3);
line(x3,y3,x2,y2);
setfillstyle(1,14);
floodfill(x1+10,y1+8,1);
end
else
begin
setcolor(1);
line(x1,y1,x2,y2);
line(x1,y1,x6,y6);
line(x5,y5,x6,y6);
line(x5,y5,x4,y4);
line(x4,y4,x3,y3);
line(x3,y3,x2,y2);
setfillstyle(1,7);
floodfill(x1+10,y1+8,1);
setlinestyle(0,1,3);
setcolor(15);
line(x1,y1,x2,y2);
line(x1,y1,x6,y6);
line(x5,y5,x6,y6);
setcolor(8);
line(x5,y5,x4,y4);
line(x4,y4,x3,y3);
line(x3,y3,x2,y2);
end;
setcolor(1);
settextstyle(0,0,1);
settextjustify(1,1);
outtextxy(x6+dr div 2,y6+ds div 2,'Enter');
End;
{-----------------------------Ve ban phim--------------------------------}
Procedure Ve_Banphim;
var x,y,i: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);
{Ve khung hien thi chu}
Bar(10,80,80+getmaxx-90,170);
Ve_O(1,10,80,100,getmaxx-20,1);
{ve khung ban phim}
setlinestyle(0,1,3);
setcolor(7);
rectangle(xhp1-20,yhp1-30,getmaxx-12,yhp5+ds+30);
rectangle(xhp1-3,yhp1-3,getmaxx-(xhp1)+3,yhp5+ds+3);
setfillstyle(1,15);
floodfill(15,yhp1-4,7);
{****ve hang phim thu nhat*****}
x:=xhp1;
y:=yhp1;
for i:=1 to 15 do
begin
settextstyle(0,0,1);
settextjustify(1,1);
ve_o(1,x,y,ds,dr,1);
outtextxy(x+17,y+16,h1[i]);
x:=x+dr+kc;
end;
{****ve hang phim thu hai****}
x:=xhp2;
y:=yhp2;
for i:=1 to 13 do
begin
settextstyle(0,0,1);
settextjustify(1,1);
ve_o(1,x,y,ds,dr,1);
outtextxy(x+17,y+16,h2[i]);
x:=x+dr+kc;
end;
{*****ve hang phim thu 3 *****}
x:=xhp3;
y:=yhp3;
for i:=1 to 13 do
begin
settextstyle(0,0,1);
settextjustify(1,1);
ve_o(1,x,y,ds,dr,1);
outtextxy(x+17,y+16,h3[i]);
x:=x+dr+kc;
end;
{*****ve hang phim thu 4 *****}
x:=xhp4;
y:=yhp4;
for i:=1 to 13 do
begin
settextstyle(0,0,1);
settextjustify(1,1);
ve_o(1,x,y,ds,dr,1);
outtextxy(x+17,y+16,h4[i]);
x:=x+dr+kc;
end;
{*****ve hang phim thu 5****}
x:=xhp5;
y:=yhp5;
for i:=1 to 5 do
begin
settextstyle(0,0,1);
settextjustify(1,1);
ve_o(1,x,y,ds,dr,1);
outtextxy(x+17,y+16,h5[i]);
x:=x+dr+kc;
end;
ve_tab(2);
ve_capslock(2);
ve_shift(2);
ve_ctrl(2);
ve_enter(2);
ve_alt(2);
ve_space(2);
end;
{-------------------------------------------------------------}
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
begin
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)) then
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])
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;
{-------------------------------------------------------------}
Procedure ve_o_menu(x,y,chon:integer);
Begin
setlinestyle(0,1,3);
setcolor(1);
rectangle(x,y,x+drm,y+dsm);
if(chon=1) then
setfillstyle(1,10)
else
setfillstyle(1,15);
floodfill(x+10,y+10,1);
End;
{----------------------Thu tuc sinh phim go-------------------}
Function SinhMa(level:integer):Char;
Var i:integer;
Ch:Char;
Begin
Randomize;
While true do
Begin
if level=1 then
begin
ch:=chr(Random(101)+65);
if ((ch in ['a'..'z'])
or (ch in ['A'..'Z'])) then break;
end;
if level=2 then
begin
ch:=chr(Random(101)+43);
if ((ch in ['a'..'z'])
or (ch in ['A'..'Z'])
or (ch in ['0'..'9'])) then break;
end;
if level=3 then
begin
ch:=chr(Random(97)+41);
if ((ord(ch) in [27,49,50,51,52,53,54,55,56,57,48,45,43,61,8])
or (ord(ch) in [81,87,69,82,84,89,85,73,79,80,91,93])
or (ord(ch) in [65,83,68,70,71,72,74,75,76,59,58])
or (ord(ch) in [90,88,67,86,66,78,77,44,46,39,92,42,47])
or (ord(ch) in [63,60,62,40,41]))
then break;
end;
End;
SinhMa:=ch;
End;
{----------------Thu tuc viet chu len man hinh----------------}
Procedure VietChu(x,y:integer;chu:char);
Begin
Outtextxy(x,y,chu);
End;
{----------------------Thu tuc go phim------------------------}
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
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;
{--------------------Hien thi thong tin va ghi vao file------------------------}
Procedure Ketqua;
Var ch:char;
Begin
Textbackground(Blue);
Clrscr;
Writeln('Ket qua kiem tra');
Writeln('Thi sinh dang nhap: ',TS.Hoten);
Writeln('So ky tu/phut: ',TS.Tocdo:8:3);
Writeln('Do chinh xac: ',TS.Chinhxac:8:3);
Write('Ban co ghi ket qua khong(C/K)?');
Writeln;
ch:=Readkey;
if upcase(ch)='C' then
Begin
Repeat
Write('Hay nhap ten file ghi ket qua:');Readln(TenFile);
Until TenFile'';
Assign(f,TenFile);
{$I-}
Rewrite(f);
{$I+}
if IOResult 0 then
Writeln('Khong tao duoc file')
else
Begin
Write(f,'Thi sinh:');
Writeln(f,TS.Hoten);
Write(f,'Toc do go phim/phut:');
Writeln(f,TS.Tocdo);
Write(f,'Do chinh xac:');
Writeln(f,TS.Chinhxac);
Close(f);
End;
End;
End;
{-------------------------------------------------------------}
Procedure chon_muc;
Var i,x,y,k,kt:integer;
c,c1:char;
Begin
x:=xmenu;
y:=ymenu;
for i:=1 to 4 do
begin
outtextxy(x+drm div 2,y+dsm div 2,mnu[i]);
ve_o_menu(x,y,2);
x:=x+drm+kc;
end;
x:=xmenu;
y:=ymenu;
setcolor(15);
outtextxy(300,getmaxy-20,'Nhan ESC de thoat');
setcolor(1);
ve_o_menu(x,y,1);
k:=0;kt:=0; { k truoc luu vi tri k cu}
while true do
begin
if not (keypressed) then
c:=readkey;
if(c=#27) then break;
if(c=#13) then
begin
bar(10,80,80+getmaxx-90,170);
Ve_O(1,10,80,100,getmaxx-20,1);
if(k=0) then
begin
Muc:=1;
GoPhim;
end
else if(k=1) then
begin
Muc:=2;
GoPhim;
end
else if(k=2) then
begin
Muc:=3;
GoPhim;
end
else if (k=3) then
Break;
end;
if(c=#0) then
begin
c1:=readkey;
kt:=k;
if(c1=#77) then {mui ten phai}
if(k>=3) then
k:=0
else
k:=k+1
else if(c1=#75)then {mui ten trai}
if(k<=0) then
k:=3
else
k:=k-1;
end;
if(kkt) then
begin
ve_o_menu(x+kt*(drm+kc),y,2);
ve_o_menu(x+k*(drm+kc),y,1);
end;
kt:=k;
end;
end;
{------------- dang nhap ---------}
Procedure DangNhap;
Begin
textbackground(Blue);
Repeat
clrscr;
Writeln('Dang nhap chuong trinh');
Write('Thi sinh dang nhap: ');Readln(TS.Hoten);
Until TS.HoTen''
End;
{-----------------Do hoa-------------}
Procedure KhoiTaoDH;
Begin
{----Khoi dong do hoa----}
initgraph(mh,mode,'d:\tp\bgi');
Setbkcolor(1);
End;
{--------------- bat dau ct chinh ---------}
Begin
KhoiTaoDH;
GioiThieu(3);
Readln;
ClearDevice;
CloseGraph;
DangNhap;
KhoiTaoDH;
Ve_Banphim;
Chon_muc;
Closegraph;
Ketqua;
End.
KÕt luËn
Sau mét thêi gian tËp trung nghiªn cøu, tham kh¶o c¸c tµi liÖu vÒ ng«n ng÷ lËp tr×nh Turbo P
Các file đính kèm theo tài liệu này:
- K4705.DOC