2012-05-25 15 views
8

Làm thế nào để viết một hàm F90 (Intel) chuyển đổi chuỗi thành chữ thường (hoặc, cách khác, chữ hoa)? Tôi muốn chuyển một mảng ký tự vào hàm và nó trả về một mảng ký tự, ví dụ:Làm cách nào để viết hàm to_upper() hoặc to_lower() trong F90?

program main 
    implicit none 

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

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

end program main 

sao cho chương trình này xuất kết quả hello, world!.

Tôi đã bắt đầu với chương trình con to_lower() được tìm thấy tại RosettaCode, nhưng tôi không thể tìm ra cách viết nó như một hàm.

Cảm ơn trước!

PS - Điểm thưởng nếu bạn có thể làm điều đó với một chuỗi có độ dài không cố định!

Trả lời

6

Là tác giả ban đầu của mã này, tôi rất vui vì đó là một số trợ giúp. Tôi đã từng tự hỏi tại sao những chức năng này không được xây dựng ở Fortran. Tôi đoán là họ chỉ làm việc cho một tập hợp các chữ cái khá hạn chế, tức là những chữ cái được sử dụng bằng tiếng Anh. Nếu bạn có văn bản trong hầu như bất kỳ ngôn ngữ châu Âu nào khác, bạn sẽ có các ký tự có dấu trọng âm và sau đó chuyển đổi chúng thành chữ hoa hoặc chữ thường thì khó hơn nhiều. Ví dụ e-grave trong tiếng Pháp biến thành chữ hoa thường được thể hiện như là chỉ đơn giản E (dấu mộ bị mất), nhưng trong e-cấp nó không. Các nhà thiết kế của Fortran luôn cố gắng cung cấp các cơ sở phù hợp với nhiều ngôn ngữ, và thực hiện chuyển đổi chữ hoa/chữ thường theo cách đa ngôn ngữ không hề dễ dàng. Ít nhất đó là dự đoán của tôi là tại sao bạn phải tự mình làm điều đó.

+0

Xin chào Clive, chào mừng bạn đến với SO. Lần đầu tiên tôi bắt đầu học Fortran vào năm 2006 từ cuốn sách của bạn. Chỉ muốn nói lời cảm ơn. – milancurcic

+0

Tôi chưa đọc sách của bạn, nhưng cảm ơn bạn vì mã hữu ích và nhận xét sâu sắc của bạn!Gần đây tôi đã thông qua thói quen cho một đồng nghiệp khác. Tôi sẽ phải thêm tên của bạn vào nó. :-) – jvriesem

13

Wow - mặc dù tôi đã tìm kiếm trong hơn một giờ, ngay sau khi đăng bài này, tôi đã tìm thấy câu trả lời here (trong "Mẹo và gợi ý Fortran khác").

Mã Tôi đã từng là như sau (đối với 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 

Hope this helps ai đó!

+3

điều này dựa vào achar và iachar được dựa trên bảng ASCII, mà kiến ​​thức của tôi không được chuẩn hóa ... (được nói, về cơ bản tôi cũng làm điều tương tự trong mã của mình và tôi chưa bao giờ có một trình biên dịch bất ngờ tôi bằng cách không sử dụng bảng ASCII ...) – mgilson

+5

theo tiêu chuẩn FORTRAN 90: "Các hàm nội tại ACHAR và IACHAR cung cấp chuyển đổi giữa các ký tự này và các số nguyên của chuỗi đối chiếu ASCII." [link] (http://www.nag.co.uk/sc22wg5/links.html). ICHAR sẽ sử dụng bộ ký tự gốc của hệ thống (không nhất thiết phải là ASCII). – SimpleSimon

6

Đây là một loại không dựa vào các đại diện 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 

Bạn có thể dễ dàng thay đổi này để to_lower bằng cách chuyển các dây thấp và nắp trong vòng lặp.

+0

Tôi không thấy lý do tại sao nó phải di động hơn. Các hàm chuyển đổi ASCII là chuẩn Fortran 90 và do đó cũng làm việc trên các máy tính có trình tự đối chiếu khác nhau, có thể là EBCDIC hay bất kỳ thứ gì khác. Và bởi vì chương trình của bạn cũng sử dụng các tính năng Fortran 90 khác, nó đòi hỏi trình biên dịch Fortran 90 theo cùng một cách, như chương trình sử dụng 'achar' làm .. –

+0

Đủ công bằng. Tôi sẽ xóa câu lệnh di động. Cá nhân tôi nghĩ phương pháp này dễ hiểu hơn ở cái nhìn đầu tiên so với phiên bản ASCII vì nó không dựa vào kiến ​​thức về biểu diễn ASCII, nhưng đó chỉ là ý kiến ​​:) – SethMMorton

Các vấn đề liên quan