Bài 1 : Cấu Trúc Của Một Chương Trình C++



tải về 448.29 Kb.
trang8/14
Chuyển đổi dữ liệu02.09.2016
Kích448.29 Kb.
1   ...   4   5   6   7   8   9   10   11   ...   14

Khởi tạo một mảng.


Khi khai báo một mảng với tầm hoạt động địa phương (trong một hàm), theo mặc định nó sẽ không được khởi tạo, vì vậy nội dung của nó là không xác định cho đến khi chúng ra lưu các giá trị lên đó.

 

Nếu chúng ta khai báo một mảng toàn cục (bên ngoài tất cả các hàm) nó sẽ được khởi tạo và tất cả các phần tử được đặt bằng 0. Vì vậy nếu chúng ta khai báo mảng toàn cục:



 

int billy [5];

 

mọi phần tử của billy sẽ được khởi tạo là 0



 

 

Nhưng thêm vào đó, khi chúng ta khai báo một mảng, chúng ta có thể gán các giá trị khởi tạo cho từng phần tử của nó. Ví dụ:



 

int billy [5] = { 16, 2, 77, 40, 12071 };  

 

lệnh trên sẽ khai báo một mảng như sau:



 

 

Số phần tử trong mảng mà chúng ta khởi tạo với cặp ngoặc nhọn { } phải bằng số phần tử của mảng đã được khai báo với cặp ngoặc vuông [ ]. Bởi vì điều này có thể được coi là một sự lặp lại không cần thiết nên C++ cho phép để trống giữa cặp ngoặc vuông, kích thước của mảng được xác định bằng số giá trị giữa cặp ngoặc nhọn.


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


Ở bất kì điểm nào của chương trình trong tầm hoạt động của mảng, chúng ta có thể truy xuất từng phần tử của mảng để đọc hay chỉnh sửa như là đối với một biến bình thường. Cấu trúc của nó như sau:

name[index]

Như ở trong ví dụ trước ta có mảng billy gồm 5 phần tử có kiểu int, chúng ta có thể truy xuất đến từng phần tử của mảng như sau:



Ví dụ, để lưu giá trị 75 vào phần tử thứ ba của billy ta viết như sau:



billy[2] = 75;

và, ví dụ, để gán giá trị của phần tử thứ 3 của billy cho biến a, chúng ta viết:



a = billy[2];

Vì vậy, xét về mọi phương diện, biểu thức billy[2] giống như bất kì một biến kiểu int.

Chú ý rằng phần tử thứ ba của billybilly[2], vì mảng bắt đầu từ chỉ số 0. Vì vậy, phần tử cuối cùng sẽ là billy[4]. Vì vậy nếu chúng ta viết billy[5], chúng ta sẽ truy xuất đến phần tử thứ 6 của mảng và vượt quá giới hạn của mảng.

Trong C++, việc vượt quá giới hạn chỉ số của mảng là hoàn toàn hợp lệ, tuy nhiên nó có thể gây ra những vấn đề thực sự khó phát hiện bởi vì chúng không tạo ra những lỗi trong quá trình dịch nhưng chúng có thể tạo ra những kết quả không mong muốn trong quá trình thực hiện. Nguyên nhân của việc này sẽ được nói đến kĩ hơn khi chúng ta bắt đầu sử dụng con trỏ.

Cần phải nhấn mạnh rằng chúng ta sử dụng cặp ngoặc vuông cho hai tác vụ: đầu tiên là đặt kích thước cho mảng khi khai báo chúng và thứ hai, để chỉ định chỉ số cho một phần tử cụ thể của mảng khi xem xét đến nó. 

int billy[5]; // khai báo một mảng mới.

billy[2] = 75; // truy xuất đến một phần tử của mảng.

Một vài thao tác hợp lệ khác với mảng:

billy[0] = a;
billy[a] = 75;
b = billy [a+2];
billy[billy[a]] = billy[2] + 5;


// ví dụ về mảng

#include

 

int billy [] = {16, 2, 77, 40, 12071};



int n, result=0;

 

int main ()



{

for ( n=0 ; n<5 ; n++ )

{

result += billy[n];



}

cout << result;

return 0;

}


12206

Mảng nhiều chiều.


Mảng nhiều chiều có thể được coi như mảng của mảng, ví dụ, một mảng hai chiều có thể được tưởng tược như là một bảng hai chiều gồm các phần tử có kiểu dữ liệu cụ thể và giống nhau.

jimmy biểu diễn một mảng hai chiều kích thước 3x5 có kiểu int. Cách khai báo mảng này như sau:

int jimmy [3][5];

và, ví dụ, cách để truy xuất đến phần tử thứ hai theo chiều dọc và thứ tư theo chiều ngang trong một biểu thức như sau:



jimmy[1][3]

(hãy nhớ rằng chỉ số của mảng luôn bắt đầu từ 0).

Mảng nhiều chiều không bị giới hạn bởi hai chỉ số (hai chiều), Chúng có thể chứa bao nhiều chỉ số tùy thích mặc dù ít khí cần phải dùng đến mảng lớn hơn 3 chiều. Hãy thử xem xét lượng bộ nhớ mà một mảng có nhiều chỉ số cần đến. Ví dụ:

char century [100][365][24][60][60];

gán một giá trị char cho mỗi giây trong một thế kỉ, phải cần đến hơn 3 tỷ giá trị chars! Chúng ta sẽ phải cần khoảng 3GB RAM để khai báo nó.

Mảng nhiều chiều thực ra là một khái niệm trừu tượng vì chúng ta có thể có kết quả tương tự với mảng một chiều bằng một thao tác đơn giản giữa các chỉ số của nó:

int jimmy [3][5];   tương đương với
int jimmy [15];   (3 * 5 = 15)

Dưới đây là hai ví dụ với cùng một kết quả như nhau, một sử dụng mảng hai chiều và một sử dụng mảng một chiều:



// multidimensional array

#include

 

#define WIDTH 5



#define HEIGHT 3

 

int jimmy [HEIGHT][WIDTH];



int n,m;

 

int main ()



{

for (n=0;n

for (m=0;m

{

jimmy[n][m]=(n+1)*(m+1);



}

return 0;

}


// pseudo-multidimensional array

#include

 

#define WIDTH 5



#define HEIGHT 3

 

int jimmy [HEIGHT * WIDTH];



int n,m;

 

int main ()



{

for (n=0;n

for (m=0;m

{

jimmy[n * WIDTH + m]=(n+1)*(m+1);



}

return 0;

}


không một chương trình nào viết gì ra màn hình nhưng cả hai đều gán giá trị vào khối nhớ có tên jimmy theo cách sau:

Chúng ta đã định nghĩa hằng (#define) để đơn giản hóa những chỉnh sửa sau này của chương trình, ví dụ, trong trường hợp chúng ta quyết định tăng kích thước của mảng với chiều cao là 4 thay vì là 3, chúng ta chỉ cần thay đổi dòng:

#define HEIGHT 3

thành


#define HEIGHT 4

và không phải có thêm sự thay đổi nào nữa đối với chương trình.





1   ...   4   5   6   7   8   9   10   11   ...   14


Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2019
được sử dụng cho việc quản lý

    Quê hương