SlideShare a Scribd company logo
1 of 33
Download to read offline
Trường Đại học Khoa học Tự nhiên
Khoa Công nghệ thông tin
Bộ môn Công nghệ phần mềm


       NHẬP MÔN LẬP TRÌNH
                                    ThS. Đặng Bình Phương
                                     dbphuong@fit.hcmus.edu.vn




                                   MẢNG HAI CHIỀU




                                                                 1
&
VC
     BB
          Nội dung


               1     Khái niệm


               2     Khai báo


               3     Truy xuất dữ liệu kiểu mảng


               4     Một số bài toán trên mảng 2 chiều




                                                         Mảng hai chiều
                                                                          2
&
VC
     BB
           Ma Trận




                0   1   … n-1              0   … n-1

           0                         0

 Am,n                           An
           …




                                      …
          m-1                        n-1




                                                       Mảng hai chiều
                                                                        3
&
VC
     BB
           Ma Trận

                0   … n-1          0   … n-1          0   … n-1

          0                  0                  0

     An
           …




                              …




                                                 …
          n-1                n-1                n-1


                dòng = cột         dòng > cột         dòng < cột

                0   … n-1          0   … n-1          0   … n-1

          0                  0                  0

     An
           …




                              …




                                                 …
          n-1                n-1                n-1


          dòng + cột = n-1   dòng + cột > n-1 dòng + cột < n-1
                                                            Mảng hai chiều
                                                                             4
&
VC
     BB
            Khai báo kiểu mảng 2 chiều

     Cú pháp
          typedef <kiểu cơ sở> <tên kiểu>[<N1>][<N2>];

       N1, N2: số lượng phần tử mỗi chiều
     Ví dụ
          typedef int MaTran[3][4];


                             0   1   2   3

                         0

           Kiểu MaTran   1

                         2

                                                     Mảng hai chiều
                                                                      5
&
VC
     BB
            Khai báo biến mảng 2 chiều

     Cú pháp
       Tường minh
          <kiểu cơ sở> <tên biến>[<N1>][<N2>];


           Không tường minh (thông qua kiểu)
          typedef <kiểu cơ sở> <tên kiểu>[<N1>][<N2>];

          <tên kiểu> <tên biến>;
          <tên kiểu> <tên biến 1>, <tên biến 2>;



                                                     Mảng hai chiều
                                                                      6
&
VC
     BB
            Khai báo biến mảng 2 chiều

     Ví dụ
       Tường minh
          int a[10][20], b[10][20];
          int c[5][10];
          int d[10][20];
           Không tường minh (thông qua kiểu)
          typedef int MaTran10x20[10][20];
          typedef int MaTran5x10[5][10];

          MaTran10x20 a, b;
          MaTran11x11 c;
          MaTran10x20 d;

                                                Mảng hai chiều
                                                                 7
&
VC
     BB
            Truy xuất đến một phần tử

     Thông qua chỉ số
          <tên biến mảng>[<giá trị cs1>][<giá trị cs2>]

     Ví dụ                                           0   1    2      3

                                                  0
       Cho mảng 2 chiều như sau
                                                  1
          int a[3][4];
                                                  2
           Các truy xuất
             • Hợp lệ: a[0][0], a[0][1], …, a[2][2], a[2][3]
             • Không hợp lệ: a[-1][0], a[2][4], a[3][3]



                                                          Mảng hai chiều
                                                                           8
&
VC
     BB
            Gán dữ liệu kiểu mảng

     Không được sử dụng phép gán thông thường
      mà phải gán trực tiếp giữa các phần tử
          <biến mảng đích> = <biến mảng nguồn>; //sai
          <biến mảng đích>[<giá trị cs1>][giá trị cs2] =
                                                   <giá trị>;
     Ví dụ
          int a[5][10], b[5][10];

          b = a; // Sai
          int i, j;
          for (i = 0; i < 5; i++)
                 for (j = 0; j < 10; j++)
                        b[i][j] = a[i][j];
                                                     Mảng hai chiều
                                                                      9
&
VC
     BB
            Truyền mảng cho hàm

     Truyền mảng cho hàm
        Tham số kiểu mảng trong khai báo hàm giống
         như khai báo biến mảng
          void NhapMaTran(int a[50][100]);

           Tham số kiểu mảng truyền cho hàm chính là địa
            chỉ của phần tử đầu tiên của mảng
             • Có thể bỏ số lượng phần tử chiều thứ 2 hoặc con trỏ.
             • Mảng có thể thay đổi nội dung sau khi thực hiện hàm.
          void NhapMaTran(int a[][100]);
          void NhapMaTran(int (*a)[100]);

                                                     Mảng hai chiều
                                                                      10
&
VC
     BB
            Truyền mảng cho hàm

     Truyền mảng cho hàm
        Số lượng phần tử thực sự truyền qua biến khác
          void XuatMaTran(int a[50][100], int m, int n);
          void XuatMaTran(int a[][100], int m, int n);
          void XuatMaTran(int (*a)[100], int m, int n);
     Lời gọi hàm
          void NhapMaTran(int a[][100], int &m, int &n);
          void XuatMaTran(int a[][100], int m, int n);
          void main()
          {
                 int a[50][100], m, n;
                 NhapMaTran(a, m, n);
                 XuatMaTran(a, m, n);
          }                                           Mảng hai chiều
                                                                       11
