TÀI LIỆU CHUYÊN TIN VÀO LỚP 10 Các em học sinh thân mếnTrong thời gian giảng dạy tại trường cũng như tham gia các lớp Bồi dưỡng HSG THCS và giảng dạy các lớp Chuyên tin. Thầy nhận thấy có rất nhiều bạn đam mê bộ môn Tin học và rất muốn thi vào lớp Chuyên tin THPT. Nhưng hầu như năm nào chất lượng đầu vào lớp Chuyên tin 10 cũng cực kỳ thấp. Thậm chí có một số bạn khi đọc đề còn không nắm được cách thức làm một bài trọn vẹn, kể cả những bài đơn giản nhất. Vì vậy, qua thời gian tìm hiểu, nắm tình hình thực tế, Thầy nhận thấy hầu hết các em đều gặp phải một số nguyên nhân sau: Nguyên nhân đầu tiên cần nhắc đến là tâm lý xem nhẹ bộ môn Tin học của Phụ huynh và chính các em. Cứ nói đến Tin học là Phụ huynh lại nghĩ ngay đến soạn thảo văn bản, tính toán đơn giản chứ không hề nghĩ đến việc các em đang học cái gì. Cho nên cứ hễ thấy con mình yếu môn Toán lại nghĩ đến phương án cho con đi chuyên Tin cho dễ “đỗ” chứ đâu biết rằng muốn giỏi được Tin học đòi hỏi phải có một nền tảng kiến thức Toán học và Tư duy thuật toán tốt. Thứ hai, toàn bộ nội dung kiến thức thi vào Chuyên tin lớp 10 hoàn toàn không có trong SGK lớp 9. Chỉ khoảng 15 khối lượng kiến thức nằm ở SGK lớp 8, phần còn lại nằm hoàn toàn vào kiến thức ở trên mạng xã hội và các tài liệu lập trình khác. Nội dung kiến thức lớp 8 hoàn toàn mới, không có tính kế thừa các năm trước nên rất khó khăn để tiếp cận. Thứ ba, hầu hết các em không có sự định hướng hoặc định hướng chưa tốt về các module kiến thức sẽ thi vào lớp 10 nên rất còn rất mơ hồ, không biết sẽ thi những nội dung kiến thức nào. Thứ tư, hiện tại chưa có bất kỳ một tài liệu nào bám sát nội dung ôn tập môn Tin học THCS. Đa phần các Tài liệu mang tính chất tổng quát về Ngôn ngữ lập trình Pascal chứ không tập trung vào các module kiến thức phục vụ cho học sinh THCS.Xuất phát từ những yêu cầu thực tiễn trên, Thầy đã soạn ra cuốn tài liệu “ĐỂ HỌC TỐT PASCAL TRUNG HỌC CƠ SỞ” nhằm hệ thống một cách chi tiết và đầy đủ toàn bộ nội dung kiến thức cả lý thuyết lẫn bài tập, từ cơ bản đến nâng cao. Giúp cho các em thi Chuyên tin vào lớp 10 và các em nằm trong đội tuyển HSG có sự định hướng tốt nhất khi học môn lập trình Pascal.Tài liệu bao gồm 272 trang, được chia làm 2 phần: Phần A: Lý thuyết: Hệ thống lại toàn bộ các kiến thức lý thuyết kiểu mảng, kiểu xâu, chương trình con, tệp ... được trình bày chi tiết và dễ hiểu. Phần B: Bài tập: Được phân thành 5 chuyên đề: Các bài toán cơ bản – xử lý số; Dữ liệu kiểu mảng; Dữ liệu kiểu xâu; Đệ quy – Đệ qui quay lui(Backtracking); Quy hoạch động. Mỗi chuyên đề được phân thành từng dạng nhỏ(Chi tiết Mục lục đã có ở hình ảnh), đối với mỗi dạng nhỏ Thầy đưa ra thuật toán mang tính tổng quát có thể giải quyết được hầu hết các bài toán trong cùng 1 dạng. Chẳng hạn: thuật toán xử lý dãy con, xâu con liên tiếp, không liên tiếp; xử lý số, ký tự số trong xâu, mã hóa; giải mã...hay thuật toán xử lý các loại số: số nguyên tố, số chính phương, số hoàn hảo, số emirp, số nguyên tố mạnh, số phong phú, số tự mãn, số bán hoàn hảo, số bất khả xâm phạm, cặp số hứa hôn, cặp số hữu nghị...Tài liệu: “ĐỂ HỌC TỐT PASCAL TRUNG HỌC CƠ SỞ” hi vọng sẽ giúp giải quyết được phần nào những khó khăn mà các em gặp phải trong quá trình tiếp cận với ngôn ngữ lập trình Pascal. THÂN ÁI
“Thành cơng hành trình, khơng phải đích đến” Dwight D Eisenhower ĐỂ HỌC TỐT PASCAL TRUNG HỌC CƠ SỞ Tài liệu lưu hành nội TÁC GIẢ: CN NGUYỄN VĂN SƠN MỤC LỤC PHẦN A: LÝ THUYẾT PASCAL Chương 1: CÁC THÀNH PHẦN CƠ BẢN CỦA NNLT PASCAL Chương 2: CÁC KIỂU DỮ LIỆU CƠ BẢN KHAI BÁO HẰNG, BIẾN, KIỂU, BIỂU THỨC VÀ CÂU LỆNH 12 I CÁC KIỂU DỮ LIỆU CƠ BẢN 12 II KHAI BÁO HẰNG 15 III KHAI BÁO BIẾN 15 IV ĐỊNH NGHĨA KIỂU 16 V BIỂU THỨC 16 Chương CÁC CÂU LỆNH CÓ CẤU TRÚC 18 I CÂU LỆNH RẼ NHÁNH 18 II CÂU LỆNH LẶP 19 Chương CHƯƠNG TRÌNH CON: THỦ TỤC VÀ HÀM 21 I KHÁI NIỆM VỀ CHƯƠNG TRÌNH CON 21 II CẤU TRÚC CHUNG CỦA MỘT CHƯƠNG TRÌNH CĨ SỬ DỤNG CTC 21 III BIẾN TOÀN CỤC VÀ BIẾN ĐỊA PHƯƠNG 23 IV ĐỆ QUI 23 Chương DỮ LIỆU KIỂU MẢNG (ARRAY) 26 I KHAI BÁO MẢNG 26 II XUẤT NHẬP TRÊN DỮ LIỆU KIỂU MẢNG 26 Chương XÂU KÝ TỰ (STRING) 27 Cách khai báo biến kiểu xâu: 27 Tham chiếu 27 Các phép toán xử lý xâu 27 Các hàm – thủ tục xử lý xâu 29 Chương DỮ LIỆU KIỂU TỆP 31 I KHAI BÁO 31 II CÁC THỦ TỤC VÀ HÀM CHUẨN 31 III FILE VĂN BẢN (TEXT FILE) 33 PHẦN B: BÀI TẬP PASCAL CHUYÊN ĐỀ I: CÁC BÀI TOÁN CƠ BẢN – XỬ LÝ SỐ 37 ➢ DẠNG CÁC BÀI TOÁN CƠ BẢN 37 ➢DẠNG CÁC LOẠI SỐ ĐẶC TRƯNG 42 * Dạng 2.1 Số nguyên tố 42 *Dạng 2.2 Cặp số hữu nghị(Cặp số thân thiết) 47 * Dạng 2.3 Số phương 48 * Dạng 2.4 Cặp số hứa hôn 50 * Dạng 2.5 Số Emirp 52 * Dạng 2.6 Số hoàn hảo 54 * Dạng 2.7 Số mạnh mẽ 55 * Dạng 2.8 Số tự mãn (Số Amstrong) 57 * Dạng 2.9 Số nguyên tố mạnh 59 * Dạng 2.10 Số phong phú(Số không đầy đủ) 61 * Dạng 2.11 Số hạnh phúc 62 * Dạng 2.12 Số bất khả xâm phạm 64 * Dạng 2.13 Số bán hoàn hảo 66 CHUYÊN ĐỀ II: MẢNG MỘT CHIỀU 70 ➢DẠNG 1: TÌM PHẦN TỬ ĐẶC TRƯNG 70 ➢DẠNG TÍNH TỐN VỚI MẢNG 85 ➢DẠNG SẮP XẾP MẢNG 92 ➢DẠNG CHÈN XÓA PHẦN TỬ 96 ➢DẠNG DÃY CON LIÊN TIẾP 102 ➢DẠNG ĐA THỨC BIẾN 114 CHUYÊN ĐỀ III: KIỂU XÂU 120 ➢ DẠNG BIẾT ĐỔI XÂU 120 ➢ DẠNG XỬ LÝ SỐ TRONG XÂU 131 * Dạng 2.1 Xử lý ký tự số xâu 132 * Dạng 2.2 Xử lý số xâu 135 ➢ DẠNG MÃ HÓA – GIẢI MÃ 146 * Dạng 2.1: Mã hóa, giải bằng phương pháp dịch chuyển K ký tự 146 * Dạng 2.2: Nén giải nén 147 ➢ DẠNG XÂU CON LIÊN TIẾP 153 * Dạng 4.1 Xâu liên tiếp 153 * Dạng 4.2 Xâu không liên tiếp (Back tracking) 158 CHUYÊN ĐỀ IV ĐỆ QUI – ĐỆ QUI QUAY LUI 159 ➢ DẠNG ĐỆ QUY 159 ➢ DẠNG ĐỆ QUY QUAY LUI (BACK TRACKING) 163 CHUYÊN ĐỀ V: THUẬT TOÁN QUI HOẠCH ĐỘNG 200 LUYỆN ĐỀ: 232 PHẦN A LÝ THUYẾT PASCAL Chương CÁC THÀNH PHẦN CƠ BẢN CỦA NGÔN NGỮ LẬP TRÌNH PASCAL Các tập tin cần thiết lập trình với Turbo Pascal Để lập trình với Turbo Pascal, tối thiểu cần file sau: • TURBO.EXE: Dùng để soạn thảo dịch chương trình • TURBO.TPL: Thư viện chứa đơn vị chuẩn để chạy với TURBO.EXE Ngồi ra, muốn lập trình đồ hoạ phải cần thêm tập tin: • GRAPH.TPU: Thư viện đồ hoạ • *.BGI: Các file điều khiển loại hình tương ứng dùng đồ hoạ • *.CHR: Các file chứa font chữ đồ họa Các bước lập chương trình Pascal Bước 1: Soạn thảo chương trình Bước 2: Dịch chương trình (nhấn phím F9), có lỗi phải sửa lỗi Bước 3: Chạy chương trình (nhấn phím Ctrl-F9) Cấu trúc chung chương trình Pascal { Phần tiêu đề } PROGRAM Tên_chương_trình; { Phần khai báo } USES ; CONST .; TYPE ; VAR ; PROCEDURE ; FUNCTION ; { Phần thân chương trình } BEGIN END Ví dụ 1: Chương trình Pascal đơn giản BEGIN Write(‘Hello World!’); END Ví dụ 2: Program Vidu2; Const PI=3.14; Var R,S:Real; Begin R:=10; {Bán kính đường tròn} S:=R*R*PI; {Diện tích hình tròn} Writeln(‘Dien tich hinh tron = ‘, S:0:2); { In hình } Readln; End Một số phím chức thường dùng • F2: Lưu chương trình soạn thảo vào đĩa • F3: Mở file file tồn đĩa để soạn thảo • Alt-F3: Đóng file soạn thảo • Alt-F5: Xem kết chạy chương trình • F8: Chạy câu lệnh chương trình • Alt-X: Thốt khỏi Turbo Pascal • Alt-: Dịch chuyển qua lại file mở • F10: Vào hệ thống Menu Pascal Các thao tác soạn thảo chương trình 5.1 Các phím thơng dụng • Insert: Chuyển qua lại chế độ đè chế độ chèn • Home: Đưa trỏ đầu dòng • End: Đưa trỏ cuối dòng • Page Up: Đưa trỏ lên trang hình • Page Down: Đưa trỏ xuống trang hình • Del: Xố ký tự vị trí trỏ • Back Space (): Xóa ký tự bên trái trỏ • Ctrl-PgUp: Đưa trỏ đầu văn • Ctrl-PgDn: Đưa trỏ cuối văn • Ctrl-Y: Xóa dòng vị trí trỏ 5.2 Các thao tác khối văn • Chọn khối văn bản: Shift + • Ctrl-KY: Xoá khối văn chọn • Ctrl-Insert: Đưa khối văn chọn vào Clipboard • Shift-Insert: Dán khối văn từ Clipboard xuống vị trí trỏ Các thành phần ngôn ngữ Pascal 6.1 Từ khóa Từ khố từ mà Pascal dành riêng để phục vụ cho mục đích (Chẳng hạn như: BEGIN, END, IF, WHILE, ) Chú ý: Với Turbo Pascal 7.0 trở lên, từ khoá chương trình hiển thị khác màu với từ khác 6.2 Tên (định danh) Định danh dãy ký tự dùng để đặt tên cho hằng, biến, kiểu, tên chương trình Khi đặt tên, ta phải ý số điểm sau: • Khơng đặt trùng tên với từ khố • Ký tự tên không bắt đầu ký tự đặc biệt chữ số • Khơng đặt tên với ký tự space,các phép tốn Ví dụ: Các tên viết sau sai 1XYZ Sai bắt đầu chữ số #LONG Sai bắt đầu ký tự đặc biệt FOR Sai trùng với từ khố KY TU Sai có khoảng trắng (space) LAP-TRINH Sai dấu trừ (-) phép tốn 10 6.3 Dấu chấm phẩy (;) Dấu chấm phẩy dùng để ngăn cách câu lệnh Không nên hiểu dấu chấm phẩy dấu kết thúc câu lệnh Ví dụ: FOR i:=1 TO 10 DO Write(i); Trong câu lệnh trên, lệnh Write(i) thực 10 lần 6.4 Lời giải thích Các lời bàn luận, lời thích đưa vào chỗ chương trình người đọc dể hiểu mà không làm ảnh hưởng đến phần khác chương trình Lời giải thích đặt hai dấu ngoạc { } cụm dấu (* *) Ví dụ: Var a,b,c:Rea; {Khai báo biến} Delta := b*b – 4*a*c; (* Tính delta để giải phương trình bậc *) 11 Chương CÁC KIỂU DỮ LIỆU CƠ BẢN KHAI BÁO HẰNG, BIẾN, KIỂU, BIỂU THỨC VÀ CÂU LỆNH I CÁC KIỂU DỮ LIỆU CƠ BẢN Kiểu logic - Từ khóa: BOOLEAN - Miền giá trị: (TRUE, FALSE) - Các phép toán: phép so sánh (=, ) phép toán logic: AND, OR, XOR, NOT Trong Pascal, so sánh giá trị boolean ta tuân theo qui tắc: FALSE < TRUE Giả sử A B hai giá trị kiểu Boolean Kết phép toán thể qua bảng đây: A B A AND B A OR B A XOR B NOT A TRUE TRUE TRUE TRUE FALSE FALSE TRUE FALSE FALSE TRUE TRUE FALSE FALSE TRUE FALSE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE TRUE Kiểu số nguyên 2.1 Các kiểu số nguyên Phạm vi Dung lượng -128 → 127 byte → 255 byte Integer -32768 → 32767 byte Word → 65535 byte -2147483648 → 2147483647 byte Tên kiểu Shortint Byte LongInt 2.2 Các phép toán kiểu số nguyên 2.2.1 Các phép toán số học: +, -, *, / (phép chia cho kết số thực) Phép chia lấy phần nguyên: DIV (Ví dụ : 34 DIV = 6) 12 For i:=0 to 32000 if a[i]>1 then writeln(f,i,' ',a[i]); close(f); Writeln((Times-Time)/18.2:0:0); Readln; End 258 ĐỀ SỐ 05: (Đề thi HSG Tỉnh Quảng Bình - Năm học 2013 – 2014) Câu 1: (3,0 điểm) Đếm ký tự DEMKT.PAS Program Dem_ky_tu_chu_cai_in_hoa; Const fi='DEMKT.IN1'; fo='DEMKT.OUT'; Var St: String; Procedure Read_Data; Var f:Text; Begin Assign(f,fi); Reset(f); Readln(f,St); Close(f); End; Function Count_Char:Longint; Var Count,i:Longint; Begin Count:=0; For i:=1 to Length(St) If (St[i] >= 'A') and (St[i] 1) Begin Write(f,i,' '); N:=N div i; End; i:=3; While (N > 1) Begin While (N mod i = 0) Begin Write(f,i,' '); N:=N div i; End; inc(i,2); End; Close(f); End; BEGIN Read_Data; Write_Data; END Câu (2,0 điểm): Đếm số lượng tam giác Program Dem_soLuong_tam_giac; Const fi='TRCOUNT.INP'; fo='TRCOUNT.OUT'; Type 264 TRCOUNT.PAS Longint=longint; Diem=Record x:Longint; y:Longint; End; mmc=array[1 100] of Diem; Var A:mmc; n:Longint; f:text; Procedure Read_Data; Var f:Text; i:Longint; Begin Assign(f,fi); Reset(f); Readln(f,n); For i:= to n Readln(f,A[i].x,A[i].y); Close(f); End; Function IsTriangle(D1,D2,D3:Diem):Boolean; Var x1,x2,y1,y2: Longint; Begin IsTriangle:=True; x1:=D2.x-D1.x; y1:=D2.y-D1.y; x2:=D3.x-D1.x; y2:=D3.y-D1.y; if x1*y2=x2*y1 then IsTriangle:=False; End; Function Count:Longint; Var d,i,j,k:Longint; Begin d:=0; for i:=1 to n-2 for j:=i+1 to n-1 for k:=j+1 to n if IsTriangle(A[i],A[j],A[k]) then 265 inc(d); Count:=d; End; Procedure Write_Data; Var f:Text; Begin Assign(f,fo); ReWrite(f); Writeln(f,Count); Close(f); End; BEGIN Read_Data; Write_Data; END Câu (2,0 điểm): Dãy liên tiếp SUBSUM.PAS Const fi='SUBSUM.INP'; fo='SUBSUM.OUT'; Type mmc=array[0 10000] of Longint; Var b:mmc; f:text; n,m,d:Longint; Procedure Process; Var i,x,j:Longint; Begin assign(f,fi); reset(f); readln(f,n,m); b[0]:=0; for i:=1 to n Begin read(f,x);b[i]:=b[i-1]+x;End; close(f); d:=0; for i:=1 to n for j:=i to n Begin if b[j]-b[i-1]=m then d:=d+1; 266 if b[j]-b[i-1]>m then break; End; assign(f,fo); rewrite(f); writeln(f,d); close(f); End; BEGIN Process; END 267 ĐỀ SỐ 07: (Đề thi HSG Tỉnh Quảng Bình - Năm học 2017 – 2018) Câu 1: (3.0 điểm) Đếm ký tự chữ số COUNT.PAS Const fi='countkt.inp'; fo='countkt.out'; Var i,j,n,dem:Longint; f:text; xau:string; Procedure doc; Begin assign(f,fi); reset(f); read(f,xau); close(f); End; Procedure Process; Begin assign(f,fo); rewrite(f); for i:=1 to length(xau) if (xau[i] in ['0' '9']) then inc(dem); write(F,dem); close(f); End; BEGIN DOC; XULY; END Câu 2: (3,0 điểm): Tổng nguyên tố Program Tong_nguyen_to; Const fi='SPRIME.inp'; fo='SPRIME.out'; Var i,n:Longint; f,g:text; Function NT(n:Longint):Boolean; SPRIME.PAS 268 Var ok: Boolean; i:Longint; Begin ok:=true; For i:=2 to n-1 if (n mod i) = then ok:=ok and false; if n>=2 then NT:=ok else NT:=false; End; Begin Assign(f,fi); Reset(f); Read(f,n); Assign(g,fo); Rewrite(g); For i:=2 to n div if (NT(i) and NT(n-i)) then Writeln(g,n,' = ',i,' + ',n-i); Close(f); Close(g); End Câu (2.0 điểm): Bộ tộc {$MODE OBJFPC} {$R+$B-} Const fi = 'clan.inp'; fo = 'clan.out'; nm = 1000000; Var a : array[1 nm] of longint; n : longint; f : text; Procedure Input; Var i:longint; Begin assign(f,fi); reset(f); readln(f,n); for i:=1 to n read(f,a[i]); close(f); End; 269 CLAN.PAS Procedure quick_sort(dau,cuoi:longint); Var chot,i,j,tg:longint; Begin if dau>=cuoi then exit; i:=dau; j:=cuoi; chot:=a[(dau+cuoi) div 2]; repeat while a[i]chot dec(j); if ij; quick_sort(dau,j); quick_sort(i,cuoi); End; Procedure process; Var i,kq,d:longint; Begin input; quick_sort(1,n); kq:=0; d:=1; for i:=1 to n if a[i]=d then Begin inc(kq); d:=1; End else inc(d); assign(f,fo); rewrite(f); writeln(f,kq); close(f); End; BEGIN PROCESS; END 270 Câu (2.0 điểm): Chữ số thứ N NUMBER.PAS Const fi ='number.inp'; fo ='number.out'; cs:array[1 8] of longint = (9,180,2700,36000,450000,5400000,63000000, 720000000); Var n : longint; f,g : text; Function num(n:longint):char; Var k, so, mu : longint; s : string; Begin k:=1; mu:=1; while (k