1.Mảng là gì?

Mảng hay còn thường được gọi là array là một loại cấu trúc dữ liệu có thể lưu trữ một tập hợp các phần tử tuần tự có kích thước cố định cùng loại với nhau.

Thay vì khai báo nhiều biến số để chứa dữ liệu thì ta có thể sử dụng mảng để khai báo và đặt dữ liệu vào trong mảng.

Ví dụ ta có thể tạo một mảng chứa các số từ 0 đến 9 thay vì khai báo các biến riêng lẻ chứa các giá trị từ 0 đến 9:

  • Khai báo các biến riêng lẻ:
int mot = 1;
int hai = 2;
int ba = 3;
…..
int chin = 9
  • Sử dụng mảng để chứa các số từ 0 đến 9

int number[10];

0 1 2 3 4 5 6 7 8 9

2.Khai báo và sử dụng mảng

2.1 Khai báo mảng

Ta khai báo một mảng trong C như sau:

type Name [ Size ];

Trong đó:

  • Type: là kiểu dữ liệu mà mảng được quy định lưu trữ ở mỗi phần tử
  • Name: là tên mảng
  • [Size]: là kích cỡ của mảng (hay còn gọi là số lượng phần từ mà mảng có thể được lưu trữ)

Ví dụ tôi khai báo mảng có kiểu dữ liệu int, có tên là number và có tối đa 10 phần tử:

#include <stdio.h>
int main(){
    int number[10];
    return 0;
}

Khai báo và gắn trực tiếp giá trị vào mảng như sau:

type Name [Size] = {giatri1, giatri2, giatri3,…. giatri_N}

Trong đó:

  • Type là kiểu dữ liệu mà mảng quy định lưu trữ ở mỗi phần tử
  • Name là tên mảng
  • [Size] là kích cỡ của mảng
  • giatri1, giatri2, giatri3…. Giatri_N là các phần tử được khai trong quá trình khởi tạo mảnh

Ví dụ tôi khai báo mảng có kiểu dữ liệu int, có tên là number có tối đa 10 phần tử và phần tử trong mảng của tôi là các số từ 0 đến 9

#include <stdio.h>
int main(){
    int number[10] = {0,1,2,3,4,5,6,7,8,9};
    printf("%d",number[0]);
    printf("%d",number[1]);
    printf("%d",number[2]);
    printf("%d",number[3]);
    printf("%d",number[4]);
    printf("%d",number[5]);
    printf("%d",number[6]);
    printf("%d",number[7]);
    printf("%d",number[8]);
    printf("%d",number[9]);
    return 0;
}
0123456789

2.2 Sử dụng mảng

Truy cập một giá trị trong mảng

Name[index];

Trong đó:

  • Name là tên mảng chứa giá trị cần truy cập
  • Index là chỉ số của giá trị đó trong mảng

Lưu ý: Các phần tử trong mảng có chỉ số bắt đầu từ 0

Ví dụ tôi có một mảng có tên là number và tôi muốn truy cập vào để lấy giá trị số 7 có trong mảng:

#include <stdio.h>
int main(){
    int number[10] = {1,2,3,4,5,6,7,8,9,10};
    printf("%d",number[6]);
    return 0;
}

Tại sao lại truy cập ở number[6] mà không phải number[7]?

Vì các phần tử trong mảng có chỉ số bắt đầu từ 0 và số 7 nằm ở chỉ số 6 trong mảng, tôi sẽ biểu diễn lại mảng và index của các phẩn tử có trong mảng trên như sau:

Giá trị các phẩn tử của mảng

1 2 3 4 5 6 7 8 9 10

Index của các giá trị trên là:

0 1 2 3 4 5 6 7 8 9

Ví dụ ta muốn lấy giá trị số 10 và số 1 trong mảng:

number[9];

number[0];

Ở trên ta đã có thể truy cập vào phần tử của mảng rồi khi truy cập vào phần tử đó ta có thể gán giá trị cho chúng bằng cách:

Name[index] = giatri;

Trong đó:

  • Name là tên mảng chứa giá trị cần truy cập
  • Index là chỉ số của giá trị đó trong mảng
  • giatri là giá trị cần gán vào trong mảng ở index đó

Tôi có mảng ban đầu:

#include <stdio.h>
int main(){
    int number[10];
    return 0;
}

Tôi gán cho mảng trên với một số phần tử như sau:

#include <stdio.h>
int main(){
    int number[10];
    number[0] = 1;
    number[6] = 7;
    number[9] = 10;
    
    printf("%d ",number[0]);
    printf("%d ",number[6]);
    printf("%d ",number[9]);
    return 0;
}
1 7 10

Giải thích: Tại index 0 gán mảng với giá trị 1, index 6 gán giá trị 7, index 9 gán giá trị 10

Thay thế một giá trị nào đó có sẵn trong mảng:

Cũng giống như gán các giá trị cho mảng, để thay thế giá trị của mảng bằng giá trị khác ta cũng làm tương tự cách gán giá trị cho mảng

