2014-07-09 2 views
0

다음 포트란 코드는 사용자의 입력에 따라 원 또는 직사각형의 면적을 계산합니다. 입력 부동 소수점이 하나만있는 경우 원의 면적을 계산하고 두 개가 있으면 직사각형의 영역을 반환합니다. 현재, 사용자가 처음에 1 또는 2를 입력하여이 작업을 수행합니다. 그러나, 나는 fortran의 입력 매개 변수를 무한히 # 읽는 직접적인 방법이 있는지 알고 싶습니다. 당신의 지혜를 제공하십시오. 감사합니다! 포트란 컴파일러 명령 줄 인수를 처리하기위한 고유의 루틴을 제공합니다 최신Fortran에서 함수/서브 루틴의 입력 매개 변수를 무한정 # 읽는 방법?

module MA 
    implicit none 

interface area 
    module procedure area_circ ! calculate the area of circles 
    module procedure area_rec ! rectangles 
end interface 

contains 
    real function area_circ(a) 
    implicit none 
    real, intent(in) :: a 
    real, parameter :: pi=3.14159 
    area_circ = pi*a**2 
    write(*,"('Area of circle = ',F6.2)") area_circ 
    return 
end function area_circ 

real function area_rec(a,b) 
    implicit none 
    real, intent(in) :: a,b 
    area_rec=a*b 
    write(*,"('Area of rectangle = ',F6.2)") area_rec 
    return 
end function area_rec 

end module MA 

program hw1101 
    use MA 
    implicit none 
    real :: a,b,S 
    integer :: i 

    write(*,*) 'Please type # of parameters: ' 
    read(*,*) i 
    if(i==1) then 
    write(*,*) "Please type one parameter: " 
    read(*,*) a 
    S=area(a) 
    else if (i==2) then 
    write(*,*) "Please type two paramters: " 
    read(*,*) a,b 
    S=area(a,b) 
    else 
    write(*,*) "Other functions under construction..." 
    end if 

    stop 
end program hw1101 

답변

3

. 프로그램을 실행할 때 제공되는 번호를 얻으려면 COMMAND_ARGUMENT_COUNT 함수를 사용할 수 있습니다. 그런 다음 하나씩 읽습니다. 이 같은 아마 뭔가 : 서브 루틴 GET_COMMAND_ARGUMENT (나는 arg라고 한) 두 번째 인수를 통해 문자 변수를 반환

CHARACTER(len=16) :: arg 
    REAL, DIMENSION(4) :: arguments 
    ... 
    DO ix = 1, COMMAND_ARGUMENT_COUNT() 
    CALL GET_COMMAND_ARGUMENT(ix,arg) 
    READ(arg,*) arguments(ix) 
    END DO 

참고. 다른 선택적 인수가 있으므로 일부 문서를 확인하고 싶을 수 있습니다.

area 함수를 호출 할 때 현재 접근 방식에 문제가 없지만 원하는 경우 선택적 인수를 사용하는 영역 함수를 작성할 수도 있습니다. 예를 들면 다음과 같습니다.

REAL FUNCTION area(a,b) 
    REAL, INTENT(in) :: a 
    REAL, INTENT(in), OPTIONAL :: b 
    IF (.NOT.PRESENT(b)) THEN 
     area = 3.14159*a*a 
    ELSE 
     area = a*b 
    END IF 
    END FUNCTION area 

일반적인 아이디어를 제공해야합니다. OPTIONAL 속성과 내장 논리 함수 PRESENT은 선택적 인수가있는 루틴에 필요한 것입니다. 나는 당신이 이미 취한 접근법이 실제로 더 좋다고 생각합니다.

0
real a, b, s 
character(len=20) :: string_in 
integer istat 
read(*, '(a)') string_in 
read(string_in, *, iostat=istat) a, b 
if (istat /= 0) then 
    read(string_in, *, iostat=istat) a 
    if (istat == 0) s = area (a) 
else 
    s = area (a, b) 
end if 
관련 문제