Dưới đây là các bài tập về mảng hai chiều (ma trận) rất phổ biến trong C/ C++, các bạn có thể tham khảo các bài tập về mảng 2 chiều này sẽ giúp ích cho chúng ta luyện tập C/ C++
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
#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"); } }
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 viết dưới dạng hàm
#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); }
Tính tổng các phần tử trong mảng 2 chiều
Thường bài tập này có yêu cầu như sau: 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. Tính tổng các phần tử trong mảng
#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++) { for(j=0;j<m;j++) { s=s+a[i][j]; } } printf("\nTong pt cua mang la: %5f",s); getch(); }
Tìm giá trị lớn nhất/ nhỏ nhất trong mảng 2 chiều
#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)); }
Tìm giá trị theo hàng, cột. Tìm giá trị lớn nhất/nhỏ nhất theo hàng, cột
Thường bài tập này có yêu cầu như sau: 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
Code viết dạng chương trình như sau:
#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(); }
Tính tổng 2 ma trận có cùng kích thước
#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 1:\n"); for(i=0;i<m;i++) { for(j=0;j<n;j++) { scanf("%d",&a[i][j]); } } printf("nhap vao ma tran 2:\n"); 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;i++) { for(j=0;j<n;j++) { printf("%5d",c[i][j]); } printf("\n"); } getch(); }
Sắp xếp ma trận tăng/ giảm dần
Yêu cầu thường phát biểu như sau: 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 1 hàng, 1 cột, …
Ví dụ sau sắp xếp hàng 2 theo chiều giảm dần
#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(i=0;i<n;i++) { for(j=0;j<m;j++) { printf("%d ",a[i][j]); } printf("\n"); } getch(); }
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; }
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
#include<stdio.h> #include<conio.h> #include<math.h> int SoNguyenTo(int soA) { if (soA < 2) { return 0; } else { for (int i = 2; i <= sqrt((float)soA); i ++) { if (soA%i==0) { return 0; } } } return 1; } int DemSoLuongSNT(int a[][50], 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[][50], 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]); } 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"); } printf("Cac so nguyen to:\n"); LietKeSNT(a,n,m); getch(); }
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--; }
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.
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]); }
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.
//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; }