Giáo trình dạy học Ngôn ngữ lập trình Pascal (tiếp theo)

Chia sẻ bởi Trung Kien | Ngày 14/10/2018 | 47

Chia sẻ tài liệu: Giáo trình dạy học Ngôn ngữ lập trình Pascal (tiếp theo) thuộc Tư liệu tham khảo

Nội dung tài liệu:

ngôn ngữ lập trình pascal (tiếp theo)
Chương 11. Kiểu tập hợp và kiểu mảng
11.1. Kiểu tập hợp (set type).
Định nghĩa và khai báo : Dữ liệu kiểu tập hợp là một tập hợp của những dữ liệu thuộc một kiểu vô hướng đếm được.
Một kiểu tập hợp được định nghĩa bởi dạng sau :



trong đó kiểu_phần_tử là kiểu dữ liệu của các phần tử của tập hợp.
Khai báo biến kiểu tập hợp :
Cách 1 : Khai báo qua một tên kiểu đã được định nghĩa :
Ví dụ 1:
Type
Chu_so = Set of 0..9;
Chu_cai_lon = Set of `A`..`Z`;
Var
TapA : Chu_so;
TapH : Chu_cai_lon;
Cách 1 : Khai báo trực tiếp :
Ví dụ 2 :
Var TapS : Set Of Byte;
T1, T2 : Set Of (Xanh,Vang,Tim);
Ghi chú :
Biến tập hợp cho phép có tối đa 256 phần tử.
Nếu kiểu_cơ_sở là kiểu nguyên thì giá trị phải nằm trong đoạn từ 0 đến 255. Chẳng hạn, Với khai báo :
Type Tap_so = Set of 100..256;
Khi dịch máy sẽ thông báo lỗi : Set base type out of range.
Hằng kiểu tập hợp được biểu diễn dưới dạng liệt kê các phần tử nằm trong hai dấu ngoặc vuông [ ]. Chẳng hạn : [`A`,`D`,`E`], [3,5..8] (tập các số nguyên 3, 5, 6, 7, 8) là các hằng kiểu tập hợp.
(Vị trí của các phần tử trong tập hợp không có ý nghĩa : [1,2]=[2,1])
Tập hợp rỗng được kí hiệu là [].
Có thể thực hiện phép gán trên các biến kiểu tập hợp.
Ví dụ 3 : Với các biến được khai báo ở ví dụ trên, ta có thể gán :
TapA := [1,2,7]; TapH := []; {Tập hợp rỗng}
T1 := [Vang,Tim];
Các phép toán trên tập hợp :
Phép toán quan hệ :
Phép toán = (bằng) : Cho giá trị True nếu 2 tập hợp bằng nhau.
Phép toán <> (khác) : Cho giá trị True nếu 2 tập hợp khác nhau.
Phép toán <= (nhỏ hơn hoặc bằng) : A <= B cho giá trị True nếu A là tập con của B.
Phép toán >= (lớn hơn hoặc bằng) : A >= B cho giá trị True nếu B là tập con của A.
Chú ý : Không có phép toán < (nhỏ hơn) và > (lớn hơn). Để kiểm tra tập hợp A có thật sự nằm trong tập hợp B không ta sử dụng phép toán AND như câu lệnh sau đây :
If (A<>B) and (A<=B) then Write(`A là tập con thật sự của B`);
Phép toán IN (thuộc về) : Dùng để kiểm tra xem một biến hay một giá trị có nằm trong tập hợp nào đó 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ụ 4 :
`C` In [`A`,`C`,`D`] ( True
`E` In [`A`,`C`,`D`] ( False
Phép toán hợp, giao, hiệu : Gọi A, B là 2 dữ liệu cùng kiểu tập hợp.
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ụ 5 : Với A:=[1,3,9]; B:=[9,2,5];
Ta có :
A+B = [1,2,3,5,9]
A*B = [9]
A-B = [1,3]

Ví dụ 6 : Viết chương trình nhập vào một chữ cái. Xem xét chữ cái đó là nguyên âm hay phụ âm ?
Program VIDU_6;
Uses Crt;
Var
TapChuCai, TapNguyenAm : Set Of Char;
Ch : Char;
Begin
TapChuCai :=[`A`..`Z`,`a`..`z`];
TapNguyenAm :=[`A`,`E`,`I`,`O`,`U`];
Repeat
Clrscr;
Write(`Nhap mot chu cai: `);Readln(Ch);
Until Ch in TapChuCai;
If upcase(Ch) in TapNguyenAm then Writeln(Ch,` là nguyên âm`)
Else Writeln(Ch,` là phụ âm`);
Readln;
END.
11.2. Kiểu mảng (array type).
11.2.1. Mảng một chiều :
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 dữ liệu, có cùng một tên chung. Mỗi phần tử của mảng có một đại lượng xác định vị trí tương đối của phần tử đó so với các phần tử khác trong mảng, gọi là chỉ số. Chẳng hạn, mảng a gồm 5 phần tử được phân bố như sau :
chỉ số
a a[1] a[2] a[3] a[4] a[5]
tên mảng
Công 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 đó, chẳng hạn :
- Họ tên của các nhân viên trong cùng một xí nghiệp.
- Điểm thi một môn học của các học sinh trong một lớp.
Định nghĩa kiểu dữ liệu mảng :
TYPE
tên_kiểu_mảng = ARRAY[m1 .. m2] OF kiểu_phần_tử;
Trong đó :
kiểu_phần_tử là kiểu của mỗi phần tử trong mảng, có thể là kiểu bất kỳ.
m1, m2 là hai hằng xác định phạm vi của chỉ số và m1 ( m2.
Kiểu dữ liệu của chỉ số không được là kiểu thực hay kiểu chuỗi, thường là kiểu nguyên, ký tự, logic, liệt kê hay đoạn con.
Ví dụ 7 :
Type
dayso = Array[0..49] Of byte;
HT = Array[1..50] Of string[20];
Theo định nghĩa trên ta có hai kiểu mảng :
Kiểu mảng thứ nhất có tên là dayso, gồm 50 phần tử cùng kiểu Byte, ứng với các chỉ số 0, 1, 2, ..., 49. Chỉ số đầu (m1 = 0) và chỉ số cuối (m2 = 49) có thể bắt đầu từ một con số bất kỳ và kết thúc ở một con số bất kỳ, miễn sao cho m2-m1+1=50 theo đúng yêu cầu tạo mảng có 50 phần tử. Thông thường, nếu không bắt buộc, ta chọn chỉ số đầu (m1) bằng 0 hoặc 1.
Kiểu mảng thứ hai có tên là HT, gồm 50 phần tử cùng kiểu dữ liệu là String[20], ứng với các chỉ số từ 1 đến 50.
Khai báo biến kiểu mảng : Có hai cách khai báo :
Cách 1 : Khai báo qua một kiểu mảng đã được định nghĩa.
Ví dụ 8 : Với hai kiểu mảng đã được định nghĩa ở ví dụ 7, có thể khai báo :
Var a : dayso;
Ho_ten : HT;
Cách 2 : Khai báo trực tiếp.
Ví dụ 9 :
Var x : Array[0..99] Of Real;
y : Array[‘a’..’d’] Of Integer;
Khai báo mảng có gán giá trị ban đầu : Turbo Pascal cho phép vừa khai báo mảng, vừa gán giá trị ban đầu cho các phần tử mảng, chẳng hạn như dưới đây :
Const x : Array[1..5] Of Integer = (5,7,12,14,6);
Khi đó x là một mảng gồm 5 phần tử cùng kiểu nguyên và có giá trị x[1]=5, x[2]=7, x[3]=12, x[4]=14, x[5]=6.
Mặc dù từ khoá ở đây là const, nhưng x lại được dùng như là một biến, tức là các phần tử của x có thể thay đổi giá trị được, chẳng hạn trong chương trình ta có thể gán :
x[1] := 4; x[2] :=3+25;
Truy xuất một phần tử mảng : Các xử lý trên mảng được quy về xử lý từng phần tử của mảng. Việc truy xuất một phần tử nào đó của biến mảng được thực hiện qua tên biến mảng, theo sau là giá trị chỉ số để trong dấu [ ].
tên_biến_mảng[chỉ_số_phần_tử ]
Ví dụ 10 :
Var a : Array[1..25] Of Integer;
b : Integer;
...
a[1] := 1; {gán giá trị cho phần tử đầu tiên của mảng bằng 1}
b := a[25]; {gán giá trị b bằng giá trị phần tử cuối cùng của mảng}
Ghi chú :
Chỉ số của một phần tử mảng có thể là một biến, một hằng hay một biểu thức.
Có thể gán một biến mảng này cho một biến mảng khác cùng kiểu. Chẳng hạn, với khai báo :
Var x, y : Array[1..15] Of Real;
Khi đó, lệnh :
x := y;
tương đương với lệnh :
For i:=1 to 15 do x[i] := y[i];
Nhập - xuất dữ liệu với mảng : Dùng câu lệnh FOR.
Các thủ tục nhập - xuất biến như Writeln, Readln, ... không thể truy xuất thẳng biến mảng mà phải thông qua từng thành phần của của nó.
Ví dụ 11 : Viết chương trình nhập vào từ bàn phím một dãy số nguyên MI và xuất ra màn hình:
Các phần tử của dãy MI theo thứ tự ngược.
Các số đối của các phần tử của dãy MI.
Program VIDU_11;
Uses Crt;
Const Max = 100;
Var MI : Array[1..Max] Of Integer;
i, n : Byte;
Begin
Repeat
Clrscr;
Write(`Nhập số phần tử của dãy ( < `, Max , ` ): `);
Readln(n);
Until (n>0) and (n <= Max);
{nhập mảng}
For i:=1 to n do
Begin
Write(`Phần tử thứ `,i,`: `);
Readln(MI[i]);
End;
Writeln(`------------------------`);
Writeln(`In dãy theo thứ tự ngược :`);
For i := n downto 1 do write(MI[i],#32);
Writeln;
Writeln(`In các số đối của dãy :`);
For i:=1 to n do write(-MI[i],#32);
Readln;
End.
Các bài toán cơ bản về mảng :
Bài toán 1 : Tìm phần tử nhỏ nhất của mảng.
Ví dụ 12 : Viết chương trình nhập vào 10 phần tử của mảng a các số nguyên. Tìm và in phần tử nhỏ nhất của mảng a lên màn hình.
Program VIDU_12;
Uses Crt;
Const N = 10;
Type Dayso = Array[1..N] Of Integer;
Var a : Dayso;
i : Byte;
min : Integer;
Begin
Clrscr;
{nhập mảng}
For i:=1 to N do
Begin
Write(`Nhap a[ `,i,` ] : `);
Readln(a[i]);
End;
Writeln(`------------------------`);
{tìm số nhỏ nhất}
min := a[1];
For i := 2 to N do
if a[i] < min then min := a[i];
Writeln(`Phần tử nhỏ nhất là : `,min);
Readln;
End.
Ta có giải thuật tương tự đối với bài toán tìm phần tử lớn nhất của mảng.
Bài toán 2 : Sắp xếp các phần tử trong mảng theo thứ tự tăng dần.
Giải thuật BUBBLE SORT (còn có tên là phương pháp sắp xếp nổi bọt) : Ta coi các số cần sắp là trọng lượng của các bọt khí trong nước. Bọt khí nào nhẹ sẽ nổi lên trước, những bọt nào nặng sẽ nổi lên sau nhưng không thể nổi lên cao quá bọt khí nhẹ hơn nó. Một cách hình ảnh ta có ví dụ minh hoạ sau :
Sắp xếp tăng dần mảng : 44 55 12 42 94 18 6 67

Bước 0 1 2 3 4 5 6 7

44 6 6 6 6 6 6 6
55 44 12 12 12 12 12 12
12 55 44 18 18 18 18 18
42 12 * 55 44 42 42 42 42
94 42 18 * 55 44 44 44 44
18 94 42 42 * 55 55 55 55
6 * 18 * 94 67 67 67 67 67
67 67 67 * 94 94 94 94 94

* Chương trình minh hoạ
Program Sap_xep;
Uses Crt;
Const N = 8;
Var a : Array[1..N] Of Integer;
i, j ,Tam : Integer; { Tam là biến trung gian }
Begin
Clrscr;
Writeln(`PP. BUBLE SORT SAP XEP
* Một số tài liệu cũ có thể bị lỗi font khi hiển thị do dùng bộ mã không phải Unikey ...

Người chia sẻ: Trung Kien
Dung lượng: 300,50KB| Lượt tài: 0
Loại file: doc
Nguồn : Chưa rõ
(Tài liệu chưa được thẩm định)