Nhập ma trận số nguyên bằng cách tạo giá trị ngẫu nhiên cho các phần tử của ma trận

Bước 1: Tạo project mới (có thể xem lại bài viết Hướng dẫn Tạo Project Visual C++ trong Visual Studio 2012 Hoặc Hướng dẫn Dev-C++ căn bản)
Bước 2: Khai báo thêm các thư viện cơ bản cho chương trình.

#include #include #include #include

#include

Bước 3: Khai báo hằng số cho chương trình.

#define MAXROW 100 //số dòng tối đa
#define MAXCOL 100 //số cột tối đa

Bước 4: Viết các khai báo nguyên mẫu hàm cho chương trình như sau:

void TaoMaTran_SoNguyen(int a[][MAXCOL], int &m, int &n);
void XuatMaTran_SoNguyen(int a[][MAXCOL], int m, int n);
int TongMaTran(int a[][MAXCOL], int m, int n);
int MaxMaTran(int a[][MAXCOL], int m, int n);
int MinMaTran(int a[][MAXCOL], int m, int n);
void SapXepMaTranTang(int a[][MAXCOL], int m, int n);

Bước 5: Viết hàm main để thực thi chương trình.

//=========================================== void Menu() { printf("\n************************************************"); printf("\n* MENU *"); printf("\n*----------------------------------------------*"); printf("\n* 1. Khoi tao ma tran *"); printf("\n* 2. Xuat noi dung cua ma tran *"); printf("\n* 3. Tong gia tri cac phan tu cua ma tran *"); printf("\n* 4. Gia tri phan tu lon nhat, nho nhat *"); printf("\n* 5. Sap xep ma tran tang dan *"); printf("\n* 0. Thoat chuong trinh *"); printf("\n************************************************"); } //========================================= void Process() { int A[MAXROW][MAXCOL]; int M, N; int PhimChon,Sum, Max, Min; do { Menu(); printf("\nHay chon mot chuc nang cua chuong trinh: "); scanf_s("%d", &PhimChon); switch(PhimChon) { case 1: TaoMaTran_SoNguyen(A, M, N); printf("\nNoi dung cua ma tran vua tao la: \n"); XuatMaTran_SoNguyen(A, M, N); break; case 2: printf("\nNoi dung cua ma tran la: \n"); XuatMaTran_SoNguyen(A, M, N); break; case 3: Sum=TongMaTran(A, M, N); printf("\nTong gia tri cac phan tu cua ma tran: %d", Sum); break; case 4: Max=MaxMaTran(A, M, N); Min=MaxMaTran(A, M, N); printf("\nGia tri phan tu lon nhat cua ma tran: %d", Max); printf("\nGia tri phan tu nho nhat cua ma tran: %d", Min); break; case 5: SapXepMaTranTang(A, M, N); printf("\nNoi dung cua ma tran sau khi sap xep tang la: \n"); XuatMaTran_SoNguyen(A, M, N); break; case 0: exit(1); } }while(1); } //========================================== //Phần hàm main void main() { Process(); }

Bước 6: Viết các định nghĩa hàm cần thiết cho chương trình như sau

//============================================= void TaoMaTran_SoNguyen(int a[][MAXCOL], int &m, int &n) { do { printf("Cho biet so dong cua mang: "); scanf_s("%d", &m); }while(m<=0); do { printf("Cho biet so cot cua mang: "); scanf_s("%d", &n); }while(n<=0); srand((unsigned)time(NULL)); for(int i=0; ia[i][j]) min=a[i][j]; return min; } //================================================ void HoanVi(int &x, int &y) { int temp=x; x=y; y=temp; } //======================================== void SapXepMaTranTang(int a[][MAXCOL], int m, int n) { int sopt=m*n; for(int i=0; ia[j/n][j%n]) HoanVi(a[i/n][i%n], a[j/n][j%n]); }

