Curso de Cobol y PowerCobol

Creando una calculadora con COBOL

Capítulo 37: Calculadora con PERFORM

En este capítulo, utilizaremos todo lo aprendido con las operaciones aritméticas, los condicionales y PERFORM, con lo que conseguiremos crear una calculadora con menú, para que el usuario pueda elegir solo la operación que quiere hacer.

Calculadora en COBOL

Lo primero, será escribir una serie de variables. Una estructura de nivel 88 para el menú de opciones y unas variables para los operandos y el resultado.

       01  Opciones PIC 9 VALUE ZERO.
           88 Sumar VALUE 1.
           88 Restar VALUE 2.
           88 Multiplicar VALUE 3.
           88 Dividir VALUE 4.
           88 Salir VALUE 5.

       77  Numero1 PIC 999 VALUE ZEROS.
       77  Numero2 PIC 999 VALUE ZEROS.

       77  Resultado PIC 999999 VALUE ZEROS.

Lo siguiente, será en la PROCEDURE DIVISION, escribir un menú de opciones para el usuario con un ACCEPT.

       AceptaDatos.
       DISPLAY "Elige una operación.".
       DISPLAY "1 - Sumar (+)".
       DISPLAY "2 - Restar (-)".
       DISPLAY "3 - Multiplicar (*)".
       DISPLAY "4 - Dividir (/)".
       DISPLAY "5 - Salir".
       ACCEPT Opciones.

Ahora, una serie de IF con los que controlar cada opción que elija el usuario.

Fíjate en el END-IF marcado en el código. Le he puesto un punto, que es opcional después de un END-IF. Sin embargo, si lo siguiente que hay en el código es un párrafo, en OpenCobolIDE recibimos un error:

Error en párrafo de OpenCobolIDE
       IF Sumar THEN
           PERFORM Suma
       ELSE
           IF Restar THEN
               PERFORM Resta
           ELSE
               IF Multiplicar THEN
                   PERFORM Multiplicacion
               ELSE
                   IF Dividir THEN
                       PERFORM Dividiendo
                   ELSE
                       IF Salir
                           DISPLAY "Saliendo del programa..."
                           STOP RUN
                       ELSE
                           DISPLAY "Opción inválida. Inténtalo de"-
                           " nuevo."
                           PERFORM AceptaDatos
                   END-IF
               END-IF
           END-IF
       END-IF.

Creamos cuatro párrafos para cada operación:

       Suma.
           DISPLAY "Has elegido sumar".
           PERFORM SolicitaNumeros.
           ADD Numero1 TO Numero2 GIVING Resultado.
           DISPLAY "El resultado de la suma es: " Resultado "."
           PERFORM AceptaDatos.

       Resta.
           DISPLAY "Has elegido restar".
           PERFORM SolicitaNumeros.
           SUBTRACT Numero1 FROM Numero2 GIVING Resultado.
           DISPLAY "El resultado de la resta es: " Resultado "."
           PERFORM AceptaDatos.

       Multiplicacion.
           DISPLAY "Has elegido Multiplicación".
           PERFORM SolicitaNumeros.
           MULTIPLY Numero1 BY Numero2 GIVING Resultado.
           DISPLAY "El resultado de la Multiplicación es: " Resultado
           "."
           PERFORM AceptaDatos.

       Dividiendo.
           DISPLAY "Has elegido División".
           PERFORM SolicitaNumeros.
           DIVIDE Numero1 BY Numero2 GIVING Resultado.
           DISPLAY "El resultado de la división es: " Resultado "."
           PERFORM AceptaDatos.

Finalmente, un párrafo más para solicitar los operandos:

SolicitaNumeros.
DISPLAY "Por favor, introduzca el primer número.".
ACCEPT Numero1.
DISPLAY "Por favor, introduzca el segundo número.".
ACCEPT Numero2.

