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

 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 (виртуальная десятичная точка) и отображает метод хранения, предоставляемый PICTURE, чтобы относительно эффективное хранилище 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.

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