Tìm hiểu Ngôn ngữ lập trình Pascal

Pascal có 4 kiểu cấu trúc dữliệu là kiểu mảng (ARRAY), tập hợp (SET), bản

ghi (RECORD) và tập tin (FILE). Sau đây ta lần lượt tìm hiểu từng kiểu cấu trúc.

1. Dữliệu kiểu mảng (Array-Type Data)

Một mảng dữliệu là một tập hợp sốhữu hạn phần tửcó giống nhưcác biến,

có cùng kiểu, gọi là kiểu cơbản.

Mảng được được tổchức theo một trật tựxác định. Sốphần tửcủa mảng

được khai báo ngay từkhi định nghĩa ra mảng.

a. Mảng một chiều (One-Dimensional Array)

Mảng một chiều có thể được hiểu nhưmột danh sách các phần tử(theo cột),

có cùng kiểu. Mỗi phần tửcủa mảng được xác định được truy nhập trực tiếp thông

qua tên mảng cùng với chỉdẫn truy nhập được đểgiữa hai ngoặc vuông []

pdf84 trang | Chia sẻ: maiphuongdc | Lượt xem: 3025 | Lượt tải: 5download
Bạn đang xem trước 20 trang tài liệu Tìm hiểu Ngôn ngữ lập trình Pascal, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
à Nội 2 Điện thoại: 02113.505.909 i). Gõ Alt - C để vào Menu COMPILE ii). i đến mục Destination và nhấn Enter để chương trình tự động đổi Memory thành Disk iii). Gõ C (hoặc F9) để biên dịch chương trình tạo nên một file.TPU iv). Khi dịch xong gõ một phím bất kỳ. Sau đó ta có thể lập lại bước a và b để chuyển Destination từ Disk sang Memory. 2. Ví dụ ' Ví dụ 7.11: Tạo một UNIT tính Cộng, Trừ, Nhân, Chia cho học sinh tiểu học. Tên file Unit là TTIEUHOC.PAS với nội dung sau: UNIT TTieuHoc; {Phần đầu: Chương trình Toán Tiểu học} INTERFACE {Phần giao diện} PROCEDURE Cong (Var So1, So2, So3: Real); PROCEDURE Tru (Var So1, So2, So3: Real); PROCEDURE Nhan (Var So1, So2, So3: Real); PROCEDURE Chia (Var So1, So2, So3: Real); INPLEMENTATION {Phần cài đặt} PROCEDURE Cong; BEGIN IF So1 + So2 = So3 THEN Writeln ('Giỏi lắm ! Em đã làm đúng! ') ELSE Writeln (' Rất tiếc, em đã làm sai ! '); END; PROCEDURE Tru; BEGIN IF So1 - So2 = So3 THEN Writeln (' Giỏi lắm ! Em đã làm đúng!') ELSE Writeln (' Rất tiếc, em đã làm sai ! '); END; PROCEDURE Nhan; BEGIN IF So1 * So2 = So3 THEN Writeln ('Giỏi lắm ! Em đã làm đúng !') ELSE Writeln (' Rất tiếc, em đã làm sai ! '); END; PROCEDURE Chia; BEGIN IF So2 = 0 THEN Writeln ('Số chia phải khác 0') ELSE IF So1 / So2 = So3 THEN Writeln ('Giỏi lắm! Em đã làm đúng! ') ELSE Writeln (' Rất tiếc, em đã làm sai ! '); END; END. {Chấm dứt UNIT} Mọi chi tiết xin liên hệ theo địa chỉ : Email: thienthanvitinh.ntb.sp2@gmail.com Nguyễn Thanh Bình Khoa K33 Tin học, trường ĐHSP Hà Nội 2 Điện thoại: 02113.505.909 Sau khi gõ chương trình Unit trên, đổi Compile Destination thành Disk, biên dịch và tạo tập tin TTIEUHOC.TPU trên đĩa. Chương trình Pascal cho bài toán Cộng, trừ, Nhân, Chia dùng Unit TTIEUHOC: PROGRAM Toan_Tieu_Hoc; USES CRT, TTieuHoc; VAR chon: Integer; So1, So2, So3: Real; PROCEDURE Menu (Var chon: integer); BEGIN ClrScr; Writeln (' == TOáN TIểU HọC == '); Writeln (' = 0. Chấm dứt = '); Writeln (' = 1. Toán cộng = '); Writeln (' = 2. Toán trừ = '); Writeln (' = 3. Toán nhân = '); Writeln (' = 4. Toán chia = '); Writeln (‘ ================== ‘); Write (' Bạn chọn số mấy ? '); Readln (chon); END; PROCEDURE nhapso (Var So1, So2, So3: real ); BEGIN Write (' Nhập vào số thứ 1: '); Readln(So1); Write (' Nhập vào số thứ 2: '); Readln(So2); Write (' Kết quả là : '); Readln (So3); END; {=====================Chương Trình Chính ========================} BEGIN CLRSCR; REPEAT Menu (chon); CASE chon OF 1: BEGIN Writeln; Writeln (' == Toán cộng == '); Nhapso(So1, So2, So3); Cong(So1, So2, So3); Mọi chi tiết xin liên hệ theo địa chỉ : Email: thienthanvitinh.ntb.sp2@gmail.com Nguyễn Thanh Bình Khoa K33 Tin học, trường ĐHSP Hà Nội 2 Điện thoại: 02113.505.909 END; 2: BEGIN Writeln; Writeln (' == Toán trừ == '); Nhapso(So1, So2, So3); Tru(So1, So2, So3); END; 3: BEGIN Writeln; Writeln (‘ == Toán nhân == ‘); Nhapso(So1, So2, So3); Nhan(So1, So2, So3); END; 4: BEGIN Writeln; Writeln (‘ == Toán chia == ‘); Nhapso(So1, So2, So3); Chia(So1, So2, So3); END; END; {case} Writeln (' Gõ bất kỳ phím nào để tiếp tục... '); Readln; UNTIL chon = 0; END. {Ngưng làm toán} =========================================================== ==== BÀI ĐỌC THÊM TOP - DOWN STRUCTURED PROGRAMMING hay LẬP TRÌNH THEO CẤU TRÚC TRÊN - XUỐNG --- oOo --- Nếu các bạn là một người mới bắt đầu khởi sự thực hành lập trình một bài toán nào đó, các bạn sẽ thường tự hỏi: Ta phải bắt đầu bằng việc gì đây? ây là một câu hỏi không phải ai cũng trả lời chung được. Tuy nhiên, dựa vào kinh nghiệm thu thập được của những người lập trình tài tử và của những lập trình viên chuyên nghiệp, tác giả Francis Scheid, trong tác phẩm Computer and Programming của mình, đã cho một số lời khuyên sau: 1. Ôn lại những kinh nghiệm đã qua để xem coi vấn đề của bạn có chút gì tương tự đến các vấn đề mà bạn đã từng chạm trán trước đây không; Mọi chi tiết xin liên hệ theo địa chỉ : Email: thienthanvitinh.ntb.sp2@gmail.com Nguyễn Thanh Bình Khoa K33 Tin học, trường ĐHSP Hà Nội 2 Điện thoại: 02113.505.909 2. Trước tiên, thử làm một phiên bản đơn giản. Nếu có thể, đưa ngay vào một số trường hợp đặc biệt mà bạn có, nhằm tạo chương trình bạn có một vẻ gì sâu sắc. 3. Chia bài toán ra thành những bài nhỏ, rồi tiếp tục chẻ những bài nhỏ này thành những phần nhỏ hơn, nếu được, chẻ tiếp những phần nhỏ này thành những mảnh nhỏ hơn nữa, sau đó giải quyế từng phần hay mảnh nhỏ này. Mỗi thuật toán có thể thể hiện bằng lưu đồ (flow chart). Lưu đồ chính là bản đồ lộ trình của thuật toán. Không hẳn tất cả những chuyên viên máy tính phải thực hiện lưu đồ trước khi lập trình nhưng nhờ có lưu đồ mà công việc của bạn trở nên rõ ràng và mang tính logic hơn. Bạn sẽ không cảm thấy bối rối khi cần phải trình bày tiến trình giải toán của bạn cho người khác hiểu. Bạn có thể mất một ít thời gian cho lưu đồ nhưng nó có giá trị hơn cả ngàn từ nếu phải cắt nghĩa thuật toán. Chúng ta hãy tưởng tượng bài toán to lớn của chúng ta như một cây cổ thụ nhiều cành lá rậm rạp. Ta muốn đốn cây này về nhà làm củi chụm và dĩ nhiên, ta không thể nào chặt ngang gốc cây mà vác về nhà (thí dụ này không có ý khuyến khích phá hoại môi trường đâu nhé ! ). Vậy tại sao ta không tỉa từng cành nhỏ rồi dần dần thanh toán luôn cả cây ? Giải quyết vấn đề của chúng ta cũng vậy. Bạn cứ xem bài toán của chúng ta như một gốc cây lộn ngược đầu. Chia nhỏ bài toán ra thành những vấn đề nhỏ hơn, rồi nhỏ hơn nữa nếu nó còn phức tạp, như minh họa ở hình sau đây: Trong hình vẽ trên, bài toán được phân thành 4 vấn đề nhỏ hơn là A, B, C và D. Vấn đề B và D có thể giải quyết được ngay. Riêng vấn đề A và C thì lại tiếp tục chia nhỏ hơn nữa để thành những mảnh nhỏ có thể giải quyết được. ở đây các nhánh cây không dài ngắn như nhau, dễ hiểu bởi vì mức độ phức tạp của mỗi vấn đề không thể như nhau và tùy theo thuật toán cần giải quyết mà ta phân nhỏ nó ra. Bài toán của chúng ta sẽ đi từ vấn đề trừu tượng đến cụ thể. Cách giải quyết như vậy giống như hệ thống phân quyền trong tổ chức chính phủ: Mọi chi tiết xin liên hệ theo địa chỉ : Email: thienthanvitinh.ntb.sp2@gmail.com Nguyễn Thanh Bình Khoa K33 Tin học, trường ĐHSP Hà Nội 2 Điện thoại: 02113.505.909 Lập trình cấu trúc là một trường phái lập trình xuất hiện vào thập niên 1970 và đã nhanh chóng được nhiều người hưởng ứng. iểm cơ bản trong lập trình cấu trúc là tổ chức chương trình thành một hệ phân cấp (hierarchy) và phải điều khiển sao cho các mối tương tác giữa các thành phần trong hệ là tối thiểu. ây chính là ý tưởng của một phép tinh chế từng bước (stepwise refinement) hay phương pháp chia để trị trong giải bài toán theo cách top-down. Một khi ta đã thực hiện việc phân tích top-down xong, những mảnh bài toán chi tiết nhất sẽ được giải theo cách của 1 trong 3 thành phần thuật toán sau: * Dòng tuần tự (Sequential Flow): Trong thuật giải này, các bước giải được thể hiện ở trong một luồng lệnh tuần tự như hình vẽ sau: * Dòng điều kiện (Conditional Flow): Trong thực tế ở nhiều bài toán máy tính, ta sẽ đi đến việc chọn lựa một trong hai điều kiện. Mỗi điều kiện (úng hoặc Sai) sẽ dẫn đến một quyết định khác nhau. Minh họa ở hình sau: * Dòng lặp (Repetitive Flow): Trong nhiều trường hợp, ta cần thực hiện nhiều lần liên tiếp một hay nhiều thao tác cho để khi một điều kiện được thỏa. Mọi chi tiết xin liên hệ theo địa chỉ : Email: thienthanvitinh.ntb.sp2@gmail.com Nguyễn Thanh Bình Khoa K33 Tin học, trường ĐHSP Hà Nội 2 Điện thoại: 02113.505.909 Cha đẻ của ngôn ngữ lập trình Pascal là N.Wirth đã phát triển phương pháp tinh chế từng bước, xem nó như một phương pháp khoa học cần thiết cho việc phân tích vấn đề và lập trình. Khởi đầu, chương trình phải được thể hiện khái quát vấn đề, nêu bậc sự phân tích tổng thể bài toán. ở từng bước kế tiếp sau đó, sẽ có các giải pháp giải quyết vấn đề một cách chi tiết hơn, mỗi giải pháp như vậy là một sự đặc tả (specification) công việc. Như vậy, từng bước một, ta dần dần tinh chế bài toán. Sự tinh chế này phải hướng đến các thuật toán của ngôn ngữ lập trình. Nếu các bài toán nhỏ trở nên đơn giản thì ta thay nó bằng các câu lệnh. Nếu nó tỏ ra còn phức tạp thì ta xem đó như một thủ tục và tiếp tục tìm cách tinh chế nó. Trong quá trình tinh chế, cần thiết đưa ra những cách biểu diễn dữ liệu đi song song với cách chi tiết hoá việc giải quyết bài toán. ây là một phương pháp khoa học nhưng cũng mang một phần tính nghệ thuật thể hiện sự nhạy bén trong tư duy của người lập trình. Mọi chi tiết xin liên hệ theo địa chỉ : Email: thienthanvitinh.ntb.sp2@gmail.com Nguyễn Thanh Bình Khoa K33 Tin học, trường ĐHSP Hà Nội 2 Điện thoại: 02113.505.909 CHƯƠNG 8 MỘT SỐ CẤU TRÚC DỮ LIỆU CƠ SỞ I. KIỂU LIỆT KÊ, KIỂU MIỀN CON 1. Kiểu vô hướng liệt kê (enumerated scalar type) Chương trước chúng ta đã đi qua các kiểu dữ liệu đơn giản là các dữ liệu kiểu dữ liệu vô hướng chuẩn (Standard Scalar-type Data) như Integer, Real, Char, Boolean. Các kiểu này đã được định nghĩa sẵn trong mọi chương trình cài đặt trong máy. Ngôn ngữ Pascal cho phép người lập trình có thể tự đặt ra các kiểu vô hướng mới bằng cách tự liệt kê các giá trị của kiểu vô hướng mới và phải khai báo định nghĩa kiểu. Danh sách các giá trị này được đặt trong ngoặc đơn ( ) và được mô tả bằng một tên kiểu (như phần mô tả kiểu TYPE). Kiểu vô hướng theo cách này gọi là kiểu vô hướng liệt kê (Enumerated Scalar Type). a. Cách khai báo Có 2 cách khai báo một biến kiểu liệt kê: + Khai báo gián tiếp: ịnh nghĩa kiểu (dựa vào từ khóa type) trước khi khai biến (var) TYPE = (); VAR : ; Ví dụ 8.1: TYPE Days = (Sun, Mon, Tue, Wed, Thu, Fri, Sat); Colors =(Red, Yellow, Green, White, Blue, Black); Subjects = (Mathematics, Physics, Chemistry, Biology); VAR Ngay: Days; MauVe: Colors; MonThi, Kiemtra: Subjects; + Khai báo trực tiếp: Kiểu sau biến được định nghĩa trực tiếp. VAR : (); Ví dụ 8.2: VAR Ngay: (Sun, Mon, Tue, Wed, Thu, Fri, Sat); MauVe: (Red, Yellow, Green, White); Ta có thể gán cho biến các giá trị của kiểu tương ứng: Ngay:= Mon; MauVe:= Red; Biến theo định nghĩa của kiểu nào chỉ nhận giá trị của kiểu đó mà thôi. Mọi chi tiết xin liên hệ theo địa chỉ : Email: thienthanvitinh.ntb.sp2@gmail.com Nguyễn Thanh Bình Khoa K33 Tin học, trường ĐHSP Hà Nội 2 Điện thoại: 02113.505.909 Theo khai báo như ví dụ 8.2. ở trên, ta không thể có MauVe:= Mon; Kiểu vô hướng liệt kê là một kiểu đếm được. Theo định nghĩa kiểu vô hướng liệt kê, thứ tự danh sách giá trị liệt kê được ngầm đánh số tăng tuyến tính bắt đầu từ số 0 trở đi theo thứ tự từ trái sang phải. Như vậy, ở ví dụ trên: Sun < Mon < Tue < Wed.... và Red < Yellow < Green... b. Một số hàm chuẩn áp dụng cho kiểu vô hướng * Hàm thứ tự ORD (X) Hàm này cho ta thứ tự của giá trị x trong kiểu vô hướng đếm được. Hàm ORD thực chất là hàm biến đổi một giá trị kiểu vô hướng đếm được sang giá trị kiểu số nguyên. Theo ví dụ trên: ORD (Sun) = 0 là úng vì Sun có thứ tự là 0 ORD (Mon) = 1 là úng vì Mon có thứ tự là 1 ORD (Green) = 3 là Sai vì Green có thứ tự là 2 ORD (n) = n trong đó n là một giá trị kiểu Longint * Hàm PRED (X) Hàm này cho giá trị đứng trước x trong định nghĩa kiểu của x. Theo ví dụ trên: PRED (Mon) = Sun PRED (Green) = Yellow PRED (n) = n - 1 * Hàm SUCC (X) Hàm này cho giá trị đứng sau x trong định nghĩa kiểu của x. Theo ví dụ trên: SUCC (Mon) = Tue SUCC (Green) = White SUCC (n) = n + 1 * Hàm chuyển một số nguyên thành một giá trị vô hướng Tên hàm này chính là tên kiểu vô hướng mà ta đã khai báo trước. Theo ví dụ trên: Days(2) = Tue Colors(3) = White LONGINT (n) = n c. Viết ra và đọc vào kiểu liệt kê Viết và đọc theo kiểu liệt kê thì khác với kiểu vô hướng chuẩn. * Viết ra kiểu liệt kê Thủ tục Write và Writeln chỉ chấp nhận đưa ra các giá trị thuộc kiệu vô hướng chuẩn (Real, Integer, Byte, Char, Boolean) mà không chấp nhận viết ra một giá trị kiểu vô hướng liệt kê, ví dụ cách viết sau là không đúng: Writeln(Color(4)) Writeln(Red) Writeln(Days) Mọi chi tiết xin liên hệ theo địa chỉ : Email: thienthanvitinh.ntb.sp2@gmail.com Nguyễn Thanh Bình Khoa K33 Tin học, trường ĐHSP Hà Nội 2 Điện thoại: 02113.505.909 mà chỉ có thể chấp nhận nếu viết: Writeln (Char(78)) vì Char(78) = N là giá trị vô hướng chuẩn. Để viết ra một giá trị của biến vô hướng liệt kê, ta có thể áp dụng thủ thuật sau: IF MauVe = Red THEN Writeln(‘Red’); * Đọc vào kiểu liệt kê Thủ tục Read và Readln cũng chỉ chấp nhận đọc vào một giá trị kiểu vô hướng chuẩn mà không chấp nhận đọc trực tiếp các giá trị kiểu vô hướng liệt kê, ví dụ không thể đọc Readln(Days). ể đọc vào một giá trị kiểu liệt kê ta có thể dùng phương pháp sau: đọc số thứ tự của giá trị biến vô hướng rồi biến đổi kiểu dữ liệu thêm: Ví dụ 8.3: TYPE Days = (Sun, Mon, Tue, Wed, Thu, Fri, Sat); VAR i: Integer; BEGIN Write('Nhập số từ 0..6 tương ứng cho ngày:'); Readln(i); Case Days(i) of Sun: writeln('Ngày Chủ nhật'); Mon: writeln('Ngày thứ hai'); Tue: writeln('Ngày thứ ba'); Wed: writeln('Ngày thứ tư'); Thu: writeln('Ngày thứ năm'); Fri: writeln('Ngày thứ sáu'); Sat: writeln('Ngày thứ bảy'); Else writeln('Nhập sai'); end; Readln; END. Mục 2 ở phần II ở phía sau, sẽ giới thiệu chuỗi String, ta có thể dùng thủ thuật sau để đọc kiểu liệt kê: Ví dụ 8.4: Readln(St); IF St = ‘Mon’ THEN Ngay:= Mon; 2. Kiểu miền con (Sub-range type) a. Khái niệm Khi khai báo một số trường hợp, ví dụ Tuổi của người hoặc iểm thi học sinh, nếu ta viết: VAR TuoiTho: Integer; {Integer có miền xác định -32 768.. 32 767} Hay Diem: Real; {Real có miền xác định 2.9 E-39.. 1.7 E38} Nếu viết như vậy sẽ tốn ô nhớ vì Integer có kích thước 2 bytes hoặc Real có kích thước đến 6 bytes. Làm như vậy sẽ không cần thiết vì Tuổi con người chỉ biến Mọi chi tiết xin liên hệ theo địa chỉ : Email: thienthanvitinh.ntb.sp2@gmail.com Nguyễn Thanh Bình Khoa K33 Tin học, trường ĐHSP Hà Nội 2 Điện thoại: 02113.505.909 thiên trong khoảng từ 0 đến 200 là lớn nhất và điểm thi học sinh thì chỉ trong khoảng từ 0 đến 10 chẳng hạn. Trong Pascal cho phép ta xác định một biến lấy giá trị trong một khoảng nào đó được giới hạn ở một hằng cận dưới (first data item) và một hằng cận trên (last data item). Hai giá trị này phải cùng một kiểu vô hướng đếm được và hằng cận trên có giá trị lớn hơn hằng cận dưới. Khai báo như vậy gọi là khai báo kiểu miền con (Sub-range type) và biến của nó chỉ chiếm 1 byte trong ô nhớ mà thôi. Trong lúc chạy chương trình, ta có thể kiểm tra giá trị của biến không được vượt ra khỏi giới hạn của khoảng con. b. Cách khai báo Miền con là một tập hợp con của một kiểu đếm được. Có 2 cách khai báo: + Khai báo gián tiếp: TYPE = .. ; VAR : ; Ví dụ 8.5: TYPE TuoiTho = 0.. 200; VAR Tho: TuoiTho; + Khai báo trực tiếp: VAR : .. ; Ví dụ 8.6: VAR Tuoi: 0.. 200; II. KIỂU MẢNG, KIỂU CHUẨN Pascal có 4 kiểu cấu trúc dữ liệu là kiểu mảng (ARRAY), tập hợp (SET), bản ghi (RECORD) và tập tin (FILE). Sau đây ta lần lượt tìm hiểu từng kiểu cấu trúc. 1. Dữ liệu kiểu mảng (Array-Type Data) Một mảng dữ liệu là một tập hợp số hữu hạn phần tử có giống như các biến, có cùng kiểu, gọi là kiểu cơ bản. Mảng được được tổ chức theo một trật tự xác định. Số phần tử của mảng được khai báo ngay từ khi định nghĩa ra mảng. a. Mảng một chiều (One-Dimensional Array) Mảng một chiều có thể được hiểu như một danh sách các phần tử (theo cột), có cùng kiểu. Mỗi phần tử của mảng được xác định được truy nhập trực tiếp thông qua tên mảng cùng với chỉ dẫn truy nhập được để giữa hai ngoặc vuông []. Ví dụ 8.7: List là một mảng 1 chiều có n phần tử. Các phần tử của List có thể mang các tên List[1], List[2], List[3],..., List[n], và có thể minh họa như hình sau: Mọi chi tiết xin liên hệ theo địa chỉ : Email: thienthanvitinh.ntb.sp2@gmail.com Nguyễn Thanh Bình Khoa K33 Tin học, trường ĐHSP Hà Nội 2 Điện thoại: 02113.505.909 List[1] List[2] List[3] List[4]......... List[n] Hình 8.1: Minh họa mảng một chiều + Khai báo gián tiếp: TYPE = ARRAY [Kiểu chỉ số] OF ; VAR : Kiểu mảng; + Khai báo trực tiếp: VAR : ARRAY [Kiểu chỉ số] OF ; * Chú ý: Kiểu chỉ số phải là kiểu rời rạc (đếm được). Ví dụ 8.8: TYPE KM1 = ARRAY [1.. 100] OF INTEGER; KM2 = ARRAY [1.. 20] OF CHAR; DAY = (Sun, Mon, Tue, Wed, Thu, Fri, Sat); VAR TUOI: KM1; TEN: KM2; NGAY: ARRAY [DAY] OF BOOLEAN; Ý nghĩa: - KM1 là kiểu mảng gồm 100 phần tử được đánh số từ 1 đến 100 thông qua kiểu chỉ dẫn là một miền con các số nguyên từ 1.. 100. TUOI là biến có kiểu là KM1. - KM2 là kiểu mảng gồm 20 phần tử đánh số từ 1.. 20 có kiểu là các ký tự. Biến TEN có kiểu là KM2. - NGAY là một biến mảng gồm 7 phần tử kiểu Boolean được đánh dấu qua kiểu chỉ dẫn là tên của 7 ngày trong tuần. Chú ý: Khi khai báo mảng, kiểu chỉ dẫn chỉ có thể là: - Kiểu miển con của các loại dữ liệu vô hướng đếm được như ký tự, số nguyên - Kiểu liệt kê do người viết định nghĩa (như NGAY trong tuần) - Kiểu Boolean Kiểu chỉ dẫn không thể là kiểu không đếm được như REAL Viết như sau là SAI: X1: ARRAY [Real] OF Integer; Ta cũng không thể khai báo như: X2: ARRAY [Integer] OF Integer; Mặc dầu Integer là kiểu vô hướng đếm được do giới hạn của vùng nhớ dành cho dữ liệu, số lượng phần tử của 1 mảng cũng bị hạn chế tùy theo kích thước của kiểu dữ liệu của các phần tử, ta nên dùng kiểu miền con để khai báo số phần tử của mảng. + Truy xuất các phần tử của mảng: Mọi chi tiết xin liên hệ theo địa chỉ : Email: thienthanvitinh.ntb.sp2@gmail.com Nguyễn Thanh Bình Khoa K33 Tin học, trường ĐHSP Hà Nội 2 Điện thoại: 02113.505.909 Mỗi phần tử của mảng được truy xuất thông qua Tên Biến Mảng cùng với chỉ số của mảng trong dấu ngoặc vuông []. Ví dụ tên biến mảng là A, khi viết A[7], ta hiểu nó là phần tử thứ 7 của mảng A. Ví dụ 8.9: Lập trình giải một bài toán tính trung bình một dãy số x[i]: x[1], x[2], x[3],..., x[n] sau đó tiếp tục tính độ lệch (deviation) của từng phần tử so với trị trung bình, theo công thức: độ_lệch = x[i] - trung_bình Giả sử dãy số của chúng ta có giới hạn n = 100 phần tử trở lại, n là một biến số để khai báo số phần tử muốn tính . Sau đó ta lần lượt nhập tính giá trị của phần tử kiểu số thực (real) từ phần tử thứ 1 đến phần tử thứ n. Trong chương trình sẽ tạo ra một mảng 1 chiều x với n các phần tử. Tính trung bình của n phần tử và độ lệch. In kết quả ra màn hình. PROGRAM Average_deviations; {Nhập n số phần tử kiểu số thực, tính trị trung bình của chúng, sau đó tính tiếp độ lệch của từng phần tử số so với trị trung bình} VAR n, count: integer; sum, average, deviation: real; x: ARRAY [1.. 100] OF real; BEGIN (* Nhập số phần tử và tính trung bình*) Write (' Nhập bao nhiêu số n để tính trung bình ? '); Readln (n); Writeln; sum:= 0; FOR count:= 1 TO n DO BEGIN Write ( ‘ i = ‘, count: 3, ‘ x = ‘ ); Readln (x [count] ); sum:= sum + x[count]; END; average:= sum/n; Writeln (' Trung bình của dãy số là =, average '); Writeln; (* Tính độ lệch so với trị trung bình *) FOR count:= 1 TO n DO BEGIN deviation:= x[count] - average; Write ( ‘ i = ‘, count: 3, ‘ x = ‘, x[count] ); Mọi chi tiết xin liên hệ theo địa chỉ : Email: thienthanvitinh.ntb.sp2@gmail.com Nguyễn Thanh Bình Khoa K33 Tin học, trường ĐHSP Hà Nội 2 Điện thoại: 02113.505.909 Writeln (' ộ lệch d =, deviation '); END; Readln; END. Giả sử, ta nhập vào 5 số hạng (các số có gạch dưới là phần của người nhập): x[1] = 3.0 x[2] = -2.0 x[3] = 12.0 x[4] = 4.4 x[5] = 3.5 Khi chạy chương trình (nhấn Ctrl + F9), trên màn hình ta sẽ thấy: Nhập bao nhiêu số n để tính trung bình ? 5 i = 1 x = 3.0 i = 2 x = -2.0 i = 3 x = 12.0 i = 4 x = 4.4 i = 5 x = 3.5 Trung bình của dãy số là = 4. 1800000E+00 i = 1 x = 3. 0000000E+00 ộ lệch d = - 1. 1800000E+00 i = 2 x = -2. 0000000E+00 ộ lệch d = - 6. 1800000E+00 i = 3 x = 1. 2000000E+00 ộ lệch d = 7. 8200000E+00 i = 4 x = 4. 4000000E+00 ộ lệch d = 2. 2000000E - 01 i = 5 x = 3. 5000000E+00 ộ lệch d = - 6. 8000000E - 01 Ta có thể định khoảng chừa kết quả và phần lẻ thập phân, dùng lệnh: m: n Ví dụ 8.10: Sắp xếp một dãy số theo thứ tự từ nhỏ đến lớn Tiến trình của bài toán: - Giả sử chuỗi số của ta có n phần tử . Lần lượt cho chương trình đọc giá trị của các phần tử nhập được. - Một thủ tục (Procedure) sẽ làm công việc sắp xếp như sau: đầu tiên đưa phần tử thứ nhất so sánh với các phần tử tiếp theo, nếu nó lớn hơn phần tử so sánh thì đem đổi chổ giá trị của hai phần tử với nhau. Sau đó tiếp tục đem phần tử thứ 2 so sánh các phần tử tiếp theo theo trình tự như vậy,... và cứ như thế cho đến phần tử thứ n - 1. - In kết quả ra màn hình Chương trình Pascal như sau: PROGRAM Reorder; (* Sắp xếp một mảng các phần tử số thực từ nhỏ đến lớn*) VAR n, i, loc: 1.. 100; x: ARRAY [1.. 100] OF real; temp: real; PROCEDURE interchange; (* ổi chỗ các phần tử mảng từ nhỏ đến lớn*) BEGIN FOR loc:= 1 TO n-1 DO Mọi chi tiết xin liên hệ theo địa chỉ : Email: thienthanvitinh.ntb.sp2@gmail.com Nguyễn Thanh Bình Khoa K33 Tin học, trường ĐHSP Hà Nội 2 Điện thoại: 02113.505.909 FOR i:= loc + 1 TO n DO IF x[i] < x [loc] THEN BEGIN temp:= x[loc]; x[loc]:= x[i]; x[i]:= temp; END; END; BEGIN Write (' Có bao nhiêu phần tử số ? '); Readln (n); FOR i:= 1 TO n DO BEGIN Write ( ‘ x[‘, i: 3, ‘] = ? ‘ ); Readln( x[i] ); END; interchange; Writeln; Writeln (' Số liệu đã sắp xếp: '); Writeln; FOR i:= 1 TO n DO Writeln ( ‘x[‘, i: 3, ‘] = ‘, x[i]: 4: 1 ); Readln; END. Khi chạy chương trình, giả sử ta có 5 số liệu như phần nhập: (các số có gạch dưới là phần nhập từ bàn phím) Có bao nhiêu phần tử số ? 5 x[1] = ? 4. 7 x[2] = ? - 2. 3 x[3] = ? 12. 9 x[4] = ? 8. 8 x[5] = ? 6. 0 Kết quả là: Số liệu đã sắp xếp: x[1] = ? - 2. 3 x[2] = ? 4. 7 x[3] = ? 6. 0 x[4] = ? 8. 8 x[5] = ? 12. 9 b. Mảng nhiều chiều (Multi-Dimensional Array) Mọi chi tiết xin liên hệ theo địa chỉ : Email: thienthanvitinh.ntb.sp2@gmail.com Nguyễn Thanh Bình Khoa K33 Tin học, trường ĐHSP Hà Nội 2 Điện thoại: 02113.505.909 Trong một số bài toán thực tế, người ta sử dụng các mảng nhiều hơn 1 chiều, gọi là mảng nhiều chiều. Ví dụ 8.11: Phòng ào tạo quản lý điểm của sinh viên. Trong khoá 22 chẳng hạn, người ta tạo ra một mảng 2 chiều: ví dụ một chiều là số thứ tự của sinh viên, chiều còn lại là các môn học (dạng kiểu vô hướng liệt kê), ta có thể hình dung dạng của mảng ghi điểm (tên mảng là ghi_diem) như sau: Lưu ý: Thực tế, danh sách tên sinh viên lưu lại trong máy tính thường được ghi bằng cách gán mã số sinh viên (coding) cho mỗi sinh viên ngay từ năm đầu vào học. Với ví dụ trên, muốn nhập điểm một sinh viên nào đó ta phải khai báo 2 tham số là số thứ tự sinh viên và môn học. Tương tự, cũng với các khoá kế tiếp theo học những môn như vậy, ta sẽ tạo ra mảng nhiều chiều như hình vẽ minh họa sau: Trong trường hợp này, muốn biết điểm một sinh viên nào đó ta phải khai báo 3 tham số: Khoá học, số thứ tự sinh viên và môn học, chẳng hạn: ghi_diem[K22,0001,AV] nhập điểm 10,... Khai báo cũng có 2 cách như đối với mảng 1 chiều: + Khai báo gián tiếp: TYPE Mọi chi tiết xin liên hệ theo địa chỉ : Email: thienthanvitinh.ntb.sp2@gmail.com Nguyễn Thanh Bình Khoa K33 Tin học, trường ĐHSP Hà Nội 2 Điện thoại: 02113.505.909 = ARRAY [Kiểu_chỉ_số_1,..., Kiểu_chỉ_số_n] OF <Kiểu phần tử>; VAR :; Ví dụ 8.12: TYPE matrix = ARRAY [1.. 20, 1.. 30] OF integer; VAR A:matrix; Lệnh trên khai báo một kiểu tên matrix. ây là một mảng 2 chiều, chiều thứ nhất có các chỉ số từ 1 đến 20, chiều thứ hai có các chỉ số từ 1 đến 30, tổng cộng ta có (20 x 30) phần tử số nguyên. Và ta có một biến A là biến có kiểu matrix. Ví dụ trên cũng có thể được khai báo tương đương với: TYPE matrix = ARRAY [1.. 20] OF ARRAY [1.. 30] OF integer; VAR A:matrix; + Khai báo gián tiếp: VAR : ARRAY [Kiểu_chỉ_số_1,..., Kiểu_chỉ_số_n] OF <Kiểu phần tử>; Khai báo một biến A có 5 dòng và 10 cột kiểu phần tử là Integer như sau: VAR A: ARRAY [1.. 5, 1.. 10] OF integer; + Truy xuất các phần tử mảng: Tương tự như cách truy xuất phần tử của mảng 1 chiều, mảngg nhiều chiều cũng được truy xuất thông qua tên biến mảng kết hợp với các chỉ số của nó được đặt trong cặp dấu ngoặc vuông

Các file đính kèm theo tài liệu này:

  • pdfNGONNGULAPTRINHPASCAL.pdf