Iniciar Sesión

Ver la Versión Completa : [Duda] No se muestra lo que pone el código.


DestinedBroken
3 de noviembre de 2021, 12:56
Hola gente,

Tengo el siguiente código con el que uno se da cuenta que si el usuario introduce por consola "S" o "s" el programa debe devolver una frase por consola. Sin embargo, a mí siempre me termina el programa, meta lo que meta (S, n, números, etc).

¿Qué es lo que está fallando?


IDENTIFICATION DIVISION.
PROGRAM-ID. CAPITULO11.
*GO TO salta a donde se le manda, y continua hasta el final
*PERFORM luego de hacer lo que sea, vuelve a donde estaba
DATA DIVISION.

WORKING-STORAGE SECTION.
01 RES pic x.
PROCEDURE DIVISION.

PREGUNTA.

PERFORM CONTINUACION
.

IF RES = "N" OR RES = "n"
GO TO FINALIZA-PROGRAMA
IF RES = "S" OR RES = "s"
perform PROGRAMA
ELSE
DISPLAY " Introduce una 'N' o 'S'"
.

FINALIZA-PROGRAMA.
STOP RUN
.

CONTINUACION.
DISPLAY "Ejecutar el programa (S/N)?"
.
ACCEPT res
.
PROGRAMA.
DISPLAY "Se ejecuta el programa"
.
END PROGRAM CAPITULO11.


He intentado poner todo en mayúsculas, por tonterías que uno prueba vaya, y ni aún así. Igualmente, cambié el perform de PROGRAMA dentro de las cláusulas if-else por un go to pero nada de nada.

Kuk
3 de noviembre de 2021, 14:08
@DestinedBroken, tienes que usar los END-IF etc. (terminadores explícitos) y NO USAR los puntos.

Es la "enfermedad" de Cobol que se solucionó en el año 74.

A ti lo que te pasa es que el segundo IF está dentro del primero. Así que si le dices "N" se va al FINALIZA-PROGRAMA, y si le das a cualquier otra cosa, simplemente no entra en inguno de los IF y pasa al FINALIZA-PROGRAMA.

---------- Post añadido el 3 de noviembre de 2021 a las 14:09 ----------

Usa Ctrl+SPACE de Eclipse para autocompletado de código, te pondrá los terminadores automáticamente. ;)

---------- Post añadido el 3 de noviembre de 2021 a las 14:10 ----------

Y no uses los GO TO. Solo usa PERFORM.

DestinedBroken
3 de noviembre de 2021, 16:26
tienes que usar los END-IF
Hostias es verdad, se me habían olvidado. Me estoy dando cuenta de las grandes diferencias de autocompletado que ofrecen los IDE de OpenCobol y VCobol entre sí y los fallos que me estoy comiendo por venir de uno y llegar a otro :nauf: :nauf:

y NO USAR los puntos.
¿Los puntos no son obligatorios, como los punto y coma en el resto de lenguajes? ¿o sólo te refieres a no ponernos dentro de las cláusulas if-else?
Esto es algo que no termino nunca de entender del todo. Los puntos hay que colocarnos al final de una línea de código, pero cuando llega la hora de hacer unos if-else como los ponga empiezan a salirme fallos. Solamente tras la última instrucción no me sale error (en el código de arriba, sería tras la sentencia final dentro del ELSE).


Usa Ctrl+SPACE de Eclipse para autocompletado de código, te pondrá los terminadores automáticamente.
yeh



Y no uses los GO TO. Solo usa PERFORM.

Siempre leo lo mismo pero no termino de verle el por qué más allá de que al empezar el salto sigue hacia abajo sin volver desde donde se le llamó (hablo del GO TO obviamente). :piensa:

Josber
3 de noviembre de 2021, 19:32
No te preocupes, yo, cuando pasé del COBOL-74 al COBOL-85, todo eran errores.

Los puntos, y eso no ha cambiado, son obligatorios, en COBOL-74, para terminar sentencias condicionales (IF), sentencias de flujo (PERFOR, GO TO ...), sentencias imperativas, (AT END, INVALID KEY ...), en el COBOL-85, con la introducción de las sentencias END-xxxxx, la obligatoriedad del punto, (.), decayó bastante, aunque si se usan, ofrecen una comprensión más clara del código

