Coding style 我认为我的代码中的计算部分有问题,我无法为我的货币转换器获得十进制输出

Coding style 我认为我的代码中的计算部分有问题,我无法为我的货币转换器获得十进制输出,coding-style,cobol,cobol.net,Coding Style,Cobol,Cobol.net,尝试将小数点放入常数中。COBOL足够智能,可以将小数点与V(虚拟小数点)对齐,并映射PICTURE提供的存储方法,从而可以将相对高效的sdata存储来回转换为人类可读的形式 切勿使用通过执行-它会生成与布局相关的代码 您的通过一次或多次尝试执行主例程 应转到执行主例行程序 执行末端PGM 应该是转到END-PGM 然后再进行一次尝试。 应该是转到再试一次。 PERFORM将从目标标签开始的代码作为子例程执行,因此您当前的结构将无休止地构建一个返回地址堆栈,直到您通过停止运行退出。您在使DIVI

尝试将小数点放入常数中。COBOL足够智能,可以将小数点与
V
(虚拟小数点)对齐,并映射
PIC
TURE提供的存储方法,从而可以将相对高效的sdata存储来回转换为人类可读的形式

切勿使用
通过执行
-它会生成与布局相关的代码

您的
通过一次或多次尝试执行主例程
转到执行主例行程序

执行末端PGM
应该是
转到END-PGM

然后再进行一次尝试。 应该是
转到再试一次。


PERFORM
将从目标标签开始的代码作为子例程执行,因此您当前的结构将无休止地构建一个返回地址堆栈,直到您通过
停止运行退出。

您在使DIVIDE工作时遇到两个问题

按发生顺序:

你接受你的金额。您的金额有一个隐含的小数点位(图片字符串中的V),但出于您的目的,ACCEPT将忽略这个隐含的小数点位。与用户在屏幕上键入的内容不一致。处理这个问题的方法不止一种,也许最简单的方法就是查看内在函数NUMVAL

正如@Magoo所指出的,您的文字中不使用小数点,因此它们被视为整数,因此,您希望用于货币转换的数字实际上被乘以10000并左截断

报告问题时,最好显示问题的输入数据、实际实现的结果和预期结果。如果你能弄清楚发生了什么,但不确定如何纠正,这是一个额外的好处

您已经标记了编码样式。我想你可能想通过编辑你的问题来删除它。对编码风格标签感兴趣的人可能不太了解COBOL。如果你将来的职业是COBOL程序员,你的风格或多或少会受到你工作地点的站点标准的影响,并且会随着站点的不同而变化。当然,你可以发展你自己的风格,但它会发展,它不仅仅是给你的。了解你可能陷入的困境有助于你形成避免陷入困境的风格(技巧)。您仍然需要知道事情是如何发生的,因为并非所有程序员都会花时间以风格的方式开发任何东西


通读此处的一些问题,看看您是否对常见问题有所了解。

在COBOL中,执行节或段落不会构建返回地址堆栈,而您可能对大多数其他编程语言中实现的调用/返回语义很熟悉。这篇关于的文章解释了COBOL中的PERFORM动词是如何工作的。这本书读起来有点难,但如果你真的想理解COBOL语言,那么值得“投资”。Fair'nuff,@NealB-确切的机制是认知者的事。传统上,硬件不支持堆栈。在我看来,从堆栈的角度更好地理解这一原则,最好不要用小步舞曲分散初学者的注意力。建议使用Evaluate true(参见)而不是else if结构
 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.