Số phần tử của mảng một chiều là bao nhiêu năm 2024

Như ta đã biết, một biến đơn bình thường chỉ có thể lưu được một giá trị. Khi cần lưu trữ nhiều giá trị, ta có thể khai báo nhiều biến. Nhưng nếu quá nhiều biến, bạn sẽ gặp rắc rối với việc quản lí chúng đấy, và chương trình sẽ trở nên cực kì “cồng kềnh”. Để giải quyết vấn đề này, ngôn ngữ C/C++ cung cấp cho chúng ta một giải pháp, đó là mảng. Và bài viết hôm nay mình sẽ trình bày về mảng một chiều.

1. Khái niệm mảng

– Mảng là một tập hợp các phần tử có cùng kiểu dữ liệu, mỗi phần tử của mảng tương đương với một biến đơn, các phần tử được phân biệt bởi các chỉ số.

– Kiểu dữ liệu của mảng cũng là kiểu dữ liệu của các phần tử trong mảng, đó có thể là các kiểu được định nghĩa sẵn hoặc do người dùng tự định nghĩa.

Mảng một chiều được xem như một dãy các số có cùng kiểu dữ liệu.

  1. Khai báo mảng một chiều

– Cú pháp:

[] = {};

– Trong đó:

• Số phần tử tối đa phải là một hằng số, và người lập trình cần phải ước lượng được số phần tử cần dùng để khai báo mảng cho phù hợp.

• Các giá trị là những giá trị khởi tạo của mảng (có thể không có), viết cách nhau bởi dấu phẩy.

– Khi khai báo một mảng, chương trình sẽ cấp một vùng nhớ liên tiếp trong RAM để chứa đủ tất cả các phần tử của mảng.

  1. Một số ví dụ về khai báo mảng

Ví dụ 1:

int a1[3] = {1, 2, 3}; //tương đương dãy số a1 có 3 phần tử: 1, 2, 3. Đây là cách khai báo đầy đủ như cú pháp. Sau khi khai báo, ta có một mảng tương đương một dãy số gồm 3 phần tử.

Ví dụ 2:

int a2[5] = {1, 2}; //tương đương dãy số a2 gồm 5 phần tử: 1, 2, 0, 0, 0.

Với cách khai báo này, những phần tử đầu tiên sẽ nhận các giá trị trong cặp ngoặc nhọn { }. Các phần tử còn lại được tự động cập nhật giá trị 0.

Ví dụ 3:

int a3[5]; //tương đương dãy số a3 gồm 5 phần tử đều mang giá trị rác. Nếu khai báo không khởi tạo, tất cả phần tử đều mang giá trị rác.

Trong 3 ví dụ trên, số phần tử tối đa phải luôn được xác định để chương trình có thể cấp vùng nhớ phù hợp cho mảng.

Ví dụ 4:

int a4[] = {1, 2, 3, 4, 5}; //tương đương dãy số a4 gồm 5 phần tử: 1, 2, 3, 4, 5. Với cách khai báo này, số phần tử tối đa được ngầm định bằng với số phần tử khởi tạo trong cặp ngoặc nhọn { } do đó có thể bỏ qua.

– Để biết được số phần tử tối đa của một mảng, ta có thể dùng toán tử lấy kích thước kiểu sizeof.

Số phần tử tối đa: N = sizeof() / sizeof();

  1. Truy xuất các phần tử của mảng

– Trong mảng một chiều N phẩn tử, các phần tử được đánh số từ 0 đến N-1.

– Cú pháp truy xuất đến phần tử thứ i trong mảng:

[]

Với ví dụ 1 ở trên, ta sẽ có: a1[0] = 1, a1[1] = 2, a1[2] = 3.

– Thông thường, ta sẽ sử dụng vòng lặp để duyệt các phần tử của mảng, như vậy sẽ tận dụng được tối đa sự thuận tiện của việc dùng mảng so với dùng các biến đơn độc lập nhau.

  1. Truyền mảng vào hàm

Việc truyền một tham số là mảng cũng tương tự như truyền tham số là một biến bình thường.

void doSth(int a[100], int size); hoặc có thể bỏ qua số phần tử tối đa của mảng:

void doSth(int a[], int size); Lưu ý: đối với mảng, dù ta không truyền tham chiếu, nhưng các phần tử của mảng vẫn sẽ bị thay đổi theo tác động của hàm.

- Tên mảng: đây là một cái tên đặt đúng theo quy tắc đặt tên của danh biểu. Tên này cũng mang ý nghĩa là tên biến mảng.

- Số phần tử: là một hằng số nguyên, cho biết số lượng phần tử tối đa trong mảng là bao nhiêu (hay nói khác đi kích thước của mảng là gì).

- Kiểu: mỗi phần tử của mảng có dữ liệu thuộc kiểu gì.

- Ở đây, ta khai báo một biến mảng gồm có số phần tử phần tử, phần tử thứ nhất là tên mảng [0], phần tử cuối cùng là tên mảng[số phần tử -1]

Ví dụ:

int a[10]; /* Khai báo biến mảng tên a, phần tử thứ nhất là a[0], phần tử cuối cùng là a[9].*/

