2016-06-06 2 views
-2

1) Прочитайте строку из 2000 символов и замените все SPACES на один символ «+» плюс. то есть конвертировать "A B" в "A+B" или "A B" к "A+B"Как написать код кобола, чтобы сделать следующую логику?

2) Читать строку 2000 знаков, а затем искать для конкретных моделей, как «PWD» или «INI» или т.д., и, наконец, хранить следующие 6 символов в переменный.

3) Прочитайте строку из 2000 символов и сохраните последнее слово в строке переменной.

Редактировать: Я использую Micro Focus COBOL.

This - это снимок экрана моего фрагмента кода.

Мой код ниже. Он удаляет несколько пробелов, но не все. Попробуйте написать любое предложение со случайными номерами пробелов между словами и входным файлом для тестовых данных.

IDENTIFICATION DIVISION. 
    PROGRAM-ID. SALAUT. 
    ENVIRONMENT DIVISION. 
    FILE-CONTROL. 
    SELECT IN-FILE ASSIGN TO "INFILE" 
      ORGANIZATION IS LINE SEQUENTIAL 
      FILE STATUS IS WS-IN-FILE-STATUS. 
    SELECT OUT-FILE ASSIGN TO "OUTFILE" 
      ORGANIZATION IS LINE SEQUENTIAL 
      FILE STATUS IS WS-OUT-FILE-STATUS. 
    DATA DIVISION. 
    FILE SECTION. 
    FD IN-FILE. 
    01 FS-IN-FILE       PIC X(200). 
    FD OUT-FILE. 
    01 FS-OUT-FILE       PIC X(200). 
    WORKING-STORAGE SECTION. 
     01 WS-ATMA-C. 
     03 WS-OUT-FILE-STATUS  PIC X(02). 
     03 WS-IN-FILE-STATUS  PIC X(02). 
     03 WS-LOOP-COUNTER   PIC 9(03) VALUE 1. 
     03 WS-IN-EOF    PIC X value 'N'. 
     03 WS-IN-FILE-LEN   PIC 9(03). 
     03 WS-IN-SPACE-CNT   PIC 9(03) VALUE 1. 
     03 FS-IN-FILE-2    PIC X(200). 
     03 WS-TRIL-SPACE-CNT  PIC 9(03). 
     03 WS-TOT-SPACE-CNT   PIC 9(03). 
    PROCEDURE DIVISION. 
    MAIN-PARA.  
     OPEN INPUT IN-FILE. 
     IF WS-IN-FILE-STATUS <> '00' 
     EXHIBIT 'IN-FILE-OPEN-ERROR : STOP-RUN' 
     EXHIBIT NAMED WS-IN-FILE-STATUS 
     PERFORM MAIN-PARA-EXIT 
     END-IF. 
     OPEN OUTPUT OUT-FILE. 
     IF WS-OUT-FILE-STATUS <> '00' 
     EXHIBIT 'OUT-FILE-OPEN-ERROR : STOP-RUN' 
     EXHIBIT NAMED WS-OUT-FILE-STATUS 
     PERFORM MAIN-PARA-EXIT 
     END-IF. 

     PERFORM SPACE-REMOVER-PARA THRU SPACE-REMOVER-PARA-EXIT. 

     CLOSE IN-FILE. 
     IF WS-IN-FILE-STATUS <> '00' 
      EXHIBIT 'IN-FILE-CLOSE-ERROR : STOP-RUN' 
      EXHIBIT NAMED WS-IN-FILE-STATUS 
      PERFORM MAIN-PARA-EXIT 
     END-IF. 
     CLOSE OUT-FILE. 
     IF WS-OUT-FILE-STATUS <> '00' 
     EXHIBIT 'IN-FILE-CLOSE-ERROR : STOP-RUN' 
     EXHIBIT NAMED WS-OUT-FILE-STATUS 
     PERFORM MAIN-PARA-EXIT 
     END-IF. 
    MAIN-PARA-EXIT. 
     STOP RUN. 
    SPACE-REMOVER-PARA. 
    PERFORM UNTIL WS-IN-EOF = 'Y' 
    INITIALIZE FS-IN-FILE FS-OUT-FILE WS-IN-FILE-LEN FS-IN-FILE-2 
    READ IN-FILE 
    AT END 
     MOVE 'Y' TO WS-IN-EOF 
    NOT AT END 
     INSPECT FS-IN-FILE TALLYING WS-IN-FILE-LEN FOR CHARACTERS 
     EXHIBIT NAMED WS-IN-FILE-LEN 
     MOVE 1 TO WS-LOOP-COUNTER 
     IF WS-IN-FILE-LEN <> 0 
     PERFORM UNTIL WS-IN-SPACE-CNT <= ZEROS 
     INSPECT FS-IN-FILE TALLYING WS-TOT-SPACE-CNT FOR ALL " " 
     INSPECT FUNCTION REVERSE (FS-IN-FILE) TALLYING 
        WS-TRIL-SPACE-CNT FOR LEADING " " 
     INITIALIZE WS-IN-SPACE-CNT 
     COMPUTE WS-IN-SPACE-CNT = 
        WS-TOT-SPACE-CNT - WS-TRIL-SPACE-CNT 
     PERFORM VARYING WS-LOOP-COUNTER FROM 1 BY 1 
      UNTIL WS-LOOP-COUNTER >= 
       WS-IN-FILE-LEN - (2 * WS-TRIL-SPACE-CNT) 
     IF FS-IN-FILE(WS-LOOP-COUNTER:2) = " " 
     STRING FS-IN-FILE(1:WS-LOOP-COUNTER - 1) DELIMITED BY SIZE 
       FS-IN-FILE(WS-LOOP-COUNTER + 2 
          : WS-IN-FILE-LEN - WS-LOOP-COUNTER - 2) 
               DELIMITED BY SIZE 
       INTO FS-IN-FILE-2 
     END-STRING 
     INITIALIZE FS-IN-FILE 
     MOVE FS-IN-FILE-2 TO FS-IN-FILE 
     INITIALIZE FS-IN-FILE-2 
     END-IF 
     END-PERFORM 
     INITIALIZE WS-LOOP-COUNTER WS-TRIL-SPACE-CNT WS-TOT-SPACE-CNT 
     END-PERFORM 
     WRITE FS-OUT-FILE FROM FS-IN-FILE 
     IF WS-OUT-FILE-STATUS <> '00' 
     EXHIBIT 'OUT-FILE-WRITE-ERROR : STOP-RUN' 
     EXHIBIT NAMED WS-OUT-FILE-STATUS 
     PERFORM MAIN-PARA-EXIT 
     END-IF 
     END-IF 
    END-READ 
    END-PERFORM. 
    SPACE-REMOVER-PARA-EXIT. 
     EXIT. 
