This entry is part 53 of 69 in the series Học C Không Khó
84
/ 100
Nội dung chính
Show
- Dạng 1. Bài tập nhập xuất mảng 2 chiều
- Dạng 2. Tìm giá trị lớn nhất/ nhỏ nhất trong mảng 2 chiều
- Dạng 3. Tính tổng 2 ma trận có cùng kích thước
- Dạng 4. Sắp xếp ma trận tăng/ giảm dần
- Một số bài tập mảng 2 chiều khác
- Video liên quan
Trong bài này, Nguyễn Văn Hiếu sẽ cung cấp cho các bạn loạt bài tập mảng 2 chiều có lời giải. Tôi mong rằng bài chia sẻ này giúp các bạn có thể tập luyện và học tốt hơn về phần kiến thức mảng hai chiều. Không dài dòng nữa, chúng ta sẽ bắt đầu với loạt bài tập này ngay thôi nào.
Nội dung bài viết này yêu cầu người đọc cần có kiến thức về mảng 2 chiều trong C/C++. Do đó, nếu bạn cần bổ sung kiến thức thì hãy đọc bài học Mảng 2 chiều trong C/C++ trước khi đọc bài này nhé.
Tóm Tắt
Dạng 1. Bài tập nhập xuất mảng 2 chiều
Nhập xuất là bài tập mảng 2 chiều cơ bản nhất mà chúng ta cần phải làm. Mọi bài toán liên quan tới mảng 2 chiều chúng ta đều cần 2 chức năng này.
BT1. Nhập vào mảng 2 chiều có kích thước m x n. Hiển thị ma trận vừa nhập ra màn hình.
Lời giải:
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<stdio.h>
#include<conio.h>
main()
{
int a[50][50];
int i,j,m,n;
printf(“nhap so hang n=”); scanf(“%d”,&n);
printf(“nhap so cot m=”); scanf(“%d”,&m);
printf(“nhap vao ma tran:\n”);
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
scanf(“%d”,&a[i][j]);
}
}
printf(“ma tran vua nhap la:\n”);
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
printf(“%d “,a[i][j]);
}
printf(“\n”);
}
}
BT2. Viết hàm nhập, xuất 1 ma trận kích thước m x n
Lời giải:
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
void NhapMaTran(int a[][100], int m, int n)
{
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)
{
printf(“A[%d][%d] = “, i, j);
scanf(“%d”, &a[i][j]);
}
}
void XuatMaTran(int a[][100], int m, int n)
{
for(int i = 0; i < m; i++)
{
for(int j = 0; j < n; j++)
printf(“%d\t”, a[i][j]);
printf(“\n”);
}
}
int main(){
int a[100][100];
int m,n;
printf(“nhap so hang n = “); scanf(“%d”,&n);
printf(“nhap so cot m = “); scanf(“%d”,&m);
printf(“nhap vao ma tran:\n”);
NhapMaTran(a, m , n);
XuatMaTran(a, m, n);
}
Dạng 2. Tìm giá trị lớn nhất/ nhỏ nhất trong mảng 2 chiều
Đây là dạng bài tập mảng 2 chiều cơ bản nhất giúp các bạn luyện tập kiến thức, các bạn khi đã hiểu mảng 2 chiều thì hoàn toán có thể áp dụng các kiến thức từ bài tập mảng 1 chiều để dùng cho mảng 2 chiều.
BT3. Nhập vào một ma trận n x m, in ra ma trận vừa nhập dưới dạng bảng. Hiển thị và tính tổng các phần tử trên hàng chẵn của ma trận. Tìm giá trị lớn nhất trên cột 1 của ma trận
Lời giải:
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include<stdio.h>
#include<conio.h>
main()
{
int a[50][50];
int i,j,m,n;
printf(“nhap so hang n=”); scanf(“%d”,&n);
printf(“nhap so cot m=”); scanf(“%d”,&m);
printf(“nhap vao ma tran:\n”);
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
scanf(“%d”,&a[i][j]);
}
}
//hien thi ma tran vua nhap duoi dang bang
printf(“ma tran vua nhap la:\n”);
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
printf(“%d “,a[i][j]);
}
printf(“\n”);
}
// tinh tong pt tren hang chan cua mang
float s=0;
for(i=0;i<n;i=i+2)
{
for(j=0;j<m;j++)
{
s=s+a[i][j];
}
}
printf(“\nTong pt tren hang chan cua mang la: %5f”,s);
// tim max tren cot 1 cua mang
int max;
max=a[0][0];
for(i=1;i<n;i++)
{
if(a[i][0]>max)
{
max=a[i][0];
}
}
printf(“\nGia tri max tren cot 1 cua mang la %5d”,max);
getch();
}
BT4. Viết hàm tìm giá trị lớn nhất, nhỏ nhất trong ma trận
Lời giải:
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <stdio.h>
void NhapMaTran(int a[][100], int m, int n)
{
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)
{
printf(“A[%d][%d] = “, i, j);
scanf(“%d”, &a[i][j]);
}
}
void XuatMaTran(int a[][100], int m, int n)
{
for(int i = 0; i < m; i++)
{
for(int j = 0; j < n; j++)
printf(“%d\t”, a[i][j]);
printf(“\n”);
}
}
int PhanTuLonNhat(int a[][100], int m, int n)
{
int max = a[0][0];
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)
if(a[i][j]>max)
max = a[i][j];
return max;
}
int main(){
int a[100][100];
int m,n;
printf(“nhap so hang n = “); scanf(“%d”,&n);
printf(“nhap so cot m = “); scanf(“%d”,&m);
printf(“nhap vao ma tran:\n”);
NhapMaTran(a, m , n);
XuatMaTran(a, m, n);
printf(“\nPhan tu lon nhat la %d”, PhanTuLonNhat(a, m, n));
}
Dạng 3. Tính tổng 2 ma trận có cùng kích thước
BT5. Tính tổng hai ma trận có cùng kích thước.
Lời giải:
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include<stdio.h>
#include<conio.h>
main()
{
int a[10][10],b[10][10],c[10][10];
int i,j,m,n;
printf(“nhap so hang m=”); scanf(“%d”,&m);
printf(“nhap so cot n=”); scanf(“%d”,&n);
printf(“nhap vao ma tran:\n”);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
scanf(“%d”,&a[i][j]);
}
}
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
scanf(“%d”,&b[i][j]);
}
}
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
c[i][j]=a[i][j]+b[i][j];
}
}
printf(“\nMa tran sau cong:\n”);
for(i=0;i<m;j++)
{
for(j=0;j<n;j++)
{
printf(“%5d”,c[i][j]);
}
printf(“\n”);
}
getch();
}
Dạng 4. Sắp xếp ma trận tăng/ giảm dần
Dạng bài tập mảng 2 chiều: sắp xếp mảng, sắp xếp 1 hàng, 1 cột, …
BT6. Nhập vào một ma trận n x m, in ra ma trận vừa nhập dưới dạng bảng. Sắp xếp hàng 2 theo chiều giá trị các phần tử giảm dần. Đưa ra màn hình tổng các phần tử trong ma trận. Tìm giá trị lớn nhất trong mảng. Tìm giá trị nhỏ nhất chia hết cho 3 có trong mảng.
Lời giải:
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include<stdio.h>
#include<conio.h>
main()
{
int a[50][50];
int m,n,i,j;
printf(“nhap so hang n=”); scanf(“%d”,&n);
printf(“nhap so cot m=”); scanf(“%d”,&m);
printf(“nhap vao ma tran:\n”);
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
scanf(“%d”,&a[i][j]);
}
}
// in ra ma tran vua nhap duoi dang bang
printf(“ma tran vua nhap la:\n”);
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
printf(“%d “,a[i][j]);
}
printf(“\n”);
}
//sap xep hang 2 trong mang theo chieu giam dan
int tg,k;
for(j=0;j<m-1;j++)
{
for(k=j+1;k<m;k++)
{
if(a[1][j]<a[1][k])
{
tg=a[1][j];
a[1][j]=a[1][k];
a[1][k]=tg;
}
}
}
printf(“\nma tran vua sap xep hang 2 la\n”);
for(j=0;j<m;j++)
{
printf(“%5d”,a[1][j]);
}
// Dua ra man hinh tong cac phan tu ma tran
int s=0;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
s=s+a[i][j];
}
}
printf(“\ntong cac phan tu la: %d”,s);
// gia tri nho nhat chia het cho 3 trong mang
int min, kt=0;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(a[i][j]%3==0)
{
min=a[i][j];
kt=1;
break;
}
}
}
if(kt==1)
{
for(i=0;i<n;i++)
{
for(j=0; j<m; j++)
{
if((a[i][j]%3==0)&&(a[i][j]<min))
{
min=a[i][j];
}
}
}
printf(“\nso nho nhat trong cac so chia het cho 3 co trong day la %d”, min);
}
else
{
printf(” trong mang vua nhap khong co so chia het cho 3″);
}
getch();
}
Một số bài tập mảng 2 chiều khác
Bắt đầu ở đây, để cho ngắn gọn bài viết. Mình sẽ chỉ đưa ra hàm con giải quyết phần đề bài của bài tập mảng 2 chiều tương ứng. Các bạn sẽ tự thêm nó vào hàm main nhé. Mẫu code sử dụng hàm có thể xem ở BT2 và BT4.
BT7. Viết hàm tính tổng các số chẵn trong ma trận
int TongCacSoChan(int a[][100], int m, int n)
{
int sum = 0;
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)
if(a[i][j]%2==0)
sum += a[i][j];
return sum;
}
BT8. Viết hàm liệt kê các số nguyên tố trong ma trận, đếm các số nguyên tố có trong ma trận
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
bool SoNguyenTo(int soA)
{
if (soA < 2)
{
return false;
}
else
{
for (int i = 2; i <= sqrt((float)soA); i ++)
{
if (soA%i==0)
{
return false;
}
}
}
return true;
}
int DemSoLuongSNT(int a[][100], int m, int n)
{
int dem = 0;
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)
if(SoNguyenTo(a[i][j])) dem++;
return dem;
}
void LietKeSNT(int a[][100], int m, int n)
{
int dem = 0;
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)
if(SoNguyenTo(a[i][j])) printf(“%d\t”, a[i][j]);
}
BT9. Viết hàm xóa một dòng của ma trận. Viết hàm xóa một cột của ma trận
void XoaDong(int a[][100], int &m, int n, int r)
{
for(int i=r;i<m-1;i++)
for(int j=0;j<n;j++)
a[i][j]=a[i+1][j];
m–;
}
void XoaCot(int a[][100], int m, int &n, int c)
{
for(int i=0;i<m;i++)
for(int j=c;j<n-1;j++)
a[i][j]=a[i][j+1];
n–;
}
BT10. Viết hàm đổi chỗ 2 hàng của 1 ma trận. Viết hàm đổi chỗ 2 cột của ma trận.
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void swap(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
void DoiCho2Hang(int a[][100], int m, int n, int row1, int row2)
{
if((row1>=0 && row1<m)&&(row2>=0 && row2<m))
for(int j=0;j<n;j++)
swap(a[row1][j],a[row2][j]);
}
void DoiChoHaiCot(int a[][100], int m, int n, int column1, int column2)
{
if((column1>=0 && column1<n)&&(column2>=0 && column2<n))
for(int i=0;i<m;i++)
swap(a[i][column1],a[i][column2]);
}
BT12. Viết hàm tìm giá trị lớn nhất/ nhỏ nhất trên đường chéo chính của ma trận.
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//Tìm max
int Max(int a[][100], int n)
{
int max = a[0][0];
for(int i = 1; i < n; i++)
if(a[i][i] > max)
max = a[i][i];
return max;
}
//Tìm min
int Min(int a[][100], int n)
{
int min = a[0][0];
for(int i = 1; i < n; i++)
if(a[i][i] < min)
min = a[i][i];
return min;
}
Trên đây là một số bài tập mảng 2 chiều do mình tổng hợp lại. Mình sẽ tiếp tục cập nhật các bài tập về mảng 2 chiều tại bài viết này khi có bài tập mới. Chúc các bạn học tập tốt!
Xem ngay bộ sưu tập tài liệu lập trình do Lập trình không khó biên soạn: https://github.com/NguyenVanHieuBlog/tai-lieu-lap-trinh