2.
- Các chỉ số có của các phần tử trong cùng một mảng phải cùng kiểu dữ liệu với nhau gọi chung là kiểu chỉ số, kiểu chỉ số phải là kiểu hữu hạn đếm được.
Dưới đây sẽ trình bày về khai báo mảng một chiều và mảng hai chiều:
7.1.2 Khai báo mảng một chiều
Có thể khai báo mảng bằng hai cách: khai báo trực tiếp và khai báo thông qua định nghĩa kiểu TYPE.
VAR Tên_biến_mảng: ARRAY[kiểu chỉ số] OF kiểu phần tử;
Trong đó:
- kiểu chỉ số: là cách tổ chức các phần tử của mảng, cách truy nhập vào các phần tử của mảng, nó có thể là các kiểu dữ liệu đơn giản vô hướng đếm được, hữu hạn giá trị.
- kiểu phần tử: là kiểu dữ liệu của các phần tử của mảng, có thể là bất kỳ kiểu dữ liệu nào.
Ví dụ 7.1: Khai báo mảng trực tiếp:
VAR X : array[1..15] of integer;
HT: array[1..50] of string[30];
Trong khai báo trên:
- X là mảng một chiều có thể được xem như là một dãy số có tối đa 15 phần tử, các phần tử được đánh số từ 1 đến 15 và có cùng kiểu nguyên.
- HT là mảng một chiều có thể được xem như là một dãy có tối đa 50 phần tử, các phần tử được đánh số từ 1 đến 15 và có cùng kiểu xâu có tối đa 30 ký tự.
TYPE Tên_kiểu_mảng = ARRAY[kiểu chỉ số] OF kiểu_phần_tử;
VAR Tên_biến_mảng : Tên_kiểu_mảng;
Trong các khai báo trên, chỉ số só thể là kiểu miền con, hoặc kiểu liệt kê vô hướng
Ví dụ 7.2: Khai báo mảng gián tiếp: khai báo mảng trực tiếp như trong ví dụ 5.1 tương đương với cách khai báo gián tiếp như sau:
TYPE M1 = array[1..15] of integer;
M2 = array[1..50] of string[30];
VAR X : M1;
HT : M2;
Truy cập đến từng phần tử của mảng 1 chiều theo cú pháp:
Tên_biến_mảng[chỉ_số]
Ví dụ 7.3: với khai báo mảng trong ví dụ 7.2
M1[1] là chỉ phần tử thứ nhất trong mảng M1
M1[i] là chỉ phần tử thứ i trong mảng M1
7.1.3. Khai báo mảng hai chiều
VAR Tên_biến_mảng : ARRAY[chỉ_số_hàng, chỉ_số_cột] OF kiểu_phần_tử;
Trong đó:
- chỉ_số_hàng, chỉ_số_cột: là cách tổ chức các phần tử của mảng, cách truy nhập vào các phần tử của mảng, nó có thể là các kiểu dữ liệu đơn giản vô hướng đếm được, hữu hạn giá trị.
- kiểu_phần_tử: là kiểu dữ liệu của các phần tử của mảng, có thể là bất kỳ kiểu dữ liệu nào.
Ví dụ 7.4: Khai báo mảng trực tiếp:
VAR X : array[1..15,1..5] of integer;
HT: array[1..50,1..50] of string[30];
Trong khai báo trên:
- X là mảng hai chiều có thể được xem như là một ma trận có tối đa 75 (tối đa là 15 hàng và tối đa 5 cột), các phần tử có kiểu nguyên.
- HT là mảng hai chiều có thể được xem như là một ma trận có tối đa 50 hàng và 50 cột, các phần tử có kiểu xâu có tối đa 30 ký tự.
TYPE Tên_kiểu_mảng = ARRAY[chỉ_số_hàng, chỉ_số_cột] OF kiểu_ phần_tử;
VAR Tên_biến_mảng : Tên_kiểu_mảng;
* Chú ý: Trong các khai báo trên, chỉ số só thể là kiểu miền con, hoặc kiểu liệt kê vô hướng
Ví dụ 7.5: Khai báo mảng gián tiếp: khai báo mảng trực tiếp như trong ví dụ 5.1 tương đương với cách khai báo gián tiếp như sau:
TYPE M1 = array[1..15,1..5] of integer;
M2 = array[1..50,1..50] of string[30];
VAR X : M1;
HT: M2;
Truy cập đến từng phần tử của mảng 2 chiều theo cú pháp:
Tên_biến_mảng[chỉ_số_hàng, chỉ_số_cột]
Ví dụ 7.6: với khai báo mảng trong ví dụ 7.5
M1[1,1] là chỉ phần tử ở hàng 1, cột 1 trong mảng M1
M1[i,j] là chỉ phần tử ở hàng i, cột j trong mảng M1
* Chú ý: Thực chất mảng hai chiều là màng một chiều mà các phần tử của nó là một mảng một chiều.
7.1.4. Các phép toán trên mảng
* Phép gán:
- Có thể thực hiện gán hai biến mảng cho nhau nếu chúng cùng kiểu dữ liệu với nhau.
Ví dụ 7.7: Với khai báo mảng sau:
TYPE dayso = array[1..50] of integer;
VAR a,b:dayso; {a và b được gọi là cùng kiểu dữ liệu với nhau}
c,d: array[1..50] of integer;
{c và d cùng kiểu dữ liệu với nhau nhưng không cùng kiểu với a và b}
Ta có thể thực hiện các phép gán sau:
a:=b; b:=a; c:=d; d:=c;
- Các phần tử trong một mảng sẽ có các phép toán của kiểu dữ liệu của nó.
Ví dụ 7.8: Với khai báo mảng ở ví dụ 7.7 ta có
Các phần tử a[i] có kiểu dữ liệu là kiểu integer nên nó có mọi tính chất như một biến có kiểu integer.
* Phép so sánh
- Không được sử dung bất kỳ phép so sánh nào với biến có kiểu dữ liệu là kiểu mảng.
- Nếu kiểu phần tử của mảng có thực hiện được các phép so sánh thì có thể thực hiện các phép so sánh giữa các phần tử có cùng kiểu dữ liệu với nhau.
7.1.5. Nhập và in dữ liệu của mảng
7.1.5.1. Nhập dữ liệu cho mảng
Để nhập dữ liệu cho mảng ta cũng sử dụng câu lệnh read hay readln, tuy nhiên không được phép sử dụng các lệnh nhập dữ liệu cho biến mảng mà chỉ sử dụng cho từng phần tử trong mảng. Do vậy để nhập dữ liệu cho mảng ta phải nhập dữ liệu cho từng phần tử trong mảng.
Nhập dữ liệu cho mảng một chiều ta sử dụng một vòng FOR như sau:
Ví dụ cho mảng A được khai báo như sau:
Var A:array[1..100] of integer;
Nhập dữ liệu cho mảng A như sau:
For i:=1 to 100 do
Readln(A[i]);
Sử dụng vòng lặp FOR để duyệt hết mảng A, ứng với mỗi giá trị của i ta thực hiện nhập dữ liệu cho phần tử ở vị trí thứ i trong mảng A.
Nhập dữ liệu cho mảng hai chiều ta sử dụng hai vòng FOR lồng nhau như sau:
Ví dụ cho mảng A được khai báo như sau:
Var A:array[1..50,1..50] of integer;
Nhập dữ liệu cho mảng A như sau:
For i:=1 to 50 do
For j:=1 to 50 do
Readln(A[i,j]);
Sử dụng hai vòng lặp FOR để duyệt hết mảng A, thực hiện duyệt hết theo từng hàng một, ứng với mỗi giá trị của i ta thực hiện nhập dữ liệu cho phần tử trên hàng i, ứng với mỗi giá trị i và j ta thực hiện nhập dữ liệu cho phần tử ở vị trí hàng i, cột j trong mảng A.
7.1.5.1. In dữ liệu mảng lên màn hình
Để in dữ liệu mảng ta cũng sử dụng câu lệnh write