Я думаю, что что-то не так с моей частью вычислений в моем коде, я не могу получить десятичный вывод для моего конвертера валют
IDENTIFICATION DIVISION.
PROGRAM-ID. MP2.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 AMOUNT PIC 9(4)V9(4).
01 AMTDIV PIC 99V9(4).
01 CURR PIC X(3).
88 PHP VALUE "PHP" "php".
88 USA VALUE "USD" "usd".
88 CND VALUE "CAD" "cad".
88 AUS VALUE "AUD" "aud".
01 RECURR PIC X(3).
88 PHPK VALUE "PHP" "php".
88 USAK VALUE "USD" "usd".
88 CNDK VALUE "CAD" "cad".
88 AUSK VALUE "AUD" "aud".
01 CONFIRM PIC X.
88 AGREE VALUE "Y" "y".
88 DISAGREE VALUE "N" "n".
PROCEDURE DIVISION.
START-UP.
DISPLAY "CURRENCY LIST".
DISPLAY "USD (US DOLLARS), CAD (CANADIAN DOLLAR)".
DISPLAY "PHP (PHILIPPINE PESO), AUD (AUSTRALIAN DOLLAR)".
DISPLAY " ".
MAIN-ROUTINE.
DISPLAY "ENTER AMOUNT: ".
ACCEPT AMOUNT.
DISPLAY "ENTER SOURCE CURRENCY: "
ACCEPT CURR.
IF PHP
DISPLAY "PHILLIPINE PESO"
DISPLAY "ENTER TARGET CURRENCY: "
ACCEPT RECURR
IF USAK
DISPLAY "AMERICAN DOLLAR"
MOVE 435450 TO AMTDIV
ELSE IF CNDK
DISPLAY "CANADIAN DOLLAR"
MOVE 416707 TO AMTDIV
ELSE IF AUSK
DISPLAY "AUSTRALIAN DOLLAR"
MOVE 410325 TO AMTDIV
ELSE
DISPLAY "INVALID OPTION"
ELSE IF USA
DISPLAY "AMERICAN DOLLAR"
DISPLAY "ENTER TARGET CURRENCY: "
ACCEPT RECURR
IF PHPK
DISPLAY "PHILIPPINE PESO"
MOVE 000230 TO AMTDIV
ELSE IF CNDK
DISPLAY "CANADIAN DOLLAR"
MOVE 009574 TO AMTDIV
ELSE IF AUSK
DISPLAY "AUSTRALIAN DOLLAR"
MOVE 009423 TO AMTDIV
ELSE
DISPLAY "INVALID OPTION"
ELSE IF CND
DISPLAY "CANADIAN DOLLAR"
DISPLAY "ENTER TARGET CURRENCY: "
ACCEPT RECURR
IF PHPK
DISPLAY "PHILIPPINE PESO"
MOVE 000240 TO AMTDIV
ELSE IF USAK
DISPLAY "AMERICAN DOLLAR"
MOVE 010442 TO AMTDIV
ELSE IF AUSK
DISPLAY "AUSTRALIAN DOLLAR"
MOVE 009837 TO AMTDIV
ELSE
DISPLAY "INVALID OPTION"
ELSE IF AUS
DISPLAY "AUSTRALIAN DOLLAR"
DISPLAY "ENTER TARGET CURRENCY: "
ACCEPT RECURR
IF PHPK
DISPLAY "PHILIPPINE PESO"
MOVE 000244 TO AMTDIV
ELSE IF CNDK
DISPLAY "CANADIAN DOLLAR"
MOVE 010166 TO AMTDIV
ELSE IF USAK
DISPLAY "AMERICAN DOLLAR"
MOVE 010612 TO AMTDIV
ELSE
DISPLAY "INVALID OPTION"
ELSE
DISPLAY "INVALID OPTION".
DIVIDE AMOUNT BY AMTDIV GIVING AMOUNT.
DISPLAY "CONVERTED AMOUNT: "AMOUNT.
ONE-MORE-TRY.
DISPLAY "WOULD YOU LIKE TO CONVERT ANOTHER CURRENCY? [Y/N]?".
ACCEPT CONFIRM.
IF AGREE
PERFORM MAIN-ROUTINE THRU ONE-MORE-TRY
ELSE IF DISAGREE
PERFORM END-PGM
ELSE
DISPLAY "INVALID OPTION"
PERFORM ONE-MORE-TRY.
END-PGM.
STOP RUN.
2 ответа
У вас есть две проблемы в получении вашего DIVIDE на работу.
В порядке появления:
Вы ПРИНИМАЕТЕ СУММУ. У вашей AMOUNT есть подразумеваемый десятичный знак (V в строке PICture), но ACCEPT собирается, для вашей цели, игнорировать этот подразумеваемый десятичный знак. Там не будет никакого выравнивания с тем, что пользователь печатает на экране. Есть несколько способов справиться с этим, возможно, самый простой для вашей цели - взглянуть на внутреннее целое число.
Вы, как указал @Magoo, не используете десятичные точки в своих литералах, поэтому они обрабатываются как целые числа, поэтому фактически цифры, которые вы ожидаете использовать для конвертации валюты, умножаются на 10000 и усекаются влево.
При сообщении о проблеме хорошей идеей будет показать входные данные, которые привели вас к проблеме, результат, которого вы на самом деле достигли, и ожидаемый результат. Если вы можете понять, что происходит, но не знаете, как это исправить, это бонус.
Вы пометили стиль кодирования. Я думаю, что вы можете удалить это, отредактировав свой вопрос. Люди, интересующиеся тегом Coding-Style, вероятно, не слишком осведомлены о COBOL. Если у вас есть будущая карьера программиста на COBOL, ваш стиль будет более или менее продиктован стандартами сайта, где вы работаете, и будет меняться от сайта к сайту. Вы можете, конечно, разработать свой собственный стиль, но он развивается, он не просто дан вам. Знание беспорядков, в которые вы можете попасть, поможет вам развить стиль (технику), чтобы избежать попадания туда. Вам все еще нужно будет знать, как все происходит, потому что не все программисты тратят время на разработку чего-либо в стиле.
Прочитайте некоторые вопросы здесь, и посмотрите, есть ли у вас какие-то идеи по поводу общих проблем.
Попробуйте ввести десятичную точку в свои константы. COBOL достаточно умен, чтобы выровнять десятичную с V
(виртуальная десятичная точка) и отображает метод хранения, предоставляемый PIC
TURE, чтобы относительно эффективное хранилище sdata можно было переводить назад и вперед в удобочитаемую форму.
Никогда не используйте PERFORM THROUGH
- это производит зависимый от макета код.
Ваш PERFORM MAIN-ROUTINE THRU ONE-MORE-TRY
должно быть GO TO PERFORM MAIN-ROUTINE
PERFORM END-PGM
должно быть GO TO END-PGM
а также PERFORM ONE-MORE-TRY.
должно быть GO TO ONE-MORE-TRY.
PERFORM
выполняет код, начинающийся с метки назначения, в качестве подпрограммы, поэтому ваша текущая структура бесконечно строит стек обратных адресов, пока вы не получите помощь через STOP RUN.