Academia.eduAcademia.edu
BÀI TẬP MINH HỌA MÔN TIN HỌC CƠ SỞ A1 Tuần 11. MẢNG 2 CHIỀU CÁC BÀI TẬP CƠ BẢN Bài 1: Viết chương trình nhập, xuất một mảng số nguyên hai chiều có m dòng và n cột. Xác định phần tử lớn nhất và nhỏ nhất trong mảng. #include “stdafx.h” #include “stdio.h” #define max_dong 100 #define max_cot 100 void main() { int m,n; int a[max_dong][max_cot]; int i,j; // nhap cac phan tu cho mang 2 chieu co m dong va n cot printf(" Nhap so dong : m = "); scanf("%d",&m); printf("Nhap so cot : n = "); scanf("%d",&n); for (i=0; i<m; i++) for (j=0; j<n; j++) { printf("\n A[%d,%d] = ",i+1,j+1); scanf("%d",&a[i][j]); } int max = a[0][0], min=a[0][0], x_max=0, y_max=0, x_min=0, y_min=0; // tim phan tu lon nhat va nho nhat trong mang for (i=0;i<m;i++) for (j=0;j<n;j++) { if (max <= a[i][j]) { max = a[i][j]; x_max = i; y_max = j; } if (min >= a[i][j]) { min = a[i][j]; x_min = i; y_min = j; } } // xuat cac phan tu cua mang 2 chieu printf("\n Cac phan tu cua mang A:\n"); for (i=0;i<m;i++) { for (j=0; j<n; j++) printf(" %d ",a[i][j]); printf("\n"); } // xuat vi tri va gia tri cac phan tu lon nhat, nho nhat Trang 32 BÀI TẬP MINH HỌA MÔN TIN HỌC CƠ SỞ A1 printf("\n Phan tu lon nhat cua mang la %d tai vi tri (%d,%d)", max,x_max+1,y_max+1); printf("\n Phan tu nho nhat cua mang la %d tai vi tri (%d,%d)", min,x_min+1,y_min+1); } Bài 2: Viết chương trình sắp xếp ma trận các số thực tăng dần từ trên xuống dưới và từ trái sang phải bằng hai phương pháp dùng và không dùng mảng phụ. Cách 1 : Không sử dụng mảng phụ. #include “stdafx.h” #include “stdio.h” #define max_dong 100 #define max_cot 100 void main() { int m,n; int a[max_dong][max_cot]; int i,j; // nhap cac phan tu cho mang 2 chieu co m dong va n cot printf(" Nhap so dong : m = "); scanf("%d",&m); printf("Nhap so cot : n = "); scanf("%d",&n); for (i=0; i<m; i++) for (j=0; j<n; j++) { printf("\n A[%d,%d] = ",i+1,j+1); scanf("%d",&a[i][j]); } for (int k=0; k<=m*n-2; k++) for (int l=k+1; l<=m*n-1; l++) if (a[k/n][a%n] > a[l/n][l%n]) { int temp = a[k/n][k%n]; a[k/n][k%n] = a[l/n][l%n]; a[l/n][l%n] = temp; } // xuat cac phan tu cua mang 2 chieu printf("\n Cac phan tu cua mang A:\n"); for (i=0;i<m;i++) { for (j=0; j<n; j++) printf(" %d ",a[i][j]); printf("\n"); } } Cách 2 : Sử dụng mảng phụ. #include “stdafx.h” #include “stdio.h” #define max_dong 50 #define max_cot 50 void main() { int m,n; int a[max_dong][max_cot]; Trang 33 BÀI TẬP MINH HỌA MÔN TIN HỌC CƠ SỞ A1 int i,j; // nhap cac phan tu cho mang 2 chieu co m dong va n cot printf(" Nhap so dong : m = "); scanf("%d",&m); printf("Nhap so cot : n = "); scanf("%d",&n); for (i=0; i<m; i++) for (j=0; j<n; j++) { printf("\n A[%d,%d] = ",i+1,j+1); scanf("%d",&a[i][j]); } //Do ma tran ra mang mot chieu b int b[max_dong*max_cot]; int k = 0; for (i=0;i<m;i++) for (j=0;j<n;j++) { b[k] = a[i][j]; k = k+1; } // Sap xep mang mot chieu b for (i=0; i<k-1; i++) for (j=i+1; j<k; j++) if (b[i] > b[j]) { int tmp = b[i]; b[i] = b[j]; b[j] = tmp; } // Do mang mot chieu b tro lai mang hai chieu a k = 0; for (i=0; i<m; i++) for (j=0; j<n; j++) { a[i][j] = b[k]; k = k+1; } // xuat cac phan tu cua mang 2 chieu printf("\n Cac phan tu cua mang A:\n"); for (i=0;i<m;i++) { for (j=0; j<n; j++) printf(" %d ",a[i][j]); printf("\n"); } } Bài 3: Cho một mảng số nguyên A có m dòng và n cột. Một phần tử được gọi là điểm yên ngựa nếu phần tử đó là phần tử nhỏ nhất trong dòng và lớn nhất trong cột. Viết chương trình xác định tất cả các đểm yên ngựa có thể có. #include “stdafx.h” #include “stdio.h” Trang 34 BÀI TẬP MINH HỌA MÔN TIN HỌC CƠ SỞ A1 #define max_dong 50 #define max_cot 50 void main() { int m,n; int a[max_dong][max_cot]; int i,j; // nhap cac phan tu cho mang 2 chieu co m dong va n cot printf(" Nhap so dong : m = "); scanf("%d",&m); printf("Nhap so cot : n = "); scanf("%d",&n); for (i=0; i<m; i++) for (j=0; j<n; j++) { printf("\n A[%d,%d] = ",i+1,j+1); scanf("%d",&a[i][j]); } // tim kiem cac phan tu yen ngua for (i= 0; i<m; i++) for (j=0; j<n; j++) { bool IsMinRow = true, IsMaxCol = true; // kiem tra a[i][j] co phai la phan tu for (int k = 0; k<n; k++) if (a[i][k] < a[i][j]) { IsMinRow = false; break; } // kiem tra a[i][j] co phai la phan tu for (int l=0; i<m; l++) if (a[l][j] > a[i][j]) { IsMaxCol = false; break; } // neu a[i][j] thao dieu kien --> a la if (IsMaxCol && IsMinRow) printf("\n A[%d,%d] = %d la phan ngua.",i+1,j+1,a[i][j]); } } trong dong hay khong ? lon nhat trong cot khong ? phan tu yen ngua tu yen Bài 4: Cho ma trận các số thực A(m x n). Hãy xây dựng ma trận B(m x n) từ ma trận A sao cho B[i][j] = số lượng phần tử dương xung quanh A[i][j] trong ma trận A ( B[i][j] tối đa là 8 và nhỏ nhất là 0). #include “stdafx.h” #include “stdio.h” #define max_dong 50 #define max_cot 50 void main() { int m,n; float a[max_dong][max_cot]; int i,j; // nhap cac phan tu cho mang 2 chieu co m dong va n cot Trang 35 BÀI TẬP MINH HỌA MÔN TIN HỌC CƠ SỞ A1 printf(" Nhap so dong : m = "); scanf("%d",&m); printf("Nhap so cot : n = "); scanf("%d",&n); for (i=0; i<m; i++) for (j=0; j<n; j++) { printf("\n A[%d,%d] = ",i+1,j+1); scanf("%f",&a[i][j]); } // phat sinh mang b float b[max_dong][max_cot]; for (i=0; i<m; i++) for (j=0; j<n; j++) { int count = 0; for (int k=-1; k<=1; k++) for (int l=-1; l<=1; l++) if ((i+k>=0)&&(i+k<m)&&(j+l>=0) &&(j+l<n)&&(a[i+k][j+l] > 0)) count = count + 1; b[i][j] = count; } // xuat cac phan tu cua mang 2 chieu printf("\n Cac phan tu cua mang B:\n"); for (i=0;i<m;i++) { for (j=0; j<n; j++) printf(" %f ",b[i][j]); printf("\n"); } } Bài 5: Hãy sắp xếp ma trận sao cho dòng có tổng nhỏ hơn nằm ở trên và dòng có tổng dòng lớn hơn nằm ở dưới. #include “stdafx.h” #include “stdio.h” #define max_dong 50 #define max_cot 50 void main() { int m,n; int a[max_dong][max_cot]; int i,j; // nhap cac phan tu cho mang 2 chieu co m dong va n cot printf(" Nhap so dong : m = "); scanf("%d",&m); printf("Nhap so cot : n = "); scanf("%d",&n); for (i=0; i<m; i++) for (j=0; j<n; j++) { printf("\n A[%d,%d] = ",i+1,j+1); scanf("%d",&a[i][j]); } Trang 36 BÀI TẬP MINH HỌA MÔN TIN HỌC CƠ SỞ A1 // su dung mang B luu gia tri tong cac dong cua matrix A int b[max_dong]; int k = 0; // tinh tong cac dong va luu vao B for (i=0; i<m; i++) { int tong = 0; for (j=0; j<n ;j++) tong = tong + a[i][j]; b[k++] = tong; } // sap xep lai mang A theo thong tin tong dong trong B for (i=0; i<k-1; i++) for (j=i+1; j<k; j++) { if (b[i] > b[j]) { // hoan vi trong B int tmp; tmp = b[i]; b[i] = b[j]; b[j] = tmp; // hoan vi dong trong A for (int k = 0; k<n; k++) { tmp = a[i][k]; a[i][k] = a[j][k]; a[j][k] = tmp; } } } // xuat cac phan tu cua mang 2 chieu printf("\n Cac phan tu cua mang A sau khi thay doi :\n"); for (i=0;i<m;i++) { for (j=0; j<n; j++) printf(" %d ",a[i][j]); printf("\n"); } } CÁC BÀI TẬP THÊM CÓ ĐỘ KHÓ TRUNG BÌNH 1. Tính tổng tất cả các phần tử trên mảng. 2. Đếm số lần xuất hiện một phần tử x bất kỳ. 3. Đếm số lần xuất hiện của các số nguyên dương. 4. Tính tổng tẩt cả các phần tử không âm. 5. Tính tổng các phần tử trên đường chéo chính. 6. Tính tổng các phần tử trên đường chéo phụ. 7. Sắp xếp các phần tử trên mảng tăng dần trên trên từng dòng. 8. Tính tổng và tích 2 ma trận. Trang 37 BÀI TẬP MINH HỌA MÔN TIN HỌC CƠ SỞ A1 CÁC BÀI TẬP THÊM CÓ ĐỘ KHÓ CAO 1. Sắp xếp các phần tử trên mảng tăng dần trên từng cột và giảm dần trên từng dòng. 2. Sắp xếp các phần tử trên mảng tăng dần lần luợt trên dòng và trên cột. 3. Tính tổng và tích của n ma trận. 4. Xoay 1 ma trận theo chiều bất kỳ. 5. Xoay 1 ma trận theo chiều bất kỳ n bước. 6. Xóa một hàng hoặc một cột bất kỳ trên mảng 2 chiều. 7. Nhập vào 2 mảng 2 chiều, tìm tất cả các phần tử trùng nhau của 2 mảng và thay vào đó là số 0. 8. Nhập vào 2 ma trận cùng kích thước n x m, in ra ma trận tổng. 9. Nhập vào 2 ma trận cùng kích thước n x m, tính ma trận tích. 10. Nhập vào 1 ma trận, xuất ra ma trận nghịch đảo. 11. Tìm giá phần tử lớn nhất và nhỏ nhất trên từng dòng, từng cột, và trên toàn ma trận. Trang 38