1
 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.
4

2 回答 2

2

让你的 DIVIDE 工作有两个问题。

按发生顺序:

您接受您的金额。您的 AMOUNT 有一个隐含的小数位(图片字符串中的 V),但为了您的目的,ACCEPT 将忽略这个隐含的小数位。不会与用户在屏幕上键入的内容对齐。有不止一种方法可以解决这个问题,也许最简单的方法就是查看 Intrinsic FUNCTION NUMVAL。

正如@Magoo 所指出的,您不要在文字中使用小数点,因此它们被视为整数,因此您希望用于货币转换的数字有效地乘以 10,000 并左截断。

报告问题时,最好显示给出问题的输入数据、实际达到的结果和预期结果。如果您可以弄清楚正在发生的事情但不确定如何纠正它,那将是一个奖励。

您已标记编码风格。我想你可能想通过编辑你的问题来删除它。对 Coding-Style 标签感兴趣的人可能不太了解 COBOL。如果您有未来作为 COBOL 程序员的职业,那么您的风格将或多或少取决于您工作地点的站点标准,并且会因站点而异。当然,你可以发展自己的风格,但它会发展,它不仅仅是给你的。了解您可能陷入的混乱有助于您发展风格(技术)以避免到达那里。您仍然需要知道事情是如何发生的,因为并非所有程序员都会花时间以风格的方式开发任何东西。

阅读这里的一些问题,看看你是否对常见问题有一些想法。

于 2013-11-25T07:49:47.580 回答
0

尝试将小数点放入常量中。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.

APERFORM从目标标签开始执行代码作为子例程,因此您当前的结构无休止地构建返回地址堆栈,直到您通过STOP RUN.

于 2013-11-25T06:56:14.107 回答