2013-11-25 3 views
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. 
+0

구조체가 else 인 경우 else 대신에 true를 사용하여 제안하십시오. –

답변

0

정수에 소수점을 넣으십시오. COBOL은 십진수를 V (가상 소수점)으로 정렬 할 수있을 정도로 똑똑하고 PIC TURE에서 제공하는 저장 방법을 매핑하여 상대적으로 효율적인 sdata 저장소를 사람이 읽을 수있는 형식으로 앞뒤로 변환 할 수 있습니다.

PERFORM THROUGH을 사용하지 마십시오. 레이아웃 종속 코드가 생성됩니다.

귀하의 PERFORM MAIN-ROUTINE THRU ONE-MORE-TRY 때문에, GO TO PERFORM MAIN-ROUTINE

PERFORM END-PGMGO TO END-PGM

PERFORM ONE-MORE-TRY.GO TO ONE-MORE-TRY.

PERFORM 서브 루틴으로 대상 레이블에서 시작하는 코드를 실행해야해야 현재이어야한다 구조는 당신이를 통해 탈출 할 때까지 끝없이 리턴 주소 스택을 구축하고있다.

+0

COBOL에서 섹션 또는 단락을 수행하면 리턴 주소 스택이 빌드되지 않습니다. 대부분의 다른 프로그래밍 언어에서 구현 된 호출/반환 의미론에 익숙합니다. [COBOL Transfer of Control] (http://www3.sympatico.ca/bredam/TransferControl.html)에있는이 에세이는 COBOL의 PERFORM 동사가 실제로 어떻게 작동하는지 설명합니다.힘든 읽기이지만 COBOL 언어를 실제로 이해하려는 경우 "투자"의 가치가 있습니다. – NealB

+0

Fair 'nuff, @NealB - 정확한 메커니즘은 코그 센티의 문제입니다. 전통적으로 하드웨어는 스택을 지원하지 않습니다. 원리는 내 관점에서 볼 때 더 잘 이해할 수 있으며, 초심자들과 함께 초심자를 혼란스럽게하지 않는 것이 좋습니다. – Magoo

2

DIVIDE 작동에 두 가지 문제가 있습니다.

발생 순서 :

금액에 동의합니다. AMOUNT는 묵시적 소수점 자리 (PICture 문자열의 V)를 갖지만, ACCEPT는이 묵시적 십진수를 무시하기 위해 의도적으로 사용합니다. 사용자가 화면에 입력하는 내용과 일치하지 않습니다. 이 문제를 처리하는 방법은 여러 가지가 있습니다. 내재 된 함수의 수를 살펴 보는 것이 가장 간단한 방법 일 것입니다.

@Magoo가 지적한 것처럼 리터럴에서 소수점을 사용하지 않으므로 정수로 취급되므로 통화 변환에 사용되기를 기대하는 수치에 10,000을 곱해서 왼쪽 자른자를 효과적으로 사용합니다.

문제를보고 할 때 문제가 발생한 입력 데이터, 실제로 얻은 결과 및 예상되는 결과를 표시하는 것이 좋습니다. 어떤 일이 벌어지고 있는지 알아볼 수는 있지만 수정 방법을 모르는 경우 보너스입니다.

코딩 스타일에 태그를 지정했습니다. 질문을 편집하여 문제를 제거하고 싶을 것 같습니다. Coding-Style 태그에 관심이있는 사람들은 아마도 COBOL에 대해 잘 알지 못할 것입니다. 당신이 COBOL 프로그래머로서 미래의 커리어를 가지고 있다면, 당신의 스타일은 당신이 일하는 곳의 사이트 표준에 의해 다소 좌우 될 것이며, 사이트마다 바뀔 것입니다. 물론 자신 만의 스타일을 개발할 수는 있지만 개발은 단지 당신에게만 주어지는 것이 아닙니다. 당신이 얻을 수있는 찌르기를 알면 거기에 도착하는 것을 피하면서 스타일 (기술)을 개발할 수 있습니다. 모든 프로그래머가 스타일을 개발하는 데 시간을 할애하지 않기 때문에 상황이 어떻게되는지 알 필요가 있습니다.

여기에서 몇 가지 질문을 읽고 일반적인 문제에 대한 아이디어가 있는지 확인하십시오.