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.

¿Por qué una variable que he escaneado está cambiando al escanear una matriz separada?

Estoy haciendo los desafíos de C ++ en HackerRank y me he quedado atascado en la introducción de matrices. Me están dando una entrada de muestra de

4 \
1 4 3 2

Donde n = 4 es el tamaño del array y la siguiente línea proporciona el array con n enteros aleatorios. Me encontré con un problema con n = 4 cambiando después de mi primer bucle for al responder la pregunta, así que he estado jugando con él para tratar de entenderlo.

En este momento, simplemente estoy tratando de escanear los números de entrada de muestra pero n sigue cambiando una vez que he escaneado el último elemento de la matriz:

“` c++
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
int n, arr[n];
scanf("%d", &n);
printf("%d \n", n);
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
printf("%d ", arr[i]);
printf("n=");
printf("%d ", n);
}
printf("\n%d", n);
return 0;
}
“`

lo que me da la siguiente salida:

4 \
1 n=4 4 n=4 3 n=4 2 n=2 \
2

¿Alguien puede explicar por qué n cambia a un 2 después del último bucle y se mantiene como n = 2 para todos los usos posteriores? ¿Cómo se ve afectado cuando no lo he asignado a nada? Esta es la única entrada de muestra que me dan como práctica, pero prueban mucho más con 1 <= n <= 1000 después de que lo envío y quiero entenderlo sin hacer trampa.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema en el código es que la variable n se declara como int n, arr[n] antes de que se le asigne un valor a través de scanf("%d", &n). Esto crea un arreglo arr con un tamaño indeterminado, ya que n aún no ha sido inicializado.

    Para solucionar esto, podemos declarar arr después de que se haya asignado un valor a n:

    #include <cmath>
    #include <cstdio>
    #include <vector>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    int main()
    {
        int n;
        scanf("%d", &n);
        int arr[n];
        printf("%d \n", n);
        for (int i = 0; i < n; i++) {
            scanf("%d", &arr[i]);
            printf("%d ", arr[i]);
            printf("n=%d ", n);
        }
        printf("\n%d", n);
        return 0;
    }
    

    Esto inicializará correctamente el arreglo arr con el tamaño n, y debería solucionar el problema de que n cambie a 2 después del último ciclo.

Comments are closed.