Giáo trình Bài tập Pascal
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).
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
File đính kèm:
- Giao trinh Bai tap Pascal.doc