Học Pascal Cùng J[p6] - THPT Quang Hà
Có thể bạn quan tâm
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
-
Thuật Toán Sắp Xếp Qua Lại Mảng Hai Chiều Trong Pascal - Ôn Thi HSG
-
Sắp Xếp Zích Zắc Mảng Hai Chiều - Code Free Pascal - Ôn Thi HSG
-
Sắp Xếp Mảng 2 Chiều Tăng Dần Trái - Phải, Trên - Dưới - Thiệu Mao
-
Viết Chương Trình Sắp Xếp Mảng 2 Chiều Theo Các Yêu Cầu Sau - Hoc24
-
Bài Tập Sắp Xếp Mảng 2 Chiều | Cộng đồng Học Sinh Việt Nam
-
2022 Bài Tập Pascal: Phần Mảng 2 Chiều - Duy Pets
-
Sắp Xếp Mảng Hai Chiều Trong Pascal - Code9.Info
-
Bài 57. Cách Sắp Xếp Mảng Hai Chiều Tăng Dần Hoặc Giảm Dần
-
Cách Nhanh Có Thật Sự Nhanh Trong Sắp Xếp Mảng 2 Chiều
-
Bài Tập Pascal Về Mảng 2 Chiều - 123doc
-
LTC 57. Cách Sắp Xếp Mảng Hai Chiều Tăng Dần Hoặc Giảm Dần
-
Sắp Xếp Mảng [Archive] - Diễn Đàn Tin Học
-
Lập Trình C: Cách Sắp Xếp Mảng 2 Chiều | V1Study