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 Tin học cơ sở


       NHẬP MÔN LẬP TRÌNH
                                        Đặ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

Nmlt c07 mang1_chieu_in
Nmlt c07 mang1_chieu_inNmlt c07 mang1_chieu_in
Nmlt c07 mang1_chieu_in
Huy Nguyễn
 
Pplthdt c02 lop_doi_tuong_v13.09a
Pplthdt c02 lop_doi_tuong_v13.09aPplthdt c02 lop_doi_tuong_v13.09a
Pplthdt c02 lop_doi_tuong_v13.09a
Pix Nhox
 
Pplthdt c04 thuoc_tinhdoituong_phuongthuc_v13.09a
Pplthdt c04 thuoc_tinhdoituong_phuongthuc_v13.09aPplthdt c04 thuoc_tinhdoituong_phuongthuc_v13.09a
Pplthdt c04 thuoc_tinhdoituong_phuongthuc_v13.09a
Pix Nhox
 
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
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 C06 Ham
Nmlt C06 HamNmlt C06 Ham
Nmlt C06 Ham
Cuong
 
Images compression using huffman algorithm matlab
Images compression using huffman algorithm matlabImages compression using huffman algorithm matlab
Images compression using huffman algorithm matlab
Tan Hoang Luu
 
Chuong 9 mach phi tuyen
Chuong 9 mach phi tuyenChuong 9 mach phi tuyen
Chuong 9 mach phi tuyen
thanhyu
 
Lttt matlab chuong 5
Lttt matlab chuong 5Lttt matlab chuong 5
Lttt matlab chuong 5
Hoa Cỏ May
 
Pplthdt c00 gioi_thieumonhoc_v13.09a
Pplthdt c00 gioi_thieumonhoc_v13.09aPplthdt c00 gioi_thieumonhoc_v13.09a
Pplthdt c00 gioi_thieumonhoc_v13.09a
Pix Nhox
 
Chuong 2. de quy dai hoc
Chuong 2. de quy   dai hocChuong 2. de quy   dai hoc
Chuong 2. de quy dai hoc
Vũ Nam
 
Giải bài toán markowitz tối ưu hóa danh mục đầu tư chứng khoán bằng vba for ...
Giải bài toán markowitz  tối ưu hóa danh mục đầu tư chứng khoán bằng vba for ...Giải bài toán markowitz  tối ưu hóa danh mục đầu tư chứng khoán bằng vba for ...
Giải bài toán markowitz tối ưu hóa danh mục đầu tư chứng khoán bằng vba for ...
Nguyen Hau
 

What's hot (20)

Nmlt c07 mang1_chieu_in
Nmlt c07 mang1_chieu_inNmlt c07 mang1_chieu_in
Nmlt c07 mang1_chieu_in
 
Cyclic code
Cyclic codeCyclic code
Cyclic code
 
Nmlt c08 mang2_chieu
Nmlt c08 mang2_chieuNmlt c08 mang2_chieu
Nmlt c08 mang2_chieu
 
Pplthdt c02 lop_doi_tuong_v13.09a
Pplthdt c02 lop_doi_tuong_v13.09aPplthdt c02 lop_doi_tuong_v13.09a
Pplthdt c02 lop_doi_tuong_v13.09a
 
Lttt b11
Lttt b11Lttt b11
Lttt b11
 
Nmlt c07 mang1_chieu
Nmlt c07 mang1_chieuNmlt c07 mang1_chieu
Nmlt c07 mang1_chieu
 
Nmlt c16 ky_thuatlaptrinhdequy
Nmlt c16 ky_thuatlaptrinhdequyNmlt c16 ky_thuatlaptrinhdequy
Nmlt c16 ky_thuatlaptrinhdequy
 
Pplthdt c04 thuoc_tinhdoituong_phuongthuc_v13.09a
Pplthdt c04 thuoc_tinhdoituong_phuongthuc_v13.09aPplthdt c04 thuoc_tinhdoituong_phuongthuc_v13.09a
Pplthdt c04 thuoc_tinhdoituong_phuongthuc_v13.09a
 
Nmlt c08 mang2_chieu_in
Nmlt c08 mang2_chieu_inNmlt c08 mang2_chieu_in
Nmlt c08 mang2_chieu_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 C06 Ham
Nmlt C06 HamNmlt C06 Ham
Nmlt C06 Ham
 
Images compression using huffman algorithm matlab
Images compression using huffman algorithm matlabImages compression using huffman algorithm matlab
Images compression using huffman algorithm matlab
 
Chuong 9 mach phi tuyen
Chuong 9 mach phi tuyenChuong 9 mach phi tuyen
Chuong 9 mach phi tuyen
 
Chapter03 function
Chapter03 functionChapter03 function
Chapter03 function
 
