0

![]() |
![]() |
Junior |
Hola coboleros, como están.
Tengo un problema que hace mas de 2 días estoy tratando de resolver y no he podido y por esto les escribo a los que tienen mucha mas experiencia que yo.
Antes que nada quiero que sepan que estoy usando como compilador el Open COBOL Ide, lo cual como saben es el de los mas simples y fáciles.
El problema que quiero resolver es poder DAR VUELTA UN CAMPO ALFANUMERICO.
Les doy un ejemplo: si introduzco por ejemplo la frase "hoy llueve" quisiera tener en otro campo lo siguiente: "eveull yoh".
Espero haber sido claro con el ejemplo.
He hecho todas las pruebas que he podido leyendo y copiando alternativas, sacando espacios de adelante, de atrás, copiando la frase ingresada a otra variable, pero no le he encontrado la vuelta para poder reversar una frase ingresada en otra variable.
Yo use en un curso que hice hace poco el lenguaje PSEINT que es para aprendices y es en español, y era facil resolver este problema como quizás lo sea en otros lenguajes, pero en COBOL al menos yo no lo he podido.
En ese curso tuvimos un problema que era resolver si un numero es "capicúa", es decir que si lo miras de izquierda a derecha es el mismo numero que si lo miras de derecha a izquierda.
Aquí en el Rio de la Plata se le dice "capicúa".
Como ejemplo les doy el número 12121.
Aguardo si alguien con mucha mas experiencia cobolera y les recuerdo que debería ser una solución ANSI 74 u 85 por el compilador que tengo.
No quise escribirles hasta no probar todo lo que he podido leer, ver y sobre todo cobolear.
Un abrazo a todos y que tengamos una muy buena semana.
Gracias.
![]() |
![]() |
Acabo de llegar... |
Hola, visita esta pagina creo que te puede servir.
Saludos.
https://iamamainframer.blogspot.com/...l-without.html
![]() |
![]() |
Super Moderador |
@CHITOBLA, para el tema del capicúa, prueba con éste código
COBOL Código:
IDENTIFICATION DIVISION. PROGRAM-ID. CAPICUA. ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. 01 TECLA PIC X. 01 I PIC 99 COMP-5. 01 J PIC 99 COMP-5. 01 K PIC 99 COMP-5. 01 L PIC 99 COMP-5. 01 NUM PIC 9(10) USAGE IS DISPLAY. 01 EDI REDEFINES NUM. 03 E PIC X OCCURS 10. 01 WTEX. 03 FILLER PIC X(10) VALUE "El numero ". 03 EDITADO PIC Z(10). 03 FILLER PIC XX VALUE ", ". 03 SINO PIC XX VALUE SPACES. 03 FILLER PIC X(9) VALUE " Capicua.". PROCEDURE DIVISION. INICIO. INITIALIZE TECLA I J K L NUM. ACEPTAR. DISPLAY "Introduzca número (Cero para terminar): ". ACCEPT NUM CONTROL "TAB, NO BEEP". IF NUM = 0 STOP RUN END-IF. IF NUM < 9 DISPLAY "El número tiene que ser mayor de 9" GO ACEPTAR END-IF. MOVE NUM TO EDITADO. * COMPROBAR. * Vamos a comprobar la longitud del número. PERFORM VARYING I FROM 1 BY 1 UNTIL I > 10 OR E(I) NOT = "0" CONTINUE END-PERFORM. * Sacamos el centro del número. COMPUTE J = (10 - I) / 2 + I. * MOVE 10 TO L. * Comprobamos, se prdría hacer con 2 perform anidados * pero para no liar ... PERFORM VARYING K FROM I BY 1 UNTIL I > J OR L < J IF E (K) NOT = E (L) MOVE "NO" TO SINO DISPLAY WTEX STOP RUN ELSE SUBTRACT 1 FROM L END-IF END-PERFORM. * Si llegamos aquí, es capicúa MOVE "SÍ" TO SINO. DISPLAY WTEX. DISPLAY " ". DISPLAY "... Pulse una tecla para continuar ..." ACCEPT TECLA. GO INICIO.
No lo puedo probar, porque no tengo ningún compilador que funcione en MS-DOS en una máquina de 64 bits, pero al compilarlo, no da errores, que ya es algo. Está lo más "estandarizado" posible, (por eso no hay ningún o en los ), para ANSI-74, seguro que no funciona, porque esa versión no contemplaba los END-xxxxx.
Un salu2.-
![]() |
![]() |
Junior |
Josber buenas trdes.
Te agradezco infinitamente las 2 cosas que me has mandado.
La pagina es exactamente lo que buscaba aunque todavia no lo probe porque quise contestarte lo antes posible ya que has tomado un tiempo para resolver mi problema.
He copiado lo que me mandaste del tema "CAPICUA" y ajustado algunas cosas que mi compilador no acepta.
A pesar de no marcarme ningún error, NO QUIERE COMPILAR y no dice porque, sale este mensaje que parece no tener sentido (para mi):
"PRUEBA 2.cbl": line 1 Invalid argument
Toque otro botón en la ventana que abre el compilador y me salió este mensaje::
que no entiendo bien que quiere decir, fui a buscar al directorio que dice pero solo encontré el programaCODE Código:
cobc.exe -x -o bin\PRUEBA 2.exe -std=cobol85 -Wall -debug "PRUEBA 2.cbl"
Desde ya te agradezco muchísimo el tiempo que te has tomado para escribir el programa y te mantendré informado como me va con los cambios.
Un afectuoso abrazo.
G R A C I A S.![]()
![]() |
![]() |
Super Moderador |
@CHITOBLA, ¿Qué compilador estás usando?, a ver si lo puedo descargar y me funciona en 64bits
![]() |
![]() |
Junior |
Josber estoy usando el OPEN COBOL IDE 4.7.6 que es la ultima versión para Windows.
Te cuento que mi netbook es de 64 bits también.
Por mas que he intentado muchas variantes no lo he podido compilar.
Te quiero contar que el link que me diste para dar vuelta las palabras funciona MARAVILLOSO y lo he usado para el tema del CAPICUA.
Lo que he hecho es que si en lugar de letras pongo números como
"12321" y hago la comparación entre el original y el dado vuelta, hago un display "ES CAPICUA.
Aqui te copio el programa y depende el numero que pongas debes corregir el tamaño de la variable porque sino no son comparables.
COBOL Código:
IDENTIFICATION DIVISION. PROGRAM-ID. REVERS. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-A PIC X(7) VALUE '1234333'. 01 WS-OUT PIC X(7).[/SIZE] 01 WS-I PIC 9(3) VALUE 0. 01 WS-J PIC 9(2) VALUE 1. 01 WS-LEN PIC 9(3) VALUE 0. PROCEDURE DIVISION. MOVE FUNCTION LENGTH(WS-A) TO WS-LEN. PERFORM VARYING WS-I FROM WS-LEN BY -1 UNTIL WS-I = 0 MOVE WS-A(WS-I:1) TO WS-OUT(WS-J:1) ADD 1 TO WS-J END-PERFORM. DISPLAY " ". DISPLAY " ORIGINAL: " WS-A. DISPLAY " DADO VUELTA: " WS-OUT. DISPLAY " ". IF WS-A = WS-OUT DISPLAY " ES CAPICUA !!!!!" ELSE DISPLAY " !!!!! NO ES CAPICUA !!!!!" STOP RUN.
Pero si pongo por ejemplo "1234333" y hago la comparación entre el original y el dado vuelta pongo un display " NO ES CAPICUA".
Esto es lo que yo quería y tu me lo has conseguido.
GRACIAS GRACIAS GRACIAS.
Cuéntame porque no compila tu programa que obviamente es totalmente distinto ya que para mi es un misterio.
Te mando un abrazo y muchísimas gracias por tu tiempo en mi problema que al final con un poco de maña y astucia (esto es lo que sobra por estos lados), he resuelto las 2 cosas que quería y aprendido un poco mas de cobol.
![]() |
![]() |
Senior |
@CHITOBLA, Ahí tienes una posibilidad que funciona con Cobol IDE
COBOL Código:
****************************************************************** * Author: jcantero * Date: 24/10/2022 * Purpose: Dar vuelta cadena para ForoCobol * Tectonics: cobc ****************************************************************** IDENTIFICATION DIVISION. PROGRAM-ID. YOUR-PROGRAM-NAME. DATA DIVISION. FILE SECTION. WORKING-STORAGE SECTION. 01 cadena pic x(80). 01 cadenax pic x(80). 01 i pic 999. 01 j pic 999. PROCEDURE DIVISION. MAIN-PROCEDURE. initialize cadena cadenax. display "Introducir cadena:" accept cadena move 0 to j. perform varying i from 80 by -1 until i = 0 if cadena(i:) not = ' ' then add 1 to j move cadena(i:1) to cadenax(j:1) end-if end-perform. display "Cadena resultado:". display cadenax. STOP RUN. END PROGRAM YOUR-PROGRAM-NAME.
![]() |
![]() |
Administrador |
@CHITOBLA,COBOL Código:
working-storage section. 01 frase pic x(100). 01 resultado pic x(100). 01 lim pic 9(4) comp-5. 01 idx pic 9(4) comp-5. procedure division. move "hola amigos" to frase perform varying lim from length of frase by -1 until frase(lim:1) not = spaces or lim = 1 end-perform perform varying idx from 0 by 1 until idx > lim / 2 move frase(lim - idx + 1:1) to resultado(idx:1) move frase(idx:1) to resultado(lim - idx + 1:1) end-perform if function rem(lim 2) = 1 move frase(lim / 2 + 1:1) to resultado(lim / 2 + 1:1) end-if display resultado
¿Te han ayudado? NO TE OLVIDES de darle al botón
¿Quieres dirigirte a alguien en tu post? Notifícale con una mención, tienes 2 opciones:
- Haciendo clic en el icono
al lado de su nick
- Haciendo clic en el botón
en el editor y escribiendo su nick.
![]() |
![]() |
Administrador |
@JCantero, me gusta lo deCOBOL Código:
if cadena(i:) not = ' '![]()
¿Te han ayudado? NO TE OLVIDES de darle al botón
¿Quieres dirigirte a alguien en tu post? Notifícale con una mención, tienes 2 opciones:
- Haciendo clic en el icono
al lado de su nick
- Haciendo clic en el botón
en el editor y escribiendo su nick.
![]() |
![]() |
Senior |
@Kuk, lo utilizo muchísimo. Te ahorra mucha lógica en algoritmos que tratan "string"
En RM/Cobol eso de no lo puedo utilizar.
Actualmente hay 1 usuarios viendo este tema. (0 miembros y 1 visitantes)
Marcadores