đã nhập.
Chương trình
Program Thong_ke_hang;
uses crt;
Type hang=record
ten: string[20];
Ngay: string[10];
sl,gia,tien : real;
end;
Var bang:array[1..30] of hang; i,n: integer; tong: real;
begin
clrscr;
Write)'Nhap so luong mat hang n ? ');
readln(n);
tong:=0;
for i:=1 to n do
with bang[i] do
begin
Write(' Tên hang '); readln(ten);
Write(' Ngay nhap '); readln(ngay);
Write(' So luong '); readln(sl);
Write(' Gia '); readln(gia);
tien:=sl * gia;
tong:=tong+tien;
end;
Writeln(' Bang thong ke hang nhap');
Writeln('| Ten hang':20,'| Ngay nhap':12,'| So luong':12,'| Don gia':12,'| Tien':12 );
for i:= 1 to n do
with bang[i] do
Writeln(ten:20, ngay:12, sl:12:2, gia:12:2, tien:12:2);
writeln;
writeln('Tong so tien la: ', tong: 15:2);
readln;
end.
2 - Kiểu tệp (File)
2.1 - Khái niệm tệp
Tệp dữ liệu là tập hợp các dữ liệu có liên quan với nhau và được nhóm lại với nhau tạo thành một dãy, được lưu trữ trên bộ nhớ ngoài ví dụ như đĩa từ.
Các phần tử của tệp cùng kiểu, được lưu trữ kế tiếp nhau, khi làm việc với các phần tử của tệp có con trỏ tệp. Khi mới mở tệp con trỏ tệp trỏ vào phần tử đầu tiên của tệp. Cuối tệp có dấu kết thuc tệp kí hiệu là eof(tệp).
Các phần tử của tệp f như sau:
Mỗi ô là một phần tử của tệp. Cuối tệp là dấu kết thúc tệp eof(f) (end of file)
eof(f)
Con trỏ tệp (cửa sổ tệp) chỉ vào phần tử đầu Phần tử i Kết thúc tệp
Có thể có các loại tệp sau:
- Tệp định kiểu.
- Tệp văn bản ( Text)
- Tệp không định kiểu
Trong các phần sau chỉ xét tệp định kiểu và tệp văn bản.
Tệp và mảng có những điểm giống và khác nhau sau đây:
* Điểm giống nhau giữa tệp và mảng : tập hợp các phần tử cùng kiểu.
* Điểm khác nhau giữa tệp và mảng : Mảng khai báo với số phần tử xác định, còn tệp với số phần tử không xác định, tệp có thể chứa số phần tử tuỳ ý theo dung lượng trên đĩa.
2.2 - Các cách truy nhập tệp
* Truy nhập tuần tự và truy nhập ngẫu nhiên:
- Truy nhập tuần tự: Việc đọc một phần tử bất kỳ của tệp bắt buộc phải tuần tự đi qua các phần tử trước đấy. Còn muốn thêm một phân tử vào tệp phải thêm vào cuối tệp.
Kiểu truy nhập này đơn giản trong việc tạo tệp, xử lý tệp, song nó kém linh hoạt
- Truy nhập tệp trực tiếp( direct access ): Có thể truy nhập vào bất kỳ phần tử nào trong tệp thông qua chỉ số thứ tự của phần tử trong tệp. Tuỳ theo từng bộ nhớ ngoài mà có thể truy nhập trực tiếp được hay không, như đĩa từ có thể truy nhập trực tiếp được, còn băng từ chỉ có thể truy nhập tuần tự không truy nhập trực tiếp được. Như vậy trong truy nhập trực tiếp có thể đọc bất kỳ phần tử nào, thêm phần tử mới thì phải thêm vào cuối tệp.
2.3 - Khai báo tệp định kiểu
Khai báo tệp định kiểu dùng cụm từ sau:
File of kiểu_phần_tử;
Khai báo kiểu tệp:
Type tên_kiểu = File of kiểu_phần_tử; Khai báo biến têp:
Var tên_biến : File of kiểu_phần_tử;
Ví dụ 1 type t= file of integer;
var f1,f2 : t;
Ví dụ 2: type bang= record
ten: string[25];
Ns: string[10];
Que: string[30];
luong,bhxh:real;
end;
var f1,f2,f3: file of bang;
2.4 - Tạo tệp để ghi dữ liệu
* Mở tệp để ghi dữ liệu
Dùng 2 thủ tục đi liền nhau theo thứ tự như sau:
- Thủ tục Assign
Assign(biến_têp, tên_tệp);
Thủ tục này gán tên_tệp cho biến_tệp. Tên_tệp theo đúng qui tắc đặt tên trong DOS mà ta đã học ở phần trên.
- Thủ tục Rewrite
Rewrite(biến_tệp);
Thủ tục này thực hiện việc mở tệp để ghi.
Ví dụ: Mở tệp có tên là ‘songuyen.dat’ gán cho biến tệp f để ghi dữ liệu ta viết như sau:
Assign(f,’songuyen.dat’);
Rewrite(f);
Sau khi mở tệp xong thì tệp chưa có phần tử nào, tệp rỗng. Con trỏ tệp ( cửa sổ tệp ) trỏ vào cuối tệp (eof) . Nếu tên_tệp trùng với tệp đã có thì tệp đó sẽ bị xoá.
* Ghi dữ liệu vào tệp dùng thủ tục Write
Write(biến_tệp, biểu_thức1, biểu_thức2, . . ., biểu_thức n);
Các biểu_thức phải có giá trị cùng kiểu với kiểu của tệp. Giá trị của các biểu thức sẽ được ghi vào tệp theo như thứ tự đã viết.
Write(f, 2, 4, 6, i*j+3);
* Đóng tệp bằng thủ tục Close
Close(biến _tệp);
* Các ví dụ chương trình tạo tệp để ghi dữ liệu
Bài toán 1: Tạo tệp có tên là ‘songuyen.dat’ ghi các số nguyên dương <200 mà chia hết
cho 3.
Chương trình
Program Tao_tep_so_nguyen;
uses crt;
var i : integer; f : file of integer ;
Begin
assign(f, ‘songuyen.dat’);
rewrite(f);
for i:=3 to 199 do
if (i mod 3) = 0 then write(f, i);
close(f);
readln;
end.
Bài toán 2: Tạo tệp ‘sach.dat’ để ghi các thông tin cho các cuốn sách bao gồm các dữ liệu như tên sách, năm xuất bản, số trang, tác giả.
Chương trình
Program Tao_tep_sach;
uses crt;
Type tin = record
ten: string[25];
nam: integer;
trang: longint;
tacgia: string[25];
end;
Var i,n : integer; f: file of tin; nhap: tin;
Begin
clrscr;
assign(f, ‘sach.dat’);
rewrite(f);
write(‘ Nhap so sach n : ‘); readln(n);
for i:= 1 to n do
begin
with nhap do
begin
write(‘Ten sach : ‘); readln(ten);
write(‘Nam xuat ban : ‘); readln(nam);
write(‘So trang : ‘); readln(trang);
write(‘Ten tac gia : ‘); readln(tacgia);
end;
write(f, nhap);
end;
close(f);
end.
2.5 - Đọc dữ liệu từ tệp đã có
* Mở tệp để đọc
Mở tệp để đọc dùng 2 thủ tục đi liền nhau theo thứ tự sau:
- Thủ tục Assign
assign(biến_tệp, tên_tệp);
- Thủ tục Reset
Reset(biến_tệp) ;
Thủ tục này thực hiện mở tệp để đọc.
Ví dụ1: Mở tệp ‘songuyen.dat’ gắn với biến tệp f để đọc dữ liệu.
assign(f, ‘songuyen.dat’);
reset(f);
Ví dụ 2: Mở tệp ‘sach.dat’ gắn với biến tệp f1 để đọc dữ liệu.
assign(f1, ‘sach.dat’);
reset(f1);
* Đọc dữ liệu từ tệp
Đọc dữ liệu từ tệp được thực hiện bằng thủ tục Read như sau: Read(biên_tệp, biến1, biến2, . . . , biến n);
Thủ tục này thực hiện đọc giá trị ở vị trí con trỏ gán cho các biến tương ứng như thứ tự đã viết, khi đọc xong con trỏ tệp lại chuyển sang phần tử tiếp theo đọc và gán cho biến khác, cứ thế đọc cho đến biến n .
Việc đọc chỉ được thực hiện khi tệp vẫn còn phần tử, tức là con trỏ chưa tới eof ( cuối tệp).
do vậy trước khi đọc phải kiểm tra xem đã kết thúc tệp chưa, dùng hàm chuẩn eof như sau:
eof(biến_têp); hàm này cho giá trị True nếu con trỏ ở cuối tệp, ngược lại hàm cho giá trị
False.
Có thể dùng 2 cấu trúc sau:
- Kiểm tra nếu tệp chưa kết thúc thì đọc
if not eof(biến_têp) then read(biến_têp, biến);
- Đọc tất cả các phần tử của tệp
While not eof(biến_têp) do
Begin
read(biến_tệp, biến);
end;
Nếu con trỏ ở cuối tệp mà vẫn đọc thì máy sẽ báo lỗi, sau đó chương trình dừng lại. Do vậy phải kiểm tra trước khi đọc.
Ví dụ while not eof(f) do
begin
read(f,x);
writeln(x);
end;
* Đóng tệp
Close(biến_tệp);
* Các ví dụ chương trình đọc dữ liệu từ tệp
Bài toán 1: Đọc dữ liệu từ tệp ‘songuyen.dat’ đã tạo ở trên và hiện kết quả trên màn hình. Chương trình
program Doc_tep_songuyen;
uses crt;
var i: integer; f: file of integer;
begin
clrscr;
assign(f, ‘songuyen.dat’);
reset(f);
while not eof(f) do
begin
read(f, i);
writeln(i);
end;
close(f);
readln;
end.
Bài toán 2: Viết chương trình thực hiện tạo tệp ‘diem.dat’ ghí lại điểm thi của thí sinh, dữ liệu bao gồm: họ và tên thí sinh, điểm toán, điểm lý, điểm hoá. Đồng thời thực hiện đọc tệp và in ra thí sinh trúng tuyển, điểm chuẩn đỗ được nhập vào từ bàn phím.
Chương trình
program Tao_doc_tep_diemts;
uses crt;
type hs = record
ten: string[25];
toan,ly,hoa : real;
end;
var i,n: integer; f: file of hs; nhap: hs; diemc: real;
{*** **}
procedure tao; { thu tuc tao }
begin
clrscr;
assign(f, ‘diem.dat’);
rewrite(f);
write(‘ So thi sinh: ‘); readln(n);
for i:=1 to n do
begin
with hs do
begin
write(‘ Ho va ten: ‘); readln(ten);
write(‘ Diem toan: ‘); readln(toan);
write(‘ Diem ly : ‘); readln(ly);
write(‘ Diem hoa : ‘); readln(hoa);
end;
write(f, hs);
end;
close(f);
end; { ket thuc thu tuc tao}
{ *** ***}
Procedure doc; { thu tuc doc }
begin
clrscr;
Assign(f, 'Diem.dat' );
reset(f);
write(‘ Diem chuan : ‘); readln(diemc);
writeln(‘ Danh sach thi sinh trung tuyen dai hoc ‘); while not eof(f) do
begin
read(f,hs);
with hs do
if toan+ly+hoa >= diemc then writeln(ten:25,toan:10:1,ly:10:1,hoa:10:1);
end;
close(f);
end; { ket thuc thu tuc doc}
{*** ***}
{ than chuong trinh chinh}
repeat
clrscr;
writeln(‘ 1- Tao tep’);
writeln(‘ 2- Doc tep’);
writeln(‘ 3- Ket thuc’);
write(‘ Hay chon mot viec ? ‘); readln(i);
case i of
1: tao;
2: doc;
end;
until i=3;
readln;
end.
2.6 - Truy nhập tệp trực tiếp
Các phần đã xét ở trên là truy nhập tuần tự tệp có định kiểu. Trong phần này ta xét cách truy nhập trực tiếp tệp có định kiểu.
Sử dụng tất cả các thủ tục và lệnh đã nêu ở trên, ngoài ra để truy nhập trực tiếp tệp còn sử dụng một số thủ tục và hàm sau.
* Thủ tuc Seek để dịch chuyển con trỏ tệp
Seek( biến_tệp, n);
n có kiểu longint. Thủ tục này thực hiện chuyển con trỏ tệp tới phần tử thứ n. Trong tệp phần tử đầu được đánh thứ tự là 0.
* Hàm Filepos
Filepos(biến_tệp)
Hàm này cho vị trí hiện thời của con trỏ tệp. Ví trí đầu là 0. * Hàm Filesize
Filesize(biến_tệp)
Hàm này cho số lượng phần tử của tệp. Hàm cho giá trị 0 khi tệp rỗng.
Để thêm 1 phần tử vào tệp phải thêm vào cuối tệp. Như vậy phải dịch con trỏ tới cuối tệp bằng thủ tục seek như sau:
seek(biến_tệp, Filesize(biến_tệp)-1 );
* Ví dụ chương trình truy nhập tệp trực tiếp
Bài toán 1: Tạo tệp ‘sochan.dat’ ghi các số nguyên dương chẵn <=20. Truy nhập để sửa một phần tử bất kỳ và thêm một phần tử vào tệp.
Chương trình
Program truy_nhap_truc_tiep_tep;
uses crt;
var i,j : integer; f: file of byte;
{ thu tuc tao tep }
procedure tao;
begin
clrscr;
assign(f, ‘sochan.dat’);
rewrite(f);
for i:=1 to 20 do
if (i mod 2) =0 then write(f, i);
close(f);
readln;
end; {ket thuc thu tuc tao }
{ thu tuc sua }
procedure sua;
begin
clrscr;
reset(f);
write(‘ sua phan tu thu ? ‘); readln(i);
seek(f, i-1);
read(f,j);
witeln(‘ gia trị cu: ‘, j);
write(‘ nhap gia tri moi : ‘);
readln(j);
seek(f, i-1);
write(f, j);
close(f);
end; { ket thuc thu tuc sua }
{ thu tuc them phan tu }
procedure them;
begin
clrscr;
reset(f);
write(‘ gia tri moi them: ‘);
readln(j);
seek(f, filesize(f)-1);
write(f,j);
close(f);
readln;
end; {ket thuc thu tuc sua }
{ thu tuc doc }
procedure doc;
uses crt;
clrscr;
reset (f);
while not eof(f) do
begin
read(f,i);
witeln(i);
end;
close(f);
end; { ket thuc thu tuc doc}
{*** ***}
{ than chuong trinh chinh}
repeat
clrscr;
writeln(‘ 1- Tao tep’);
writeln(‘ 2- Sua tep’);
writeln(‘ 3- Them phan tu’);
writeln(‘ 4- Doc tep’);
writeln(' 5- ket thuc ');
write(‘ Hay chon mot viec ? ‘); readln(i);
case i of
1: tao;
2: sua;
3: them;
4: doc;
end;
until i=5;
readln;
end.
2.7 - Tệp văn bản
* Khai báo tệp văn bản
Trong Pascal có một kiểu tệp đã được định nghĩa trước đó là tệp văn bản, được định nghĩa với từ chuẩn TEXT.
Khai báo kiểu tệp văn bản;
Var Ten_bien: TEXT;
Các phần tử của TEXT là các kiểu kí tự, được tổ chức thành các dòng với độ dài của các dòng khác nhau, nhờ có thêm các dấu hết dòng (End of Line). Đó là cặp kí tự điều khiển CR (Carriage Return, nhẩy về đầu dòng, mã ASCII là 13) và LR(Line Feed: xuống dòng, mã ASCII là10), chúng dùng để ngăn cách các dãy kí tự tương ứng với 2 dòng khác nhau.
Ví dụ: Đoạn văn bản sau:
HANOI
123
THUDO
Được chứa trong tệp văn bản thành một dãy như sau:
HANOI CR LF 123 CR LF THUDO CR LF EOF
Do tệp văn bản được tổ chức thành từng dòng nên việc ghi và đọc tệp văn bản có thẻ tục ghi và đọc theo dòng.
* Ghi vào tệp văn bản
Có thể ghi các giá trị kiểu Integer, real, boolean, string vào tệp văn bản bằng lệnh Write hoặc Writeln, các lệnh này cho phép chuyển các giá trị kiểu nói trên sang dạng kí tự.
Có 3 dạng sau:
Dạng 1:
Write(biến _tệp, biểu_thức_1, biểu_thức_2,..., biểu_thức_n);
Ghi các giá trị của biểu thức vào tệp không có dấu hết dòng
Dạng 2:
Writeln(biến _tệp, biểu_thức_1, biểu_thức_2,..., biểu_thức_n);
Ghi các giá trị của biểu thức vào tệp có dấu hết dòng.
Dạng 3:
Writeln(biến _tệp);
Ghi dấu hết dòng vào tệp.
* Đọc dữ liệu từ tệp vănbản
Chúng ta có thể đọc các kí tự, các số nguyên, số thực, boolean từ tệp văn bản thông qua các thủ tục sau:
Dạng 1:
read(biến _tệp, biến1, biến2, biến3,..., biếnn);
Đọc các giá trị từ tệp gán cho các biến tương ứng và không sang đầu dòng tiếp theo.
Dạng 2:
readln(biến _tệp, biến1, biến2, biến3,..., biếnn);
Đọc các giá trị từ tệp gán cho các biến tương ứng và đưa con trỏ sang đầu dòng tiếp
theo.
Dạng 3:
readln(biến _tệp);
Đưa con trỏ sang đầu dòng tiếp theo.
Hàm chuẩn EOLN(f) sẽ phát hiện ra dấu hết dòng của tệp f.
Hàm này cho giá trị là True nếu kết thúc dòng, ngược lại là False.
* Các chương trình xử lý tệp văn bản
Bài toán 1: Tạo tệp văn bản ghi lại n dòng văn bản nhập vào từ bàn phím. Đọc tệp đã tạo và hiện ra trên màn hình.
Program Tao_doc_tep_van_ban;
uses crt;
var i,n: integer; f: text; s: string;
{*** **}
procedure tao; { thu tuc tao }
begin
clrscr;
assign(f, ‘vanban.txt’);
rewrite(f);
write(‘ So dong van ban: ‘); readln(n);
for i:=1 to n do
begin
write(‘ Nhap dong ‘, i ); readln(s); writeln(f, s);
end;
close(f);
end; { ket thuc thu tuc tao}
{ *** ***}
Procedure doc; { thu tuc doc }
begin
clrscr;
Assign(f, 'vanban.txt' );
reset(f);
Writeln(‘ Tep van ban da tao’);
while not eof(f) do
begin
readln(f,s);
writeln(s);
end;
close(f);
end; { ket thuc thu tuc doc}
{*** ***}
{ than chuong trinh chinh}
repeat
clrscr;
writeln(‘ 1- Tao tep’);
writeln(‘ 2- Doc tep’);
writeln(‘ 3- Ket thuc’);
write(‘ Hay chon mot viec ? ‘); readln(i);
case i of
1: tao;
2: doc;
end;
until i=3;
readln;
end.
Bài toán 2: Đọc xâu văn bản từ tệp, kiểm tra xem xâu đó có đối xứng không, sau đó sắp xếp các chữ số trong xâu theo thứ tự tăng dần.
chương trình
PROGRAM DOC_XAU_SAP_TT_SO;
USES CRT;
TYPE MANG=ARRAY[1..200] OF CHAR;
VAR I,K,L,N:INTEGER;T:BOOLEAN;S:STRING;A:MANG;F:TEXT; PROCEDURE SAPTANG(VAR X:MANG;M:INTEGER);
VAR J,Z:INTEGER;P:CHAR;
BEGIN
FOR J:=1 TO M-1 DO
FOR Z:=1 TO M-J DO IF X[Z]>X[Z+1] THEN BEGIN P:=X[Z];
X[Z]:=X[Z+1];
X[Z+1]:=P;
END;
END;
BEGIN { thân chương trinh chính}
CLRSCR;
ASSIGN(F,'VB.TXT');
RESET(F);
READLN(F,S);
WRITELN(' XAU DOC DUOC');
WRITELN(S);
N:=LENGTH(S);
{tim xau doi xung}
K:=1;L:=N;T:=TRUE;
WHILE (K
IF S[K]=S[L] THEN BEGIN K:=K+1; L:=L-1; END
ELSE T:=FALSE;
IF T THEN WRITELN(' XAU DOI XUNG ') ELSE WRITELN(' XAU KHONG DOI XUNG ');
{ sap cac so trong xau tang dan }
K:=0;
FOR I:=2 TO N DO IF (ORD(S[I])>=48) AND (ORD(S[I])<=57) THEN
BEGIN
K:=K+1;
A[K]:=S[I];
END;
SAPTANG(A,K);
L:=0;
FOR I:=1 TO N DO IF (ORD(S[I])>=48) AND (ORD(S[I])<=57) THEN
BEGIN
L:=L+1;
S[I]:=A[L];
END;
WRITELN('XAU DA SAP THU TU CAC SO '); WRITELN(S);
READLN;
CLOSE(F);
END.
Bài tập chương VI
1. Viết chương trình gồm 2 CT con làm các công việc sau: Ghi 1 bài thơ có n dòng, nội dung
nhập vào từ bàn phím lên tệp văn bản có tên ‘BAITHO.TXT’ và đọc tệp văn bản đã tạo từ
đĩa và cho hiện nội dung lên màn hình. Dùng câu lệnh lựa chọn để chọn công việc: 1= Ghi,
2=Doc.
2. Viết chương trình tạo tệp dữ liệu ‘DIEM.DAT’ chứa bảng điểm của n người và in kết quả ra màn hình. Bảng điểm gồm các cột: Họ tên, Điểm Toán, Điểm Lý, Điểm Hoá , Tổng, Loại. Nhập vào: Họ tên, Điểm toán, Điểm lý, Điểm hoá.
Tính Tổng, Loại :
Tổng = Điểm toán + Điểm lý + Điểm hoá .
Loại = ‘ DO ’ nếu Tổng > 19
Loại = ‘ TRUOT' nếu Tổng <= 19
3. Viết chương trình tạo tệp dữ liệu ‘LUONG.DAT’ chứa bảng lương của n người và in kết quả ra màn hình.
Bảng lương gồm các cột: Họ tên, Ngày công, Lương ính,Thưởng, Tổng Nhập vào : Họ tên, Ngày công, Lương chính .
Tính Thưởng, Tổng :
Thưởng = Lương chính x 2 nếu Ngày công > 25
Thưởng = Lương chính nếu Ngày công <= 25
Tổng = Lương chính + Thưởng .
4. Viết chương trình tạo tệp dữ liệu ‘HANG.DAT’ chứa bảng Thống kê hàng nhập của n mặt hàng và in kết quả ra màn hình. Bảng Thống kê hàng nhập gồm các cột:
Tên , Số lượng, Đơn giá, Tiền, Loại.
Nhập vào: Tên , Số lượng, Đơn giá.
Tính Tiền, Loại : Tiền = Số lương x Đơn giá .
Loại = ‘Cao’ nếu Tiền > 500000.
Loại = ‘THAP’ nếu Tiền <= 500000.
5. Viết chương trình tạo tệp dữ liệu ‘SACH.DAT’ chứa bảng danh mục của n quyển sách và in kết quả ra màn hình. Bảng danh mục sách bao gồm các cột:
Tên, Năm, Tác giả, Giá, Loại.
Nhập vào : Tên, Năm, Tác giả, Giá.
Tính Loại theo công thức sau:
Loại = ‘Cao’ nếu Tiền > 50000
Loại = ‘TB’ nếu 20000<= Tiền <= 50000
Loại = ‘THAP’ nếu Tiền < 20000.
CHƯƠNG VII
ĐỒ HOẠ VÀ ÂM THANH
1- Đồ hoạ
1.1 - Khái niệm chung
Màn hình máy vi tính hiện nay có nhiều loại khác nhau, các máy AT-386, AT-486, AT-
586... thường dùng loại màn hình VGA (Video Graphic Adapter), TVGA (Top of VGA) hoặc
SVGA (Supper VGA), đây là loại màn hình có thể dùng ở một trong hai chế độ: chế độ TEXT
- hiển thị văn bản và chế độ GRAPHIC - hiển thị đồ hoạ.
Trong chế độ TEXT màn hình được chia thành 25 dòng và 80 cột, nếu viết kín màn hình ta có thể viết được 2000 ký tự. Chúng ta có thể thay đổi chế độ phân giải để viết ra 25 dòng x 40 cột hoặc 80 dòng x 50 cột...
Muốn vẽ hình, tô màu các hình ta phải chuyển sang chế độ đồ hoạ, trong chế độ này
màn hình được xem là một ma trận điểm, tuỳ thuộc độ phân giải ta có thể có ma trận 640x480
điểm hoặc 1024x720 điểm.... Mỗi điểm trên màn hình được gọi là 1 Pixel tức là một phần tử
ảnh
( Picture Element ), ta có thể hoàn toàn chủ động trong việc thay đổi màu sắc, cường độ sáng của từng điểm để tạo ra một bức tranh theo ý muốn. Vị trí của mỗi điểm trên màn hình được biểu diễn bởi hai toạ độ: Hoành độ và Tung độ, gốc toạ độ (0,0) là điểm ở góc trên bên trái màn hình còn điểm góc dưới bên phải có toạ độ là 639,479.
Muốn chuyển sang làm việc ở chế độ đồ hoạ, trong thư mục hiện hành (thư mục chứa chương trình Pascal) phải có các tệp GRAPH.TPU, *.BGI và *.CHR. Lời gọi đơn vị chương trình đồ hoạ phải đặt ở đầu chương trình sau từ khoá USES như ví dụ 43.
Ví dụ 43
Program Ve_hinh;
Uses GRAPH;
1.2 - Khởi động chế độ đồ hoạ
Trong phần thân chương trình cần phải đưa vào các thông báo về kiểu màn hình, chế độ đồ hoạ (MODE) tương ứng. Những người làm tin học ứng dụng thường không quan tâm lắm đến các thông số này do vậy dễ lúng túng khi cần khai báo. Để khắc phục nhược điểm đó trong Turbo Pascal đã có sẵn một thủ tục khởi tạo chế độ đồ hoạ là Initgraph(var GD,GM: Integer, DP:string[n]); Khi gọi thủ tục này với các tham số hợp lệ Initgraph sẽ tự xác định kiểu màn hình và Mode đồ hoạ tối ưu .
Người lập trình có thể tự mình khai báo các tham số GD, GM (Trong đó GD: Graph Driver - là một số nguyên xác định kiểu màn hình; GM: Graph Mode - cũng là một số nguyên xác định Mode đồ hoạ).
Trước hết trong phần khai báo biến các tham số này phải khai thuộc kiểu Integer, sau
đó trong phần thân chương trình phải chọn các giá trị thích hợp cho kiểu màn hình và Mode
đồ hoạ.
Thông thường chúng ta không biết chính xác kiểu màn hình và Mode đồ hoạ của máy tính đang sử dụng nên sẽ gặp lúng túng khi khai báo. Trong trường hợp này tốt nhất là để Pascal tự xác định giúp chúng ta các tham số này.
Nếu ngay sau từ khoá Begin của phần thân chương trình chúng ta khai báo
GD:= DETECT;
thì Initgraph hiểu là nó phải tự đi xác định kiểu màn hình và Mode đồ hoạ sao cho đạt kết quả tối ưu. Nói chung trừ những trường hợp đặc biệt, chúng ta không nên tự xác định những thông số này làm gì.
Bảng .... cho biết giá trị của các tham số GD,GM và độ phân giải màn hình của ba loại màn hình đã có, loại thông dụng nhất hiện nay là VGA.
Bảng ...
Kiểu màn hình Mode đồ hoạ Độ phân giải
Tên Giá trị Tên Giá trị
CGA 1 CGAC0 0 320x200
CGAC1 1 320x200
CGAC2 2 320x200
CGAC3 3 320x200
CGACHi 4 640x200
EGA 3 EGALO 0 640x200
EGAHi 1 640x350
IBM8514 6 IBM8514L 0 640x480, 256 màu
O 1 1024x768, 256 màu
IBM8514Hi
VGA 9 VGALO 0 640x200
VGAMed 1 640x350
VGAHi 2 640x480
Ví dụ 44 trình bày cách sử dụng thủ tục Initgraph để thiết kế chương trình vẽ một đường tròn có tâm tại chính giữa màn hình và bán kính là 50 Pixel. Các tham số GD,GM sẽ do Pascal tự xác định, các tệp điều khiển đồ hoạ đặt trong thư mục TP trên đĩa cứng C.
Ví dụ 44
Program Ve_hinh_tron;
Uses graph;
Var
GD,DM: Integer;
BEGIN
GD:= detect;
Initgraph(GD,GM,'C:\tp\bgi');
If graphresult <> grok then halt(1);
Circle(320,240,50);
Readln;
CloseGraph;
END.
Nếu chúng ta muốn tự mình khai báo GD và GM (Ví dụ: màn hình VGA, kiểu đồ hoạ là độ phân giải cao, tệp tin đồ hoạ chứa trong thư mục TP5 trên đĩa A) thì bỏ lệnh GD:=DETECT Và viết lại đoạn đầu của ví dụ 44 như sau:
GD:=VGA;
GM:=VGAHi;
INITGRAPH(GD,GM,'C:\TP\BGI');
200>
Chia sẻ với bạn bè của bạn: |