&
VC
     BB
          Một số bài toán cơ bản

     Viết chương trình con thực hiện các yêu cầu sau
       Nhập mảng
       Xuất mảng
       Tìm kiếm một phần tử trong mảng
       Kiểm tra tính chất của mảng
       Tính tổng các phần tử trên dòng/cột/toàn ma
        trận/đường chéo chính/nửa trên/nửa dưới
       Tìm giá trị nhỏ nhất/lớn nhất của mảng
      …

                                           Mảng hai chiều
                                                            12
&
VC
     BB
            Một số quy ước

     Kiểu dữ liệu
          #define MAXD 50
          #define MAXC 100

     Các chương trình con
       Hàm void HoanVi(int x, int y): hoán vị giá trị
        của hai số nguyên.
       Hàm int LaSNT(int n): kiểm tra một số có phải
        là số nguyên tố. Trả về 1 nếu n là số nguyên
        tố, ngược lại trả về 0.

                                             Mảng hai chiều
                                                              13
&
VC
     BB
              Thủ tục HoanVi & Hàm LaSNT

          void HoanVi(int &x, int &y)
          {
                 int tam = x; x = y; y = tam;
          }

          int LaSNT(int n)
          {
                 int i, dem = 0;
                 for (i = 1; i <= n; i++)
                        if (n % i == 0)
                               dem++;

                if (dem == 2)
                       return 1;
                else return 0;
          }
                                                Mảng hai chiều
                                                                 14
&
VC
     BB
           Nhập Ma Trận

     Yêu cầu
           Cho phép nhập mảng a, m dòng, n cột
     Ý tưởng
           Cho trước một mảng 2 chiều có dòng tối đa là MAXD,
            số cột tối đa là MAXC.
           Nhập số lượng phần tử thực sự m, n của mỗi chiều.
           Nhập từng phần tử từ [0][0] đến [m-1][n-1].




                                                   Mảng hai chiều
                                                                    15
&
VC
     BB
              Hàm Nhập Ma Trận

          void NhapMaTran(int a[][MAXC], int &m, int &n)
          {
                 printf(“Nhap so dong, so cot cua ma tran: ”);
                 scanf(“%d%d”, &m, &n);

                int i, j;
                for (i = 0; i < m; i++)
                       for (j = 0; j < n; j++)
                       {
                              printf(“Nhap a[%d][%d]: ”, i, j);
                              scanf(“%d”, &a[i][j]);
                       }
          }



                                                      Mảng hai chiều
                                                                       16
&
VC
     BB
           Xuất Ma Trận

     Yêu cầu
           Cho phép nhập mảng a, m dòng, n cột
     Ý tưởng
           Xuất giá trị từng phần tử của mảng 2 chiều từ dòng
            có 0 đến dòng m-1, mỗi dòng xuất giá giá trị của cột 0
            đến cột n-1 trên dòng đó.




                                                      Mảng hai chiều
                                                                       17
&
VC
     BB
              Hàm Xuất Ma Trận

          void XuatMaTran(int a[][MAXC], int m, int n)
          {
                 int i, j;
                 for (i = 0; i < m; i++)
                 {
                        for (j = 0; j < n; j++)
                               printf(“%d ”, a[i][j]);

                       printf(“n”);
                }
          }




                                                     Mảng hai chiều
                                                                      18
&
VC
     BB
           Tìm kiếm một phần tử trong Ma Trận

     Yêu cầu
           Tìm xem phần tử x có nằm trong ma trận a kích
            thước mxn hay không?
     Ý tưởng
           Duyệt từng phần của ma trận a. Nếu phần tử đang
            xét bằng x thì trả về có (1), ngược lại trả về không có
            (0).




                                                        Mảng hai chiều
                                                                         19
&
VC
     BB
            Hàm Tìm Kiếm

          int TimKiem(int a[][MAXC], int m, int n, int x)
          {
                 int i, j;
                 for (i = 0; i < m; i++)
                        for (j = 0; j < n; j++)
                               if (a[i][j] == x)
                                      return 1;
                 return 0;
          }




                                                     Mảng hai chiều
                                                                      20
&
VC
     BB
           Kiểm tra tính chất của mảng

     Yêu cầu
           Cho trước ma trận a kích thước mxn. Ma trận a có
            phải là ma trậntoàn các số nguyên tố hay không?
     Ý tưởng
           Cách 1: Đếm số lượng số ngtố của ma trận. Nếu số
            lượng này bằng đúng mxn thì ma trận toàn ngtố.
           Cách 2: Đếm số lượng số không phải ngtố của ma
            trận. Nếu số lượng này bằng 0 thì ma trận toàn ngtố.
           Cách 3: Tìm xem có phần tử nào không phải số ngtố
            không. Nếu có thì ma trận không toàn số ngtố.


                                                      Mảng hai chiều
                                                                       21
