SlideShare ist ein Scribd-Unternehmen logo
1 von 33
Downloaden Sie, um offline zu lesen
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

Weitere ähnliche Inhalte

Was ist angesagt?

Phần 11: Tập tin
Phần 11: Tập tinPhần 11: Tập tin
Phần 11: Tập tinHuy Rùa
 
Phần 1: Các khái niệm cơ bản về lập trình
Phần 1: Các khái niệm cơ bản về lập trìnhPhần 1: Các khái niệm cơ bản về lập trình
Phần 1: Các khái niệm cơ bản về lập trìnhHuy Rùa
 
Bai tap lap trinh c
Bai tap lap trinh  cBai tap lap trinh  c
Bai tap lap trinh ctiểu minh
 
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 4: Lệnh điều khiển và rẽ nhánh
Phần 4: Lệnh điều khiển và rẽ nhánhPhần 4: Lệnh điều khiển và rẽ nhánh
Phần 4: Lệnh điều khiển và rẽ nhánhHuy Rùa
 
Kiến trúc máy tính và hợp ngữ bài 02
Kiến trúc máy tính và hợp ngữ bài 02Kiến trúc máy tính và hợp ngữ bài 02
Kiến trúc máy tính và hợp ngữ bài 02Nhóc Nhóc
 
[Cntt] bài giảng lập trình java bkhcm
[Cntt] bài giảng lập trình java   bkhcm[Cntt] bài giảng lập trình java   bkhcm
[Cntt] bài giảng lập trình java bkhcmHong Phuoc Nguyen
 
Đề Cương ôn tập kiến trúc máy tính và thiết bị ngoại vi
Đề Cương ôn tập kiến trúc máy tính và thiết bị ngoại viĐề Cương ôn tập kiến trúc máy tính và thiết bị ngoại vi
Đề Cương ôn tập kiến trúc máy tính và thiết bị ngoại viĐỗ Đức Hùng
 
Danh Sach Lien Ket
Danh Sach Lien KetDanh Sach Lien Ket
Danh Sach Lien KetTony Nhân
 
Giáo trình c++ full tiếng việt
Giáo trình c++ full tiếng việtGiáo trình c++ full tiếng việt
Giáo trình c++ full tiếng việtMôi Trường Việt
 
Bài giảng ngôn ngữ lập trình c c++ phạm hồng thái[bookbooming.com]
Bài giảng ngôn ngữ lập trình c c++   phạm hồng thái[bookbooming.com]Bài giảng ngôn ngữ lập trình c c++   phạm hồng thái[bookbooming.com]
Bài giảng ngôn ngữ lập trình c c++ phạm hồng thái[bookbooming.com]bookbooming1
 
Phong cách lập trình - Đặng Bình Phương
Phong cách lập trình - Đặng Bình PhươngPhong cách lập trình - Đặng Bình Phương
Phong cách lập trình - Đặng Bình PhươngNguyễn Công Hoàng
 
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ìnhHuy Rùa
 
chuong 4. dai so boole
chuong 4.  dai so boolechuong 4.  dai so boole
chuong 4. dai so boolekikihoho
 
đáP án 24 đề tin
đáP án 24 đề tinđáP án 24 đề tin
đáP án 24 đề tinTtx Love
 
Kiến trúc máy tính và hợp ngữ bài 05
Kiến trúc máy tính và hợp ngữ bài 05Kiến trúc máy tính và hợp ngữ bài 05
Kiến trúc máy tính và hợp ngữ bài 05Nhóc Nhóc
 

Was ist angesagt? (20)

Phần 11: Tập tin
Phần 11: Tập tinPhần 11: Tập tin
Phần 11: Tập tin
 
Phần 1: Các khái niệm cơ bản về lập trình
Phần 1: Các khái niệm cơ bản về lập trìnhPhần 1: Các khái niệm cơ bản về lập trình
Phần 1: Các khái niệm cơ bản về lập trình
 
Bai tap lap trinh c
Bai tap lap trinh  cBai tap lap trinh  c
Bai tap lap trinh c
 
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)
 
Phần 4: Lệnh điều khiển và rẽ nhánh
Phần 4: Lệnh điều khiển và rẽ nhánhPhần 4: Lệnh điều khiển và rẽ nhánh
Phần 4: Lệnh điều khiển và rẽ nhánh
 
Kiến trúc máy tính và hợp ngữ bài 02
Kiến trúc máy tính và hợp ngữ bài 02Kiến trúc máy tính và hợp ngữ bài 02
Kiến trúc máy tính và hợp ngữ bài 02
 
[Cntt] bài giảng lập trình java bkhcm
[Cntt] bài giảng lập trình java   bkhcm[Cntt] bài giảng lập trình java   bkhcm
[Cntt] bài giảng lập trình java bkhcm
 
Đệ Quy, Quay Lui, Nhánh Cận
Đệ Quy, Quay Lui, Nhánh CậnĐệ Quy, Quay Lui, Nhánh Cận
Đệ Quy, Quay Lui, Nhánh Cận
 
Đề Cương ôn tập kiến trúc máy tính và thiết bị ngoại vi
Đề Cương ôn tập kiến trúc máy tính và thiết bị ngoại viĐề Cương ôn tập kiến trúc máy tính và thiết bị ngoại vi
Đề Cương ôn tập kiến trúc máy tính và thiết bị ngoại vi
 
Danh Sach Lien Ket
Danh Sach Lien KetDanh Sach Lien Ket
Danh Sach Lien Ket
 
Giáo trình c++ full tiếng việt
Giáo trình c++ full tiếng việtGiáo trình c++ full tiếng việt
Giáo trình c++ full tiếng việt
 