Te dejo el código completo para que puedas copiarlo entero:

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo37.

       ENVIRONMENT DIVISION.
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.

      *> Tenemos 5 opciones (1-5), cualquier otra cosa, queda en ZERO.
       01  Opciones PIC 9 VALUE ZERO.
           88 Sumar VALUE 1.
           88 Restar VALUE 2.
           88 Multiplicar VALUE 3.
           88 Dividir VALUE 4.
           88 Salir VALUE 5.

       77  Numero1 PIC 999 VALUE ZEROS.
       77  Numero2 PIC 999 VALUE ZEROS.

       77  Resultado PIC 999999 VALUE ZEROS.

       PROCEDURE DIVISION.
      *> Presenta un menú al usuario y le solicita una opción.
       AceptaDatos.
       DISPLAY "Elige una operación.".
       DISPLAY "1 - Sumar (+)".
       DISPLAY "2 - Restar (-)".
       DISPLAY "3 - Multiplicar (*)".
       DISPLAY "4 - Dividir (/)".
       DISPLAY "5 - Salir".
       ACCEPT Opciones.

      *> Con las opciones 1-5 vamos a los PERFORM correspondientes.
       IF Sumar THEN
           PERFORM Suma
       ELSE
           IF Restar THEN
               PERFORM Resta
           ELSE
               IF Multiplicar THEN
                   PERFORM Multiplicacion
               ELSE
                   IF Dividir THEN
                       PERFORM Dividiendo
                   ELSE
                       IF Salir
                           DISPLAY "Saliendo del programa..."
                           STOP RUN
                       ELSE
                           DISPLAY "Opción inválida. Inténtalo de"-
                           " nuevo."
                           PERFORM AceptaDatos
                   END-IF
               END-IF
           END-IF
       END-IF.

      *> Comienzan los párrafos para los PERFORM. La ejecución, finaliza
      *> después de ejecutar su código.
       Suma.
           DISPLAY "Has elegido sumar".
           PERFORM SolicitaNumeros.
           ADD Numero1 TO Numero2 GIVING Resultado.
           DISPLAY "El resultado de la suma es: " Resultado "."
           PERFORM AceptaDatos.

       Resta.
           DISPLAY "Has elegido restar".
           PERFORM SolicitaNumeros.
           SUBTRACT Numero1 FROM Numero2 GIVING Resultado.
           DISPLAY "El resultado de la resta es: " Resultado "."
           PERFORM AceptaDatos.

       Multiplicacion.
           DISPLAY "Has elegido Multiplicación".
           PERFORM SolicitaNumeros.
           MULTIPLY Numero1 BY Numero2 GIVING Resultado.
           DISPLAY "El resultado de la Multiplicación es: " Resultado
           "."
           PERFORM AceptaDatos.

       Dividiendo.
           DISPLAY "Has elegido División".
           PERFORM SolicitaNumeros.
           DIVIDE Numero1 BY Numero2 GIVING Resultado.
           DISPLAY "El resultado de la división es: " Resultado "."
           PERFORM AceptaDatos.

       SolicitaNumeros.
       DISPLAY "Por favor, introduzca el primer número.".
       ACCEPT Numero1.
       DISPLAY "Por favor, introduzca el segundo número.".
       ACCEPT Numero2.

       END PROGRAM Capitulo37.

¿Recuerdas lo que dije al principio sobre la longitud de los programas en COBOL? Hemos llegado casi a 100 líneas haciendo un programa muy sencillo. Si esto fuese una calculadora científica, no bastarían ni 1000 líneas. Tampoco lo tomes como una crítica mala, personalmente no me importa, me gusta COBOL tal y como es.

También dije que había críticas porque tiene demasiadas palabras reservadas. Un ejemplo, es el párrafo Dividiendo (Línea 82) y la opción Dividir (Línea 14). Normalmente, hubiese utilizado "Division" en lugar de "Dividir" y "Divide" en lugar de "Dividir". Tanto "Division" como "Divide", son palabras reservadas del lenguaje y no se pueden utilizar como identificadores. No hay problema, utilizamos otras palabras y ya está, pero, date cuenta de que si escribiéramos todo en inglés, nos toparíamos mucho más con este problema.

Funcionamiento de la calculadora

El usuario selecciona una opción. Dependiendo de cual, entramos en uno de los IF, si no elige algo contemplado en el nivel 88, salta el ELSE y se va con el PERFORM de nuevo a AceptaDatos, así puede seleccionar una opción correcta.

Si la opción es "Salir", se sale del programa con un STOP RUN.

Si la opción es una del 1 al 4, con un PERFORM, vamos al párrafo correspondiente. En cada uno de los párrafos, nos lleva al párrafo SolicitaNumeros, donde pedirá los dos operandos.

PERFORM, es como un bumerán, siempre vuelve a la siguiente línea a su ejecución. De esta forma, de SolicitaNumeros, nos iremos al verbo de operación correspondiente. Es decir, si estamos sumando, después de terminar la ejecución de SolicitaNumeros, lo siguiente que hará el programa es ir a la línea 63, ADD Numero1...

Después de devolver el resultado, nos lleva con otro PERFORM a AceptaDatos por si queremos realizar otra operación. Si no, ponemos la opción 4 y salimos.

