Menu

Error critico al interpretar expresiones con los operadores unarios -, +

2016-09-22
2016-10-07
  • Compsystems

    Compsystems - 2016-09-22

    Hola, Zascar
    los operadores unarios (-) & (+) fallan ejemplo

    Algoritmo error_critico_operador_unario
    
        definir a, b, c, d, e, f, g, h como reales
    
        c:=25;
        d:=-5;
        ee:=2;
        b:=-7.5;
        a:=2;
        g:=23;
        h:=5;
        f:=7;
        ii:=1;
        // criterios o casos de evaluación
        // caso 1: las sub-expresiones entre () se evalúan primero e iniciando por las más internas, 
        // caso 1.1: si hay 2 o más pares de () se evalúa de izquierda a derecha
    
        // caso 2: los operadores unarios NEG Y POSITIVO se evalúan en segundo lugar
    
        // caso 3: los operadores binarios multiplicadores *, /, MODULO se evalúan de terceros
        // caso 3.1: si hay 2 o más operadores binarios multiplicativos en una expresión, se evalúa también de izquierda a derecha
    
        // caso 4: los operadores binarios sumadores +, -, se evalúan de cuartos
        // caso 4.1: si hay 2 o más operadores binarios sumadores en una expresión, se evalúa también de izquierda a derecha
    
        // caso 5:  ley de signos
    
        imprimir a * (b + (c/d) / ee) * (f - g MOD h ) // retorna -80 ok
    
        // paso 1: ( c / d ) = 25/-5 = -5 // caso 1 y caso 3
        // paso 2: paso1/ee = -5/2 = -2.5 // caso 3
        // paso 3: ( b + paso2 ) = -7.5+-2.5 = -10 // caso 4 y ley de signos
        // paso 4: g mod h = 23 mod 5 = 3 // caso 1.1 y caso 3
        // paso 5: f - paso4 = 7 - 3  = 4 // caso 4
        // paso 6: a * paso3 = 2*-10 = -20 // caso 3.1 y caso 3
        // paso 7: paso5 * paso6 = -20 * 4 = -80 // caso 3.1 y caso 3
    
        // ahora con los operadores unarios -, + dentro de la expresión
         imprimir +a * -(b + -(c/+d) / -ee) * (f - g MOD h ) * -ii // error =( debe ser -80
    
    
        // paso 1: POSITIVO( d ) = +(-5) = -5 // caso 2 y ley de signos
        // paso 2: ( c / PASO1 ) = 25/-5 = -5 // caso 1 y caso 3
        // paso 3: NEGATIVO( paso2 ) = -(-5) = +5 // caso 2 y ley de signos
        // paso 4: NEGATIVO( ee ) = -(2) // caso 2
        // paso 5: paso3 / paso4 = +5/-2 = -2.5 // caso 3
        // ...
    
    Fin Algoritmo
    
     

    Last edit: Compsystems 2016-09-22
  • Compsystems

    Compsystems - 2016-09-22

    MÉTODOS DE EVALUACIÓN DE EXPRESIONES COMPUTACIONALES

    A: NOTACIÓN INFIJA o terrestre, es la notación natural o la que aprendemos en el colegio, por ejemplo, A + B, los operadores en casi su totalidad están en el MEDIO de los operandos.
    B: NOTACIÓN INVERSA o marciana, notación desconocida pero muy poderosa en sistemas computacionales, ejemplo A B +, los operadores en su totalidad están DESPUÉS de los operandos, usada en las calculadoras serie hp48/49/50 y parcialmente en la HP-PRIME
    C: NOTACIÓN PREFIJA o alienígena, desconocida también pero muy poderosa, + A B, los operadores en su totalidad están ANTES de los operandos, se considera esta notación también como inversa
    Algunos parser (analizador sintáctico de expresiones) para poder interpretar una expresión infija, convierten dicha expresión a RPN/NPI, Notación Polaca Inversa,

    Ejemplo #1 de conversión y evaluación de notación infija a inversa.

    La siguiente expresión en notación infija

    a * (b + (c/d) / ee) * (f - g MOD h)

    convertida en RPN es la siguiente lista de entrada ( note que no hay paréntesis curvos =) )

    { a b c d / ee / + * f g h MOD - * }

    La lista anterior es una secuencia de 15 pasos, que se interpreta como un programa, ahora veamos la lista anterior como una lista vertical o pila de elementos o filas enumeradas (E#), inician con la letra E de Entrada

    E1: a
    E2: b
    E3: c
    E4: d
    E5: /
    E6: ee
    E7: /
    E8: +
    E9: *
    E10: f
    E11: g
    E12: h
    E13: mod
    E14: -
    E15: *
    el evaluador ejecuta línea por línea para obtener el resultado final
    E1: 2, Primer línea de la pila o lista de entrada anterior, que tiene un objeto (a) que es una variable: la variable a se evalúa a 2 y es colocada en un nuevo stack o pila de salida (S#), la primera fila tendría entonces el número 2, como es un número y no un operador o función, prácticamente no hace nada, sino que solo hace una copia
    S1: 2
    E2: -7.5, Segunda línea de la lista de entrada, objeto (b) : la variable b se evalúa a -7.5 y es colocado el valor en la 2da posición de la nueva pila
    S2: -7.5
    E3: 25, Tercer línea, objeto (c) : la variable c se evalúa a 25 y es colocado el valor en la 3ra posición de la nueva pila
    S3: 25
    E4: -5, Cuarta línea, objeto (d) : la variable d se evalúa a -5 y es colocado el valor en la 4ta posición de la nueva pila
    S4: -5
    E5: /, Quinta línea, objeto (/) : el operador binario DIVISIÓN actúa sobre dos argumentos o líneas de la pila, en este caso son los dos últimos de la lista de salida E3 y E4, entonces evalúa 25/-5, retornando -5 y este valor es colocado en la 3ra posición de la nueva pila, ya que la 3ra (S3) y 4ta (S4) ya se utilizaron y la última no utilizada S2, el siguiente valor se almacena en S3
    S3: -5
    E6: ee, Sexta línea, objeto (ee) : la variable ee se evalúa a 2 y es colocado el valor en la 4ta posición de la nueva pila
    S4: 2
    E7: /, Séptima línea, objeto (/) : el operador binario DIVISIÓN actúa sobre dos argumentos o líneas de la pila, en este caso son la S3 y S4, entonces evalúa -5/2, retornando -2.5 y este valor es colocado en la 3ra posición de la nueva pila, ya que S3 y S4 ya se utilizaron
    S3: -2.5
    E8: +, Octava línea, objeto (+) : el operador binario SUMA actúa sobre dos argumentos o líneas de la pila, en este caso son la S2 y S3, entonces se evalúa -7.5+-2.5, retornando -10 y este valor es colocado en la 2da posición de la nueva pila, ya que S2 y S3 ya se utilizaron
    S2: -10
    E8: , Novena línea, objeto () : el operador binario MULTIPLICACIÓN actúa sobre dos argumentos o líneas de la pila, en este caso son la S1 y S2, entonces evalúa 2-10, retornando -20 y este valor es colocado en la 1ra posición de la nueva pila, ya que S1y S2 ya se utilizaron
    S1: -20
    E10: f, E11: g, E12: h Desde la Décima hasta la 12ava línea tienen como salida
    S2: 7
    S3: 23
    S4: 5
    E13: mod, la 13ava entrada requiere dos argumentos para el operador binario MODULO, en este caso son los dos últimos de la lista de salida de salida (S3, S4) 23 MOD 5 retornando 3, ahora S3 es 3
    S3: 3
    E14: -, la 14ava entrada requiere dos argumentos para el operador binario RESTA, en este caso son los dos últimos de la lista de salida (S2, S3) 7-3 retornando 3, ahora S2 es 4
    S2: 4
    E15:
    , la 15ava entrada requiere dos argumentos para el operador binario MULTIPLICACIÓN, en este caso son los dos últimos de la lista de salida (S1, S2) -20*4 retornando -80, ahora S1 es -80, valor final de evaluación
    Ejemplo #2 una segunda expresión
    +a * -(b + -(c/+d) / -ee) * (f - g MOD h ) * -ii
    en RPN es
    { a b c d / NEG ee NEG / + NEG * POSITIVO f g h MOD - * ii NEG * }
    Observen que aparece el operador NEG (NEGATIVO) y POS (POSITIVO) no afecta la expresión, en mi caso una expresión en RPN es más fácil evaluarla manualmente que una expresión en notación natural ya que esta última sino tiene paréntesis de ayuda se puede cometer error de evaluación, QUE EN RPN NUNCA SUCEDE
    Otra forma de interpretar una expresión RPN, es evaluar de izquierda a derecha, detenerse hasta encontrar un operador
    { a b c d / NEG ee NEG / + NEG * POSITIVO f g h MOD - * ii NEG * }
    Coloca a, b, c, d luego divide luego saca el negativo, luego vuelve a dividir, suma, otra vez negativo, multiplica, coloca f, g, h saca el modulo, resta, luego multiplica, coloca ii, luego negativo, y luego multiplica.
    a b c d / ->
    2 -7.5 25 -5 /
    2 -7.5 -5
    2 -7.5 -5 NEG ->
    2 -7.5 5
    2 -7.5 5 ee ->
    2 -7.5 5 2
    2 -7.5 5 2 NEG ->
    2 -7.5 5 -2
    2 -7.5 5 -2 / ->
    2 -7.5 -2.5
    2 -7.5 -2.5 + ->
    2 -10
    2 10 NEG ->
    2 10
    2 10 * ->
    20 ->
    20 POSITIVO ->
    20
    f g h MOD ->
    7 23 5 MODULO
    7 3
    7 3 - ->
    4
    20 4 * ->
    80
    80 ii NEG->
    80 1 NEG
    -80 -1
    80 -1 *
    -81

     

    Last edit: Compsystems 2016-09-23
  • Compsystems

    Compsystems - 2016-10-07

    Una solucion previa es crear una funcion de nombre cambioDeSigno() en muchos lenguajes la denotan como change of sign CHS() otros NEG() de negativo

    http://dreiartikel.de/dictionary/?q=change%20of%20sign%20/chs/&ddir=ed

    de esta manera se facilita al interprete pues no tiene que chequear las combinaciones del operador unario CHS (-) con el operador binario resta (-)

    otros lenguges como el HP-PPL o TI_BASIC usan un cracter diferente para CHS y otro para resta

    −- observen que la raya media esta en difernte posición

     
    • Compsystems

      Compsystems - 2016-10-07

      ¿Tengo o no la razon, si se agrega la funcion NEGATIVO() se facilita la interpretacion?

      ejemplos
      1:
      imprimir a*-b

      con la nueva funcion NEGATIVO() se debe escribir como

      imprimir a*negativo(b)

      2:
      imprimir a/-b

      con la nueva funcion NEGATIVO() se debe escribir como

      imprimir a/negativo(b)

      3:
      imprimir a−-b

      con la nueva funcion NEGATIVO() se debe escribir como

      imprimir a−negativo(b)

      4: imprimir a−+b

      como + no afecta el signo se debe interpretar como

      imprimir a−b

       

Anonymous
Anonymous

Add attachments
Cancel





MongoDB Logo MongoDB