Thứ Tư, 10 tháng 4, 2024

29.Mảng - Array trong C

Quay trở lại với phần Luyện tập, thực hành để có một cái nhìn về những chương trình thực tế. Trong thực tế, nhu cầu của một phần mềm luôn đi đôi với việc lưu trữ và xử lý dữ liệu.


Tưởng tượng một tình huống thực tế:

Tình huống 1:
Chúng ta cần lưu trữ tuổi của tất cả mọi người trong một khu phố, ví dụ có 1.000 người (Nhu cầu thực tế, từ số liệu chúng ta có thể biết tuổi bình quân của khu phố, tuổi lớn nhất của khu phố, tuổi nhỏ nhất, lứa tuổi nào chiếm số đông...). Khoan bàn tới khái niệm mảng, bình thường chúng ta chỉ có duy nhất một cách là tạo ra 1.000 biến khác nhau để lưu trữ, ví dụ:


int tuoi1 = 20;
int tuoi2 = 34;
int tuoi3 = 80;
.....
int tuoi1000 = 18;


Trong trường hợp này, nếu chúng ta sử dụng kiểu dữ liệu mảng 1 chiều thì chúng ta chỉ cần duy nhất một biến, tương tự thế này:


int tuoi[] = {20, 34, 80, 35, 48, 26, 87,....... 80};




Tình huống 2:

Chúng ta cần quản lý một danh sách họ và tên của khoảng 100 sinh viên trong một lớp. Mỗi họ và tên để lưu trữ ta cần một biến kiểu chuỗi, như vậy 100 họ và tên thì cần khai báo 100 biến kiểu chuỗi.
Ví dụ (tạm thời chúng ta chưa bàn tới chuỗi, bạn không cần quá quan tâm đến lệnh khai báo chuỗi,  chỉ là ví dụ mà thôi)

char ten1[] = "Nguyễn Văn A"
char ten2[] = "Trần Văn B"
char ten3[] = "Lê Thị C"
char ten4[] = "Phùng Văn D"
.....
char ten100[] = "Phạm Thị X"


Nếu khai báo như thế này thì đoạn khai báo cũng như các thao tác trên các họ tên sẽ rất dài dòng và rắc rối.
Trong trường hợp này, kiểu dữ liệu mảng sẽ giúp chúng ta. Hình dung rằng chỉ cần khai báo một biến, biến này có thể coi như là tương đương với 100 biến chuỗi ký tự; đó là 1 mảng mà các phần tử của nó là chuỗi ký tự. Đại khái ví dụ ta sẽ có biến hoVaTen, thì "hình hài" của biến sẽ tương tự thế này:

 char* hoVaTen[100];

 

Rất dễ dàng lưu trữ và truy cập.


Tóm lại:

Định nghĩa : Mảng 1 chiều là cấu trúc dữ liệu (data structure) dùng để lưu trữ nhiều phần tử có cùng kiểu dữ liệu, các phần tử trong mảng được lưu trữ tại các ô nhớ liên tiếp cạnh nhau trong bộ nhớ
Bằng cách sử dụng mảng, bạn có thể truy cập các phần tử một cách dễ dàng với chỉ vài dòng code.

Khai Báo Mảng :

Cú pháp : Kiểu_Dữ_Liệu Tên_mảng[Số_Lượng_Phần_Tử];


Ví dụ :
int a[100]; //    Khai báo mảng chứa các số nguyên int tối đa 100 phần tử. Kiểu_Dữ_Liệu là int, Tên_mảng là a, Số_Lượng_Phần_Tử là 100.

Lưu ý:

  • Bất lợi của mảng trong C. Kích thước của mảng trong C phải được định nghĩa tại thời điểm khai báo, chúng ta không thể lưu số phần tử vượt quá kích thước này.
  • Khai báo mảng như trên (chưa khởi tạo, mảng chưa có phần tử nào) thì các phần tử trong mảng thường là các giá trị không xác định, các giá trị này là ngẫu nhiên. 
  • Khi khai báo mảng thì mảng sẽ chiếm số byte = số lượng phần tử x kích thước của 1 phần tử.
  • Nếu mảng có nhiều phần tử nhưng chúng ta chỉ khởi tạo giá trị cho vài phần tử đầu tiên thì các phần tử không được khởi tạo sẽ có giá trị là 0.

 

