Học Pascal Cùng J[p6] - THPT Quang Hà

Mảng 2 chiều căn bản

1, Lý thuyết

Các mảng nhiều hơn hai chiều được suy diễn một cách tự nhiên. Việc khai báo mảng hai chiều cũng giống như mảng một chiều, chỉ có điều khác là nó có hai tập chỉ số được viết cách nhau bởi dấu ‘,’.

F Ví dụ 1:

Type Mang1 = Array[1.. 30, 1.. 50] of Integer;

Mang2 = Array[1.. 3, 0.. 2] of Real;

Var A : Mang1;

B : Mang2;

Trong đó, số phần tử của mảng số thực B là 3 x 3 = 9 (phần tử), sắp đặt trong bộ nhớ theo thứ tự như sau:

B[1, 0] B[1, 1] B[1 ,2]

B[2, 0] B[2, 1] B[2 ,2]

B[3, 0] B[3, 1] B[3 ,2]

Khái niệm: Mảng hai chiều còn gọi là ma trận. Trong ví dụ trên, B là ma trận cấp 3 × 3. Trong mảng hai chiều, chỉ số sau truy cập nhanh hơn chỉ số trước. Để truy cập đến phần tử hàng thứ i, cột thứ j của mảng hai chiều B ta dùng cách viết: B[ i ][ j ] hoặc B[ i , j ]

F Ví dụ 2: Nhập một ma trận m hàng, n cột từ bàn phím. Tính và in ra màn hình tổng của mỗi cột và tổng của mỗi hàng.

Const mMax = 30, nMax = 30;

Type Mang = Array[1.. mMax, 1.. nMax] of Real;

Var n, m, i, j : Integer;

sum : Real;

a : Mang;

Begin

Write( ‘ Ban muon nhap ma tran bao nhieu hang va cot ? ‘ );

Readln( m, n );

For i := 1 to m do

For j := 1 to n do

Begin

Write( ' PT thu [ ' , i , ' , ‘ , j, ‘ ] = ' );

Readln( a[ i, j ] );

End;

For j := 1 to n do

Begin

sum := 0;

For i := 1 to m do

Sum := sum + a[ i, j ];

Write( ‘ Tong cot ‘ , j ,’ = ‘ , sum : 0 : 5 );

End;

For i := 1 to m do

Begin

sum := 0;

For j := 1 to n do

Sum := sum + a[ i, j ];

Write( ‘ Tong hang ‘ , i ,’ = ‘ , sum : 0 : 5 );

End;

Readln;

End.

Ví dụ 3: Viết chương trình tìm ma trận chuyển vị của ma trận A.

Ý tưởng:

Dùng mảng 2 chiều để lưu trữ ma trận. Gọi B là ma trận chuyển vị của ma trận A, ta có: Bij = Aji.

Uses Crt;

Type Mang = ARRAY[1..10,1..10] Of Integer;

Var A,B:Mang;

m,n,i,j:Integer;

Begin

{Nhập ma trận}

Write(‘Nhap số dòng m=’); Readln(m);

Write(‘Nhap số cột n=’); Readln(n);

For i:=1 To m Do

For j:=1 To n Do

Begin

Write(‘A[‘,i,j,’]=’); Readln(A[i,j]);

End;

{Tìm ma trận chuyển vị}

For i:=1 To m Do

For j:=1 To n Do B[i,j]:=A[j,i];

{In ma trận chuyển vị ra màn hình}

For i:=1 To m Do

Begin

For j:=1 To n Do Write(B[i,j]:5);

Writeln;

End;

Readln;

End.

Ví dụ 4: Cho một mảng 2 chiều A cấp mxn gồm các số nguyên và một số nguyên x. Viết chương trình thực hiện các công việc sau:

a/ Đếm số lần xuất hiện của x trong A và vị trí của chúng.

b/ Tính tổng các phần tử lớn nhất của mỗi dòng.

Uses Crt;

Type Mang = ARRAY[1..10,1..10] Of Integer;

Var A:Mang;

m,n,i,j,x,dem,S,max:Integer;

Begin

{Nhập ma trận}

Write(‘Nhap số dòng m=’); Readln(m);

Write(‘Nhap số cột n=’); Readln(n);

For i:=1 To m Do

For j:=1 To n Do

Begin

Write(‘A[‘,i,j,’]=’); Readln(A[i,j]);

End;

{Nhập x}

Write(‘Nhap x=’); Readln(x);

{Đếm số lãn xuất hiện của x và vị trí của x}

dem:=0;

Writeln(‘Vi tri cua x trong mang A: ‘);

For i:=1 To m Do

For j:=1 To n Do

If x=A[i,j] Then

Begin

Write(i,j,’ ; ‘);

dem:=dem+1;

End;

Writeln(‘So lan xuat hien cua x trong mang A la: ‘,dem);

{Tính tổng các phần tử lớn nhất của mỗi dòng}

S:=0;

For i:=1 To m Do {duyệt qua từng dòng}