Esta es la lógica de la calculadora. Esto es lo que se ejecutaría de fondo en una calculadora gráfica. En lugar de tener un menú con opciones, el equivalente a seleccionar la opción "Sumar", sería el botón con el símbolo +. ADD Numero 1 TO Numero2 GIVING Resultado, sería el equivalente a añadir los números y el DISPLAY con el resultado, podría ser el botón igual. Es un acercamiento, el programa con una interfaz gráfica variaría un poco de este. Sin embargo, con esto vas practicando para llegar a entender mejor la utilización de PERFORM.

Código de calculadora con EVALUATE

Por último, te dejo una versión más óptima de la calculadora. He reemplazado la estructura IF, para hacerla con EVALUATE.

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo37.

       ENVIRONMENT DIVISION.
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.

      *> Tenemos 5 opciones (1-5).
       01  Opciones PIC 9 VALUE ZERO.
           88 Sumar VALUE 1.
           88 Restar VALUE 2.
           88 Multiplicar VALUE 3.
           88 Dividir VALUE 4.
           88 Salir VALUE 5.

       77  Numero1 PIC 999 VALUE ZEROS.
       77  Numero2 PIC 999 VALUE ZEROS.

       77  Resultado PIC 999999 VALUE ZEROS.

       PROCEDURE DIVISION.
      *> Presenta un menú al usuario y le solicita una opción.
       AceptaDatos.
       DISPLAY "Elige una operación.".
       DISPLAY "1 - Sumar (+)".
       DISPLAY "2 - Restar (-)".
       DISPLAY "3 - Multiplicar (*)".
       DISPLAY "4 - Dividir (/)".
       DISPLAY "5 - Salir".
       ACCEPT Opciones.

      *> Con las opciones 1-5 vamos a los PERFORM correspondientes.
       EVALUATE TRUE

       WHEN Sumar
           PERFORM Suma

       WHEN Restar
           PERFORM Resta

       WHEN Multiplicar
           PERFORM Multiplicacion

       WHEN Dividir
           PERFORM Dividiendo

       WHEN Salir
           	DISPLAY "Saliendo del programa..."
       		STOP RUN
		
		WHEN OTHER
			DISPLAY "Opción inválida. Inténtalo de nuevo."
			PERFORM AceptaDatos

        END-EVALUATE.
      *> Comienzan los párrafos para los PERFORM. La ejecución, finaliza
      *> después de ejecutar su código.
       Suma.
           DISPLAY "Has elegido sumar".
           PERFORM SolicitaNumeros.
           ADD Numero1 TO Numero2 GIVING Resultado.
           DISPLAY "El resultado de la suma es: " Resultado "."
           PERFORM AceptaDatos.

       Resta.
           DISPLAY "Has elegido restar".
           PERFORM SolicitaNumeros.
           SUBTRACT Numero1 FROM Numero2 GIVING Resultado.
           DISPLAY "El resultado de la resta es: " Resultado "."
           PERFORM AceptaDatos.

       Multiplicacion.
           DISPLAY "Has elegido Multiplicación".
           PERFORM SolicitaNumeros.
           MULTIPLY Numero1 BY Numero2 GIVING Resultado.
           DISPLAY "El resultado de la Multiplicación es: " Resultado
           "."
           PERFORM AceptaDatos.

       Dividiendo.
           DISPLAY "Has elegido División".
           PERFORM SolicitaNumeros.
           DIVIDE Numero1 BY Numero2 GIVING Resultado.
           DISPLAY "El resultado de la división es: " Resultado "."
           PERFORM AceptaDatos.

       SolicitaNumeros.
       DISPLAY "Por favor, introduzca el primer número.".
       ACCEPT Numero1.
       DISPLAY "Por favor, introduzca el segundo número.".
       ACCEPT Numero2.

       END PROGRAM Capitulo37.

Comentarios

Si te quedan dudas sobre el temario, sobre Cobol, o cualquier otra cosa relacionada o simplemente quieres agradecer, aquí tienes tu sitio para dejar tu granito de arena. Gracias por tus comentarios y por darle vida a este sitio web.

Programación Fácil YouTube

Suscríbete

Si te ha gustado este curso y crees que el trabajo merece la pena, te agradeceré eternamente que te suscribas a mi canal de YouTube para apoyarme y que pueda seguir haciendo cursos gratuitos.

Además, si te encanta la programación, tienes un montón más de cursos gratuitos para ver.

No solo eso, podrás participar enviándome comentarios con tus sugerencias para temas específicos o cursos completos o incluso las dudas que tengas y las intentaré ir resolviendo en los cursos que estén todavía abiertos.