elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  Operación aritmética
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Operación aritmética  (Leído 2,780 veces)
WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.589


Sin conocimiento no hay espíritu


Ver Perfil WWW
Operación aritmética
« en: 20 Diciembre 2007, 09:23 am »

Hola.
Tengo el siguiente caso:

$operacion = "1+5-8/7";

Y necesito que me haga la operación completa y que me la imprima en pantalla, quería saber si existe alguna función que lo haga automaticamente o no para ver la posibilidad de separar numeros de simbolos e ingeniarmela para que realize cada operación necesaria.

Se supone que $operación debería ir en una variable, o sea que verías un formulario donde diga "ingrese la operación" y escribes 1+5-8/7 y al dar enter debría aparecer el resultado.


En línea

Ertai
Colaborador
***
Desconectado Desconectado

Mensajes: 2.025


Ralph Wiggum


Ver Perfil
Re: Operación aritmética
« Respuesta #1 en: 20 Diciembre 2007, 12:28 pm »

Código
  1. $op = "1+5-8/7";
  2. $res = eval('return ' . $op . ';');
  3.  


« Última modificación: 20 Diciembre 2007, 12:30 pm por Ertai » En línea

Si la felicidad se comprara, entonces el dinero sería noble.

Código:
void rotar_by_ref(int& a, int& b) {
   /* Quien dijo que no se podia sin una variable temporal? */
   *a = *a ^ *b;
   *b = *a ^ *b;
   *a = *a ^ *b;
}
WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.589


Sin conocimiento no hay espíritu


Ver Perfil WWW
Re: Operación aritmética
« Respuesta #2 en: 20 Diciembre 2007, 20:37 pm »

Gracias, abusando un poco mas... como cuento la cantidad de caracteres de $op?
Intenté con $n = count($op); pero me arroja uno ya que no es un array a pesar que puedo tomarlo como si lo fuera $op[0] $op[1].
En línea

дٳŦ٭
GNU/Linux Infrastructure Specialist
Ex-Staff
*
Desconectado Desconectado

Mensajes: 5.110


Ver Perfil WWW
Re: Operación aritmética
« Respuesta #3 en: 20 Diciembre 2007, 20:39 pm »

Gracias, abusando un poco mas... como cuento la cantidad de caracteres de $op?
Intenté con $n = count($op); pero me arroja uno ya que no es un array a pesar que puedo tomarlo como si lo fuera $op[0] $op[1].

Pues dividelo por medio de los caracteres aritmeticos, lo haces array y después le pasas un foreach  ;)
En línea

WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.589


Sin conocimiento no hay espíritu


Ver Perfil WWW
Re: Operación aritmética
« Respuesta #4 en: 20 Diciembre 2007, 21:48 pm »

Ya lo tengo en parte solucionado pero ahora quiero eliminar los acentos del texto y no resulta :P
Código
  1. $texto = str_replace("á","a",$texto);
  2. $texto = str_replace("é","e",$texto);
  3. $texto = str_replace("í","i",$texto);
  4. $texto = str_replace("ó","o",$texto);
  5. $texto = str_replace("ú","u",$texto);

Lo que sucede es que estoy creando un script llamado Lógica donde le preguntas cosas como "Cuantas manzanas son dos + tres y le quitas 5???, después le sumas una y lo multiplicas por 2." y te responde "2". Es para probar que el sistema que algunos tienen en blogs y foros como vbulletin que te preguntan... "cuanto es 1 + tres" no sirven.

