Bài 11: Kiểu mảng

Nội dung lý thuyết

BÀI 11. KIỂU MẢNG

1. Kiểu mảng một chiều

a. Khái niệm

- Mảng một chiều là một dãy hữu hạn các phần tử có cùng kiểu. Mảng được đặt tên và mỗi phần tử mang một chỉ số. Để mô tả mảng một chiều cần xác định kiểu của các phần tử và cách đánh chỉ số các phần tử.

- Với mảng một chiều ta quan tâm đến:

  • Tên kiểu mảng một chiều.
  • Số lượng phần tử trong mảng.
  • Kiểu dữ liệu của phần tử.
  • Cách khai báo biến mảng.
  • Cách tham chiếu đến phần tử.

b. Khai báo mảng một chiều

- Cách 1: Khai báo trực tiếp:

                    VAR <tên biến mảng>: ARRAY [kiểu chỉ số] OF <kiểu phần tử>;

- Cách 2: Khai báo gián tiếp

                     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 đó:

  • Kiểu chỉ số thường là một đoạn số nguyên liên tục có dạng n1...n2 (n1<n2; n1, n2 là các hằng hoặc biểu thức)
  • Kiểu phần tử là kiểu dl của các phần tử của mảng.

- Ví dụ 1: Var Nhietdo: array [1..Max] Of real;

- Ví dụ 2: Khai báo mảng tối đa 100 số nguyên (chỉ số đầu tiên là 1)

=> Ta có các cách sau:

  • Cách 1: Var a: Array[1..100] Of Integer;
  • Cách 2:

               Const Nmax = 100;

               Var a: Array[1..Nmax] Of integer;

c. Tham chiếu tới phần tử của mảng

- Để tham chiếu tới phần tử của mảng ta gọi theo cấu trúc: Tên_biến[chỉ số]

VD: Tham chiếu đến phần tử thứ 20 trong mảng A ta viết A[20].

d. Một số ví dụ

- Bài 1: Viết CT tạo mảng A gồm N (N\(\le\)100) số nguyên. Tính tổng các phần tử của mảng là bội của một số nguyên dương k cho trước.

Var  S, n, k, i: integer;
     A: array[1..100] of integer;
Begin
     Write(‘Nhap n = ’);
     readln(n);
     {tao mang}
     For i:=1 To n Do
     begin
          write(‘phan tu thu ’,i,’ =’);  
          readln(A[i]);
     end;
     write(‘Nhap k = ’);
     readln(k);
     S:= 0; {khoi tao S ban dau}
     {tinh tong}
     For i:=1 To n Do
          If A[i] mod k = 0 Then S:= S + A[i];
     Writeln(‘Tong can tinh la ’, S);
End.

2. Kiểu mảng hai chiều

a. Khái niệm mảng 2 chiều

Xét bài toán: Bảng nhân: Hãy viết chương trình in ra bảng nhân như sau

1

2

3

4

5

6

7

8

9

10

2

4

6

8

10

12

14

16

18

20

3

6

9

12

15

18

21

24

27

30

4

8

12

16

20

24

28

32

36

40

5

10

15

20

25

30

35

40

45

50

6

12

18

24

30

36

42

48

54

60

7

14

21

28

35

42

49

56

63

70

8

16

24

32

40

48

56

64

72

80

9

18

27

36

45

54

63

72

81

90

=> Các bước cần thực hiện khi sử dụng mảng 1 chiều để thực hiện bài toán trên:

- Cần sử dụng 9 mảng 1 chiều, mỗi mảng lưu 1 hàng của bảng nhân => Khai báo 9 biến mảng

=> Nhược điểm: Phải khai báo nhiều biến, chương trình phải viết nhiều lệnh để tạo và in giá trị của mảng. 

=> Giải pháp: Coi mỗi mảng một chiều là 1 phần tử và ghép 9 mảng 1 chiều trên thành 1 mảng 2 chiều.

* Khái niệm mảng hai chiều:

- Mảng hai chiều là mảng một chiều mà mỗi phần tử của nó lại là mảng một chiều. 

- Mảng hai chiều là bảng các phần tử cùng kiểu

* Các yếu tố xác định mảng hai chiều:

  • Tên mảng hai chiều.
  • Số lượng phần tử của mỗi chiều.
  • Kiểu dữ liệu của phần tử.
  • Cách khai báo biến.
  • Cách tham chiếu đến phần tử.

b. Cách Khai báo:

- Có hai cách khai báo biến mảng 2 chiều:

  • Cách 1: Khai báo trực tiếp:

                     VAR <tênbiếnmảng>: ARRAY [kiểu chỉ số hàng, kiểu chỉ số cột] OF <kiểu phần tử>;

  • Cách 2: Khai báo gián tiếp:

                     TYPE <tên kiểu mảng>ARRAY [kiểu chỉ số hàng, kiểu chỉ số cột] OF <kiểu phần tử>;

                     VAR <tên biến mảng> <tên kiểu mảng>;

c. Tham chiếu đến một phần tử của mảng hai chiều:

                     TÊN_BIẾN[chỉ số hàng, chỉ số cột]

d. Các ví dụ:

- Ví dụ 1: Viết chương trình tạo và in mảng hai chiều gồm m hàng, n cột.

program Tao_in_mang;
var i, j, m, n: integer;
A: array[1..100,1..100] of integer;
begin
     write('Nhap so hang m = '); readln(m);
     write('Nhap so cot n = '); readln(n);
     {Tạo mảng}
     for i:= 1 to m do for j:= 1 to n do
     begin
          write('Nhap A[',i, ',',j,']=');
          readln(A[i, j]);
     end;
     {In mảng}
     for i:= 1 to m do
     begin
          for j:= 1 to n do write(A[i, j]:4);
          writeln;
     end;
     readln;
end.