Chuong1 c
Chuong1 c Chuong1 c
Chuong1 c
 
Lttt matlab chuong 5
Lttt matlab chuong 5Lttt matlab chuong 5
Lttt matlab chuong 5
 
Pplthdt c00 gioi_thieumonhoc_v13.09a
Pplthdt c00 gioi_thieumonhoc_v13.09aPplthdt c00 gioi_thieumonhoc_v13.09a
Pplthdt c00 gioi_thieumonhoc_v13.09a
 
Chuong 2. de quy dai hoc
Chuong 2. de quy   dai hocChuong 2. de quy   dai hoc
Chuong 2. de quy dai hoc
 
Giải bài toán markowitz tối ưu hóa danh mục đầu tư chứng khoán bằng vba for ...
Giải bài toán markowitz  tối ưu hóa danh mục đầu tư chứng khoán bằng vba for ...Giải bài toán markowitz  tối ưu hóa danh mục đầu tư chứng khoán bằng vba for ...
Giải bài toán markowitz tối ưu hóa danh mục đầu tư chứng khoán bằng vba for ...
 

Viewers also liked

Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)
Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)
Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)
Thanh Minh Hoang
 
Nmlt c00 gioi_thieumonhoc
Nmlt c00 gioi_thieumonhocNmlt c00 gioi_thieumonhoc
Nmlt c00 gioi_thieumonhoc
vitbau1412
 
Nmlt c01 cac_khainiemcoban_#ref
Nmlt c01 cac_khainiemcoban_#refNmlt c01 cac_khainiemcoban_#ref
Nmlt c01 cac_khainiemcoban_#ref
vitbau1412
 
Nmlt c02 gioi_thieunnltc_in
Nmlt c02 gioi_thieunnltc_inNmlt c02 gioi_thieunnltc_in
Nmlt c02 gioi_thieunnltc_in
Huy Nguyễn
 
Nmlt c01 cac_khainiemcobanvelaptrinh_in
Nmlt c01 cac_khainiemcobanvelaptrinh_inNmlt c01 cac_khainiemcobanvelaptrinh_in
Nmlt c01 cac_khainiemcobanvelaptrinh_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
 
THCS_W10_BaiGiang_TẠO LẬP ĐỒ THỊ TRONG EXCEL
THCS_W10_BaiGiang_TẠO LẬP ĐỒ THỊ TRONG EXCELTHCS_W10_BaiGiang_TẠO LẬP ĐỒ THỊ TRONG EXCEL
THCS_W10_BaiGiang_TẠO LẬP ĐỒ THỊ TRONG EXCEL
CNTT-DHQG
 
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
Huy Rùa
 
Bài 1: Khái niệm lập trình và ngôn ngữ lập trình
Bài 1: Khái niệm lập trình và ngôn ngữ lập trìnhBài 1: Khái niệm lập trình và ngôn ngữ lập trình
Bài 1: Khái niệm lập trình và ngôn ngữ lập trình
Châu Trần
 

Viewers also liked (11)

Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)
Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)
Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)
 
Nmlt c00 gioi_thieumonhoc
Nmlt c00 gioi_thieumonhocNmlt c00 gioi_thieumonhoc
Nmlt c00 gioi_thieumonhoc
 
Nmlt c01 cac_khainiemcoban_#ref
Nmlt c01 cac_khainiemcoban_#refNmlt c01 cac_khainiemcoban_#ref
Nmlt c01 cac_khainiemcoban_#ref
 
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
 
Nmlt c02 gioi_thieunnltc_in
Nmlt c02 gioi_thieunnltc_inNmlt c02 gioi_thieunnltc_in
Nmlt c02 gioi_thieunnltc_in
 
Nmlt c01 cac_khainiemcobanvelaptrinh_in
Nmlt c01 cac_khainiemcobanvelaptrinh_inNmlt c01 cac_khainiemcobanvelaptrinh_in
Nmlt c01 cac_khainiemcobanvelaptrinh_in
 
Nmlt c03 cac_kieudulieucoso_in
Nmlt c03 cac_kieudulieucoso_inNmlt c03 cac_kieudulieucoso_in
Nmlt c03 cac_kieudulieucoso_in
 
THCS_W10_BaiGiang_TẠO LẬP ĐỒ THỊ TRONG EXCEL
THCS_W10_BaiGiang_TẠO LẬP ĐỒ THỊ TRONG EXCELTHCS_W10_BaiGiang_TẠO LẬP ĐỒ THỊ TRONG EXCEL
THCS_W10_BaiGiang_TẠO LẬP ĐỒ THỊ TRONG EXCEL
 
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
 
Bài 1: Khái niệm lập trình và ngôn ngữ lập trình
Bài 1: Khái niệm lập trình và ngôn ngữ lập trìnhBài 1: Khái niệm lập trình và ngôn ngữ lập trình
Bài 1: Khái niệm lập trình và ngôn ngữ lập trình
 