Código
  1. <?
  2.  
  3. ##################################################
  4. # Archivo : lg.php #
  5. # Nombre : Lógica #
  6. # Version : 1.5 Beta   #
  7. # Autor   : WHK         #
  8. ##################################################
  9.  
  10. // Declaraciones =======================================
  11. $lg_pregunta = $_GET["pregunta"];
  12. $lg_pregunta_cf = htmlspecialchars($lg_pregunta, ENT_QUOTES);
  13. $lg_version = "L&oacute;gica 1.5 Beta";
  14. $lg_header = "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">
  15. <html>
  16. <head>
  17. <title>$lg_version</title>
  18. </head>
  19. <body style=\"color: rgb(255, 255, 255); background-color: rgb(102, 0, 0);\" alink=\"white\" link=\"white\" vlink=\"white\">
  20. <div style=\"text-align: center;\">
  21. <big>
  22. <span style=\"font-weight: bold;\"><a href=\"?\">$lg_version by WHK</a></span>
  23. </big><br /></div>";
  24. $lg_footer = "</body>
  25. </html>";
  26. // =====================================================
  27.  
  28. // Funciones ===========================================
  29. // Eliminar caracteres innecesarios --------------------
  30. function limpiar($texto){
  31. $texto = str_replace(" un","1",$texto);
  32. $texto = str_replace(" una","1",$texto);
  33. $texto = str_replace(" uno","1",$texto);
  34. $texto = str_replace("una ","1",$texto);
  35. $texto = str_replace("uno ","1",$texto);
  36. $texto = str_replace("un ","1",$texto);
  37. $texto = str_replace(" ","",$texto);
  38. $texto = str_replace("á","a",$texto);
  39. $texto = str_replace("é","e",$texto);
  40. $texto = str_replace("í","i",$texto);
  41. $texto = str_replace("ó","o",$texto);
  42. $texto = str_replace("ú","u",$texto);
  43. $texto = str_replace("<","(",$texto);
  44. $texto = str_replace(">",")",$texto);
  45. $texto = str_replace("mas","+",$texto);
  46. $texto = str_replace("menos","-",$texto);
  47. $texto = str_replace("x","por",$texto);
  48. $texto = str_replace("multiplicadopor","*",$texto);
  49. $texto = str_replace("multiplicaspor","*",$texto);
  50. $texto = str_replace("multiplicandopor","*",$texto);
  51. $texto = str_replace("multiplicaraspor","*",$texto);
  52. $texto = str_replace("divididopor","/",$texto);
  53. $texto = str_replace("partidopor","/",$texto);
  54. $texto = str_replace("por","*",$texto);
  55. $texto = str_replace("divid","/",$texto); // dividimos, divide, divido, dividirás, etc.
  56. $texto = str_replace("multiplic","*",$texto); // multiplicamos, multiplica, multiplico, multiplicarás, etc.
  57. $texto = str_replace("part","/",$texto); // partido, partirás, partiremos, partidas, partelo, etc.
  58. $texto = str_replace("resta","-",$texto); // resta, restale, restaremos, le restarás, etc.
  59. $texto = str_replace("quita","-",$texto); // quita, quitas, quitale, etc.
  60. $texto = str_replace("saca","-",$texto); // saca, sacale, sacas, etc.
  61. $texto = str_replace("suma","+",$texto); // suma, sumale, le sumamos, sumaremos, sumarás, etc.
  62. $texto = str_replace("iguala","=",$texto); // es igual a, es igual?, etc.
  63. $texto = str_replace("punt",".",$texto); // punto, puntoy.. etc.
  64. $texto = str_replace("coma",".",$texto); // coma.
  65. $texto = str_replace("abreparenteci","(",$texto); // abre parentecis
  66. $texto = str_replace("abresparenteci","(",$texto); // abres parentecis
  67. $texto = str_replace("ncaparenteci","(",$texto); // inicia parentecis
  68. $texto = str_replace("ncasparenteci","(",$texto); // inicias parentecis
  69. $texto = str_replace("cerraparenteci",")",$texto); // cierra parentecis
  70. $texto = str_replace("cerrasparenteci",")",$texto); // cierras parentecis
  71. $texto = str_replace("termnaparenteci",")",$texto); // termina parentecis
  72. $texto = str_replace("termnasparenteci",")",$texto); // terminas parentecis
  73. $limpiar = array("*","/","+","-", "(", ")", ".", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9");
  74. for ($n=0; $n < 300; $n++) {
  75.  $a=0;
  76.  $b=count($limpiar);
  77.  
  78.  while($a<=$b){
  79.  
  80.   if ($texto[$n] == $limpiar[$a]){ $out = $out.$texto[$n]; }
  81.   $a++;
  82.  
  83.  }
  84. }
  85. return $out;
  86.  
  87. }
  88. // -----------------------------------------------------
  89.  
  90. // Reemplaza letras por números ------------------------
  91. // Función creada por WHK.
  92. function char2num($texto){
  93. $texto = str_replace("b","v",$texto);
  94. $unidad = array("cero","", "dos", "tres", "cuatro", "cnco","ses","sete","ocho","nueve");
  95. /*
  96.  $decena = array("die","veint", "treinta", "cuarenta", "cincuenta","sesenta","setenta","ochenta","noventa");
  97.  $centena = array("cien","sien"); // $numero.$centena
  98.  $unidad_de_mil = "mil"; // $numero.$unidad_de_mil
  99.  $unidad_de_millon = "millon"; // millón, millones, etc. $numero.$unidad_de_millon
  100.  $unidad_de_billon = "billon"; // billón, billones, etc. $numero.$unidad_de_billon
  101. */
  102. $a=0;
  103. $b=count($unidad);
  104.  
  105. while($a<=$b){
  106.  
  107.  $texto = str_replace($unidad[$a],$a,$texto);
  108.  $a++;
  109.  
  110. }
  111. return $texto;
  112.  
  113. }
  114. // -----------------------------------------------------
  115.  
  116. // Procesar todo ---------------------------------------
  117. function procesar($texto){
  118. $texto = char2num($texto);
  119. $texto = limpiar($texto);
  120. return $texto;
  121. }
  122. // -----------------------------------------------------
  123.  
  124. // Responder -------------------------------------------
  125. function responde($texto){
  126. $texto = procesar($texto);
  127. $texto = @eval('return '.$texto.';');
  128. return $texto;
  129. }
  130. // -----------------------------------------------------
  131. // =====================================================
  132.  
  133.  
  134. // Index ===============================================
  135. echo "$lg_header
  136. <br /><br /><center>
  137. <u>Descripci&oacute;n y uso</u><br />
  138. $lg_version consiste en calcular operaciones aritm&eacute;ticas como por ejemplo <br />
  139. <b><i>\"Cuantas manzanas son dos + tres y le quitas 5???, despu&eacute;s le sumas una y lo multiplicas por 2.\"</i></b><br />
  140. y deber&iacute;a darte como resultado \"2\". Por el momento solo puede reconocer palabras unitarias como por<br />
  141. ejemplo un, uno, dos, nueve, etc. Tambi&eacute soporta parentecis escribiendolos directamente o diciendo<br />
  142. abre parentesis, inicia parentecis, cierra parentecis, etc. Los caracteres < y > ser&aacute;n considerados parentesis.
  143. Mientras est&eacute; en fase beta intenta no finalizar con un punto porque es tomado como decimal.<br /><br />
  144. <form method=\"GET\">
  145.  
  146. <input type=\"text\" name=\"pregunta\" size=\"100\" value=\"";
  147. if($lg_pregunta){
  148. echo $lg_pregunta_cf;
  149. } else {
  150. echo "Cuantas manzanas son dos + tres y le quitas 5???, despu&eacute;s le sumas una y lo multiplicas por 2.";
  151. }
  152.  
  153. echo "\"><br /><input type=\"submit\" value=\"Preguntar\"></form>";
  154. if($lg_pregunta){
  155. echo "<br />Respuesta: ".responde($lg_pregunta);
  156. }
  157. echo "</center>$lg_footer";
  158. // =====================================================
  159. ?>

Está algo cutre pero es lo que se me ocurrió :P
Por ahora solo le enseñé a calcular unidades pero después le enseñaré decenas y centenas sumando resultados por ejemplo mil veintiuno o mil veinte y uno retornará 1000 + 20 + 1.

Tengo que eliminar algunas cosas como los textos omitidos en la función limpiar ya que al final se limpian igual, pero no puedo sacar las tildes XD.

Si te fijas donde dice  for ($n=0; $n < 100; $n++) { debería ir la cantidad de caracteres para hacer el filtro de exepciones asi que mientras tanto solo se limita a una pregunta de 100 caracteres.

Acá dejo el demo:
http://lab.jccharry.com/proyectos/lg/
Aunque no quiero hacerlo público todavía hastaque esté terminado.
« Última modificación: 21 Diciembre 2007, 00:16 am por WHK » En línea

WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.589


Sin conocimiento no hay espíritu


Ver Perfil WWW
Re: Operación aritmética
« Respuesta #5 en: 20 Diciembre 2007, 23:20 pm »

Para evitar problemas voy a crear un filtro que me elimine los simbolos operativos que se encuentren al final del texto si este no termina en número.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines