1. Giới thiệu về ngôn ngữ lập trình là gì ?



tải về 0.58 Mb.
trang5/6
Chuyển đổi dữ liệu30.08.2016
Kích0.58 Mb.
#28832
1   2   3   4   5   6

Chú ý: Có thể thay thế tên màn hình bằng giá trị tương ứng đã có trong bảng.

Tham số DP ( Driver Path ) là đường dẫn tới thư mục chứa các tệp điều khiển kiểu màn hình đồ hoạ, trong ví dụ trên được khai là 'c:\tp\bgi' nghĩa là ổ đĩa C thư mục TP, còn BGI là đuôi tệp đều khiển. Trong trường hợp chúng ta không khai báo gì cho DP, nghĩa là để một chuỗi rỗng '' thì Pascal sẽ tự tìm các tệp điều khiển đồ hoạ trong thư mục chủ (là nơi mà Pascal được khởi động).

1.3 - Kiểm tra lỗi đồ hoạ

Dòng thứ 8 trong ví dụ 44

If graphresult <> grok then halt(1);

Là câu lệnh kiểm tra lỗi đồ hoạ. Việc kiểm tra được thực hiện thông qua hàm của hàm
graphresult. Lỗi đồ hoạ thường phát sinh khi không tìm thấy các trình điều khiển đồ hoạ,
hoặc khi chúng ta khai báo không đúng các tham số GD, GM, DP. Nếu phát hiện ra lỗi hàm
Graphresult sẽ nhận một trong các giá trị cho trong bảng sau, mỗi giá trị ứng với một hằng
chuỗi ký tự:

Bảng lỗi của hàm Graphresult

Giá trị Hằng chuỗi ý nghĩa

0 Grok Tốt, không có lỗi

-1 Grnoinitgraph Không tìm thấy đơn vị đồ hoạ

-2 Grnotdetected Không có phần cứng đồ hoạ

-3 GrFilenotfound Không tìm thấy các tệp điều khiển màn hình đồ hoạ

-4 GrInvalidDriver Trình điều khiển hỏng, không hợp lệ

-5 GrNoloadMem Bộ nhớ động (RAM) bị thiếu

-6 GrNoscanMem Không thực hiện được việc kiểm tra bộ nhớ

-7 GrNoFloodMem

-8 GrFontNoFound Không tìm thấy các tệp chứa font chữ

-9 GrNoFontMem Không đủ bộ nhớ để nạp Font chữ

-10 GrInvalidMode Kiểu đồ hoạ không hợp lệ

-11 GrError Lỗi đồ hoạ (tổng quát )

-12 GrIOError Lỗi các đường nhập, xuất đồ hoạ

-13 GrInvalidFont Kiểu chữ không hợp lệ

-14 GrInvalidFontNum Số hiệu kiểu chữ không hợp lệ


Như vậy nếu giá trị của hàm Graphresult khác Grok nghĩa là có một lỗi nào đó thì chương trình sẽ bị dừng bằng lệnh Halt(1), còn nếu tốt thì tiếp tục làm việc.
1.4 - Một số thủ tục cơ bản để vẽ hình

* MOVETO(x,y) : Di chuyển con trỏ đến toạ độ x,y (x là hoành độ, y là tung độ)

x,y là các giá trị kiểu Integer, với màn hình VGA thì 0<= x <=639, 0<= y <= 479

* LINETO(x,y): Vẽ một đường thẳng từ vị trí con trỏ hiện thời tới toạ độ x,y kết thúc quá trình vẽ con trỏ nằm tại toạ độ mới.

Pascal có sẵn hai hàm để xác định toạ độ góc dưói bên phải màn hình đó là Getmaxx và Getmaxy. Để vẽ đường chéo của màn hình từ toạ độ 0,0 ta có thể viết các lệnh
MOVETO(0,0);

LINETO(Getmaxx,Getmaxy);