Begin

{Tìm phần tử lớn nhất của dòng thứ i}

Max:=A[i,1];

For j:=2 To n Do {duyệt từng phần tử của dòng thứ i}

If max<A[i,j] Then max:=A[i,j];

{Cộng max vào biến S}

S:=S+max;

End;

Writeln(‘Tong cac phan tu lon nhat cua moi dong la: ‘,S);

Readln;

End.

2. Bài tập

Bài tập 1: Viết chương trình nhập vào số tự nhiên N (N lẻ), sau đó điền các số từ 1 đến n2 vào trong một bảng vuông sao cho tổng các hàng ngang, hàng dọc và 2 đường chéo đều bằng nhau (bảng này được gọi là Ma phương).

Ví dụ: Với N=3 và N=5 ta có

Bắc

2

7

6

3

16

9

22

15

9

5

1

20

8

21

14

2

4

3

8

Tây

7

25

13

1

19

Đông

24

12

5

18

6

11

4

17

10

23

Nam

Phuơng pháp:

Xuất phát từ ô bên phải của ô nằm giữa. Đi theo hướng đông bắc để điền các số 1, 2, ...

Khi điền số, cần chú ý một số nguyên tắc sau:

- Nếu vượt ra phía ngoài bên phải của bảng thì quay trở lại cột đầu tiên.

- Nếu vượt ra phía ngoài bên trên của bảng thì quay trở lại dòng cuối cùng.

- Nếu số đã điền k chia hết cho N thì số tiếp theo sẽ được viết trên cùng một hàng với k nhưng cách 1 ô về phía bên phải.

Uses Crt;

Var A:Array[1..20,1..20] Of Word;

n,i,j,k:Word;

Begin

Write('Nhap N= '); Readln(n);

Clrscr;

{Định vị ô xuất phát}

i:=n DIV 2 + 1;

j:=n DIV 2 + 2;

{Điền các số k từ 1 đến n*n}

For k:=1 To n*n Do

Begin

A[i,j]:=k;

If k MOD n=0 Then j:=j+2

Else Begin

{Đi theo hướng đông bắc}

j:=j+1; i:=i-1;

End;

If j>n Then j:=j MOD n;

If i=0 Then i:=n;

End;

{In kết quả ra màn hình}

For i:=1 To n Do

Begin

For j:=1 To n Do write(a[i,j]:4);

Writeln;

End;

Readln;

End.

Bài tập 2: Cho mảng 2 chiều A cấp mxn. Viết chương trình sắp xếp lại mảng A theo yêu cầu sau:

a/ Các phần tử trên mỗi dòng được sắp xếp theo thứ tự giảm dần.

b/ Các dòng được sắp xếp lại theo thứ tự tăng dần của tổng các phần tử trên mỗi dòng.

Bài tập 3 Nhập một ma trận m hàng, n cột từ bàn phím. Tính và in ra màn hình tổng của mỗi cột và tổng của mỗi hàng.

Const mMax = 30, nMax = 30;

Type Mang = Array[1.. mMax, 1.. nMax] of Real;

Var n, m, i, j : Integer;

sum : Real;

a : Mang;

Begin

Write( ‘ Ban muon nhap ma tran bao nhieu hang va cot ? ‘ );

Readln( m, n );

For i := 1 to m do

For j := 1 to n do

Begin

Write( ' PT thu [ ' , i , ' , ‘ , j, ‘ ] = ' );

Readln( a[ i, j ] );

End;

For j := 1 to n do

Begin

sum := 0;

For i := 1 to m do

Sum := sum + a[ i, j ];

Write( ‘ Tong cot ‘ , j ,’ = ‘ , sum : 0 : 5 );

End;

For i := 1 to m do

Begin

sum := 0;

For j := 1 to n do

Sum := sum + a[ i, j ];

Write( ‘ Tong hang ‘ , i ,’ = ‘ , sum : 0 : 5 );

End;

Readln;

End.

Bài tập 4: Cho 2 mảng số nguyên: Mảng A có m phần tử, mảng B có n phần tử.

a/ Sắp xếp lại các mảng đó theo thứ tự giảm dần.

b/ Trộn 2 mảng đó lại thành mảng C sao cho mảng C vẫn có thứ tự giảm dần (Không được xếp lại mảng C).

Gợi ý:- Dùng 2 chỉ số i,j để duyệt qua các phần tử của 2 mảng A, B và k là chỉ số cho mảng C.

- Trong khi (i<=m) và (j<=n) thì:

{Tức là khi đồng thời cả 2 dãy A, B đều chưa duyệt hết}

+ Nếu A[i]>B[j] thì: C[k]:=A[i]; i:=i+1;

+ Ngược lại: C[k]:=B[j]; j:=j+1;

- Nếu dãy nào hết trước thì đem phần còn lại của dãy kia bổ sung vào cuối dãy C.

Từ khóa » Cách Sắp Xếp Mảng 2 Chiều Pascal