2011-01-17 3 views
0

Итак, я вошел в свой второй семестр колледжа, и у меня есть курс под названием Advanced COBOL. Как одно из моих назначений, я должен сделать свою программу, которая проверяет некоторые вещи в файле, чтобы убедиться, что вход не имеет ошибок. Я получаю общую идею, но есть всего лишь несколько вещей, которые я не понимаю, и мой учитель - один из тех людей, которые дадут вам задание и заставят вас понять это с небольшой помощью или без помощи. Итак, вот что мне нужно.Проверка данных

  1. У меня есть поле, что первые 5 столбцов должны быть числами, 6-й столбец прописной буквы, а последние 2 цифры в диапазоне 01-68 или 78-99.

  2. Одно из моих полей должно быть строкой цифр с тире в нем, как 00000-000, но некоторые из них имеют более одного тире. Как я могу подсчитать тире, чтобы определить, что есть проблема.

+0

Что вы пробовали? Вы ищете помощь в понимании концепций или реализации? – Davidann

+0

Я в основном думал о том, как работать над этой проблемой. Я думаю, что у меня есть решение для моего второго вопроса. Если я переведу запись с информацией, которую я должен проверить в другом поле, помещая каждый столбец в свою собственную запись, я могу проверить их 1 на 1 и добавить общее количество тире. Этот способ звучит немного сложнее, и я уверен, что там это более простой способ выполнить эту задачу. – Kimmy1235

ответ

2

Вот несколько советов ...

Используйте hieratical структуру записи, чтобы просмотреть данные по-разному. Например:

01 ITEM-REC. 
    05 ITEM-CODE. 
     10 ITEM-NUM-CODE PIC 9(3). 
     10 ITEM-CHAR-CODE PIC A(3). 
      88 ITEM-TYPE-A VALUE 'AAA' THRU 'AZZ'. 
      88 ITEM-TYPE-B VALUE 'BAA' THRU 'BZZ'. 
    05 QUANTITY   PIC 9(4). 

ITEM-CODE представляет собой поле из 6 символов группы, первая часть которого является числовым (ЭЛЕМЕНТ-NUM-КОД) и последняя часть буквенный (ЭЛЕМЕНТ-СИМ-КОД). Вы можете ссылаться на любую из этих трех переменных в вашей программе. Когда вы обратитесь к ITEM-CODE или к любому другому элементу группы, COBOL обрабатывает переменную, как если бы она была объявлена ​​как PIC X. Это означает, что вы можете MOVE что-нибудь в нем, не поднимая ошибки. Например:

MOVE 'ABCdef' TO ITEM-CODE 

или

MOVE 'ABCdef0005' TO ITEM-REC 

Ни один не будет вызывать ошибку, даже если элемент ITEM-NUM-CODE элементарных данные, безусловно, не является числом. Чтобы проверить достоверность данных ваших данных после группового перемещения, вы должны проверять каждый элемент элементарных данных отдельно (если только вы точно знаете, что ошибки типа данных не могли возникнуть). Существует множество способов сделать это. Для Например, если элемент данных должен быть числовыми следующее будет работать:

IF ITEM-NUM-CODE IS NUMERIC 
    CONTINUE 
ELSE 
    DISPLAY 'ITEM-NUM-CODE IS NOT NUMERIC' 
    PERFORM BIG-BAD-ERROR 
END-IF 

COBOL предоставляет различные тесты класса, которые могут быть применены в отношении элемента данных. Для примера обычно используются ЧИСЛЕННЫЕ, АЛФАВИТНЫЕ И АЛЬФАМЕННЫЕ.

Другим распространенным способом проверки диапазонов значений является определение различных 88 уровней - но упражнение предостережение. В приведенном выше примере пример ITEM-TYPE-A представляет собой уровень 88, который определяет диапазон данных от «AAA» до «AZZ» на основе текущей последовательности сопоставления. Для того, чтобы убедиться в том, что ITEM-CHAR-CODE содержит только буквенные символы и первая буква является «A» или «B», вы могли бы сделать что-то вроде:

IF ITEM-CHAR-CODE ALPHABETIC 
    DISPLAY 'ITEM-CHAR-CODE is alphabetic.' 
    EVALUATE TRUE 
     WHEN ITEM-TYPE-A 
     DISPLAY 'ITEM-CHAR-CODE is in range AAA through AZZ' 
     WHEN ITEM-TYPE-B 
     DISPLAY 'ITEM-CHAR-CODE is in range BAA through BZZ' 
     WHEN OTHER 
     DISPLAY 'ITEM-CHAR-CODE is in some other range' 
    END-EVALUATE 
ELSE 
    DISPLAY 'ITEM-CHAR-CODE is not alphabetic' 
END-IF   

Примечания отдельного теста для ALPHABETIC выше. Почему это, когда 88-уровневые тесты могли бы выполнить эту работу?На самом деле 88-х не являются достаточными, потому что они охватывают весь диапазон от AAA до AZZ на основе последовательности сортировки в настоящее время . В среде, основанной на EBCDIC (очень большое количество магазинов COBOL использует EBCDIC), это фиксирует значения , такие как A}\. символы закрывающей и обратной косой черты не альфа, но попадают в середину диапазон 'A' через 'Z' (что это за * * @! это все?). Также обратите внимание, что такое значение как 'aaa' не удовлетворяет условию ITEM-TYPE-A, потому что строчные буквы выпадают вне определенного диапазона. Возможно, время для проверки таблицы символов EBCDIC.

Наконец, вы можете подсчитать количество вхождений символа или строки символов, в переменную с INSPECT глагола следующим образом:

INSPECT ITEM-CODE TALLING DASH-COUNT FOR ALL '-' 

DASH-COUNT должен быть числовой элемент и будет содержать количество символов штрих-кода в ITEM-CODE. Глагол INSPECT не так полезен, если вы хотите подсчитать количество цифр. Для этого вам понадобится один оператор для каждой цифры.

Это может быть проще просто закодировать что-то вроде петли:

PERFORM VARYING I FROM 1 BY 1 
      UNTIL I > LENGTH OF ITEM-CODE 
    EVALUATE ITEM-CODE(I:1) 
     WHEN '-' 
     COMPUTE DASH-COUNT = DASH-COUNT + 1 
     WHEN '0' THRU '9' 
     COMPUTE DIGIT-COUNT = DIGIT-COUNT + 1 
     WHEN OTHER 
     COMPUTE OTHER-COUNT = OTHER-COUNT + 1 
    END-EVALUATE 
END-PERFORM 

Теперь спросите себя, почему мне было комфортно, используя чек от нуля до 9 диапазона? Подсказка: посмотрите на последовательность сортировки.

Надеюсь, это поможет.

+0

Ничего себе, похоже, что это немного опережает то, что мы делаем, но это немного помогает мне использовать эту инструкцию проверки. Я боюсь, хотя у меня есть две новые проблемы, но на самом деле у меня есть что-то, написанное сейчас. Я (sorta) новичок на этом сайте, поэтому не знаю, должен ли я редактировать этот пост или начинать новый. – Kimmy1235

+0

@ Kimmy1235 Редактирование исходного вопроса или публикация нового являются действительными. Измените вопрос, если вы пытаетесь разъяснить какой-то аспект исходного вопроса или ответы, которые вы получали, были в стороне. Задайте новый вопрос, если на исходный вопрос был дан ответ, и новый вопрос не должен касаться первого. Кроме того, не спешите принимать ответы - только принимайте ответ, если вы его удовлетворены. Некоторые вопросы не отвечают должным образом. – NealB

Смежные вопросы