+1

Добро пожаловать на SO.com. Это домашнее задание? Что вы пробовали? Где вы застряли? – martijnn2008

+0

Спасибо, Марти. Это что-то, где я хочу автоматизировать часть своей работы. Во-вторых, я попробовал INSPECT, чтобы удалить два последовательных пробела одним пробелом, но idk, как остановить цикл, как в каждой следующей строке, их будет случайным числом пробелов. В-третьих, я не знаю, как получить позицию столбца слова в строке в коболе. Как только я смогу извлечь позицию столбца таких слов, как «PWD» или «INT», было бы проще извлечь другие необходимые данные из строки чтения длиной 2000. –

+0

Итак, что вы хотите сделать, если строка имеет 200 пробелов подряд ? Значит, вы захотите 200 знаков «+» последовательно? У вас есть пример вашего кода? – Thraydor

ответ

2

Как INSPECT REPLACING только позволяет заменить такое же количество байтов, вы не можете использовать его. Поскольку Брайан указал, что ваше COBOL может работать с такими вариантами, как GnuCOBOL's FUNCTION SUBSTITUTE. В любом случае вопрос «Какой COBOL» по-прежнему полезен для ответа.

Чтобы использовать подход Thraydor, используйте UNSTRING в таблице, используя указатель на строку. Что-то вдоль

MOVE 1 TO strpoint 
PERFORM VARYING table-idx FROM 1 BY 1 
     UNTIL table-idx = table-max 
    UNSTRING your2000line DELIMITED BY ALL SPACES 
      INTO tmp-table (table-idx) 
      WITH POINTER strpoint 
     NOT ON OVERFLOW 
      EXIT PERFORM 
    END-UNSTRING 
END-PERFORM 

Другой подход, который всегда работает простой PERFORM над 2000 байт с кучей IF your2000line (pos:1) заявления (если это возможно: объединить его в один EVALUATE) проверки побайтно (сравнивая последний байт для удаления повторяющиеся байты), переводящий источник с заменой во временное поле и MOVE обратно после того, как вы закончите

Пожалуйста, отредактируйте ваш вопрос, чтобы показать, что именно вы пробовали, и вы можете получить гораздо лучшие ответы.

+0

Спасибо всем за ваше время и помощь. Plz найти ниже ссылку на снимок экрана моей части кода. Я использую микрофокус cobol http://s32.postimg.org/7aqcy3jlx/IMG_20160614_190250_01.jpg –

+0

Кажется, на этот вопрос ответили, не так ли? Благодарим вас за снимок экрана, но даже лучше было бы принять ответ и отредактировать его впоследствии (либо сохранить исходный источник, либо добавить свои ниже). –

+0

Я пробовал подход, но он не работает. Я хочу помочь вам, ребята, выяснить, что случилось. –

1

Во-первых, имейте в виду, что COBOL - это язык диалектов. Существуют также активные коммерческие компиляторы, которые нацелены на 1974, 1985, 2002 (теперь устаревшие, зарегистрированные в 2014 году) и Стандарты 2014 года. Все со своими языковыми расширениями, которые могут или многие не выполняться в другом компиляторе COBOL.

