Cobol Foro

Cobol Foro (https://www.cobolforo.es/index.php)
-   GnuCOBOL (OpenCOBOL) (https://www.cobolforo.es/forumdisplay.php?f=90)
-   -   [Sintaxis] Darle la vuelta a un campo (https://www.cobolforo.es/showthread.php?t=1541)

CHITOBLA 23 de octubre de 2022 02:33

Darle la vuelta a un campo
 
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/...l-without.html

Josber 23 de octubre de 2022 13:57

@CHITOBLA, para el tema del capicúa, prueba con éste código

Código COBOL:
  1.        IDENTIFICATION DIVISION.
  2.        PROGRAM-ID. CAPICUA.
  3.        ENVIRONMENT DIVISION.
  4.        DATA DIVISION.
  5.        WORKING-STORAGE SECTION.
  6.        01  TECLA                        PIC X.
  7.        01  I                            PIC 99 COMP-5.
  8.        01  J                            PIC 99 COMP-5.
  9.        01  K                            PIC 99 COMP-5.
  10.        01  L                            PIC 99 COMP-5.
  11.        01  NUM                          PIC 9(10) USAGE IS DISPLAY.
  12.        01  EDI  REDEFINES NUM.
  13.            03  E                        PIC X OCCURS 10.
  14.        01  WTEX.
  15.            03  FILLER                   PIC X(10)
  16.                        VALUE "El numero ".
  17.            03  EDITADO                  PIC Z(10).
  18.            03  FILLER                   PIC XX VALUE ", ".
  19.            03  SINO                     PIC XX VALUE SPACES.
  20.            03  FILLER                   PIC X(9) VALUE " Capicua.".
  21.        PROCEDURE DIVISION.
  22.        INICIO.
  23.            INITIALIZE TECLA I J K L NUM.
  24.        ACEPTAR.
  25.            DISPLAY "Introduzca número (Cero para terminar): ".
  26.            ACCEPT NUM CONTROL "TAB, NO BEEP".
  27.            IF NUM = 0
  28.               STOP RUN
  29.            END-IF.
  30.  
  31.            IF NUM < 9
  32.               DISPLAY "El número tiene que ser mayor de 9"
  33.               GO ACEPTAR
  34.            END-IF.
  35.  
  36.            MOVE NUM TO EDITADO.
  37.      *
  38.        COMPROBAR.
  39.      *  Vamos a comprobar la longitud del número.
  40.            PERFORM VARYING I FROM 1 BY 1
  41.                    UNTIL I > 10 OR E(I) NOT = "0"
  42.                          CONTINUE
  43.            END-PERFORM.
  44.      *  Sacamos el centro del número.
  45.            COMPUTE J = (10 - I) / 2 + I.
  46.      *
  47.            MOVE 10 TO L.
  48.      *  Comprobamos, se prdría hacer con 2 perform anidados
  49.      *  pero para no liar ...
  50.            PERFORM VARYING K FROM I BY 1
  51.                    UNTIL I > J OR L < J
  52.                          IF E (K) NOT = E (L)
  53.                             MOVE "NO" TO SINO
  54.                             DISPLAY WTEX
  55.                             STOP RUN
  56.                          ELSE
  57.                             SUBTRACT 1 FROM L
  58.                          END-IF
  59.            END-PERFORM.
  60.      *  Si llegamos aquí, es capicúa
  61.            MOVE "SÍ" TO SINO.
  62.            DISPLAY WTEX.
  63.            DISPLAY " ".
  64.            DISPLAY "... Pulse una tecla para continuar ..."
  65.            ACCEPT TECLA.
  66.            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::
Código:

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.

Código COBOL:
  1.        IDENTIFICATION DIVISION.
  2.        PROGRAM-ID. REVERS.
  3.        DATA DIVISION.
  4.  
  5.        WORKING-STORAGE SECTION.
  6.            01 WS-A PIC X(7) VALUE '1234333'.
  7.            01 WS-OUT PIC X(7).[/SIZE]
  8.            01 WS-I   PIC   9(3) VALUE 0.
  9.            01 WS-J   PIC   9(2) VALUE 1.
  10.            01 WS-LEN PIC 9(3) VALUE 0.
  11.  
  12.        PROCEDURE DIVISION.
  13.            MOVE FUNCTION LENGTH(WS-A) TO WS-LEN.
  14.            PERFORM VARYING WS-I FROM WS-LEN BY -1 UNTIL WS-I = 0
  15.              MOVE WS-A(WS-I:1) TO WS-OUT(WS-J:1)
  16.              ADD 1 TO WS-J
  17.            END-PERFORM.
  18.            DISPLAY " ".  
  19.            DISPLAY "      ORIGINAL:  " WS-A.
  20.            DISPLAY "      DADO VUELTA:  " WS-OUT.
  21.            DISPLAY " ".
  22.            IF WS-A = WS-OUT
  23.                DISPLAY " ES CAPICUA !!!!!"
  24.            ELSE
  25.                DISPLAY " !!!!! NO ES CAPICUA !!!!!"
  26.             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.

Comentario de Moderador

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

Código COBOL:
  1. ******************************************************************
  2.      * Author: jcantero
  3.      * Date: 24/10/2022
  4.      * Purpose: Dar vuelta cadena para ForoCobol
  5.      * Tectonics: cobc
  6.      ******************************************************************
  7.        IDENTIFICATION DIVISION.
  8.        PROGRAM-ID. YOUR-PROGRAM-NAME.
  9.        DATA DIVISION.
  10.        FILE SECTION.
  11.        WORKING-STORAGE SECTION.
  12.        01 cadena pic x(80).
  13.        01 cadenax pic x(80).
  14.        01 i pic 999.
  15.        01 j pic 999.
  16.        
  17.        PROCEDURE DIVISION.
  18.        
  19.        MAIN-PROCEDURE.
  20.            
  21.             initialize cadena cadenax.
  22.             display "Introducir cadena:"
  23.             accept cadena
  24.            
  25.             move 0 to j.
  26.             perform varying i from 80 by -1 until i = 0
  27.             if cadena(i:) not = ' ' then
  28.                add 1 to j
  29.                move cadena(i:1) to cadenax(j:1)
  30.             end-if
  31.             end-perform.
  32.                
  33.             display "Cadena resultado:".          
  34.             display cadenax.
  35.            
  36.             STOP RUN.
  37.            
  38.        END PROGRAM YOUR-PROGRAM-NAME.
  39.  

Kuk 24 de octubre de 2022 10:28

@CHITOBLA,

Código COBOL:
  1.        working-storage section.
  2.        
  3.        01  frase      pic x(100).
  4.        01  resultado  pic x(100).
  5.        01  lim        pic 9(4) comp-5.
  6.        01  idx        pic 9(4) comp-5.
  7.        
  8.        procedure division.
  9.            
  10.            move "hola amigos" to frase
  11.            
  12.            perform varying lim from length of frase by -1
  13.                until frase(lim:1) not = spaces or lim = 1
  14.            end-perform
  15.            
  16.            perform varying idx from 0 by 1 until idx > lim / 2  
  17.                move frase(lim - idx + 1:1) to resultado(idx:1)
  18.                move frase(idx:1)           to resultado(lim - idx + 1:1)
  19.            end-perform
  20.            
  21.            if  function rem(lim 2) = 1
  22.                move frase(lim / 2 + 1:1) to resultado(lim / 2 + 1:1)    
  23.            end-if
  24.            
  25.            display resultado

Kuk 24 de octubre de 2022 10:34

@JCantero, me gusta lo de

Código COBOL:
  1. 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.


La franja horaria es GMT +2. Ahora son las 01:51.

Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.