* LINE(x1,y1,x2,y2 : Thủ tục này vẽ một đường thẳng từ toạ độ x1,y1 đến toạ độ x2,y2

* LINEREL(dX,dY): Vẽ đường thẳng từ vị trí hiện thời ( toạ độ x,y) tới toạ độ x+dx, y+dy. * CIRCLE(x,y,r): Vẽ đường tròn tâm tại toạ độ x,y bán kính bằng r Pixel


* PUTPIXEL(x,y, n): Thủ tục này sẽ vẽ một điểm sáng tại toạ độ x,y với màu là n. Giá trị n lấy trong khoảng 0-15 hoặc viết trực tiếp tên màu theo tiếng Anh.

 Thiết lập màu đồ hoạ

Để định màu trong chế độ đồ hoạ ta có thể dùng hai thủ tục sau đây :

g. SETCOLOR(n) : Định màu cho các nét vẽ

h. SETBKCOLOR(n) : Định màu nền cho nét vẽ

Tham số n cho các thủ tục 7 và 8 xem trong bảng sau Bảng .. Mã màu và tên màu


Mã Tên tiếng Anh Tên tiếng Việt

màu


0 Back Đen

1 Blue Xanh da trời

2 Green Xanh lá mạ

3 Cyan Xanh lơ

4 Red Đỏ

5 Magenta Tím

6 Brown Nâu

7 Lightgray Xám nhạt

8 Darkgray Xám xẫm

9 Lightblue Xanh da trời nhạt

10 Lightgreen Xanh lá mạ nhạt

11 Lightcyan Xanh lơ nhạt

12 Lightred Đỏ nhạt

13 Lightmagenta Tím nhạt

14 Yellow Vàng

15 White Trắng


Chú ý:

- Lệnh định màu phải đặt trước lệnh vẽ hình

- Một màu đã định sẽ có tác dụng cho đến khi có lệnh định màu mới

 Vẽ hình khép kín và tô màu

* RECTANGLE(x1,y1,x2,y2) : Vẽ khung hình chữ nhật toạ độ góc trên bên trái là x1,y1 , toạ độ góc dưới bên phải là x2,y2.

* BAR(x1,y1,x2,y2) : Vẽ một hình chữ nhật góc trên bên trái có toạ độ x1,y1 góc dưới bên phải có toạ độ x2,y2. Khi dùng kết hợp với thủ tục số 11 sẽ đồng thời cho phép kẻ các vân hoa trên nền và tô màu cho nền.

* SETFILLSTYLE(n1,n2) : Thủ tục định vân hoa và màu nền.

n1 là một giá trị nguyên với 0<= n1 <= 11 : định kiểu vân hoa (xem bảng ...) n2 là số hiệu mã màu đã giới thiệu 0<= n2 <= 15

Chú ý:

- Thủ tục 11 chọn màu nền và vân hoa chỉ có hiệu lực khi chúng ta sử dụng kèm theo các thủ tục vẽ hình phẳng sau đây:



Hình chữ nhật (Bar), hình hộp chữ nhật (Bar3D), hình quạt (Pieslice), đa giác có toạ độ nhập vào mảng (Fillpoly), Tô màu cho miền (Floodfill).

- Khi vẽ đường tròn hoặc khung chữ nhật thì không thể tạo hoa văn và tô màu trong

nền.

- Thủ tục SETFILLSTYLE(n1,n2) cần đưa vào trước các thủ tục vẽ hình đã nêu trong



mục chú ý. Giá trị của màu và kiểu vân hoa sẽ được giữ cho đến khi ta định nghĩa lại.

Bảng... Giá trị và ý nghĩa của tham số n

Giá trị Tên tiếng Anh

0 EmptyFill

1 SolidFill

2 LineFill

3 LTSlashFill

4 SlashFill

5 BKSlashFill

6 LTBKSlashFill

7 HatchFill

8 XHatchFill

9 InterleaveFill

10 WideDotFill

11 CloseDotFill
1.5 - Viết chữ trong chế độ đồ hoạ
ý nghĩa

Không tạo hoa văn bên trong hình Tạo hoa văn bằng nét liền

Tạo bằng nét gạch nối ----

Tạo hoa văn bằng nét ///

Tạo hoa văn bằng nét /// đậm

Tạo hoa văn bằng nét \\\ đậm

Tạo hoa văn bằng nét \\\

Kẻ lưới hình ô vuông

Kẻ lưới hình ô vuông xoay 90 độ Tô bằng nét đứt quãng

Tạo hoa văn bằng dấu chấm thưa


Tạo hoa văn bằng dấu chấm dày (liền nhau)

Khi đã chuyển sang làm việc ở chế độ đồ hoạ ta không thể viết chữ bình thường như trong chế độ văn bản. Muốn viết chữ trong các hình vẽ ta sử dụng một số thủ tục sau đây:


* OUTTEXT(chuỗi) : Thủ tục này sẽ cho hiện chuỗi ký tự tại vị trí con trỏ hiện thời.
Chuỗi có thể viết trực tiếp hoặc thông qua biến chuỗi như trong ví dụ 45 sau đây:
Ví dụ 45
Var

chuviet : string[30]


Begin

outtext('cong hoa xa hoi chu nghia ...');

chuviet:='Viet nam dan chu cong hoa'; outtext(chuviet);
* OUTTEXTXY(x,y,chuoi) : thủ tục này sẽ viết ra chuỗi ký tự tại toạ độ x,y. * SETTEXTSTYLE(Kiểu chữ, Chiều viết, Kích thước);

Kiểu chữ là một tham số nguyên nhận giá trị trong khoảng 0-4

Chiều viết chỉ nhận 1 trong hai giá trị : 0 nằm ngang; 1 thẳng đứng Kích thước Là hệ số phóng to chữ có thể chọn từ 0-10

Để chấm dứt chế độ đồ hoạ trở về chế độ văn bản ta dùng thủ tục CLOSEGRAPH. Sau đó muốn quay lại chế độ đồ hoạ ta lại phải gọi lại INITGRAPH.

Trong một số trường hợp để chuyển nhanh giữa chế độ đồ hoạ và văn bản chúng ta có thể dùng hai thủ tục sau đây:

- RESTORECRTMODE; Tạm ngừng chế độ đồ hoạ chuyển sang chế độ văn bản.

- SETGRAPHMODE(n); Ngắt chế độ văn bản đã tạo ra bởi Restorecrtmode thiết lập trở lại chế độ đồ hoạ. Tham số n có thể lựa chọn trong khoảng 0-2. Ví dụ 46 dưới đây trình bày cách sử dụng các thủ tục này.

Program dohoa_text;

uses crt,graph;

var


gd,gm:integer;
begin

gd:=detect;

initgraph(gd,gm,'a:\tp5\bgi');

if graphresult<>grok then halt(1);


moveto(0,0); setcolor(5);

lineto(300,300); delay(2500);

circle(400,300,100); delay(1500);

restorecrtmode; (* Chuyển về chế độ văn bản *)

gotoxy(20,20);textcolor(9);

write('Happy New Year');

readln;

setgraphmode(2); (* Trở về chế độ đồ hoạ với n=2 cho màn hình VGA*)



setcolor(blue);

circle(100,100,50);


delay(2000);

restorecrtmode; (* Chuyển sang chế độ văn bản lần thứ hai*)

textcolor(3);

gotoxy(20,0);write('DAI HOC NONG NGHIEP I HA NOI');


readln;

closegraph; (* Kết thúc chế độ đồ hoạ*)

end.
Việc sử dụng các thủ tục đồ hoạ không có gì phức tạp, với một chút cố gắng bạn có thể vẽ đợc những hình rất đẹp theo mong muốn. Dưới đây là một chương trình vẽ đồ thị hình sin. Chạy chương trình ta sẽ thấy ba đường hình sin với các biên độ và màu sắc khác nhau.
Ví dụ 46

Program Do_thi_hinh_sin;


uses graph,crt;

const m=0.1;

Var t3,t4,t1,n,t2,gd,gm:integer; t,x,y,z:real;
Begin

gd:=detect;

Initgraph(gd,gm,'a:\tp5\bgi');

if graphresult<>grok then Halt(1); x:=0; t3:=100; n:=0; t2:=10; while t2<=600 do

Begin

setcolor(green);


y:=sin(x);

t1:=round(y*50);


t3:=round(y*70);
t4:=round(y*100);
t1:=200-t1;

t3:=200-t3;


t4:=200+t4;

moveto(10,200);


lineto(620,200);
line(10,80,10,300);
settextstyle(3,0,3);
outtextxy(610,205,'x');
settextstyle(3,0,3);
outtextxy(15,75,'y');
settextstyle(4,0,3);
setcolor(5);

outtextxy(200,300,'do thi ham sin(x)'); setcolor(12);

moveto(10,200);
putpixel(t2,t1,11);
putpixel(t2,t3,14);
setcolor(red);

putpixel(t2,t4,random(14));


setcolor(12);

delay(5);

x:=x+0.07;
t2:=t2+1;
end;

repeat until keypressed;


t1:=1;

t2:=200;

while t1<=220 do
begin

line(340,240,round(sqrt(440*440-t1*t1)),t1); t1:=t1+1;

delay(15);
end;

repeat until keypressed;


closegraph;

End.
Chương trình dưới đây thiết kế một đồng hồ ba kim , tốc độ chạy của kim giây tuỳ


thuộc vào lệnh DELAY(n) , nếu chọn DELAY(1000) thì cứ 1 giây kim giây chuyển một vị trí.
Khi nhập chương trình vào máy cần lưu ý khai báo lại đường dẫn đến thư mục chứa các tệp
*.BGI

Program VEDONGHO;


uses crt,graph;

var


x,y, maxx,maxy, gd,gm,color,i,j,t:integer;
N:real;

LAM,TT:CHAR;


begin

gd:=detect;

initgraph(gd,gm,'c:\tp5\BGI');
setcolor(5);

rectangle(30,20,610,450);


rectangle(31,21,609,449);
rectangle(32,22,608,448);
setfillstyle(9,2);

bar(33,23,607,447);


setcolor(red);

setbkcolor(red);

for i:=1 to 10 do circle(320,240,i);
setcolor(11);

setbkcolor(white);

for i:=11 to 80 do circle(320,240,i);
setcolor(14);

setbkcolor(white);

for i:=80 to 160 do circle(320,240,i); setcolor(white);

for i:=160 to 200 do circle(320,240,i); setcolor(11);

circle(320,240,79);
circle(320,240,80);
setcolor(4);

circle(320,240,159);


circle(320,240,160);
settextstyle(3,0,4);
outtextxy(310,40,'XII');
outtextxy(405,60,'I');
outtextxy(470,120,'II');
outtextxy(490,200,'III');
outtextxy(480,290,'IV');
outtextxy(410,370,'V');
outtextxy(310,400,'VI');
outtextxy(210,370,'VII');
outtextxy(135,290,'VIII');
outtextxy(130,210,'IX');
outtextxy(155,130,'X');
outtextxy(220,60,'XI');
setcolor(blue);

Settextstyle(4,0,5);

outtextxy(230,100,'DIAMON');
setcolor(random(14));

for i:=1 to 20 do

circle(320,360,i );
settextstyle(1,0,2);
setcolor(5);

outtextxy(200,450,'Copyright by Dr. Duong Xuan Thanh');


for i:=1 to 20 do

begin


setcolor(random(14));
circle(320,360,i );
end;

for i:=1 to 20 do


begin

setcolor(random(14));


circle(320,360,i );
end;

for t:=0 to 12 do {-------- Kim gio --------}

begin

setcolor(12);



moveto(320,240);

setlinestyle(0,0,3);

SetWriteMode(xorput);

linerel(round(110*cos((t*30-89)*pi/180)),round(110*sin((t*30-89)*pi/180))); moveto(320,240);

linerel(round(110*cos((t*30-90)*pi/180)),round(110*sin((t*30-90)*pi/180))); moveto(320,240);

linerel(round(110*cos((t*30-91)*pi/180)),round(110*sin((t*30-91)*pi/180))); moveto(320,240);

linerel(round(110*cos((t*30-92)*pi/180)),round(110*sin((t*30-92)*pi/180))); for i:=0 to 60 do { ---------Kim phut -------}

begin


setcolor(12);

moveto(320,240);

setlinestyle(0,0,3);

SetWriteMode(xorput);

linerel(round(130*cos((i*6-89)*pi/180)),round(130*sin((i*6-89)*pi/180))); moveto(320,240);
linerel(round(130*cos((i*6-90)*pi/180)),round(130*sin((i*6-90)*pi/180))); moveto(320,240);

linerel(round(130*cos((i*6-91)*pi/180)),round(130*sin((i*6-91)*pi/180)));


(*--------Kim giay--------*)

for j:=0 to 360 do

begin

moveto(320,240);


setlinestyle(0,0,3);

SetWriteMode(XORPut);


setcolor(12);

linerel(round(150*cos((j-90)*pi/180)),round(150*sin((j-90)*pi/180))); moveto(320,240);

linerel(round(150*cos((j-91)*pi/180)),round(150*sin((j-91)*pi/180)));

delay(1000); moveto(320,240);

linerel(round(150*cos((j-90)*pi/180)),round(150*sin((j-90)*pi/180))); moveto(320,240);

linerel(round(150*cos((j-91)*pi/180)),round(150*sin((j-91)*pi/180)));


end;

moveto(320,240);

linerel(round(130*cos((i*6-89)*pi/180)),round(130*sin((i*6-89)*pi/180))); moveto(320,240);

linerel(round(130*cos((i*6-90)*pi/180)),round(130*sin((i*6-90)*pi/180))); moveto(320,240);

linerel(round(130*cos((i*6-91)*pi/180)),round(130*sin((i*6-91)*pi/180)));
end;

moveto(320,240);

linerel(round(110*cos((t*30-89)*pi/180)),round(110*sin((t*30-89)*pi/180))); moveto(320,240);

linerel(round(110*cos((t*30-90)*pi/180)),round(110*sin((t*30-90)*pi/180))); moveto(320,240);

linerel(round(110*cos((t*30-91)*pi/180)),round(110*sin((t*30-91)*pi/180))); moveto(320,240);

linerel(round(110*cos((t*30-92)*pi/180)),round(110*sin((t*30-92)*pi/180)));


end;

repeat until keypressed;


END.
2 - Âm thanh

Trong các máy PC thông dụng công suất của loa rất nhỏ do đó việc tạo âm thanh chỉ có tính chất biểu diễn. Muốn tạo ra âm thanh cao thấp khác nhau ta chỉ cần đưa vào loa các xung điện với tần số khác nhau. Turbo Pascal đã có ba thủ tục thiết kế sẵn để làm việc này

SOUND(n) : tạo ra âm thanh với tần số n , ở đây n phải là một số nguyên dương

DELAY(n) : Kéo dài tín hiệu âm thanh trong khoảng thời gian n miligiây nếu sau đó có thủ tục ngắt âm Nosound.

NOSOUND : ngắt tín hiệu âm thanh

Cần chú ý rằng khi có thủ tục sound và Delay tín hiệu âm thanh sẽ được phát ra chừng nào chưa có Nosound mặc dù ta đã định khoảng thời gian trễ qua thủ tục Delay.


Để tạo một bản nhạc chúng ta cũng cần có một chút kiến thức về nhạc lý. Độ cao thấp
trong âm nhạc được phân thành các quãng tám. Quãng tám trung tần thì nốt Đô có tần số 512
Hz, quãng tám trầm hơn tần số của nốt Đồ sẽ là 256 Hz, còn quãng tám cao hơn nốt Đố có tần
số 1024 Hz.

Tên các nốt nhạc theo quy ước là:

Quãng tám trầm : đồ, rề, mì, fà, sòn, là, xì
Quãng tám trung : đô, rê, mi, fa, son, la , xi
Quãng tám cao : đố, rế, mí, fá, són, lá, xí

Về cao độ thì các nốt Mi - Fa và Xi - Đô cách nhau nửa cung các nốt còn lại cách nhau một cung. Nếu tính từ nốt Đồ (tần số 256) đến nốt Đố (tần số 512) khoảng cách là 6 cung như vậy sự chênh leechj về tần số trong mỗi cung sẽ là (512-256)/6 = 43 Hz. Giữa các nốt Mi - Fa và Xi - Đô chênh lệch chỉ là 22 Hz (vì các nốt này cách nhau nửa cung). Ngoài ra cũng cần biết cách tạo ra các nốt thăng, giáng để có thể tạo ra một bản nhạc theo ý muốn.

Nếu chúng ta chỉ muốn nghe một bản nhạc phát ra từ máy thì có thể tạo nên một chương
trình thiết kế các nốt nhạc sau đó ghép chúng lại thành bản nhạc tuỳ ý.
Chương trình dưới đây thiết kế bản nhạc Làng tôi, các chương trình con T0, T1...T5
tạo ra trường độ, ví dụ T0 là nốt tròn, T1 là nốt đen... các chương trình con khác tạo ra các nốt
nhạc của hai quãng tám trầm và trung, trong đó có một số nốt thăng và giáng.
Program Vancao;

uses crt;

procedure T0; Begin delay(20000); Nosound; End;
procedure T1; Begin delay(10000); Nosound; End;
procedure T2; Begin delay(5000); Nosound; End;
procedure T3; Begin delay(2500); Nosound; End;
procedure T4; Begin delay(1250); Nosound; End;
procedure T5; Begin delay(30000); Nosound; End;
Procedure nt(i:integer);

Begin Sound(i); End;

Procedure do1; Begin nt(256); End; {quang tam tram} Procedure do11; Begin nt(270); End; {not do thang} Procedure re1; Begin nt(299); End;

Procedure mi1; Begin nt(342); End;


Procedure fa1; Begin nt(363); End;
Procedure son1; Begin nt(406); End;
Procedure la1; Begin nt(449); End;
Procedure si1; Begin nt(492); End;

Procedure do2; Begin nt(534); End; {quang tam trung} Procedure re2; Begin nt(600); End; {not Re giang} Procedure mi2; Begin nt(685); End;

Procedure fa2; Begin nt(634); End;
Procedure son2; Begin nt(677); End;
Procedure la2; Begin nt(712); End;
Procedure si2; Begin nt(755); End;

Procedure Langtoi;

Begin

clrscr; gotoxy(25,12); textcolor(14); textbackground(red); Write(' LANG TOI * Nhac tien chien ');



Repeat

do11;t0;mi1;t1;son1;t0;la1;t1;son1;t0;


son1;t1;do2;t1;si1;t1;la1;t1;son1;t0;
la1;t1;son1;t1;fa1;t1;mi1;t1;son1;t0;t1;

do11;t0;re1;t1;mi1;t0;son1;t1;do2;t0;re2;t1;mi2;t0;t1;

re2;t1;do2;t1;re2;t1;do2;t1;son1;t0;mi1;t1;son1;t1;do2;t5;t1; do2;t1;do2;t2;la1;t1;la1;t1;si1;t1;la1;t1;son1;t0;t1;
fa1;t1;fa1;t1;la1;t0;t4;la1;t1;mi1;t0;re1;t1;son1;t5;t1;
do1;t0;re1;t1;mi1;t0;fa1;t1;son1;t0;mi1;t1;re1;t5;
do1;t1;do2;t0;si1;t1;re2;t0;son1;t1;do2;t5;
Until keypressed; Nosound;

End;


BEGIN
Langtoi;
END.

Dưới đây là ví dụ thiết kế bàn phím thành các phím của một chiếc đàn dương cầm. Các nốt đô, rê, mi, fa, son, la , xi đố sẽ bấm các chữ cái tương ứng ( D, R, M, F, S, L, X, Z). Muốn dừng âm ta bấm phím P (PAUSE), còn muốn dừng chương trình bấm E (EXIT).


Program nhac;

uses crt,graph;


var

n :char; i,j:integer;


begin

clrscr;


textcolor(14); textbackground(white); for i:=1 to 6 do

begin


gotoxy(16,i+3);

for j:=1 to 51 do write(chr(177));


end;

gotoxy(17,5);


textcolor(red);

write('Do-D, Re-R, Mi-M, Fa-F, Son-S, La-L, Xi-X, Do2-Z'); gotoxy(33,6); write(' Re2-W, Mi2-T ');

gotoxy(22,7);

textcolor(blue);

writeln(' P->Ngat am, E-> Dung chuong trinh '); gotoxy(22,8);

textcolor(5);

writeln('Moi ban choi moi ban nhac minh ua thich ');
repeat

n:= readkey;

if n = 'd' then begin nosound; delay(3); sound(523); end;
if n = 'r' then begin nosound; delay(10); sound(587); end;
if n = 'm' then begin nosound; delay(10); sound(659); end;
if n = 'f' then begin nosound; delay(10); sound(698); end;
if n = 's' then begin nosound; delay(10); sound(784); end;
if n = 'l' then begin nosound; delay(10); sound(880); end;
if n = 'x' then begin nosound; delay(10); sound(988); end;
if n = 'z' then begin nosound; delay(3); sound(1050); end;
if n = 'w' then begin nosound; delay(3); sound(1190); end;
if n = 't' then begin nosound; delay(3); sound(1300); end;
if n = 'p' then nosound;

until upcase(n) ='E';


nosound;

end.
Bài tập chương VII


1. Viết chương trình vẽ n hình vuông lồng nhau.
2. Viết chương trình vẽ bàn cờ hình vuông có 64 ô ( mỗi chiều là 8), xen kẽ cứ một ô đỏ rồi đến 1 ô trắng.
3. Viết chương trình vẽ đò thị hình Cosin trong lương giác

.


CHƯƠNG VI: GIẢI THUẬT
1. Khái niệm giải thuật (Algorithms)
- Khi cần giải quyết một bài toán trong thực tế với sự trợ giúp của máy tính điện tử ta thường phải biết dữ liệu vào của bài toán (Input) là gì? và bài toán yêu cầu dữ liệu ra (Output) là gì?. Bước tiếp theo ta phải thiết lập được các bước thao tác cụ thể để từ Input ta có được Output. Công việc đó trong tin học được gọi là xây dựng giải thuật.

- Giải thuật của 1 bài toán là một dãy các câu lệnh (Statements) chặt chẽ và rõ ràng xác định một trình tự các thao tác trên một số đối tượng nào đó sao cho sau một số bước hữu hạn thực hiện ta thu được kết quả mong muốn.

- Với định nghĩa như vậy ta thấy rằng đối với một bài toán cụ thể có thể có nhiều giải thuật khác nhau nhưng tất nhiên là các giải thuật đó phải cho cùng một kết quả theo đúng yêu cầu của bài toán.

- Khi nghiên cứu về giải thuật thường ta phải biết được giải thuật đó tác động lên dữ liệu nào. Việc lựa chọn cấu trúc dữ liệu (Data structures) phù hợp và việc thiết lập được các giải thuật đúng đắn có cấu trúc tốt và hiệu quả là những vấn đề mấu chốt của công việc thiết lập phần mềm. Chính vì vậy mà Niklaus Wirth người sáng lập ra ngôn ngữ lập trình Pascal đã tổng kết: Giải thuật+Cấu trúc dữ liệu= Chương trình

Ví dụ: Xây dựng giải thuật tìm UCLN của 2 số nguyên dương a và b, ký hiệu (a,b) + Đối với bài toán này ta có

Input: 2 số nguyên dương a, b


Output: (a,b)

+ Giải thuật được xây dựng dựa trên tính chất


Nếu a=b thì (a,b)=a

Nếu a>b thì (a,b)=(a-b,b)


Nếu a+ Cụ thể giải thuật của bài toán như sau:

Bước 1: So sánh a và b, Nếu a=b thì dừng giải thuật và thông báo (a,b)=a. Nếu ab thì chuyển
sang bước 2

Bước 2: Nếu a>b thì thay thế a bởi a-b, nếu a
bước 1

Minh hoạ: a=20, b=32

Bước thực hiện a b Kiểm tra điều kiện a=b

Bước 1 20 32 Sai

Bước 2 20 12

Bước 1 20 12 Sai

Bước 2 8 12

Bước 1 8 12 Sai

Bước 2 8 4

Bước 1 8 4 Sai

Bước 2 4 4

Bước 1 4 4 Đúng

Kết quả là: (20,32)=4

2. Các yêu cầu với giải thuật


Giải thuật của bài toán phải thoả mãn 3 yêu cầu sau:
Yêu cầu 1: Tính dừng

Giải thuật phải dừng sau một số hữu hạn các thao tác, đây là yêu cầu hết sức quan trọng với một giải thuật

Yêu cầu 2: Tính đúng đắn

Ta phải đặt câu hỏi "Liệu giải thuật có thể hiện đúng lời giải của bài toán không?" . Thông thường chúng ta cài đặt giải thuật dưới dạng chương trình và cho thực hiện trên máy tính với một số bộ dữ liệu nào đó, sau đó so sánh với những kết quả mà ta đã biết. Nhưng cách thử này chỉ khẳng định được tính sai chứ chưa thể khẳng định được tính đúng đắn của giải thuật. Bằng cách sử dụng các công cụ toán học ta có thể khẳng định được tính đúng đắn của 1 giải thuật nhưng thường thì đây là một công việc phức tạp.

Yêu cầu 3: Tính đơn giản và hiệu quả

Ta thường mong muốn xây dựng được một giải thuật đơn giản, dễ hiểu, dễ lập trình. Nhưng đôi khi thuật giải đơn giản lại gây ra sự lãng phí thời gian và bộ nhớ. Do đó mục tiêu là phải xây dựng được các giải thuật có thời gian thực hiện nhanh, hạn chế tối đa dung lượng bộ nhớ dành cho việc lưu trữ những kết quả trung gian.


3. Các cách diễn tả giải thuật

3.1. Cách 1: Liệt kê từng bước

Ví dụ: Có 31 que diêm, người và máy thay nhau bốc. Mỗi lần bốc từ 1 đến 4 que. Ai phải bốc sau cùng là thua. Hãy xây dựng thuật giải sao cho máy bốc trước bao giờ cũng thua.
Bước 1: Máy bốc ngẫu nhiên x que diêm (1x4)

Bước 2: Người bốc (5- x) que, tổng số que diêm giảm đi 5 que. Nếu số que diêm còn lại là 1 que thì chuyển sang bước 3, nếu không thì quay lại thực hiện bước 1


Bước 3: Tuyên bố người thắng cuộc
3.2. Cách 2: Sử dụng lưu đồ

Sử dụng phương tiện hình học cũng là một cách tốt để minh hoạ giải thuật của 1 bài toán. Trong lưu đồ người ta sử dụng các hình sau, với kí hiệu + là đúng, - là sai.

- +
Kh i i u ki n Kh i l nh

Cung


Kh i b t u và k t thúc


tải về 0.58 Mb.

Chia sẻ với bạn bè của bạn:
1   2   3   4   5   6




Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2024
được sử dụng cho việc quản lý

    Quê hương