Проверка данных COBOL для заглавной буквы? - PullRequest
4 голосов
/ 26 января 2012

Я нахожусь в моем втором квартале колледжа и, принимая «Advanced COBOL», мы только что получили задание, которое требует от нас кодирования в некоторых процедурах проверки для различных данных.У меня все сделано за исключением небольшой процедуры проверки.

Существует поле с именем "PART-NUMBER" длиной 8 байтов.Первые 5 столбцов должны быть числом.6-й столбец должен быть заглавной буквой, а последние 2 столбца должны быть в диапазоне 01-68 или 78-99.Единственная проблема, которую я имею, состоит в том, чтобы выяснить, как проверить, что 6-й столбец является заглавной.

Вот код, который я использую: Из рабочего хранилища:

01 DETAIL-LINE.                                         
05 PART-NUMBER.                                     
    10 PART-FIRST-FIVE-DL        PIC X(5).          
    10 PART-LETTER-DL            PIC X.             
        88 CAPITAL-LETTER        VALUE 'A' THRU 'Z'.
    10 PART-LAST-TWO-DL          PIC XX.

Из 300-VALIDATE-PART-NUMBER

EVALUATE PART-LETTER-DL ALPHABETIC               
   WHEN TRUE EVALUATE CAPITAL-LETTER               
      WHEN FALSE MOVE 'YES' TO RECORD-ERROR-SWITCH
      MOVE 'PART NUMBER' TO FIELD-NAME            
      MOVE PART-NO-IN TO FIELD-VALUE              
      MOVE 'YES' TO PART-NO-ERROR                 
   END-EVALUATE                                    
   WHEN FALSE MOVE 'YES' TO RECORD-ERROR-SWITCH    
   MOVE 'PART NUMBER' TO FIELD-NAME                
   MOVE PART-NO-IN TO FIELD-VALUE                  
   MOVE 'YES' TO PART-NO-ERROR                     
END-EVALUATE 

Я знаю, что, вероятно,не делаю это очень эффективным способом, но сейчас мне просто нужно заставить его работать.Я прочитал целую главу о проверке данных из книги, и это своего рода ошибка в последнюю минуту (программа должна быть завтра), поэтому учитель недоступен.Я был бы очень признателен за любую помощь, которую я могу получить с этим.Я действительно потерялся в том, как я должен проверять заглавные буквы.Метод, который я сейчас использую, сообщает об ошибке, если в шестом столбце номера детали находится что-то кроме A или Z.

Ответы [ 4 ]

4 голосов
/ 26 января 2012

Я не вижу ничего принципиально неправильного в вашем коде. Я положил это в Драйвер программы, скомпилировал и запустил его. Я получил ожидаемые результаты: только сообщение об ошибке когда 6-й символ ЧАСТИ-НОМЕРА не был заглавной буквой.

Ваш стиль кодирования на COBOL сильно отличается от того, что я привык видеть (не неправильно, просто отличается).

Большинство ветеранов-программистов на COBOL пишут что-то вроде:

    IF PART-LETTER-DL IS ALPHABETIC AND
       CAPITAL-LETTER
       CONTINUE
    ELSE
       MOVE 'PART NUMBER' TO FIELD-NAME            
       MOVE PART-NO-IN TO FIELD-VALUE              
       MOVE 'YES' TO PART-NO-ERROR
    END-IF

IF применяет оба ваших критерия редактирования и ничего не делает, если оба проходят (ПРОДОЛЖИТЬ), в противном случае сообщается об ошибке (часть ELSE). Вышесказанное делает по сути то же самое, что и ваш код пример делает, кроме использования IF в отличие от EVALUATE.

Я даю вам полную оценку за тестирование ALPHABETIC и заглавной буквы. используя диапазон 88 уровней (THRU). Многие программисты будут использовать только 88 уровень, делая неявное предположение, что 'A' THRU 'Z' охватывает только буквенные символы - это совершенно неправильно в некоторых средах (в частности, наборы символов EBCDIC).

P.S. Я вижу, вы, ребята, должны иметь того же учителя, что и Кимми!

1 голос
/ 30 марта 2014

Для заглавных букв вы можете проверить условие ALPHABETIC-UPPER:

IF PART-LETTER-DL NOT EQUAL SPACE AND PART-LETTER-DL IS ALPHABETIC-UPPER
 ...
END-IF.

Также можно использовать ALPHABETIC-LOWER, но помните, что SPACE считается ALPHABETIC, поэтому тестирование SPACE необходимо, если вам нужны только заглавные буквы.

1 голос
/ 27 января 2012

Одна вещь, о которой вы должны беспокоиться - это «Значение» от «Z».Он будет работать только на машинах ASCII.

Если вы на самом деле кодируете значения 'A', 'B', 'C', ... 'Z'.Это будет работать на всех платформах.

0 голосов
/ 20 января 2013

Для EBCDIC, отбросьте тест ALPHABETIC и просто используйте 88:

88 CAPITAL-LETTER        VALUE 'A' THRU 'I'
                               'J' THRU 'R'
                               'S' THRU 'Z'.

Задание отдельных букв работает, но генерирует 26 сравнений!Вышесказанное порождает три.ALPHABETIC плюс 'A' THRU 'Z' только два, но в нем есть некоторая встроенная путаница (пробел является буквенным, а THRU содержит непечатные цифры в диапазоне от X'C1 'до X'E9').

...