Bạn có thể vừa khai báo vừa khởi tạo giá trị cho các phần tử trong mảng như ví dụ biến tuoi trong tình huống 1 ở trên.

Đây là một ví dụ để so sánh :

#include <stdio.h>

int main(){
    //các phần tử của a có giá trị ngẫu nhiên
    int a[1000];
    //các phần tử trong b lần lượt là
2  3  5  41  12  7
    int b[6] = {2, 3, 5, 41, 12, 7};
    return 0;
}

Các Thao Tác Trên Mảng

Duyệt mảng : 

Các phần tử trong mảng được đánh chỉ số tính từ 0, ví dụ mảng của bạn có 100 phần tử thì chỉ số sẽ được đánh số từ 0 tới 99. Tổng quát nếu mảng có N phần tử thì chỉ số sẽ được đánh từ 0 tới N - 1

Để truy cập các phần tử trong mảng thông qua chỉ số ta dùng cú pháp : 

tên_mảng[chỉ_số];

Thông qua chỉ số bạn có thể truy xuất, thay đổi.. giá trị của phần tử trong mảng tại chỉ số tương ứng.

Ví dụ trong mảng tuoi[] ở trên, thì tuoi[0] = 20, tuoi[1] = 34...

Để dễ hình dung, ta sẽ khai báo và khởi tạo một mảng có 10 phần tử, sau đó ta sẽ duyệt từ phần từ 0 đến phần tử 9 và in ra màn hình. Tiếp theo ta duyệt ngược lại từ phần tử 9 đến phần tử 0 và cũng in ra mà hình.

Đây là code, bạn nhập vào IDE Online và chạy thử.

#include <stdio.h>

int main(){
    int n = 10;
    int a[10] = {5, 3, 2, 1, 4, 8, 9, 7, 6, 10};
    for(int i = 0; i < n; i++){
        printf("%d ", a[i]); // In  phần tử 0-9
    }
    printf("\n");
    for(int i = n - 1; i >= 0; i--){
        printf("%d ", a[i]); // In  phần tử 9-0
    }
    return 0;
}

 

Đây là kết quả 

 


 


Thay đổi giá trị trong mảng :

Với một mảng đã khởi tạo giá trị, chúng ta có thể thay đổi giá trị bằng lệnh gán thông thường.

Giữ nguyên ví dụ trên, nếu chúng ta muốn thay đổi phần tử đầu tiên ta chỉ cần gán cho nó giá trị mới.

Đây là code, bạn nhập vào IDE Online và chạy thử. 

#include <stdio.h>

int main(){
    int n = 10;
    int a[10] = {5, 3, 2, 1, 4, 8, 9, 7, 6, 10};

    a[0] = 100;
    for(int i = 0; i < n; i++){
        printf("%d ", a[i]); // In  phần tử 0-9
    }
    printf("\n");
    for(int i = n - 1; i >= 0; i--){
        printf("%d ", a[i]); // In  phần tử 9-0
    }
    return 0;
}

Kết quả:





Nhập mảng từ bàn phím
:

Để nhập mảng từ bàn phím bạn sẽ nhập số lượng phần tử trong mảng trước sau đó nhập từng phần tử trong mảng từ đầu tới cuối
Khi nhập mảng từ bàn phím bạn có thể khai báo mảng có kích thước cố định (1000, 2000, 100...) 

Đây là code, bạn nhập vào IDE Online và chạy thử. Khi nhập số phần tử để chạy thử, bạn nên nhập số nhỏ ví dụ 3 hoặc 4...

#include <stdio.h>

int main(){
    //Lưu ý là mảng a chỉ lưu được tối đa 100 phần tử
    int n, a[100];
    printf("Nhap số phần tử của mảng (n) : ");
    scanf("%d", &n);
    for(int i = 0; i < n; i++){
        printf("Nhap a[%d] : ", i);
        scanf("%d", &a[i]);
    }
    printf("Mảng nhập từ bàn phím : ");
    for(int i = 0; i < n; i++){
        printf("%d ", a[i]);
    }
    return 0;
}

Đây là kết quả 




Phần tiếp theo

 

Phần trước
 

 

 

Không có nhận xét nào:

Đăng nhận xét