2012-05-25 5 views
8

文字列を小文字(あるいは大文字)に変換する(インテル)F90関数を書くにはどうすればよいですか?関数に文字配列を渡し、文字配列を返したいとします。F90にto_upper()またはto_lower()関数を書くにはどうすればよいですか?

program main 
    implicit none 

    character*32 :: origStr = "Hello, World!" 
    character*32 :: newStr 

    newStr = to_lower(origStr) 
    write (*,*) newStr 

end program main 

このプログラムは、hello, world!を出力します。

RosettaCodeにあるサブルーチンから始めましたが、それを関数として書く方法を理解できません。

ありがとうございます!

PS - 不定期の長さの文字列を使用できる場合、ボーナスポイント!

答えて

6

このコードの元の著者として、私はそれがいくつかの助けになることを嬉しく思います。私は、なぜこれらの機能がFortranに組み込まれていないのか疑問に思っていました。私の推測によれば、彼らはかなり限られた手紙のセット、すなわち英語で使われるもののためにしか働かないということです。他のほとんどのヨーロッパ言語のテキストを使用している場合は、アクセント付きの文字を使用し、大文字または小文字に変換する方がはるかに難しくなります。たとえば、フランス語のe-graveは大文字に変換されますが、通常は平易なE(重大なアクセントは失われます)として表示されますが、e-acuteでは表示されません。 Fortranの設計者は、幅広い言語に適した施設を提供しようと常に努力してきましたが、多言語で大文字小文字の変換を行うのは簡単ではありません。少なくともそれはあなたが自分でそれをしなければならない理由についての私の推測です。

+0

こんにちはクライブ、こんにちは。私はまずあなたの本から2006年にFortranを学び始めました。ありがとうございました。 – milancurcic

+0

あなたの本を読んだことはありませんが、役に立つコードと洞察力のあるコメントに感謝します!私は最近、もう一人の同僚にルーチンを渡しました。私はそれにあなたの名前を追加する必要があります。 :-) – jvriesem

13

ワウ - 私は1時間以上を探していましたが、これを投稿した直後に、答えがhere(「その他のFortranのヒントとヒント」の下)に見つかりました。 (to_upperのために)、以下のように

私が使用したコードは次のとおりです。

function to_upper(strIn) result(strOut) 
! Adapted from http://www.star.le.ac.uk/~cgp/fortran.html (25 May 2012) 
! Original author: Clive Page 

    implicit none 

    character(len=*), intent(in) :: strIn 
    character(len=len(strIn)) :: strOut 
    integer :: i,j 

    do i = 1, len(strIn) 
      j = iachar(strIn(i:i)) 
      if (j>= iachar("a") .and. j<=iachar("z")) then 
       strOut(i:i) = achar(iachar(strIn(i:i))-32) 
      else 
       strOut(i:i) = strIn(i:i) 
      end if 
    end do 

end function to_upper 

が、これは誰かに役立ちます願っています!

+3

これは、ASCIIテーブルに基づいているacharとiacharに依存しています。私の知る限りでは、標準化されていません...(つまり、私は基本的に同じコードを実行します。私はASCIIテーブルを使用していないので...) – mgilson

+5

FORTRAN 90標準: "組み込み関数ACHARとIACHARは、これらの文字 とASCII照合シーケンスの整数の間の変換を提供します。 [link](http://www.nag.co.uk/sc22wg5/links.html)。 ICHARは、システムのネイティブ文字セット(必ずしもASCIIではない)を使用します。 – SimpleSimon

6

ここでは、簡単にループ内で低キャップの文字列を切り替えることにより、to_lowerにこれを変更することができASCII表現

Pure Function to_upper (str) Result (string) 

! ============================== 
! Changes a string to upper case 
! ============================== 

    Implicit None 
    Character(*), Intent(In) :: str 
    Character(LEN(str))  :: string 

    Integer :: ic, i 

    Character(26), Parameter :: cap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 
    Character(26), Parameter :: low = 'abcdefghijklmnopqrstuvwxyz' 

! Capitalize each letter if it is lowecase 
    string = str 
    do i = 1, LEN_TRIM(str) 
     ic = INDEX(low, str(i:i)) 
     if (ic > 0) string(i:i) = cap(ic:ic) 
    end do 

End Function to_upper 

に依存しないものです。

+0

私はそれがより移植性があるべき理由を見ません。 ASCII変換関数は標準のFortran 90であるため、EBCDICなどの異なる照合シーケンスを持つコンピュータでも動作します。また、あなたのプログラムも他のFortran 90の機能を使用しているので、 'achar'を使うプログラムと同じ方法でFortran 90コンパイラが必要です。 –

+0

十分に公正です。私は移植可能なステートメントを削除します。私は個人的には、ASCII表現の知識に頼っていないので、このメソッドはASCIIバージョンより一見わかりやすいと思うが、それはちょうど意見である: – SethMMorton

関連する問題