Home » Blog lập trình » [Lập trình C/C++] Bài 7 – Mảng 1 chiều – Cấp phát bộ nhớ tĩnh

[Lập trình C/C++] Bài 7 – Mảng 1 chiều – Cấp phát bộ nhớ tĩnh

Một số lưu ý:

Dấu  //  dùng để comment ghi chú, giải thích

Dấu ;   dùng để kết thúc câu lệnh, luôn luôn có nếu không sẽ bị lỗi.

I. ĐẶT VẤN ĐỀ

– Chương trình của chúng ta cần lưu trữ 3 số nguyên ?

==> Khai báo 3 biến số nguyên là a, b, c

– Chương trình của chúng ta cần lưu trữ 10 số nguyên ?

==> Khai báo 10 biến số nguyên là a0, a1, a2, a3, a4, a5, a6, a7, a8, a9

– Chương trình của chúng ta cần lưu trữ 100 số nguyên ?

==> Khai báo 100 biến số nguyên là a0, a1, a2,…..!

– Chương trình của chúng ta – khi người dùng cần lưu trữ n số nguyên ?

==> Không thể nào làm được ! Vậy đâu là cách cho vấn đề này !

 

Nhận xét:

– Đây không phải là ý tưởng hay ????

– Làm sao biết được khi người dùng cần sử dụng bao nhiêu phần tử – biến mà chúng ta khai báo ?

Giải pháp:

– Có 1 cấu trúc có thể đáp ứng tốt việc người dùng nhập vào n số nguyên – đó chính là mảng. Vậy mảng là gì ? Mảng có gì đặc biệt ?

– Mảng dùng khi chúng ta không biết trước số lượng phần tử là bao nhiêu.

II. KHÁI NIỆM – MẢNG

– Mảng là tập hợp 1 dãy các phần tử có cùng kiểu dữ liệu, và luôn luôn nằm liên tục trong bộ nhớ. Chúng ta có thể truy xuất đến vị trí của 1 phần tử bất kì trong mảng thông qua toán tử chỉ số [].

– Từng phần tử của mảng có thể sử dụng như một biến đơn, kiểu của mảng chính là kiểu của các phần tử.

– Mảng cũng như các biến đơn khác trong ngôn ngữ C/C++, trước khi sử dụng nó phải đảm bảo là nó đã được cấp phát trong bộ nhớ và đã sẵn sàng để sử dụng.

 

III.  ĐỊNH NGHĨA MẢNG 1 CHIỀU TĨNH

Cú pháp khai báo mảng tĩnh

Kiểu_mảng   tên_mảng[ số_lượng_phần_tử];

 

Trong đó:
Kiểu_mảng: đây là kiểu của mảng, là tên một kiểu dữ liệu đã tồn tại(các kiểu dữ liệu cơ sở), có thể là kiểu chuẩn hoặc kiểu dữ liệu do người lập trình định nghĩa – struct(khi nào lớn sẽ hiểu).
tên_mảng : là tên của mảng, do người lập trình đặt, theo quy tắc về tên của C/C++.

số_lượng_phần_tử : là hằng (hoặc biểu thức hằng) – define hoặc const, đây là 1 số nguyên dương – luôn luôn là 1 số nguyên dương. Đây chính là số lượng phần tử cấp phát cho mảng khi khai báo.

 

VD_1:

int arr[5];     // khai báo mảng số nguyên tên arr có tối đa 5 phần tử

char str[10];     // khai báo mảng kí tự tên str có tối đa 10 phần tử

Khi gặp (dòng lệnh) khai báo một mảng, chương trình dịch sẽ cấp phát một vùng nhớ(liên tiếp) cho đủ các phần tử liên tiếp của mảng, ví dụ arr[5] sẽ được cấp phát một vùng nhớ có kích thước 5*sizeof(int) =20 byte – hệ điều hành 64bit – sizeof(int) là 4 byte.

 

Lưu ý:

số_lượng_phần_tử  bên trong cặp ngoặc [] phải là một giá trị hằng khi khai báo một mảng tĩnh, vì mảng tĩnh là một khối nhớ tĩnh có kích cỡ xác định và trình biên dịch phải có khả năng xác định xem cần bao nhiêu bộ nhớ để cấp phát cho mảng trước khi các lệnh có thể được thực hiện.

IV. KHỞI TẠO GIÁ TRỊ CÁC PHẦN TỬ CỦA MẢNG

– Có các cách thông dụng khởi tạo giá trị cho các phần tử của mảng như sau:

CÁCH 1 – Khởi tạo giá trị cho mọi phần tử của mảng

int arr[5] = {1, 2, 3, 4, 5};   //  khởi tạo giá trị cho 5 phần tử của mảng

 (Chỉ số)    0                    1                     2                     3                         4      

1 2 3 4 5

 

CÁCH 2 – Khởi tạo giá trị cho 1 số phần tử đầu mảng

int arr[5] = {1, 2, 3};   //  khởi tạo giá trị cho 3 phần tử đầu mảng

(Chỉ số)     0                1                     2                      3                         4   

1 2 3 0 0


CÁCH 3 – Khởi tạo giá trị 0 cho mọi phần tử của mảng

