Iniciar Sesión

Ver la Versión Completa : [Sintaxis] Darle la vuelta a un campo


CHITOBLA
23 de octubre de 2022, 02:33
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.

dariodr
23 de octubre de 2022, 06:20
Hola, visita esta pagina creo que te puede servir.
Saludos.

https://iamamainframer.blogspot.com/2018/12/how-to-reverse-string-in-cobol-without.html

Josber
23 de octubre de 2022, 13:57
@CHITOBLA, para el tema del capicúa, prueba con éste 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 LINE o POSITION en los DISPLAY), para ANSI-74, seguro que no funciona, porque esa versión no contemplaba los END-xxxxx.

Un salu2.-

CHITOBLA
23 de octubre de 2022, 20:42
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::
cobc.exe -x -o bin\PRUEBA 2.exe -std=cobol85 -Wall -debug "PRUEBA 2.cbl"
que no entiendo bien que quiere decir, fui a buscar al directorio que dice pero solo encontré el programa

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.:bien:

Josber
23 de octubre de 2022, 21:04
@CHITOBLA, ¿Qué compilador estás usando?, a ver si lo puedo descargar y me funciona en 64bits

CHITOBLA
24 de octubre de 2022, 02:01
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.

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.


Usa los botones de resalto de sintaxis https://cobolforo.es/images/admin/sintax_bar.png

JCantero
24 de octubre de 2022, 08:21
@CHITOBLA, Ahí tienes una posibilidad que funciona con Cobol IDE


************************************************** ****************
* 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.

Kuk
24 de octubre de 2022, 10:28
@CHITOBLA,


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

Kuk
24 de octubre de 2022, 10:34
@JCantero, me gusta lo de

if cadena(i:) not = ' ' :bien:

JCantero
24 de octubre de 2022, 10:39
@Kuk, lo utilizo muchísimo. Te ahorra mucha lógica en algoritmos que tratan "string"

En RM/Cobol eso de from length of frase no lo puedo utilizar.

Kuk
24 de octubre de 2022, 10:45
En RM/Cobol eso de "from length of frase" no lo puedo utilizar.

Entonces tienes que hacer un MOVE adicional.

JCantero
24 de octubre de 2022, 10:57
Quería aclarar.

En las últimas versiones si existe "length of" pero tengo que mantener la compatibilidad en algunas cosas y no utilizo este tipo de cosas.

Kuk
24 de octubre de 2022, 11:40
@JCantero, el LENGTH OF forma parte del lenguaje, o sea que no es una chuminada de MF o Fujitsu, realmente es parte del lenguaje así que la verdad es que me parece extraño que no exista en versiones incluso antiguas de RM... :yoquese:

Josber
24 de octubre de 2022, 11:58
@JCantero, el LENGTH OF forma parte del lenguaje, o sea que no es una chuminada de MF o Fujitsu, realmente es parte del lenguaje así que la verdad es que me parece extraño que no exista en versiones incluso antiguas de RM... :yoquese:

Bueno, nada más tienes que ver el DISPLAY " " ERASE , que comentamos hace poco, que no funciona en todos los compiladores y, yo creo que también es inherente al COBOL, se conoce que los de CODASYL, "abrieron la mano" más de la cuenta y ya no es tan compatible como debiera. si Grace Hopper (https://es.wikipedia.org/wiki/Grace_Murray_Hopper), levantara la cabeza, se hacía el harakiri con el cuchillo de untar mantequilla

Kuk
24 de octubre de 2022, 12:14
@Josber, bueno lo de las pantallas es una historia aparte porque la compatibilidad era malísima. Pero el LENGTH OF no tiene nada que ver con el dispositivo en sí, es sólo una instrucción implicando CPU, sacar el valor de longitud de un área de memoria, nada más...

Lo que tú dices es verdad, pero en este caso es algo demasiado simple

CHITOBLA
24 de octubre de 2022, 19:48
Josber PERFECTO, anduvo en la primer compilación.
Te felicito por hacer un programa tan simple y tan efectivo usando lo basico del cobol para un compilador como el que tengo.
Creo que te he sacado de tu forma de escribir programas para volver a lo simple y adorable que es el COBOL basico.
TE AGRADEZCO MUCHISIMO TU TIEMPO y TU CALIDAD COMO PORGRAMADOR Y MAESTRO.
Parece que no solo yo lo disfruto y me alegro mucho haber servido de motivación para el foro con esto que no sabia por donde agarrar y enredandome con instrucciones que son para otra cosa.

Si ves el programa que tu hiciste y el que yo habia hecho en el curso con PSEINT, SON IGUALES y usamos las mismas variables.

Voy a empezar a repasar programas que desarrolle en PSEINT y llevarlos al COBOL para seguir ejercitando hasta que alguien del foro me mande algun programa que use todo el entorno grafico de otro compilador y me explique como se usa el POWER COBOL4.

Estoy muy contento y agradecido por haberme suscripto a este foro y encontrar personas tan amables, profesionales de verdad y muy buena gente.
GRACIAS.

- - - Updated - - -

Josber, me encantó tu frase "hacerse un harakiri con el cuchillo de mantequilla".
Es muy grafico y real, como se van desvirtuando las características básicas del COBOL en la competencia entre empresas queriendo hacer nuevas versiones con mas "chiches" y esto perjudica a los programadores y las empresas porque pasan de tener algo "COMUN" a tener algo propietario y luego que se las arreglen para mantenerlo.
SALUDOS.

CHITOBLA
24 de octubre de 2022, 20:01
Kuk, compile tu programa y FUNCIONA PERFECTAMENTE.
Es bastante distinto al que hizo Josber pero hace lo mismo, da vuelta la palabra.
Muchas gracias por tu tiempo y por enseñarme otra forma de programar mas sofisticada.
Un abrazo
Gracias.

CHITOBLA
24 de octubre de 2022, 20:20
JCantero, te pido disculpas porque crei que el programa me lo habia mandado JOSBERT y ahora lei bien y vi que lo hiciste tu.
Tal como le dije a Josbert, me encanta la simpleza del programa, simple, directo y consigue el objetivo con pocas lineas.
Es igual que el que escribi en PSEINT pero adecuado al COBOL.
Muchas gracias por tu tiempo y pido disculpas a ti y a Josber por haberme apurado en compilar y no leer.
Ahora tengo los 2 programas, el que me mandaste tu y el de KUK juntos (asteriscado el que no uso) para poder estudiar las diferencias que son notorias, pero ambos logran el objetivo sin problemas.
GRACIAS A AMBOS.
Un abrazo.:bien::yupi:

Josber
24 de octubre de 2022, 20:44
@CHITOBLA, es que el que te ha enviado @JCantero, y el que he hecho yo, son distintos, el de él es para darle la vuelta completa a una cadena y el que te he hecho yo, es para comprobar si un número es capicúa, que es totalmente distinto.

Aunque pienso como tú, el de @JCantero, es muy sencillo y funcional, tiene un 10 por mi parte.

Un salu2.-

CHITOBLA
24 de octubre de 2022, 21:10
Josber como te dije ayer, el principio es el mismo, ya sea una palabra o un numero, ambos son resueltos con el programa que da vuelta lo ingresado.
Ayer te mande un ejemplo del que había hecho sacado de la pagina que tu me mandaste y puse un numero que luego de que es dado vuelta puedo comparar con el numero original y si son iguales ES CAPICUAL , como por ejemplo 1234321.
Mi problema era como dar vuelta ya sea una frase o un numero y con el mismo programa puedo resolver ambas necesidades.
Hoy tengo 3 soluciones que estoy estudiando y aprendiendo para cuando me haga falta.
Muchas gracias a todos ustedes.
Un abrazo y que tengamos todos una muy buena semana.
SALUDOS