Bài tập làm thêm
Cho một ma trận chứa các số nguyên. Viết một chương trình (dạng menu) thực hiện các yêu cầu sau:

  1. Tạo ngẫu nhiên giá trị cho các phần tử của ma trận.
  2. Xuất giá trị các phần tử của ma trận ra màn hình.
  3. Tìm số chẵn lớn nhất trong ma trận.
  4. Tìm số nguyên tố nhỏ nhất trong ma trận.
  5. Tìm vị trí của giá trị x trong ma trận, x nhập từ phím.
  6. Tìm max của dòng k trong ma trận.
  7. Đếm phần tử dương trong ma trận.
  8. Đếm số lần phần tử x xuất hiện trong ma trận.
  9. Kiểm tra ma trận có vuông không?
  10. Kiểm tra ma trận có toàn là số chẵn không?
  11. Xuất các phần tử trên đường chéo chính.
  12. Xuất các phần tử trên đường chéo phụ
  13. Xuất các phần tử thuộc tam giác trên.
  14. Xuất các phần tử thuộc tam giác dưới.
  15. Xuất các cột có tổng lớn nhất trong ma trận.
  16. Xuất các dòng có tổng nhỏ nhất trong ma trận.
  17. Tính tổng các phần tử trên đường chéo chính.
  18. Tính tổng các phần tử chẵn thuộc tam giác trên.
  19. Tính tổng các phần tử lẻ thuộc tam giác dưới.
  20. Đếm số phần tử cực đại trong ma trận. biết phần tử cực đại là phần tử lớn hơn các phần tử xung quanh nó.

Lưu ý: các câu k, l, m, n, q, r, s thì ma trận phải là ma trận vuông. Nên nếu M¹N thì K=min(M,N) khi đó ta chỉ tính cho ma trận với K dòng ´ K cột đầu tiên.

1

Bạn đang thắc mắc? Ghi câu hỏi của bạn và đăng ở chế độ cộng đồng (?)

Trong ví dụ trên, x là một mảng hai chiều. Nó có thể chứa tối đa 12 yếu tố.

Chúng ta có thể nghĩ mảng này là một bảng có 3 hàng và mỗi hàng có 4 cột như hình bên dưới.

Nhập ma trận số nguyên bằng cách tạo giá trị ngẫu nhiên cho các phần tử của ma trận

Các phần tử trong mảng hai chiều trong Lập trình C ++

Để truy xuất giá trị của phần tử trong mảng, ta sử dụng cú pháp:

[][];

Ví dụ: Cho mảng như sau:

int a[2][3] // 2 dòng, 3 cột​

Các truy xuất:

  • Hợp lệ: a[0][0], a[0][1], …, a[1][1], a[1][2]
  • Không hợp lệ: a[-1][0], a[0][-1], a[2][3], … => cho kết quả không như mong muốn (có thể gây chết chương trình).

Chú ý: khi truy xuất một phần tử mảng, luôn đảm bảo chỉ số của phần tử đó là hợp lệ trong phạm vi của mảng.

1.Nhập và xuất mảng 2 chiều

Bên dưới là ví dụ về nhập, xuất dữ liệu cho mảng:

#include #include // for srand() and rand() #include // for time() using namespace std; // định nghĩa số phần tử mảng #define ROW 100 #define COL 100 // khai báo prototype void nhapMang(int mt[][COL], int &m, int &n); void xuatMang(int mt[][COL], int m, int n); int main() { int mt[ROW][COL]; // mảng myArray có MAX phần tử int nRow, nCol; // số phần tử dòng và cột được sử dụng // nhập xuất mảng tự động nhapMang(mt, nRow, nCol); xuatMang(mt, nRow, nCol); return 0; } // hàm nhập mảng void nhapMang(int mt[][COL], int &m, int &n) { // khởi tạo số ngẫu nhiên srand(time(NULL)); cout << "Nhap so dong : "; cin >> m; cout << "Nhap so cot : "; cin >> n; // khởi tạo mảng ngẫu nhiên từ [0][0] đến [m-1][n-1]. for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { mt[i][j] = rand() % 100; } } } // hàm xuất mảng void xuatMang(int mt[][COL], int m, int n) { // xuất từng phần tử cho mảng for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { cout << mt[i][j] << "\t"; } cout << endl; } }

