Mảng hai chiều

0
3899

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<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>

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; i<m; i++)
		for(int j=0; j<n; j++)
			a[i][j]= (rand()%199)-99;
}
//============================================
void XuatMaTran_SoNguyen(int a[][MAXCOL], int m, int n)
{
	for(int i=0; i<m; i++)
	{
		for(int j=0; j<n; j++)
			printf("%5d", a[i][j]);
		printf("\n");
	}
}
//==============================================
int TongMaTran(int a[][MAXCOL], int m, int n)
{
	int sum=0;
	for(int i=0; i<m; i++)
		for(int j=0; j<n; j++)
			sum+=a[i][j];
	return sum;
}
//===========================================
int MaxMaTran(int a[][MAXCOL], int m, int n)
{
	int max=a[0][0];
	for(int i=0; i<m; i++)
		for(int j=0; j<n; j++)
			if(max<a[i][j])
				max=a[i][j];
	return max;
}
//=============================================
int MinMaTran(int a[][MAXCOL], int m, int n)
{
	int min=a[0][0];
	for(int i=0; i<m; i++)
		for(int j=0; j<n; j++)
			if(min>a[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; i<sopt-1; i++)
		for(int j=i+1; j<sopt; j++)
			if(a[i/n][i%n]>a[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.

This site uses Akismet to reduce spam. Learn how your comment data is processed.