COBOL-Найти год рождения по возрасту

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

IDENTIFICATION DIVISION.
PROGRAM-ID. AGECONV.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 CURR-YEAR PIC X(4) VALUES SPACES.
01 YEAR-OF-BIRTH X(4).
PROCEDURE DIVISION
MOVE FUNCTION CURRENT-DATE TO CURR-YEAR.
DISPLAY CURR-YEAR
SUBTRACT CURR-YEAR BY 22
GIVING YEAR-OF-BIRTH.
DISPLAY YEAR-OF-BIRTH.

Я получил ошибку, что curr-year не является числовым.

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

Simon Sobisch 19.12.2020 17:46
Работа с датами и временем в языке Java
Работа с датами и временем в языке Java
Работа с датами и временем в языке Java была сильно переработана начиная с версии Java 8 и далее с появлением библиотеки java.time.
0
1
992
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вам нужен более сложный РАБОЧИЙ СЕКЦИЯ ХРАНЕНИЯ.

IDENTIFICATION DIVISION.
PROGRAM-ID. AGECONV.

DATA DIVISION.
WORKING-STORAGE SECTION.
01  WS-CURRENT-DATE-DATA.
    05  WS-CURRENT-DATE.
        10  WS-CURRENT-YEAR         PIC 9(04).
        10  WS-CURRENT-MONTH        PIC 9(02).
        10  WS-CURRENT-DAY          PIC 9(02).
    05  WS-CURRENT-TIME.
        10  WS-CURRENT-HOURS        PIC 9(02).
        10  WS-CURRENT-MINUTE       PIC 9(02).
        10  WS-CURRENT-SECOND       PIC 9(02).
        10  WS-CURRENT-MILLISECONDS PIC 9(02).

01  YEAR-OF-BIRTH                   PIC 9(04).

PROCEDURE DIVISION.
MOVE FUNCTION CURRENT-DATE TO WS-CURRENT-DATE-DATA
DISPLAY WS-CURRENT-YEAR
SUBTRACT WS-CURRENT-YEAR BY 22 GIVING YEAR-OF-BIRTH
DISPLAY YEAR-OF-BIRTH.
Ответ принят как подходящий

Для SUBTRACT поле отправки CURR-YEAR должно быть числовым. Он был определен как буквенно-цифровой. Это означает, что CURR-YEAR должно быть PIC 9(4). То же самое относится и к YEAR-OF-BIRTH, в котором отсутствовал PIC.

FUNCTION CURRENT-DATE — буквенно-цифровое поле отправки. Эти правила для MOVE не позволяют перемещать его непосредственно в числовое поле. Модификатор ссылки (1:4) был добавлен, чтобы разрешить перемещение.

Формат заявления SUBTRACT был неправильным и был изменен.

Пересмотренный код:

   IDENTIFICATION DIVISION.
   PROGRAM-ID. AGECONV.
   DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 CURR-YEAR PIC 9(4) VALUE ZERO.
   01 YEAR-OF-BIRTH PIC 9(4).
   PROCEDURE DIVISION.
   MOVE FUNCTION CURRENT-DATE (1:4) TO CURR-YEAR.
   DISPLAY CURR-YEAR
   SUBTRACT 22 FROM CURR-YEAR
   GIVING YEAR-OF-BIRTH.
   DISPLAY YEAR-OF-BIRTH.

Выход:

2020
1998

Разве так не должно быть MOVE FUNCTION CURRENT-DATE TO CURR-YEAR (1:4)? То, как это сейчас написано, ограничивает только буквенно-цифровой размер до 4 байтов, но сохраняет числовой год, не так ли? Примечание: вместо этого интересного хака я бы предложил использовать родительское поле: 01 CURR-YEAR-X. 03 CURR-YEAR PIC 9(4) VALUE ZERO.

Simon Sobisch 17.12.2020 16:59

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

Rick Smith 17.12.2020 17:18

пожалуйста, объясните: «Когда после функции она выполняет допустимое буквенно-цифровое перемещение в числовое» по сравнению с «буквенно-цифровым полем отправки [..] правила для MOVE не позволяют перемещать его непосредственно в числовое поле».

Simon Sobisch 17.12.2020 18:04

@SimonSobisch - «Это» в моем ответе относится к CURRENT-DATE, который обычно содержит «+» или «-» на 17-й позиции. Этот знак делает его нечисловым. Эффект заключается в перемещении «0000» (или ничего), а не года. Первые 4 позиции проходят числовую проверку, поэтому ход разрешается. «Это» в моем комментарии относится к эталонной модификации.

Rick Smith 17.12.2020 18:20

Это интересно. Итак, MOVE "0000" to CURR-YEAR будет разрешено (возможно, с предупреждением), но MOVE "00+0" to CURR-YEAR будет?

Simon Sobisch 17.12.2020 23:16

@SimonSobisch - ISO/IEC CD2.0 1989:202x. Оператор MOVE, GR 6 d) «Когда числовой или редактируемый числовой элемент является принимающим элементом», 3. «Когда операнд-отправитель описывается как буквенно-цифровой..., операнд-отправитель обрабатывается так, как если бы он был целым числом без знака из числовая категория" а. для элемента данных c. для буквального. Насколько я помню, это было то же самое, и получающий элемент может быть отображаемым, двоичным или упакованным десятичным числом.

Rick Smith 18.12.2020 00:06

Я сделал так, было передано действие для отображения этой дополнительной информации в моей группе

IDENTIFICATION DIVISION.
   PROGRAM-ID. AGECONV.
   DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 CURR-YEAR PIC 9(4) VALUE ZERO.
   01 YEAR-OF-BIRTH PIC 9(4).
   PROCEDURE DIVISION.
   MOVE FUNCTION CURRENT-DATE (1:4) TO CURR-YEAR.
   SUBTRACT 1999 FROM CURR-YEAR
   GIVING YEAR-OF-BIRTH.
   DISPLAY 'Me chamo Thiago Lyra e tenho '  YEAR-OF-BIRTH  ' anos de idade'.
   DISPLAY 'Meu email é: [email protected]'.

Другие вопросы по теме