Name[index] = giatri;

Tôi có mảng ban đầu:

#include <stdio.h>
int main(){
    int number[10] = {1,2,3,4,5,6,7,8,9,10};
    printf("%d",number[6]);
    return 0;
}

Tôi muốn thay thế giá trị 1,7,10 trong mảng bằng các giá trị 0,6,9 thì tôi sẽ thực hiện:

#include <stdio.h>
int main(){
    int number[10] = {1,2,3,4,5,6,7,8,9,10};
    printf("Mang ban dau la: ");
    printf("%d",number[0]);
    printf("%d",number[1]);
    printf("%d",number[2]);
    printf("%d",number[3]);
    printf("%d",number[4]);
    printf("%d",number[5]);
    printf("%d",number[6]);
    printf("%d",number[7]);
    printf("%d",number[8]);
    printf("%d",number[9]);

    number[0] = 0;
    number[6] = 6;
    number[9] = 9;
    printf("\nMang sau khi duoc thay the la: ");
    printf("%d",number[0]);
    printf("%d",number[1]);
    printf("%d",number[2]);
    printf("%d",number[3]);
    printf("%d",number[4]);
    printf("%d",number[5]);
    printf("%d",number[6]);
    printf("%d",number[7]);
    printf("%d",number[8]);
    printf("%d",number[9]);
    return 0;
}
Mang ban dau la: 12345678910

Mang sau khi duoc thay the la: 0234566899

Các phần tử 1,7,10 đã được thay thể bằng các phẩn tử 0,6,9

Như vậy để thay thế một giá trị của mảng ta cần phải biết được chỉ số của giá trị đó.

2.3 Duyệt mảng bằng vòng lặp

Ở trên ta đã thực hiện lấy và in ra giá trị phần tử trong mảng bằng cách lặp lại các câu lệnh printf()

Tuy nhiên nếu mảng của ta chứa nhiều giá trị thì việc dùng printf() in ra cho từng giá trị là rất tốn thời gian, vậy nên ta có một cách để in ra các giá trị có trong mảng nhờ vào sử dụng vòng lặp

Ví dụ tôi sẽ in ra màn hình tất cả phần tử có trong mảng number dưới đây

#include <stdio.h>
int main(){
    int number[10] = {1,2,3,4,5,6,7,8,9,10};
    for (int i = 0; i < 10; i++ ) {
        printf("Gia tri cua number[%d] = %d\n", i, number[i]);
    }
    return 0;
}
Gia tri cua number[0] = 1

Gia tri cua number[1] = 2

Gia tri cua number[2] = 3

Gia tri cua number[3] = 4

Gia tri cua number[4] = 5

Gia tri cua number[5] = 6

Gia tri cua number[6] = 7

Gia tri cua number[7] = 8

Gia tri cua number[8] = 9

Gia tri cua number[9] = 10

Giải thích:

Ta bắt đầu giá trị lặp từ 0 (bẳng với chỉ số của mảng), điều kiện lặp là nhỏ hơn 10 vì mảng có 10 phần tử tuy nhiên index của các phần tử chỉ đến 9

Qua mỗi lần lặp ta lại tăng biến đếm lên 1 đơn vị và in ra màn hình giá trị của mảng tại vị trí thứ i

Giả sử i = 1 thì tương đương với:

printf("Gia tri cua number[%d] = %d\n", 1, number[1] );

i = 2 thì tương đương với:

printf("Gia tri cua number[%d] = %d\n", 2, number[2] );

Và cứ như vậy đến i = 9 (chỉ số cuối cùng trong mảng) ta sẽ in được ra tất cả phần tử có trong mảng.

Trong trường hợp ta chỉ muốn lấy một khoảng giá trị nào đó có trong mảng ta sẽ thay đổi điều kiện lặp của vòng lặp

Ví dụ tôi muốn lấy các phần tử có index từ 0 -> 5

#include <stdio.h>
int main(){
    int number[10] = {1,2,3,4,5,6,7,8,9,10};
    for (int i = 0; i < 6; i++ ) {
        printf("Gia tri cua number[%d] = %d\n", i, number[i]);
    }
    return 0;
}
Gia tri cua number[0] = 1

Gia tri cua number[1] = 2

Gia tri cua number[2] = 3

Gia tri cua number[3] = 4

Gia tri cua number[4] = 5

Gia tri cua number[5] = 6

Hay tôi muốn lấy các phần tử có index từ 5->9, tôi sửa lại biến i bắt đầu bằng 5 và biến i kết thúc nhỏ hơn 10

#include <stdio.h>
int main(){
    int number[10] = {1,2,3,4,5,6,7,8,9,10};
    for (int i = 5; i < 10; i++ ) {
        printf("Gia tri cua number[%d] = %d\n", i, number[i]);
    }
    return 0;
}
Gia tri cua number[5] = 6

Gia tri cua number[6] = 7

Gia tri cua number[7] = 8

Gia tri cua number[8] = 9

Gia tri cua number[9] = 10