3

Hola a todos miren es que trato de resolver un problema con arreglos de menor y mayor y sacar su diferencia pero... el programa define bien el elemento mayor pero no el menor asi es el arreglo

2 5 3 7 12 9 8 5 4 10

Define bien el mayor que en este caso es el 12

El menor lo define mal que imprime 10 y se supone que debe ser 2

Es el siguiente codigo

 #include<iostream>
 #define MAX 10002
 using namespace std;

int arr[MAX];
int mayor=arr[0], menor=arr[0];
int diferencia=0;

int main()
{
    for(int i=1; i<=10; i++)
    {
        cin>>arr[i];

        if(arr[i]>mayor)
        {
            mayor=arr[i];
        }

        if(arr[i]<menor);
        {
            menor=arr[i];
        }
    }
    cout<<menor<<" "<<mayor;
}

Si alguien me puede ayudar se lo agradecería mucho

Trauma
  • 25,297
  • 4
  • 37
  • 60
carlos
  • 39
  • 2
  • Te lo he editado un poco, para usar cabeceras estándar por si alguien quiere probarlo. Espero que no te moleste :-) – Trauma Sep 29 '18 at 18:13

3 Answers3

3

Vayamos por partes:

int arr[MAX];
int mayor=arr[0], menor=arr[0];

En este momento, el contenido de arr[0] es desconocido. Puede ser cualquier cosa, porque no has inicializado el array.

Como no sabemos ese valor, igual resulta que mayor ya es mayor que cualquiera de los elementos que pongas(y no cambiaría en las iteraciones). O menor es menor que cualquiera de tus elementos (y no cambiaría en las iteraciones).

Por ejemplo, si menor empieza siendo 0, ninguno de los elementos de tu ejemplo lo reemplazaría. menor tiene que ser tan alto que estés seguro de que vas a encontrar un valor menor, mayor tan bajo que estés seguro de que vas a encontrar un valor mayor.

int diferencia=0;
int main() {
  for(int i=1; i<=10; i++)
  {
    cin>>arr[i];

Si no necesitas guardar los datos, realmente no necesitas un array. Si haces int numero; cin >> numero; funciona exactamente igual.

Naturalmente, en las líneas siguientes tendrías que cambiar arr[i] por numero.

    if(arr[i]>mayor) {
        mayor=arr[i];
    }
    if(arr[i]<menor);

Tienes un ;, así que el if termina en la línea de arriba y el bloque de abajo se ejecuta siempre.

    {
        menor=arr[i];
    }
}
cout<<menor<<" "<<mayor;

La impresión es liosa porque se confunde con los datos de la última línea. Creo que eso es parte del problema; es mucho mejor: cout << endl << "Menor :" << menor << endl << "Mayor: " << mayor << endl;

}
eferion
  • 49,291
  • 5
  • 30
  • 72
SJuan76
  • 10,771
  • 5
  • 17
  • 31
  • No termino de compartir eso de usar `endl` de forma indiscriminada... además la respuesta, tal y como está descrita, se me antoja un poco complicada de seguir – eferion Oct 02 '18 at 05:58
  • Además, los arrays estáticos **sí** se inicializan. En el código que nos ocupa, tanto `mayor` como `menor` valen 0. – eferion Oct 02 '18 at 06:01
3

Cuando empiezas a programar es muy normal que se escapen algunos detallitos pero ya una vez que llevas tiempo te percatas de ciertos detalles, tu error esta en que pusiste un ; donde no debería ir uno.

  #include<iostream>
  #define MAX 10002
  using namespace std;

  int arr[MAX];
  int mayor=arr[0], menor=arr[0];
  int diferencia=0;

int main()
{
    for(int i=1; i<=10; i++)
    {
        cin>>arr[i];

        if(arr[i]>mayor)
        {
            mayor=arr[i];
        }

        if(arr[i]<menor); <---- precisamente aquí
        {
           menor=arr[i];
        }
    }
    cout<<menor<<" "<<mayor;
}
eferion
  • 49,291
  • 5
  • 30
  • 72
CodeHero
  • 161
  • 10
0

Básicamente el programa tiene dos errores. Uno ya te lo han indicado y es que se te ha colado un ; después de un if:

if(arr[i]<menor);
//              ^

Ese punto y coma hace que el if no haga absolutamente nada... detalles tontos del lenguaje. Para verlo más claramente podríamos sustituir ese punto y coma por dos llaves:

if(arr[i]<menor){ }
{
  menor = arr[i];
}

Ahora se ve mejor que ese punto y coma anula el condicional.

Por otro lado la inialización de menor no es correcta.

Los arrays globales se inicializan automáticamente, no así aquellos que pertenecen a una función. Es decir:

int arr[MAX]; // Todos sus elementos valen 0
              // Pero únicamente porque es variable global!!!

int main()
{
  int arr2[MAX]; // Array no inicializado!!!
}

Pues bien, lo siguiente que haces después de declarar el arreglo es declarar e inicializar mayor y menor:

int mayor=arr[0], menor=arr[0];

Y aquí empiezan los problemas... esta inicialización hace que mayor=menor=0. Si posteriormente le damos valores a arr[0], el valor de mayor y menor no va a cambiar automáticamente. Su valor de partida va a ser siempre 0.

Esta inicialización nos plantea un problema y es que para que menor encuentre el número más pequeño, el mismo deberá ser igual o menor que 0. De no ser así el programa no va a funcionar.

Para evitar este jaleo de mínimos y máximos yo utilizaría punteros:

int* mayor = arr;
int* menor = arr;

for(int i=0; i<MAX; i++)
{
    cin>>arr[i];

    if(arr[i] > *mayor)
    {
        mayor = &arr[i];
    }

    if(arr[i] < *menor)
    {
       menor = &arr[i];
    }
}

cout << *menor << ' ' << *mayor;

Esta solución usa punteros en vez de variables. Así, menor no almacena un valor propio, sino que apuntará al elemento más pequeño (lo mismo para mayor).

Si usar punteros no es una posibilidad, entonces hay que prestar especial atención a la inicialización de menor y mayor. Tirando del estándar lo mejor es usar std::numeric_limits:

int menor = std::numeric_limits<int>::max();
int mayor = std::numeric_limits<int>::min();

Lo que hacemos aquí es inicializar menor con el número más grande que puede almacenarse en un int, de esta forma cualquier número que introduzca el usuario será igual o más pequeño y, en consecuencia, el algoritmo será capaz de detectarlo como más pequeño. En mayor, en cambio, almacenamos el número más pequeño posible, de tal forma que cualquier número que introduzca el usuario sea igual o más grande.

eferion
  • 49,291
  • 5
  • 30
  • 72