Tài liệu Đề tài Kỹ năng về lập trình Turbo Pascal và kỹ năng đồ hoạ: 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ề ...
25 trang |
Chia sẻ: hunglv | Lượt xem: 1067 | Lượt tải: 1
Bạn đang xem trước 20 trang mẫu tài liệu Đề tài Kỹ năng về lập trình Turbo Pascal và kỹ năng đồ hoạ, để tải tài liệu gốc về máy 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 chưa .
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 Pascal, cùng với sự tận tình hướng dẫn của thầy ThS.Thái Thanh Tùng cũng như các thầy cô giáo trong Khoa Công nghệ Tin học-Viện Đại học Mở Hà nội, tôi đã hoàn thành được bài tập thực hành tốt nghiệp của mình. Trong quá trình làm bài tập, tôi cũng đã tìm hiều thêm đựoc nhiều vấn đề liên quan đến ngôn ngữ Pascal và càng thấy được những tiện ích của ngôn ngữ bậc cao này trong việc viết các chương trình . Tuy nhiên, trong một khoảng thời gian có hạn và trình độ còn nhiều hạn chế, bài tập thựcc hành tốt nghiệp này cũng không tránh khỏi những sai sót mắc phải nhưng nó cũng đã thể hiện được phần nào những cố gắng và tìm tòi của tôi .
Tôi mong và hy vọng rằng, sau khi xem xong phần bài tập của tôi, các thầy cô giáo sẽ có những ý kiến đóng góp để bài tập được hoàn thiện hơn.
Xin chân thành cảm ơn các thầy cô !
Tài liệu tham khảo:
1 - Ngôn ngữ lập trình Pascal
2- Cơ sở lý thuyết đồ hoạ
3- Lập trình hướng đối tượng với Turbo Pascal
4- Object oriented Programming wich Turbo Pascal
5- Turbo vision Guide
6- Object oriented Power for Think Pascal programmer
7- Đồ hoạ vi tính
Mục lục
Các file đính kèm theo tài liệu này:
- K4705.DOC