Bài 7.1: Bài tập thực hành vòng lặp for trong C++

Chào mừng bạn trở lại với chuỗi bài học C++ của FullhouseDev! Hôm nay, chúng ta sẽ đi sâu vào một trong những cấu trúc điều khiển luồng quan trọng và được sử dụng nhiều nhất trong lập trình: vòng lặp for. Nếu bạn đã từng gặp phải tình huống cần lặp đi lặp lại một đoạn code nhiều lần, thì for chính là người bạn đồng hành đáng tin cậy của bạn.

Vòng lặp for đặc biệt hữu ích khi bạn biết trước hoặc có thể tính toán được số lần lặp mà bạn cần thực hiện. Nó cung cấp một cách ngắn gọn và có cấu trúc để quản lý quá trình lặp, giúp code của bạn sạch sẽdễ đọc hơn rất nhiều so với việc viết lặp lại cùng một dòng code!

Cấu trúc "Ma Thuật" của Vòng lặp for

Vòng lặp for trong C++ có một cấu trúc rất rõ ràng, gồm ba phần chính được phân cách bởi dấu chấm phẩy (;) bên trong cặp ngoặc đơn ():

for (khởi tạo; điều kiện; cập nhật) {
    // Đoạn mã sẽ được thực thi lặp đi lặp lại
}

Hãy "giải mã" từng phần:

  1. khởi tạo (Initialization): Phần này được thực thi chỉ một lần duy nhất khi vòng lặp bắt đầu. Thường được dùng để khai báo và gán giá trị ban đầu cho biến đếm của vòng lặp. Biến này chỉ tồn tại trong phạm vi của vòng lặp for (nếu được khai báo ngay tại đây).
  2. điều kiện (Condition): Phần này được kiểm tra trước mỗi lần lặp. Nếu điều kiệntrue, đoạn mã bên trong vòng lặp sẽ được thực thi. Nếu điều kiệnfalse, vòng lặp sẽ dừng lại và chương trình tiếp tục thực thi các dòng mã ngay sau vòng lặp.
  3. cập nhật (Update): Phần này được thực thi sau mỗi lần lặp hoàn thành. Thường được dùng để tăng hoặc giảm giá trị của biến đếm, đảm bảo rằng điều kiện lặp cuối cùng sẽ trở thành false để vòng lặp kết thúc (nếu không, bạn sẽ có một vòng lặp vô hạn!).

Nghe có vẻ hơi lý thuyết? Đừng lo, chúng ta sẽ đi ngay vào các ví dụ thực tế để thấy for hoạt động như thế nào!

Các Ví dụ Thực Hành với Vòng lặp for

Ví dụ 1: Đếm số từ 1 đến 10

Đây là ví dụ "kinh điển" nhất để bắt đầu. Chúng ta sẽ sử dụng vòng lặp for để in ra các số nguyên từ 1 đến 10.

#include <iostream>

int main() {
    cout << "Cac so tu 1 den 10:" << endl;

    for (int i = 1; i <= 10; ++i) {
        cout << i << " "; // In so i va mot khoang cach
    }

    cout << endl; // Xuong dong sau khi in xong

    return 0;
}

Giải thích:

  • int i = 1;: Khởi tạo biến đếm i với giá trị ban đầu là 1. Biến i chỉ "sống" trong vòng lặp này.
  • i <= 10;: Điều kiện lặp. Vòng lặp sẽ tiếp tục chạy chừng nào giá trị của i còn nhỏ hơn hoặc bằng 10.
  • ++i;: Cập nhật biến đếm. Sau mỗi lần lặp, giá trị của i tăng lên 1. Chúng ta dùng ++i (tiền tố tăng) hoặc i++ (hậu tố tăng) đều được trong trường hợp này, kết quả là i tăng 1.
  • cout << i << " ";: Đoạn code bên trong thân vòng lặp. Lệnh này sẽ được thực thi 10 lần, lần lượt in ra giá trị của i từ 1 đến 10, mỗi số cách nhau bởi một khoảng trắng.

Kết quả chạy chương trình sẽ là: Cac so tu 1 den 10: 1 2 3 4 5 6 7 8 9 10

Ví dụ 2: Đếm ngược từ 10 về 1

Vòng lặp for cũng rất linh hoạt để đếm ngược. Chúng ta chỉ cần thay đổi phần khởi tạo, điều kiện và cập nhật cho phù hợp.

#include <iostream>

int main() {
    cout << "Dem nguoc tu 10 ve 1:" << endl;

    for (int i = 10; i >= 1; --i) {
        cout << i << " ";
    }

    cout << endl;

    return 0;
}

Giải thích:

  • int i = 10;: Khởi tạo biến đếm i với giá trị ban đầu là 10.
  • i >= 1;: Điều kiện lặp. Vòng lặp tiếp tục khi i còn lớn hơn hoặc bằng 1.
  • --i;: Cập nhật biến đếm. Sau mỗi lần lặp, giá trị của i giảm đi 1. Chúng ta dùng --i (tiền tố giảm) hoặc i-- (hậu tố giảm).

Kết quả chạy chương trình sẽ là: Dem nguoc tu 10 ve 1: 10 9 8 7 6 5 4 3 2 1

Ví dụ 3: Lặp với bước nhảy tùy ý (In số chẵn)

Không chỉ tăng giảm 1 đơn vị, bạn hoàn toàn có thể thay đổi bước nhảy của biến đếm trong phần cập nhật. Hãy in các số chẵn từ 0 đến 20.

#include <iostream>

int main() {
    cout << "Cac so chan tu 0 den 20:" << endl;

    for (int i = 0; i <= 20; i += 2) { // i += 2 tuong duong voi i = i + 2
        cout << i << " ";
    }

    cout << endl;

    return 0;
}