Co so du lieu phan tan
Co so du lieu phan tanCo so du lieu phan tan
Co so du lieu phan tan
 

Similar to Nmlt c12 mang2_chieu

Phần 3: Các kiểu dữ liệu cơ sở
Phần 3: Các kiểu dữ liệu cơ sởPhần 3: Các kiểu dữ liệu cơ sở
Phần 3: Các kiểu dữ liệu cơ sở
Huy Rùa
 
Phần 6: Hàm
Phần 6: HàmPhần 6: Hàm
Phần 6: Hàm
Huy Rùa
 
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
 
Nmlt c11 con_trocoban_in
Nmlt c11 con_trocoban_inNmlt c11 con_trocoban_in
Nmlt c11 con_trocoban_in
Huy Nguyễn
 
Nmlt c16 ky_thuatlaptrinhdequy_in
Nmlt c16 ky_thuatlaptrinhdequy_inNmlt c16 ky_thuatlaptrinhdequy_in
Nmlt c16 ky_thuatlaptrinhdequy_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
 
De thi thu hk1 toan 12 truonghocso.com
De thi thu hk1 toan 12   truonghocso.comDe thi thu hk1 toan 12   truonghocso.com
De thi thu hk1 toan 12 truonghocso.com
Thế Giới Tinh Hoa
 

Similar to Nmlt c12 mang2_chieu (20)

NMLT_C07_Mang1Chieu.pptx
NMLT_C07_Mang1Chieu.pptxNMLT_C07_Mang1Chieu.pptx
NMLT_C07_Mang1Chieu.pptx
 
Nmlt c03 cac_kieudulieucoso
Nmlt c03 cac_kieudulieucosoNmlt c03 cac_kieudulieucoso
Nmlt c03 cac_kieudulieucoso
 
Phần 3: Các kiểu dữ liệu cơ sở
Phần 3: Các kiểu dữ liệu cơ sởPhần 3: Các kiểu dữ liệu cơ sở
Phần 3: Các kiểu dữ liệu cơ sở
 
Phần 6: Hàm
Phần 6: HàmPhần 6: Hàm
Phần 6: Hàm
 
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
 
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
 
Matrix and Computational in Matlab
Matrix and Computational in MatlabMatrix and Computational in Matlab
Matrix and Computational in Matlab
 
Nmlt c11 con_trocoban_in
Nmlt c11 con_trocoban_inNmlt c11 con_trocoban_in
Nmlt c11 con_trocoban_in
 
Nmlt c11 con_trocoban-
Nmlt c11 con_trocoban-Nmlt c11 con_trocoban-
Nmlt c11 con_trocoban-
 
Nmlt c16 ky_thuatlaptrinhdequy_in
Nmlt c16 ky_thuatlaptrinhdequy_inNmlt c16 ky_thuatlaptrinhdequy_in
Nmlt c16 ky_thuatlaptrinhdequy_in
 
Nmlt c14 cac_kythuatthaotactrenbit_in
Nmlt c14 cac_kythuatthaotactrenbit_inNmlt c14 cac_kythuatthaotactrenbit_in
Nmlt c14 cac_kythuatthaotactrenbit_in
 
Dientuso Sld
Dientuso SldDientuso Sld
Dientuso Sld
 
Nmlt c06 ham
Nmlt c06 hamNmlt c06 ham
Nmlt c06 ham
 
Nmlt c10 cau_truc_in
Nmlt c10 cau_truc_inNmlt c10 cau_truc_in
Nmlt c10 cau_truc_in
 
Nmlt c06 ham_in
Nmlt c06 ham_inNmlt c06 ham_in
Nmlt c06 ham_in
 
Ngôn ngữ lập trình và ứng dụng B - Bộ môn đo lường điện tử
Ngôn ngữ lập trình và ứng dụng B - Bộ môn đo lường điện tửNgôn ngữ lập trình và ứng dụng B - Bộ môn đo lường điện tử
Ngôn ngữ lập trình và ứng dụng B - Bộ môn đo lường điện tử
 
De thi thu hk1 toan 12 truonghocso.com
De thi thu hk1 toan 12   truonghocso.comDe thi thu hk1 toan 12   truonghocso.com
De thi thu hk1 toan 12 truonghocso.com
 
Phan2 chuong6 mang
Phan2 chuong6 mangPhan2 chuong6 mang
Phan2 chuong6 mang
 

Nmlt c12 mang2_chieu

  • 1. Trường Đại học Khoa học Tự nhiên Khoa Công nghệ thông tin Bộ môn Tin học cơ sở NHẬP MÔN LẬP TRÌNH Đặ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