Bài giảng ngôn ngữ lập trình c c++ phạm hồng thái[bookbooming.com]
Bài giảng ngôn ngữ lập trình c c++   phạm hồng thái[bookbooming.com]Bài giảng ngôn ngữ lập trình c c++   phạm hồng thái[bookbooming.com]
Bài giảng ngôn ngữ lập trình c c++ phạm hồng thái[bookbooming.com]
 
Ktmt chuong 5
Ktmt chuong 5Ktmt chuong 5
Ktmt chuong 5
 
Phong cách lập trình - Đặng Bình Phương
Phong cách lập trình - Đặng Bình PhươngPhong cách lập trình - Đặng Bình Phương
Phong cách lập trình - Đặng Bình Phương
 
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
 
Bai tap java
Bai tap javaBai tap java
Bai tap java
 
Nmlt c06 ham
Nmlt c06 hamNmlt c06 ham
Nmlt c06 ham
 
chuong 4. dai so boole
chuong 4.  dai so boolechuong 4.  dai so boole
chuong 4. dai so boole
 
đáP án 24 đề tin
đáP án 24 đề tinđáP án 24 đề tin
đáP án 24 đề tin
 
Kiến trúc máy tính và hợp ngữ bài 05
Kiến trúc máy tính và hợp ngữ bài 05Kiến trúc máy tính và hợp ngữ bài 05
Kiến trúc máy tính và hợp ngữ bài 05
 

Andere mochten auch

Khoahoctunhien.net mang1chieu
Khoahoctunhien.net mang1chieuKhoahoctunhien.net mang1chieu
Khoahoctunhien.net mang1chieuNguyen Van Hung
 
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 hocHồ Lợi
 
Tu hoc javascript
Tu hoc javascriptTu hoc javascript
Tu hoc javascriptzingoncmu2
 
Nmlt C02 GioiThieuNNLTC
Nmlt C02 GioiThieuNNLTCNmlt C02 GioiThieuNNLTC
Nmlt C02 GioiThieuNNLTCCuong
 
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 TrinhCuong
 
Nmlt C08 Mang2 Chieu
Nmlt C08 Mang2 ChieuNmlt C08 Mang2 Chieu
Nmlt C08 Mang2 ChieuCuong
 
Ttnam dhsp dstt2
Ttnam dhsp dstt2Ttnam dhsp dstt2
Ttnam dhsp dstt2Bắc Sơn
 
Giai tich lop 11 co ban
Giai tich lop 11 co banGiai tich lop 11 co ban
Giai tich lop 11 co banVcoi Vit
 
Ky thuat lap trinh c++
Ky thuat lap trinh c++Ky thuat lap trinh c++
Ky thuat lap trinh c++ptquang160492
 
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 DMSThanh Nguyen
 
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ậtPham Hoang
 
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 2011Phuong ThayTro.Net
 
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ố 1Tran 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 2Minh Ngoc Tran
 
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ảiTrung Thanh Nguyen
 
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 FPTMasterCode.vn
 

Andere mochten auch (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 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
 
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
 
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
 

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

Nmlt c12 mang2_chieu
Nmlt c12 mang2_chieuNmlt c12 mang2_chieu
Nmlt c12 mang2_chieuvitbau1412
 
Nmlt c08 mang2_chieu_in
Nmlt c08 mang2_chieu_inNmlt c08 mang2_chieu_in
Nmlt c08 mang2_chieu_inHuy Nguyễn
 
Nmlt c07 mang1_chieu_in
Nmlt c07 mang1_chieu_inNmlt c07 mang1_chieu_in
Nmlt c07 mang1_chieu_inHuy Nguyễn
 
NMLT_C07_Mang1Chieu.pptx
NMLT_C07_Mang1Chieu.pptxNMLT_C07_Mang1Chieu.pptx
NMLT_C07_Mang1Chieu.pptxTngNguyn371609
 
Nmlt c03 cac_kieudulieucoso
Nmlt c03 cac_kieudulieucosoNmlt c03 cac_kieudulieucoso
Nmlt c03 cac_kieudulieucosoMinh Ngoc Tran
 
Nmlt c03 cac_kieudulieucoso_in
Nmlt c03 cac_kieudulieucoso_inNmlt c03 cac_kieudulieucoso_in
Nmlt c03 cac_kieudulieucoso_inHuy Nguyễn
 
Nmlt C07 Mang1 Chieu
Nmlt C07 Mang1 ChieuNmlt C07 Mang1 Chieu
Nmlt C07 Mang1 ChieuCuong
 
Nmlt c13 con_tronangcao_in
Nmlt c13 con_tronangcao_inNmlt c13 con_tronangcao_in
Nmlt c13 con_tronangcao_inHuy Nguyễn
 
Nmlt c16 ky_thuatlaptrinhdequy
Nmlt c16 ky_thuatlaptrinhdequyNmlt c16 ky_thuatlaptrinhdequy
Nmlt c16 ky_thuatlaptrinhdequyMinh Ngoc Tran
 
Session 4
Session 4Session 4
Session 4pnanhvn
 
Nmlt c14 cac_kythuatthaotactrenbit_in
Nmlt c14 cac_kythuatthaotactrenbit_inNmlt c14 cac_kythuatthaotactrenbit_in
Nmlt c14 cac_kythuatthaotactrenbit_inHuy Nguyễn
 
Matrix and Computational in Matlab
Matrix and Computational in MatlabMatrix and Computational in Matlab
Matrix and Computational in MatlabVuTienLam
 
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.09aPix Nhox
 

Ähnlich wie 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