Giải thích:

  • int i = 0;: Bắt đầu từ 0.
  • i <= 20;: Lặp cho đến khi i vượt quá 20.
  • i += 2;: Cập nhật. Sau mỗi lần lặp, i tăng thêm 2 đơn vị. Điều này giúp chúng ta nhảy qua các số lẻ và chỉ lấy các số chẵn.

Kết quả chạy chương trình sẽ là: Cac so chan tu 0 den 20: 0 2 4 6 8 10 12 14 16 18 20

Ví dụ 4: Tính tổng các số từ 1 đến N

Vòng lặp for rất mạnh mẽ khi kết hợp với các biến khác để thực hiện tính toán hoặc xử lý dữ liệu. Hãy viết chương trình tính tổng các số nguyên từ 1 đến một số N nào đó do người dùng nhập vào.

#include <iostream>

int main() {
    int n;
    cout << "Nhap mot so nguyen duong N: ";
    cin >> n;

    int sum = 0; // Bien de luu tong, khoi tao bang 0

    // Vong lap de cong don cac so tu 1 den N
    for (int i = 1; i <= n; ++i) {
        sum += i; // Tuong duong voi sum = sum + i;
    }

    cout << "Tong cac so tu 1 den " << n << " la: " << sum << endl;

    return 0;
}

Giải thích:

  • Chúng ta khai báo biến n để nhận giá trị nhập từ người dùng và biến sum, khởi tạo bằng 0, để lưu trữ tổng.
  • Vòng lặp for chạy từ i = 1 đến i = n.
  • Bên trong vòng lặp, lệnh sum += i; sẽ liên tục cộng giá trị hiện tại của i vào biến sum.
    • Lần lặp 1: sum = 0 + 1 = 1
    • Lần lặp 2: sum = 1 + 2 = 3
    • Lần lặp 3: sum = 3 + 3 = 6
    • ... cho đến khi i bằng n.
  • Sau khi vòng lặp kết thúc (khi i vượt quá n), biến sum sẽ chứa tổng của tất cả các số từ 1 đến n.

Nếu bạn nhập N = 5, kết quả sẽ là: Tong cac so tu 1 den 5 la: 15 (vì 1+2+3+4+5 = 15).

Ví dụ 5: Vòng lặp for lồng nhau (Nested for Loops)

Bạn hoàn toàn có thể đặt một vòng lặp for bên trong một vòng lặp for khác. Đây gọi là vòng lặp lồng nhau. Kỹ thuật này rất hữu ích khi làm việc với các cấu trúc hai chiều như ma trận hoặc in các mẫu hình học.

Hãy cùng in một hình chữ nhật bằng các ký tự *.

#include <iostream>

int main() {
    int rows = 4; // So dong
    int cols = 7; // So cot

    cout << "Hinh chu nhat kich thuoc " << rows << "x" << cols << ":" << endl;

    // Vong lap ngoai dieu khien so dong
    for (int i = 0; i < rows; ++i) {
        // Vong lap ben trong dieu khien so cot trong moi dong
        for (int j = 0; j < cols; ++j) {
            cout << "* "; // In mot dau sao va khoang cach
        }
        cout << endl; // Xuong dong sau khi het mot dong
    }

    return 0;
}

Giải thích:

  • Vòng lặp ngoài với biến i chạy từ 0 đến rows - 1 (tức là 4 lần, tương ứng với 4 dòng).
  • Với mỗi lần chạy của vòng lặp ngoài (mỗi dòng), vòng lặp bên trong với biến j sẽ chạy toàn bộ từ 0 đến cols - 1 (tức là 7 lần, tương ứng với 7 cột).
  • Bên trong vòng lặp j, chúng ta in ra ký tự * (dấu sao và một khoảng trắng).
  • Sau khi vòng lặp bên trong (j) hoàn thành (kết thúc một dòng), lệnh cout << endl; sẽ được thực thi để xuống dòng, chuẩn bị in dòng tiếp theo.

Kết quả chạy chương trình sẽ là một hình chữ nhật 4 dòng, 7 cột các dấu sao:

Hinh chu nhat kich thuoc 4x7:
* * * * * * *
* * * * * * *
* * * * * * *
* * * * * * *

Đây là một ví dụ tuyệt vời cho thấy cách các vòng lặp lồng nhau làm việc cùng nhau để tạo ra các cấu trúc phức tạp hơn.

Một vài Lưu Ý Quan Trọng về Vòng lặp for

  • Phạm vi biến: Các biến được khai báo trực tiếp trong phần khởi tạo của for (như int i = 0;) chỉ tồn tại trong phạm vi của vòng lặp đó. Sau khi vòng lặp kết thúc, bạn không thể truy cập biến i nữa.
  • Có thể bỏ trống các phần: Bạn có thể bỏ trống một hoặc nhiều phần trong cấu trúc for (ví dụ: for ( ; condition ; update )). Tuy nhiên, bạn phải giữ lại dấu chấm phẩy phân cách. Nếu bạn bỏ trống cả ba phần (for ( ; ; )), bạn sẽ tạo ra một vòng lặp vô hạn, trừ khi bạn có lệnh break bên trong để thoát. Cẩn thận khi sử dụng vòng lặp vô hạn!
  • Lệnh breakcontinue: Tương tự như các loại vòng lặp khác, bạn có thể sử dụng break để thoát khỏi vòng lặp for ngay lập tức hoặc continue để bỏ qua phần còn lại của lần lặp hiện tại và chuyển sang lần lặp tiếp theo.

Comments

There are no comments at the moment.