Ta có thể coi mảng a là một dãy liên tiếp các phần tử trong bộ nhớ như sau:

Vị trí 0 1 2 3 4 5 6 7 8 9 Tên phần tử a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]

Hình ảnh mảng a trong bộ nhớ

Khai báo mảng với số phần tử không xác định (khai báo không tường minh)

Cú pháp: <[]>

Khi khai báo, không cho biết rõ số phần tử của mảng, kiểu khai báo này thường được áp dụng trong các trường hợp: vừa khai báo vừa gán giá trị, khai báo mảng là tham số hình thức của hàm.

  1. Vừa khai báo vừa gán giá trị

Cú pháp:

[]= {Các giá trị cách nhau bởi dấu phẩy}

Nếu vừa khai báo vừa gán giá trị thì mặc nhiên C sẽ hiểu số phần tử của mảng là số giá trị mà chúng ta gán cho mảng trong cặp dấu {}. Chúng ta có thể sử dụng hàm sizeof() để lấy số phần tử của mảng như sau:

Số phần tử=sizeof(tên mảng)/ sizeof(kiểu)

b.Khai báo mảng là tham số hình thức của hàm, trong trường hợp này ta không cần chỉ định số phần tử của mảng là bao nhiêu.

Truy xuất từng phần tử của mảng

Mỗi phần tử của mảng được truy xuất thông qua Tên biến mảng theo sau là chỉ số nằm trong cặp dấu ngoặc vuông [ ]. Chẳng hạn a[0] là phần tử đầu tiên của mảng a được khai báo ở trên. Chỉ số của phần tử mảng là một biểu thức mà giá trị là kiểu số nguyên.

Với cách truy xuất theo kiểu này, Tên biến mảng[Chỉ số] có thể coi như là một biến có kiểu dữ liệu là kiểu được chỉ ra trong khai báo biến mảng.

Ví dụ 1:

int a[10];

Trong khai báo này, việc truy xuất các phần tử được chỉ ra trong hình 1. Chẳng hạn phần tử thứ 2 (có vị trí 1) là a[1]…

Ví dụ 2: Vừa khai báo vừa gán trị cho 1 mảng 1 chiều các số nguyên. In mảng số nguyên này lên màn hình.

Giả sử ta đã biết số phần tử của mảng là n; việc hiển thị 1 giá trị số nguyên lên màn hình ta cần sử dụng hàm printf() với định dạng %d, tổng quát hóa lên nếu muốn hiển thị lên màn hình giá trị của n số nguyên, ta cần gọi hàm printf() đúng n lần. Như vậy trong trường hợp này ta sử dụng 1 vòng lặp để in ra giá trị các phần tử.

Ta có đoạn chương trình sau:

include

include

int main()

{

int n,i,j,tam;

int dayso[]={66,65,69,68,67,70};

clrscr();

n=sizeof(dayso)/sizeof(int); /*Lấy số phần tử*/

printf("\n Noi dung cua mang ");

for (i=0;i

printf("%d ",dayso[i]);

return 0;

}

Ví dụ 3: Đổi một số nguyên dương thập phân thành số nhị phân. Việc chuyển đổi này được thực hiện bằng cách lấy số đó chia liên tiếp cho 2 cho tới khi bằng 0 và lấy các số dư theo chiều ngược lại để tạo thành số nhị phân. Ta sẽ dùng mảng một chiều để lưu lại các số dư đó. Chương trình cụ thể như sau:

include

include

int main()

{

unsigned int N;

unsigned int Du;

unsigned int NhiPhan[20],K=0,i;

printf("Nhap vao so nguyen N= ");scanf("%d",&N);

do

{

Du=N % 2;

NhiPhan[K]=Du; /* Lưu số dư vào mảng ở vị trí K*/

K++; /* Tăng K lên để lần kế lưu vào vị trí kế*/

N = N/2;

} while(N>0);

printf("Dang nhi phan la: ");

for(i=K-1;i>=0;i--)

printf("%d",NhiPhan[i]);

getch();

return 0;

}

Ví dụ 4: Nhập vào một dãy n số và sắp xếp các số theo thứ tự tăng. Đây là một bài toán có ứng dụng rộng rãi trong nhiều lĩnh vực. Có rất nhiều giải thuật sắp xếp. Một trong số đó được mô tả như sau:

Đầu tiên đưa phần tử thứ nhất so sánh với các phần tử còn lại, nếu nó lớn hơn một phần tử đang so sánh thì đổi chỗ hai phần tử cho nhau. Sau đó tiếp tục so sánh phần tử thứ hai với các phần tử từ thứ ba trở đi ... cứ tiếp tục như vậy cho đến phần tử thứ n-1.

Chương trình sẽ được chia thành các hàm Nhap (Nhập các số), SapXep (Sắp xếp) và InMang (In các số); các tham số hình thức của các hàm này là 1 mảng không chỉ định rõ số phần tử tối đa, nhưng ta cần có thêm số phần tử thực tế được sử dụng của mảng là bao nhiêu, đây là một giá trị nguyên.