Determinar el Mayor de cinco numeros

Iniciado por Omaredy09, 3 Agosto 2018, 04:31 AM

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

Omaredy09

Mi profesor nos dejo hacer una funcion en c++ que determine el mayor de cinco numeros. De antemano les comento que él no quiere que usemos arrays, él quiere que intentemos hacer un mecanismo con bucles e intentar no usar demasiados condicionales. Ciertamente lo veo algo complicado, no se como hacerlo sin usar varios condicionales. Les agradeceria que me aconsejaran o me dieran ideas para resolver el problema. Gracias de antemano :D por su tiempo.
http://www.subirimagenes.com/privadas-imagenproblema-2438045.html
Ese es link de la imagen, por si quieren verla



K-YreX

Ya que no puedes usar un array para resolver este problema, una posible solución es crear una función auxiliar con dos parámetros y usarla en tu función.
Quedaría algo de este estilo:

Código (c++) [Seleccionar]

int Mayor (int a, int b){
    int mayor = a;
    if (b > mayor)
        mayor = b;
    return mayor;
}

int Mayor (int n1, int n2, int n3, int n4, int n5){
    int mayor = Mayor (Mayor (n1, n2), Mayor (n3, n4));
    mayor = Mayor (mayor, n5);
    return mayor;
}


Ambas funciones pueden tener el mismo nombre porque el número de parámetros es distinto.
Si tienes alguna duda al respecto puedes buscar información sobre la sobrecarga de funciones.

Al llamar a la función Mayor desde la propia función se resuelven primero las funciones interiores y finalmente la exterior.
Como faltaría por comprobar un número lo he comprobado en otra línea aunque se podría hacer todo a la vez.
Queda un poco ilegible el código pero puedes probar a hacerlo.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

MAFUS

#2
Quédate con tu profesor:
int mayor(int n1, int n2, int n3, int n4, int n5) {
   int mayor = n1;
   for(int *p=&n2; p<=&n5; ++p)
       if(*p > mayor)
            mayor = *p;
   return mayor;
}

engel lex

#3
Cita de: MAFUS en  4 Agosto 2018, 02:58 AM
Quédate con tu profesor:
int mayor(int n1, int n2, int n3, int n4, int n5) {
   int mayor = n1;
   for(int *p=&n2; p<=&n5; ++p)
       mayor = *p;
   return mayor;
}


cuidado con ese codigo, nada te asegura que se cargue en memoria de n1 a n5 en orden, revisa los posts sobre los indeterminados de la forma de carga

int a = 1;
printf("%i, %i, %i, %i, %i", ++a, a++, a++, ++a, a);
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

MAFUS

Cierto, no se asegura que se carguen en ese orden, pero sí que serán contiguos en memoria. Por lo cual es igual el orden en que se carguen porque a la hora de crear el marco de la función siempre ocuparán los mismos espacios en el marco.

Por cierto, he modificado un poco el código: no tenía en cuenta si el elemento actual era mayor a 'mayor'.

engel lex

#5
Cita de: MAFUS en  4 Agosto 2018, 03:10 AM
Cierto, no se asegura que se carguen en ese orden, pero sí que serán contiguos en memoria. Por lo cual es igual el orden en que se carguen porque a la hora de crear el marco de la función siempre ocuparán los mismos espacios en el marco.


es decir, n2 puede cargarse de ultimo, por lo que generará un acceso invalido de memoria y no me refiero en tiempo de ejecución, me refiero en la forma que los elementos se cargan a la pila para procesar
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

MAFUS

#6
La convención cdecl, que es la estándar en C y C++, dice que los argumentos se pasarán de derecha a izquierda, que con esto no hay que confundir con que los argumentos de una llamada se pueden evaluar en el orden que el compilador prefiera.

Si se dejara que cada vez que se hace una llamada el orden del paso de los argumentos pudiera cambiar esta información se debería guardar en algún sitio para saber la función llamada dónde buscar esos argumentos, o se debería usar algo parecido a reflections en otros lenguajes, cosa que en C no existe. Los nombres de las variables desaparecen. En el stackframe solo queda el xBP y el offset, y esto debe estar escrito a fuego en el código máquina, por tanto el orden tiene que estar perfectamente definido, sea cual sea la convención de llamada que se use. Que por cierto, el código que he pasado no funcionará con cualquier convención que use registros.

CalgaryCorpus

Basado en el requerimiento original, y pensando de lo que nos dice que el profesor querria restringir el uso de arreglos, tal vez se trate de un curso introductorio y ni siquiera las funciones han sido vistas aun. En ese caso, la solucion propuesta no serviria tampoco.

Como no hay muchas pistas, adivino que solo se puede usar while y los datos se leen uno tras otro, quedando algo asi como:


   leer numero
   maximo = numero

   repetir 4 veces {
       leer numero
       si el numero > maximo -> maximo = numero
   }

   imprimir maximo


No hay uso de arreglos, no hay paso de parametros ni funciones, solo lectura de un entero en 5 ocasiones, actualizando el maximo cuando corresponde.

Aqui mi perfil en LinkedIn, invitame un cafe aqui