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ệ: , =, >=, , 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] =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 a0 then writeln[‘Nghiem x = ‘,-b/a:5:2] else if b0 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 [dx0] then writeln[‘Hpt vo nghiem’] else if [d10] 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]=97] and [ord[ch] “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*pc*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 100 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*nepsi 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[]; 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 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 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 n0 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 y0 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=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;

Chủ Đề