Output:

Nhap so dong : 2 Nhap so cot : 3 61 63 46 37 92 40

2.Tính tổng các phần tử trong mảng

Yêu cầu: cho trước ma trận mt, kích thước mxn. Tính tổng các phần tử trên dòng d, cột c.

Ý tưởng: duyệt ma trận và cộng dồn các phần tử có tọa độ (dòng, cột) thỏa yêu cầu.

#include #include // for srand() and rand() #include // for time() using namespace std; // định nghĩa số phần tử mảng #define ROW 100 #define COL 100 // khai báo prototype void nhapMang(int mt[][COL], int &m, int &n); void xuatMang(int mt[][COL], int m, int n); int tongDong(int mt[][COL], int n, int d); int tongCot(int mt[][COL], int m, int c); int main() { int mt[ROW][COL]; // mảng myArray có MAX phần tử int nRow, nCol; // số phần tử dòng và cột được sử dụng // nhập xuất mảng tự động nhapMang(mt, nRow, nCol); xuatMang(mt, nRow, nCol); // tính tổng dòng d, cột c int d; cout << "Nhap dong can tinh tong: "; cin >> d; cout << "Tong dong: " << tongDong(mt, nCol, d) << endl; // tính tổng cột c int c; cout << "Nhap dong can tinh tong: "; cin >> c; cout << "Tong dong: " << tongCot(mt, nRow, c) << endl; return 0; } // hàm nhập mảng void nhapMang(int mt[][COL], int &m, int &n) { // khởi tạo số ngẫu nhiên srand(time(NULL)); cout << "Nhap so dong : "; cin >> m; cout << "Nhap so cot : "; cin >> n; // khởi tạo mảng ngẫu nhiên từ [0][0] đến [m-1][n-1]. for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { mt[i][j] = rand() % 100; } } } // hàm xuất mảng void xuatMang(int mt[][COL], int m, int n) { // xuất từng phần tử cho mảng for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { cout << mt[i][j] << "\t"; } cout << endl; } } // tính tổng trên dòng d int tongDong(int mt[][COL], int n, int d) { int sum(0); for (int j = 0; j < n; j++) // Duyệt các cột sum += mt[d][j]; return sum; } // tính tổng trên cột c int tongCot(int mt[][COL], int m, int c) { int sum(0); for (int i = 0; i < m; i++) // Duyệt các dòng sum += mt[i][c]; return sum; }

Ouput 

Nhap so dong : 2 Nhap so cot : 3 83 40 14 47 22 65 Nhap dong can tinh tong: 1 Tong dong: 134 Nhap dong can tinh tong: 2 Tong dong: 79

3.Tìm giá trị lớn nhất của mảng 2 chiều

Yêu cầu: Cho trước ma trận mt, kích thước mxn. Tìm giá trị lớn nhất trong ma trận mt (gọi là max)

Ý tưởng:

  • Giả sử giá trị max hiện tại là giá trị phần tử đầu tiên mt[0][0]
  • Lần lượt kiểm tra các phần tử còn lại để cập nhật max.
