Mảng một chiều là dãy các thành phần (phần tử) cùng kiểu dữ liệu có quan hệ với nhau, chẳng hạn: mảng số nguyên (thực, ký tự) chứa các thành phần có kiểu số nguyên (số thực, ký tự).
C chỉ trang bị phép toán truy cập đến từng thành phần của mảng, LTV phải tự thiết kế các thao tác trên kiểu dữ liệu mảng.
Để định nghĩa kiểu mảng một chiều, ta dùng từ khóa typedef:
typedef kiểu_phần_tử tên_kiểu_mảng [kích_thƣớc_kiểu_mảng];
Để khai báo một biến mảng (bien_mang) có kiểu mảng (tên_kiểu_mảng):
tên_kiểu_mảng bien_mang;
Mỗi phần tử của mảng là một biến có kiểu_phần_tử. Các phần tử của mảng được đánh số thứ tự từ 0 đến kích_thước – 1. Để truy cập đến phần tử thứ i (i phải có kiểu nguyên), ta dùng cú pháp:
tên_biến_mảng [i]
Hình 4.1 chỉ ra mảng số nguyên c chứa 12 phần tử: c[0], c[1], .., c[11]. Giá trị của chúng lần lượt là: -45, 6, 0, 72, 1543, -89, 0, … Để khai báo c, trước hết ta định nghĩa kiểu mảng nguyên (mang_nguyen) có kích thước lớn hơn hoặc bằng 12, sau đó khai báo c thuộc kiểu mang_nguyen.
typedef int mang_nguyen[100];
mang_nguyen c;
Mảng c chứa 99 phần tử, nhưng ta chỉ sử dụng 12 phần tử đầu tiên. Do đó, ta phải duy trì thêm biến n_c (có giá trị là 12) chỉ ra số phần tử đang sử dụng:
int n_c; Hình 4.1 Mảng số nguyên c chứa 12 phần tử Phần tử thứ 4 của c Số thứ tự của phần tử trong c Giá trị Mảng c
Có thể khai báo trực tiếp c như sau:
int c[12];
Ví dụ 4.1: tạo mảng d chứa 10 số thực 0.0 và xuất d ra màn hình
typedef float mang_thuc[100]; // (1)
mang_thuc d; // (2)
int n_d = 10; // số phần tử d đang sử dụng (3) for (int i=0; i<n_d; i++) d[i] = 0.0; // (4) for (int i=0; i<n_d; i++) printf(“%f”, d[i]); // (5)
Có thể vừa tiến hành khai báo mảng và gán các giá trị ban đầu cho một số (các phần tử còn lại có giá trị mặc định là 0.0) các phần tử của mảng theo cú pháp:
ten_kieu_mang bien_mang = {gia_tri_phan_tu_0, gia_tri_phan_tu_1, ..};
Chẳng hạn, nếu muốn vừa khai báo d vừa gán các giá trị ban đầu cho 5 phần tử đầu tiên của d (ở ví dụ 4.1) có giá trị là 0.0, 1.0, 2.0, 3.0, 4.0 ta thay lệnh (2) bằng lệnh (2‟):
mang_thuc d = { 0.0, 1.0, 2.0, 3.0, 4.0 };
Lúc đó, nếu bỏ câu lệnh (4), kết quả (thực hiện câu lệnh (5)) xuất d ra màn hình là: 0.0,
1.0, 2.0, 3.0, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0.
Có thể dùng dạng khai báo trực tiếp d (thay lệnh (1) và (2) bằng lệnh (2‟)):
float d[12] = { 0.0, 1.0, 2.0, 3.0, 4.0 };
Nếu khai báo trực tiếp mảng e mà không chỉ ra số lượng phần tử của e thì bắt buộc phải đặt giá trị ban đầu cho các phần tử của e. Lúc đó, số lượng phần tử của e là số giá trị được liệt kê. Chẳng hạn, câu lệnh
float e[] = { 0.0, 1.0, 2.0, 3.0, 4.0 }; // (6)
sẽ tạo ra một mảng 5 phần tử với các giá trị ban đầu của các phần tử là 0.0, 1.0, 2.0, 3.0,
4.0. Câu lệnh (6) tương đương với câu lệnh (7) sau: float e[5] = { 0.0, 1.0, 2.0, 3.0, 4.0 }; // (7).
Ví dụ 4.2: Một phần CT minh họa một số thao tác cơ bản trên mảng các số
nguyên: nhập mảng chứa n số nguyên, xuất mảng, tính tổng các phần tử của mảng.
#include …
#define KICH_THUOC 100
typedef int mang_nguyen [KICH_THUOC]; int main()
mang_nguyen a; int n, n_y, tong = 0; //Nhập mảng
printf (“\n Nhap so phan tu cua mang : ”); scanf (“%d”, &n_y);
for (int i=0 ; i < n_y; i++)
printf (“\n Nhap phan tu thu %d:”, i); scanf (“%d”, &y[i]);
//Xuất mảng
for (int i=0 ; i < n_y; i++) printf (“\t%d”, y[i]); //Tính tổng
for (int i=0 ; i < n_y; i++) tong = tong + y[i];
printf (“\n Tong cac phan tu trong mang la: %d”, tong); getch (); return 0; tổng các phần tử của y (tong) số phần tử của y (n_y) Nhập mảng Mảng y với các giá trị của các phần tử chưa
được xác định y với các giá trị
của các phần tử được nhập vào từ bàn phím Xuất mảng Tính tổng các phần tử của mảng