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.