S7UuQK& Q X7U~F0 QJkhoi.n.le/ltcb/baigiang/pdf/bg06_CauTrucMang.pdf4x §q /ì &k Í6 Õ3k «q 7 ñ...

52
Lp Trình Cơ Bn Cu Trúc Mng TS. Lê Nguyên Khôi Trường Đihc Công ngh, ĐHQGHN

Transcript of S7UuQK& Q X7U~F0 QJkhoi.n.le/ltcb/baigiang/pdf/bg06_CauTrucMang.pdf4x §q /ì &k Í6 Õ3k «q 7 ñ...

  • Lập Trình Cơ BảnCấu Trúc Mảng

    TS. Lê Nguyên Khôi

    Trường Đại học Công nghệ, ĐHQGHN

  • Nội Dung

    1

    Khái niệm chung Truyền mảng vào hàm Lập trình với mảng

    Lập Trình Cơ Bản

  • Giới Thiệu

    2Lập Trình Cơ Bản

    0 0 0 0 0 0 0 0 0 0

    0 1 2 3 4 5 6 7 8 9

    0 2 4 6 8 10 12 14 16 18

    0 3 6 9 12 15 18 21 24 27

    0 4 8 12 16 20 24 28 32 36

    0 5 10 15 20 25 30 35 40 45

    0 6 12 18 24 30 36 42 48 54

    0 7 14 21 28 35 42 49 56 63

    0 8 16 24 32 40 48 56 64 72

    0 9 18 27 36 45 54 63 72 81

  • Giới Thiệu

    3Lập Trình Cơ Bản

    0

    0 1 2 3 4 5 6 7 8 9

    2

    3

    4

    5

    6

    7

    8

    9

  • Giới Thiệu

    4Lập Trình Cơ Bản

    a b c d e f g h

    8 8

    7 7

    6 6

    5 5

    4 4

    3 3

    2 2

    1 1

    a b c d e f g h

  • Đặt Vấn Đề

    5

    Biến không phù hợp để biểu diễn và xử lýnhững dữ liệu phức tạp, ví dụ: Danh sách điểm thi của một sinh viên

    Danh sách sinh viên của lớp học

    Sắp xếp, tìm kiếm, tính toán trên chuỗi dữ liệu

    Ngôn ngữ lập trình (C++) cung cấp các kiểu dữliệu có cấu trúc để xử lý các vấn đề trên Trong đó mảng là cấu trúc dữ liệu thông dụng nhất

    Mảng dùng để lưu trữ dữ liệu cùng kiểu

    Tránh phải sử dụng nhiều biến

    Lập Trình Cơ Bản

  • Khái Niệm Chung

    6

    Mảng là chuỗi dữ liệu có cùng kiểu Đặt tại các ô nhớ liên tiếp trong bộ nhớ Mỗi phần tử mảng có một chỉ số riêng biệt Sử dụng chỉ số để định vị & truy cập phần tử Ví dụ: điểm thi 5 môn của sinh viên lưu trữ

    trong mảng có 5 phần tử (mảng diem_so) Mảng trên có 5 phần tử, lưu dữ liệu kiểu int,

    chỉ số bắt đầu từ 0 đến 4

    Lập Trình Cơ Bản

    Chỉ số 0 1 2 3 4

    Dữ liệu 45 60 77 72 83

  • Khái Niệm Chung

    7

    Các phần tử của mảng có thể coi là biến số têndiem_so_0, diem_so_1, diem_so_2, diem_so_3, diem_so_4, có kiểu dữ liệu int

    Chỉ số phần tử đặt trong ngoặc vuông ([…]) diem_so[0], diem_so[1], diem_so[2], diem_so[3], diem_so[4]

    Truy cập phần tử mảng, sử dụng: Tên mảng (diem_so)

    chỉ số phần tử là một giá trị/biểu thức nguyên

    Lập Trình Cơ Bản

    Chỉ số 0 1 2 3 4

    Dữ liệu 45 60 77 72 83

  • Sử dụng tên mảng và chỉ số phần tử

    Truy Cập Mảng

    8Lập Trình Cơ Bản

    Chỉ số 0 1 2 3 4

    Dữ liệu 45 60 77 72 83

    diem_so[2] = 74; // 77 -> 74

    // với i=1, câu lệnh sau -> diem_so[3] = 75diem_so[i+2] = 75; // 72 -> 75

    // thực hiện tính toántb = (diem_so[2] + diem_so[3]) / 2;

    //in ra 45 và 83cout

  • Khai Báo Mảng

    9

    Cú pháp:Kiểu_Dữ_Liệu tên_mảng[số_phần_tử];

    Ví dụ:int diem_so[5];

    Khai báo một mảng có tên diem_so, có 5 phần tử, lưu trữ giá trị kiểu int

    Lưu ý: Mảng phải được khai báo trước khi sử dụng

    Khi khai báo phải xác định số phần tử mảng

    Số phần tử của mảng không thay đổi sau khai báo

    Lập Trình Cơ Bản

  • Nhập Dữ Liệu – Thực Hiện Tính Toán

    10Lập Trình Cơ Bản

    const int SO_MON_HOC = 5;int main(){

    int diem_so[SO_MON_HOC];for (int i = 0; i < SO_MON_HOC; i++)

    cin >> diem_so[i];double tong_diem = 0.0;for (int i = 0; i < SO_MON_HOC; i++)

    tong_diem = tong_diem + diem_so[i];cout

  • Khởi Tạo Mảng

    11

    Mảng có thể được khởi tạo như sau:int diem_so[5] = {45, 60, 77, 72, 83};

    Lưu ý: số giá trị trong danh sách khởi tạo (trong {}) không được vượt quá kích thước mảng (trong [])

    Mảng cũng có thể được khởi tạo như sau:int diem_so[] = {45, 60, 77, 72, 83};

    C++ sẽ tự xác định độ dài của mảng dựa trên độ dàicủa danh sách khởi tạo

    Mảng không được khởi tạo, phần tử mảng cógiá trị không xác định (giống biến)

    Lập Trình Cơ Bản

  • Thống kê số lần ra mặt giá trị từ 1 đến 6, sau6000 lần tung xúc xắc

    Ứng Dụng

    12Lập Trình Cơ Bản

    int main() {const int SO_MAT = 6;int dem[SO_MAT] = {0, 0, 0, 0, 0, 0};for (int i = 0; i < 6000; i++) {

    int mat = rand() % SO_MAT;dem[mat]++;

    }for (int m = 0; m < SO_MAT; m++) {

    cout

  • Quản Lý Chỉ Số Phần Tử

    13

    Khai báo mảng có kích thước số_phần_tử, chỉ số các phần tử từ 0 đến số_phần_tử - 1

    Tất cả các chỉ số khác không hợp lệ Truy cập vào các chỉ số không hợp lệ, ví dụdiem_so[-1], diem_so[SO_MON_HOC]: Truy cập ra vùng bộ nhớ ngoài mảng

    Không gây lỗi cú pháp (lỗi dịch)

    Có thể gây lỗi khi chạy chương trình Chương trình chạy sai

    Dừng đột ngột

    Lập trình viên có trách nhiệm kiểm soát giá trị chỉ số

    Lập Trình Cơ Bản

  • Dùng tên mảng làm tham số truyền cho hàm

    Hàm thay đổi giá trị trong mảng, kết thúc hàm, giá trịtrong mảng thay đổi

    Mảng được truyền theo kiểu tham chiếu, nhưng khôngsử dụng toán tử &

    Truyền Mảng Cho Hàm

    14Lập Trình Cơ Bản

    void nhapMang(int mang[]) {for (int i = 0; i < SO_MON_HOC; i++)

    cin >> mang[i];}int main() {

    int diem_so[SO_MON_HOC];nhapMang(diem_so);return 0;

    }

  • Nếu không muốn hàm thay đổi giá trị trong mảng, sửdụng khai báo hằng số trong chữ ký hàm đối với mảng

    Thay đổi giá trị phần tử mảng (gán, nhập) gây lỗi dịch

    Truyền Mảng Cho Hàm

    15Lập Trình Cơ Bản

    double dtb(const int mang[], int so_phan_tu) {double tong = 0.0; for (int i = 0; i < so_phan_tu; i++)

    tong = tong + mang[i];return (tong / so_phan_tu);

    }int main() {

    int diem_so[SO_MON_HOC];nhapMang(diem_so);cout

  • Lập Trình Với Mảng

    16

    Nhập & in dữ liệu Tìm kiếm dữ liệu Tìm kiếm nhỏ/lớn nhất Sắp xếp dữ liệu Thêm & loại dữ liệu

    Lập Trình Cơ Bản

  • Nhập & In Dữ Liệu Mảng

    17Lập Trình Cơ Bản

    void nhapMang(int mang[], int so_phan_tu) {for (int i = 0; i < so_phan_tu; i++)

    cin >> mang[i];}void inMang(const int mang[], int so_phan_tu) {

    for (int i = 0; i < so_phan_tu; i++)cout

  • Bắt đầu từ đầu mảng, kiểm tra từng phần tử Tìm thấy giá trị, trả về true Hết mảng, không tìm thấy, trả về false

    Tìm Kiếm Giá Trị Trong Mảng

    18Lập Trình Cơ Bản

    i=06 1 4 5 0 8 … … … …

    i=16 1 4 5 0 8 … … … …

    i=26 1 4 5 0 8 … … … …

    i=36 1 4 5 0 8 … … … …

    i=46 1 4 5 0 8 … … … …

    ?0

    ?0

    ?0

    ?0

    true0

    6 1 4 5 0 8 … … … …0

  • Tìm Kiếm Giá Trị Trong Mảng

    19Lập Trình Cơ Bản

    i=06 1 4 5 0 8 … … … …

    i=16 1 4 5 0 8 … … … …

    i=26 1 4 5 0 8 … … … …

    i=36 1 4 5 0 8 … … … …

    i=46 1 4 5 0 8 … … … …

    i=56 1 4 5 0 8 … … … …

    6 1 4 5 0 8 … … … …

    ?2

    ?2

    ?2

    ?2

    ?2

    ?2

    false2

    6 1 4 5 0 8 … … … …2

  • Bắt đầu từ đầu mảng, kiểm tra từng phần tử Tìm thấy giá trị, trả về true Hết mảng, không tìm thấy, trả về false

    Tìm Kiếm Giá Trị Trong Mảng

    20Lập Trình Cơ Bản

    bool search(const int mang[],int so_phan_tu,int gia_tri)

    {for (int i = 0; i < so_phan_tu; i++){

    if (mang[i] == gia_tri)return true;

    }return false;

    }

  • Bắt đầu từ đầu mảng, kiểm tra từng phần tử Tìm thấy giá trị, trả về true Hết mảng, không tìm thấy, trả về false

    Tìm Kiếm Giá Trị Trong Mảng

    21Lập Trình Cơ Bản

    bool search(const int mang[],int so_phan_tu,int gia_tri)

    {int i = 0;while (i < so_phan_tu) {

    if (mang[i] == gia_tri) return true;i = i + 1;

    }return false;

    }

  • Bắt đầu từ cuối mảng, kiểm tra từng phần tử

    Tìm thấy giá trị, trả về chỉ số phần tử Hết mảng, không tìm thấy, trả về -1

    Tìm Kiếm Giá Trị Trong Mảng

    22Lập Trình Cơ Bản

    i=56 1 4 5 0 8 … … … …

    i=46 1 4 5 0 8 … … … …

    i=36 1 4 5 0 8 … … … …

    i=26 1 4 5 0 8 … … … …

    i=16 1 4 5 0 8 … … … …

    ?1

    ?1

    ?1

    ?1

    i=11

    6 1 4 5 0 8 … … … …1

  • Tìm Kiếm Giá Trị Trong Mảng

    23Lập Trình Cơ Bản

    i=56 1 4 5 0 8 … … … …

    i=46 1 4 5 0 8 … … … …

    i=36 1 4 5 0 8 … … … …

    i=26 1 4 5 0 8 … … … …

    i=16 1 4 5 0 8 … … … …

    i=06 1 4 5 0 8 … … … …

    6 1 4 5 0 8 … … … …

    ?2

    ?2

    ?2

    ?2

    ?2

    ?2

    i=-12

    6 1 4 5 0 8 … … … …2

  • Bắt đầu từ cuối mảng, kiểm tra từng phần tử

    Tìm thấy giá trị, trả về chỉ số phần tử Hết mảng, không tìm thấy, trả về -1

    Tìm Kiếm Giá Trị Trong Mảng

    24Lập Trình Cơ Bản

    int search(const int mang[],int so_phan_tu,int gia_tri)

    {for (int i = so_phan_tu - 1; i >= 0; i--){

    if (mang[i] == gia_tri)return i;

    }return -1;

    }

  • Bắt đầu từ cuối mảng, kiểm tra từng phần tử

    Tìm thấy giá trị, trả về chỉ số phần tử Hết mảng, không tìm thấy, trả về -1

    Tìm Kiếm Giá Trị Trong Mảng

    25Lập Trình Cơ Bản

    int search(const int mang[],int so_phan_tu,int gia_tri)

    {int i = so_phan_tu - 1;while (i >= 0) {

    if (mang[i] == gia_tri) return i;i = i - 1;

    }return -1;

    }

  • Sử dụng iMin đánh dấu chỉ sổ phần tử nhỏ nhất Trả về iMin, chỉ số của phần tử nhỏ nhất

    Tìm Kiếm Giá Trị Nhỏ Nhất Trong Mảng

    26Lập Trình Cơ Bản

    i=06 1 4 5 0 8 … … … …

    i=16 1 4 5 0 8 … … … …

    i=26 1 4 5 0 8 … … … …

    i=36 1 4 5 0 8 … … … …

    i=46 1 4 5 0 8 … … … …

    i=56 1 4 5 0 8 … … … …

    iMin=06

    iMin=11

    iMin=11

    iMin=11

    iMin=40

    iMin=40

  • Sử dụng iMin đánh dấu chỉ sổ phần tử nhỏ nhất Trả về iMin, chỉ số của phần tử nhỏ nhất

    Bắt đầu từ đầu mảng, duyệt từng phần tử

    Tìm Kiếm Giá Trị Nhỏ Nhất Trong Mảng

    27Lập Trình Cơ Bản

    int searchMin(const int mang[],int so_phan_tu)

    {int iMin = 0;for (int i = 0; i < so_phan_tu; i++){

    if (mang[i] < mang[iMin]) iMin = i;

    }return iMin;

    }

  • Sử dụng iMin đánh dấu chỉ sổ phần tử nhỏ nhất Trả về iMin, chỉ số của phần tử nhỏ nhất

    Bắt đầu từ đầu mảng, duyệt từng phần tử

    Tìm Kiếm Giá Trị Nhỏ Nhất Trong Mảng

    28Lập Trình Cơ Bản

    int searchMin(const int mang[],int so_phan_tu)

    {int iMin = 0; int i = 0; while (i < so_phan_tu){

    if (mang[i] < mang[iMin]) iMin = i;i = i + 1;

    } return iMin;

    }

  • Sử dụng iMax đánh dấu chỉ sổ phần tử lớn nhất Trả về iMax, chỉ số của phần tử lớn nhất

    Tìm Kiếm Giá Trị Lớn Nhất Trong Mảng

    29Lập Trình Cơ Bản

    i=06 1 4 5 0 8 … … … …

    i=16 1 4 5 0 8 … … … …

    i=26 1 4 5 0 8 … … … …

    i=36 1 4 5 0 8 … … … …

    i=46 1 4 5 0 8 … … … …

    i=56 1 4 5 0 8 … … … …

    iMax=06

    iMax=06

    iMax=06

    iMax=06

    iMax=06

    iMax=58

  • Sử dụng iMax đánh dấu chỉ sổ phần tử lớn nhất Trả về iMax, chỉ số của phần tử lớn nhất

    Bắt đầu từ đầu mảng, duyệt từng phần tử

    Tìm Kiếm Giá Trị Lớn Nhất Trong Mảng

    30Lập Trình Cơ Bản

    int searchMax(const int mang[],int so_phan_tu)

    {int iMax = 0;for (int i = 0; i < so_phan_tu; i++){

    if (mang[i] > mang[iMax]) iMax = i;

    }return iMax;

    }

  • Sử dụng iMax đánh dấu chỉ sổ phần tử lớn nhất Trả về iMax, chỉ số của phần tử lớn nhất

    Bắt đầu từ đầu mảng, duyệt từng phần tử

    Tìm Kiếm Giá Trị Lớn Nhất Trong Mảng

    31Lập Trình Cơ Bản

    int searchMax(const int mang[],int so_phan_tu)

    {int iMax = 0; int i = 0; while (i < so_phan_tu){

    if (mang[i] > mang[iMax]) iMax = i;i = i + 1;

    } return iMax;

    }

  • Sắp Xếp Lựa Chọn

    32Lập Trình Cơ Bản

    6 1 4 5 0 8 2 7 3 9

    6 1 4 5 0 8 2 7 3 9

    6 1 4 5 0 3 2 7 8 9

    6 1 4 5 0 3 2 7 8 9

    2 1 4 5 0 3 6 7 8 9

    2 1 4 3 0 5 6 7 8 9

    2 1 0 3 4 5 6 7 8 9

    2 1 0 3 4 5 6 7 8 9

    0 1 2 3 4 5 6 7 8 9

    0 1 2 3 4 5 6 7 8 9

    6 1 4 5 0 8 2 7 3 9

    0 1 2 3 4 5 6 7 8 9

  • Sắp Xếp Lựa Chọn

    33

    Coi mảng là 2 phần: Phần sau: các phần tử đã được sắp xếp đúng chỗ

    Phần đầu: các phần tử còn lại cần được sắp xếp

    Một chỉ số để xác định điểm phân cách 2 mảng

    Thân vòng lặp Tìm phần tử lớn nhất trong mảng chưa sắp xếp

    Đổi chỗ xuống cuối mảng chưa sắp xếp

    Dừng vòng lặp Khi mảng chưa sắp xếp còn 1 phần tử

    Lập Trình Cơ Bản

  • Sắp Xếp Lựa Chọn

    34Lập Trình Cơ Bản

    i j

    i j

    i j

    i j

    i j

    i j

    i j

    i j

    i j

    6 1 4 5 0 8 2 7 3 9

    0 1 2 3 4 5 6 7 8 9

  • Sắp xếp mảng tăng dần Tìm phần tử lớn nhất, đổi xuống cuối

    Sắp Xếp Lựa Chọn

    35Lập Trình Cơ Bản

    void sapXepLuaChon(int mang[], int so_phan_tu){

    for (int j = so_phan_tu – 1; j > 0; j--){

    // int iMax = searchMax(mang, j + 1);int iMax = 0;for (int i = 0; i mang[iMax]) iMax = i;int tmp = mang[j];mang[j] = mang[iMax];mang[iMax] = tmp;

    }}

  • Sắp Xếp Lựa Chọn

    36Lập Trình Cơ Bản

    6 1 4 5 0 8 2 7 3 9

    6 1 4 5 9 8 2 7 3 0

    6 3 4 5 9 8 2 7 1 0

    6 3 4 5 9 8 7 2 1 0

    6 7 4 5 9 8 3 2 1 0

    6 7 8 5 9 4 3 2 1 0

    6 7 8 9 5 4 3 2 1 0

    9 7 8 6 5 4 3 2 1 0

    9 8 7 6 5 4 3 2 1 0

    9 8 7 6 5 4 3 2 1 0

    6 1 4 5 0 8 2 7 3 9

    9 8 7 6 5 4 3 2 1 0

  • Sắp xếp mảng giảm dần Tìm phần tử nhỏ nhất, đổi xuống cuối

    Sắp Xếp Lựa Chọn

    37Lập Trình Cơ Bản

    void sapXepLuaChon(int mang[], int so_phan_tu){

    for (int j = so_phan_tu – 1; j > 0; j--){

    // int iMin = searchMin(mang, j + 1);int iMin = 0;for (int i = 0; i

  • Thêm & Loại Dữ Liệu

    38

    Đặt vấn đề: Sinh viên đăng ký lớp môn học

    Sinh viên lần lượt đăng ký (thêm vào danh sách)

    Sinh viên rút khỏi lớp môn học (loại khỏi danh sách)

    Kích thước của danh sách lớp môn học ban đầu

    Số lượng sinh viên thực sự của lớp môn học

    Lập Trình Cơ Bản

  • Thêm & Loại Dữ Liệu

    39

    Thêm hay loại dữ liệu trong mảng làm thay đổisố phần tử mảng, không thay đổi kích thước Biến số quản lý số phần tử thực sự của mảng Biến số này trong khoảng chỉ số hợp lệ của mảng Chương trình phải quản lý biến số này

    Thêm dữ liệu Tăng số phần tử mảng Phải kiểm tra mảng có đầy hay không

    Loại dữ liệu Giảm số phần tử mảng Phải kiểm tra phần tử có trong mảng hay không

    Lập Trình Cơ Bản

  • Thêm vào cuối cùng, sau phần tử cuối cùng Nếu mảng chưa đầy, thêm được, trả về true

    Tăng biến quản lý số phần tử thực sự

    Thêm Dữ Liệu – Mảng Chưa Sắp Xếp

    40Lập Trình Cơ Bản

    6 1 4 5 0 8 … … … …

    i=66 1 4 5 0 8 2 … … …

    6 1 4 5 0 8 2 … … …

    2

    2

    2

  • Thêm vào cuối cùng, sau phần tử cuối cùng Nếu mảng chưa đầy, thêm được, trả về true

    Tăng biến quản lý số phần tử thực sự

    Thêm Dữ Liệu – Mảng Chưa Sắp Xếp

    41Lập Trình Cơ Bản

    bool insert(int a[], int & soPT, int gia_tri){

    if (soPT < SO_SINH_VIEN){

    a[soPT] = gia_tri;soPT++;return true;

    }return false;

    }

  • Phần tử bị loại có chỉ số là index (cần phải tìm trước)

    Đổi chỗ phần tử này với phần tử cuối cùng

    Giảm biến quản lý số phần tử thực sự

    Loại Dữ Liệu – Mảng Chưa Sắp Xếp

    42Lập Trình Cơ Bản

    6 1 4 5 0 8 … … … …

    i=56 1 4 5 0 8 … … … …

    i=46 1 4 5 0 8 … … … …

    i=36 1 4 5 0 8 … … … …

    6 1 4 8 0 5 … … … …

    6 1 4 8 0 … … … … …

    5

    5

    5

    5

    5

    5

  • Phần tử bị loại có chỉ số là index (cần phải tìm trước)

    Đổi chỗ phần tử này với phần tử cuối cùng

    Giảm biến quản lý số phần tử thực sự

    Loại Dữ Liệu – Mảng Chưa Sắp Xếp

    43Lập Trình Cơ Bản

    bool delete(int a[], int & soPT, int gia_tri) {int index = search(a, soPT, gia_tri);if (index != -1) {

    int tmp = mang[soPT - 1];mang[soPT - 1] = mang[index];mang[index] = tmp;soPT--;return true;

    }return false;

    }

  • Tìm vị trí thêm, từ đó lùi các phần tự ra sau một chỉ số

    Tăng biến quản lý số phần tử thực sự

    Thêm Dữ Liệu – Mảng Đã Sắp Xếp

    44Lập Trình Cơ Bản

    0 1 4 5 6 8 … … … …

    i=50 1 4 5 6 8 8 … … …

    i=40 1 4 5 6 6 8 … … …

    i=30 1 4 5 5 6 8 … … …

    i=20 1 4 4 5 6 8 … … …

    i=10 1 2 4 5 6 8 … … …

    2

    2

    2

    2

    2

    2

  • Tìm vị trí thêm, từ đó lùi các phần tự ra sau một chỉ số

    Tăng biến quản lý số phần tử thực sự

    Thêm Dữ Liệu – Mảng Đã Sắp Xếp

    45Lập Trình Cơ Bản

    bool insert(int a[], int & soPT, int gia_tri) {if (soPT < SO_SINH_VIEN) {

    int index = soPT – 1;while (gia_tri < a[index]) {

    a[index + 1] = a[index];index--;

    }a[index + 1] = gia_tri;soPT++;return true;

    }return false;

    }

  • Tìm vị trí phần tử để loại

    Từ vị trí đó đồn các phần tự lên trước một chỉ số

    Giảm biến quản lý số phần tử thực sự

    Loại Dữ Liệu – Mảng Đã Sắp Xếp

    46Lập Trình Cơ Bản

    0 1 4 5 6 8 … … … …

    i=50 1 4 5 6 8 … … … …

    i=40 1 4 5 6 8 … … … …

    i=30 1 4 5 6 8 … … … …

    i=30 1 4 6 6 8 … … … …

    i=40 1 2 6 8 … … … … …

    5

    5

    5

    5

    5

    5

  • Tìm vị trí phần tử để loại

    Từ vị trí đó đồn các phần tự lên trước một chỉ số

    Giảm biến quản lý số phần tử thực sự

    Loại Dữ Liệu – Mảng Đã Sắp Xếp

    47Lập Trình Cơ Bản

    bool delete(int a[], int & soPT, int gia_tri){

    int index = search(a, soPT, gia_tri);if (index != -1) {

    for (int i = index; i < soPT - 1; i++)a[i] = a[i + 1];

    soPT--;return true;

    }return false;

    }

  • Mảng Nhiều Chiều

    48Lập Trình Cơ Bản

    O

    X

    X O

    O X X X X O

    O O X

    X O O O O X

    mang[0]

    mang[1]

    mang[2]

    mang[3]

    mang[4]

    mang[5]

    mang[6]

    mang[7]

    mang[8]

    mang[9]

  • Noughts & Crosses – Tic Tac Toe

    49

    Khởi tạo bàn chơi In bàn chơi Kiểm tra ô có được phép không Chọn ô chơi ngẫu nhiên Kiểm tra có ai thắng chưa Chọn ô có thể được chơi

    Lập Trình Cơ Bản

  • Noughts & Crosses – Tic Tac Toe

    50Lập Trình Cơ Bản

    void initBoard(char board[][COL], int ROW) {for (int _row = 0; _row < ROW; _row++)

    for (int _col = 0; _col < COL; _col ++)board[_row][_col] = ' ';

    }

    void printBoard(char board[][COL], int ROW) {for (int _row = 0; _row < ROW; _row++)

    for (int _col = 0; _col < COL; _col++)cout

  • Noughts & Crosses – Tic Tac Toe

    51Lập Trình Cơ Bản

    int main(){

    char board[ROW][COL];initBoard(board);printBoard(board);int _row, _col;char player = O_PLAYER;do {

    _row = rand() % ROW;// _col = rand() % COL;// play(board, _row, _col, player);system("CLS");// printBoard(board);

    } while (true);return 0;

    }