Hướng dẫn học pascal lớp 11 năm 2024

  • 1. HỒNG PHƯỚC (Bổ trợ môn Tin học 11) 08/2014
  • 2. của bản thân như một cái rễ cây. Chúng nhanh chóng phát triển và ghìm chặt bạn tại một chỗ.
  • 3. ngữ lập trình cấp cao do Niklaus Wirth, giáo sư điện toán trường đại học Kỹ thuật Zurich (Thụy Sĩ) thiết kế và công bố vào năm 1971 và đặt tên là Pascal để tưởng niệm nhà Toán học và Triết học nổi tiếng Blaise Pascal (người Pháp). Ban đầu, Pascal là một ngôn ngữ được hướng để dùng trong giảng dạy về lập trình có cấu trúc, và nhiều thế hệ sinh viên đã vào nghề thông qua việc học Pascal như ngôn ngữ vỡ lòng trong các chương trình học đại cương. Nhiều biến thể của Pascal ngày nay vẫn còn được sử dụng khá phổ biến, cả trong giảng dạy lẫn trong công nghiệp phát triển phần mềm. Ngày nay, ngôn ngữ lập trình Pascal được sử dụng để giảng dạy trong các trường phổ thông, đặc biệt là ở môn Tin học lớp 8 và Tin học lớp 11. Ngoài ra, Pascal còn được sử dụng trong các ứng dụng thực tế trong cuộc sống như lập trình trong các ngành kĩ thuật, công nghiệp. Với mong muốn giúp các bạn có được những kiến thức cơ bản nhất về ngôn ngữ lập trình cơ bản này, tạo tiềm đề học tập nghiên cứu về sau, nên tôi biên soạn ra quyển sách này. Được cấu trúc gồm các phần Lí thuyết, Bài tập vận dụng, Ôn tập, Mở rộng, mong rằng sẽ giúp đỡ cho các bạn, nhất là trong môn Tin học lớp 11. Chân thành cảm ơn các thầy cô đã từng giảng dạy tôi, cho tôi những kiến thức cơ bản nhất, để tôi có đủ vốn kiến thức biên soạn ra quyển sách này. Tuy nhiên, với vốn kiến thức có hạn, khả năng lập trình hạn chế, nên trong quá trình biên soạn chắc chắn sẽ gặp sai sót, rất mong sự đóng góp từ các bạn. THPT Chuyên Hùng Vương – Bình Dương Tháng 08 năm 2014 Nguyễn Trọng Minh Hồng Phước Pascal
  • 5. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 1 CHƯƠNG 1. MỘT SỐ KHÁI NIỆM VỀ NGÔN NGỮ LẬP TRÌNH BÀI 1: KHÁI NIỆM Chương trình dịch: chương trình đặc biệt có chức năng chuyển đồi chương trình được viết bằng ngôn ngữ lập trình bậc cao thành chương trình thực hiện được trên máy tính. Chương trình dịch có hai loại: thông dịch và biên dịch. - Thông dịch (interpreter): + Kiểm tra tính đúng đắn của câu lệnh tiếp theo trong chương trình nguồn. + Chuyển đổi thành câu lệnh trong ngôn ngữ máy. + Thực hiện các câu lệnh vừa chuyển đổi. - Biên dịch (compiler): + Duyệt, phát hiện lỗi, kiểm tra tính đúng đắn của các câu lệnh trong chương trình nguồn. + Dịch chương trình nguồn thành chương trình đích có thể thực hiện trên máy tính và có thể lưu trữ. BÀI 2: CÁC THÀNH PHẦN CƠ BẢN CỦA NGÔN NGỮ LẬP TRÌNH I/ Thành phần cơ bản: - Bảng chữ cái: các chữ cái in thường và in hoa của bảng chữ cái tiếng Anh, 10 chữ số Ả-rập, các kí tự đặc biệt (+, -, *, /,…). - Cú pháp: là bộ quy tắc để viết chương trình. - Ngữ nghĩa: xác định ý nghĩa theo tác cần phải thực hiện, ứng với tổ hợp kí tự dựa vào ngữ cảnh của nó. II/ Một số khái niệm: - Tên: không chứa dấu cách, bắt đầu bằng chữ số, chứa các kí tự không hợp lệ. + Tên dành riêng: program, uses, const, type, var,… + Tên chuẩn: abs, integer, real, sqr, longint,… + Tên do người lập trình đặt: delta, VD,… - Hằng: là đại lượng có giá trị không đổi trong suốt quá trình thực hiện chương trình, gồm hằng số học (vd: 2, 0, -2.236E01,…), hằng lô-gic (true hoặc false), hằng xâu (vd: ‘information’, ‘lop 11L’,…). - Biến: là đại lượngđể lưu trữ giá trị và có thể thay đổi trong quá trình thực hiện chương trình. - Chú thích: được đặt trong {…} hoặc (*…*). CHƯƠNG II. CHƯƠNG TRÌNH ĐƠN GIẢN BÀI 1: CẤU TRÚC CHƯƠNG TRÌNH I/ Phần khai báo: - Tên chương trình: Program tên_chương_trình; - Thư viện: Uses tenthuvien; Chú ý: đối với thư viện CRT, muốn xoá tất cả những gì đang có trên màn hình ta dùng lệnh ClrScr; - Nhãn: Label lệnh1, lệnh2; - Hằng: Const hằng=trị_hằng;
  • 6. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 2 - Kiểu dữ liệu tự tạo: Type = ; - Biến: Var tên_biến:kiểu_dữ_liệu; Chú ý: thứ tự khai báo như trên là bắt buộc cho mọi chương trình. II/ Phần thân chương trình: Begin [] End. III/ Ví dụ chương trình đơn giản: 1/ Ví dụ 1: program VD1; begin writeln(‘Hello’); end. 2/ Ví dụ 2: program VD2; uses crt; begin clrscr; write(‘Xin chao cac ban’); readlm; end. BÀI 2: CÁC KIỂU DỮ LIỆU CHUẨN I/ Kiểu nguyên: Kiểu Bộ nhớ lưu trữ Phạm vi Byte 1 byte 0 đến 255 Integer 2 byte -215 đến 215 -1 Word 2 byte 0 đến 216 -1 Longint 4 byte -231 đến 231 -1 Shortint 1 byte -128 đến 127 - Kiểu Byte và Word không có thuộc tính dấu. - Các phép toán trên số nguyên: 1/ Các phép toán số học: +, -, *, /. 2/ Phép chia: + Phép chia hai số nguyên cho kết quả là một số thực. + Phép chia lấy phần nguyên: x Div y; Vd: 15 Div 2 = 7. + Phép chia lấy phần dư: x Mod y; Vd: 15 Mod 2 = 1. 3/ Tính chẵn/lẻ: Odd(x); True: x là số lẻ, False: x là số chẵn. 4/ Lấy số đứng trước: Pred(x); Vd: Pred(2) = 1. 5/ Lấy số đứng sau: Succ(x); Vd: Succ(2) = 3. 6/ Phép toán quan hệ: <>, =, >=, <=, >, <. - Xử lí số nguyên dưới dạng nhị phân: Các phép toán lô-gic:
  • 7. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 3 + x And y: cho giá trị 1 nếu x, y đều là 1. + x Or y: cho giá trị 0 nếu x, y đều là 0. + not x: cho giá trị ngược lại giá trị của x. + x Xor y: cho giá trị 1 nếu x, y có giá trị khác nhau. Bảng chân trị: X Y X And Y X Or Y Not X Not Y X Xor Y 0 0 0 0 1 1 0 0 1 0 1 1 0 1 1 0 0 1 0 1 1 1 1 1 1 0 0 0 - Các phép toán chuyển dịch số học: Cho x, n € N+ + x Shl n: dịch chuyển sang trái số nguyên x đi n bit, bằng phép nhân x*2n . + x Shr n: dịch chuyển sang phải số nguyên x đi n n bit, bằng phép chia x Div 2n . II/ Kiểu thực: Kiểu Bộ nhớ lưu trữ Phạm vi Single 4 byte 1,5.10-45 đến 3,4.1038 Real 6 byte 2,9.10-39 đến 1,7.1038 Double 8 byte 5.10-324 đến 1,7.10308 Extended 10 byte 1,9.10-4951 đến 1,1.104932 1/ Các phép toán số học, quan hệ: (như số nguyên). 2/ Các hàm: Cho x € R: - Abs(x): giá trị tuyệt đối cùa x. - Sqr(x): giá trị bình phương của x. - Sin(x), Cos(x), Arctan(x): giá trị sin(x), cos(x), arctan(x) (rad). - Ln(x): giá trị logarit theo cơ số e của x. - Exp(x): giá trị luỹ thừa của x theo cơ số e. - Sqrt(x): giá trị căn bậc hai của x. - Trunc(x): giá trị phần nguyên của x. - Round(x): giá trị phần nguyên được làm tròn của x. III/ Kiểu kí tự: Kiểu Bộ nhớ lưu trữ Phạm vi Char 1 byte 256 kí tự mã ASCII Các hàm xử lí kí tự: - Ord(x): trả về mã số ASCII của kí tự x. - Chr(n): trả về kí tự tương ứng của mã số n trong bảng mã ASCII. - Upcase(x): chuyển kí tự thường thành kí tự hoa. - Pred(x): cho kí tự đứng trước x. - Succ(x): cho kí tự đứng sau x. IV/ Kiểu chuỗi hay xâu kí tự: Kiểu chuỗi có chiều dài 255. Một chuỗi được viết trong một cặp dấu nháy đơn. Vd: ‘Truong THPT Chuyen Hung Vuong – Binh Duong’. Khai báo: Var :String[độ_dài_chuỗi]; V/ Kiểu lô-gic: - Các giá trị: True, False. - Quan hệ thứ tự: False < True.
  • 8. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 4 - Các phép toán: (giống số nguyên). BÀI 3: THỦ TỤC CHUẨN VÀO/RA I/ Thủ tục viết dữ liệu ra màn hình: - Viết dữ liệu ra màn hình và không có xuống dòng: Write(Item1, Item2,…); - Viết dữ liệu ra màn hình và có xuống dòng: Writeln(Item1, Item2,…); Chú ý: Item1, Item2,… có thể là kí tự, chuỗi kí tự, biến, hàm, biểu thức. II/ Thủ tục vào dữ liệu từ bàn phím: - Vào dữ liệu và không có xuống dòng: Read(biến 1, biến 2,…); - Vào dữ liệu rồi di chuyển con trỏ xuống đầu dòng kế: Readln(biến 1, biến 2,…); III/ Phép gán: tên_biến:=biểu_thức; Chú ý: biến và biểu thức phải cùng kiểu. IV/ Câu lệnh ghép: ghép các lệnh thành một khối: begin ; end; V/ Định dạng hiển thị: Write(tên_biến, biểu_thức:độ_rộng:số_chữ_số_thập_phân); Writeln(tên_biến, biểu_thức:độ_rộng:số_chữ_số_thập_phân);  Số nguyên: - Khai báo: var n:integer; - Hiển thị độ rộng của trường ra là 4 và canh phải: writeln(n:4);  Số thực: - Khai báo: var x:real; - Hiển thị độ rộng của trường ra là 8, lấy 2 số lẻ phần thập phân và canh phải: writeln(x:8:2); BÀI TẬP 1) Viết các biểu thức toán học dưới đây trong Pascal: 𝑎) (𝑥 + 𝑦)/(𝑥 − 𝑦) ; 𝑏) 𝑏2−4𝑎𝑐 2𝑎 ; 𝑐) | 𝑥 + 𝑦| + log2 𝑥 ; 𝑑) (1 + 𝑧) 𝑥+ 𝑦 𝑧 𝑎− 1 1+𝑥3 ; 𝑒) 2𝑐𝑜𝑠𝑥 + 3𝑠𝑖𝑛𝑦 Giải: a) (x+y)/(x-y). b) (sqr(x)-4*a*c)/(2*a). c) Ta có: logax=ln(x)/ln(2). Abs(x+y)+ln(x)/ln(2). d) (1+z)*((x+y/z)/(a-1/(1+x*x*x))). e) 2*cos(x)+3*sin(y). 2) Viết các biểu thức từ dạng toán học sang Pascal: 𝑎) 𝑒 𝑦 + 5(2𝑥+5) 𝑐𝑜𝑠𝑥 ; 𝑏) √ 𝑥 + √ 𝑥 + √ 𝑥 ; 𝑐) 𝑥3 + log2( 𝑥4 + 2) − √ 𝑥 − 4 ; 𝑑) 𝑥2 + 𝑦2 ≤ 𝑅2 ; 𝑒) 100 ≥ 𝑁 > 0 ; 𝑓) |sin 𝜋𝑥 2 | < 1 2 Giải:
  • 9. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 5 a) Exp(y)+exp((2x+5)*ln(5))*cos(x). b) Sqrt(x+sqrt(x+sqrt(x))). c) Exp(3*ln(x))+ln(exp(4*ln(x))+2)/ln(2)-sqrt(x-4). d) Sqr(x)+sqr(y) <= sqr(R). e) (0
  • 10. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 6 usescrt; var t:integer; begin clrscr; write(‘t= ‘); readln(t); writeln(‘Khoang cach la: ‘,20*t,’ km’); readln; end. 7) Lập trình nhập từ bàn phím toạ độ ba đỉnh A, B, C của tam giác ABC. - Tính và đưa ra diện tích tam giác theo công thức Hê-rông? - Tính và đưa ra độ dài các đường cao ha, hb, hc? Giải: program baitap; uses crt; var xa,ya,xb,yb,xc,yc:real; p,s,ha,hb,hc:real; a,b,c:real; begin clrscr; write(‘Toa do diem A: ‘); readln(xa,ya); write(‘Toa do diem B: ‘); readln(xb,yb); write(‘Toa do diem C: ‘); readln(xc,yc); a:=sqrt(sqr(xb-xc)+sqr(yb-yc)); b:=sqrt(sqr(xa-xc)+sqr(ya-yc)); c:=sqrt(sqr(xb-xa)+sqr(yb-ya)); p:=(a+b+c)/2; s:=sqrt(p*(p-a)*(p-b)*(p-c)); ha:=2*s/a; hb:=2*s/b; hc:=2*s/c; writeln(‘Dien tich tam giac = ‘,s:8:2); writeln(‘ha= ‘,ha:8:2,’ hb= ‘,hb:8:2,’ hc= ‘,hc:8:2); readln; end. 8) Lập trình nhập từ bàn phím hai số thực a và b, tính và đưa ra màn hình: - Trung bình cộng các bình phương của hai số đó? - Trung bình cộng các giá trị tuyệt đối của a và b? Giải: program baitap; uses crt; var a,b,kq:real; begin clrscr; write(‘Nhap a, b = ‘); readln(a,b); kq:=(sqr(a)+sqr(b))/2; writeln(‘Trung binh cong cac binh phuong: ‘,kq:8:2);
  • 11. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 7 kq:=(abs(a)+abs(b))/2; writeln(‘Trung binh cong cac gia tri tuyet doi: ‘,kq:8:2); readln; end. 9) Lập trình nhập từ bàn phím hai số nguyên khác 0 M và N (M, N<=32767). Tính tổng, hiệu, tích, thương của hai số đó và đưa ra màn hình dưới dạng: =. 10)Lập trình và đưa ra màn hình diện tích hình vành khuyên có bán kính ngoài là R1 và bán kính trrong là R2 (R1, R2 R, 0
  • 12. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 8 x2:=-b/a-x1; writeln(‘x1 = ‘,x1:8:2,’ x2 = ‘,x2:8:2); readln; end. 13)Viết chương trình nhập vào số a (a>0) rồi tính diện tích phần tô màu trong hình sau: 14)Lập trình tính và đưa ra màn hình vận tốc khi chạm đất của một vật rơi tự do từ độ cao h, lấy g = 10 m/s2 ? 15)Viết chương trình nhập vào một kí tự hoa sau đó hiển thị dạng chữ thường của nó? Giải: program baitap; uses crt; var ch:char; begin clrscr; write(‘Nhap vao chu hoa: ‘); readln(ch); writeln(‘Chu thuong tuong ung la: ‘,chr(ord(ch)+32)); readln; end.  Chú ý: chr(n) =

    n. 16)Viết chương trình tính chu vi và diện tích của hình chữ nhật, hình vuông, hình tròn, tam giác vuông (thường)? 17)Viết chương trình chuyển đổi số nguyên (đơn vị giây) sang dạng: … giờ … phút … giây? Giải: program baitap; uses crt; var gio,phut,giay:integer; begin clrscr; write(‘Nhap vao so giay: ‘); readln(giay); gio:=giay div 3600; phut:=giay mod 3600 div 60; eriteln(giay,’ giay = ‘,gio,’ gio ‘,phut,’ phut ‘,giay mod 360 mod 60,’ giay’); readln; end. 18)Viết chương trình tính và đưa ra giá trị biểu thức: 𝑎) 𝐴 = 2𝑒 𝑥+𝑦 𝑥3+𝑦2 ; 𝑏) 𝐵 = √8 1−𝑒 𝑥 ; 𝑐) 2 cos 𝑥 + 3 sin 𝑦 ; 𝑑) 𝑏2−4𝑎𝑐 2𝑎 𝑒) | 𝑥 + 𝑦| + log2 𝑥 ; 𝑓) (1 + 𝑧) 𝑥+ 𝑦 𝑧 1 1+𝑥3 ; 𝑔) √−8 3 1+𝑒 𝑥 19)Viết chương trình nhập vào một số nguyên có 3 chữ số, sau đó in ra tổng các chữ số?

  • 13. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 9 20)Viết chương trình nhập vào số nguyên có 3 chữ số, sau đó in ra số ngược lại? Giải: program baitap; uses crt; var n,a,b,c,s:integer; begin clrscr; write(‘Nhap vao so nguyen: ‘); readln(n); a:=n div 100; b:=(n mod 100) div 10; c:=n mod 10; s:=c*100+b*10+a; writeln(‘So nguoc lai voi ‘,n,’ la: ‘,s); readln; end. 21)Viết chương trình hoán vị hai số nguyên a và b? (Gợi ý: sử dụng biến tạm) 22)Viết chương trình in ra nhãn của một quyển tập theo mẫu: Truong:………………………………………. Lop:……………………. Tap:………………. Ten:…………………………………………... Nien khoa: 20… - 20… 23)Viết chương trình nhập vào 2 số nguyên và tính giá trị biểu thức ab . Tương tự: (ab )c , [(ab )c ]d ? (Gợi ý: ab = exp(b*ln(a)) với a>0). 24)Nhập vào số giờ, phút, giây, sau đó nhập thêm số giây và cho biết số giờ, phút, giây mới? Giải: program baitap; uses crt; var gio,phut,giay:integer; kq1,kq2,them:integer; begin clrscr; write(‘Nhap so gio: ‘); readln(gio); write(‘Nhap so phut: ‘); readln(phut); write(‘Nhap so giay: ‘); readln(giay); kq1:=gio*3600+phut*60+giay; write(‘Nhap so giay them: ‘); readln(them); kq2:=kq1+them; writeln(‘So gio moi la: ‘,kq2 div 3600); writeln(‘So phut moi la: ‘,kq2 mod 3600 div 60); writeln(‘So giay moi la: ‘,kq2 mod 3600 mod 60); readln; end. 25)Viết chương trình đổi độ sang radian và ngược lại, biết:
  • 14. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 10 𝑟𝑎𝑑𝑖𝑎𝑛 = độ∗𝑝𝑖 180 độ = 𝑟𝑎𝑑𝑖𝑎𝑛∗180 𝑝𝑖 26)Nhập vào số tiền muốn đổi hoặc rút ra từ ngân hàng. Cho biết số lượng giấy bạc có mệnh giá 100000, 50000, 20000, 10000, 5000, 1000 được nhận sao cho số lượng giấy bạc có mệnh giá cao nhất được đổi nhiều nhất? Giải: program baitap; uses crt; var n:longint; kq1,kq2,kq3,kq4,kq5,kq6,kq7,kq8:integer; Begin clrscr; writeln(‘Nhap vao so tien can doi: ‘); readln(n); kq1:=n div 100000; kq2:=n mod 100000; kq3:=kq2 div 50000; kq4:=kq2 mod 50000 div 20000; kq5:=kq2 mod 50000 mod 20000; kq6:=kq5 div 10000; kq7:=kq5 mod 10000 div 5000; kq8:=kq5 mod 10000 mod 5000; writeln(‘So to giay bac 100000 VND la: ‘,kq1); writeln(‘So to giay bac 50000 VND la: ‘,kq3); writeln(‘So to giay bac 20000 VND la: ‘,kq4); writeln(‘So to giay bac 10000 VND la: ‘,kq6); writeln(‘So to giay bac 5000 VND la: ‘,kq7); writeln(‘So to giay bac 1000 VND la: ‘,kq8); readln; end. ĐỌC THÊM: Trang trí màu nền và màu chữ trong Pascal: - Khai báo: uses crt; - Các thủ tục trình bày màn hình:  Di chuyển con trỏ đến cột X(1-80) và dòng Y(1-25): GotoXY(X,Y);  Xoá màn hình: Clrscr;  Xóa từ con trỏ đến hết dòng: ClrEol;  Thiết lập màu cho kí tự: TextColor(tên màu hoặc mã màu);  Thiết lập màu cho nền của màn hình: TextBackGround(tên màu hoặc mã màu);  Mã màu và tên màu: Mã màu Tên màu Mã màu Tên màu 0 Black 8 Dark Grey 1 Blue 9 Light Blue 2 Green 10 Light Green 3 Cyan 11 Light Cyan 4 Red 12 Light Red 5 Magenta 13 Light Magenta
  • 15. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 11 6 Brown 14 Yellow 7 Light Grey 15 White CHƯƠNG III. CẤU TRÚC RẼ NHÁNH VÀ LẶP BÀI 1: CẤU TRÚC RẼ NHÁNH I/ Rẽ nhánh dạng thiếu: If <điều kiện> Then ; Nếu điều kiện có giá trị true thì thực hiện câu lệnh II/ Rẽ nhánh dạng đầy đủ: If <điều kiện> Then Else ; Nếu điều kiện có giá trị là true thì thực hiện câu lệnh 1, ngược lại nếu điều kiện có giá trị là false thì thực hiện câu lệnh 2. Lưu ý: Trước Else không có dấu chấm phẩy “;”. III/ Lưu đồ hoạt động: Dạng 1 Dạng 2 BÀI 2: CẤU TRÚC LẶP I/ Lặp với số lần biết trước: - Có số lần lặp xác định trước. - Sau khi thực hiện thân vòng lặp tự động tăng (giảm) biến đếm một đơn vị. - Cú pháp: Dạng 1: Biến đếm tăng dần (dạng lặp tiến): For := To Do ; Dạng 2: Biến đếm giảm dần (dạng lặp lùi): For := Downto Do ; - Biến đếm là biến đơn, có kiểu nguyên. - Giá trị đầu, giá trị cuối là các biểu thức cùng kiểu với biến đếm và giá trị đầu phải nhỏ hơn hoặc bằng giá trị cuối. II/ Lặp với số lần chưa biết trước: - Có số lần lặp không xác định. - Kiểm tra điều kiện tiếp tục vòng lặp ở đầu vòng lặp. Cú pháp: While <điều kiện> Do ; - Điều kiện là biểu thức lô-gic. - Nếu điều kiện có giá trị True thì thực hiện thân vòng lặp và ngược lại. - Câu lệnh là một câu lệnh đơn hoặc ghép. III/ Vòng lặp Repeat…Until…: - Có số lần lặp không xác định. - Kiểm tra điều kiện dừng vòng lặp ở cuối vòng lặp.
  • 16. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 12 Cú pháp: Repeat Until <điều kiện>; - Điều kiện có giá trị kiểu lô-gic boolean (True/False). - Nếu điều kiện có giá trị False thì thực hiện lại thân vòng lặp và ngược lại. BÀI 3: CÂU LỆNH LỰA CHỌN CASE…OF… I/ Dạng 1 (không có Else): Case Of : ; : ; […] : ; End; II/ Dạng 2 (có Else): Case Of : ; : ; […] : Else ; End; Lưu ý: khi có nhiều giá trị của cho phép thực hiện cùng một câu lệnh thì có thể sắp xếp các giá trị đó trên cùng một hàng, ngăn cách nhau bởi dấu phẩy và chỉ viết câu lệnh một lần mà thôi thay cho việc phải viết nhiều lần. Ví dụ: ,,…,:; BÀI TẬP  Bài 1: Viết chương trình nhập vào ba số và cho biết nó có phải là bộ số Pithagore không? Giải: program bt; uses crt; var a,b,c:integer; a2,b2,c2:longint; begin clrscr; write(‘Nhap a,b,c = ‘); readln(a,b,c); a2:=a; b2:=b; c2:=c; a2:=a2*a; b2:=b2*b; c2:=c2*c; if (a2=b2+c2) or (b2=a2+c2) or (c2=a2+b2) then writeln(‘La bo so Pithagore’) else writeln(‘Khong phai la bo so Pithagore’); readln; end.  Bài 2: Viết câu lệnh rẽ nhánh và tính: 𝑧 = { 𝑥2 + 𝑦2 , 𝑛ế𝑢 𝑥2 + 𝑦2 ≤ 1 𝑥 + 𝑦, 𝑛ế𝑢 𝑥2 + 𝑦2 > 1 𝑣à 𝑦 ≥ 𝑥 0,5 , 𝑛ế𝑢 𝑥2 + 𝑦2 > 1 𝑣à 𝑦 < 𝑥 Giải: program Bt;
  • 17. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 13 uses crt; var x,y,z:integer; begin clrscr; write(‘Nhap x,y = ‘); readln(x,y); if (x*x+y*y<=1) then z:=x*x+y*y; if (x*x+y*y>1) and (y>=x) then z:=x+y; if (x*x+y*y>1) and (y 2. 10−2 . Giải: a) program Bt; uses crt; var x:real; n:integer; begin clrscr; x:=0; for n:=1 to 30 do x:=x+1/n; writeln(‘X = ‘,x:5:2); readln; end. b) (Gợi ý) y:=0; for n:=1 to 50 do y:=y+n/(n+1); c) (Gợi ý) z:=0; n:=2; while ((n-1)/n/(n+1)>2E-2) do begin z:=Z+(n-1)/n/(n+1); n:=n+1; end;  Bài 4: Nhập vào ba số nguyên, tìm số lớn nhất? Giải: program bt; uses crt; var a,b,c,max:integer; begin clrscr; write(‘Nhap vao ba so nguyen: ‘); readln(a,b,c); max:=a;
  • 18. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 14 if maxc) and (b+c>a) and (c+a>b) then begin write(‘Day la mot tam giac ’); if (a=b) and (b=c) then writeln(‘deu’) else if (a=b) or (b=c) or (c=a) then writeln(‘can’) else if (a*a+b*b=c*c) or (a*a+c*c=b*b) or (b*b+c*c=a*a) then writeln(‘vuong’) else writeln(‘thuong’); end else writeln(‘Khong the tao thanh tam giac!’); readln; end.  Bài 6: Viết chương trình xếp loại học tập của học sinh dựa vào điểm trung bình như sau: + ĐTB ≥ 8.0: giỏi; + 6.5 ≤ ĐTB ≤ 8.0: khá; + 5.0 ≤ ĐTB ≤ 6.5: trung bình; + ĐTB ≤ 5.0: yếu. Giải: program bt; uses crt; var dtb:real; begin clrscr; write(‘Nhap vao DTB: ‘); readln(dtb); if dtb>=8.0 then writeln(‘Xep loai gioi’) else if dtb>=6.5 then writeln(‘Xep loai kha’) else if dtb>=5.0 then writeln(‘Xep loai trung binh’) else writeln(‘Xep loai yeu’); readln; end.  Bài 7: Lập trình để giải bài toán cổ sau: “Vừa gà vừa chó, Bó lại cho tròn, Ba mươi sáu con, Một trăm chân chẵn”
  • 19. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 15 Hỏi có bao nhiêu con mỗi loại? Giải: program bt; uses crt; var ga,cho:integer; begin clrscr; for ga:=1 to 35 do for cho:=1 to 35 do if (ga+cho=36) and (2*ga+4*cho=100) then begin writeln(‘So ga la: ‘,ga,’ con’); writeln(‘So cho la: ‘,cho,’ con’); end; readln; end.  Bài 8: Lập trình để giải phương trình bậc nhất 𝑎𝑥 + 𝑏 = 0, có các trường hợp sau: + a ≠ 0: phương trình có 1 nghiệm x = -b/a. + a = 0 và b ≠ 0: phương trình vô nghiệm. + a = 0 và b = 0: phương trình vô định. Giải: program bt; uses crt; var a,b:real; begin clrscr; write(‘a, b = ‘); readln(a,b); if a<>0 then writeln(‘Nghiem x = ‘,-b/a:5:2) else if b<>0 then writeln(‘Phuong trinh vo nghiem’) else writeln(‘Phuong trinh vo dinh’); readln; end.  Bài 9: Lập trình giải phương trình bậc hai 𝑎𝑥2 + 𝑏𝑥 + 𝑐 = 0 ? Giải: program bt; uses crt; var a,b,c,d,x1,x2:real; begin clrscr; write(‘a, b, c = ‘); readln(a,b,c); d:=sqr(b)-4*a*c; if d>0 then begin x1:=(-b+sqrt(d))/(2*a); x2:=(-b-sqrt(d))/(2*a);
  • 20. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 16 writeln(‘x1 = ‘,x1:5:2,’ x2 = ‘,x2:5:2); end else if d=0 then writeln(‘x = ‘,-b/(2*a):5:2) else writeln(‘Phuong trinh vo nghiem’); readln; end.  Bài 10: Lập trình để giải hệ phương trình tuyến tính sau: { 𝑎𝑥 + 𝑏𝑦 = 𝑐 𝑑𝑥 + 𝑒𝑦 = 𝑓 (𝑎, 𝑏, 𝑐, 𝑑, 𝑒, 𝑓 ≠ 0) Giải: program Bt; uses crt; var a,b,c,d,e,f,d1,dx,dy:real; begin clrscr; write(‘a, b, c = ‘); readln(a,b,c); write(‘d, e, f = ‘); readln(d,e,f); d1:=a*e-b*d; dx:=c*e-b*f; dy:=a*f-c*d; if (d1=0) and (dx=0) then writeln(‘Hpt vo dinh’) else if (d1=0) and (dx<>0) then writeln(‘Hpt vo nghiem’) else if (d1<>0) then writeln(‘x = ‘,dx/d1:5:2,’ ‘,’y = ‘,dy/d1:5:2); readln; end.  Bài 11: Viết chương trình nhập một kí tự, nếu kí tự nhập vào là kí tự thường thì in ra kí tự hoa tương ứng và ngược lại? Giải: program bt; uses crt; var ch:char; begin clrscr; write(‘Nhap ki tu: ‘); readln(ch); if (ord(ch)>=41) and (ord(ch)<=90) then writeln(chr(ord(ch)+32)) else if (ord(ch)>=97) and (ord(ch)<=122) then writeln(chr(ord(ch)-32)) else writeln(‘Ki tu ban nhap khong hop le!!!’); readln; end.  Bài 12: Viết chương trình tính tổng 100 số tự nhiên đầu tiên? Giải: uses crt; var i:integer; s:longint; begin clrscr; s:=0; for i:=1 to 100 do s:=s+i;
  • 21. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 17 writeln(‘Sum = ‘,s); readln; end.  Bài 13: Viết chương trình tính các tổng sau: 𝑎)1 + 3 + 5 + ⋯ + 𝑛 𝑏)2 + 4 + 6 + ⋯ + 𝑛 𝑐)1 + 22 + 32 + ⋯ + 𝑛2 𝑑)1 + 1 2 + 1 3 + ⋯ + 1 𝑛 Hướng dẫn: S:=0; a) for i:=1 to n do if (i mod 2=1) then s:=s+i; b) for i:=1 to n do if (i mod 2=0) then s:=s+i; c) for i:=1 to n do s:=s+sqr(i); d) for i:=1 to n do s:=s+1/n; writeln(‘Sum = ‘,s);  Bài 14: Viết chương trình in ra bảng nhân n, với n được nhập từ bàn phím? Hướng dẫn: for i:=1 to 10 do begin for j:=2 to 9 do write(j:2,’ x ‘,i:2,’ = ‘,j*i:2); writeln; end;  Bài 15: Một người gủi tiền ngân hàng với số tiền ban đầu là A (đơn vị: triệu đồng), lãi suất mỗi tháng là k%. Hãy cho biết số tiền người đó rút ra sau khoảng thời gian t tháng biết rằng tiền lãi được tính lãi luỹ kế theo chu kì c tháng, nghĩa là sau mỗi tháng lãi suất sẽ được cộng vào tiền gốc nhưng đúng chu kì c tháng mới cho phép được rút? Giải: program bt; uses crt; var tiengoi,laisuat,tienco,y:real; thang,chuky,i:integer; begin clrscr; write(‘Nhap so tien goi: ‘); readln(tiengoi); write(‘Nhap he so lai suat: ‘); readln(laisuat); write(‘Nhap so thang: ‘); readln(thang); write(‘Nhap chu ki: ‘); readln(chuky); tienco:=tiengoi; for i:=1 to thang do begin tienco:=tienco+tienco*laisuat/100; if (i mod chuky=0) then y:=tienco; end; writeln(‘So tien nhan duoc la: ‘,y); readln; end.
  • 22. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 18  Bài 16: Viết chương trình đưa ra màn hình ước số chung lớn nhất của hai số nguyên dương a và b (sử dụng thuật toán Euclide), với a và b được nhập từ bàn phím? Giải: program bt; uses crt; var a,b,r:integer; begin clrscr; write(‘a, b = ‘); readln(a,b); r:=a mod b; while r<>0 do begin a:=b; b:=r; r:=a mod b; end; writeln(‘UCLN = ‘,b); readln; end.  Bài 17: Viết chương trình tính bội chung nhỏ nhất của hai số nguyên dương a và b được nhập từ bàn phím? Hướng dẫn: 𝐵𝐶𝑁𝑁( 𝑎, 𝑏) = 𝑎𝑏 𝑈𝐶𝐿𝑁(𝑎,𝑏)  Bài 18: Viết chương trình kiểm tra một số n được nhập từ bàn phím có phải là số nguyên tố hay không? Giải: program bt; uses crt; var n,i:integer; begin clrscr; write(‘Nhap n = ‘); readln(n); if n<2 then writeln(n,’ khong la so nguyen to’) else for i:=2 to trunc(sqrt(n)) do if n mod i=0 then writeln(n,’ khong la so nguyen to’) else writeln(n,’ la so nguyen to’); readln; end.  Bài 19: Năm 1996 dân số nước ta là A = 75 triệu người, tốc độ tăng dân số là k% một năm. Lập trình in dân số của từng năm cho đến khi dân số tăng s lần so với năm 1996. Chạy chương trình với k = 2,3%; s = 1,5 lần. Giải: program bt; uses crt; const k=0.023; s=1.5; a=75000000;
  • 23. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 19 var tl,tsd,sdt:real; i:integer; begin clrscr; writeln(‘Ket qua so dan tung nam: ‘); tl:=1; tsd:=a; i:=1; while tl<=s do begin sdt:=tsd*k; tsd:=tsd+sdt; tl:=tsd/a; writeln(‘So dan nam thu ‘,i,’ la: ‘,tsd:12:2); inc(i); end; writeln(‘Da dat den khi dan so tang gap ‘,s:0:1,’ lan so voi nam 1996’); readln; end.  Bài 20: Nhập từ bàn phím tuổi của cha và con biết rằng tuổi cha lớn hơn 3 lần tuổi con và tuổi cha và tuổi con phải cùng chẵn hoặc cùng lẻ. Hãy lập trình để trả lời câu hỏi: “Sau bao nhiêu năm nữa thì tuổi cha gấp ba lần tuổi con?”. Giải: program bt; uses crt; var tc,tco,n:word; begin clrscr; write(‘Nhap tuoi cha va con: ‘); readln(tc,tco); n:=0; while tc>3*tco do begin inc(tc); inc(tco); inc(n); end; writeln(‘Sau ‘,n,’ nam nua thi tuoi cha se gap ba lan tuoi con’); readln; end.  Bài 21: Cho hàm: 𝑓( 𝑥) = { 4𝑥2 − 5𝑥 + 1 𝑛ế𝑢 0 ≤ 𝑥 ≤ 1 |𝑥−2| 3(𝑥2+1) 𝑛ế𝑢 𝑥 ≤ 0 ℎ𝑜ặ𝑐 𝑥 > 1 . Viết chương trình đọc vào một số thực x từ bàn phím và in ra màn hình giá trị của f(x).  Bài 22: Viết chương trình nhập vào 3 số a, b, c, sau đó in ra màn hình theo thứ tự tăng dần. Hướng dẫn: tmp:=a; if tmpb then begin
  • 24. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 20 tmp:=a; a:=b; b:=tmp; end; if c>a then writeln(c,’ ‘,a,’ ‘,b) else if c12 then st:=(gv-gh)*30000 else st:=(12-gh)*20000+(gv-12)*30000; writeln(‘So tien phai tra la: ‘,st);  Bài 26: Viết chương trình đọc một số nguyên gồm 4 chữ số (số tạo bởi hai chữ số đầu nhỏ hơn 24, số tạo bởi hai chữ số sau nhỏ hơn 60), rồi hiển thị giờ tương ứng trong ngày. Ví dụ: 0915 -> “9:15 AM”, 1320 -> “1:20 PM”. Hướng dẫn: gi:=n div 100; ph:=n mod 100; if gi>12 then writeln(gi-12,’:’,ph,’ PM’) else writeln(gi,’:’,ph,’ AM’);  Bài 27: Một đường thẳng có thể biểu diễn bởi phương trình 𝑎𝑥 + 𝑏𝑦 + 𝑐 = 0 (𝑎, 𝑏, 𝑐 ∈ 𝑅). Viết chương trình đọc hai bộ số thực trên hai hàng, tương ứng với hai phương trình của hai đường thẳng, sau đó in ra thông báo về quan hệ của hai đường thẳng đó. Giải: program bt; uses crt; var a,b,c,m,n,p:real; ss,tr,vg:boolean; begin write(‘Nhap vao ba he so cua duong thang thu nhat: ‘); readln(a,b,c); write(‘Nhap vao ba he so cua duong thang thu hai: ‘); readln(m,n,p); tr:=(a*n=b*m) and (a*p=c*m); ss:=(a*n=b*m) and (a*p<>c*m); vg:=(a*m+b*n=0); if tr then writeln(‘Hai duong thang trung nhau’) else if ss then writeln(‘hai duong thang song song’) else if vg then writeln(‘hai duong thang vuong goc’) else writeln(‘Hai duong thang cat nhau’);
  • 25. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 21 readln; end.  Bài 28: In ra bảng sau: 1 2 3 4 5 ... 10 11 12 ... 20 ... 91 92 ... 100 Hướng dẫn: for i:=1 to 100 do if i mod 10<>0 then write(i:4) else writeln(i:4);  Bài 29: Viết chương trình in ra màn hình các kí tự mở rộng trong bộ mã ASCII, biết rằng các kí tự mở rộng là các kí tự có mã ASCII từ 128 đến 255. Hướng dẫn: for i:=128 to 255 do write(chr(i):2);  Bài 30: Viết chương trình tìm và xuất ra màn hình các số nằm trong giữa hai số nguyên a và b cho trước (a < b) sao cho các số đó là số chẵn và đồng thời chia hết cho 3? Hướng dẫn: writeln(‘Cac so can tim la:’); for i:=a to b do if (i mod 6=0) then write(i,’ ‘);  Bài 31: Tìm một số có ba chữ số sao cho số đó bằng n lần tổng các chữ số của nó? Hướng dẫn: for a:=1 to 9 do for b:=0 to 9 do for c:=0 to 9 do if 100*a+10*b+c=n*(a+b+c) then writeln(a,b,c);  Bài 32: Viết chương trình tính biểu thức: √ 𝑥 + √ 𝑥 + ⋯ + √ 𝑥 (n lần x). Trong đó n và x được nhập từ bàn phím và n < 100. Hướng dẫn: m:=sqrt(x); for i:=1 to n do m:=m+sqrt(x+m);  Bài 33: Số hoàn thiện (perfect number) là số tự nhiên có tổng các ước số (kể cà số 1) bằng chính nó. Ví dụ: 6 = 1 + 2 + 3. Viết chương trình hiển thị các số hoàn thiện nhỏ hơn 1000. Giải: uses crt; var n,i,j,s:integer; begin clrscr; write(‘N = ‘); readln(n); writeln(‘Cac so hoan thien nho hon ‘,n,’ la: ‘); for i:=2 to n do begin s:=0; for j:=1 to (i div 2) do
  • 26. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 22 if i mod j=0 then s:=s+j; if s=i then write(i,’ ‘); end; readln; end.  Bài 34: Tìm số nguyên lớn nhất thoả mãn các điều kiện: 𝑎)3𝑛5 − 317𝑛 < 5; 𝑏)6𝑛 − 21√ 𝑛 − 1 < 0; 𝑐)𝑒 𝑛 − 2009𝑙𝑜𝑔𝑛 < 0; 𝑑)2𝑛3 − 𝑛2 − 1 > 0. Hướng dẫn: n:=1; a) while 3*sqr(n)*(sqr(n)*n)-317*n<5 do n:=n+1; b) while 6*n-21*sqrt(n)-1<0 do inc(n); c) while exp(n*ln(n))+2009*ln(n)/ln(10)<0 do inc(n); d) while 2*n*sqr(n)-sqr(n)-1>0 do inc(n); writeln(‘N max = ‘,n);  Bài 35: Viết chương trình nhập liên tục các số nguyên n cho đến khi nhập số 0 thì dừng và in ra: a) Có bao nhiêu số nguyên được nhập? b) Số lớn nhất, số nhỏ nhất? c) Tổng các số đã nhập? Giải: uses crt; var dem,max,min,tong,n:integer; begin clrscr; write(‘n =’); readln(n); dem:=0; tong:=0; while n<>0 do begin inc(dem); tong:=tong+n; if dem=1 then begin max:=n; min:=n; end else begin if n>max then max:=n; if n<=min then min:=n; end; write(‘n = ‘); readln(n); end; if dem<>0 then begin writeln(‘Co tat ca ‘,dem,’ so’); writeln(‘So lon nhat la: ‘,max); writeln(‘So nho nhat la: ‘,min);
  • 27. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 23 writeln(‘Tong cac so da nhap la: ‘,tong); end else writeln(‘Chua co so nao duoc nhap!!!’); readln; end.  Bài 36: Viết chương trình tính tổng của n số nguyên dương đầu tiên. Giải: uses crt; var n,i,t:integer; begin clrscr; write(‘n = ‘); readln(n); t:=0; for i:=1 to n do t:=t+i; writeln(‘Tong la: ‘,t); readln; end.  Bài 37: Viết chương trình tính n! Giải: {$N+} progam Giaithua; uses crt; var n,i:integer; gt:extended; begin clrscr; write(‘n = ‘); readln(n); gt:=1; for i:=1 to n do gt:=gt*i; writeln(n,’! = ‘,gt); readln; end. Chú ý: khi muốn tính giai thừa của một số lớn (>10) thì nên sử dụng các kiểu dữ liệu có kích thước lớn (như longint, extended), trong Free Pascal có thể sử dụng kiểu int64 (là kiểu số nguyên lớn nhất) và khai báo thêm chỉ thị {$N+} vào đầu chương trình để định hướng biên dịch nhằm cho chương trình phát sinh mã để sử dụng bộ đồng xử lí số 8087 cho việc tính toán các số thực có kích thước lớn (có thể không cần khai báo thêm chỉ thị :D ).  Bài 38: Viết chương trình nhập vào số nguyên dương n, tính: 𝑆 = 1 + 1 2 + 1 3 + ⋯ + 1 𝑛  Bài 39: Viết chương trình nhập vào số nguyên dương n và là số chẵn, in ra giá trị của tổng sau: 𝑆 = 1 2 + 1 4 + ⋯ + 1 𝑛  Bài 40: Viết chương trình nhập vào các số nguyên dương n và k, in ra giá trị của tổng sau: 𝑆 = 1 + 2 𝑘 + 3 𝑘 + ⋯ + 𝑛 𝑘 .  Bài 41: Viết chương trình nhập vào số nguyên dương n, in ra giá trị của tổng sau: 𝑆 = 1 + 32 + 52 + ⋯ + (2𝑛 + 1)2 .  Bài 42: Viết chương trình nhập vào số nguyên dương n, in ra giá trị của biểu thức sau: 𝑆 = 22 − 42 + 62 − 82 + ⋯ + (−1) 𝑛−1 (2𝑛)2 .
  • 28. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 24  Bài 43: Dùng vòng lặp while viết chương trình in ra một câu hỏi (troll nhau chẳng hạn  ) và chương trình chỉ dừng lại khi người dùng trả lời ‘y’ (Yes). Giải: uses crt; var c:char; begin clrscr; c:=’n’; while (c<>’y’) and (c<>’Y’) do begin writeln(‘Do you love me??? (y,n): ‘); readln(c); end; readln; end.  Bài 44* (đọc thêm): Cho biết khai triển Maclaurin của hàm số sơ cấp ln(x) như sau: ln(1 + 𝑥) = 𝑥 − 𝑥2 2 + 𝑥3 3 + ⋯ + (−1) 𝑛−1 𝑥 𝑛 𝑛 + (−1) 𝑛 𝑥 𝑛+1 (𝑥+1)(1+𝜃𝑥) 𝑛+1 (0 < 𝜃 < 1) Dùng vòng lặp while viết chương trình tính ln(1,5) với độ chính xác 𝜀 = 10−5 . Giải: Dư số: | 𝑅 𝑛(𝑥)| = |(−1) 𝑛 𝑥 𝑛+1 (𝑛+1)(1+𝜃𝑥) 𝑛+1 | ≤ | 𝑥 𝑛+1 𝑛+1 |. Cho x = 0,5 để tính ln(1,5) với độ chính xác đến 10−5 ta phải chọn n sao cho: | (0,5) 𝑛+1 𝑛+1 | ≤ 10−5 . Khi đó: 𝑅 𝑛(0,5) ≤ | (0,5) 𝑛+1 𝑛+1 | ≤ 10−5 . Chương trình: uses crt; const epsi=0,00001; var x.r.s:real; d,n:integer; begin write(‘Nhap x = ‘); readln(x); s:=x; n:=1; r:=sqr(0.5)/2; d:=1; while r>epsi do begin d:=-d; inc(n); s:=s+d*exp(n*ln(n))/n; r:=exp((n+1)*ln(x))/(n+1); end; writeln(‘Khai trien den cap ‘,n’ : ‘); writeln(‘ln(‘,1+x:6:2,’) = ‘,s:8:6); readln; end.  Bài 45*: Cho biết khai triển Maclaurin của các hàm số sơ cấp như sau: 𝑒 𝑥 = 1 + 𝑥 + 𝑥2 2! + ⋯ + 𝑥 𝑛 𝑛! + 𝑒 𝜃𝑥 (𝑛+1)! 𝑥 𝑛+1 (0 < 𝜃 < 1) sin 𝑥 = 𝑥 − 𝑥3 3! + 𝑥5 5! + ⋯ + (−1) 𝑘−1 𝑥2𝑘−1 (2𝑘−1)! + sin(𝜃𝑥+(2𝑘+1) 𝜋 2 ) (2𝑘+1)! 𝑥2𝑘+1 (0 < 𝜃 < 1)
  • 29. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 25 cos 𝑥 = 1 − 𝑥2 2! + 𝑥4 4! + ⋯ + (−1) 𝑘 𝑥2𝑘 (2𝑘)! + cos(𝜃𝑥+(𝑘+1)𝜋) (2𝑘+2)! 𝑥2𝑘+2 (0 < 𝜃 < 1) Dùng vòng lặp while viết chương trình: a) Tính số e với độ chính xác 𝜀 = 10−5 . b) Tính số 𝑒 𝑥 với độ chính xác 𝜀 = 10−5 . c) Tính sin 450 với độ chính xác 𝜀 = 10−5 . d) Tính cos 100 với độ chính xác 𝜀 = 10−5 .  Bài 46: Viết chương trình tạo ra máy tính con có bốn phép tính: cộng, trừ, nhân và chia. Giải: program bt; uses crt; var n:integer; x,y,z:real; begin clrscr; writeln(‘Chuong trinh may tinh con...’); write(‘Nhap hai so thuc: ‘); readln(x,y); writeln(‘1. Phep cong’,’2. Phep tru’,’3. Phep nhan’,’4. Phep chia’); writeln(‘0. Cham dut chuong trinh’); writeln(‘Chon phep toan (1 – 4): ‘); readln(n); case n of 1: begin z:=x+y; writeln(x:6:2,’+’,y:6:2,’=’,z:6:2); end; 2: begin z:=x-y; writeln(x:6:2,’-‘,y:6:2,’=’,z:6:2); end; 3: begin z:=x*y; writeln(x:6:2,’x’,y:6:2,’=’,z:6:2); end; 4: if y=0 then writeln(‘Mau so bang 0, khong chia duoc’) else begin z:=x/y; writeln(x:6:2,’/’,y:6:2,’=’,z:6:2); end; 0: writeln(‘Chao tam biet...’); else writeln(‘Ban da nhap sai so!’); end; readln; end.  Bài 47: Viết chương trình tạo máy tính con có các phép tính trên số nguyên theo menu sau: a) Lấy phần nguyên của phép chia số x cho số y: x DIV y.
  • 30. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 26 b) Lấy phần dư của phép chia số x cho số y: x MOD y. c) Kiểm tra số nhập là lẻ hay chẵn: ODD(x). d) Lấy phần tử đứng sau: SUCC(x). e) Lấy phần tử đứng trước: PRED(x).  Bài 48: Viết chương trình tạo máy tính con có các phép tính trên các số thực theo menu sau: a) Lấy giá trị tuyệt đối của một số thực: ABS(x). b) Bình phương của một số thực: SQR(x). c) Căn bậc hai của một số thực: SQRT(x). d) Làm tròn một số thực: ROUND(x). e) Lấy phần nguyên của một số thực: TRUNC(x).  Bài 49: Viết chương trình tạo máy tính con có các phép tính trên số thực theo menu sau: a) Tính sinx: SIN(x). b) Tính cosx: COS(x). c) Tính arctanx: ARCTAN(x). d) Tính ln(x): LN(x). e) Tính ex : EXP(x).  Bài 50: Viết chương trình tính số ngày của một tháng trong năm, biết rằng: - Tháng 4, 6, 9, 11 có 30 ngày. - Tháng 1, 3, 5, 7, 8, 10, 12 có 31 ngày. - Tháng 2 được tính như sau: + Nếu lấy số năm chia cho 4 có dư số là 0 thì tháng 2 có 29 ngày. + Nếu lấy số năm chia cho 4 có dư số là 1, 2, 3 thì tháng 2 có 28 ngày.  Bài 51: Viết chương trình tính: 𝑣 = { 𝑥 + 𝑦 𝑛ế𝑢 𝑥 > 1 𝑣à 𝑦 > 1 𝑥 − 𝑦 𝑛ế𝑢 𝑥 > 1 𝑣à 𝑦 ≤ 1 −𝑥 + 𝑦 𝑛ế𝑢 𝑥 ≤ 1 𝑣à 𝑦 > 0 −𝑥 − 𝑦 𝑛ế𝑢 𝑥 ≤ 1 𝑣à 𝑦 ≤ 0  Bài 52: Cho cấp số cộng: 𝑎0, 𝑎1, 𝑎2, … , 𝑎 𝑛 trong đó 𝑎 𝑘 = 𝑎 𝑘−1 + 𝑑, k = 1, 2,....Hãy viết chương trình: - Nhập 3 số nguyên 𝑎0, 𝑑 𝑣à 𝑏. - Tìm và đưa ra màn hình số n nguyên không âm nhỏ nhất thoả mãn 𝑎 𝑛 ≥ 𝑏.  Bài 53: Lập trình nhập số thực x và số nguyên dương n từ bàn phím. Tính và đưa ra màn hình giá trị biểu thức sau: 𝑃 = 1 + 2𝑥 + 3𝑥2 + 4𝑥3 + ⋯ + 𝑛𝑥 𝑛−1 + (𝑛 + 1)𝑥 𝑛 ĐỌC THÊM: I/ Hàm KeyPressed: - Dùng hàm KeyPressed của Unit Crt để trả lời câu hỏi: “Có phải vừa có một phím được nhấn từ bàn phím?” - Cú pháp: KeyPressed:boolean; - Trả về True nếu có một phím được nhấn, trả về False cho ngược lại. - Bài tập ví dụ:  Bài 54: Viết chương trình làm đầy màn hình bằng các kí tự “Xx” cho đến khi nhấn một phím từ bàn phím? Giải: uses crt;
  • 31. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 27 begin clrscr; repeat write(‘Xx’); until keypressed; end. II/ Các bài tập chữ chạy:  Bài 55: Viết chương trình in ra giữa màn hình chữ “PASCAL” chạy từ dòng 1 đến dòng 25. Giải: uses crt; var i:integer; begin clrscr; textcolor(red); for i:=1 to 25 do begin clrscr; gotoxy(36,i); write(‘PASCAL’); delay(1000); end; readln; end.  Bài 56: Viết chương trình in ra màn hình chữ “PASCAL” chạy từ cột 1 đến cột 80?  Bài 57: Dùng vòng lặp while viết chương trình in ra giữa màn hình chữ “PASCAL” chạy từ dòng 1 đến dòng 25 rồi lại chạy tiếp từ dòng 1 cho đến khi nhấn một phím bất kì thì dừng lại? Giải: uses crt; var i:integer; t:boolean; begin textcolor(red); i:=1; t:=true; while t do begin clrscr; gotoxy(36,i); write(‘PASCAL’); delay(1000); inc(i); if i=25 then i:=1; if keypressed then t:=false; end; readln; end.  Bài 58: Dùng vòng lặp while viết chương trình in ra giữa màn hình chữ “PASCAL” chạy liên tục từ cột 1 đến cột 80 cho đến khi nhấn một phím bất kì thì dừng lại? Bài 59: Dùng vòng lặp Repeat...Until viết chương trình in ra giữa màn hình chữ “PASCAL” chạy từ dòng 1 đến dòng 25 rồi lại chạy tiếp từ dòng 1 cho đến khi nhấn một phím bất kì thì dừng lại? Giải: uses crt;
  • 32. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 28 var i:integer; t:boolean; begin textcolor(red); i:=1; t:=false; repeat clrscr; gotoxy(36,i); write(‘PASCAL’); delay(1000); inc(i); if i=25 then i:=1; if keypressed then t:=true; until t; readln; end. CHƯƠNG IV: KIỂU DỮ LIỆU CÓ CẤU TRÚC BÀI 1: KIỂU MẢNG I/ Kiểu mảng một chiều: 1. Định nghĩa: Mảng một chiều là dãy hữu hạn các phần tử cùng kiểu. Mảng được đặt tên và mỗi phần tử của nó có một chỉ số. Để mô tả mảng một chiều cần xác định kiểu các phần tử và cách đánh số các phần tử của nó. 2. Khai báo: - Khai báo trực tiếp: Var :Array[] Of ; - Khai báo gián tiếp: Type =Array[] Of ; Var : ; 3. Truy nhập vào một phần tử của mảng: [] . 4. Tìm kiếm trên mảng: a) Dãy thuật tìm kiếm tuần tự: Ta bắt đầu tìm kiếm từ phần tử đầu tiên. Nếu khoá của phần tử này không phải là khoá cần tìm thì ta đến phần tử kế tiếp và cứ như thế cho đến khi nào ta đến phần tử có khoá cần tìm (tìm kiếm thành công) hoặc cho đến khi đi hết danh sách (tìm kiếm thất bại). b) Giải thuật tìm kiếm nhị phân: Để thực hiện dãy thuật tìm kiếm nhị phân thì mảng phải có thứ tự. Để tìm kiếm phần tử có khoá là k ta lần lượt thực hiện các bước sau: - Bước 1: Phạm vi tìm kiếm ban đầu là toàn bộ mảng. - Bước 2: Lấy khoá của phần tử ở chính giữa của phạm vi tìm kiếm gọi là x và đem so sánh với k: nếu x=k thì tìm thấy khoá này, giải thuật kết thúc thành công. Nếu xk thì phạm vi tìm kiếm mới là các phần tử nằm phía sau x. - Bước 3: Nếu tồn tại một phạm vi tìm kiếm mới thì lặp lại bước 2, ngược lại giải thuật kết thúc không thành công, tìm kiếm thất bại. II/ Kiểu mảng hai chiều: 1. Định nghĩa: Mảng hai chiều là bảng các phần tử cùng kiểu. Ví dụ: 1 2 3 4 5 ... (chỉ số cột) 1 5 7 9 3 4 2 2 7 6 3 1 3 7 9 3 8 2
  • 33. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 29 4 1 5 7 4 9 ... (chỉ số hàng) 2. Khai báo: - Khai báo trực tiếp: Var :Array[,] Of ; - Khai báo gián tiếp: Type =Array[,] Of ; Var :; 3. Tham chiếu đến phần tử của mảng hai chiều: [,] . III/ Bộ sinh số ngẫu nhiên: Cú pháp: Randomize; x:=Random(); là một số nguyên kiểu Word. Giá trị trả về x là một số nguyên kiểu Word có giá trị 0 ≤ x ≤ range. BÀI 2: KIỂU XÂU I/ Khái niệm: Xâu là dãy các kí tự trong bộ mã ASCII, mỗi kí tự được gọi là một phần tử của xâu. Số lượng kí tự trong một xâu được gọi là độ dàu của xâu, xâu có độ dài bằng 0 gọi là xâu rỗng. Có thể xem xâu là mảng một chiều mà mỗi phần tử là một kí tự. Các kí tự của xâu được đáng số thứ tự, thường bắt đầu từ 1. Độ dài lớn nhất của xâu không vượt quá 255. II/ Khai báo: Var :String[<độ dài lớn nhất của xâu>]; Chú ý: Trong một xâu có thể bỏ qua phần khai báo độ dài. Khi đó độ dài lớn nhất của xâu sẽ nhận giá trị ngầm định là 255. III/ Tham chiếu đến phần tử của xâu: [] . IV/ Các thao tác xử lí xâu: 1. Phép ghép xâu: Được sử dụng để ghép nhiều xâu thành một, có thể thực hiện phép ghép xâu đối với các hằng và biến xâu. Kí hiệu: + VD: ‘THPT’ + ‘ Chuyen’ + ‘ Hung Vuong’ + ‘ -‘ + ‘ Binh Duong.’ = ‘THPT Chuyen Hung Vuong – Binh Duong.’. 2. Các phép so sánh (=, <>, <, >, <=, >=): Có thứ tự ưu tiên phép tính thấp hơn phép ghép xâu. Quy tắc: xâu A là lớn hơn xâu B nếu kí tự dầu tiên khác nhau giữa chúng kể từ trái sang trong xâu A có mã ASCII lớn hơn. Nếu A và B là các xâu có độ dài khác nhau và A là đoạn đầu của B thì A nhỏ hơn B. Hai xâu được coi là bằng nhau nếu như chúng giống nhau hoàn toàn. V/ Thủ tục và hàm chuẩn để xử lí xâu: - Delete(,,): thực hiện việc xoá n kí tự của biến xâu st bắt đều từ vị trí vt. - Insert(,,): chèn xâu s1 vào xâu s2, bắt đầu từ vị trí vt. - Copy(,,): tạo xâu gồm n kí tự liên tiếp bắt đầu từ vị trí vt của xâu s. - Length(): cho giá trị là độ dài xâu s. - Pos(,): cho vị trí xuất hiện đầu tiên của xâu s1 trong xâu s2. - Upcase(): cho chữ cái in hoa tương ứng với chữ cái trong ch. BÀI 3: KIỂU BẢN GHI I/ Khái niệm: Dữ liệu bản ghi dùng để miêu tả các đối tượng có cùng một số thuộc tính mà các thuộc tính có thể có các kiểu dữ liệu khác nhau. Mỗi thuộc tính của đối tượng tương ứng với một trường của bản ghi. Các trường khác nhau có thể có các kiểu dữ liệu khác nhau. Mổi trường được tham khảo thông qua tên của nó (thay vì thông qua chỉ số như của mảng).
  • 34. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 30 II/ Khai báo: Type =Record : ; : ; […] : ; End; Var : ; III/ Truy cập vào một phần tử của bản ghi: 1. Cú pháp: .; 2. Chú ý: các phép tính thực hiện được trên mỗi trường là các phép tính thực hiện được trên kiểu dữ liệu của trường đó. IV/ Câu lệnh With: Cho phép truy nhập các trường của bản ghi một cách vắn tắt hơn. With Do ; Chú ý: Việc sử dụng câu lệnh With tuy làm chương trình ngắn gọn, vắn tắt hơn, nhưng dễ gây nhầm lẫn, sai sót khi có biến được khai báo cùng với tên trường của bản ghi. V/ Thao tác trên toàn bản ghi: - Có thể dùng phép gán để sao chép giá trị của các trường trong bản ghi này sang các trường tương ứng trong bản ghi khác như sau: :=; - Chú ý: không thể dùng Write, Writeln, Read, Readln để xuất/nhập cho một biến bản ghi mà chỉ có thể dùng cho việc xuất/nhập trên các trường của bản ghi. BÀI TẬP  Bài 1: Viết chương trình tính và đưa ra màn hình bảng nhân? Giải: uses crt; var b:array[1..9,1..10] of integer; i,j:integer; begin clrscr; for i:=1 to 9 do for j:=1 to 10 do b[i,j]:=i*j; for i:=1 to 9 do begin for j:=1 to 10 do write(b[i,j]:4); writeln; end; readln; end.  Bài 2: Viết chương trình tìm phần tử có giá trị lớn nhất trong mảng và đưa ra màn hình chỉ số và giá trị của phần tử tìm được. Nếu có nhiều phần tử có cùng giá trị lớn nhất thì đưa ra phần tử có giá trị nhỏ nhất? Giải: uses crt; const Nmax=100; type ArrInt=array[1..Nmax] of integer; var a:ArrInt; n,i,j:integer;
  • 35. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 31 begin clrscr; write(‘Nhap so luong phan tu cua day so, N = ‘); readln(n); for i:=1 to n do begin write(‘Phan tu thu ‘,i,’ = ‘); readln(a[i]); end; j:=1; for i:=2 to n do if a[i]>a[j] then j:=i; writeln(‘Chi so max: ‘,j); writeln(‘Gia tri max: ‘,a[j]); readln; end.  Bài 3: Tạo mảng ngẫu nhiên gồm n số nguyên rồi sắp xếp dãy số đó? Giải: uses crt; var a:array[1..250] of integer; n,i,j,t:integer; begin clrscr; randomize; write(‘Nhap N = ‘); readln(n); for i:=1 to n do a[i]:=random(300)-random(300); for i:=1 to n do write(a[i]:5); writeln; for j:=n downto 2 do for i:=1 to j-1 do if a[i]>a[i+1] then begin t:=a[i]; a[i]:=a[i+1]; a[i+1]:=t; end; writeln(‘Day so da duoc sap xep:’); for i:=1 to n do write(a[i]:5); writeln; readln; end.  Bài 4: Cho mảng A gồm n phần tử. Hãy viết chương trình tạo mảng B, trong đó B[i] là tổng của i phần tử đầu tiên của A? Giải: uses crt; var a,b:array[1..250] of integer; n,i:integer; begin clrscr;
  • 36. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 32 write(‘Cho biet so luong phan tu cua A, N = ‘); readln(n); for i:=1 to n do begin write(‘A[‘,i,’] = ‘); readln(a[i]); end; b[1]:=a[1]; for i:=2 to n do b[i]:=b[i-1]+a[i]; for i:=1 to n do write(b[i]:6); readln; end.  Bài 5: Viết chương trình nhập họ tên của hai người vào hai biến xâu và đưa ra màn hình xâu dài hơn, nếu bằng nhau thì đưa ra xâu nhập sau? Giải: uses crt; var a,b:string; begin clrscr; write(‘Nhap ho ten nguoi thu nhat: ‘); readln(a); write(‘Nhap ho ten nguoi thu hai: ‘); readln(b); if length(a)>length(b) then writeln(a) else writeln(b); readln; end.  Bài 6: Viết chương trình nhập vào hai xâu từ bàn phím và kiểm tra kí tự đầu tiên của xâu thứ nhất có trùng với kí tự cuối cùng của xâu thứ hai không? Giải: uses crt; var a,b:string; begin clrscr; write(‘Nhap xau thu nhat: ‘); readln(a); write(‘Nhap xau thu hai: ‘); readln(b); if a[1]=b[length(b)] then writeln(‘Trung nhau’) else writeln(‘Khac nhau’); readln; end.  Bài 7: Viết chương trình nhập vào một xâu từ bàn phím và đưa ra màn hình xâu đó nhưng được viết theo thứ tự ngược lại? Giải: uses crt; var a:string; i:integer; begin clrscr; write(‘Nhap xau: ‘); readln(a); for i:=length(a) downto 1 do write(a[i]); readln; end.
  • 37. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 33  Bài 8: Viết chương trình nhập vào từ bàn phím một xâu. Kiểm tra xâu đó có phải là xâu đối xứng hay không? Xâu đối xứng có tính chất: đọc nó từ trái sang phải cũng thu được kết quả giống như đọc từ phải sang trái (còn gọi là xâu palindrome). Giải: uses crt; var a,p:string; i:integer; begin clrscr; write(‘Nhap vao xau: ‘); readln(a); p:=’’; for i:=length(a) downto 1 do p:=p+a[i]; if a=p then writeln(‘Xau la palindrome’) else writeln(‘Xau khong la palindrome’); readln; end.  Bài 9: Nhập vào từ bàn phím một xâu, thay thế tất cả các cụm kí tự “anh” bằng cụm kí tự “em”? (sử dụng hàm pos  )  Bài 10: Viết chương trình nhập vào từ bàn phím thông tin của từng học sinh trong lớp, thực hiện xếp loại và đưa ra màn hình kết quả xếp loại học sinh? Giải: uses crt; type hs=record hoten:string[30]; ngaysinh:string[10]; diachi:string[50]; toan,van:real; xl:char; end; var lop:array[1..60] of hs; n,i:integer; begin clrscr; write(‘Nhap so luong hoc sinh cua lop, N = ‘); readln(n); for i:=1 to n do begin writeln(‘Nhap du lieu ve hoc sinh thu ‘,i); write(‘Ho ten: ‘); readln(lop[i].hoten); write(‘Ngay sinh: ‘); readln(lop[i].ngaysinh); write(‘Dia chi: ‘); readln(lop[i].diachi); write(‘Diem toan: ‘); readln(lop[i].toan); write(‘Diem van: ‘); readln(lop[i].van); if lop[i].toan+lop[i].van>=18 then lop[i].xl:=’A’ else if lop[i].toan+lop[i].van>=14 then lop[i].xl:=’B’ else if lop[i].toan+lop[i].van>=10 then lop[i].xl:=’C’ else lop[i].xl:=’D’; end;
  • 38. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 34 clrscr; writeln(‘Danh sach xep loai hoc sinh trong lop: ‘); for i:=1 to n do writeln(lop[i].hoten:30,’ – Xep loai: ‘,lop[i].xl); readln; end.  Bài 11: Viết chương trình nhập vào mảng A gồm n phần tử (n<10) số nguyên có giá trị tuyệt đối không lớn hơn 100. Hãy cho biết các phần tử của mảng này có lập thành một cấp số cộng hoặc cấp số nhân hay không? Giải: uses crt; var a:array[1..10] of integer; n,i:integer; begin clrscr; write(‘Nhap so luong phan tu cua mang: ‘); readln(n); for i:=1 to n do begin write(‘Phan tu thu ‘,i,’ la: ‘); readln(a[i]); end; for i:=2 to n do begin if (a[i]=(a[i-1]+a[i+1])/2) then writeln(‘Tao thanh CSC’) else writeln(‘Khong tao thanh CSC’); if (sqr(a[i])=a[i-1].a[i+1]) then writeln(‘Tao thanh CSN’) else writeln(‘Khong tao thanh CSN’); end; readln; end.  Bài 12: Dãy F gọi là dãy Fibonacci nếu: { 𝐹0 = 0 𝐹1 = 1 𝐹𝑛 = 𝐹𝑛−1 + 𝐹𝑛−2 𝑣ớ𝑖 𝑛 ≥ 2 . Viết chương trình nhập từ bàn phím số nguyên dương N và đưa ra màn hình số hạng thứ N của dãy Fibonacci? Giải: uses crt; var a:array[0..100] of integer; n,i:integer; begin clrscr; write(‘Nhap N = ‘); readln(n); a[0]:=0; a[1]:=1; for i:=2 to n do a[i]:=a[i-1]+a[i-2]; writeln(‘So hang thu ‘,n,’ la: ‘,a[n]); readln; end.  Bài 13: Viết chương trình thực hiện công việc sau đây: Nhập vào một mảng các số nguyên, sau đó đưa ra màn hình: a) Giá trị trung bình của dãy.
  • 39. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 35 b) Giá trị của phần tử dương đầu tiên và chỉ số của nó? Giải: uses crt; var a:array[1..100] of integer; n,i:integer; tong:longint; tb:real; begin clrscr; writeln(‘So luong phan tu trong mang: ‘); readln(n); for i:=1 to n do begin write(‘Phan tu thu ‘,i,’ la: ‘); readln(a[i]); end; for i:=1 to n do tong:=tong+a[i]; tb:=tong/n; writeln(‘Gia tri trung binh cua day: ‘,tb:10:2); i:=1; while (i<=n) and (a[i]<=0) do inc(i); if a[i]>0 then writeln(‘Phan tu duong dau tien la: ‘,a[i],’ o vi tri thu ‘,i) else writeln(‘Mang ban vua nhap khong co so duong’); readln; end.  Bài 14: Lập trình nhập vào một mảng gồm N phần tử (n < 15), mỗi phần tử là một số nguyên nhỏ hơn 100. Đếm xem có bao nhiêu phần tử nhỏ hơn k, bằng k, với k là một số nguyên dương cho trước? Giải: uses crt; var a:array[1..15] of integer; n,i,k,dem:integer; begin clrscr; write(‘N = ‘); readln(n); for i:=1 to n do begin write(‘Phan tu thu ‘,i,’ la: ‘); readln(a[i]); end; write(‘K = ‘); readln(k); dem:=0; for i:=1 to n do if a[i]
  • 40. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 36  Bài 15: Viết chương trình thực hiện công việc sau đây: Nhập vào một mảng các số nguyên sau đó đưa ra màn hình: a) Phần tử lớn nhất, phần tử nhỏ nhất của mảng. b) In ra các cặp phần tử liên tiếp có trị tuyệt đối của hiệu nhỏ hơn k, với k > 0 cho trước. Hướng dẫn: a) max:=a[1]; min:=a[1]; for i:=1 to n do begin if a[i]>max then max:=a[i]; if a[i]A[i+1] với i € [1,n-1]. d) Cho biết mảng đó có phải là mảng dan dấu hay không? Biết: mảng A gọi là đan dấu nếu tích của hai phần tử liên tiếp là một số âm. Hướng dẫn: {kiem tra mang tang} i:=2; while (i<=n) and (a[i-1]<=a[i]) do inc(i); if i>n then writeln(‘Mang tang’) else writeln(‘Khong la mang tang’); {kiem tra mang giam} i:=2; while (i<=n) and (a[i-1]>a[i]) do inc(i); if i>n then writeln(‘Mang giam’) else writeln(‘Khong la mang giam’); {kiem tra mang dan dau} i:=2; while (i<=n) and (a[i-1].a[i]<0) do inc(i); if i>n then writeln(‘Mang dan dau’) else writeln(‘Khong la mang dan dau’);  Bài 17: Viết chương trình nhập vào một mảng các số nguyên sau đó loại bỏ những phần tử có giá trị giống nhau. Đưa ra màn hình kết quả? Giải: uses crt; var a:array[1..100] of integer; i,j,n:integer; ok:boolean; begin clrscr; write(‘N = ‘); readln(n); for i:=1 to n do begin write(‘Phan tu thu ‘,i,’ : ‘); readln(a[i]); end; for i:=1 to n do
  • 41. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 37 begin ok:=true; for j:=1 to i-1 do if a[i]=a[j] then ok:=false; if ok then write(a[i]:4); end; readln; end.  Bài 18: Viết chương trình nhập vào một xâu và in ra màn hình xâu đó bằng các kí tự in hoa? Giải: uses crt; var s1,s2:string; i,dai:integer; begin clrscr; write(‘Nhap vao mot xau: ‘); readln(s1); dai:=length(s1); s2:=’’; for i:=1 to dai do s2:=s2+upcase(s1[i]); writeln(‘Xau viet hoa: ‘,s2); readln; end.  Bài 19: Viết chương trình nhập vào một xâu và in ra màn hình xâu kết quả có các kí tự đầu là chữ hoa, các kí tự sau là chữ thường? Hướng dẫn: for i:=1 to length(s) do if s[i]<>’’ then if i=1 then s[i]:=upcase(s[i]) else if s[i-1]=’ ‘ then s[i]:=upcase(s[i]) else if s[i]=upcase(s[i]) then s[i]:=chr(ord(s[i]+32)); writeln(‘Xau moi la: ‘,s);  Bài 20: Viết chương trình “nắn xâu” theo nghĩa sau: - Nhập vào một xâu. - Bỏ các kí tự trống bên trái xâu. - Bỏ các kí tự trống bên phải xâu. - Trong xâu, nếu có hơn một dấu cách liên tiếp thì xoá bớt, chỉ để lại một dấu cách. Hướng dẫn: if length(s)>0 then begin while s[1]=’ ‘ do delete(s,1,1); while s[length(s)]=’ ‘ do delete(s,length(s),1); end; while pos(‘ ‘,s)<>0 do delete(s,pos(‘ ‘,s),1);  Bài 21: Viết chương trình nhập vào hai từ và kiểm tra xem chúng có phải là annagram của nhau hay không? (annagram nghĩa là có thể tạo từ này bằng cách hoán vị các kí tự của từ kia. Ví dụ: dear, read, dare). Hướng dẫn:
  • 42. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 38 dai:=length(s1); i:=1; ok:=true; while (i<=dai) and ok do begin j:=i; while (j<=dai) and (s1[i]<>s2[j]) do inc(j); if j>dai then ok:=false else begin tmp:=s2[j]; s2[j]:=s2[i]; s2[i]:=tmp; end; inc(i); end; if ok then writeln(‘La annagram’) else writeln(‘Khong la annagram’);  Bài 22: Viết chương trình nhập vào một xâu rồi đưa ra màn hình số kí tự khác nhau trong xâu đó? Giải: uses crt; var s:string; i,j,d:integer; begin clrscr; write(‘Nhap vao mot xau: ‘); readln(s); if length(s)=0 then writeln(‘Xau rong’) else begin d:=1; for i:=2 to length(s) do begin j:=i-1; while (j>0) and (s[j]<>s[i]) do j:=j-1; if j=0 then inc(d); end; writeln(‘Xau vua nhap co ‘,d,’ ki tu khac nhau.’); end; readln; end.  Bài 23: Viết chương trình nhập vào một mảng số nguyên (n < 100) - In ra theo thứ tự ngược lại? - Tính tổng của các phần tử của mảng? - Liệt kê các phần tử âm, dương?  Bài 24: Viết chương trình nhập vào một mảng số nguyên (n < 100) - Tìm số lớn nhất, số nhỏ nhất trong mảng? - Tìm số âm đầu tiên của mảng?  Bài 25: Để giữ bí mật người ta phải mã hoá các thông tin trước khi truyền đi hoặc lưu trữ. Một trong những cách mã hoá sớm nhất được sử dụng rộng rãi thời cổ đại là cách mã hoá do Xê Da đề xuất: Trong thông điệp, người ta thay đổi mỗi chữ cái bằng chữ cái đứng sau nó k vị trí trong bảng chữ cái. Việc tìm kiếm thay thế được tiến hành vòng tròn theo bảng chữ cái. Nếu bảng chữ cái có
  • 43. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 39 N chữ, thì sau chữ cái thứ N-1 là chữ cái N, sau chữ cái N là chữ cái thứ nhất,... Cách mã hoá này được gọi là mã Xê Da. Các kí tự ngoài bảng chữ cái vẫn được giữ nguyên. Hãy lập trình: Nhập từ bàn phím số nguyên k (1
  • 44. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 40  Tệp truy cập trực tiếp: tham chiếu đến dữ liệu cần truy cập bằng cách xác định vị trí trực tiếp của những dữ liệu đó. - Số lượng phần tử của tệp không cần xác định trước. - Hai thao tác cơ bản đối với tệp là đọc/ghi dữ liệu tệp. Quy trình: Khai báo biến tệp => Mở tệp => Đọc/ghi dữ liệu => Đóng tệp. II/ Thao tác với tệp: 1. Khai báo: Var :Text; 2. Thao tác với tệp: a) Gắn tên tệp: Assign(,); - Tên tệp là biến xâu hoặc hằng xâu. - Ta không thao tác trực tiếp với dữ liệu trên đĩa mà thông qua biến tệp. Biến tệp là một biến kiểu tệp. - Tên tệp là một biểu thức kiểu String mô tả tên tệp (bao gồm cả đường dẫn vật lí). b) Mở tệp: - Mở tệp để ghi dữ liệu: Rewrite(); - Mở tệp để đọc dữ liệu: Reset(); c) Đọc/ghi tệp văn bản: - Việc đọc tệp văn bản được thực hiện giống như nhập từ bàn phím. - Việc ghi dữ liệu ra tệp văn bản giống như ghi dữ liệu ra màn hình. - Đọc dữ liệu: Read(,); Readln(,); - Ghi dữ liệu: Write(,); Writeln(,); d) Đóng tệp: Close(); - Sau khi đóng, một tệp vẫn có thể được mở lại. - Khi mở lại tệp, nếu vẫn dùng biến tệp cũ thì không cần phải dùng thủ tục Assign gắn lại tên tệp. III/ Bảng tóm tắt các thao tác với tệp: IV/ Một số hàm chuẩn: - Eof(): trả về giá trị True nếu con trỏ tệp đang chỉ tới cuối tệp. - Eoln(): trả về giá trị True nếu con trỏ tệp đang chỉ tới cuối dòng. - Seek(,): thực hiện việc chuyển con trỏ tệp đến vị trí thứ n.
  • 45. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 41 - Erase(): thực hiện xoá một tệp trên đĩa với biến tệp đại diện, không thể xoá một tệp đang mở. - Rename(,): thực hiện việc đổi tên tệp mà biến tệp đại diện, không thể đổi tên một tệp đang mở. - FilePos(): trả về vị trí con trỏ của tệp đại diện bởi biến tệp. - FileSize(): trả về kích thước tệp (là một số nguyên) của tệp đại diện bởi biến tệp. - Append(): mở để ghi nối thêm vào cuối tệp. ĐỌC THÊM: Thủ tục kiểm tra lỗi nhập/xuất: Sử dụng các chỉ thị riêng mở rộng khả năng ngôn ngữ của Pascal {$I+} và {$I-} để thực hiện việc cho phép hay không cho phép chương trình dịch tự phát các mã kiểm tra kết quả của một lời gọi đến thủ tục nhập/xuất thông qua một thủ tục kiểm tra lỗi nhập/xuất qua hàm IO Result như sau: Procedure Kiemtra(:String; Var loi:Boolean); Var f:File of Byte; Begin Loi:=False; Assign(f,); {$I-} Reset(f); {$I+} If (IOResult <> 0) then Begin Loi:=True; Writeln(‘File nay khong ton tai’); End Else Close(f); End; BÀI TẬP  Bài 1: Cho 3 điện trở R1, R2, R3. Sử dụng ba điện trở để tạo thành 5 mạch điện có điện trở tương đương khác nhau. Cho tệp văn bản RESIST.DAT gồm nhiều dòng, mỗi dòng chứa ba số thực R1, R2, R3, các số cách nhau một dấu cách, 0
  • 46. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 42 begin readln(f1,r1,r2,r3); a[1]:=r1*r2*r3/(r1*r2+r1*r3+r2*r3); a[2]:=r1*r2/(r1+r2)+r3; a[3]:= r1*r3/(r1+r3)+r2; a[4]:= r2*r3/(r2+r3)+r1; a[5]:=r1+r2+r3; for i:=1 to 5 do write(f2,a[i]:9:3,’ ‘); writeln(f2); end; close(f1); close(f2); end.  Bài 2: Viết chương trình đọc dữ liệu từ một file văn bản này sang một file văn bản khác. Giải: var f1,f2:text; ktke:char; begin assign(f1,’INPUT.TXT’); reset(f1); assign(f2,’OUTPUT.TXT’; rewrite(f2); while not eof(f1) do begin if eoln(f1) then begin readln(f1); writeln(f2); end else begin read(f1,ktke); write(f2,ktke); end; end; close(f1); close(f2); end.  Bài 3: Viết chương trình thực hiện tìm số max và cho biết có bao nhiêu số max, dữ liệu lấy từ tệp input.dat. Giải: uses crt; var f:text; n,max,count:longint; begin assign(f,’INPUT.DAT’); reset(f); max:=-2127483647; while not eof(f) do begin read(f,n); if n>max then begin max:=n;
  • 47. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 43 count:=1; end else if n=max then inc(count); end; close(f); clrscr; writeln(max,’ ‘,count); readln; end.  Bài 4: Viết chương trình đếm có bao nhiêu dòng trong tệp input.dat? Giải: uses crt; var f:text; dem:integer; begin clrscr; assign(f,’INPUT.DAT’); reset(f); dem:=0; while not eof(f) do begin readln(f); inc(dem); end; close(f); writeln(‘Tep chua ‘,dem,’ dong.’); readln; end.  Bài 5: Viết chương trình ghi tất cả các số nguyên tố từ 1 đến n (n nhập từ màn hình) vào tệp NGUYENTO.DAT. Yêu cầu các số nguyên tố phải được ghi vào tệp theo thứ tự từ nhỏ đến lớn, mỗi số được ghi trên một dòng và cuối chương trình xuất ra trên màn hình có bao nhiêu số nguyên tố được ghi vào tệp. Giải: uses crt; var f:text; n,i,lim:longint; dem:integer; begin clrscr; write(‘Nhap vao n: ‘); readln(lim); assign(f,’NGUYENTO.DAT’); rewrite(f); dem:=0; writeln(‘Dang liet ke cac SNT vao tep NGUYENTO.DAT..............’); for n:=2 to lim do begin i:=2; while (i<=trunc(sqrt(n))) and (n mod i<>0) do inc(i); if (i>trunc(sqrt(n))) then begin writeln(f,n); inc(dem); end;
  • 48. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 44 end; close(f); writeln; writeln(‘So luong SNT duoc liet ke vao tep: ‘,dem); writeln(‘Hay mo tep NGUYENTO.DAT de kiem tra lai!’); readln; end.  Bài 6: Kết quả học tập đầy đủ của các học sinh trong một lớp được lưu dưới dạng một tệp văn bản có tên là HOSO.TXT. Các thông tin của mỗi học sinh được lưu trên một dòng theo khuôn dạng sau: Họ và tên học sinh, ngày tháng năm sinh, điểm trung bình, xếp loại. Hãy viết chương trình thực hiện các công việc: - Đọc dữ liệu từ tệp văn bản đã cho. - Hiển thị lên màn hình các thông tin vừa đọc theo dạng: Ho va ten Ngay sinh DTB XL Ton Ngo Khong 12/12/12 9.9 Gioi Giải: uses crt; var f:text; i,dem:integer; hoten:string[30]; ngsinh:string[10]; DTB:real; xl:string[10]; begin clrscr; writeln; writeln; writeln(‘Bang ket qua hoc tap ca lop’:50); writeln; writeln(‘Ho va ten’,’Ngay sinh’:30,’DTB’:12,’XL’:12); writeln; assign(f,’HOSO.TXT’); reset(f); dem:=0; while not eof(f) do begin inc(dem); readln(f,hoten); readln(f,ngsinh); readln(f,dtb); readln(f,xl); writeln(hoten,’ ‘:(30-length(hoten)),ngsinh:10,dtb:10:1,xl:11); end; close(f); readln; end.
  • 49. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 45 CHƯƠNG VI CHƯƠNG TRÌNH CON & LẬP TRÌNH CÓ CẤU TRÚC BÀI 1: CHƯƠNG TRÌNH CON VÀ PHÂN LOẠI I/ Khái niệm: - Khi lập trình để giải các bài toán trên máy tính có thể phân chia chương trình (gọi là chương trình chính) thành các khối (modul), mỗi khối bao gồm các lệnh giải một bài toán con nào đó. Mỗi khối lệnh sẽ được xây dựng thành một chương trình con. Sau đó chương trình chính sẽ được xây dựng từ những chương trình con này. - Chương trình con là một dãy lệnh mô tả một số thao tác nhất định và có thể được thực hiện (được gọi) từ nhiều vị trí trong chương trình. - Lợi ích của việc sử dụng chương trình con: + Tránh được việc phải viết lặp đi lặp lại cùng một dãy lệnh nào đó; + Hỗ trợ việc thực hiện các chương trình lớn; + Phục vụ cho quá trình trửu tượng hoá; mở rộng khả năng ngôn ngữ; + Thuận tiện cho việc phát triển, nâng cấp chương trình. II/ Phân loại và cấu trúc của chương trình con: 1. Phân loại: - Hàm (Function): là chương trình con thực hiện một số thao tác nào đó và trả về một giá trị qua tên của nó. Ví dụ: sin(x), sqrt(x), length(s),... - Thủ tục (Procedure): là chương trình con thực hiện các thao tác nhất định nhưng không trả về giá trị nào qua tên của nó. Ví dụ: writeln, readln, delete, insert,... Kiểu chương trình con Khai báo Giá trị trả về Thủ tục Procedure Không Hàm Function Có khai báo kiểu cho tên hàm, cuối hàm thường có một lệnh gán giá trị kết quả cho tên hàm. Có trả về một giá trị thông qua tên hàm Chú ý: - Kiểu cho tên hàm chỉ được cho phép là các kiểu đơn giản đã được Pascal định nghĩa. - Nếu muốn chương trình con trả về kết quả là một kiểu phức tạp hơn, như mảng, thì nên dùng tham số hình thức biến. 2. Cấu trúc chương trình con: - Có cấu trúc tương tự chương trình, nhưng phải có tên và phần đầu dùng để khai báo tên, nếu là hàm thì phải khai báo kiểu dữ liệu cho giá trị trả về của hàm. [] - Phần khai báo: có thể khai báo biến cho dữ liệu vào và ra, các hằng và biến dùng trong chương trình con. - Phần thân: là dãy câu lệnh thực hiện để từ dữ liệu vào ta nhận được dữ liệu ra hay kết quả như mong muốn. - Tham số hình thức: + Các biến được khai báo cho dữ liệu vào/ra được gọi là tham số hình thức. + Các biến được khai báo để dùng riêng trong chương trình con gọi là biến cục bộ.
  • 50. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 46 + Các biến của chương trình chính được gọi là biến toàn cục. + Một chương trình con có thể có hoặc không có tham số hình thức, có thể có hoặc không có biến cục bộ. - Thực hiện chương trình con: để thực hiện (gọi) một chương trình con, ta cần phải có lệnh gọi nó tương tự lệnh gọi hàm thay thủ tục chuẩn. III/ Cách viết và sử dụng thủ tục: 1. Dạng 1: không có thông số: Procedure ; [] Begin [] End; - Lời gọi thực thi: ; 2. Dạng 2: có thông số: Procedure (); [] Begin [] End; - Lời gọi thực thi: (); - Trong lệnh gọi thủ tục, các tham số hình thức được thay bằng các tham số thực tương ứng là các giá trị cụ thể được gọi là tham số giá trị (tham trị). IV/ Cách viết và sử dụng hàm: Function [()]:; [] Begin [] :=; End; - Lời gọi thực thi: :=[()]; - Chú ý: kiểu dữ liệu là kiểu dữ liệu của giá trị mà hàm trả về và chỉ có thể là các kiểu: integer, real, char, boolean, string. V/ Tham số và cách truyền tham số: - Tham số tại nơi gọi: tham số thực. - Tham số tại nơi được gọi: tham số hình thức. Kiểu tham số hình thức Khai báo Giá trị của tham số thực tương ứng sau khi thực hiện chương trình con Tham số hình thức trị - Tham trị (truyền bằng trị) Không có var Giữ nguyên giá trị ban đầu trước khi gọi chương trình con. Tham số hình thức biến – Tham biến (truyền bằng tham khảo) Có var Lấy giá trị kết quả của chương trình con. - Quy tắc: + Quy tắc 1: số lượng tham số hình thức và số lượng tham số thực phải bằng nhau. + Quy tắc 2: các tham số hình thức và tham số thực phải tương ứng với nhau theo từng vị trí. + Quy tắc 3: các tham số hình thức và tham số thực phải tương ứng với nhau vể kiểu dữ liệu.
  • 51. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 47 + Quy tắc 4: với tham số hình thức được khai báo như là tham trị thì tham số thực tương ứng có thể là hằng, biến, biểu thức, giá trị trả về từ hàm; với tham số hình thức được khai báo như là tham biến thì tham số thực tương ứng chỉ có thể là biến. - Các quy tắc cho việc gọi chương trình con trong Pascal: Có 3 trường hợp mà một chương trình con A gọi được chương trình con B: + A là cha của B. + A ngang cấp với B (A và B có chung một cha). + A bị bao bởi C, còn B và C ngang cấp với nhau (khi B và C trùng nhau thì B là cha của A). VI/ Chương trình con đệ quy: 1. Khái niệm đệ quy: - Một đối tượng được gọi là đệ quy nếu nó bao gồm một phần tử của chính nó hay được định nghĩa bởi chính nó. - Một chương trình con được gọi là đệ quy nếu trong chương trình con đó có lời gọi đến chính nó. - Có hai trường hợp: + Lời gọi đệ quy trực tiếp: nếu trong một chương trình con có lời gọi tường minh đến nó: SubA => SubA. + Lời gọi đệ quy gián tiếp: nếu trong một chương trình con A có lời gọi một chương trình con B khác, và trong B lại có lời gọi A: SubA => SubB => SubA. - Thuật giải đệ quy thích hợp khi các bài toán, các hệ thức, các hàm, các cấu trúc dữ liệu cũng được định nghĩa theo kiểu đệ quy. 2. Các thành phần của chương trình đệ quy: - Sử dụng chương trình con (procedure, function) để hiện thực đệ quy. - Hai thành phần cơ bản của đệ quy gồm: + Thành phần dừng (phần neo – anchor): không chứa khái niệm đang định nghĩa; + Thành phần đệ quy: có chứa khái niệm đang định nghĩa. - Lời gọi đệ quy trong câu lệnh If: If <điều kiện dừng> then else ; BÀI 2 THƯ VIỆN CHƯƠNG TRÌNH CON CHUẨN Các Unit là những thư viện nhỏ, trong đó có chứa các chương trình con đã được tạo sẵn và người lập trình chỉ việc lấy ra sử dụng. - CRT: chứa các chương trình con xử lí màn hình. - PRINTER: chứa các chương trình con về in ấn. - DOS: chứa các chương trình con khai thác các hàm của Dos. - SYSTEM: chứa các chương trình con về dữ liệu hệ thống. - GRAPH: chứa các chương trình con về đồ hoạ. Gọi một Unit: Uses ; ĐỌC THÊM: Tạo Unit: UNIT ; {tên Unit thường đặt trùng với tên file} USES ; INTERFACE [] IMPLEMENTATION {phần thực thi} []
  • 52. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 48 END. BÀI TẬP  Bài 1: Viết chương trình tính n! Giải: Cách 1: program bt; uses crt; var n:integer; procedure GT(m:integer); var i:integer; gth:int64; begin if (m=0) or (m=1) then gth:=1 else begin gth:=1; for i:=2 to m do gth:=gth*i; end; writeln(m,’! = ‘,gth); end; begin clrscr; write(‘Nhap n = ‘); readln(n); GT(n); readln; end. Cách 2: program bt; uses crt; var n:integer; function GT(m:integer):int64; var i:integer; gth:int64; begin if (m=0) or (m=1) then gth:=1 else begin gth:=1; for i:=2 to m fo gth:=gth*i; end; GT:=gth; end; begin clrscr;
  • 53. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 49 write(‘Nhap n = ‘); readln(n); writeln(n,’! = ‘,GT(n)); readln; end.  Bài 2: Viết hàm đệ qui tính giai thừa? Giải: function GT(n:integer):int64; begin if n=0 then GT:=1 else GT:=n*GT(n-1); end;  Bài 3: Viết hàm đệ qui tính số Fibonacci? Giải: function F(n:integer):longint; begin if n<=2 then F:=1 else F:=F(n-1)+F(n-2); end;  Bài 4: Collatz đưa ra giả thiết rằng: với một số nguyên dương X, nếu X chẵn thì ta gán X:=X div 2, nếu X lẻ thì ta gán X:=X*3+1 thì sau một số hữu hạn bước, ta sẽ có X = 1. Viết chương trình nhập vào một số nguyên dương X và thực hiện giả thiết của Collatz. Giải: uses crt; var x:integer; procedure Slove(x:integer); begin if x=1 then write(x) else if x mod 2=0 then begin Slove(x div 2); write(‘ *2 ’); end else begin Slove(x*3+1); write(‘ div 3 ‘); end; end; begin clrscr; write(‘Nhap X = ‘); readln(x); Slove(x); readln; end.  Bài 5: Viết chương trình giải phương trình bậc nhất? Giải:
  • 54. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 50 program bt; uses crt; var a,b:integer; procedure PTB1(a,b:integer); begin if a<>0 then writeln(‘x = ‘,-b/a:5:2) else if b<>0 then writeln(‘PTVN’) else writeln(‘PTVD’); end; begin clrscr; write(‘Nhap he so a, b = ‘); readln(a,b); PTB1(a,b); readln; end.  Bài 6: Viết chương trình giải phương trình bậc hai? Giải: program bt; uses crt; var a,b,c:integer; procedure PTB2(a,b,c:integer); var d:integer; x1,x2:real; begin d:=sqr(b)-4*a*c; if d>0 then begin x1:=(-b+sqrt(d))/(2*a); x2:=(-b-sqrt(d))/(2*a); writeln(‘x1 = ‘,x1:5:2,’ x2 = ‘,x2:5:2); end else if d=0 then writeln(‘x = ‘,-b/(2*a):5:2) else writeln(‘PTVN’); end; begin clrscr; write(‘Nhap he so a, b, c = ‘); readln(a,b,c); PTB2(a,b,c); readln; end.  Bài 7: Viết chương trình tính an (a:real; n:integer).  Bài 8: Viết chương trình tạo ra máy tính con có bốn phép tính: cộng, trừ, nhân, chia (sử dụng CTC).
  • 55. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 51  Bài 9: Viết chương trình tính 𝐶 𝑛 𝑘 = 𝑛! 𝑘!(𝑛−𝑘)! .  Bài 10: Viết chương trình tính 𝑃𝑛 𝑘 = 𝑛! (𝑛−𝑘)! .  Bài 11: Viết chương trình vẽ hình chữ nhật với các tham số chiều dài, chiều rộng và dùng chương trình để vẽ các hình chữ nhật có kích thước khác nhau. Giải: uses crt; var a,b,i:integer; procedure vehcn(chdai,chrong:integer); var i,j:integer; begin for i:=1 to chdai do write(‘*’); writeln; for j:=1 to chrong-2 do begin write(‘*’); for i:=1 to chdai-2 do write(‘ ‘); writeln(‘*’); end; for i:=1 to chdai do write(‘*’); writeln; end; begin clrscr; vehcn(25,10); writeln; writeln; vehcn(5,10); readln; clrscr; a:=4; b:=2; for i:=1 to 4 do begin vehcn(a,b); readln; clrscr; a:=a*2; b:=b*2; end; readln; end.  Bài 12: Viết chương trình rút gọn một phân số? Giải: program RGPS; uses crt; var tu,mau,a:integer;
  • 56. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 52 function UCLN(x,y:integer):integer; var sodu:integer; begin while y<>0 do begin sodu:=x mod y; x:=y; y:=sodu; end; UCLN:=x; end; begin clrscr; write(‘Nhap tu so, mau so: ‘); readln(tu,mau); a:=UCLN(tu,mau); if a>1 then begin tu:=tu div a; mau:=mau div a; end; writeln(tu:5,mau:5); readln; end.  Bài 13: Xây dựng một hàm có tên là LOWER(ch) để trả về kết quả là chữ cái in thường nếu ch là chữ hoa và giữ nguyên ch nếu đó là chữ thường. Hàm này là hàm ngược của hàm UPCASE. Giải: function Lower(kt:char):char; begin if (kt>=’A’) and (kt<=’Z’) then Lower:=chr(ord(kt)+32); end;  Bài 14: Nhập vào 2 phân số. Tính cộng, trừ, nhân, chia của hai phân số đó? Giải: program bt; uses crt; var a,b,c,d:integer; procedure nhap(var tu,mau:integer); begin write(‘Nhap vao tu so: ‘); readln(tu); write(‘Nhap vao mau so: ‘); readln(mau); end; procedure pheptinh(var a,b,c,d:integer);
  • 57. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 53 var tu,mau:integer; begin tu:=a*d+b*c; mau:=b*d; writeln(‘Tong la: ‘,tu,’/’,mau); tu:=a*d-b*c; writeln(‘Hieu la: ‘,tu,’/’,mau); tu:=a*c; writeln(‘Tich la: ‘,tu,’/’,mau); tu:=a*d; mau:=b*c; writeln(‘Thuong la: ‘,tu,’/’,mau); end; begin clrscr; nhap(a,b); nhap(c,d); pheptinh(a,b,c,d); readln; end.  Bài 15: Viết chương trình giải phương trình 𝑥 + 𝑦 + 𝑧 = 12 trong phạm vi số nguyên không âm và x<4. Giải: program bt; uses crt; var x,y,z:integer; procedure giaipt; begin writeln(‘Phuong trinh co nghiem: ‘); writeln(‘x’:5,’y’:5,’z’:5); for x:=0 to 3 do for y:=0 to 12 do for z:=0 to 12 do if (x+y+z=12) then writeln(x:5,y:5,z:5); end; begin clrscr; giaipt; readln; end.  Bài 16: Viết chương trình nhập vào một số nguyên a, kiểm tra xem a có phải là số nguyên tố hay không? Giải: program BT;
  • 58. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 54 uses crt; var a:integer; function NT(n:integer):boolean; var k:integer; begin if n<2 then NT:=false else for k:=2 to trunc(sqrt(n)) do if (n mod k=0) then NT:=false else NT:=true; end; begin clrscr; write('Nhap a = '); readln(a); if NT(a) then writeln(a,' la so nguyen to.') else writeln(a,' khong la so nguyen to.'); readln; end.  Bài 17: Viết chương trình nhập vào một mảng a gồm n số nguyên, xuất ra màn hình các số chẵn, lẻ và tính tổng của chúng. Giải: program BT; uses crt; var n,s,i:integer; a:array[1..100] of integer; function Chan(k:integer):boolean; begin if (k mod 2=0) then Chan:=true else Chan:=false; end; begin clrscr; write('Nhap n = '); readln(n); for i:=1 to n do begin write('a[',i,'] = '); readln(a[i]); end; writeln('Cac so chan la: '); s:=0; for i:=1 to n do if Chan(a[i]) then begin write(a[i],' '); s:=s+a[i];
  • 59. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 55 end; writeln; writeln('Tong cac so chan la: ',s); writeln('Cac so le la: '); s:=0; for i:=1 to n do if not Chan(a[i]) then begin write(a[i],' '); s:=s+a[i]; end; writeln; writeln('Tong cac so le la: ',s); readln; end.  Bài 18: Viết chương trình nhập vào hai số nguyên a và b. Tính ước chung lớn nhất của chúng? Giải: program BT; uses crt; var a,b:integer; function UCLN(m,n:integer):integer; var tmp:integer; begin while n>0 do begin m:=m mod n; tmp:=m; m:=n; n:=tmp; end; UCLN:=m; end; begin clrscr; write('a, b = '); readln(a,b); writeln('UCLN = ',UCLN(a,b)); readln; end.  Bài 19: Viết chương trình nhập vào ba điểm Toán, Văn, Anh của một học sinh. Tính và đưa ra màn hình điểm trung bình và xếp loại. Giải: program BT; uses crt; var t,v,av,dtb:real; function XL(a:real):string;
  • 60. trình Pascal – Tin học 11 © NTMHP Tháng 08 năm 2014 Trang 56 begin if a>=8 then XL:='Gioi' else if a>=6.5 then XL:='Kha' else if a>=5 then XL:='Trung binh' else XL:='Yeu'; end; begin clrscr; write('Nhap diem Toan, Van, Anh van: '); readln(t,v,av); dtb:=(t+v+av)/3; writeln('Diem trung binh: ',dtb:0:1); writeln('Xep loai: ',XL(dtb)); readln; end.  Bài 20: Cho tệp DATA.TXT gồm nhiều dòng, mỗi dòng chứa bộ ba số m,n,p. Viết chương trình đọc từ tệp ba số m,n,p và cho biết bộ ba số này có tạo thành một tam giác hay không (với m,n,p là độ dài ba cạnh của tam giác), nếu có thì cho biết tính chất của tam giác, tính chu vi, diện tích của tam giác đó. Giải: program BT; uses crt; const fi='DATA.TXT'; var m,n,p:real; f:text; function Tamgiac(a,b,c:real):boolean; begin if (a+b>c) and (a+c>b) and (b+c>a) then Tamgiac:=true else Tamgiac:=false; end; function Can(a,b,c:real):boolean; begin if (a=b) or (a=c) or (b=c) then Can:=true else Can:=false; end; function Vuong(a,b,c:real):boolean; begin if (a*a+b*b=c*c) or (a*a+c*c=b*b) or (b*b+c*c=a*a) then Vuong:=true else Vuong:=false; end; function Deu(a,b,c:real):boolean; begin if (a=b) and (a=c) and (b=c) then Deu:=true else Deu:=false; end;