Tài liệu bồi dưỡng học sinh giỏi Tin học THCS

Tài liệu bồi dưỡng học sinh giỏi Tin học THCS

Thể loại: Trung học cơ sở
Lượt xem: 110,677Lượt tải: 5Số trang: 21

Mô tả tài liệu

Tài liệu gồm các chương: Chương 1 các thành phần cơ bản của ngôn ngữ lập trình pascal, chương 2 các kiểu dữ liệu cơ bản hằng, biến, biểu thức và câu lệnh, chương 3 các câu lệnh có cấu trúc, chương 4 dữ liệu kiểu mảng (array), chương 5 xâu ký tự (string), chương 6 dữ liệu kiểu file text (tệp), chương 7 chương trình con.

Tóm tắt nội dung

Taøi Lieäu Boài Döôõng HSG Tin 8 Iin Hoïc Treû Khoâng Lieäu Boài Döôõng Hoïc Sinh hoïc 1 CÁC THÀNH PHẦN CƠ BẢN CỦA NGÔN NGỮ LẬP TRÌNH là một ngôn ngữ lập trình bậc cao do Niklaus Wirth, giáo sư điện toán trường Đại học kỹ thuật Zurich (Thụy Sĩ) đề xuất năm 1970. Ông lấy tên Pascal để kỷ niệm nhà toán học và nhà triết học người Pháp nổi tiếng Blaise Các tập tin cần thiết khi lập trình với Turbo lập trình được với Turbo Pascal, tối thiểu cần 2 file Dùng để soạn thảo và dịch chương Thư viện chứa các đơn vị chuẩn để chạy với ra, muốn lập trình đồ hoạ thì phải cần thêm các tập Thư viện đồ Các file điều khiển các loại màn hình tương ứng khi dùng đồ Các file chứa các font chữ đồ họa. 2. Các bước cơ bản khi lập một chương trình 1: Soạn thảo chương 2: Dịch chương trình (nhấn phím F9), nếu có lỗi thì phải sửa 3: Chạy chương trình (nhấn phím Ctrl + F9). 3. Cấu trúc chung của một chương trình Crt; {Khai báo thư viện <Hằng> = <Giá Trị>; {Khai báo <Biến 1>,<Biến 2> : <Kiểu Dữ Liệu>; {Khai báo { Lệnh xóa màn hình kết quả cầu nhập liệu>’); { Nếu cần} {Xử lĩ và hiện kết báo kết quả>); { Nếu {Giữ màn hình kết thích cấu trúc các khai báo trên: Nếu có phần khai báo nào cần cho chương trình thì phải tuân theo thứ tự trên, ví dụ: phần khai báo thư viện (USES) không thể đặt sau phần khai báo hằng số (CONST) hoặc sau (VAR)... sau mỗi phần khai báo phải có dấu ‘;’. - Program: Từ khoá này dùng để khai báo tên chương trình. Tên chương trình phải tuân theo quy tắc: + Không có ký tự trống xen giữa. + Không đặt số ở ký tự đầu tiên. + Trong phần tên không chứa các ký tự đặt biệt như: ‘!’, ‘@’, ‘#’, ‘$’, ‘%’, ‘^’, ‘&’, ‘* ’, ‘(‘, ‘)’, ‘-‘, ‘+’, ‘/’, ‘\’, ‘.’, Kết thúc phải có dấu ‘;’. + Phần này có thể không có. - Uses: Từ khoá này dùng để khai báo việc sử dụng Unit (thư viện) cho chương trình - Const: Từ khoá này dùng để khai báo các hằng số sử dụng trong chương trình, khi báo hằng số là việc cố định một vài giá trị nào đó trong chương trình thông qua tên hằng, ví dụ cách khai báo hằng: - Var: Từ khoá dùng để khai báo các biến số được sử dụng trong chương trình. Biến số là các giá trị có thể thay đổi được trong suốt quá trình chạy của chương trình. Khái niệm về biến số rất quan trọng trong việc lập trình (khái niệm này được trình bày kỹ ở bài 3). Một ví dụ về cách khai báo biến: Var HoDem, Ten : String; N : chú: - Thứ tự các khai báo trên là điều bắt buộc, ta phải nắm thứ tự này cho dù một số khái niệm ta chưa được biết. Trong chương trình Pascal, để tạo lời chú thích, ta sử dụng cặp dấu {...} hoặc (*...*) lồng các câu chú thích vào bên trong nó. - Trên một dòng có thể viết một hoặc nhiều câu lệnh. Các lệnh cách nhau bằng dấu chầm phẩy. Ví dụ : Program ( ‘Truong THCS Luong Tam‘ ); Write ( ‘Ap 3 – Luong Tam – Long My – Hau Giang‘ Các thao tác cơ bản khi soạn thảo chương trình - F2: Lưu chương trình trong khi soạn thảo. - F3: Tạo một file mới hoặc mở một file cũ. - F9: Dịch thử chương trình để kiểm tra lỗi. - Ctrl - F9: Chạy chương trình. - Alt - F5: Xem kết quả chạy chương trình. - Alt - X: Thoát khỏi màn hình soạn thảo chương trình Chuyển qua lại giữa chế độ đè và chế độ Đưa con trỏ về đầu Đưa con trỏ về cuối Up: Đưa con trỏ lên một trang màn Down: Đưa con trỏ xuống một trang màn Xoá ký tự ngay tại vị trí con Space (): Xóa ký tự bên trái con Đưa con trỏ về đầu văn Đưa con trỏ về cuối văn Xóa dòng tại vị trí con trỏ. 5. Các thành phần cơ bản trong phần khai báo của chương trình a. Từ khóa Các từ khoá là các từ dùng để khai báo, đặt tên cho đối tượng trong Pascal, khi ta đặt tên cho đối tượng nào đó, không được đặt trùng tên với các từ từ khoá trong ngôn ngữ Pascal gồm: and, array, begin, case, const, div, do, downto, else, end, file, for, function, goto, if, in, label, mod, nil, not, object, of, or, program, record, repeat, set, string, then, to, type, unit, until, uses, var, while, Pascal không phân biệt ký tự thường hoặc hoa. Ví dụ, các cách viết sau có ý nghĩa như nhau: Begin, BEGIN, begin, beGIN, Tên (định (định danh) là một dãy ký tự dùng để đặt tên cho các hằng, biến, kiểu, tên chương trình con... Khi đặt tên, ta phải chú ý một số điểm được đặt trùng tên với từ khoá.  Ký tự đầu tiên của tên không được bắt đầu bởi các ký tự đặc biệt hoặc chữ số. Không được đặt tên với ký tự space, ‘!’, ‘@’, ‘#’, ‘$’, ‘%’, ‘^’,‘&’, ‘* ’, ‘(‘, ‘)’, ‘-‘, ‘+’, ‘/’, ‘\’, ‘.’, Hằng - Hằng là một đại lượng có giá trị không thay đổi trong suốt chương trình. - Cú pháp khai báo: hằng> = <Giá trị>; Ví = = 'Tran Van = FALSE; d. Biến - Biến là một đại lượng mà giá trị của nó có thể thay đổi trong quá trình thực hiện chương trình. - Cú pháp khai báo: VAR <Tên biến 2>,... : <Kiểu dữ liệu>; Ví y: Real; {Khai báo hai biến x, y có kiểu là b: Integer; {Khai báo hai biến a, b có kiểu Các thành phần cơ bản trong phần thân chương trình a. Biểu thức: Biểu thức là công thức tính toán mà trong đó bao gồm các phép toán, các hằng, các biến, các hàm và các dấu ngoặc đơn. Ví dụ: (x thức số = thức một biểu thức, thứ tự ưu tiên của các phép toán được liệt kê theo thứ tự ngoặc ( )  Phép toán một ngôi (NOT, toán *, /, DIV, MOD, toán +, -, OR, toán so sánh =, <, >, <=, >=, <>, IN Chú ý: Một hăng, một biến, một hàm cũng được xem là biểu thức, đó là biểu thức đơn giản. b. Câu lệnh đơn giản - Câu lệnh gán (:=): <Tên thức>; - Các lệnh xuất nhập dữ liệu: lệnh có cấu trúc - Câu lệnh ghép: BEGIN ... END; - Các cấu trúc điều khiển: IF.., CASE..., FOR..., xuất dữ liệu: Để xuất dữ liệu ra màn hình, ta sử dụng ba dạng số 1> [, <tham số số 1> [, <tham số thủ tục trên có chức năng như khi xuất giá trị của các tham số ra màn hình thì con trỏ không xuống khi xuất giá trị của các tham số ra màn hình thì con trỏ xuống đầu dòng tiếp ra màn hình một dòng tham số có thể là các hằng, biến, biểu thức. Nếu có nhiều tham số trong câu lệnh thì các tham số phải được phân cách nhau bởi dấu dữ liệu: Để nhập dữ liệu từ bàn phím vào các biến có kiểu dữ liệu chuẩn (trừ các biến kiểu BOOLEAN), ta sử dụng cú pháp sau 1> [,<biến n>]); Chú ý: Khi gặp câu lệnh READLN; (không có tham số), chương trình sẽ dừng lại chờ người sử dụng nhấn phím ENTER mới chạy 2 CÁC KIỂU DỮ LIỆU CƠ BẢN I. KIỂU LOGIC - Kiểu logic là kiểu biểu diễn hai trạng thái là đúng (True) hoặc sai (False). Từ khoá để khai báo cho kiểu logic là Các phép toán: phép so sánh (=, <, >) và các phép toán logic: AND, OR, XOR, Pascal, khi so sánh các giá trị boolean ta tuân theo qui tắc: FALSE < sử A và B là hai giá trị kiểu Boolean. Kết quả của các phép toán được thể hiện qua bảng dưới AND B A OR B A XOR B NOT dụ: Var Co : := KIỂU SỐ NGUYÊN a. Các kiểu số kiểu Phạm vi Dung 127 1 255 1 32767 2 65535 2 byte b. Sử dụng hàm Random(n) để lấy số ngẫu Random(n) sẽ trả về một giá trị nguyên mà máy lấy ngẫu nhiên có giá trị từ 0 đến n. Trong đó, n là một số kiểu Word tức là trong khoản từ 0.. 65535. Trước khi sử dụng hàm Random ta phải gọi thủ tục Randomize để khởi tạo bộ tạo số ngẫu nhiên. Ví dụ: Var so : := Các phép toán trên kiểu số phép toán số học: +, -, *, / (phép chia cho ra kết quả là số chia lấy phần nguyên: DIV (Ví dụ : 34 DIV 5 = 6). Phép chia lấy số dư: MOD (Ví dụ: 34 MOD 5 = 4). III. KIỂU SỐ THỰC a. Các kiểu số kiểu Phạm vi Dung byte b. Các phép toán trên kiểu số thực: +, -, *, / Chú ý: - Trên kiểu số thực không tồn tại các phép toán DIV và MOD. - Biến số thực có thể nhận giá trị nguyên. Nhưng biến số nguyên không nhận được giá trị thực. c. Các hàm số học sử dụng cho kiểu số nguyên và số về về căn bậc hai của x về về sin(x) theo về cos(x) theo về theo về về về số nguyên gần với x nhất nhưng bé hơn về phần nguyên của về phần thập phân của tròn số nguyên về giá trị đứng trước về giá trị đứng sau Cho giá trị TRUE nếu n là số n thêm 1 đơn vị n đi 1 đơn vị KIỂU KÍ TỰ - Tên kiểu: Char. (Kích thước: 1 byte) - Để biểu diễn một ký tự, ta có thể sử dụng một trong số các cách sau ký tự trong cặp dấu nháy đơn. Ví dụ hàm CHR(n) (trong đó n là mã ASCII của ký tự cần biểu diễn, bảng mã ASCII có 255 kí tự ). Ví dụ CHR(65) biễu diễn ký tự 'A'. * Các phép toán: =, >, >=, <, <=,<>. * Các hàm trên kiểu ký tự: - Trả về ký tự in hoa tương ứng với ký tự ch. Ví dụ: = 'A'. - ORD(ch): Trả về số thứ tự trong bảng mã ASCII của ký tự ch. Ví dụ CHR(n): Trả về ký tự tương ứng trong bảng mã ASCII có số thứ tự là n. Ví dụ: PRED(ch): cho ký tự đứng trước ký tự ch. Ví dụ: SUCC(ch): cho ký tự đứng sau ký tự ch. Ví dụ: KIỂU XÂU KÍ TỰ - Tên kiểu: String - Là kiểu dữ liệu chứa các giá trị là nhóm các ký tự hoặc chỉ một ký tự, kể cả chuỗi rỗng. Độ dài tối đa của một biến kiểu String là 255, tức là nó có thể chứa tối đa một dãy gồm 255 ký tự. Cú pháp khai báo: Var Biến1, Biến2, Biếnn: String; (1) Var Biến1, Biến2, Biếnn: String [30]; (2) Cách khai báo (1) sẽ cho phép biến HoTen nhận tối đa 255 ký tự. Cách (2) cho phép biến HoTen nhận tối đa 30 ký tự. Ghi chú: Cách sử dụng kiểu dữ liệu String sẽ được trình bày chi tiết Chương 3 CÁC CÂU LỆNH CÓ CẤU TRÚC I. LỆNH ghép là một nhóm các câu lệnh được đặt giữa hai từ khoá BEGIN và END. Lệnh ghép được thực hiện bằng cách thực hiện tuần tự các câu lệnh nằm và END. Cú lệnh 1>; <câu lệnh lệnh <câu lệnh n> có thể có dấu ‘;‘ hoặc không. Lệnh ghép cũng là một dạng câu lệnh. Ví := x; x := y; y := ý: Sau từ khóa END có thể có dấu ‘;‘ hay không tùy thuộc vào các lệnh cấu trúc kế tiếp ta được học. II. CÂU LỆNH LỰA CHỌN (RẼ NHÁNH) 1. Lệnh IF Cú thiếu: IF <Điều kiện> THEN <Câu đủ: IF < Điều kiện> THEN < Câu lệnh 1> ELSE < Câu lệnh 2>; Giải thích lệnh: Khi gặp lệnh này máy kiểm tra < Điều kiện> nếu biểu thức này có giá trị TRUE (tức là đúng như điều kiện đặt ra) thì máy thực hiện <câu lệnh1> nếu ngược lại, tức <biểu thức logic> có giá trị FALSE thì <câu lệnh 2> được thực hiện. Trường hợp trong câu lệnh không có phần ELSE và <biểu thức logic> có giá trị FALSE thì <câu lệnh> không được thực hiện và máy chuyển đến câu lệnh kế sau lệnh IF đó. Chú ý: Trước từ khóa ELSE không đựơc có dấu ‘;‘. Trường hợp có câu lệnh ghép đựơc đặt kế trước ELSE thì từ khoá END trước ELSE không được đặt dấu ‘;‘. Ví dụ 1: Chương trình nhập từ bàn phím 2 số nguyên a, b. Kiểm tra và cho biết số nào lớn hơn. Var a, b : ‘ Nhap so a: ‘ ); ‘ Nhap so b: ‘ ); a > b then Write( ‘ So lon hon la ‘, a) { tại vị trí này không được đặt dấu; } Else Write( ‘ So lon hon la ‘, End. Ví dụ 2: Viết chương trình kiểm tra trong ba số a, b, c được nhập từ bàn phím, số nào là lớn nhất. Var a, b, c, max : ‘ Nhap so a: ‘ ); ‘ Nhap so b: ‘ ); ‘ Nhap so c: ‘ ); := a; If max < b thenMax := b; If max < c then Max := c; Write( ‘ So lon hon la ‘, Lệnh CASE Cú 1 Dạng 2 CASE B OF Hằng 1: S1; Hằng 2: n: B OF Hằng 1: S1; Hằng 2: Sn; ELSE đó:  B: Biểu thức kiểu vô hướng đếm được như kiểu nguyên, kiểu logic, kiểu ký tự, kiểu liệt i: có thể là một giá trị hằng, các giá trị hằng (phân cách nhau bởi dấu phẩy) hoặc các đoạn hằng (dùng hai dấu chấm để phân cách giữa giá trị đầu và giá trị trị của biểu thức và giá trị của tập hằng i (i=1¸n) phải có cùng kiểu. Khi gặp lệnh CASE, chương trình sẽ kiểm tra: - Nếu giá trị của biểu thức B nằm trong tập hằng Hằng i thì máy sẽ thực hiện lệnh Si tương ứng. - Ngược lại: + Đối với dạng 1: Không làm gì cả. + Đối với dạng 2: thực hiện lệnh Sn+1. Ví dụ: Viết chương trình nhập vào một điểm kiểm tra từ bàn phím và in kết quả xếp loại: loại Yếu (dưới 5 điểm), loại Trung bình (5, 6 điểm), loại Khá (7, 8 điểm), loại Giỏi (9, 10 Diem : ‘ Nhap diem : Diem of 0.. 4 : Write( ‘ Xep loai yeu. ‘ ); 5.. 6 : Write( ‘ Xep loai Trung binh. ‘ ); 7.. 8 : Write( ‘ Xep loai Kha. ‘ ); 9..10: Write( ‘ Xep loai Gioi. ‘ ‘ Diem nhap sai. ‘ CÂU LỆNH hợp để giải quyết bài toán nào đó mà ta cần phải lặp đi lặp lại một công việc nào đó thì ta sẽ cần đến lệnh lặp. Số bước lặp có thể xác định hoặc không xác định. Trong ngôn ngữ Pascal có ba câu lệnh lặp là FOR, REPEAT, WHILE. Nếu số vòng lặp xác định thì ta sử dụng lệnh FOR còn vòng lặp không xác định thì ta sử dụng lệnh REPEAT hoặc WHILE. Tất cả các loại lệnh lặp phải có điểm dừng, cho dù đó là loại xác định hay không xác định. 1. Vòng lặp xác định (For) a. Dạng tiến: Cú pháp: FOR <Biến> := <giá trin Min> TO <giá trị max> DO < Câu Lệnh >; <Biến> trong cấu trúc FOR gọi là biến điều khiển. Kiểu của biến điều khiển là kiểu số trin Min>, <giá trị max> phải là kiểu vô hướng đếm được (số nguyên, kí thích sự hoạt động lệnh FOR dạng tiến: B1: Đầu tiên, Biến nhận giá trị của biểu_ Máy kiểm tra Biến có nhỏ hơn hoặc bằng biểu_ thức2 hay không tức là xét điều kiện (Biến <= Biểu_ thức2) ? B3: Nếu điều kiện trên là sai thì máy thoát khỏi vòng lặp FOR để thực hiện các lệnh kế tiếp sau vòng lặp FOR. Nếu điều kiện trên là đúng thì <Lệnh> được thực hiện, sau đó, Biến được tăng một giá trị và quay trở lại bước (2). Lưu ý: Số lần lặp tính bằng công thưc : <giá trị Max> - <giá trin Min> + 1 b. Dạng lùi: Cú pháp: FOR <Biến> := <giá trin Max> DOWNTO <giá trin Min> DO <Câu thích sự hoạt động lệnh FOR dạng lùi: B1: Đầu tiên, Biến nhận giá trị của biểu Máy kiểm tra Biến có lớn hơn hoặc bằng biểu thức2 hay không tức là xét điều kiện (Biến >= Biểu_ thức2) ? B3: Nếu điều kiện trên là sai thì máy thoát khỏi vòng lặp FOR để thực hiện các lệnh kế tiếp sau vòng lặp FOR. Nếu điều kiện trên là đúng thì <Lệnh> được thực hiện, sau đó, Biến được giảm một giá trị và quay trở lại bước (2). Lưu ý - Không được thay đổi giá trị của biến điều khiển bằng một lệnh bất kỳ trong vòng lặp FOR. Điều này có thể làm cho vòng lặp không có lối thoát và dân đến Các Biểu thức1 và Biểu hức2 được ước lượng trước khi vào vòng lặp, do đó số vòng lặp không bị thay đổi. Ta có thể lợi dụng tính tăng hoặc giảm của biến điều khiển để gán giá trị của nó cho bất kỳ biến nào hoặc thực hiện công việc nào đó có tính chất tăng hoặc giảm. 2. Vòng lặp không xác định Dạng B; While B Do S; Ý nghĩa: Dạng REPEAT: Lặp lại công việc S cho đến khi biểu thức B=TRUE thì WHILE: Trong khi biểu thức B=TRUE thì tiếp tục thực hiện công việc S. a. Câu lệnh REPEAT Cú 1>; <Lệnh n>; UNTIL < Biểu thức logic >; Giải thích sự hoạt động lệnh tiên, thực hiện lần lượt các lệnh <Lệnh 1>, <Lệnh 2>,..., <Lệnh n>, sau đó kiểm tra < Biểu thức logic >. Nếu < Biểu thức logic > nhận giá trị FALSE thì lại quay lên đầu vòng lặp thực hiện tiếp <Lệnh 1>, <Lệnh 2>,..., <Lệnh n>. Nếu <Biểu thức logic > nhận giá trị TRUE thì máy thoát khỏi vòng lặp. Như vậy, các lệnh nằm giữa REPEAT... UNTIL được thực hiện ít nhất một lần. Chú ý: - Các lệnh nằm giữa REPEAT và UNTIL không có từ khoá Begin và End. - Trong vòng lặp phải có lệnh nào đó làm thay đổi giá trị một biến trong <Biểu thức logic> nhằm làm dừng vòng lặp, nếu không vòng lặp sẽ chạy mãi không ngừng dẫn đến treo máy. Ví dụ: Chương trình yêu cầu nhập vào một mật khẩu là ‘ttthcn’ thì mới thoát khỏi chương CRT; Var Password : ‘ Xin hay nhap mat khau : ‘ Password = ‘ Ban da nhap dung mat khau ! ‘ thích lệnh: Thủ tục Delay(n) là thủ tục của Unit CRT tức là dừng một khoản thời gian là 1000 xung nhịp của máy, vì vậy, tùy theo tốc độ của máy mà có khoản thời gian thực dừng lại khác nhau. b. Câu lệnh While: Cú < Biểu thức logic > DO < Lệnh >; Giải thích lệnh: Gặp lệnh này trước tiên máy kiểm tra < Biểu thức logic >, nếu nó có giá trị TRUE thì thực hiện < Lệnh > và sau đó quay lại kiểm tra < Biểu thức logic > và quá trình cứ tiếp tục như vậy. Nếu < Biểu thức logic > nhận giá trị FALSE thì máy lập tức thoát khỏi vòng lặp. Như vậy lệnh WHILE dùng để lặp đi lặp lại một công việc trong khi điều kiện còn được thỏa mãn. Ghi chú: Nếu ngay từ khi mới vào vòng lặp mà thấy điều kiện không được thỏa mãn, máy tự động thoát ngay mà không thực hiện < Lệnh > bên trong vòng lặp. Ví dụ: Chương trình tìm ước số chung lớn nhất của hai số a, b, r : Integer; tl : ‘ Nhap hai so a va b : ‘ b); While b <> 0 := a mod b; a := b; b := ‘ Uoc so chung lon nhat la ‘ , a ); Write( ‘ Ban tim USCLN nua khong (C/K) ? = 4 DỮ LIỆU KIỂU MẢNG KHÁI NIỆM Mảng (Array) là một kiểu dữ liệu có cấu trúc bao gồm một số cố định các thành phần có cùng kiểu, có cùng một tên chung. Các thành phần của mảng được truy xuất thông qua các chỉ số. Ví dụ: Mảng A gồm năm phần tử: A[1]=7, A[2]=9, A[3]=0, A[4]= -2, dụng của mảng là dùng để lưu trữ một dãy số liệu có cùng một tính chất nào đó. Ví dụ: các điểm kiểm tra một môn học nào đó của một học sinh, các giá trị của một dãy số được nhập từ bàn phím. II. KHAI BÁO MẢNG 1. Mảng Một chiều a . Khai báo mảng một Tên_ biến_ mảng : ARRAY [1.. n] OF Kiểu phần Tử; Trong đó: - Kiểu phần tử là kiểu dữ liệu của mỗi phần tử trong mảng (Integer, real, string, …). - 1.. n là danh sách các chỉ số để truy cập đến các thành phần của mảng. Ví dụ: Var ch : Array[0.. 25] of Char; Th : 4] of Real; b. Truy cập câc phần tử của truy nhập vào một phần tử nào đó của biến mảng được thực hiệnh qua tên biến mảng, theo sau là giá trị chỉ số đặt trong dấu [ ]. Ví dụ: Ch[2] := := 12.5; c. Ví dụ : Nhập n số thực từ bàn phím vào một mảng, tính trung bình cộng của các số này. Uses CRT; Var i,n : : Real; a : Array[1.. 100] of ‘ Ban muon nhap bao nhieu PT cho mang : ‘ ); i := 1 to n do Begin Write( ‘A[ ‘ , i , ‘ ]= ’ := 0; For i := 1 to n do s := s + ‘ Trung binh cong cua day so = ‘ , s / n : 0 : 4 Mảng Hai Chiều a. Khai báo Việc khai báo mảng hai chiều cũng giống như mảng một chiều, chỉ có điều khác là nó có hai tập chỉ số được viết cách nhau bởi dấu ‘,’. Ví dụ: Var A : Array[1.. 30, 1.. 50] of : Array[1.. 3, 1.. 3] of Real; b. Truy cập câc phần tử của mảng: Số phần tử của mảng số thực B là 3 x 3 = 9 (phần tử), sắp đặt trong bộ nhớ theo thứ tự như sau: B[1, 1] B[1, 2] B[1 ,3] B[2, 1] B[2, 2] B[2 ,3] B[3, 1] B[3, 2] B[3 ,3] Chú ý: Mảng hai chiều còn gọi là ma trận. Trong ví dụ trên, B là ma trận cấp 3x 3. Trong mảng hai chiều, chỉ số sau truy cập nhanh hơn chỉ số trước. Để truy cập đến phần tử hàng thứ i, cột thứ j của mảng hai chiều B ta dùng cách viết: B[ i ][ j ] hoặc B[ i , j ] c. Ví dụ: Nhập một ma trận m hàng, n cột từ bàn phím. Tính và in ra màn hình tổng của mỗi cột và tổng của mỗi m, i, j : : Real; a : Array[1.. 30, 1.. 30] of ‘ Ban muon nhap ma tran bao nhieu hang va cot ? ‘ ); Readln( m, n ); For i := 1 to m do For j := 1 to n ' PT thu [ ' , i , ' , ‘ , j, ‘ ] = ' a[ i, j ] j := 1 to n := 0; For i := 1 to m do Sum := sum + a[ i, j ]; Write( ‘ Tong cot ‘ , j ,’ = ‘ , sum : 0 : 5 i := 1 to m := 0; For j := 1 to n do Sum := sum + a[ i, j ]; Write( ‘ Tong hang ‘ , i ,’ = ‘ , sum : 0 : 5 5 XÂU KÝ TỰ KHAI BÁO KIỂU (String) là kiểu dữ liệu có cấu trúc dùng để xử lý các xâu ký tự. Kiểu String có nhiều điểm tương tự như kiểu mảng (Array) nhưng cũng có điểm khác nhau là: số ký tự trong một biến kiểu xâu có thể thay đổi còn số phần tử của kiểu mảng luôn cố định. Cú biến : đó Max là số ký tự tối đa có thể chứa trong chuỗi (Max [0,255]). Nếu không có khai báo [Max] thì số ký tự mặ mặc định trong chuỗi là 255. Ví : : String; {St có tối đa là 255 ký tự} II. TRUY XUẤT DỮ LIỆU KIỂU in một xâu ký tự ta dùng lệnh Write(St) hoặc sẽ đọc các ký tự cho xâu St với độ dài thực sự là số ký tự gõ vào từ bàn phím. Nếu ta gõ < Enter > luôn mà không nhập cho nó ký tự nào thì St là xâu rỗng. Ví dụ: Var ten, st1, st2 : ‘ Vui long nhap ten cua ban: ‘ ‘ Hello ‘, ten, ‘ ! ‘ ); st1 := ‘ Turbo Pascal ‘; st2 := ‘ product is ‘ + ý: Để truy xuất đến ký tự thứ k của xâu ký tự, ta sử dụng cú pháp sau: dụ: st1[4] ’b’ III. CÁC PHÉP TOÁN TRÊN XÂU KÝ TỰ 1. Phép gán: Biến := lượng bên phải của lệnh phải được đặt giữa hai dấu nháy đơn nếu đó là xâu ở dạng hằng. Ta có thể sử dụng dấu cộng (+) để ghép các xâu khi gán. Ví dụ: HoTen:= ‘Huynh Ngoc‘ + ‘ Nhan‘; 2. Phép nối hiệu bằng dấu +. Ví dụ: ‘Turbo’ + ‘ Pascal‘ = ‘Turbo Các phép toán so sánh: Khi so sánh hai xâu, các ký tự của hai xâu được so sánh từng cặp một từ trái qua phải theo giá trị trong bảng mã ASCII. Ví dụ: Nếu so = ‘ABC’ có giá trị = ‘AB’ có giá trị là < ‘ABED’ có giá trị là > ‘AD’ có giá trị là CÁC THỦ TỤC VÀ HÀM VẾ XÂU KÝ TỰ 1. Các thủ tục: a. Delete(St , Pos, đó: - St (String): Biến kiểu String. - Pos Biến kiểu nguyên. - Num (Number): Biến kiểu dụng: Thủ tục này dùng để xóa khỏi xâu St một số Num ký tự bắt đầu từ vị trí thứ Pos. Ví dụ: Nếu St = 2, ); ð làm cho St = 2, 10); ð làm cho St = 9, 3); ð làm cho St = St1, đó: - St2 và St1: Biến kiểu String. - Pos: Biến kiểu dụng: Thủ tục này dùng để chèn xâu St2 vào xâu St1 ở vị trí Pos. Ví dụ: Nếu St := ‘ABCD’ thì sau lệnh St, 3) ta nhận được St := Trường hợp Pos vượt quá chiều dài của St1 thì St2 sẽ được nối đuôi vào St1. Ví dụ: St = ‘ABCD’ , vậy lệnh ST, 9); sẽ làm cho St = đó: - Value: Là một biểu thức nguyên hay thực có ghi dạng in ra. - St: Biến kiểu dụng: Thủ tục này dùng để đổi giá trị số Value thành kiểu xâu rồi gán cho St. Ví dụ: i := St); { ta được St = ‘ 1234’ có 5 ký tự } x St); { ta được St = ‘ } d. Val(St, Var, đó: - St: Biểu thức kiểu String. - Var: Là biến kiểu nguyên hay thực. - Code: Biến kiểu dụng: Thủ tục này đổi xâu chữ St (biểu diên ở dạng số nguyên hay thực) thành số và gán cho biến Var. Code là biến nguyên dùng để phát hiện lỗi: nếu phép biến đổi đúng thì Code có giá trị 0, nếu sai do St không biểu diễn đúng số nguyên hay thực thì Code sẽ có giá trị bằng vị trí của ký tự sai trong xâu St. Giả sử: St := ‘234’ , i và e là hai biến i, e); { cho ta i = 234 và e = 0 } Nếu St := ‘21x’ thì Val(St, i, e) {cho ta i không xác định và e=3, tức là ký tự thứ ba gây ra lỗi} 2. Các hàm: a. Cho ta độ dài của biểu thức xâu ký tự St. Ví dụ: với St = thì sẽ trả về giá trị 7. b. Copy(St, Pos, đó: - St: Biểu thức kiểu xâu ký tư. - Pos,Num: Biểu thức kiểu này trả về cho ta một xâu mới từ xâu St, hàm bắt đầu chép từ vị trí Pos và chép Num ký tự. Ví dụ: St = ‘ABCDEF’ thì lệnh Copy(St, 3, 2) = ‘CD’ và 10) cho ta ‘DEF’. Ghi chú: - Nếu Pos + Num > thì hàm sẽ trả về các ký tự trong xâu St. - Nếu Pos > thì hàm Copy sẽ trả về cho ta một xâu rỗng. c. St2,..., Stn): Hàm này dùng để ghép tất cả các xâu ký tự St1, thành một xâu theo thứ tự các đối số cung cấp cho hàm. Ghi chú: - Số lượng đối của hàm Concat phải >= 2. - Nếu tổng số chiều dài các xâu > 255 thì máy sẽ báo lỗi. - Có thể dùng phép cộng (+) để ghép xâu ký tự. Ví dụ: St +’N’); d. Pos(St1, đó: St1, St2 là biểu thức xâu ký tự. Hàm này trả về số nguyên biểu diễn vị trí đầu tiên của St1 gặp trong xâu St2. Nếu không tìm thấy thì Pos = 0. Ví dụ: nếu St := thì = 4, = 2, = 6 KIỂU TẬP HỢP I. ĐỊNH NGHĨA Dữ liệu kiểu tập hợp là một tập hợp của những dữ liệu cùng thuộc một kiểu vô hướng đếm được. Một kiểu tập hợp được khai báo theo dạng sau: SET OF Ví dụ: Type Chu_so = Set of 0.. 9; Chu_hoa = Set of ‘A’.. ‘Z’; Var So : Chu_so; Chu : Chu_hoa; Mau : Set of (Xanh, Vang, Tim); Chú ý: - Các giá trị được đưa vào tập hợp cần có số thứ tự trong khoản từ 0 đến 255. - Như vậy, với khai báo:Type Tap_so = Set of 10.. 256; Kết quả khi dịch máy sẽ thông báo lỗi: Set base type out of range. - Một dữ liệu kiểu tập hợp có dạng các phần tử nằm trong hai dấu ngoặc [ ]. Ví dụ: [‘A’, ’E’ ], Tập hợp rỗng ký hiệu là [ ]. - Biến tập hợp cho phép có từ 0 đến 256 phần tử. - Có thể thực hiện phép gán trên kiểu tập hợp. Ví dụ: So := [0, 4, 9]; Chu := [ ]; {Tập hợp rông} Mau := [Vang, Tim]; II. CÁC PHÉP TOÁN a. Phép toán quan hệ: Phép toán = cho giá trị True nếu hai tập hợp bằng toán < > cho giá trị True nếu hai tập hợp khác toán <= (A <= B) cho giá trị True nếu A là tập con của B. Phép toán >= (A >= B) cho giá trị True nếu B là tập con của A. Chú ý: Không có phép toán < và > cho kiểu tập hợp. Để kiểm tra tập hợp A có thật sự nằm trong B hay không ta dùng câu lệnh: If (A< > B) and (A<=B) then Write( ‘A la tap con that su cua B ‘); b. Phép toán IN: Phép toán IN dùng để xem xét một phần tử nào đó có nằm trong tập hợp không ? Nếu phần tử đó có trong tập hợp thì phép toán sẽ trả về giá trị True, ngược lại cho giá trị False. Ví dụ: ‘C’ In [‘A’, ’C’, ‘D’] cho kết quả True.‘E’ In [‘A’, ’C’, ‘D’] cho kết quả False. c. Phép toán hợp, giao, hiệu: A + B là hợp của A và B: tập hợp các phần tử thuộc A hoặc thuộc B. A * B là giao của A và B: tập hợp các phần tử thuộc A và thuộc B. A - B là hiệu của A và B: tập hợp các phần tử thuộc A và không thuộc B. Ví dụ: A := [1, 3, 9]; B := [9, 2, 5]; Vậy: A * B có giá trị là [9]. A - B có giá trị là [1, 3]. III. CÁC VÍ DỤ Ví dụ: Viết chương trình nhập vào một chữ cái. Xét xem chữ cái đó là nguyên âm hay phụ âm. Var ChuCai, NguyenAm : Set of Char; Ch : := [‘A’.. ’Z’, ‘a’.. := [‘A’, ‘E’, ‘I’, ‘O’, ‘ Nhap mot chu cai de kiem tra: ‘ ); Ch IN IN NguyenAm then ‘ la nguyen am. ’ ) Else ‘ la phu am. 7 DỮ LIỆU KIỂU FILE TEXT (TỆP) I. KHAI BÁO Trong Pascal có một kiểu tệp đã được định nghĩa trước, đó là tệp văn bản được định nghĩa với tên chuẩn Text. Thành phần cơ sở của tệp kiểu Text là ký tự. Tuy nhiên, văn bản có thể được cấu trúc thành các dòng, môi dòng được kết thúc bởi dấu hiệu EOLN (End Of Line). Như vậy, muốn đọc và in ra từng dòng của tệp văn bản thì sử dụng dạng Text. Tệp văn bản được kế tthúc bởi dấu End Of File, cụ thể với Turbo Pascal là Ctrl-Z (^Z) có mã ASCII = 26. Cú pháp: Var <Biến text>: Text; Ví dụ: Var f, g: text; II. CÁC THAO TÁC TRÊN TỆP a. Ghi vào một tệp văn bản: Ta có thể ghi các giá trị kiểu Integer, Real, vào tệp văn bản bằng lệnh Write hoặc Writeln. Có ba dạng Item1, Item1, (3) Lệnh (1): Viết các giá trị Item1, là các hằng, biểu thức hay biến có kiểu đơn giản như: Nguyên, Thực, Ký tự, Chuôi, Logic vào biến tệp FileVar. Lệnh (2): Tương tự như (1) nhưng có thêm dấu hiệu hết dòng vào tệp sau khi đã viết hết các giá trị Item1, Lệnh (3): chỉ thực hiện việc đưa thêm dấu hiệu hết dòng vào tệp. Ghi chú: Từ câu lệnh (2) ta có thể chuyển sang viết như Cấu trúc cơ bản để mở và ghi tệp lưu dụ 1: Tạo một tệp chứa các số nguyên từ 1 đến 100 với tên tệp trên đĩa là . Program i: File Of i:= 1 to 100 dụ 2: Ghi bảng chữ cái vào file có tên lưu trong thư mục gốc của ổ đĩa Crt; Var F: {Gán tệp cho biến {Mở tệp – chưa có phần tử nào} For ch:= ’a’ to ‘z’ do Write(F, ch,’ ‘); {Ghi giá trị của biến Ch và khoảng trắng vào file F {Sau khi ghi xong đóng File Đọc dữ liệu từ một tệp đã có Ta có thể đọc không những các ký tự từ tệp văn bản mà còn có thể đọc lại các số nguyên, thực, logic từ tệp văn bản thông qua các thủ Var1, Var1, (3) Trong đó, Var1, là các biến thuộc kiểu ký tự, nguyên, thực, logic, chuỗi. Lệnh (1) sẽ đọc nội dung một hay nhiều phần tử mà không chuyển cửa sổ tệp xuống dòng. Lệnh (2) đọc như lệnh (1) nhưng sẽ di chuyển cửa sổ tệp sang đầu dòng tiếp theo sau khi đã lần lượt đọc các biến tương ứng. Lệnh (3) đưa cửa sổ tệp sang đầu dòng tiếp theo mà không đọc gì cả. Cấu trúc cơ bản để đọc dữ liệu từ một tệp đã có như lưu tệp>’); not EOF(<Biến text>) lưu giá lí biến lưu giá trị theo yêu cầu của đề dụ 1: Giả sử đã tồn tại một tệp có tên là chứa các số kiểu Byte và có ít nhất ba phần tử. Thực hiện đọc ra giá trị thứ nhất và thứ ba của tệp và gán cho hai biến A, B tương A, B: Byte; F: File Of {đọc một phần tử thứ nhất của tệp ra biến {đọc một phần tử thứ hai của tệp ra biến {đọc một phần tử thứ hai của tệp ra biến B} {lúc này B không giữ giá trị thứ hai dụ 2: Đọc tất cả các phần tử của một tệp chứa các số có Integer nào đó và ghi ra màn hình giá trị các số đó và cuối cùng ghi ra só phần tử của CRT; Var i, d: can doc la gi ? ’); {Nhập tên File cần tenfile); {Mở File chuẩn bị {Đưa con trỏ về đầu File chuẩn bị 0; While Not EOF(F) {Đọc một phần tử trong file F bỏ vào biến ‘); d:=d+1; {Đóng phan tu cua tep ’, tenfile,’ la CÁC HÀM VÀ THỦ TỤC XỬ LÍ TỆP 1. Hàm EOF(Var F: Text): Boolean. Hàm trả về giá trị False khi cửa sổ tệp chưa đến cuối tệp, ngược lại, cho giá trị True. Hàm này thường sử dụng để kiểm tra xem đã đọc hết tệp văn bản chưa. Ví dụ: While not EOF(F) Do... 2. Hàm EOLN(Var F: Text): Boolean. Hàm trả về giá trị False khi cửa sổ tệp chưa đến điểm cuối dòng hoặc cuối tệp, ngược lại, cho giá trị True. Hàm này thường sử dụng để kiểm tra xem đã đọc đến cuối dòng chưa. Ví dụ: While not EOLN(F) Do.. 3. Thủ tục thêm dòng: Cú pháp: F: Append mở tệp văn bản để ghi bổ sung các dòng, định vị cửa sổ tệp vào cuối tệp. Lần sử dụng kế tiếp với thủ tục Write hay Writeln sẽ thêm văn bản vào cuối tệp. Ví dụ: Chương trình sau đây thêm hai dòng vào cuối tệp F: la dong thu nhat them la dong thu hai them 8 CHƯƠNG TRÌNH CON I. KHÁI NIỆM Trong khi lập trình chúng ta thường gặp những đoạn chương trình lặp đi lặp lại nhiều lần ở những chỗ khác nhau. Để tránh rườm rà những đoạn chương trình này được thay thế bằng các chương trình con tương ứng. Khi cần, ta chỉ cần gọi tên chương trình con đó ra. Lý do thứ hai để xây dựng chương trình con: Một vấn đề lớn và phức tạp sẽ tương ứng với một chương trình có thể rất lớn và dài. Do đó việc sửa chữa chương trình sẽ rất khó khăn. Ta có thể phân tích nó thành các vấn đề nhỏ hơn, để dễ kiểm tra, sau đó ghép lại thành một chương trình lớn. II. PROCEDURE và FUNCTION (Thủ tục và Hàm) Trong Pascal có hal loại CTC : - PROCEDURE (thủ tục) - FUNCTION (hàm) Sự khác nhau cơ bản và duy nhất của hai loại CTC này là FUNCTION trả lại một giá trị kết quả vô hướng thông qua tên function và do đó nó có thể sử dụng như một biến, hằng biểu thức. Còn PROCEDURE không trả lại kết quả thông qua tên của biểu thức nên procedure không thể viết trong biểu thức. III. CẤU TRÚC CỦA CHƯƠNG TRÌNH CON 1. Function <TÊN CHƯƠNG TRÌNH CRT; VAR <BIẾN CỦA CHƯƠNG TRÌNH CHÍNH>: <KIỂU DỮ <tên hàm>(<đối số>:<kiểu dữ dữ liệu của hàm>; Var <biến ct dữ liệu>; Kq:<kiểu dữ liệu hàm>; chương trình hàm>:=kq; {lấy giá trị cho CHƯƠNG TRÌNH <tên hàm>(đối số); {Gọi Procedure (Thủ <TÊN CHƯƠNG TRÌNH CRT; VAR <BIẾN CỦA CHƯƠNG TRÌNH CHÍNH>: <KIỂU DỮ <tên thủ tục>(Var <đối số>:<kiểu dữ <biến thủ dữ thủ tục>; CHƯƠNG TRÌNH thủ tục>(đối số); {Gọi thủ TRUYỀN THAM SỐ CHO CHƯƠNG TRÌNH CON Có 2 cách chuyển tham số : - Tham trị (value - Tham biến (variable VD : PROCEDURE VAR Tham trị : i,j Tham biến : x,y Sự khác nhau giữa tham trị và tham biến : - Tham trị có thể là hằng, biến, biểu thức. Còn tham biến chỉ có thể là biến - Nếu tham trị là biến thì giá trị nó sẽ không thay đổi sau khi CTC thực hiện. Còn tham biến sẽ thay đổi giá trị nếu trong CTC có lệnh làm thay đổi giá trị của nó VD : * Hàm SIN (X) Trong này X là tham trị và ta có thể viết - KQ := SIN (1); X=1 - KQ := SIN (Y*2); X=Y*2 - KQ := SIN (X); X=X Và sau khi thực hiện giá trị của X vẫn không thay đổi. * Hàm DEC (X) Trong này X là tham biến, ta chỉ có thể viết - DEC (X); X là biến kiểu nguyên Không thể viết - DEC (5); X là hằng - DEC (Y*2); X là biểu thức Sau khi gọi hàm giá trị của X sẽ thay đổi (giảm đi 1) V. FUNCTION VÀ CÁCH LỰA CHỌN Trong FUNCTION bắt buộc phải có lệnh gán giá trị cho tên hàm Tên_hàm := <biểu thức> Chúng ta chỉ nên dùng FUNCTION khi và chỉ khi nó đồng thời thoả các điều kiện sau : - Nếu ta muốn nhận lại một và chỉ một kết quả - Kết quả đó phải là kiểu vô hướng Còn nếu không thoả mãn thì chúng ta nên dùng VD : CTC tính bình phương của một số FUNCTION BEGIN := X*X; END; Nếu dùng PROCEDUR (X:Real; VAR BEGIN kq := X*X; END; Khi kiểm tra xem tổng bình phương của a và b có bằng c không : - Nếu là FUNCTION ta viết : IF = THEN - Nếu là PROCEDURE ta viết (a,kqa); (b,kqb); (c,kqc); IF THEN Rõ ràng cách dùng FUNCTION có lợi hơn VI. BIẾN TOÀN CỤC VÀ BIẾN ĐỊA PHƯƠNG 1. Biến toàn cục Là các biến được khai báo trong chương trình chính. Các biến này đều có tác dụng ở mọi nơi trong chương trình. 2. Biến cục bộ Là các biến được khai báo trong chương trình con. Các biến này chỉ có tác dụng trong chương trình con đó. Khi chương trình con kết thúc, các biến này cũng mất tác dụng theo. 3. Chú ý Nếu trong CTC có khai báo biến (hằng) trùng với tên biến (hằng) trong chương trình chính thì chương trình con sẽ ưu tiên xử lý biến (hằng) trong chương trình chính. Và khi thoát khỏi chương trình con đó. Giá trị của biến trong chương trình vẫn giữ nguyên giá trị trước khi gọi CTC. VD : CONST I=5; PROCEDURE THU; VAR I : INTEGER; BEGIN I := END; BEGIN END. Trên màn hình sẽ xuất hiện 5 Giá trị biến toàn cục 6 Giá trị biến địa phương 5 Giá trị biến toàn cục VII. TÍNH ĐỆ QUY CỦA CHƯƠNG TRÌNH CON Trong PROCEDURE và FUNCTION có thể có lời gọi chính nó. Tính chất này gọi là đệ quy. VD : Tính N! qua định nghĩa N! = hoặc định nghĩa theo đệ quy N! = 1 khi N=0 N! = (n-1)!.n khi N>=1 Khi đó hàm GIAI_THUA có thể định nghĩa như sau FUNCTION GIAI_THUA BEGIN IF n=0 THEN GIAI_THUA := 1 ELSE GIAI_THUA := END; MỤC LỤC TOC \o "1-2" \h \z \u Chương 1 CÁC THÀNH PHẦN CƠ BẢN CỦA NGÔN NGỮ LẬP TRÌNH 2 CÁC KIỂU DỮ LIỆU CƠ BẢN HẰNG, BIẾN, BIỂU THỨC VÀ CÂU 3 CÁC CÂU LỆNH CÓ CẤU 4 DỮ LIỆU KIỂU MẢNG 5 XÂU KÝ TỰ 6 DỮ LIỆU KIỂU FILE TEXT 7 CHƯƠNG TRÌNH Ngoâ Döông THCS Löông Döông THCS Löông Taâm