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 []
84 trang |
Chia sẻ: maiphuongdc | Lượt xem: 3025 | Lượt tải: 5
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:
- NGONNGULAPTRINHPASCAL.pdf