Ir al contenido


Foto

[RESUELTO] Dudas básicas sobre el uso de return e IF


  • Por favor identifícate para responder
6 respuestas en este tema

#1 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 31 agosto 2010 - 07:15

Hola muchachos,

Disculpen mi preguntonta pero ya estoy dudando feo sobre un código que tengo...
No tengo conocimientos en C y ese es el problema. Ya estoy confundido...

Cuando tengo algo como:



cpp
  1. return algo;



En una función se provoca la finalización de la función regresando el valor de "algo" ¿no es así? Es decir... ¿Vendría a ser como una mezcla de result y Exit de Delphi?:



delphi
  1. result := algo;
  2. Exit;



¿Por más que tengo algo como esto?:



cpp
  1. if (condicion)
  2.   return algo;
  3. otras sentencias...



Ahora... yendo al tema del IF, ¿cuando se tiene una sola sentencia no es necesario el uso de llaves { y } no es así? ¿Y como se separa la parte then del else?

Porque tengo esto:



cpp
  1. if (fabs(A - B) < maxAbsoluteError)
  2.   return true;
  3. float relativeError;
  4. if (fabs(B) > fabs(A))
  5.   relativeError = fabs((A - B) / B);
  6. else
  7.   relativeError = fabs((A - B) / A);
  8. if (relativeError <= maxRelativeError)
  9.   return true;
  10. return false;



Y me hago bolas... ando dudando... ¿Las instrucciones desde la declaración de relativeError están fuera del IF o pertenecen a la parte then de éste?

Les agradecería que me sacaran estas dudas básicas.

Saludos,
  • 0

#2 Jagluiperd

Jagluiperd

    Member

  • Miembros
  • PipPip
  • 36 mensajes
  • LocationBuscando a Wally

Escrito 31 agosto 2010 - 07:32

Así es como yo lo veo:



cpp
  1. if (fabs(A - B) < maxAbsoluteError) return true;
  2. -------------------------------------------------------
  3. float relativeError;
  4. -------------------------------------------------------
  5. if (fabs(B) > fabs(A))
  6.   relativeError = fabs((A - B) / B);
  7.   else
  8.     relativeError = fabs((A - B) / A);
  9. -------------------------------------------------------
  10. if (relativeError <= maxRelativeError) return true;
  11. -------------------------------------------------------
  12. return false;



Saludos.
  • 0

#3 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 31 agosto 2010 - 07:56

Efectivamente asi es como lo estaba entendido inicialmente Jagluiperd. La traducción al código en Delphi que había hecho es esta:



delphi
  1. var relativeError: double;
  2. begin
  3. if Abs(A - B) < maxAbsoluteError
  4.   then begin
  5.           result := true;
  6.           Exit;
  7.         end;
  8. if Abs(B) > Abs(A)
  9.   then relativeError := Abs((A - B) / B)
  10.   else relativeError := Abs((A - B) / A);
  11.  
  12.  
  13. if relativeError < maxRelativeError
  14.   then result := true
  15.   else result := false;
  16. end;



Pero luego de ver más código ya me agarró la cosa y empecé a dudar de lo poco que conozco de C... empecé a preguntarme si los siguientes IFs son parte del then del primero... si return provocaba o no la finalización... etc.

Saludos,
  • 0

#4 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 31 agosto 2010 - 08:55

Optimizando un poquitin el código anterior:



delphi
  1. var relativeError: double;
  2. begin
  3. Result :=  (Abs(A - B)) < maxAbsoluteError;
  4.   if Result then
  5.   Exit;
  6.   if (Abs(B)) > (Abs(A)) then
  7.     relativeError := Abs((A - B) / B)
  8.   else
  9.     relativeError := Abs((A - B) / A);
  10. Result :=  relativeError < maxRelativeError;
  11. end;


  • 0

#5 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 31 agosto 2010 - 09:26

Pues si, se puede optimizar el código.  ;)

El asunto es si yo estaba entendiendo bien C o estoy errando en algo.

Saludos,
  • 0

#6 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 01 septiembre 2010 - 01:26

Veo que la duda está resuelta, pero me gustaría ahondar un poco en este tema para mostrar las posibilidades de ese código en C.

La versión mas similar a la última dada en delphi sería esta, se entiende bastante bien:


cpp
  1.  
  2.   if (fabs(A - B) < maxAbsoluteError) return true;
  3.  
  4.   float relativeError;
  5.   if (fabs(B) > fabs(A))
  6.     relativeError = fabs((A - B) / B);
  7.   else
  8.     relativeError = fabs((A - B) / A);
  9.  
  10.   return relativeError <= maxRelativeError;



Un paso mas en la contracción del código no se entiende tanto, pero es posible usando el operador ?: expresado como E1 ? E2 : E3. Mirad el ejemplo:


cpp
  1.   if (fabs(A - B) < maxAbsoluteError) return true;
  2.   float relativeError = fabs(B) > fabs(A) ? fabs((A-B)/B) : fabs((A-B)/A);
  3.   return relativeError <= maxRelativeError;



Lo siguiente es todavía mas críptico pero tremendamente resumido:


cpp
  1.   if (fabs(A - B) < maxAbsoluteError) return true;
  2.   return (fabs(B) > fabs(A) ? fabs((A-B)/B) : fabs((A-B)/A)) <= maxRelativeError;




Saludos.
  • 0

#7 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 01 septiembre 2010 - 08:23

Hola,

Vaya... no pensé que podría ponerse más críptica la cosa. Ya estaba pensando que tenía que sacarme un Master en criptografía para entenderlo  :D

Yo mejor me quedo con la sintaxis de Delphi.
Pongo como resuelto al hilo, y quito el modo paranoico de mi cabeza.

Saludos,
  • 0




IP.Board spam blocked by CleanTalk.