un salu2.-

Kuk
3 de noviembre de 2021, 19:54
¿Los puntos no son obligatorios,

en PROCEDURE DIVISION el único punto obligatorio es el del final del párrafo (termina el párrafo). Ponlo en una línea separada al final. No pongan ningún otro punto en esta parte del programa.

no termino de verle el por qué más allá
La vuelta asegura la jerarquía anti-espagueti. Con los GO TO puedes ir a cualquier lado, y eso es más espagueti que los espagueti. :D

---------- Post añadido el 3 de noviembre de 2021 a las 19:55 ----------

ofrecen una comprensión más clara del código
En esto no estoy de acuerdo contigo compañero ;) Para mi que al revés.

DestinedBroken
3 de noviembre de 2021, 21:10
en PROCEDURE DIVISION el único punto obligatorio es el del final del párrafo (termina el párrafo). Ponlo en una línea separada al final. No pongan ningún otro punto en esta parte del programa.

¿Un solo punto? A mí me da fallos por todos lados...

https://i.ibb.co/t8GGSJC/procedure-error.jpg


y eso es más espagueti que los espagueti
entendido, gracias!

Kuk
3 de noviembre de 2021, 23:06
@DestinedBroken, lo primero es mejor que no pegues imágenes, sino código (texto) envuelto en el bloque de resalto de sintaxis (los botoncitos con nombres de lenguajes) así te podemos copiarlo y corregirlo.

Se necesita un punto despues de PROCEDURE DIVISION. Y luego al final de cada párrafo. O sea dentro de un párrafo un solo punto al final del mismo ;)

DestinedBroken
3 de noviembre de 2021, 23:31
Perdona @Kuk, no pensé en poner el código.

Cuando dices párrafos, ¿estamos hablando de las rutinas? Si es así debería funcionarme como te pongo a continuación (pero sigue dando errores). Sé que esto es sintaxis básicas, pero vengo de que me den caña poniendo puntos detrás de cada línea :(

Mira, el código es el del otro hilo, básicamente lo he cogido para esto de los puntos (por si te suena):


IDENTIFICATION DIVISION.
PROGRAM-ID. CAPITULO11.
*GO TO salta a donde se le manda, y continua hasta el final
*no recomendado -> codigo spaghetti!
*PERFORM luego de hacer lo que sea, vuelve a donde estaba
*usarlo en vez de GO TO!
DATA DIVISION.

WORKING-STORAGE SECTION.
01 RES pic x.
PROCEDURE DIVISION.

PREGUNTA.

PERFORM CONTINUACION.


IF RES = "N" OR RES = "n"
perform FINALIZA-PROGRAMA.
end-if
IF RES = "S" OR RES = "s"
perform PROGRAMA.
ELSE
DISPLAY " Introduce una 'N' o 'S'"


FINALIZA-PROGRAMA.
STOP RUN


CONTINUACION.
DISPLAY "Ejecutar el programa (S/N)?"

ACCEPT res

PROGRAMA.
DISPLAY "Se ejecuta el programa"



END PROGRAM CAPITULO11.

Kuk
4 de noviembre de 2021, 09:32
@DestinedBroken, ya no hay errores. Fíjate en los puntos:


IDENTIFICATION DIVISION.
PROGRAM-ID. CAPITULO11.
*GO TO salta a donde se le manda, y continua hasta el final
*no recomendado -> codigo spaghetti!
*PERFORM luego de hacer lo que sea, vuelve a donde estaba
*usarlo en vez de GO TO!
DATA DIVISION.

WORKING-STORAGE SECTION.
01 RES pic x.


PROCEDURE DIVISION.

PREGUNTA.

PERFORM CONTINUACION


IF RES = "N" OR RES = "n"
PERFORM FINALIZA-PROGRAMA
END-IF

IF RES = "S" OR RES = "s"
PERFORM PROGRAMA

ELSE
DISPLAY " Introduce una 'N' o 'S'"
END-IF
.

FINALIZA-PROGRAMA.
STOP RUN
.


CONTINUACION.
DISPLAY "Ejecutar el programa (S/N)?"

ACCEPT res
.

PROGRAMA.
DISPLAY "Se ejecuta el programa"
.

END PROGRAM CAPITULO11.