Theo khung chương trình của Bộ Giáo Dục và Đào Tạo, Ngôn ngữ Lập trình Pascal là một phần quan trọng trong học phần Tin học Đại cương thuộc các khối ngành Khoa học Tự nhiên, đặc biệt là ngành Công nghệ Thông tin.
Nhằm đáp ứng yêu cầu học tập của học sinh, sinh viên bước đầu làm quen với công việc lập trình, chúng tôi đã biên soạn bộ Giáo Trình Bài tập Pascal nhằm giúp cho sinh viên có một tài liệu học tập, rèn luyện tốt khả năng lập trình, tạo nền tảng vững chắc cho các môn học tiếp theo trong chương trình đào tạo Cử nhân Công nghệ Thông tin .
Giáo trình bai gồm rất nhiều bài tập từ đơn giản đến phức tạp. Các bài tập này được biên soạn dựa trên khung chương trình giảng dạy môn Tin học Đại cương. Bên cạch đó, chúng tôi cũng bổ sung một số bài tập dựa trên cơ sở một số thuật toán chuẩn với các cấu trúc dữ liệu được mở rộng nhằm nâng cao kỹ năng, phương pháp lập trình cho sinh viên.
Nội dung của giáo trình được chia thành 10 chương. Trong mỗi chương đều có phần tóm tắt lý thuyết, phần bài tập mẫu và cuối cùng là phần bài tập tự giải để bạn đọc tự mình kiểm tra những kiến thức và kinh nghiệm đã học. Trong phần bài tập mẫu, đối với những bài tập khó hoặc có thuật toán phức tạp, chúng tôi thường nêu ra ý tưởng và giải thuật trước khi viết chương trình cài đặt.
LỜI MỞ ĐẦU Theo khung chương trình của Bộ Giáo Dục và Đào Tạo, Ngôn ngữ Lập trình Pascal là một phần quan trọng trong học phần Tin học Đại cương thuộc các khối ngành Khoa học Tự nhiên, đặc biệt là ngành Công nghệ Thông tin. Nhằm đáp ứng yêu cầu học tập của học sinh, sinh viên bước đầu làm quen với công việc lập trình, chúng tôi đã biên soạn bộ Giáo Trình Bài tập Pascal nhằm giúp cho sinh viên có một tài liệu học tập, rèn luyện tốt khả năng lập trình, tạo nền tảng vững chắc cho các môn học tiếp theo trong chương trình đào tạo Cử nhân Công nghệ Thông tin . Giáo trình bai gồm rất nhiều bài tập từ đơn giản đến phức tạp. Các bài tập này được biên soạn dựa trên khung chương trình giảng dạy môn Tin học Đại cương. Bên cạch đó, chúng tôi cũng bổ sung một số bài tập dựa trên cơ sở một số thuật toán chuẩn với các cấu trúc dữ liệu được mở rộng nhằm nâng cao kỹ năng, phương pháp lập trình cho sinh viên. Nội dung của giáo trình được chia thành 10 chương. Trong mỗi chương đều có phần tóm tắt lý thuyết, phần bài tập mẫu và cuối cùng là phần bài tập tự giải để bạn đọc tự mình kiểm tra những kiến thức và kinh nghiệm đã học. Trong phần bài tập mẫu, đối với những bài tập khó hoặc có thuật toán phức tạp, chúng tôi thường nêu ra ý tưởng và giải thuật trước khi viết chương trình cài đặt. Xin chân thành cảm ơn các đồng nghiệp ở Khoa Công nghệ Thông tin Trường Đại học Khoa học Huế đã giúp đỡ, đóng góp ý kiến để hoàn chỉnh nội dung giáo trình này. Chúng tôi hy vọng sớm nhận được những ý kiến đóng góp, phê bình của bạn đọc về nội dung, chất lượng và hình thức trình bày để giáo trình này ngày một hoàn thiện hơn. Huế, Tháng 07 Năm 2004 CÁC TÁC GIẢ Chương 1 CÁC THÀNH PHẦN CƠ BẢN CỦA NGÔN NGỮ LẬP TRÌNH PASCAL Pascal là một ngôn ngữ lập trình bậc cao do Niklaus Wirth, giáo sư điện toán trường Đại học kỹ thuật Zurich (Thụy Sĩ) đề xuất năm 1970. Ông lấy tên Pascal để kỷ niệm nhà toán học và nhà triết học người Pháp nổi tiếng Blaise Pascal. 1. Các tập tin cần thiết khi lập trình với Turbo Pascal Để lập trình được với Turbo Pascal, tối thiểu cần 2 file sau: TURBO.EXE: Dùng để soạn thảo và dịch chương trình. TURBO.TPL: Thư viện chứa các đơn vị chuẩn để chạy với TURBO.EXE. Ngoài ra, muốn lập trình đồ hoạ thì phải cần thêm các tập tin: GRAPH.TPU: Thư viện đồ hoạ. *.BGI: Các file điều khiển các loại màn hình tương ứng khi dùng đồ hoạ. *.CHR: Các file chứa các font chữ đồ họa. 2. Các bước cơ bản khi lập một chương trình Pascal Bước 1: Soạn thảo chương trình. Bước 2: Dịch chương trình (nhấn phím F9), nếu có lỗi thì phải sửa lỗi. Bước 3: Chạy chương trình (nhấn phím Ctrl-F9). 3. Cấu trúc chung của một chương trình Pascal { Phần tiêu đề } PROGRAM Tên_chương_trình; { Phần khai báo } USES ......; CONST .....; TYPE .......; VAR ........; PROCEDURE ............; FUNCTION ..............; ............... { Phần thân chương trình } BEGIN ........... END. Ví dụ 1: Chương trình Pascal đơn giản nhất BEGIN Write(‘Hello World!’); END. Ví dụ 2: Program Vidu2; Const PI=3.14; Var R,S:Real; Begin R:=10; {Bán kính đường tròn} S:=R*R*PI; {Diện tích hình tròn} Writeln(‘Dien tich hinh tron = ‘, S:0:2); { In ra màn hình } Readln; End. 4. Một số phím chức năng thường dùng F2: Lưu chương trình đang soạn thảo vào đĩa. F3: Mở file mới hoặc file đã tồn tại trên đĩa để soạn thảo. Alt-F3: Đóng file đang soạn thảo. Alt-F5: Xem kết quả chạy chương trình. F8: Chạy từng câu lệnh một trong chương trình. Alt-X: Thoát khỏi Turbo Pascal. Alt-: Dịch chuyển qua lại giữa các file đang mở. F10: Vào hệ thống Menu của Pascal. 5. Các thao tác cơ bản khi soạn thảo chương trình 5.1. Các phím thông dụng Insert: Chuyển qua lại giữa chế độ đè và chế độ chèn. Home: Đưa con trỏ về đầu dòng. End: Đưa con trỏ về cuối dòng. Page Up: Đưa con trỏ lên một trang màn hình. Page Down: Đưa con trỏ xuống một trang màn hình. Del: Xoá ký tự ngay tại vị trí con trỏ. Back Space (ß): Xóa ký tự bên trái con trỏ. Ctrl-PgUp: Đưa con trỏ về đầu văn bản. Ctrl-PgDn: Đưa con trỏ về cuối văn bản. Ctrl-Y: Xóa dòng tại vị trí con trỏ. 5.2. Các thao tác trên khối văn bản Chọn khối văn bản: Shift + Ctrl-KY: Xoá khối văn bản đang chọn Ctrl-Insert: Đưa khối văn bản đang chọn vào Clipboard Shift-Insert: Dán khối văn từ Clipboard xuống vị trí con trỏ. 6. Các thành phần cơ bản của ngôn ngữ Pascal 6.1. Từ khóa Từ khoá là các từ mà Pascal dành riêng để phục vụ cho mục đích của nó. (Chẳng hạn như: BEGIN, END, IF, WHILE,...) Chú ý: Với Turbo Pascal 7.0 trở lên, các từ khoá trong chương trình sẽ được hiển thị khác màu với các từ khác. 6.2. Tên (định danh) Định danh là một dãy ký tự dùng để đặt tên cho các hằng, biến, kiểu, tên chương trình con... Khi đặt tên, ta phải chú ý một số điểm sau: Không được đặt trùng tên với từ khoá Ký tự đầu tiên của tên không được bắt đầu bởi các ký tự đặc biệt hoặc chữ số. Không được đặt tên với ký tự space,các phép toán. Ví dụ: Các tên viết như sau là sai 1XYZ Sai vì bắt đầu bằng chữ số. #LONG Sai vì bắt đầu bằng ký tự đặc biệt. FOR Sai vì trùng với từ khoá. KY TU Sai vì có khoảng trắng (space). LAP-TRINH Sai vì dấu trừ (-) là phép toán. 6.3. Dấu chấm phẩy (;) Dấu chấm phẩy được dùng để ngăn cách giữa các câu lệnh. Không nên hiểu dấu chấm phẩy là dấu kết thúc câu lệnh. Ví dụ: FOR i:=1 TO 10 DO Write(i); Trong câu lệnh trên, lệnh Write(i) được thực hiện 10 lần. Nếu hiểu dấu chấm phẩy là kết thúc câu lệnh thì lệnh Write(i) chỉ thực hiện 1 lần. 6.4. Lời giải thích Các lời bàn luận, lời chú thích có thể đưa vào bất kỳ chỗ nào trong chương trình để cho người đọc dể hiểu mà không làm ảnh hưởng đến các phần khác trong chương trình. Lời giải thích được đặt giữa hai dấu ngoạc { và } hoặc giữa cụm dấu (* và *). Ví dụ: Var a,b,c:Rea; {Khai báo biến} Delta := b*b – 4*a*c; (* Tính delta để giải phương trình bậc 2 *) BÀI TẬP THỰC HÀNH 1. Khởi động Turbo Pascal. 2. Nhập vào đoạn chương trình sau: Uses Crt; Begin Writeln(‘***********************************************************’); Writeln(‘* CHUONG TRINH PASCAL DAU TIEN CUA TOI *’); Writeln(‘* Oi! Tuyet voi!... *); Writeln(‘***********************************************************’); Readln; End. 3. Dịch và chạy chương trình trên. 4. Lưu chương trình vào đĩa với tên BAI1.PAS. 5. Thoát khỏi Pascal. 6. Khởi động lại Turbo Pascal. 7. Mở file BAI1.PAS. 8. Chèn thêm vào dòng: CLRSCR; vào sau dòng BEGIN 9. Dịch và chạy thử chương trình. 10. Lưu chương trình vào đĩa. 11. Thoát khỏi Pascal. 12. Viết chương trình in ra màn hình các hình sau: * ******** ******* *** ** ** ** ** ** ** ** ** ** ** ** ******** * * ********* ** ** ** ** ** ** ** ** ** ** ** ******** ******** Chương 2 CÁC KIỂU DỮ LIỆU CƠ BẢN KHAI BÁO HẰNG, BIẾN, KIỂU, BIỂU THỨC VÀ CÂU LỆNH I. CÁC KIỂU DỮ LIỆU CƠ BẢN 1. Kiểu logic - Từ khóa: BOOLEAN - miền giá trị: (TRUE, FALSE). - Các phép toán: phép so sánh (=, ) và các phép toán logic: AND, OR, XOR, NOT. Trong Pascal, khi so sánh các giá trị boolean ta tuân theo qui tắc: FALSE < TRUE. Giả sử A và B là hai giá trị kiểu Boolean. Kết quả của các phép toán được thể hiện qua bảng dưới đây: A B A AND B A OR B A XOR B NOT A TRUE TRUE TRUE TRUE FALSE FALSE TRUE FALSE FALSE TRUE TRUE FALSE FALSE TRUE FALSE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE TRUE 2. Kiểu số nguyên 2.1. Các kiểu số nguyên Tên kiểu Phạm vi Dung lượng Shortint -128 ® 127 1 byte Byte 0 ® 255 1 byte Integer -32768 ® 32767 2 byte Word 0 ® 65535 2 byte LongInt -2147483648 ® 2147483647 4 byte 2.2. Các phép toán trên kiểu số nguyên 2.2.1. Các phép toán số học: +, -, *, / (phép chia cho ra kết quả là số thực). Phép chia lấy phần nguyên: DIV (Ví dụ : 34 DIV 5 = 6). Phép chia lấy số dư: MOD (Ví dụ: 34 MOD 5 = 4). 2.2.2. Các phép toán xử lý bit: Trên các kiểu ShortInt, Integer, Byte, Word có các phép toán: NOT, AND, OR, XOR. A B A AND B A OR B A XOR B NOT A 1 1 1 1 0 0 1 0 0 1 1 0 0 1 0 1 1 1 0 0 0 0 0 1 SHL (phép dịch trái): a SHL n Û a ´ 2n SHR (phép dịch phải): a SHR n Û a DIV 2n 3. Kiểu số thực 3.1. Các kiểu số thực : Tên kiểu Phạm vi Dung lượng Single 1.5´10-45 ® 3.4´10+38 4 byte Real 2.9´10-39 ® 1.7´10+38 6 byte Double 5.0´10-324 ® 1.7´10+308 8 byte Extended 3.4´10-4932 ® 1.1´10+4932 10 byte Chú ý: Các kiểu số thực Single, Double và Extended yêu cầu phải sử dụng chung với bộ đồng xử lý số hoặc phải biên dich chương trình với chỉ thị {$N+} để liên kết bộ giả lập số. 3.2. Các phép toán trên kiểu số thực: +, -, *, / Chú ý: Trên kiểu số thực không tồn tại các phép toán DIV và MOD. 3.3. Các hàm số học sử dụng cho kiểu số nguyên và số thực: SQR(x): Trả về x2 SQRT(x): Trả về căn bậc hai của x (x³0) ABS(x): Trả về |x| SIN(x): Trả về sin(x) theo radian COS(x): Trả về cos(x) theo radian ARCTAN(x): Trả về arctang(x) theo radian LN(x): Trả về ln(x) EXP(x): Trả về ex TRUNC(x): Trả về số nguyên gần với x nhất nhưng bé hơn x. INT(x): Trả về phần nguyên của x FRAC(x): Trả về phần thập phân của x ROUND(x): Làm tròn số nguyên x PRED(n): Trả về giá trị đứng trước n SUCC(n): Trả về giá trị đứng sau n ODD(n): Cho giá trị TRUE nếu n là số lẻ. INC(n): Tăng n thêm 1 đơn vị (n:=n+1). DEC(n): Giảm n đi 1 đơn vị (n:=n-1). 4. Kiểu ký tự - Từ khoá: CHAR. - Kích thước: 1 byte. - Để biểu diễn một ký tự, ta có thể sử dụng một trong số các cách sau đây: Đặt ký tự trong cặp dấu nháy đơn. Ví dụ 'A', '0'. Dùng hàm CHR(n) (trong đó n là mã ASCII của ký tự cần biểu diễn). Ví dụ CHR(65) biễu diễn ký tự 'A'. Dùng ký hiệu #n (trong đó n là mã ASCII của ký tự cần biểu diễn). Ví dụ #65. - Các phép toán: =, >, >=, . * Các hàm trên kiểu ký tự: - UPCASE(ch): Trả về ký tự in hoa tương ứng với ký tự ch. Ví dụ: UPCASE('a') = 'A'. - ORD(ch): Trả về số thứ tự trong bảng mã ASCII của ký tự ch. Ví dụ ORD('A')=65. - CHR(n): Trả về ký tự tương ứng trong bảng mã ASCII có số thứ tự là n. Ví dụ: CHR(65)='A'. - PRED(ch): cho ký tự đứng trước ký tự ch. Ví dụ: PRED('B')='A'. - SUCC(ch): cho ký tự đứng sau ký tự ch. Ví dụ: SUCC('A')='B'. II. KHAI BÁO HẰNG - Hằng là một đại lượng có giá trị không thay đổi trong suốt chương trình. - Cú pháp: CONST = ; ... ; END. Bài tập 10.10: Vẽ hình bông hoa. Ý tưởng: Dùng tọa độ cực. Giả sử ta có tọa độ cực trong đó: Trục cực: Ox Góc quay: a thì tọa độ cực của một điểm trong mặt phẳng là cặp (x,y) với: x = f(a).Cos(a) y = f(a).Sin(a) Trong đó: f(a) là phương trình do ta qui định. Ví dụ: f(a) = k.Cos(na) : Hình bông hoa. Hình bông hoa f(a) = a.a (a>0) : Đường xoắn ốc Acsimet. f(a) = k.(1+Cos(a)): Hình trái tim. Uses Crt,Graph; var R,chuky:real; Procedure ThietLapDohoa; Var Gd,Gm:Integer; Begin Gd:=0; InitGraph(Gd,Gm,’D:\BP\BGI’); End; Function F(R,Alpha:real):real; { Tính hàm f(a) } Begin F:=R*cos(19*Alpha/3)+5; End; Procedure VeHinh(ChuKy:real); var x1,x2,y1,y2:integer; a,Alpha,k:real; x0,y0:word; Begin x0:=GetMaxX div 2; y0:=GetMaxY div 2; K:=GetMaxX/50; a:=Pi/180; Alpha:=0; x1:=x0 + Round(F(R,Alpha)*k*cos(Alpha)); y1:=y0 - Round(F(R,Alpha)*k*sin(Alpha)); Moveto(x1,y1); While Alpha<ChuKy do Begin Alpha:=Alpha+a; x1:=x0 + Round(F(R,Alpha)*k*cos(Alpha)); y1:=y0 - Round(F(R,Alpha)*k*sin(Alpha)); LineTo(x1,y1); Delay(10); End; End; BEGIN ThietLapDoHoa; R:=15; chuky:=4*Pi; VeHinh(chuky); repeat until KeyPressed; CloseGraph; END. Bài tập 10.11: Viết chương trình vẽ cung Koch. Các bước phát sinh của cung Koch được thực hiện trong hình sau: (a) K0 (b) K1 (c) K2 Bắt đầu từ đường ngang K0 có độ dài bằng 1. Để tạo cung bậc-1(gọi là K1), chia đường thành ba phần và thay đoạn giữa bằng tam giác đều có cạnh dài 1/3. Bây giờ, toàn bộ đường cong có độ dài 4/3. Cung bậc-2 K2 có được bằng cánh dựng tiếp các tam giác đều từ 4 đoạn của K1. Vì mỗi đoạn có độ dài tăng 4/3 lần nên toàn bộ cung dài ra 4/3 lần. Ý tưởng: Từ hình (b) ta thấy rằng, đầu tiên hướng vẽ quay trái 600, rồi quay phải 1200, cuối cùng quay trái 600 để trở về hướng ban đầu. Uses Crt,Graph; Var n:Integer; Goc,length:real; Procedure ThietLapDohoa; Var gd,gm:integer; Begin gd:=0; InitGraph(gd,gm,'D:\bp\bgi'); End; Procedure Koch(dir,len:real;n:integer); const rads=0.017453293; Begin If n>0 Then Begin Koch(dir,len/3,n-1); dir:=dir+60; {Quay phải 60 độ} Koch(dir,len/3,n-1); dir:=dir-120; {Quay trái 120 độ} Koch(dir,len/3,n-1); dir:=dir+60; {Quay phải 60 độ} Koch(dir,len/3,n-1); End else LineRel(Round(len*cos(rads*dir)),Round(len*sin(rads*dir))); end; Begin ThietLapDoHoa; n:=4; Goc:=180; Length:=150; Moveto(300,200); Koch(Goc,Length,n); Repeat until keypressed; Closegraph; END. C0 C1 C2 C3 Bài tập 10.12: Viết chương trình tạo ra C-cung dựa trên sự tinh chế tương tự của một đoạn thẳng theo hình sau: Ý tưởng: Để có dạng phát sinh kế tiếp, mỗi đoạn thẳng được thay bởi một “hình gãy” gồm 2 đoạn ngắn hơn tạo với nhau một góc 900. Các đoạn mới có độ dài bằng 1/ lần đoạn ở bước trước. Xét hướng vẽ ở một đầu của đoạn thẳng. Để vẽ hình gãy, hướng vẽ quay trái 450, vẽ một đoạn, quay phải 900, vẽ đoạn thứ hai và sau đó trở về hướng cũ bằng cách quay góc 450. Uses graph,crt; Procedure ThietLapDohoa; Var gd,gm,gr:integer; Begin gd:=0; Initgraph(gd,gm,'D:\bp\bgi'); End; PROCEDURE VeC_Cung; Var n:Integer; Goc,length:real; Procedure Rong(dir,len:real;n:integer); const d=0.7071067; rads=0.017453293; begin if n>1 then begin dir:=dir+45; Rong(dir,len*d,n-1); dir:=dir-90; Rong(dir,len*d,n-1); dir:=dir+45; end else LineRel(Round(len*cos(rads*dir)),Round(len*sin(rads*dir))); end; Begin n:=15; Goc:=0; Length:=130; Moveto(200,200); Rong(Goc,Length,n); repeat until keypressed; End; BEGIN ThietLapDoHoa; VeC_Cung; Closegraph; END. C Cung Bài tập 10.13: Viết chương trình vẽ tập Mandelbrot - là một hình trong mặt phẳng phức. Tập Mandelbrot được phát sinh theo công thức sau: z ® z2 + c (*) Tập hợp Mandelbrot là tập bao gồm những số phức c sao cho z2+c vẫn hữu hạn với mọi lần lặp. Ý tưởng: Ta chọn số phức cố định c và tính biểu thức z2+c với z là số phức biến đổi. Nếu chọn z = 0 thì z2+c = c. Thay z vào công thức (*) ta được c2+c. Tiếp tục thay z bằng giá trị mới, ta lại có: (c2+c)2+c, ... Cứ như vậy, ta thu được một dãy vô hạn các số z. Uses crt,graph; Const row=1; col=1; Var x1,y1,x2,y2,kx,ky:real; Gioihan:Byte; x0,y0:word; Diemduoi,Diemtren:Integer; Procedure ThietLapDohoa; Var gd,gm,gr:integer; Begin gd:=0; Initgraph(gd,gm,'D:\bp\bgi'); End; Procedure KhoiTao; Begin Diemduoi:=GetMaxX; Diemtren:=GetMaxY; x1:=-2; y1:=-1.25; x2:=0.5; y2:=1.25; kx:=(x2-x1)/diemduoi; ky:=(y2-y1)/diemtren; Gioihan:=50; End; Procedure ManDelbrot; var dong,cot,dem:integer; P0,Q0,Modun,x,y,Aux:real; Begin cot:=0; While cot<=diemduoi do Begin P0:=x1+cot*kx; dong:=0; While dong<=(diemtren div 2) do Begin Q0:=y1+dong*ky; x:=0; y:=0; dem:=1; Modun:=1; While (dem<=gioihan)and(modun<4) do Begin Aux:=x; x:=x*x-y*y +P0; y:=2*y*Aux + Q0; Modun:=x*x + y*y; dem:=dem+1; End; If Modun<4 Then Begin PutPixel(cot,dong,3); PutPixel(cot,diemtren-dong,3); End; dong:=dong+row; End; cot:=cot+col; End; End; Begin ThietLapDohoa; KhoiTao; Mandelbrot; readln; CloseGraph; End. Tập MandelBrot Bài tập 10.14: Viết chương trình mô phỏng phép quay một tam giác quanh gốc tọa độ. Ý tưởng: Ma trận của phép quay quanh gốc tọa độ: R = ó Uses crt,Graph; Type ToaDo=Record x,y:real; End; var k,Alpha,goc:real; P,PP,PPP,P1,P2,P3:ToaDo; x0,y0:word; ch:char; Procedure ThietLapDohoa; Var gd,gm,gr:integer; Begin gd:=0; Initgraph(gd,gm,'D:\bp\bgi'); End; Procedure VeTruc; Begin Line(GetMaxX div 2,0,GetMaxX div 2,GetMaxY); Line(0,GetMaxY div 2,GetMaxX,GetMaxY div 2); End; Procedure VeHinh(P1,P2,P3:ToaDo); Begin Line(x0+Round(P1.x*k),y0-Round(P1.y*k), x0+Round(P2.x*k),y0- Round(P2.y*k)); Line(x0+Round(P2.x*k),y0-Round(P2.y*k), x0+Round(P3.x*k),y0- Round(P3.y*k)); Line(x0+Round(P3.x*k),y0-Round(P3.y*k), x0+Round(P1.x*k),y0- Round(P1.y*k)); End; Procedure QuayDiem(P:ToaDo;Alpha:real; var PMoi:ToaDo); Begin PMoi.x:=P.x*cos(Alpha)-P.y*sin(Alpha); PMoi.y:=P.x*sin(Alpha)+P.y*cos(Alpha); End; Procedure QuayHinh(P1,P2,P3:ToaDo;Alpha:real; var P1Moi,P2Moi,P3Moi:ToaDo); Begin QuayDiem(P1,Alpha,P1Moi); QuayDiem(P2,Alpha,P2Moi); QuayDiem(P3,Alpha,P3Moi); End; BEGIN ThietLapDoHoa; x0:=GetMaxX div 2; y0:=GetMaxY div 2; k:=GetMaxX/50; Vetruc; P.x:=5; P.y:=3; PP.x:=2; PP.y:=6; PPP.x:=6; PPP.y:=-4; P1:=P; P2:=PP; P3:=PPP; Alpha:=0; goc:=Pi/180; SetWriteMode(XORPut); VeHinh(P,PP,PPP); Repeat ch:=readkey; if ord(ch)=0 then ch:=readkey; case Upcase(ch) of 'K': Begin VeHinh(P1,P2,P3); Alpha:=Alpha-goc; QuayHinh(P,PP,PPP,Alpha,P1,P2,P3); VeHinh(P1,P2,P3); End; 'M': Begin VeHinh(P1,P2,P3); Alpha:=Alpha+goc; QuayHinh(P,PP,PPP,Alpha,P1,P2,P3); VeHinh(P1,P2,P3); End; End; Until ch=#27; CloseGraph; END. BÀI TẬP TỰ GIẢI Bài tập 10.15: Viết chương trình vẽ bàn cờ quốc tế lên màn hình. Bài tập 10.16: Viết chương trình vẽ một chiếc xe ô tô (theo hình dung của bạn) và cho nó chạy ngang qua màn hình. Gợi ý: Dùng kỹ thuật lật trong màn hình hoặc di chuyển vùng màn hình. Bài tập 10.17: Viết chương trình vẽ lá cờ tổ quốc đang tung bay. Gợi ý: Dùng kỹ thuật lật trong màn hình. Bài tập 10.18: Viết chương trình nhập vào n học sinh của một lớp học bao gồm 2 trường sau: Họ tên, điểm trung bình. a/ Hãy thống kê số lượng học sinh giỏi, khá, trung bình và yếu. b/ Vẽ biểu đồ thống kê số lượng học sinh giỏi, khá, trung bình và yếu theo 2 dạng: biểu đồ cột (column) và biểu đồ bánh tròn (Pie). Bài tập 10.19: Viết chương trình để vẽ đồ thị của các hàm số sau: a/ y = ax3 + bx2 + cx +d b/ y = ax4 + bx3 + cx2 + dx + e c/ y = d/ y = Bài tập 10.20: Hình vẽ cung Koch dựa trên 3 cạnh của tam giác đều như hình sau: Bài tập 10.21: Viết chương trình để vẽ đường xoắn ốc. Gợi ý: Dùng tọa độ cực. Bài tập 10.22: Viết chương trình vẽ cái đồng hồ đang hoạt động. Bài tập 10.23: Viết chương trình mô phỏng chuyển động của trái đất xung quanh mặt trời và đồng thời chuyển động của mặt trăng xung quanh trái đất. Gợi ý: Dùng ma trận của phép quay. Bài tập 10.24: Xây dựng một thư viện (Unit) chứa tất cả các bài tập trong chương này. Bài tập 10.25: Viết chương trình tạo Menu đồ họa giống như các Menu trong môi trường WINDOWS (xem hình). MỤC LỤC Lời mở đầu 1 Chương 1: CÁC THÀNH PHẦN CƠ BẢN CỦA NGÔN NGỮ LẬP TRÌNH PASCAL 2 Chương 2: CÁC KIỂU DỮ LIỆU CƠ BẢN – KHAI BÁO HẰNG, BIẾN, KIỂU, BIỂU THỨC VÀ CÂU LỆNH I. Các kiểu dữ liệu cơ bản 6 II. Khai báo hằng 8 III. Khai báo biến 8 IV. Định nghĩa kiểu 9 V. Biểu thức 9 VI. Câu lệnh 9 Bài tập mẫu 11 Bài tập tự giải 12 Chương 3: CÁC CÂU LỆNH CÓ CẤU TRÚC I. Lệnh rẽ nhánh 15 II. Lệnh lặp 16 Bài tập mẫu 17 Bài tập tự giải 24 Chương 4: CHƯƠNG TRÌNH CON: THỦ TỤC VÀ HÀM I. Khái niệm về chương trình con 27 II. Cấu trúc chung của một chương trình có sử dụng CTC 27 III. Biến toàn cục và biến địa phương 28 IV. Đệ qui 29 V. Tạo thư viện (UNIT) 31 Bài tập mẫu 33 Bài tập tự giải 36 Chương 5: DỮ LIỆU KIỂU MẢNG I. Khai báo mảng 38 II. Xuất nhập trên dữ liệu kiểu mảng 38 Bài tập mẫu 38 Bài tập tự giải 50 Chương 6: XÂU KÝ TỰ I. Khai báo kiểu xâu ký tự 53 II. Truy xuất dữ liệu kiểu String 53 III. Các phép toán trên xâu ký tự 53 IV. Các thủ tục và hàm về xâu ký tự 53 Bài tập mẫu 54 Bài tập tự giải 60 Chương 7: KIỂU BẢN GHI I. Khai báo dữ liệu kiểu bản ghi 63 II. Xuất nhập dữ liệu kiểu bản ghi 63 Bài tập mẫu 63 Bài tập tự giải 68 Chương 8: KIỂU FILE I. Khai báo 70 II. Các thủ tục và hàm chuẩn 70 III. File văn bản 72 IV. File không định kiểu 73 Bài tập mẫu 74 Bài tập tự giải 85 Chương 9: KIỂU CON TRỎ I. Khai báo 91 II. Làm việc với biến động 91 III. Danh sách động 92 Bài tập mẫu 94 Bài tập tự giải 108 Chương 10: ĐỒ HỌA I. Màn hình trong chế độ đồ hoạ 113 II. Khởi tạo và thoát khỏi chế độ đồ hoạ 113 III. Toạ độ và con trỏ trên màn hình đồ hoạ 115 IV. Đặt màu trên màn hình đồ hoạ 115 V. Cửa sổ trong chế độ đồ hoạ 115 VI. Viết chữ trong chế độ đồ họa 116 VII. Vẽ các hình cơ bản 116 VIII. Tô màu các hình 117 IX. Các kỹ thuật tạo hình chuyển động 119 Bài tập mẫu 120 Bài tập tự giải 141 Mục lục 143
Tài liệu đính kèm: