- Khai báo, hiển thị mảng 1 chiều, 2 chiều.
Thái độ: Vận dụng tích cực, linh hoạt các kiến thức đã học vào các bài học tiếp theo,
áp dụng viết các chương trình cơ bản.
5.1. Khái niệm và khai báo mảng 5.1.1. Khái niệm về mảng
Một biến (biến đơn) tại một thời điểm chỉ có thể biểu diễn được một giá trị. Vậy
để có thểlưu trữ được một dãy các giá trị cùng kiểu chẳng hạn như các thành phần của vector trong không gian n chiều chúng ta cần n biến a1, a2,..,an. rất cồng kềnh và rất bất tiện nhất là khi n lớn và lại không phải là cốđịnh. Các ngôn ngữ lập trình đưa ra
một khái niệm mảng để giải quyết vấn đề này.
Mảng là một tập hợp hữu hạn các phần tử có cùng kiểu dữ liệu được lưu trữ kế tiếp nhau trong bộ nhớ. Các phần tử trong mảng có cùng tên (và cũng là tên
mảng) nhưng phân biệt với nhau ở chỉ số cho biết vị trí của chúng trong mảng.
• Các thông tin về mảng: Với một mảng phải xác định các thông tin: tên mảng, kiểu các phần tử (kiểu mảng), số phần tử trong mảng (kích thước mảng). Ví dụ như chúng ta nói a là mảng có 20 phần tử, kiểu nguyên. Mảng cũng như các
biến đơn khác trong ngôn ngữ 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
• Số chiều của mảng: trong ví dụ chúng ta nêu trên về vector, chúng ta có một dãy n các số, nếu như chúng ta dùng một mảng đểlưu trữ các sốđó thì chúng ta
cần mảng có n phần tử và chỉ cần 1 chỉ số để xác định các phần tử - đây là
mảng một chiều. Nếu như chúng ta cần một mảng để biểu diễn một bảng có n dòng, m cột, và để xác định một phần tử trong mảng chúng ta cần 2 chỉ số: chỉ
số dòng và chỉ số cột, như vậy chúng ta có mảng 2 chiều.
5.1.2. Khai báo và sử dụng mảng Khai báo mảng Khai báo mảng
Trong C để khai báo một mảng ta sử dụng cú pháp khai báo sau:
kiểu_dữ_liệu tên_mảng [kích_thước_mảng];
Trong đó kiểu_dữ_liệu là kiểu dữ liệu của các phần tử trong mảng. tên_mảng là tên của mảng. kích_thứớc_mảng cho biết số phần tử trong mảng.
Ví dụ:
int mang_nguyen[10]; // khai báo mảng 10 phần tử có kiểu dữ liệu int
Trang 68
char mang_ki_tu[6]; // khai báo mảng 6 phần tử có kiểu dữ liệu char
Trong ví dụ trên, mảng mang_nguyen được lưu trữ trên 20 ô nhớ (mỗi ô nhớ có
kích thước 1 byte, 2 ô nhớ kích thước là 2 byte lưu trữ được một số nguyên kiểu int) liên tiếp nhau. Do C đánh số các phần tử của mảng bắt đầu từ 0 nên phần tử thứ i của mảng sẽ có chỉ số là i-1 và do vậy sẽ có tên là mang_nguyen[i-1]. Ví dụ: phần tử thứ
nhất của mảng là mang_nguyen[0], phần tử thứ 2 là mang_nguyen[1], phần tử thứ 5 là
mang_nguyen[4]…
mang_nguyen[0] mang_nguyen[1] ... ... mang_nguyen[9]
Kích thước của mảng bằng kích thước một phần tử nhân với số phần tử.
Sử dụng mảng
Đểtruy nhập vào một phần tử của mảng thông qua tên của nó. Tên một phần tử của mảng được tạo thành từ tên mảng và theo sau là chỉ số của phần tử đó trong mảng được đặt trong cặp dấu ngoặc vuông
tên_mảng[chỉ_số_của_phần_tử]
Ví dụ với khai báo
int mang_nguyen[3];
Thì mang_nguyen[0] sẽ là phần tử thứ nhất của mảng mang_nguyen[1] sẽ là phần tử thứ 2 của mảng mang_nguyen[2] sẽ là phần tử thứ 3 của mảng Với mảng nhiều chiều như
int a[6][5];
thì a[0] là phần tử đầu tiên của một mảng, phần tử này bản thân nó lại là một mảng một chiều. Phần tử đầu tiên của mảng một chiều a[0] sẽ là a[0][0]. Phần tử tiếp theo của a[0] sẽ là a[0][1]… Và dễ dàng tính được a[2][3] sẽ là phần tử thứ 4 của phần tử thứ 3 của a.
Một cách tổng quát a[i][j] sẽ là phần tử thứ j+1 của a[i], mà phần tử a[i] lại là phần tử thứ i+1 của a.
5.1.2.1. Khai báo mảng 1 chiều
Cú pháp
Kiểu_mảng tên_mảng [ số_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ó thể là kiểu chuẩn hoặc kiểu dữ liệu do người lập trình định nghĩa .
- 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
- số_phần_tử : là hằng (hoặc biểu thức hằng) nguyên, dương là số phần tử của mảng.
Ví dụ:
int vector [15]; // tên mảng: vector, có 15 phần tử, kiểu int
float MT[10], D[20]; // có hai mảng kiểu float: MT có 10 phần tử, D có 20 phần tử
Trang 69
Khi gặp (dòng lệnh) định nghĩa một mảng, chương trình dịch sẽ cấp phát một vùng nhớ (lên tiếp) cho đủ các phần tử liên tiếp của mảng, ví dụ vector[15] sẽ được cấp phát một vùng nhớ có kích thước 15*sizeof(int) =30 byte
5.1.2.2. Khai báo mảng 2 chiều
Mảng hai chiều có thể hiểu như bảng gồm các dòng các cột, các phần tử thuộc cùng một kiểu dữ liệu nào đó. Mảng hai chiều được định nghĩa như sau.
Cú pháp
Kiểu_mảng tên_mảng [sd][sc];
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ó thể là kiểu chuẩn hoặc kiểu dữ liệu do người lập trình định nghĩa.
- 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.
- sd, sc : là hằng (hoặc biểu thức hằng) nguyên, dương tương ứng là số dòng và số cột mảng, số phần tử của mảng sẽ là sd*sc.
Ví dụ:
int a[2][5]; // a là mảng số nguyên có 2 dòng, 5 cột (có 10 phần tử)
float D[3][10]; // D là mảng số thực có 3 dòng, 10 cột (có 30 phần tử)
char DS[5][30]; // DS là mảng kí tự có 5 dòng, 30 cột
Khi gặp một định nghĩa mảng, chương trình dịch sẽ cấp phát một vùng nhớ liên tiếp có kích thước là sd*sc*sizeof (Kiểu_mảng) cho mảng.
Có thể coi mảng 2 chiều n dòng, m cột là mảng 1 chiểu có n phần tử, mỗi phần tử lại là 1 mảng một chiều có m phần tử (mảng của mảng). Ví dụ với float D[3][10] có thể xem D là mảng có 3 phần tử D[0], D[1], D[2], mỗi phần tử này là mảng có 10 phần tử.
5.2. Một số bài toán với mảng 1 chiều 5.2.1. Nhập dữ liệu cho mảng