Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Omaredy09 en 3 Agosto 2018, 04:31 am



Título: Determinar el Mayor de cinco numeros
Publicado por: Omaredy09 en 3 Agosto 2018, 04:31 am
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

(http://s2.subirimagenes.com/privadas/previo/thump_2438045imagen-problema.png)


Título: Re: Determinar el Mayor de cinco numeros
Publicado por: K-YreX en 4 Agosto 2018, 01:28 am
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
  1. int Mayor (int a, int b){
  2.    int mayor = a;
  3.    if (b > mayor)
  4.        mayor = b;
  5.    return mayor;
  6. }
  7.  
  8. int Mayor (int n1, int n2, int n3, int n4, int n5){
  9.    int mayor = Mayor (Mayor (n1, n2), Mayor (n3, n4));
  10.    mayor = Mayor (mayor, n5);
  11.    return mayor;
  12. }
  13.  

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.


Título: Re: Determinar el Mayor de cinco numeros
Publicado por: MAFUS en 4 Agosto 2018, 02:58 am
Quédate con tu profesor:
Código
  1. int mayor(int n1, int n2, int n3, int n4, int n5) {
  2.    int mayor = n1;
  3.    for(int *p=&n2; p<=&n5; ++p)
  4.        if(*p > mayor)
  5.            mayor = *p;
  6.    return mayor;
  7. }


Título: Re: Determinar el Mayor de cinco numeros
Publicado por: engel lex en 4 Agosto 2018, 03:06 am
Quédate con tu profesor:
Código
  1. int mayor(int n1, int n2, int n3, int n4, int n5) {
  2.    int mayor = n1;
  3.    for(int *p=&n2; p<=&n5; ++p)
  4.        mayor = *p;
  5.    return mayor;
  6. }

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

Código
  1. int a = 1;
  2. printf("%i, %i, %i, %i, %i", ++a, a++, a++, ++a, a);


Título: Re: Determinar el Mayor de cinco numeros
Publicado por: 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.

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


Título: Re: Determinar el Mayor de cinco numeros
Publicado por: engel lex en 4 Agosto 2018, 03:13 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


Título: Re: Determinar el Mayor de cinco numeros
Publicado por: MAFUS en 4 Agosto 2018, 03:52 am
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.


Título: Re: Determinar el Mayor de cinco numeros
Publicado por: CalgaryCorpus en 5 Agosto 2018, 05:05 am
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:

Código
  1.   leer numero
  2.   maximo = numero
  3.  
  4.   repetir 4 veces {
  5.       leer numero
  6.       si el numero > maximo -> maximo = numero
  7.   }
  8.  
  9.   imprimir maximo
  10.  

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.