Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Beginner Web en 12 Diciembre 2018, 05:17 am



Título: Dudas acerca de cierres de llaves en if, limite de lineas etc
Publicado por: Beginner Web en 12 Diciembre 2018, 05:17 am
Código
  1. //Alguien me dice porque este codigo funciona asi y..
  2. bool alguna_funcion(estructura a, estructura b)
  3. {
  4. if(condiciones){
  5. if(condiciones)
  6. if(condiciones)
  7. if(condiciones)
  8. return true;
  9. }
  10. else
  11. return false;
  12. }
  13. // ... no asi? por favor :(
  14. bool alguna_funcion(estructura a, estructura b)
  15. {
  16. if(condiciones)
  17. if(condiciones)
  18. if(condiciones)
  19. if(condiciones)
  20. return true;
  21. else
  22. return false;
  23. }
  :huh:


Título: Re: Dudas acerca de cierres de llaves en if, limite de lineas etc
Publicado por: K-YreX en 12 Diciembre 2018, 06:01 am
Personalmente no me funcionan ninguno de los dos correctamente. Quiero decir, ambos me compilan bien pero no se evalúa correctamente.
Esto es porque hay casos sin especificar:
- En ambos casos, si se cumplen todas las condiciones, devuelve <true>.
- En la primera función, si no se cumple la primera condición, devuelve <false>.
- En la segunda función, si se cumplen todas las condiciones menos la última, devuelve <false>.
Esos son los 3 casos que están especificados. El resto de casos no está explícito lo que va a ocurrir.

Lo he probado con una función que retorna un <int> en vez de un <bool> para ver los casos por defecto.
Código
  1. int funcion(int x){
  2.    if(x == 0)
  3.        if(x == 1)
  4.            if(x == 2)
  5.                return 20;
  6.            else
  7.                return 200;
  8. }

(Ya sé que la función es absurda pero nos sirve :xD) Si provoco alguno de los casos en los que no está especificado el valor de retorno, la función retorna el mismo valor que he introducido (x). Usando tus funciones para cada uno de los casos que no está especificado, la función retorna automáticamente <true>. Esto que comento es de forma experimental, no de forma teórica. :-X


Título: Re: Dudas acerca de cierres de llaves en if, limite de lineas etc
Publicado por: Beginner Web en 12 Diciembre 2018, 20:39 pm
Nop entendi  :xD


Título: Re: Dudas acerca de cierres de llaves en if, limite de lineas etc
Publicado por: K-YreX en 12 Diciembre 2018, 21:07 pm
Imagina esta función:
Código
  1. bool funcion(<parametros>){
  2.    if(condicion1)
  3.        if(condicion2)
  4.            return true;
  5.        else
  6.            return false;
  7. }

Situaciones posibles:
- <condicion1 == true> && <condicion2 == true> -> <return true>
- <condicion1 == true> && <condicion2 == false> -> <return false>
- <condicion1 == false>  && <condicion2 == true || condicion2 == false>-> no se ha especificado qué debe devolver la función.

Entonces lo que he podido deducir haciendo pruebas es que cuando ocurre una situación en la que no se ha especificado el valor de retorno, la función devuelve <true> automáticamente.

Este problema al tener 2 condicionales, tiene 2^2=4 posibles situaciones. En 2 de las situaciones tú controlas el valor que se devuelve pero en las otras 2, no. Y en esas 2 que no controlas, se devuelve siempre <true>.

El código que has mandado tú al tener 4 condicionales, tiene 2^4=16 situaciones posibles. En 2 de las situaciones controlas lo que se devuelve, en las otras 14, no. Si ocurre cualquiera de esas 14 situaciones que no has especificado, la función devolverá <true>.

Situaciones que controlas tú:
- En ambas funciones, si se cumplen todas las condiciones, devuelve <true>.
- En la primera función, si no se cumple la primera condición, devuelve <false>.
- En la segunda función, si se cumplen todas las condiciones menos la última, devuelve <false>.

Situaciones que no controlas:
- En la primera función, si se cumple la primera condición pero la segunda no se cumple (por ejemplo). En este caso va a devolver <true>.

No sé si ahora me he explicado mejor o no. Si sigues sin entenderme pregunta lo que no entiendes exactamente a ver si puedo explicar mejor esa parte. :-X


Título: Re: Dudas acerca de cierres de llaves en if, limite de lineas etc
Publicado por: Beginner Web en 12 Diciembre 2018, 21:11 pm
ahh masomenos voy entendiendo lo de los 2^n casos, y suponiendo que quiera validar una hora que va desde 0:00:00 a 23:59:59 esta funcion que devuelve true o false estaria bien o me faltan llaves en el segundo if?  :huh:

Código
  1. bool validar_hora(thora hora)
  2. {
  3. if(hora.hora>=0 && hora.hora<=23){
  4. if(hora.minuto>=0 && hora.minuto<=59)
  5. if(hora.segundo>=0 && hora.segundo<=59)
  6. return true;
  7. }
  8. else
  9. return false;
  10. }


Título: Re: Dudas acerca de cierres de llaves en if, limite de lineas etc
Publicado por: K-YreX en 12 Diciembre 2018, 23:00 pm
Faltan. Piensa que si se cumple el primer <if> entras dentro de ese bloque pero si la segunda condición no se cumple... O si se cumple la segunda también pero la tercera no...
Creo que es una buena práctica crear una variable auxiliar e inicializarla en un valor y así sólo tienes que hacer la mitad de comprobaciones, por ejemplo:
Código
  1. bool validar_hora(thora hora){
  2.    bool valido = true; // asumimos que la hora es valida
  3.    if(hora.hora < 0 || hora.hora > 23 || hora.min < 0 || hora.min > 59 || hora.segundo < 0 || hora.segundo > 59)
  4.        valido = false; // si algun dato se sale de los limites la hora ya no es valida
  5.    return valido; // usando solo un return podemos controlar mas facil lo que se devuelve
  6. }


Título: Re: Dudas acerca de cierres de llaves en if, limite de lineas etc
Publicado por: Beginner Web en 13 Diciembre 2018, 00:35 am
eres lo mas! esta superentendible, ya habia visto esta tecnica en otros posts pero no me gusta evaluar todo en un solo if por tema de que por ahi tengo muchas cosas que evaluar por ejemplo comparar 8 o mas condiciones en lugar de 6 , ni modo tendre que ceder  :laugh:


Título: Re: Dudas acerca de cierres de llaves en if, limite de lineas etc
Publicado por: CalgaryCorpus en 13 Diciembre 2018, 01:13 am
Si el codigo es una sucesion de condiciones que tienen que cumplirse para que sea true y si no se cumple cualquiera de ellas, el valor de verdad deberia ser falso, puede reemplazarlo por 1 return, ningun if, ninguna variable, ninguna asignacion.

Código
  1. bool f() {
  2.   return condicion1 && condicion2 && .... ;
  3. }