Duda en programa: Mayor, menor y media de n números. [solucionado]

Iniciado por Manimecker, 21 Octubre 2011, 02:58 AM

0 Miembros y 1 Visitante están viendo este tema.

Manimecker

Les cuento, empezé a ver un curso de C/C++ en mi colegio y estoy teniendo problemas con un programa que me dejaron. La función del programa es que debe encontrar el mayor y el menor números de N números que el usuario introduzca, además de sacar la media de todos los números.

Empezé con este código:

#include <stdio.h>

int main()
{
   int N1=1, May, Men, d=1, Cont=0;
   while (N1 != 0)
   {
       printf("Inserta un numero: ");
       scanf("%d", &N1);
       if (d==1)
       {
           May=N1;
           Men=1;
       }
       else
       {
           if (N1==0)
               break;
           else
           {
               if (N1 > May)
               {
                   May=N1;
               }
               if (N1 < Men)
               {
                   Men=N1;
               }
           }
               d++;
               Cont=Cont+N1;
       }

   }
   printf("El numero mayor es %d y el menor es %d. \n La media es: %d.", May, Men, (Cont/d));
}


Sin embargo, me doy cuenta que sólo compara 2 valores y los demás no. Después de buscar un rato en la web, encontre una técnica para encontrar los números mayores y menores, y es inicializar los 2 valores de mayor y menor con un valor mínimo y uno más grande, respectivamente. Me explico, este es el programa con esa técnica, y funciona.


#include <stdio.h>

int main()
{
   int N1=1, May=0, Men=9999999, d=1, Cont=0;
   while (N1 != 0)
   {
       printf("Inserta un numero: ");
       scanf("%d", &N1);
       if (N1==0)
           break;
       else
       {
           if (N1 > May)
           {
               May=N1;
           }
           if (N1 < Men)
           {
               Men=N1;
           }
           d++;        
           Cont=Cont+N1;
       }
   }
   printf("El numero mayor es %d y el menor es %d. \n La media es: %d.", May, Men, (Cont/d));
}


El problema es que no entiendo por qué el primero no funciona y el segundo sí, espero que alguien me pueda orientar.

Gracias de antemano.

do-while

¡Buenas!

En el primer programa tienes un pequeño error de logica, al asignar el primer valor haces bien asignando al maximo ese primer valor, pero a minimo le das como valor 1, por lo tanto, si cualquier otro numero es mayor que uno tendras un falso valor minimo de 1, por lo tanto, tendras que hacer maximo = minimo = primer_valor_introducido.

El segundo codigo es algo horroroso sin pies ni cabeza, ya que si todos los numeros introducidos son negativos tendras a cero como falso maximo y si todos los valores son mayores que el que has estimado tu como minimo tendras un falso minimo, por lo tanto ese codigo es completamente incorrecto ya que no soluciona todos los casos que te podras encontrar.

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

Manimecker

Cita de: do-while en 21 Octubre 2011, 04:17 AM
¡Buenas!

En el primer programa tienes un pequeño error de logica, al asignar el primer valor haces bien asignando al maximo ese primer valor, pero a minimo le das como valor 1, por lo tanto, si cualquier otro numero es mayor que uno tendras un falso valor minimo de 1, por lo tanto, tendras que hacer maximo = minimo = primer_valor_introducido.

El segundo codigo es algo horroroso sin pies ni cabeza, ya que si todos los numeros introducidos son negativos tendras a cero como falso maximo y si todos los valores son mayores que el que has estimado tu como minimo tendras un falso minimo, por lo tanto ese codigo es completamente incorrecto ya que no soluciona todos los casos que te podras encontrar.

¡Saludos!

Muchísimas gracias por tus comentarios, por lo que veo, el segundo código queda omitido.

Ahora, perdona mi ignorancia, pero no sé cómo quedaría el código arreglando el problema lógico que comentas, especialmente la siguiente parte:
maximo = minimo = primer_valor_introducido
Sinceramente no entiendo cómo implementarlo al código.

Perdona mi ignorancia, pero apenas estoy aprendiendo y se me dificulta un poco.

Muchísimas gracias de antemano.

do-while

XD

        if (d==1)
        {
            May=Men=N1;
        }


Asi te aseguras que tento May com Men son valores que has introducido.

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

Manimecker

#4
Cita de: do-while en 21 Octubre 2011, 05:35 AM
XD

        if (d==1)
        {
            May=Men=N1;
        }


Asi te aseguras que tento May com Men son valores que has introducido.

¡Saludos!

Muchas gracias, ya lo había implementado de ese modo, pero no me resultó, por eso decidí consultarte nuevamente.

Desgraciadamente, tengo otro error, el siguiente es el output en la consola:
Código (dos) [Seleccionar]

Inserta un numero: 50
Inserta un numero: 30
Inserta un numero: 5
Inserta un numero: 500
Inserta un numero: 0
El numero mayor es 0 y el menor es 0.
La media es 0.


No puedo ver cuál es el error, y he probado con diferentes maneras.

Te agradezco toda tu ayuda de antemano.

EDIT
------
Después de omitir esta parte:

            if (N1==0)
                break;


Me ejecuta y muestra valores, pero también me toma el valor de 0 como uno válido y no como el signo de salida. Lo raro es que anteriormente se ejecutaba correctamente.

EDIT 2
-----------

Lo he solucionado, el problema era la posición del break, el cual iba al principio.

Todo solucionado, el programa se ejecuta correctamente.

Muchas gracias por tu ayuda do-while :D.