es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El bucle no se está terminando, por favor, alguien explique qué estoy haciendo mal.

No puedo descubrir por qué este bucle no se está terminando. Por favor, alguien explique. ¿Qué estoy haciendo mal?

std::vector<int> vec{};
int result{0};

for (unsigned i = 0; i < vec.size() - 1; i++) {
    for (unsigned j = i + 1; j < vec.size(); j++) {
        result += vec.at(i) * vec.at(j);
    }
}
std::cout << result;

Quería encontrar la suma de los productos de los pares de enteros en el vector. Por ejemplo, para {1, 2, 3}, result debería ser (1 * 2) + (1 * 3) + (2 * 3), funciona bien. Pero para casos extremos como cuando el vector está vacío, no muestra el resultado en su lugar, se ejecuta indefinidamente.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La razón por la que el bucle no termina cuando el vector está vacío es que el valor inicial de i está establecido en 0 y se comprueba la condición i < vec.size() - 1 en el bucle for. Cuando el vector está vacío, vec.size() es igual a 0 y vec.size() - 1 resultará en std::numeric_limits<unsigned>::max(), que es el valor máximo que se puede representar mediante un tipo de datos entero sin signo. Por lo tanto, la condición i < vec.size() - 1 siempre será verdadera y el bucle nunca terminará.

    Para solucionar esto, debes agregar una comprobación para ver si el vector está vacío antes de ingresar al bucle. Puedes modificar el código de la siguiente manera:

    std::vector<int> vec{};
    int result{0};
    
    if (!vec.empty()) {
        for (unsigned i = 0; i < vec.size() - 1; i++) {
            for (unsigned j = i + 1; j < vec.size(); j++) {
                result += vec.at(i) * vec.at(j);
            }
        }
        std::cout << result;
    } else {
        std::cout << "El vector está vacío";
    }
    

    En el código modificado, estamos comprobando si el vector está vacío antes de ingresar al bucle. Si el vector está vacío, imprimimos un mensaje para indicar que el vector está vacío. Si el vector no está vacío, ingresamos al bucle y realizamos los cálculos necesarios.

    ¡Espero que esto ayude!

Comments are closed.