#include #include // for srand() and rand() #include // for time() using namespace std; // định nghĩa số phần tử mảng #define ROW 100 #define COL 100 // khai báo prototype void nhapMang(int mt[][COL], int &m, int &n); void xuatMang(int mt[][COL], int m, int n); int timMax(int mt[][COL], int m, int n); int main() { int mt[ROW][COL]; // mảng myArray có MAX phần tử int nRow, nCol; // số phần tử dòng và cột được sử dụng // nhập xuất mảng tự động nhapMang(mt, nRow, nCol); xuatMang(mt, nRow, nCol); // tìm max int max = timMax(mt, nRow, nCol); cout << "Max = " << max << endl; return 0; } // hàm nhập mảng void nhapMang(int mt[][COL], int &m, int &n) { // khởi tạo số ngẫu nhiên srand(time(NULL)); cout << "Nhap so dong : "; cin >> m; cout << "Nhap so cot : "; cin >> n; // khởi tạo mảng ngẫu nhiên từ [0][0] đến [m-1][n-1]. for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { mt[i][j] = rand() % 100; } } } // hàm xuất mảng void xuatMang(int mt[][COL], int m, int n) { // xuất từng phần tử cho mảng for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { cout << mt[i][j] << "\t"; } cout << endl; } } // tìm giá trị max của mảng 2 chiều int timMax(int mt[][COL], int m, int n) { int i, j, max; max = mt[0][0]; for (i = 0; i < m; i++) for (j = 0; j < n; j++) if (mt[i][j] > max) max = mt[i][j]; return max; } Nhap so dong : 2 Nhap so cot : 3 25 37 41 95 53 53 Max = 95

Thao tác với mảng đa chiều

1. Mảng đa chiều hoạt động như thế nào?

Mảng ba chiều cũng hoạt động theo cách tương tự như mảng hai chiều . Ví dụ:

float x[2][4][3];

Trong mảng này, x có thể chứa tối đa 24 yếu tố.

Chúng ta có thể tìm ra tổng số phần tử trong mảng chỉ bằng cách nhân kích thước của nó:

2 x 4 x 3 = 24

2. Kích thước của các mảng đa chiều

Tổng số phần tử có thể được lưu trữ trong một mảng nhiều chiều có thể được tính bằng cách nhân kích thước của tất cả các kích thước.
Ví dụ:
Mảng int x [10] [20] có thể lưu trữ tổng (10 * 20) = 200 phần tử.
Tương tự mảng int x [5] [10] [20] có thể lưu trữ tổng (5 * 10 * 20) = 1000 phần tử.

3. Khởi tạo mảng nhiều chiều

Giống như một mảng bình thường, chúng ta có thể khởi tạo một mảng nhiều chiều theo nhiều cách.

Mảng hai chiều là hình thức đơn giản nhất của mảng đa chiều. Chúng ta có thể thấy một mảng hai chiều là mảng của mảng một chiều để dễ hiểu hơn.

  • Hình thức cơ bản của khai báo mảng hai chiều có kích thước x, y:
    Cú pháp: [x] [y]; Kiểu dữ liệu : Loại dữ liệu sẽ được lưu trữ. Kiểu dữ liệu hợp lệ trong C++
  • Chúng ta có thể khai báo một mảng số nguyên hai chiều có kích thước 'x' có kích thước 10,20 là: int x [10] [20];
  • Các phần tử trong mảng hai chiều thường được gọi bằng x [i] [j] trong đó i là số hàng và 'j' là số cột.
  • Một mảng hai chiều có thể được xem như một bảng có các cột 'x' và 'y' trong đó số hàng nằm trong khoảng từ 0 đến (x-1) và số cột nằm trong khoảng từ 0 đến (y-1). Mảng hai chiều 'x' với 3 hàng và 3 cột được hiển thị bên dưới

Nhập ma trận số nguyên bằng cách tạo giá trị ngẫu nhiên cho các phần tử của ma trận

Có 02 cách để khởi tạo một mảng hai chiều :

1. Phương pháp đầu tiên : 

int test[2][3] = {2, 4, 5, 9, 0, 19}; Phương pháp trên không được ưa thích. 

Một cách tốt hơn để khởi tạo mảng này với các phần tử mảng tương tự được đưa ra dưới đây.

