2012-05-25 13 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! आउटपुट करता है।

मैं to_lower() सबराउटिन RosettaCode पर पाया गया है, लेकिन मैं इसे फ़ंक्शन के रूप में लिखने का तरीका नहीं समझ सकता।

अग्रिम धन्यवाद!

पीएस - बोनस अंक यदि आप इसे अखंड लंबाई की एक स्ट्रिंग के साथ कर सकते हैं!

उत्तर

6

इस कोड के मूल लेखक के रूप में, मुझे खुशी है कि यह कुछ मदद की है। मुझे आश्चर्य हुआ कि इन कार्यों को फोरट्रान में क्यों नहीं बनाया गया था। मेरा अनुमान है कि वे केवल अक्षरों के बजाय प्रतिबंधित समूह के लिए काम करते हैं, यानी अंग्रेजी में उपयोग किए जाने वाले। यदि आपके पास लगभग किसी अन्य यूरोपीय भाषा में टेक्स्ट है तो आपके पास उच्चारण के साथ अक्षर होंगे, और फिर उन्हें ऊपरी या निचले मामले में परिवर्तित करना बहुत कठिन होगा। उदाहरण के लिए फ्रेंच में ई-कब्र ऊपरी मामले में बदल जाता है आमतौर पर केवल सादा ई के रूप में दिखाया जाता है (कब्र उच्चारण खो जाता है), लेकिन ई-तीव्र में यह नहीं होता है। फोरट्रान के डिजाइनरों ने हमेशा ऐसी सुविधाएं प्रदान करने की कोशिश की है जो भाषाओं की एक विस्तृत श्रृंखला के अनुरूप हैं, और बहु ​​भाषा के तरीके में ऊपरी/निचले मामले रूपांतरण करना बिल्कुल आसान नहीं है। कम से कम यह मेरा अनुमान है कि आपको इसे स्वयं क्यों करना है।

+0

हाय क्लाइव, एसओ में आपका स्वागत है। मैंने पहली बार अपनी पुस्तक से 2006 में फोरट्रान सीखना शुरू किया। बस आपको धन्यवाद कहना चाहता था। – milancurcic

+0

मैंने आपकी पुस्तक नहीं पढ़ी है, लेकिन आपके उपयोगी कोड और अंतर्दृष्टि टिप्पणी के लिए धन्यवाद!मैंने हाल ही में एक और सहयोगी को नियमित रूप से पारित किया है। मुझे आपका नाम जोड़ना होगा। :-) – jvriesem

13

वाह - भले ही मैं इसे पोस्ट करने के तुरंत बाद एक घंटे से अधिक खोज करता, मुझे here ("विविध फोरट्रान संकेत और टिप्स" के तहत एक उत्तर मिला)।

कोड मैं का इस्तेमाल किया (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 तालिका का उपयोग नहीं कर रहा है ...) – mgilson

+5

FORTRAN 90 मानक के अनुसार: "आंतरिक कार्यों ACHAR और IACHAR इन वर्णों के बीच रूपांतरण प्रदान करते हैं और ASCII कोटिंग अनुक्रम के पूर्णांक।" [कड़ी] (http://www.nag.co.uk/sc22wg5/links.html)। आईसीएचएआर सिस्टम के मूल चरित्र सेट का उपयोग करेगा (जो आवश्यक रूप से ASCII नहीं है)। – SimpleSimon

6

यहाँ एक है कि 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 

आप आसानी से पाश में कम और टोपी तार स्विच करके to_lower को यह बदल सकते हैं पर निर्भर नहीं करता है।

+0

मुझे कारण नहीं दिख रहा है कि यह अधिक पोर्टेबल क्यों होना चाहिए। एएससीआईआई कनवर्टिंग फ़ंक्शंस मानक फोरट्रान 9 0 हैं और इसलिए अलग-अलग कोटिंग अनुक्रम वाले कंप्यूटरों पर भी काम करते हैं, चाहे वह ईबीसीडीआईसी हो या अन्य कुछ भी हो। और चूंकि आपका प्रोग्राम अन्य फोरट्रान 9 0 फीचर्स का भी उपयोग करता है, इसलिए फोरट्रान 9 0 कंपाइलर को उसी तरह की आवश्यकता होती है, क्योंकि 'achar' का उपयोग करने वाले प्रोग्राम .. –

+0

पर्याप्त मेला है। मैं पोर्टेबल स्टेटमेंट को हटा दूंगा। मैं व्यक्तिगत रूप से सोचता हूं कि एएससीआईआई संस्करण की तुलना में पहली नज़र में यह विधि समझना आसान है क्योंकि यह एएससीआईआईआई प्रतिनिधित्व के ज्ञान पर भरोसा नहीं करता है, लेकिन यह सिर्फ एक राय है :) – SethMMorton

संबंधित मुद्दे

 संबंधित मुद्दे