Если вы ориентируетесь на свое обучение в определенной среде (IBM MSC), используйте этот диалект в качестве подмножества того, что доступно вам в фактическом COBOL, который вы используете. Это означает использование руководств IBM.

Не выбирайте и не выбирайте вещи из мест и не используйте их просто потому, что это как-то казалось хорошей идеей в то время.

Я должен признать, что EXHIBIT был очень полезен в использовании, но это было только расширение языка, и IBM отказала его, по крайней мере, в более поздних выпусках OS/VS COBOL. Он, как и ON, был «отладочной» операцией, хотя это не помешало их «нормально» использовать. Есть дополнительные накладные расходы на использование EXHIBIT через простой дисплей. IBM Enterprise COBOL имеет простой дисплей.

Хотя вы можете подумать, что это забавно использовать пиктограммы («о, моя доброта, какой символ я должен использовать для этого» фигуры, пытающейся вытащить собственные волосы), помните, что этот конкретный символ был опозданием к 2014, и если он появится в Enterprise COBOL в течение следующих 20-50 лет, я был бы удивлен (очень низкий список вещей, которые нужно сделать, еще один симпатичный способ написать «не равно», когда уже существует , и COBOL даже имеет ELSE).

Некоторые указатели. У вас нет процедуры, называемой «remove-all-the-spaces», если она сама по себе является «все, в том числе-install-a-new-kitchen-sink». Неудивительно, что вы не можете найти, почему это не работает?

Многие, многие, многие программы COBOL имеют задачу чтения файла до конца и обработки записей в файле. Сначала сделайте себе одного из тех, кто работает хорошо. Это относится к «бизнес-процессу», к которому обращается программа? Нет, это просто технические вещи, которых вы не можете обойти без , так что спрячьте его где-нибудь. Где? в PERFORMed процедурах (параграфы или СЕКЦИИ). Не ожидайте, что кто-то, кто быстро захочет узнать, что делает ваша программа, хочет прочитать материал, который делает каждая программа. Скрыть.

Здесь вы можете найти общий совет по написанию программ COBOL. Обратите внимание на те, которые советуют использовать полные остановки/периоды, чтение прайминга и общую структуру программ COBOL.

Очень важно точно описывать вещи. Работайте над хорошими, описательными, точными именами имен и процедур. Файл представляет собой набор записей.

Вы сократили размер своих данных, чтобы упростить тестирование, не осознавая, что у вас возникли проблемы с вашими определениями данных, когда вы возвращаетесь к полноразмерным данным. Ваши «счетчики» могут содержать только три цифры, когда им нужно иметь возможность справляться с номерами до 2000.

Нет смысла делать что-то с частью данных, а затем сразу же сжимать что-то с чем-то другое, которое никоим образом не связано с оригинальным.

MOVE SPACE TO B 
MOVE A TO B 

Первый MOVE является излишним, superflous, и ничего не делает, но сосать процессорное время и запутать следующий читатель вашей программы. «Не хватает кода, потому что иначе это просто глупо».

Это вариант этого примера с MOVE, и вы делаете это повсюду:

INITIALIZE WS-IN-SPACE-CNT 
    COMPUTE WS-IN-SPACE-CNT = 
       WS-TOT-SPACE-CNT - WS-TRIL-SPACE-CNT 

ИНИЦИАЛИЗАЦ является пустой тратой пространства, ресурсов, и интродьюсером путаницы, и дополнительные строки кода, чтобы сделать вашу программу более трудной для понимания.

Кроме того, не перезагружайте вещи после их использования, чтобы они были «готовы к следующему разу». Это создает зависимости, которые будущий аспект вашей программы не ожидает. Даже когда они ожидаются/замечены, они делают код сложнее следовать.

Точно, что не так с вашим кодом, невозможно сказать, не зная, что вы считаете неправильным с ним. Например, нет даже знака «+», заменяющего любые пробелы, поэтому, если вы считаете, что это неправильно, вы просто не закодировали его.

Вы также только пытались выполнить одну из трех задач. Если один из тех, кто не работает, то, что вы считаете неправильным ...

Зная, что вы считаете неправильным, это одно, но есть и другие проблемы. Если вы садитесь и разбираете их, методично, тогда вы придумаете «структурно» программу COBOL, которая поможет вам понять, что делает ваш собственный код, и где проблемы лежат.

A B C D E 

A+B+C+D+E 

Чтобы получить от первого ко второму с помощью STRING, смотрите в предложении Саймона для использования с указкой.

Другой подход, который вы могли бы предпринять, будет использовать ссылку-модификацию.

В любом случае, вы бы построить свой результат поле кусок в то время

This field intentionally blank 
A 
A+B 
A+B+C 
A+B+C+D 
A+B+C+D+E 

Вместо того, чтобы бросать все данные вокруг каждый раз. Существуют и другие способы его кодирования, но это может быть позже.