2. Phương pháp tốt hơn :
int test[2][3] = { {2, 4, 5}, {9, 0, 19}};

Mảng này có 2 hàng và 3 cột, đó là lý do tại sao chúng ta có hai hàng phần tử với 3 phần tử mỗi phần.

Nhập ma trận số nguyên bằng cách tạo giá trị ngẫu nhiên cho các phần tử của ma trận

Khởi tạo mảng ba chiều

int test[2][3][4] = {3, 4, 2, 3, 0, -3, 9, 11, 23, 12, 23, 2, 13, 4, 56, 3, 5, 9, 3, 5, 5, 1, 4, 9};

Đây chưa phải là một cách tốt để khởi tạo một mảng ba chiều. Một cách tốt hơn để khởi tạo mảng này là:

int test[2][3][4] = { { {3, 4, 2, 3}, {0, -3, 9, 11}, {23, 12, 23, 2} }, { {13, 4, 56, 3}, {5, 9, 3, 5}, {3, 1, 4, 9} } };

Truy cập các phần tử trong mảng ba chiều : Truy cập các phần tử trong mảng ba chiều cũng tương tự như các phần tử mảng hai chiều.

Ví dụ 1: Mảng hai chiều

// C++ Program to display all elements // of an initialised two dimensional array #include using namespace std; int main() { int test[3][2] = {{2, -5}, {4, 0}, {9, 1}}; // sử dụng vòng lặp lồng nhau // truy cập các hàng của mảng for (int i = 0; i < 3; ++i) { // truy cập các cột của mảng for (int j = 0; j < 2; ++j) { cout << "test[" << i << "][" << j << "] = " << test[i][j] << endl; } } return 0; } test[0][0] = 2 test[0][1] = -5 test[1][0] = 4 test[1][1] = 0 test[2][0] = 9 test[2][1] = 1

Trong ví dụ trên, ta đã khởi tạo một int mảng hai chiều có tên test có 3 "hàng" và 2 "cột".

Ở đây, ta đã sử dụng for vòng lặp lồng nhau để hiển thị các phần tử mảng.

  • vòng lặp bên ngoài từ i = 0 để i = 2 truy cập vào các hàng của mảng
  • vòng lặp bên trong từ j = 0 để j = 1 truy cập các cột của mảng

Cuối cùng, ta sẽ in các phần tử mảng trong mỗi lần lặp.

Ví dụ 2: Mảng ba chiều

// C++ Program to Store value entered by user in // three dimensional array and display it. #include using namespace std; int main() { // Mảng này có thể lưu trữ tối đa 12 phần tử (2x3x2) int test[2][3][2] = { { {1, 2}, {3, 4}, {5, 6} }, { {7, 8}, {9, 10}, {11, 12} } }; for (int i = 0; i < 2; ++i) { for (int j = 0; j < 3; ++j) { for (int k = 0; k < 2; ++k) { cout << "test[" << i << "][" << j << "][" << k << "] = " << test[i][j][k] << endl; } } } return 0; }

Ouput

test[0][0][0] = 1 test[0][0][1] = 2 test[0][1][0] = 3 test[0][1][1] = 4 test[0][2][0] = 5 test[0][2][1] = 6 test[1][0][0] = 7 test[1][0][1] = 8 test[1][1][0] = 9 test[1][1][1] = 10 test[1][2][0] = 11 test[1][2][1] = 12

Khái niệm cơ bản về các yếu tố in của mảng 3 chiều tương tự như mảng 2 chiều.

Tuy nhiên, vì ta đang thao tác 3 chiều nên ta phải sử dụng vòng lặp lồng nhau với 3 vòng thay vì chỉ 2 vòng.

Kết

Như chúng ta có thể thấy, độ phức tạp của mảng tăng theo cấp số nhân với sự gia tăng kích thước. Nếu có thắc mắc hay ý kiến bổ sung, các bạn hãy để lại comment phía dưới nha