Ayuda con ejercicio

Iniciado por NicolasPileci, 19 Junio 2018, 02:45 AM

0 Miembros y 2 Visitantes están viendo este tema.

NicolasPileci

Estimados,
buenas noches.

Estoy intentando crear un programa que me imprima el mayor elemento de un vector:

#include <stdio.h>
#include <stdlib.h>

int buscarMayor(int *p);

int main()
{
    system("color 0a");
    int vec[5] = {1, 4, 5, 2, 2},
        mayor;
    mayor = buscarMayor(vec);
    printf("El mayor es: %d", mayor);
    return 0;
}

int buscarMayor(int *p)
{
    int may = *p;
    while(*p)
        if (*p > may)
            may = *p;
        p++;
    return may;
}


El código compila bien pero al ejecutarlo el programa queda en negro y no sucede nada.

Muchas gracias!

kub0x

Citar
El código compila bien pero al ejecutarlo el programa queda en negro y no sucede nada.

El problema es que tienes un bucle infinito en buscarMayor, el while no tiene llaves "{" por lo tanto solo ejecuta el if y nunca incrementará la posición del puntero del vector.

El segundo problema es que haces while(*p), ¿qué te asegura que el vector p en la memoria de la pila, después de 5 posiciones contenga un 0? Normalmente contendrá información arbitraria, lo mejor es decirle al algoritmo que recorra 5 posiciones, es decir el número de elementos del vector.

Así conseguirás que funcione:


#include <stdio.h>
#include <stdlib.h>
     
    int buscarMayor(int *p, int n);
     
    int main()
    {
        int vec[5] = {1, 4, 5, 2, 2},
            mayor;
        mayor = buscarMayor(vec,5);
        printf("El mayor es: %d", mayor);
        return 0;
    }
     
    int buscarMayor(int *p, int n)
    {
        int may = *p;
        while(--n){
            if (*p > may)
                may = *p;
            p++;
        }
        return may;
    }


Saludos.
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate


dijsktra

#2
Cita de: kub0x en 19 Junio 2018, 03:41 AM

...
Así conseguirás que funcione:


#include <stdio.h>
#include <stdlib.h>
   
   int buscarMayor(int *p, int n);
   
   int main()
   {
       int vec[5] = {1, 4, 5, 2, 2},
           mayor;
       mayor = buscarMayor(vec,5);
       printf("El mayor es: %d", mayor);
       return 0;
   }
   
   int buscarMayor(int *p, int n)
   {
       int may = *p;
       while(--n){
           if (*p > may)
               may = *p;
           p++;
       }
       return may;
   }


Saludos.

Aún est mal. Valga el contraejemplo:

       int vec[5] = {1, 4, 2, 2, 5}

Devolverá 4, cuando el mayor es el 5.

Sólo hay que hacer un pequeño cambio,

      int may = *p++;  // mind the post-increment

O alternativamente, anticipar el incremento de p en el cuerpo

int buscarMayor( int *p, int n)
{
 int may = *p;
 while(--n){
   if (*++p > may) // mind the pre-increment
     may = *p;
 }
 return may;
}


Si la depuración es el proceso de eliminar fallos en el software, entonces programar debe ser el proceso de ponerlos dentro. (Edsger Dijsktra)

kub0x

Así es, al pre decrementar n, tomará 4 iteraciones y en "0" sale del while dejando el último elemento del vector sin evaluar. La solución propuesta es tomar "may" como el primer elemento y empezar a recorrer el array desde el 2º elemento en busca del mayor.

Saludos.
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate


NicolasPileci

Muchas gracias a ambos!

Saludos.