----> Lời khuyên cho các bạn bắt đầu học lập trình: nếu có tham khảo code trên mạng thì các bạn nên xem nó và tự viết lại rồi tìm hiểu xem từng phần trong code ý nó có mục đích là gì chứ đừng nên copy và paste một cách máy móc mà mình chả hiểu được code ý nó viết gì.
Trong C++, mảng là một nhóm các vùng nhớ liên tiếp có cùng kiểu dữ liệu. Thông thường mảng chứa những phần tử dữ liệu có liên quan đến nhau. Mảng có thể là một chiều, hai chiều, hoặc nhiều hơn hai chiều, trong đó mảng 1 chiều là thông dụng nhất.
1. Mảng một chiều (one-dimension array)
a. Khai báo mảng một chiều
Cú pháp khai báo cho mảng một chiều như sau
Ví dụ:
int num[100]; // khai báo mảng 100 số nguyên
char ch[12]; // khai báo mảng 12 ký tự
Chúng ta cũng có thể khởi tạo giá trị cho mảng ngay lúc khai báo. Ví dụ:
int ch[]={‘a’, ‘b’, ‘c’, ‘d’}; // không cần chỉ rõ kích cỡ mảng, compiler sẽ tự động tính toán đủ chỗ
b. Truy xuất đến các phần tử mảng
Để truy xuất đến các phần tử của mảng ta có thể dùng con trỏ hoặc chỉ số mảng. Sau đây là các cách truy xuất các phần tử của mảng thông dụng
Thông qua chỉ số mảng: xem xét chương trình sau. Chương trình nhận 10 chữ số nguyên từ bàn phím và in ra các số chẵn đã được nhập vào.
using namespace std;
int main(){
int const size=10;
int n;
int a[size];
cout << "Enter " << size << " integers\n";
for(int i=0; i<size; i++){ // nhập 10 số nguyên
cout << "a[" << i << "]= ";
cin >> a[i]; // nhập dữ liệu cho phần tử a[i]
}
cout << "Even numbers are: \n";
for(int i=0; i<size; i++){ // duyệt hết mảng
if(a[i]%2==0){ // nếu là số chẵn
cout << a[i] << " "; // in ra số chẵn
}
}
return 0;
}
Thông qua con trỏ: tên mảng thực chất là một con trỏ hằng, trỏ đến phần tử đầu tiên của mảng. Vì vậy ta có thể truy xuất tới các phần tử của mảng thông qua con trỏ này. Chương trình trên được viết lại theo phong cách con trỏ.
using namespace std;
int main(){
int const size=5;
int n;
int a[size];
cout << "Enter " << size << " integers\n";
for(int i=0; i<size; i++){
cout << "a[" << i << "]= ";
cin >> *(a+i); // đọc dữ liệu vào a[i]
}
cout << "Even numbers are: \n";
for(int i=0; i<size; i++){
if(*(a+i)%2==0){ // nếu a[i] chẵn
cout << *(a+i) << " "; // in ra a[i]
}
}
system("pause");
return 0;
}
Ta có thể chỉ dùng con trỏ mà không cần dùng biến chạy i, đặc biệt là trong thao tác với chuỗi (string). Mọi tăng giảm đều thực hiện trên con trỏ, tuy nhiên tên mảng là một con trỏ hằng, không thể thay đổi được. Vì vậy ta phải thực hiện việc này thông qua một con trỏ khác. Chương trình sau thực hiện việc đổi tất cả các dấu cách (space) thành dấu chấm (dot). Lưu ý rằng, C++ không có kiểu built-in là string, string được cài đặt thông qua mảng các ký tự (kiểu char). Dấu hiệu kết thúc của một string là ký tự NULL (hay ký tự ‘\0’), đây chính là cơ sở để làm điều kiện kết thúc vòng lặp. Xem xét chương trình.
#include <cstdio>
using namespace std;
int main(){
char str[]="I am a superman, ha ha ha";
char* ptr=str;
while(*ptr){ // nếu còn chưa hết xâu
if(*ptr==' '){ // nếu là dấu cách
*ptr='.'; // đổi thành dấu chấm
}
ptr++; // dịch đến ký tự tiếp theo
}
cout << str << endl; // in ra xâu đã được chỉnh sửa
return 0;
}
2. Mảng hai chiều (two-dimension array)
Mảng hai chiều thực chất là “mảng một chiều của các mảng một chiều”. Để khai báo mảng một chiều ta dùng cú pháp sau.
Ví dụ:
int x[10][8]; // khai báo một mảng nguyên 10 phần tử, mỗi phần tử là một mảng nguyên tám phần tử
Ta có thể coi mảng hai chiều như một bảng (table), chiều thứ nhất là số hàng (row), chiều thứ hai là số cột (column), như mô tả trong hình vẽ sau.
Thực tế trong máy tính mảng trên được tổ chức như một mảng một chiều gồm 4 phần tử. Mỗi phần tử lại là một mảng một chiều gồm 5 phần tử như hình vẽ sau.
Ta cũng có thể khởi tạo mảng hai chiều khi khai báo. Chiều thứ nhất có thể bỏ trống, trình biên dịch sẽ tự động tính toán vừa đủ, nhưng chiều thứ hai phải được chỉ định rõ. Ví dụ.
{1,2},
{3,4},
{2,6}
};
Cách viết trên để cho dễ nhìn, bạn cũng có thể viết như sau mà kết quả vẫn tương đương.