int arr[5] = {0};   //  khởi tạo giá trị 0 cho mọi phần tử của mảng

(Chỉ số)    0                 1                     2                      3                         4   

0 0 0 0 0

 

CÁCH 4 – Tự động xác định số lượng phần tử của mảng

int arr[] = {1, 2, 3, 4, 5};   //  khởi tạo giá trị cho 5 phần tử của mảng – đồng thời tự động xác định số lượng phần tử của mảng thông qua hàm sizeof().

(Chỉ số)    0                   1                     2                      3                            4   

1 2 3 4 5

 

Lưu ý: kích thước của mảng = số lượng phần tử của mảng x độ lớn của 1 phần tử bất kì trong mảng

Để xác định số lượng phần tử của mảng arr ta dựa vào lưu ý trên như sau:

– kích thước mảng arr: sizeof(arr)

– số lượng phần tử của mảng arr: ?

– độ lớn của 1 phần tử bất kì trong mảng: sizeof(arr[0]) – chỉ số 0, 1, 2, 3, 4 gì cũng được.

Như vậy:

số lượng phần tử của mảng arr = kích thước mảng arr / độ lớn của 1 phần tử bất kì trong mảng

<=> số lượng phần tử của mảng arr = sizeof(arr) / sizeof(arr[0]) = 20 / 4 = 5

Hệ điều hành 64bit – int: 4byte

CÁCH 5 – Nhập giá trị cho các phần tử của mảng từ bàn phím

 

V. TRUY XUẤT CÁC PHẦN TỬ CỦA MẢNG

Cú pháp

                          tên_mảng[chỉ_số]

– chỉ_số là số thứ tự của phần tử trong mảng, các phần tử của mảng được đánh chỉ số bắt đầu từ 0 cho đến số_lượng_phần_tử – 1. Với mảng có n phần tử thì các phần tử của nó có chỉ số là 0, 1,..,n-1.

Lưu ý:

Các chương trình dịch của C/C++ không bắt lỗi khi người dùng truy xuất phần tử mảng vượt ra ngoài phạm vi của mảng, tức là có chỉ số nhỏ hơn 0 hoặc lớn hơn số_lượng_phần_tử  – 1. Nhưng khi run chương trình thì sẽ báo lỗi vùng nhớ nếu như vi phạm vượt ra ngoài phạm vi truy xuất của mảng.

VD_2:

int arr[5] = {1, 2, 3, 4, 5};    // khai báo mảng số nguyên tên arr có tối đá 5 phần tử

// truy xuất tất cả các phần tử của mảng arr

arr[0] = 1;

arr[1] = 2;

arr[2] = 3;

arr[3] = 4;

arr[4] = 5;

 

 

BÀI TẬP THỰC HÀNH

Bài 1. Viết chương trình cho phép người dùng nhập vào mảng 1 chiều – với số lượng phần tử mảng n được nhập từ bàn phím. Sau đó xuất tất cả các giá trị có trong mảng.

Code demo

 

Bài 2. Viết chương trình cho phép người dùng nhập vào mảng 1 chiều – với số lượng phần tử mảng n được nhập từ bàn phím.

Yêu cầu:

  1. Tính tổng tất cả các phần tử của mảng
  2. Tính tích tất cả các phần tử của mảng
  3. Xuất tất cả các phần tử là số chẵn
  4. Xuất tất cả các vị trí – chỉ số mà phần tử tại đó là số lẻ

Bài 3. Viết chương trình cho phép người dùng nhập vào mảng 1 chiều – với số lượng phần tử mảng n được nhập từ bàn phím.

Yêu cầu:

  1. Tính tổng tất cả các phần tử là số nguyên tố
  2. Xuất tất cả các phần tử là số chính phương

 

VI. TÍNH CHẤT – BẢN CHẤT CỦA MẢNG 1 CHIỀU – TĨNH

– Mảng 1 chiều là tập hợp 1 dãy các phần tử có cùng kiểu dữ liệu.

– Trong bộ nhớ – mảng là 1 dãy các phần tử nằm liên tục nhau trong bộ nhớ, được đánh vị trí – chỉ số từ 0 —-> số lượng phần tử(n) – 1

– Có thể truy xuất trực tiếp 1 phần tử bất kì trong mảng – một cách dễ dàng thông qua toán tử chỉ số [].

– Mảng tĩnh là mảng có số lượng phần tử không thể thay đổi được( khai báo cố định ngay khi tạo mảng, và không thể thay đổi trong suốt quá trình thao tác).

 

Lời kết luận từ tác giả:

– Đây là tài liệu dùng để học và tham khảo.

– Trong quá trình biên soạn bộ tài liệu có:

+ Tham khảo 1 số nguồn tài liệu(google search, ebook, sách chuyên ngành…).

+ Kiến thức – kinh nghiệm cá nhân của tôi.

– Có thể còn 1 số lỗi sai sót – sẽ luôn cập nhật phiên bản mới.

– Mong nhận được sự đóng góp và phản hồi tích cực từ các bạn đọc. Chân thành cảm ơn.

Link download file PDF: Here

Share
Share
Free WordPress Themes - Download High-quality Templates