[Học lập trình C] Mảng và vòng lặp trong C++

Bởi vì những phần tử của mảng có thể được truy cập như một biến bình thường, cho nên chúng ta thường sử dụng vòng lặp để truy cập và xử lý mỗi phần tử của mảng. Ở bất kì đâu bạn tìm thấy mảng thì hầu như bạn có thể thấy vòng lặp ở đó.

Xem xét trường hợp bạn muốn tính điểm trung bình điểm kiểm tra của cả lớp. Sử dụng biến riêng lẻ :

const int nNumStudents = 5;

int nScore0 = 84;

int nScore1 = 92;

int nScore2 = 76;

int nScore3 = 81;

int nScore4 = 56;

 

int nTotalScore = nScore0 + nScore1 + nScore2 + nScore3 + nScore4;

double dAverageScore = static_cast(nTotalScore) / nNumStudents;

Trong trường hợp này chúng ta chỉ sử dụng 5 biến, bạn có thể sử dụng cách ở trên vì chúng ta chỉ có 5 sinh viên. Thử tưởng tượng nếu chúng ta làm việc với 30 hoặc 150 hoặc 300 sinh viên thì bạn phải làm rất nhiều việc cho một công việc rất đơn giản.

Hơn nữa, nếu có một sinh viên mới được thêm vào, bạn phải khai báo một biến mới, khởi tạo và thêm vào biểu thức tính nTotalScore.

Sử dụng mảng không có vòng lặp có thể xử lý vấn đề tốt hơn cách viết mã ở trên một chút :

const int nNumStudents = 5;

int anScores[nNumStudents] = { 84, 92, 76, 81, 56 };

int nTotalScore = anScores[0] + anScores[1] + anScores[2] + anScores[3] + anScores[4];

double dAverageScore = static_cast(nTotalScore) / nNumStudents;

Với việc sử dụng array bạn có thể giảm bớt một số lượng lớn biến phải khai báo, Tuy nhiên khi tính toán nTotalScore bạn vẩn phải liệt kê từng phần tử của mảng ra đẻ tính toán. Và khi đó, nếu số phần tử của mảng có sự thay đổi bạn phải cập nhật thêm phần tử đó trong biểu thức tính nTotalScore.

Và bây giờ chúng ta sử dụng mảng và vòng lặp cho công việc ở trên :

const int nNumStudents = 5;

int anScores[nNumStudents] = { 84, 92, 76, 81, 56 };

int nTotalScore = 0;

for (int nStudent = 0; nStudent < nNumStudents; nStudent++)

{

nTotalScore += anScores[nStudent];

}

double dAverageScore = static_cast(nTotalScore) / nNumStudents;

Đây là cách tốt nhất để giải quyết bài toán trên. Bởi vì vòng lặp có thể truy cập lần lượt vào tất cà những phần tử của mảng và lần lượt cộng giá trị của từng phần tử của mảng vào nTotalScore. Nghĩa là khi chúng ta thêm một điểm của một sinh viên mới, chúng ta không cần phải cập nhật lại biểu thức tính toán nTotalScore.

Dưới đây là một ví dụ khác về cách sử dụng vòng lặp trong mảng với mục đích tím điểm số cao nhất trong lớp :

const int nNumStudents = 5;

int anScores[nNumStudents] = { 84, 92, 76, 81, 56 };

int nMaxScore = 0;

for (int nStudent = 0; nStudent < nNumStudents; nStudent++)

if (anScores[nStudent] > nMaxScore)

nMaxScore = anScores[nStudent];

cout << “The best score was ” << nMaxScore << endl;

Trong ví dụ ở trên, Chúng ta sử dụng biến nMaxScore. Lúc đầu chúng ta gán nMaxScore bằng 0. Khi chúng ta đi qua lần lượt từng phần tử của mảng và nếu phẩn tử nào của mạng có giá trị lớn hơn nMaxScore hiện tại thì chúng ta gán giá trị của phần tử đó cho nMaxScore và tiếp tục đi đến cuối mảng.Do đó khi ra khỏi vòng lặp nMaxScore sẻ được gán giá trị lớn nhất của mảng đó.

Vòng lặp thường được sử dụng trong mảng để làm 3 điều dưới đây :

  1. Tìm kiếm một giá trị của mảng (lớn nhất, nhỏ nhất,…)
  2. Tính toán giá trị của mảng (tính tổng, trung bình..)
  3. Tổ chức lại mảng (Sắp xếp lớn dần, nhỏ dần

Khi tìm kiếm một giá trị nào đó của mảng, bạn sử dụng môt biến để lưu giá trị cần tìm. Ban đầu bạn có thể gán giá trị cho biến đó bằng 0 hoặc bằng phần tử đầu tiên của mảng, rồi lần lượt so sánh với các giá trị từ đầu cho tới cuối mảng. Và cập nhật lại giá trị cho biến đó nếu một phần tử nào đó của mảng thỏa mản yêu cầu đặt ra. Trong ví dụ ở trên chúng ta khai báo biến nMaxScore để giữ giá trị lớn nhất của mảng và khởi tao nó bằng 0. Rồi sau đó lần lượt so sánh với từng giá trị của mảng và cập nhật lại ra giá của nMaxScore.

Lỗi Khi Sử Dụng Vòng Lặp

Khi tính toán giá trị của mảng, bạn sử dụng một biến để lưu giá trị cần tím đó, thường thì bạn khởi tạo giá trị đó bằng 0. Sau đó bạn chạy vọng lặp qua từng phần tử của mảng, nếu phần tử nào thỏa mãn yêu cầu thì thực hiện phép tính với phần tử đó để cập nhật lại giá trị của biến kết quả.

Để sắp xếp lại mảng, bạn thường sử dụng kết hợp nhiều vòng lặp để thực hiện được yêu cầu muốn thực hiện.

Một trong những khó khăn của việc sử dụng vòng lặp với mảng xác định số vòng lặp sẻ xảy ra. Nó thường dẩn đến một lỗi là bạn truy cập vào những phần tử lớn hơn kích thước của mảng tức là truy cập vào những phần tử không tồn tại :

const int nArraySize = 5;

int anArray[nArraySize ] = { 6, 8, 2, 4, 9 };

int nMaxValue = 0;

for (int nIndex = 0; nIndex <= nArraySize; nIndex++)

if (anArray[nIndex] > nMaxValue)

nMaxValue = anArray[nIndex];

Vấn đề của chương trình ở trên là điều kiện của vòng lặp bị sai. Mảng của chúng ta khai báo với 5 phàn tử, tức là index từ 0-4. Tuy nhiên vòng lặp lai đúng cho giá trị từ 0-5. Đo đó, trong lần lặp cuối cùng. Mảng sẻ thực thi điều này :

if (anArray[nIndex] > nMaxValue)

nMaxValue = anArray[nIndex];

Nhưng anArray[5] không được định nghĩa, điều này sẻ dẫn đến lỗi.

Những chia sẻ trên hi vọng sẽ giúp các bạn làm việc tốt hơn với mảng và vòng lặp trong C++.

Ngoài ra, để bạn có thể tìm hiểu thông tin về lập trình viên, về khóa học giúp bạn sử dụng thành thạo và thành công ngôn ngữ C/C++ tại www.stanford.com.vn.

 

 

[Học lập trình C] Mảng và vòng lặp trong C++
5 (100%) 10 votes

Add Comment