FORTRAN90第七章字符數(shù)據(jù)處理.ppt
§7 字符數(shù)據(jù)處理,§7.1 字符型數(shù)據(jù) §7.2 字符型數(shù)據(jù)的運算 §7.3 字符子串 §7.4 字符型數(shù)據(jù)的應用舉例,一個字符在內(nèi)存中占一個字節(jié)。,§7.1 字符型數(shù)據(jù),§7.1.1 字符型常量 字符型常量是用定界符括起來的一串字符。定界符可用單引號或雙引號,但前后必須一致。,§7.1.1 字符型常量,字符型符號常量:可用parameter屬性給字符串命名,此名稱就是字符型符號常量,因為是常量,當然不能在程序中給它賦值。 給字符型符號常量時,其長度可用*表示。 Character(20),Parameter: Addr=“Hefei“ Character(*),Parameter: Book=“RedStar“,§7.1.2 字符型變量,字符型變量用于存放字符型常量。必須先定義 定義格式 Character(Len=字符串長度):變量名,變量名,§7.1.2 字符型變量,Len=可以不寫,當長度為1時可以連()也沒有。 如果變量表中有長度不同于Len=域指定的變量,可以對它進行個別說明,以個別說明為準。 Character(20):ch1,ch2,ch3*15,ch4*1,ch5*12 Character c1,c2,c3 character(20) s1,s2,s3*3,還可以定義字符型數(shù)組 character(20) c1(3),c2(5,6),c3(4,5)*8 character(20):s1(3),t2(5,6),u(4,5)*8,§7.1.3 字符型變量的賦值,格式:字符變量=字符表達式,當字符表達式的長度超過字符變量的長度時字符表達式右邊多余字符會丟掉,相反,當字符表達式的長度短于字符變量的長度時則在右邊補空格。以字符變量的長度為準。 character(20) s1,s2 s1=“ABCDEFGHHIJKL.“ s2=“1224WEFWE“,還可以將整型表達式賦給字符變量 Character(20) a a=65*256+66;print *,a;End !輸出為BA,§7.1.4 字符型變量的輸入與輸出,用表控格式輸入字符型數(shù)據(jù)時要帶定界符,格式化輸入時不要帶定界符。,用表控格式輸出字符型數(shù)據(jù)時,各字符串依次輸出,中間不留空格;如果想要分隔,則應在輸出列表中插入選定使用的分隔符。,格式化輸出是由格式編輯符控制的。,§7.1.5 字符型變量作虛參,字符型變量作過程的虛參時,可定義其為固定長度變量或假定長度變量。一般建議用假定長度變量較好。用固定長度變量時,其實際長度與實參的長度可以相同也可以不同,這可能會導致比較隱蔽的錯誤,應該引起注意。,Character (20) a,b,c call sub(a,b,c) end Subroutine sub(a,b,c) Character(10) a,b*(*),c*20 End subroutine sub,§7.2.1 字符表達式,§7.2 字符型數(shù)據(jù)運算,字符型數(shù)據(jù)的運算符只有字符連接符/一種,也稱加法運算,與字符型數(shù)據(jù)組成字符表達式,將兩個字符型數(shù)據(jù)連接起來。 Character *20 c,a*4,b*5 a= “This“ b= “isa“ c=a/b/“ test“ c=a(1:3)/b(:2)/c(5:8)/“OK“ Print *,c END 結(jié)果為:thiisisaok,§7.2.1 字符表達式,§8.2 字符型數(shù)據(jù)運算,兩個形狀相同的字符型數(shù)組的加法運算是將兩個數(shù)組的對應元素相加(字符串的連接),得到一個新的數(shù)組。例如: Character(3),dimension(2):text_1=(/abc,123/) Character(3),dimension(2):text_2=(/xyz,456/) Print*, text_1/ text_2 End 結(jié)果為: abcxyz123456,§7.2.2 字符型數(shù)據(jù)的比較,兩個字符串可以比較,也可用六種關系運算符: str.GT.char1 str2=a1 st/=name 字符串的比較實際上是比較字符的機內(nèi)碼 字符關系運算法則: 單個字符比較,代碼大者為“大”: b a 比較字符串時,如果兩個字符串長度不等, 則首先用空格把短串尾部補齊,使兩字符串 等長;從第1個字符開始依次比較每個字符, 字符大者其所在字符串為大;所有字符都相 等的兩個字符串相等。,統(tǒng)計字符串長度:LEN(S),§7.2.3 處理字符串的系統(tǒng)函數(shù),給出字符串S2在S1中的位置: INDEX(S1,S2)S1,S2為字符串。 例:INDEX(FORTRAN,TRA) 函數(shù)值是整數(shù)值,此處是4。,求ASCII碼的對應字符:char(I) I 為ASCII 例: CHAR(65) 函數(shù)值是A,§7.2.3 處理字符串的系統(tǒng)函數(shù),求字符ASCII碼: 如果字符型變量CH的值為A,則ICHAR(CH) 函數(shù)值是65。,字符串比較: LGE(C1,C2),LGT(C1,C2), LLE(C1,C2)與 LLT(C1,C2),FORTRAN90提供的字符串處理函數(shù)比較多,實際編程時可參考編輯器的On_Line_Help系統(tǒng)。,字符串中連續(xù)之部分稱為該字符串的子字符串。例: ORT, RAN P, rog, Program都是字符串FORTRAN Program的子字符串。,字符串str的子字符串用str(s:e)表示,s與e為子字符串在原字符串中的起止位置。str(1:5)表示str 的第1到第5個字符。s的缺省值是1,e的缺省值是字符串的長度;當se時,子字符串是空串。,§7.3 字符子串,§7.3.1 字符子串的定義,§7.3.2 字符子串的引用,§7.3.3 字符數(shù)組的子串,字符型數(shù)組或數(shù)組片段的子串是指其每一個數(shù)組元素的子串。 Character(10) A(6) A(1)=“1234567890“; A(2)= 'abcdefghij' Print*,A(1:2)(3:5);END 結(jié)果為:345cde,可以將一個子串賦給另一個子串,例如: Chrracter str*20 Str=1234567890abcdefghij Str(4:6)=str(11:12) Print*,str End 結(jié)果為:123ab7890abcdefghij,Character(80) A; Integer m,n Real :PI=3.14159265,DX,X DX = pi*0.05;X=0;m = int(pi/dx+0.5*dx)+1 Do L=1,M write(a,'(1X,F4.2)') X n = int(25*sin(x)+40 a(40:40) = “:“;a(n:n) = 'S' n = int(25*cos(x)+40;a(n:n) = 'c' print '(A)', a;x = x+dx Enddo;End,§7.4 字符型數(shù)據(jù)的應用舉例,例:用字符串方式輸出sin(x)與cos(x)的圖像,Character(LEN=80) A,c*1 Integer s,e read '(A)', A e = LEN(A); s = 1 do while(s = e) c = A(S:S); A(S:S) = A(E:E); A(E:E)=c e = e-1; s = s+1 enddo print '(1X,A)', a End,例:字符串的逆序串,例:輸入50個單詞,把以字母A開頭的打印出來。 Character*15 word Do I=1,50 Read*,word If(index(word,A)=1)PRINT*,WORD END DO END 上式中index(word,A)=1可改為: word(1:1)=A,例:打印下列圖形,要求中間一列在30列輸出,* * * * * * * * * * * * * * * * * * * * * * * * *,上半部(四行)的圖形可用下列程序段實現(xiàn) Do I=1,4 Line= K=2*I-1 Do J=1,k line(30+j-I: 30+j-I)=* End do Print*,line End do,下半部(三行)的圖形可用下列程序段實現(xiàn) Do I=3, 1,-1 Line= K=2*I-1 Do J=1,k line(30+j-I: 30+j-I)=* enddo Print*,line End do,程序為: Character*50 line 上半部程序段 下半部程序段 end,例:輸入一段文字,找出包含多少個空格,然后將空格刪除。,(1)下列子程序是求刪除一字符串所有空格后的字符串及其長度: SUBROUTINE SUB(STR,L) CHARACTER*(*)STR integer p L=LEN(TRIM(STR) p=1 do while(pL) if(str(p:p)/= )then p=p+1 else str(p:L-1)=STR(P+1:L) L=L-1 END IF END DO END SUBROUTINE SUB,(2)主程序為: CHARACTER*80 line Integer: m,n=0 Read*,k Do I=1,k Read*,line Call sub(line,m) Print*,line(1:m) N=n+(80-m) End do end,例:輸入十個姓名,要求按字母順序輸出,程序為: Parameter(n=10) Character*15 a(n),ch Read*,a Do I=1,n-1 P=I do j=I+1,n if(a(j)a(p)p=j End do ch=a(p) a(p)=a(I) a(I)=ch End do,Print*,a end,思考題(上機操作): 輸入十個姓名,要求按實際包含的字母個數(shù)多少的順序輸出。 提示: (1)編寫一子程序,求刪除所有空格后的字符串實際包含的字母個數(shù)。 (2)定義一整型數(shù)組,用來存放每個姓名實際包含的字母個數(shù)。 (3)在對整型數(shù)組排序的同時,交換字符型數(shù)組元素的值。,