&
VC
     BB
              Hàm Kiểm Tra (Cách 1)

          int KiemTra_C1(int a[][MAXC], int m, int n)
          {
                 int i, j, dem = 0;

                for (i = 0; i < m; i++)
                       for (j = 0; j < n; j++)
                              if (LaSNT(a[i][j] == 1)
                                     dem++;

                if (dem == m * n)
                       return 1;
                return 0;
          }



                                                        Mảng hai chiều
                                                                         22
&
VC
     BB
              Hàm Kiểm Tra (Cách 2)

          int KiemTra_C2(int a[][MAXC], int m, int n)
          {
                 int i, j, dem = 0;

                for (i = 0; i < m; i++)
                       for (j = 0; j < n; j++)
                              if (LaSNT(a[i][j] == 0)
                                     dem++;

                if (dem == 0)
                       return 1;
                return 0;
          }



                                                        Mảng hai chiều
                                                                         23
&
VC
     BB
              Hàm Kiểm Tra (Cách 2)

          int KiemTra_C3(int a[][MAXC], int m, int n)
          {
                 int i, j, dem = 0;

                for (i = 0; i < m; i++)
                       for (j = 0; j < n; j++)
                              if (LaSNT(a[i][j] == 0)
                                     return 0;

                return 1;
          }




                                                        Mảng hai chiều
                                                                         24
&
VC
     BB
           Tính tổng các phần tử

     Yêu cầu
           Cho trước ma trận a, kích thước mxn. Tính tổng các
            phần tử trên:
             •   Dòng d, cột c
             •   Đường chéo chính, đường chéo phụ (ma trận vuông)
             •   Nửa trên/dưới đường chéo chính (ma trận vuông)
             •   Nửa trên/dưới đường chéo phụ (ma trận vuông)
     Ý 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.


                                                           Mảng hai chiều
                                                                            25
&
VC
     BB
              Hàm tính tổng trên dòng

          int TongDong(int a[][MAXC], int m, int n, int d)
          {
                 int j, tong;

                tong = 0;

                for (j = 0; j < n; j++)    // Duyệt các cột
                       tong = tong + a[d][j];

                return tong;
          }




                                                     Mảng hai chiều
                                                                      26
&
VC
     BB
              Hàm tính tổng trên cột

          int TongCot(int a[][MAXC], int m, int c)
          {
                 int i, tong;

                tong = 0;

                for (i = 0; i < m; i++)    // Duyệt các dòng
                       tong = tong + a[i][c];

                return tong;
          }




                                                     Mảng hai chiều
                                                                      27
&
VC
     BB
              Hàm tính tổng đường chéo chính

          int TongDCChinh(int a[][MAXC], int n)
          {
                 int i, tong;

                tong = 0;

                for (i = 0; i < n; i++)
                       tong = tong + a[i][i];

                return tong;
          }




                                                  Mảng hai chiều
                                                                   28
&
VC
     BB
              Hàm tính tổng trên đường chéo chính

          int TongTrenDCChinh(int a[][MAXC], int n)
          {
                 int i, j, tong;

                tong = 0;

                for (i = 0; i < n; i++)
                       for (j = 0; j<n; j++)
                              if (i < j)
                                     tong = tong + a[i][j];

                return tong;
          }



                                                      Mảng hai chiều
                                                                       29
&
VC
     BB
              Hàm tính tổng dưới đường chéo chính

          int TongTrenDCChinh(int a[][MAXC], int n)
          {
                 int i, j, tong;

                tong = 0;

                for (i = 0; i < n; i++)
                       for (j = 0; j < n; j++)
                              if (i > j)
                                     tong = tong + a[i][j];

                return tong;
          }



                                                      Mảng hai chiều
                                                                       30
&
VC
     BB
              Hàm tính tổng trên đường chéo phụ

          int TongDCPhu(int a[][MAXC], int n)
          {
                 int i, tong;

                tong = 0;

                for (i = 0; i < n; i++)
                       tong = tong + a[i][n-i-1];

                return tong;
          }




                                                    Mảng hai chiều
                                                                     31
&
VC
     BB
           Tìm giá trị lớn nhất của Ma Trận

     Yêu cầu
           Cho trước ma trận a, kích thước mxn. Tìm giá trị lớn
            nhất trong ma trận a (gọi là max)
     Ý tưởng
           Giả sử giá trị max hiện tại là giá trị phần tử đầu tiên
            a[0][0]
           Lần lượt kiểm tra các phần tử còn lại để cập nhật max.




                                                      Mảng hai chiều
                                                                       32
&
VC
     BB
              Hàm tìm Max

          int TimMax(int a[][MAXC], int m, int n)
          {
                 int i, j, max;

                max = a[0][0];

                for (i = 0; i < m; i++)
                       for (j = 0; j < n; j++)
                              if (a[i][j] > max)
                                     max = a[i][j];

                return max;
          }



                                                      Mảng hai chiều
                                                                       33

More Related Content

What's hot

Phần 12: Hàm (Nâng cao)
Phần 12: Hàm (Nâng cao)Phần 12: Hàm (Nâng cao)
Phần 12: Hàm (Nâng cao)
Huy Rùa
 
Phần 9: Chuỗi ký tự
Phần 9: Chuỗi ký tựPhần 9: Chuỗi ký tự
Phần 9: Chuỗi ký tự
Huy Rùa
 
tổng hợp bài tập java có đáp án chi tiết
 tổng hợp bài tập java có đáp án chi tiết tổng hợp bài tập java có đáp án chi tiết
tổng hợp bài tập java có đáp án chi tiết
Hoàng Trí Phan
 
Bài tập nhập môn lập trình
Bài tập nhập môn lập trìnhBài tập nhập môn lập trình
Bài tập nhập môn lập trình
Huy Rùa
 
Phần 11: Tập tin
Phần 11: Tập tinPhần 11: Tập tin
Phần 11: Tập tin
Huy Rùa
 
Lap trinh c++ có lời giải 3
Lap trinh c++ có lời giải 3Lap trinh c++ có lời giải 3
Lap trinh c++ có lời giải 3
Minh Ngoc Tran
 
Kiến trúc máy tính và hợp ngữ bài 04
Kiến trúc máy tính và hợp ngữ bài 04Kiến trúc máy tính và hợp ngữ bài 04
Kiến trúc máy tính và hợp ngữ bài 04
Nhóc Nhóc
 
Lttt matlab chuong 2
Lttt matlab chuong 2Lttt matlab chuong 2
Lttt matlab chuong 2
Hoa Cỏ May
 
Nmlt C01 Cac Khai Niem Co Ban Ve Lap Trinh
Nmlt C01 Cac Khai Niem Co Ban Ve Lap TrinhNmlt C01 Cac Khai Niem Co Ban Ve Lap Trinh
Nmlt C01 Cac Khai Niem Co Ban Ve Lap Trinh
Cuong
 
Hd th sql server_tuan5_n_khanh
Hd th sql server_tuan5_n_khanhHd th sql server_tuan5_n_khanh
Hd th sql server_tuan5_n_khanh
Hai Rom
 

What's hot (20)

Phần 12: Hàm (Nâng cao)
Phần 12: Hàm (Nâng cao)Phần 12: Hàm (Nâng cao)
Phần 12: Hàm (Nâng cao)
 
Mảng 2 chiều
Mảng 2 chiềuMảng 2 chiều
Mảng 2 chiều
 
Nmlt c01 cac_khainiemcobanvelaptrinh
Nmlt c01 cac_khainiemcobanvelaptrinhNmlt c01 cac_khainiemcobanvelaptrinh
Nmlt c01 cac_khainiemcobanvelaptrinh
 
Phần 9: Chuỗi ký tự
Phần 9: Chuỗi ký tựPhần 9: Chuỗi ký tự
Phần 9: Chuỗi ký tự
 
tổng hợp bài tập java có đáp án chi tiết
 tổng hợp bài tập java có đáp án chi tiết tổng hợp bài tập java có đáp án chi tiết
tổng hợp bài tập java có đáp án chi tiết
 
Bài tập nhập môn lập trình
Bài tập nhập môn lập trìnhBài tập nhập môn lập trình
Bài tập nhập môn lập trình
 
Học python
Học pythonHọc python
Học python
 
Phần 11: Tập tin
Phần 11: Tập tinPhần 11: Tập tin
Phần 11: Tập tin
 
Đề thi Kỹ thuật lập trình có lời giải
Đề thi Kỹ thuật lập trình có lời giảiĐề thi Kỹ thuật lập trình có lời giải
Đề thi Kỹ thuật lập trình có lời giải
 
Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...
Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...
Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...
 
Lap trinh c++ có lời giải 3
Lap trinh c++ có lời giải 3Lap trinh c++ có lời giải 3
Lap trinh c++ có lời giải 3
 
B4 dh
B4 dhB4 dh
B4 dh
 
Kiến trúc máy tính và hợp ngữ bài 04
Kiến trúc máy tính và hợp ngữ bài 04Kiến trúc máy tính và hợp ngữ bài 04
Kiến trúc máy tính và hợp ngữ bài 04
 
Lttt matlab chuong 2
Lttt matlab chuong 2Lttt matlab chuong 2
Lttt matlab chuong 2
 
Bai13-Cau truc du lieu va giai thuat - Cay (Tree)
Bai13-Cau truc du lieu va giai thuat - Cay (Tree)Bai13-Cau truc du lieu va giai thuat - Cay (Tree)
Bai13-Cau truc du lieu va giai thuat - Cay (Tree)
 
Giáo trình SQL server tiếng việt
Giáo trình SQL server tiếng việtGiáo trình SQL server tiếng việt
Giáo trình SQL server tiếng việt
 
Tin học cơ sở - FPT Polytechnic
Tin học cơ sở - FPT PolytechnicTin học cơ sở - FPT Polytechnic
Tin học cơ sở - FPT Polytechnic
 
Nmlt C01 Cac Khai Niem Co Ban Ve Lap Trinh
Nmlt C01 Cac Khai Niem Co Ban Ve Lap TrinhNmlt C01 Cac Khai Niem Co Ban Ve Lap Trinh
Nmlt C01 Cac Khai Niem Co Ban Ve Lap Trinh
 
Chuong6 hoạt động ngắt
Chuong6 hoạt động ngắtChuong6 hoạt động ngắt
Chuong6 hoạt động ngắt
 
Hd th sql server_tuan5_n_khanh
Hd th sql server_tuan5_n_khanhHd th sql server_tuan5_n_khanh
Hd th sql server_tuan5_n_khanh
 

Viewers also liked

Bai tap thuc hanh nhap mon tin hoc
Bai tap thuc hanh nhap mon tin hocBai tap thuc hanh nhap mon tin hoc
Bai tap thuc hanh nhap mon tin hoc
Hồ Lợi
 
Nmlt C02 GioiThieuNNLTC
Nmlt C02 GioiThieuNNLTCNmlt C02 GioiThieuNNLTC
Nmlt C02 GioiThieuNNLTC
Cuong
 
Nmlt C08 Mang2 Chieu
Nmlt C08 Mang2 ChieuNmlt C08 Mang2 Chieu
Nmlt C08 Mang2 Chieu
Cuong
 
Giai tich lop 11 co ban
Giai tich lop 11 co banGiai tich lop 11 co ban
Giai tich lop 11 co ban
Vcoi Vit
 
Bài tập thực hành số 1
Bài tập thực hành số 1Bài tập thực hành số 1
Bài tập thực hành số 1
Tran Trung Dung
 
Lập trình c++ có lời giải 2
Lập trình c++ có lời giải 2Lập trình c++ có lời giải 2
Lập trình c++ có lời giải 2
Minh Ngoc Tran
 
Bai tap lap trinh c
Bai tap lap trinh  cBai tap lap trinh  c
Bai tap lap trinh c
tiểu minh
 

Viewers also liked (20)

Baitap ktlt
Baitap ktltBaitap ktlt
Baitap ktlt
 
Khoahoctunhien.net mang1chieu
Khoahoctunhien.net mang1chieuKhoahoctunhien.net mang1chieu
Khoahoctunhien.net mang1chieu
 
Bai tap thuc hanh nhap mon tin hoc
Bai tap thuc hanh nhap mon tin hocBai tap thuc hanh nhap mon tin hoc
Bai tap thuc hanh nhap mon tin hoc
 
Cac lenh trong matlab
Cac lenh trong matlabCac lenh trong matlab
Cac lenh trong matlab
 
Tu hoc javascript
Tu hoc javascriptTu hoc javascript
Tu hoc javascript
 
Nmlt c10 cau_truc
Nmlt c10 cau_trucNmlt c10 cau_truc
Nmlt c10 cau_truc
 
Nmlt C02 GioiThieuNNLTC
Nmlt C02 GioiThieuNNLTCNmlt C02 GioiThieuNNLTC
Nmlt C02 GioiThieuNNLTC
 
Nmlt C08 Mang2 Chieu
Nmlt C08 Mang2 ChieuNmlt C08 Mang2 Chieu
Nmlt C08 Mang2 Chieu
 
Ttnam dhsp dstt2
Ttnam dhsp dstt2Ttnam dhsp dstt2
Ttnam dhsp dstt2
 
Giai tich lop 11 co ban
Giai tich lop 11 co banGiai tich lop 11 co ban
Giai tich lop 11 co ban
 
Bai tap c
Bai tap cBai tap c
Bai tap c
 
Ky thuat lap trinh c++
Ky thuat lap trinh c++Ky thuat lap trinh c++
Ky thuat lap trinh c++
 
Mô Tả Chức Năng & Báo Giá - phần mềm Quản Lý Hệ Thống Phân Phối SmartBiz DMS
Mô Tả Chức Năng & Báo Giá - phần mềm Quản Lý Hệ Thống Phân Phối SmartBiz DMSMô Tả Chức Năng & Báo Giá - phần mềm Quản Lý Hệ Thống Phân Phối SmartBiz DMS
Mô Tả Chức Năng & Báo Giá - phần mềm Quản Lý Hệ Thống Phân Phối SmartBiz DMS
 
Tài liệu Matlab kỹ thuật
Tài liệu Matlab kỹ thuậtTài liệu Matlab kỹ thuật
Tài liệu Matlab kỹ thuật
 
Kiểm tra 1 tiết unit 9, 10, 11 tiếng anh 10 trường THPT Trị An 2011
Kiểm tra 1 tiết unit 9, 10, 11 tiếng anh 10 trường THPT Trị An 2011Kiểm tra 1 tiết unit 9, 10, 11 tiếng anh 10 trường THPT Trị An 2011
Kiểm tra 1 tiết unit 9, 10, 11 tiếng anh 10 trường THPT Trị An 2011
 
Bài tập thực hành số 1
Bài tập thực hành số 1Bài tập thực hành số 1
Bài tập thực hành số 1
 
Lập trình c++ có lời giải 2
Lập trình c++ có lời giải 2Lập trình c++ có lời giải 2
Lập trình c++ có lời giải 2
 
Bai tap lap trinh c
Bai tap lap trinh  cBai tap lap trinh  c
Bai tap lap trinh c
 
Bài tập mẫu C và C++ có giải
Bài tập mẫu C và C++ có giảiBài tập mẫu C và C++ có giải
Bài tập mẫu C và C++ có giải
 
Bài 1: Tổng quan về cấu trúc và giải thuật - Giáo trình FPT
Bài 1: Tổng quan về cấu trúc và giải thuật - Giáo trình FPTBài 1: Tổng quan về cấu trúc và giải thuật - Giáo trình FPT
Bài 1: Tổng quan về cấu trúc và giải thuật - Giáo trình FPT
 

Similar to Phần 8: Mảng hai chiều

Nmlt c12 mang2_chieu
Nmlt c12 mang2_chieuNmlt c12 mang2_chieu
Nmlt c12 mang2_chieu
vitbau1412
 
Nmlt c08 mang2_chieu_in
Nmlt c08 mang2_chieu_inNmlt c08 mang2_chieu_in
Nmlt c08 mang2_chieu_in
Huy Nguyễn
 
Nmlt c07 mang1_chieu_in
Nmlt c07 mang1_chieu_inNmlt c07 mang1_chieu_in
Nmlt c07 mang1_chieu_in
Huy Nguyễn
 
Nmlt c03 cac_kieudulieucoso_in
Nmlt c03 cac_kieudulieucoso_inNmlt c03 cac_kieudulieucoso_in
Nmlt c03 cac_kieudulieucoso_in
Huy Nguyễn
 
Nmlt C07 Mang1 Chieu
Nmlt C07 Mang1 ChieuNmlt C07 Mang1 Chieu
Nmlt C07 Mang1 Chieu
Cuong
 
Nmlt c13 con_tronangcao_in
Nmlt c13 con_tronangcao_inNmlt c13 con_tronangcao_in
Nmlt c13 con_tronangcao_in
Huy Nguyễn
 
Nmlt c14 cac_kythuatthaotactrenbit_in
Nmlt c14 cac_kythuatthaotactrenbit_inNmlt c14 cac_kythuatthaotactrenbit_in
Nmlt c14 cac_kythuatthaotactrenbit_in
Huy Nguyễn
 
Pplthdt c03 kieu_dulieucoso_lopdungsan_v13.09a
Pplthdt c03 kieu_dulieucoso_lopdungsan_v13.09aPplthdt c03 kieu_dulieucoso_lopdungsan_v13.09a
Pplthdt c03 kieu_dulieucoso_lopdungsan_v13.09a
Pix Nhox
 

Similar to Phần 8: Mảng hai chiều (20)

Nmlt c12 mang2_chieu
Nmlt c12 mang2_chieuNmlt c12 mang2_chieu
Nmlt c12 mang2_chieu
 
c3 mang2 chieu
c3 mang2 chieuc3 mang2 chieu
c3 mang2 chieu
 
Nmlt c08 mang2_chieu
Nmlt c08 mang2_chieuNmlt c08 mang2_chieu
Nmlt c08 mang2_chieu
 
Mang1 chieu
Mang1 chieuMang1 chieu
Mang1 chieu
 
Nmlt c08 mang2_chieu_in
Nmlt c08 mang2_chieu_inNmlt c08 mang2_chieu_in
Nmlt c08 mang2_chieu_in
 
Nmlt c07 mang1_chieu_in
Nmlt c07 mang1_chieu_inNmlt c07 mang1_chieu_in
Nmlt c07 mang1_chieu_in
 
NMLT_C07_Mang1Chieu.pptx
NMLT_C07_Mang1Chieu.pptxNMLT_C07_Mang1Chieu.pptx
NMLT_C07_Mang1Chieu.pptx
 
Nmlt c07 mang1_chieu
Nmlt c07 mang1_chieuNmlt c07 mang1_chieu
Nmlt c07 mang1_chieu
 
Nmlt c03 cac_kieudulieucoso
Nmlt c03 cac_kieudulieucosoNmlt c03 cac_kieudulieucoso
Nmlt c03 cac_kieudulieucoso
 
Nmlt c03 cac_kieudulieucoso_in
Nmlt c03 cac_kieudulieucoso_inNmlt c03 cac_kieudulieucoso_in
Nmlt c03 cac_kieudulieucoso_in
 
Nmlt C07 Mang1 Chieu
Nmlt C07 Mang1 ChieuNmlt C07 Mang1 Chieu
Nmlt C07 Mang1 Chieu
 
Nmlt c13 con_tronangcao_in
Nmlt c13 con_tronangcao_inNmlt c13 con_tronangcao_in
Nmlt c13 con_tronangcao_in
 
Nmlt c16 ky_thuatlaptrinhdequy
Nmlt c16 ky_thuatlaptrinhdequyNmlt c16 ky_thuatlaptrinhdequy
Nmlt c16 ky_thuatlaptrinhdequy
 
Nmlt c11 con_trocoban
Nmlt c11 con_trocobanNmlt c11 con_trocoban
Nmlt c11 con_trocoban
 
344444
344444344444
344444
 
Session 4
Session 4Session 4
Session 4
 
Nmlt c14 cac_kythuatthaotactrenbit_in
Nmlt c14 cac_kythuatthaotactrenbit_inNmlt c14 cac_kythuatthaotactrenbit_in
Nmlt c14 cac_kythuatthaotactrenbit_in
 
Lttt b11
Lttt b11Lttt b11
Lttt b11
 
Matrix and Computational in Matlab
Matrix and Computational in MatlabMatrix and Computational in Matlab
Matrix and Computational in Matlab
 
Pplthdt c03 kieu_dulieucoso_lopdungsan_v13.09a
Pplthdt c03 kieu_dulieucoso_lopdungsan_v13.09aPplthdt c03 kieu_dulieucoso_lopdungsan_v13.09a
Pplthdt c03 kieu_dulieucoso_lopdungsan_v13.09a
 

Phần 8: Mảng hai chiều

  • 1. Trường Đại học Khoa học Tự nhiên Khoa Công nghệ thông tin Bộ môn Công nghệ phần mềm NHẬP MÔN LẬP TRÌNH ThS. Đặng Bình Phương dbphuong@fit.hcmus.edu.vn MẢNG HAI CHIỀU 1
  • 2. & VC BB Nội dung 1 Khái niệm 2 Khai báo 3 Truy xuất dữ liệu kiểu mảng 4 Một số bài toán trên mảng 2 chiều Mảng hai chiều 2
  • 3. & VC BB Ma Trận 0 1 … n-1 0 … n-1 0 0 Am,n An … … m-1 n-1 Mảng hai chiều 3
  • 4. & VC BB Ma Trận 0 … n-1 0 … n-1 0 … n-1 0 0 0 An … … … n-1 n-1 n-1 dòng = cột dòng > cột dòng < cột 0 … n-1 0 … n-1 0 … n-1 0 0 0 An … … … n-1 n-1 n-1 dòng + cột = n-1 dòng + cột > n-1 dòng + cột < n-1 Mảng hai chiều 4
  • 5. & VC BB Khai báo kiểu mảng 2 chiều Cú pháp typedef <kiểu cơ sở> <tên kiểu>[<N1>][<N2>];  N1, N2: số lượng phần tử mỗi chiều Ví dụ typedef int MaTran[3][4]; 0 1 2 3 0 Kiểu MaTran 1 2 Mảng hai chiều 5
  • 6. & VC BB Khai báo biến mảng 2 chiều Cú pháp  Tường minh <kiểu cơ sở> <tên biến>[<N1>][<N2>];  Không tường minh (thông qua kiểu) typedef <kiểu cơ sở> <tên kiểu>[<N1>][<N2>]; <tên kiểu> <tên biến>; <tên kiểu> <tên biến 1>, <tên biến 2>; Mảng hai chiều 6
  • 7. & VC BB Khai báo biến mảng 2 chiều Ví dụ  Tường minh int a[10][20], b[10][20]; int c[5][10]; int d[10][20];  Không tường minh (thông qua kiểu) typedef int MaTran10x20[10][20]; typedef int MaTran5x10[5][10]; MaTran10x20 a, b; MaTran11x11 c; MaTran10x20 d; Mảng hai chiều 7
  • 8. & VC BB Truy xuất đến một phần tử Thông qua chỉ số <tên biến mảng>[<giá trị cs1>][<giá trị cs2>] Ví dụ 0 1 2 3 0  Cho mảng 2 chiều như sau 1 int a[3][4]; 2  Các truy xuất • Hợp lệ: a[0][0], a[0][1], …, a[2][2], a[2][3] • Không hợp lệ: a[-1][0], a[2][4], a[3][3] Mảng hai chiều 8
  • 9. & VC BB Gán dữ liệu kiểu mảng Không được sử dụng phép gán thông thường mà phải gán trực tiếp giữa các phần tử <biến mảng đích> = <biến mảng nguồn>; //sai <biến mảng đích>[<giá trị cs1>][giá trị cs2] = <giá trị>; Ví dụ int a[5][10], b[5][10]; b = a; // Sai int i, j; for (i = 0; i < 5; i++) for (j = 0; j < 10; j++) b[i][j] = a[i][j]; Mảng hai chiều 9
  • 10. & VC BB Truyền mảng cho hàm Truyền mảng cho hàm  Tham số kiểu mảng trong khai báo hàm giống như khai báo biến mảng void NhapMaTran(int a[50][100]);  Tham số kiểu mảng truyền cho hàm chính là địa chỉ của phần tử đầu tiên của mảng • Có thể bỏ số lượng phần tử chiều thứ 2 hoặc con trỏ. • Mảng có thể thay đổi nội dung sau khi thực hiện hàm. void NhapMaTran(int a[][100]); void NhapMaTran(int (*a)[100]); Mảng hai chiều 10
  • 11. & VC BB Truyền mảng cho hàm Truyền mảng cho hàm  Số lượng phần tử thực sự truyền qua biến khác void XuatMaTran(int a[50][100], int m, int n); void XuatMaTran(int a[][100], int m, int n); void XuatMaTran(int (*a)[100], int m, int n); Lời gọi hàm void NhapMaTran(int a[][100], int &m, int &n); void XuatMaTran(int a[][100], int m, int n); void main() { int a[50][100], m, n; NhapMaTran(a, m, n); XuatMaTran(a, m, n); } Mảng hai chiều 11
  • 12. & VC BB Một số bài toán cơ bản Viết chương trình con thực hiện các yêu cầu sau  Nhập mảng  Xuất mảng  Tìm kiếm một phần tử trong mảng  Kiểm tra tính chất của mảng  Tính tổng các phần tử trên dòng/cột/toàn ma trận/đường chéo chính/nửa trên/nửa dưới  Tìm giá trị nhỏ nhất/lớn nhất của mảng … Mảng hai chiều 12
  • 13. & VC BB Một số quy ước Kiểu dữ liệu #define MAXD 50 #define MAXC 100 Các chương trình con  Hàm void HoanVi(int x, int y): hoán vị giá trị của hai số nguyên.  Hàm int LaSNT(int n): kiểm tra một số có phải là số nguyên tố. Trả về 1 nếu n là số nguyên tố, ngược lại trả về 0. Mảng hai chiều 13
  • 14. & VC BB Thủ tục HoanVi & Hàm LaSNT void HoanVi(int &x, int &y) { int tam = x; x = y; y = tam; } int LaSNT(int n) { int i, dem = 0; for (i = 1; i <= n; i++) if (n % i == 0) dem++; if (dem == 2) return 1; else return 0; } Mảng hai chiều 14
  • 15. & VC BB Nhập Ma Trận Yêu cầu  Cho phép nhập mảng a, m dòng, n cột Ý tưởng  Cho trước một mảng 2 chiều có dòng tối đa là MAXD, số cột tối đa là MAXC.  Nhập số lượng phần tử thực sự m, n của mỗi chiều.  Nhập từng phần tử từ [0][0] đến [m-1][n-1]. Mảng hai chiều 15
  • 16. & VC BB Hàm Nhập Ma Trận void NhapMaTran(int a[][MAXC], int &m, int &n) { printf(“Nhap so dong, so cot cua ma tran: ”); scanf(“%d%d”, &m, &n); int i, j; for (i = 0; i < m; i++) for (j = 0; j < n; j++) { printf(“Nhap a[%d][%d]: ”, i, j); scanf(“%d”, &a[i][j]); } } Mảng hai chiều 16
  • 17. & VC BB Xuất Ma Trận Yêu cầu  Cho phép nhập mảng a, m dòng, n cột Ý tưởng  Xuất giá trị từng phần tử của mảng 2 chiều từ dòng có 0 đến dòng m-1, mỗi dòng xuất giá giá trị của cột 0 đến cột n-1 trên dòng đó. Mảng hai chiều 17
  • 18. & VC BB Hàm Xuất Ma Trận void XuatMaTran(int a[][MAXC], int m, int n) { int i, j; for (i = 0; i < m; i++) { for (j = 0; j < n; j++) printf(“%d ”, a[i][j]); printf(“n”); } } Mảng hai chiều 18
  • 19. & VC BB Tìm kiếm một phần tử trong Ma Trận Yêu cầu  Tìm xem phần tử x có nằm trong ma trận a kích thước mxn hay không? Ý tưởng  Duyệt từng phần của ma trận a. Nếu phần tử đang xét bằng x thì trả về có (1), ngược lại trả về không có (0). Mảng hai chiều 19
  • 20. & VC BB Hàm Tìm Kiếm int TimKiem(int a[][MAXC], int m, int n, int x) { int i, j; for (i = 0; i < m; i++) for (j = 0; j < n; j++) if (a[i][j] == x) return 1; return 0; } Mảng hai chiều 20
  • 21. & VC BB Kiểm tra tính chất của mảng Yêu cầu  Cho trước ma trận a kích thước mxn. Ma trận a có phải là ma trậntoàn các số nguyên tố hay không? Ý tưởng  Cách 1: Đếm số lượng số ngtố của ma trận. Nếu số lượng này bằng đúng mxn thì ma trận toàn ngtố.  Cách 2: Đếm số lượng số không phải ngtố của ma trận. Nếu số lượng này bằng 0 thì ma trận toàn ngtố.  Cách 3: Tìm xem có phần tử nào không phải số ngtố không. Nếu có thì ma trận không toàn số ngtố. Mảng hai chiều 21
  • 22. & VC BB Hàm Kiểm Tra (Cách 1) int KiemTra_C1(int a[][MAXC], int m, int n) { int i, j, dem = 0; for (i = 0; i < m; i++) for (j = 0; j < n; j++) if (LaSNT(a[i][j] == 1) dem++; if (dem == m * n) return 1; return 0; } Mảng hai chiều 22
  • 23. & VC BB Hàm Kiểm Tra (Cách 2) int KiemTra_C2(int a[][MAXC], int m, int n) { int i, j, dem = 0; for (i = 0; i < m; i++) for (j = 0; j < n; j++) if (LaSNT(a[i][j] == 0) dem++; if (dem == 0) return 1; return 0; } Mảng hai chiều 23
  • 24. & VC BB Hàm Kiểm Tra (Cách 2) int KiemTra_C3(int a[][MAXC], int m, int n) { int i, j, dem = 0; for (i = 0; i < m; i++) for (j = 0; j < n; j++) if (LaSNT(a[i][j] == 0) return 0; return 1; } Mảng hai chiều 24
  • 25. & VC BB Tính tổng các phần tử Yêu cầu  Cho trước ma trận a, kích thước mxn. Tính tổng các phần tử trên: • Dòng d, cột c • Đường chéo chính, đường chéo phụ (ma trận vuông) • Nửa trên/dưới đường chéo chính (ma trận vuông) • Nửa trên/dưới đường chéo phụ (ma trận vuông) Ý 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. Mảng hai chiều 25
  • 26. & VC BB Hàm tính tổng trên dòng int TongDong(int a[][MAXC], int m, int n, int d) { int j, tong; tong = 0; for (j = 0; j < n; j++) // Duyệt các cột tong = tong + a[d][j]; return tong; } Mảng hai chiều 26
  • 27. & VC BB Hàm tính tổng trên cột int TongCot(int a[][MAXC], int m, int c) { int i, tong; tong = 0; for (i = 0; i < m; i++) // Duyệt các dòng tong = tong + a[i][c]; return tong; } Mảng hai chiều 27
  • 28. & VC BB Hàm tính tổng đường chéo chính int TongDCChinh(int a[][MAXC], int n) { int i, tong; tong = 0; for (i = 0; i < n; i++) tong = tong + a[i][i]; return tong; } Mảng hai chiều 28
  • 29. & VC BB Hàm tính tổng trên đường chéo chính int TongTrenDCChinh(int a[][MAXC], int n) { int i, j, tong; tong = 0; for (i = 0; i < n; i++) for (j = 0; j<n; j++) if (i < j) tong = tong + a[i][j]; return tong; } Mảng hai chiều 29
  • 30. & VC BB Hàm tính tổng dưới đường chéo chính int TongTrenDCChinh(int a[][MAXC], int n) { int i, j, tong; tong = 0; for (i = 0; i < n; i++) for (j = 0; j < n; j++) if (i > j) tong = tong + a[i][j]; return tong; } Mảng hai chiều 30
  • 31. & VC BB Hàm tính tổng trên đường chéo phụ int TongDCPhu(int a[][MAXC], int n) { int i, tong; tong = 0; for (i = 0; i < n; i++) tong = tong + a[i][n-i-1]; return tong; } Mảng hai chiều 31
  • 32. & VC BB Tìm giá trị lớn nhất của Ma Trận Yêu cầu  Cho trước ma trận a, kích thước mxn. Tìm giá trị lớn nhất trong ma trận a (gọi là max) Ý tưởng  Giả sử giá trị max hiện tại là giá trị phần tử đầu tiên a[0][0]  Lần lượt kiểm tra các phần tử còn lại để cập nhật max. Mảng hai chiều 32
  • 33. & VC BB Hàm tìm Max int TimMax(int a[][MAXC], int m, int n) { int i, j, max; max = a[0][0]; for (i = 0; i < m; i++) for (j = 0; j < n; j++) if (a[i][j] > max) max = a[i][j]; return max; } Mảng hai chiều 33