2012-11-09 2 views
0

연습을 위해 간단한 포트란 코드를 작성하려고합니다. 그것은 범위 내의 숫자를 곱하기로되어 있습니다. 매번 그 결과가 같은 자릿수로 구성되어 있는지보고 싶기 때문에 결과 제품이 문자열로 변환됩니다.Fortran : Integer to String 예

정수를 문자열로 변환하고 문자열의 구성 요소를 입력하는 방식을 테스트 한 결과 모든 것이 올바르게 수행되었습니다. 그런 다음 문자열 (string : number : number)을 사용하는 문자열의 구성 요소를 비교해야합니다. 그러나이 작업을 올바르게 수행 할 수있는 코드를 얻지 못했습니다. 그래서 문자를 정의

program test 
implicit none 
character(10) myString 
character(1) a,b,c,d,e,f 
integer::i,j,k 
do i=900,901,1 
     j=900 
     k=i*j 
     write(*,*)'k =', k 
     write(myString,'(i10)') k 
     write(*,*)'myString = ', myString 
     a=myString(1:1) 
     b=myString(2:2) 
     c=myString(3:3) 
     d=myString(4:4) 
     e=myString(5:5) 
     f=myString(6:6) 
     print*,a,b,c,d,e,f 
     if (d==f) then 
      print*,'hobla' 
     else 
      print*,'fobla' 
     end if 
end do 

stop 
end program test 

:

여기서 코드 출력의 A, B, C, D, E, F는 문자열의 구성 요소를 포함. 그리고 myString (i : i)을 사용하여 각 구성 요소를 찾고 문자 a, b, c, d, e, f 중 하나에 저장합니다. 하지만 처음 두 개만 제대로 작동하고 나머지는 저장되지 않는 것 같습니다!

출력 :

k =  810000 
myString =  810000 
    81 
fobla 
k =  810900 
myString =  810900 
    81 
fobla 

공지 사항 (81)이은 처음 810,000 주기로 및 인쇄 "hobla"했다. 그리고 두 번째로 810900을주고 "fobla"를 인쇄하십시오. 그러나 이것은 일어나지 않았다!

누구나 myString이 0을 문자로 허용하는 방법을 보여줄 수 있습니까?

+0

나는 이해할 수 없다. 'myString'은 0을 가지며,'write (*, *) 'myString =', myString'을 할 때 그것들을 출력합니다. 문제는 정확히 무엇입니까? – tpg2114

+0

예, 죄송합니다. 필자가 실제로 의미하는 바는 a, b, c, d, e, f 문자가 myString의 구성 요소를 포함해야한다는 것입니다. 그러나 오직 a, b는 나머지가 무시된다는 것을 보여주고 있습니다. 그것이 81을 인쇄하는 이유입니다.나는 틀린 것이 무엇인지 여기에서 확신하지 않는다. – stupidity

답변

2

좋아요, 그래서 문제를 알아 냈습니다. 코드에 다음과 같은 수정을 고려

program test 
implicit none 
character(10) myString 
character(1) a,b,c,d,e,f 
integer::i,j,k 
do i=900,901,1 
    j=900 
    k=i*j 
    write(*,*)'k =', k 
    write(myString,'(i10)') k 
    write(*,*)'myString = ', myString 
    a=myString(1:1) 
    b=myString(2:2) 
    c=myString(3:3) 
    d=myString(4:4) 
    e=myString(5:5) 
    f=myString(6:6) 
    write(*,*) a 
    write(*,*) b 
    write(*,*) c 
    write(*,*) d 
    write(*,*) e 
    write(*,*) f 
    if (d==f) then 
     print*,'hobla' 
    else 
     print*,'fobla' 
    end if 
end do 

stop 
end program test 

결과 출력은 다음과 같습니다

k =  810000 
myString =  810000 




8 
1 
fobla 
k =  810900 
myString =  810900 




8 
1 
fobla 

I 형식 오른쪽에 맞 번호를 인쇄 할 때 때문에이 발생합니다. 따라서 글자가 쓰는 동안 숫자는 6 자리뿐이기 때문에 공백이 많이옵니다. 따라서 4 개의 공백을 얻을 수 있습니다.

당신이 당신의 형식 문자열을 변경하는 경우

그래서 당신은 : 그것은 패드 공의와 의지 공백

write(myString,'(i10.10)') k 

다음 대신 패딩을. 그렇게하면 오히려 비교할 수있는 숫자를 항상 가질 수 있습니다.

4

이 문

write(myString,'(i10)') k 

10 자 필드 K의 값을 기록한다. k는 유효 숫자 6 자리 만 있기 때문에 myString의 처음 4 문자는 공백으로 채워집니다. 그런 다음 변수 a,b,c,d,e,f에 처음으로 6자인 myString (공백 4 개와 숫자 8 및 1)을 할당하고 4 개의 공백과 2 개의 숫자를 출력합니다.

위치 7..10의 다른 문자를 myString으로 인쇄 해보고 '누락 된'숫자가 표시됩니다.

+0

정말 고마워요 :) – stupidity