CHPV C++ | Hãy kể tên các loại vòng lặp vô hạn

MỤC LỤC:
Ảnh: Hãy kể tên các loại vòng lặp vô hạn

1. Vòng lặp vô hạn là gì?

Vòng lặp vô hạn là chuỗi câu lệnh, nhằm chỉ thị cho chương trình chạy đi chạy lại một phần việc nào đó, sẽ kéo dài vô tận, nếu không có sự can thiệp từ bên ngoài ("pull the plug").
Vòng lặp vô hạn có thể được triển khai có chủ đích nhằm mang lại một tác dụng nào đó.

2. Lưu ý khi sử dụng Vòng lặp vô hạn trong lập trình:

( Rồi sẽ có ngày bạn hiểu ra vì sao tôi đưa phần lưu ý này lên trước mục 3 😏 )

Cần tránh phương án sử dụng vòng lặp vô hạn trong chương trình, hoặc hạn chế vô tình dẫn đến vòng lặp vô hạn.

Nếu vô tình dính vòng lặp vô hạn, hoặc sử dụng vòng lặp vô hạn không đúng cách, chương trình có thể bị gây treo PC hoặc bị crash (nếu trong vòng lặp khai bao biến hoặc cấp phát vùng nhớ mà không giải phóng vùng nhớ, dẫn đến memory leak).

Chỉ khi bài toán đặt ra yêu cầu 1 logic xử lý nào đó mà số vòng lặp bắt buộc không thể xác định trước được. Thì lúc này, LTV (lập trình viên) phải vận dụng vòng lặp vô hạn for(), while(), do while() một cách đúng đắn.

Từng có nhiều trường hợp chính tôi gặp trong thực tế, trong quá trình maintain code do người khác viết. Vòng lặp vô hạn khá khó kiểm soát trong trường hợp điều kiện để kết thúc vòng lặp phức tạp dần theo năm tháng ( được bổ sung dần dần bởi các yêu cầu ) -> một cách dễ dàng dẫn đến "smell code".

3. Các loại vòng lặp vô hạn

 3.1. Vòng lặp vô hạn bằng goto:

ABC:
std::cout << "in ra" << std::endl;
goto ABC;

 3.2. Vòng lặp vô hạn bằng while(true):

Thuần túy: 
    while (true) {        // do something
        // nhưng không có điều kiện kết thúc vòng lặp
    }
Thực tế ta gặp các trường hợp sử dụng có chủ đích như sau: ( với việc thiết lập một cách nào đó để tương tác, dừng vòng lặp )
#include <stdio.h>
#include <string.h>
#include <conio.h>
 
void main()
{
    int m;
    while (true) {
        printf("\nNhap data m: ");
        scanf("%d", &m);
        if(m > 0)
        {
            break;
        }
    }
    printf("\nm = %d", m);
    getch();
}

 3.3. Vòng lặp vô hạn với do while(true):

#include <stdio.h>
#include <string.h>
#include <conio.h>
 
void main()
{
    int m;
    do {
        printf("\nNhap m: ");
        scanf("%d", &m);
        if(m > 0)
        {
            break;
        }
    } while(1);
    printf("\nm = %d", m);
    getch();
}

 3.4. Vòng lặp vô hạn với for(;;):

    for ( ; ; ) {
        printf("\nNhap chi dan: "); gets(str);
        if(strcmp(str, "quit") == 0)
        {
            break;
        }
        printf("\ns = %str", str);
    }
    getch();

 3.5. Hàm đệ quy: 

Ngoài ra còn 1 cách tạo vòng lặp vô hạn một công việc nào đó, bằng hàm đệ quy.

void functionA() {
    // do something
    functionA();
}

Tuy nhiên không ai làm như vậy cả, và bản chất hàm đệ quy cũng khác với các loại vòng lặp ta đã kể ở trên.

Hàm đệ quy sẽ tạo ra một call stack, và khi kết thúc hàm đươc gọi trong một hàm khác, thì hàm ở ngoài mới chính thức kết thúc. 

Nếu có sử dụng hàm đệ quy, nguyên tắc cốt yếu là phải có điểm dừng cho call stack (điểm kết thúc đệ quy) , để không bị đệ quy vô tận, như dưới đây là 1 cách: 

void functionA(int a) {
    // do something
    if(a < 1000) {
        a++;
        functionA(a);
    } else {
        // đây chính là điểm kết thúc đệ quy
    }
}

TuanTiTien++

Author:

Tôi là Tuấn Anh, một lập trình viên C++, hiện tại đang làm việc với Qt Framework. Giờ đã là bố của một thanh niên nhỏ, gần đây tôi thấy mình cần sống có trách nhiệm hơn nữa. : ]] Tôi cảm thấy nếu tôi không có nơi nào đó để ghi lại, tôi sẽ quên mất nhiều thứ. Dấu chân trên cát cũng vậy, nếu ta không chụp ảnh nó lại, rồi nó cũng sẽ bị gió làm mờ đi dần rồi mất hút hẳn. Cảm ơn anh em đã ghé qua và đọc những gì tôi viết. Hữu duyên thiên lý Ngô tương nặng, à nhầm Năng tương ngộ. : ]] Thân ái 3000!
© Giao diện website thiết kế bởi TuanTiTien.com