版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第 5章 字符串及其操作本章主要對(duì) COBOL 程序中涉及到的字符串進(jìn)行講解。本章首先將講解字符串的基本概念。其后, 重點(diǎn)講解和字符串有關(guān)的基本操作,其中包括字符串的合并,拆分,替換以及轉(zhuǎn)換。最后,還將講解子 字符串的概念,如何得到字符串大小的最值,以及如何計(jì)算字符串的長(zhǎng)度。5.1 字符串的基本概念COBOL 中的字符串實(shí)際上就是由一組連續(xù)字符所形成的數(shù)據(jù)。關(guān)于這一點(diǎn),在前面學(xué)習(xí)的基本數(shù) 據(jù)類型中的字符類型數(shù)據(jù)時(shí)曾提到過。字符串的定義方式如下。01 STR-ONE PIC XXXXX.01 STR-TWO PIC X(10.以上兩種定義方式都是正確的。 其中第一種方式是通過 5個(gè)連續(xù)出現(xiàn)的定義
2、符號(hào) X 進(jìn)行定義的。 該 語句定義了一個(gè)擁有 5個(gè)字符長(zhǎng)度的字符串。第二種定義方式是通過在定義符號(hào) X 后面加上一個(gè)括號(hào), 括號(hào)中所填數(shù)值為該字符串的長(zhǎng)度。這條語句定義了一個(gè)擁有 10個(gè)字符長(zhǎng)度的字符串。在完成字符串的定義后,通常還應(yīng)該對(duì)所定義的字符串賦上一個(gè)初值。其中既可通過直接數(shù)對(duì)字符 串賦值,也可通過 VALUE 語句對(duì)字符串賦值。并且,當(dāng)某一字符串中已含有數(shù)據(jù)時(shí),也可通過 MOVE 語句對(duì)另一字符串賦值。以下代碼表明了這 3種賦值方式。DATA DIVISION.WORKING-STORAGE SECTION.01 STR-1 PIC X(5 VALUE ABCED .01 STR-
3、2 PIC X(5.01 STR-3 PIC X(5.*PROCEDURE DIVISION.MOVE ABCDE TO STR-2.MOVE STR-1 TO STR-3.DISPLAY STR-1: , STR-1.DISPLAY STR-2: , STR-2.DISPLAY STR-3: , STR-3.DISPLAY COMPLETED ! .STOP RUN.該段代碼執(zhí)行后,將會(huì)有以下輸出結(jié)果。STR-1: ABCDESTR-2: ABCDESTR-3: ABCDECOMPLETED !對(duì)于以上代碼,一共定義了 3個(gè)字符串?dāng)?shù)據(jù)類型,分別為 STR-1, STR-2以及 STR-3。其
4、中字符串 STR-1是通過 VALUE 語句在定義的同時(shí)對(duì)其賦的初值。字符串 STR-2是通過將直接數(shù)“ ABCDE ”對(duì) 其賦的值。字符串 STR-3是通過 MOVE 語句將已存有數(shù)據(jù)的另一字符串 STR-1中的內(nèi)容拷貝到其下而完成的賦值。同時(shí)還需注意的是,程序中出現(xiàn)的兩個(gè)直接數(shù)“ ABCDE ”和“ COMPLETED !”實(shí)際上也 屬于字符串。只是該字符串屬于直接數(shù)類別,沒有進(jìn)行定義,因而沒有對(duì)應(yīng)的名稱。最后還需注意的一點(diǎn)是, COBOL 中的字符串和通常使用 C 語言編寫的程序中的字符串是有區(qū)別的。 在 C 語言中,字符串在機(jī)內(nèi)存儲(chǔ)時(shí)系統(tǒng)要在其末尾添加一個(gè)空字符 0 作為其結(jié)束標(biāo)志。而
5、 COBOL 中 是不需對(duì)字符串添加任何結(jié)束標(biāo)志的。 COBOL 中字符串的存儲(chǔ)長(zhǎng)度即其顯現(xiàn)出來的實(shí)際長(zhǎng)度。5.2 使用 STRING 語句合并字符串前面一節(jié)簡(jiǎn)單介紹了 COBOL 中字符串的基本概念。下面,將重點(diǎn)介紹對(duì)字符串的實(shí)際操作。字符 串三大最基本的操作分別為合并,拆分以及轉(zhuǎn)換。本節(jié)主要介紹如何對(duì)字符串進(jìn)行合并操作。5.2.1 STRING 語句的基本用法當(dāng)需要將 2個(gè)以上的字符串合并為一個(gè)字符串時(shí), 通常使用 STRING 語句完成。 下面這段代碼表明 了使用 STRING 語句合并字符串的基本操作。DATA DIVISION.WORKING-STORAGE SECTION.01 F
6、IRST-NAME PIC X(10.01 LAST-NAME PIC X(10.01 FULL-NAME PIC X(20.*PROCEDURE DIVISION.MOVE ADAM TO FIRST-NAME.MOVE SMITH TO LAST-NAME.STRINGFIRST-NAME DELIMITED BY SPACE DELIMITED BY SIZELAST-NAME DELIMITED BY SPACEINTO FULL-NAME.DISPLAY FIRST NAME: ,FIRST-NAME.DISPLAY LAST NAME: ,LAST-NAME.DISPLAY FUL
7、L NAME: ,FULL-NAME.STOP RUN.該段代碼執(zhí)行后,將有以下輸出結(jié)果。FIRST NAME: ADAMLAST NAME: SMITHFULL NAME: ADAM SMITH以上程序?qū)崿F(xiàn)的功能實(shí)際上,是將分開存儲(chǔ)放置的某人姓與名字符串合并為一個(gè)完整的姓名字符 串。 FIRST-NAME 字符串存放該人的姓, LAST-NAME 字符串存放該人的名。 FULL-NAME 字符串存放 該人完整的姓名,由以上兩字符串合并而成。該程序?qū)崿F(xiàn)字符串合并操作的重點(diǎn)語句為。STRINGFIRST-NAME DELIMITED BY SPACE DELIMITED BY SIZELAST-
8、NAME DELIMITED BY SPACEINTO FULL-NAME.以上即為 STRING 語句的基本格式。其中每項(xiàng)用于合并的字符串后面都要加上 DELIMITED BY子 句。 DELIMITED BY子句后面有兩個(gè)選項(xiàng),分別為 SPACE 和 SIZE 。這兩個(gè)選項(xiàng)的作用分別如下。 SPACE :找到前面用于合并的字符串中第一次出現(xiàn)空格的地方。 將該空格以前的部分進(jìn)行合并, 空格以后的內(nèi)容包括該空格在內(nèi)不參與合并操作。SIZE :將前面對(duì)應(yīng)的用于合并的字符串中的全部?jī)?nèi)容進(jìn)行合并。對(duì)應(yīng)前面的代碼, 可以看到參與合并的字符串共有 3項(xiàng)。 這 3項(xiàng)字符串依次為 FIRST-NAME ,
9、由一 個(gè)空格所形成的直接數(shù)字符串,以及 LAST-NAME 。其中, FIRST-NAME 和 LAST-NAME 中的實(shí)際內(nèi) 容分別為。FIRST-NAME :ADAM_ _ _ _ _ _LAST-NAME:SMITH_ _ _ _ _此處使用下劃線表示空格。由于這兩項(xiàng)字符串?dāng)?shù)據(jù)的定義語句如下,因此其存儲(chǔ)長(zhǎng)度都為 10個(gè)字 符的長(zhǎng)度。01 FIRST-NAME PIC X(10.01 LAST-NAME PIC X(10.同時(shí),由于對(duì)這兩個(gè)字符串的賦值語句如下,賦值的長(zhǎng)度小于定義的長(zhǎng)度。因此,需要在這兩個(gè)字 符串?dāng)?shù)據(jù)后加上相應(yīng)的空格以填充其定義的長(zhǎng)度。MOVE ADAM TO FIRST-
10、NAME.MOVE SMITH TO LAST-NAME.然而,在進(jìn)行合并時(shí),我們并不希望將這些多余的空格也合并到新的字符串中。因此,這里使用了 DELIMITED BY子句中的 SPACE 選項(xiàng)將多余的空格進(jìn)行了截取。截取之后,兩者實(shí)際參與合并的內(nèi)容 如下。FIRST-NAME :ADAMLAST-NAME:SMITH然而, 如果僅僅是對(duì)以上這兩項(xiàng)內(nèi)容進(jìn)行合并時(shí), 則最終輸出結(jié)果會(huì)將二者連接在一起, 不利區(qū)分。 也就是說,若使用下面這條 STRING 語句進(jìn)行合并時(shí),輸出結(jié)果形式將不太理想。STRINGFIRST-NAME DELIMITED BY SPACELAST-NAME DELIMI
11、TED BY SPACEINTO FULL-NAME.將原程序中的 STRING 語句替換為這條 STRING 語句后,輸出結(jié)果如下所示。FIRST NAME: ADAMLAST NAME: SMITHFULL NAME: ADAMSMITH可以看到, 這時(shí)輸出的完整姓名 FULL NAME, 將組成姓和名的字母連接到了一起, 無法區(qū)分開來。 因此,這時(shí)還需要在合并后的字符串中插入一個(gè)空格,以區(qū)分哪幾個(gè)字母是姓,哪幾個(gè)字母是名。插入 空格時(shí),就不能再用 DELIMITED BY SAPCE子句了,否則將插入不進(jìn)任何東西。插入空格以及插入帶 空格的字符串時(shí),必須使用 DELIMITED BY S
12、IZE子句,將整個(gè)進(jìn)行插入。原程序中插入空格的語句如 下。 DELIMITED BY SIZE這樣, 原程序依次將 FIRST NAME, 一個(gè)空格 (作為姓和名的分隔符 , LAST NAME進(jìn)行了合并。 并且,對(duì)于 FIRST NAME和 LAST NAME這兩個(gè)字符串,僅將其有效部分進(jìn)行合并。最終,合并后的 3個(gè)字符串便組成了另一個(gè)新的字符串。該字符串顯示完整的姓名信息,并且在姓和名之間留有一個(gè)空 格以進(jìn)行區(qū)分。5.2.2 STRING 語句的綜合應(yīng)用上一小節(jié)簡(jiǎn)單介紹了 STRING 語句的基本用法。 根據(jù)其基本用法, 該語句在實(shí)際開發(fā)中常常用于將 文件中各條分開放置的記錄組成一條完整的
13、輸出信息。 以下結(jié)合一個(gè)具體實(shí)例, 說明 STRING 語句在實(shí) 際開發(fā)中的綜合應(yīng)用。假設(shè)某一公司員工各項(xiàng)財(cái)務(wù)收入信息文件 INCOME-SYSIN 包含有如下信息。 員工的工號(hào)員工姓名員工住址工資獎(jiǎng)金出差報(bào)銷費(fèi)用本次工資及獎(jiǎng)金發(fā)放的具體時(shí)間本次出差報(bào)銷的具體時(shí)間該文件包含有多條記錄,分別對(duì)應(yīng)每一位員工的相關(guān)信息。為方便說明問題,這里不妨假設(shè)其中第 一條記錄的具體信息如下。10742WANG_WEI _ _ _ _ _ _ _WU_HAN_SHI_JIANG_HAN_QU_YOU_YI_LU35001000802.7508/01/3108/01/25現(xiàn)要求只輸出員工及其出差報(bào)銷信息,并且出差報(bào)
14、銷費(fèi)用只取其整數(shù)部分。此外,每條輸出記錄要 有相應(yīng)編號(hào),編號(hào)從 00001開始順次往下排。最后,每條輸出信息要求統(tǒng)一從第 5列開始輸出。則實(shí)現(xiàn) 該功能完整的程序代碼如下。IDENTIFICATION DIVISION.PROGRAM-ID INCOME-PROG.AUTHER XXX.*ENVIRONMENT DIVISION.INPUT-OUTPUT SECTION.FILE-CONTROL.SELECT INCOME-FILEASSIGN TO INCOME-SYSIN.*DATA DIVISION.FILE SECTION.FD INCOME-FILERECORDING MODE IS
15、F.01 RECORD.05 EMPLOEE-INFO.10 EMP-NUMBER PIC 9(5.10 EMP-NAME PIC X(15.10 EMP-ADDRESS PIC X(35.05 INCOME-INFO.10 SALARY PIC 9(4.10 BONUS PIC 9(4.10 REIMBURSE PIC 999.99.10 SAL-DATE PIC X(8.10 REIM-DATE PIC X(8.WORKING-STORAGE SECTION.77 PRT-LINE PIC X(100.77 LINE-POS PIC S9(4.77 LINE-NO PIC 9(5.77 D
16、EC-POINT PIC X VALUE . .77 EOF-FLAG PIC X VALUE N .*PROCEDURE DIVISION.OPEN INPUT INCOME-FILE.READ INCOME-FILEAT END MOVE Y TO EOF-FLAGEND-READ.PERFORM 100-PROCESS-RECORDSVARYING LINE-NO FROM 1 BY 1UNTIL EOF-FLAG = Y .CLOSE TEST-FILE.STOP RUN.100-PROCESS-RECORDS.MOVE 5 TO LINE-POS.STRINGLINE-NO SAPC
17、E EMPLOEE-INFO SPACEDELIMITED BY SIZEREIMBURSEDELIMITED BY DEC-POINTSPACE REIMDATEDELIMITED BY SIZEINTO RPT-LINEWITH POINTER LINE-POS.DISPLAY PRT-LINE.READ INCOME-FILEAT END MOVE Y TO EOF-FLAGEND-READ.該段程序執(zhí)行后,將有如下輸出信息(下劃線表示空格。第 5列00001_WANG_WEI_ _ _ _ _ _ _ _802_08/01/2500002_其中省略號(hào)省略了其他記錄對(duì)應(yīng)的輸出信息。該段程
18、序?qū)嶋H上完成了以下 3個(gè)任務(wù)。 選擇相關(guān)的字符串信息進(jìn)行合并。指定每條信息在輸出字符串中所在的具體位置。對(duì)報(bào)銷費(fèi)用字符串進(jìn)行了截取。對(duì)應(yīng)于 STRING 的基本用法,該程序中所擴(kuò)展的兩條 STRING 子句如下。DELIMITED BY DEC-POINT:這是對(duì) DELIMITED BY子句的延伸。在上一小節(jié) STRING 的基 本用法里只講了在 BY 的后面接上 SIZE 或 SPACE 選項(xiàng)。 而此處 BY 后面接的是一個(gè)變量名稱, 該變量的內(nèi)容為一個(gè)小數(shù)點(diǎn)。 因此這里是將 REIMBURSE 變量中小數(shù)點(diǎn)以前的部分進(jìn)行截取并 用于合并。實(shí)際上, BY 后可接任何一個(gè)變量,并將該變量中保
19、存的字符作為原字符串的截取 符。截取符的用法同 SPACE 選項(xiàng)類似。WITH POINTER :該語句指定合并生成字符串的起始位置,類似與一個(gè)指針。原程序中其后 為 LINE-POS 變量, 且該變量保存有數(shù)值 5。 因此合并后字符串的起始位置在新字符串 PRT-LINE 的第 5位。5.3 使用 UNSTRING 語句拆分字符串同使用 STRING 語句合并字符串相對(duì)應(yīng),通常使用 UNSTRING 語句拆分字符串。本節(jié)仍然首先介 紹 UNSTRING 語句的基本用法。在此基礎(chǔ)上,再講解 UNSTRING 語句的綜合應(yīng)用。5.3.1 UNSTRING 語句的基本用法當(dāng)需要將字符串進(jìn)行拆分時(shí),
20、通常就要用到 UNSTRING 語句。 UNSTRING 語句相當(dāng)于是 STRING 語句的逆運(yùn)算。下面,仍然結(jié)合前面利用 STRING 語句合并姓名的例子介紹 UNSTRING 語句的基本用法。這次假 設(shè)此人的姓名“ Adam Smith”已保存在一個(gè)變量之中。此程序所需完成的功能是將該條完整的姓名拆分 為姓和名兩個(gè)字符串,并分別存放到不同的變量之中。程序代碼如下。DATA DIVISION.WORKING-STORAGE SECTION.01 FULL-NAME PIC X(20VALUE ADAM SMITH .01 LAST-NAME PIC X(10.01 FIRST-NAME PI
21、C X(10.*PROCEDURE DIVISION.UNSTRING FULL-NAMEDELIMITED BY INTO FIRST-NAMELAST-NAME.DISPLAY FULL NAME: , FULL-NAME.DISPLAY FIRST NAME: , FIRST-NAME.DISPLAY LAST NAME: , LAST-NAME.STOP RUN.以上代碼運(yùn)行后,將有如下輸出信息。FULL NAME: ADAM SMITHFIRST NAME: ADAMLAST NAME: SMITH由此可見, 存放有完整姓名信息的 FULL NAME字符串變量被拆分為了兩個(gè)新的字符串
22、。 其中一個(gè) 字符串名稱為 FIRST NAME ,保存 FULL NAME 中的前一部分內(nèi)容“ ADAM ”。另一個(gè)字符串名稱為L(zhǎng)AST NAME,保存 FULL NAME中的后一部分內(nèi)容“ SMITH ”。 FULL NAME中的這兩部分是通過空 格分隔開來的。因此,在拆分該字符串時(shí)使用了以下這條子句用以劃分拆分的內(nèi)容。DELIMITED BY 同樣,此處的空格字符 也可被其他字符所替代。例如,下面這段程序就使用日期分隔符 / 替代了上面代碼中的空格 。該程序?qū)崿F(xiàn)的功能是將一個(gè)完整的日期分成年,月,日三個(gè)部分,依 次存放在不同變量中。代碼如下。DATA DIVISION.WORKING-S
23、TORAGE SECTION.01 DATE PIC X(1001 YEAR PIC X(4.01 MONTH PIC X(2.01 DAY PIC X(2.*PROCEDURE DIVISION.MOVE 2008/01/15 TO DATE.UNSTRING DATEDELIMITED BY / INTO YEARMONTHDAY.DISPLAY DATE: , DATE.DISPLAY YEAR: , YEAR.DISPLAY MONTH: , MONTH.DISPLAY DAY: , DAY.STOP RUN.以上代碼運(yùn)行后,將有如下輸出信息。DATE: 2008/01/15YEAR:
24、 2008MONTH: 01DAY: 155.3.2 UNSTRING 語句的綜合應(yīng)用同 STRING 語句一樣, UNSTRING 語句在實(shí)際應(yīng)用中還有一些其他需要注意的地方。下面結(jié)合一 個(gè)實(shí)例進(jìn)行講解,以加深對(duì) UNSTRING 語句的理解,同時(shí)提高實(shí)際應(yīng)用能力。假設(shè)一家公司對(duì)其運(yùn)營(yíng)的項(xiàng)目進(jìn)行管理,需要將某一項(xiàng)目不同類別的信息分開保存到不同的變量 中。其中完整的項(xiàng)目信息從文件中的記錄獲得。保存項(xiàng)目不同類別信息的變量在數(shù)據(jù)部的工作存儲(chǔ)節(jié)中 定義。完整的代碼如下。IDENTIFICATION DIVISION.PROGRAM-ID DIVIDE-PROG.AUTHER XXX.*ENVIRON
25、MENT DIVISION.INPUT-OUTPUT SECTION.FILE-CONTROL.SELECT PROJECT-FILEASSIGN TO P-SYSIN.*DATA DIVISION.FILE SECTION.FD PROJECT-FILERECORDING MODE IS F.01 PRO-RCD.05 LINE-NO PIC 9(5.05 FILLER PIX X.05 PRO-CODE PIC X(10.05 FILLER PIC X.05 PRO-NAME PIC X(21.05 FILLER PIC X.05 LEADER-NO PIC 9(5.05 FILLER P
26、IC X.05 BUDGET PIC 9(7.99.WORKING-STORAGE SECTION.01 DISPLAY-INFO.05 P-NAME PIC X(21.05 FILLER PIC X VALUE SPACE. 05 P-UNIT PIC XXX.05 FILLER PIC X VALUE SPACE. 05 P-BUDGET PIC 9(7.01 OTHER-INFO.05 PJT-NO PIC 9(6.05 PJT-LEADER-NO PIC 9(5.77 LEN-1 PIC 99.77 LEN-2 PIC 99.77 DLMBY PIC X.77 STDLM-1 PIC
27、X.77 STDLM-2 PIC X.77 STR-POS PIC 9.77 FIELD-NUM PIC 9.77 EOF-FLAG PIC X VALUE N .*PROCEDURE DIVISION.OPEN INPUT PROJECT-FILE.READ PROJECT-FILEAT END MOVE Y TO EOF-FLAGEND-READ.MOVE . TO DLMBY.MOVE 7 TO POS-START.PERFORM 100-PROCESS-RECORDSUNTIL EOF-FLAG = Y .CLOSE PROJECT-FILE.STOP RUN.100-PROCESS-
28、RECORDS.UNSTRING PRO-RCD.DELIMITED BY ALL SPACES OR / OR DLMBY INTO PJT-NO DELIMITER IN STDLM-1P-UNITP-NAME COUNT IN LEN-1PJT-LEADER-NO DELIMITER IN STDLM-2 COUNT IN LEN-2P-BUDGETWITH POINTER STR-POSTALLYING IN FIELD-NUMON OVERFLOW GO UNSTRING-FINISHED.UNSTRING-FINISHED.DISPLAY DISPLAY-INFO.READ PRO
29、JECT-FILEAT END MOVE Y TO EOF-FLAGEND-READ.以上程序的運(yùn)行步驟如下。(1打開文件 PROJECT-FILE ,讀入文件第 1條記錄。如果遇到文件結(jié)束(即該文件為空,則 將文件結(jié)束標(biāo)志 EOF-FLAG 置為 Y 。其中 F-FLAG 默認(rèn)值為 N 。對(duì)應(yīng)代碼為。OPEN INPUT PROJECT-FILE.READ PROJECT-FILEAT END MOVE Y TO EOF-FLAGEND-READ.(2將拆分文件時(shí)自定義的分隔符小數(shù)點(diǎn) . 存入變量 DLMBY 中。將拆分字符的起始位置 7存 入變量 STR-POS 中。循環(huán)執(zhí)行 100-PR
30、OCESS-RECORDS 處理過程,直至讀取文件結(jié)束。當(dāng)讀取文件結(jié) 束時(shí),關(guān)閉文件,程序結(jié)束。對(duì)應(yīng)代碼如下。MOVE . TO DLMBY.MOVE 7 TO STR-POS.PERFORM 100-PROCESS-RECORDSUNTIL EOF-FLAG = Y .CLOSE PROJECT-FILE.STOP RUN.(3執(zhí)行 100-PROCESS-RECORDS 處理過程,對(duì)文件中整條記錄的字符串進(jìn)行拆分。拆分時(shí),從 該字符串的第 7個(gè)位置開始拆分。 7由變量 STR-POS 指定。 拆分完成后, 將拆分的條目數(shù)量保存到變量 FIELD-NUM 中。當(dāng)字符串末尾還有未被拆分?jǐn)?shù)據(jù)(該
31、程序省略掉項(xiàng)目運(yùn)算金額的小數(shù)部分,因此都不 會(huì)被完全拆分,轉(zhuǎn)到處理過程 UNSTRING-FINISHED 。對(duì)應(yīng)代碼為。UNSTRING PRO-RCD.DELIMITED BY ALL SPACES OR / OR DLMBYINTO PJT-NO DELIMITER IN STDLM.P-UNITP-NAME COUNT IN LENPJT-LEADER-NOP-BUDGET DELIMITER IN STDLM-2 COUNT IN LEN-2WITH POINTER STR-POSTALLYING IN FIELD-NUMON OVERFLOW GO UNSTRING-FINISHE
32、D.該段代碼中重點(diǎn)有以下幾條 UNSTRING 語句的子句需要講解。DELIMITER IN 子句:該子句將此處拆分的分隔符保存到變量中。原程序第一條 DELIMITER 子句將此處字符串 307428/ITD中的分隔符 /保存到了變量 STDLM 中。第二條項(xiàng)目預(yù)算 金額中的小數(shù)點(diǎn) . 保存到了變量 STDLM-2中。COUNT IN子句:該子句記錄該拆分部分的字符串長(zhǎng)度。原程序中第一條 COUNT IN子句記錄拆分后的項(xiàng)目名稱 P-NAME 的長(zhǎng)度,并將其保存到變量 LEN-1中。第二條將輸出項(xiàng)目運(yùn)算金 額的長(zhǎng)度保存到變量 LEN-2中。WITH POINTER 子句:該子句后面所跟的變量
33、相當(dāng)于拆分字符串的指針。原程序?qū)?yīng)變量為 STR-POS 。該變量中的數(shù)字 7表明從第 7個(gè)字符處開始拆分。拆分完成后,該變量應(yīng)指向項(xiàng)目 預(yù)算金額小數(shù)點(diǎn)后的位置,為 45。TALLYING IN 子句:保存拆分的條目數(shù)量,即拆分后生成的字符串?dāng)?shù)量。原程序?qū)⒆址?分成了 5個(gè)短的字符串,因此將 5存入變量 FIELD-NUM 中。ON OVERFLOW 子句:表明原字符未拆分完全時(shí)需采取的行動(dòng)。原程序由于項(xiàng)目預(yù)算金額最 后兩位小數(shù)未參與拆分,因此執(zhí)行該子句。執(zhí)行后跳轉(zhuǎn)到 UNSTRING-FINISHED 處理過程處。 (4執(zhí)行 UNSTRING-FINISHED 處理過程。顯示輸出信息,并
34、繼續(xù)讀文件的下一條記錄。如果文 件結(jié)束,則將結(jié)束標(biāo)志 EOF-FLAG 置為 Y 。對(duì)應(yīng)語句如下。UNSTRING-FINISHED.DISPLAY DISPLAY-INFO.READ PROJECT-FILEAT END MOVE Y TO EOF-FLAGEND-READ.現(xiàn)假設(shè)該文件中第一條記錄信息如下。00001_307428/ITD_ONLINE-PAYMENT-SYSTEM_B7831_1085080.50該記錄中各自對(duì)應(yīng)的不同類別信息及在字符串中的位置如下。LINE-NO :00001 /輸入行號(hào) , 在字符串中的位置為 15FILLER :_ /間隔符 , 在字符串中的位置為
35、6PRO-CODE : 307428/ITD /項(xiàng)目代碼 , 在字符串中的位置為 7FILLER : _ /間隔符 , 在字符串中的位置為 8PRO-NAME : ONLINE-PAYMENT-SYSTEM /項(xiàng)目名稱 , 在字符串中的位置為 929FILLER :_ /分隔符 , 在字符串中的位置為 30LEADER-NO : B7831 /項(xiàng)目組長(zhǎng)編號(hào) , 在字符串中的位置為 3135FILLER :_ /分隔符 , 在字符串中的位置為 36BUDGET : 1085080.50 /項(xiàng)目預(yù)算金額 , 在字符串中的位置為 3746則對(duì)應(yīng)這條記錄,輸出結(jié)果如下。ONLINE-PAYMENT-S
36、YSTEM_ ITD_1085080該輸出結(jié)果所對(duì)應(yīng)的變量?jī)?nèi)容為:P-NAME : ONLINE-PAYMENT-SYSTEMFILLER : _P-UNIT : ITDFILLER : _P-BUDGET : 1085080程序中定義的其他相關(guān)變量中的值分別如下。PJT-NO : 307428PJT-LEADER-NO : B7831LEN-1 : 21LEN-2 : 7STDLM-1 : /STDLM-2 : .STR-POS : 45FIELD-NUM : 55.4 利用 INSPECT 語句替換字符串INSPECT 語句主要用于對(duì)字符串中的指定部分進(jìn)行替換。 此處所說的字符串替換和字符
37、串轉(zhuǎn)換是不 同的。字符串替換是指將原字符串中的部分字符替換成其他字符。字符串轉(zhuǎn)換則是保持原字符串中的字 符不變,只對(duì)其格式進(jìn)行轉(zhuǎn)換。本節(jié)主要講解字符串替換。5.4.1 對(duì)全體字符進(jìn)行替換使用 INSPECT 語句可以對(duì)字符串中出現(xiàn)的全部相同字符進(jìn)行整體替換。該項(xiàng)功能是通過在 INSPECT 語句中加上“ ALL ”選項(xiàng)實(shí)現(xiàn)的。下面這段代碼將原字符串中所有的字符“ A ”替換為“ B ”, 并且將所有的 0替換為中劃線。該段代碼如下。DATA DIVISION.WORKING-STORAGE SECTION.01 TEST-STRING PIC X(10.*PROCEDURE DIVISION.
38、MOVE ADCD0A0A8B TO TEST-STRING.DISPLAY BEFORE INSPECT: , TEST-STRING.INSPECT SOURCE-STRINGREPLACING ALL A BY B .INSPECT SOURCE-STRINGREPLACING ALL 0 BY - .DISPLAY AFTER INSPECT: , TEST-STRING.STOP RUN.該段代碼執(zhí)行后,將有如下輸出信息。BEFORE INSPECT: ADCD0A0A8BAFTER INSPECT: BCDC-B-B8B由此可見,原字符串 TEST-STRING 中的所有字符 B
39、被替換為了字符 A 。并且,原字符串中的所有 數(shù)字 0也被替換成了中劃線 -。這種替換方式是對(duì)字符串中滿足條件的全體字符進(jìn)行的替換。并且 替換后生成的新字符串覆蓋了以前的字符串。5.4.2 對(duì)前綴字符進(jìn)行替換這種替換方式是對(duì)字符串前面連續(xù)出現(xiàn)的一段字符進(jìn)行替換,即對(duì)前綴字符進(jìn)行的替換。該項(xiàng)功能 是通過在 INSPECT 語句中加上“ LEADING ”選項(xiàng)實(shí)現(xiàn)的。下面代碼對(duì)一段表示數(shù)字的字符串進(jìn)行了替換。 替換方式為將原字符串中的前綴 0替換成前綴星號(hào) *,以進(jìn)行適當(dāng)?shù)妮敵觥4a如下。DATA DIVISION.WORKING-STORAGE SECTION.01 TEST-STRING PI
40、C X(10.*PROCEDURE DIVISION.MOVE 0000567.90 TO TEST-STRING.DISPLAY BEFORE INSPECT: , TEST-STRING.INSPECT TEST-STRINGREPLACING LEADING 0 BY * .DISPLAY AFTER INSPECT: , TEST-STRING.STOP RUN.該段代碼執(zhí)行后,將有如下輸出信息。BEFORE INSPECT: 0000567.90AFTER INSPECT: *567.90通過以上代碼可以發(fā)現(xiàn),使用 LEADING 選項(xiàng)只是對(duì)前綴字符進(jìn)行了替換。這里所說的前綴字符,
41、指的是從字符串開頭處連續(xù)出現(xiàn)的一串字符。因此,即使原字符串中在最后還有一個(gè)字符 0,但并不對(duì) 其進(jìn)行替換。此外, INSPECT 語句還可統(tǒng)計(jì)并保存前綴字符出現(xiàn)的次數(shù)。 該項(xiàng)功能是通過結(jié)合 TALLYING FOR LEADING 實(shí)現(xiàn)的。其中前面一個(gè)省略號(hào)表示用以保存前綴字符出現(xiàn)次數(shù)的變量名。后一個(gè)省略號(hào)表 示該前綴字符。以下代碼統(tǒng)計(jì)并輸出了字符串中前綴字符出現(xiàn)的次數(shù)。DATA DIVISION.WORKING-STORAGE SECTION.01 TEST-STRING PIC X(10.01 COUNT PIC 9 VALUE ZERO.*PROCEDURE DIVISION.MOVE
42、0000567.90 TO TEST-STRING.DISPLAY SOURCE STRING: , TEST-STRING.INSPECT TEST-STRINGTALLYING COUNT FOR LEADING 0 .DISPLAY HOW MANY LEADING 0: , COUNT.STOP RUN.該段代碼執(zhí)行后,將有如下輸出信息。SOURCE STRING: 0000567.90HOW MANY LEADING 0: 45.4.3 對(duì)首字符進(jìn)行替換此處只對(duì)字符串中的第一個(gè)字符進(jìn)行替換。 該項(xiàng)功能是通過在 INSPECT 語句中加上 “ FIRST ” 選項(xiàng) 實(shí)現(xiàn)的。下面代碼結(jié)合
43、上一小節(jié)中的例子,將前綴為星號(hào)的字符串首字符替換為了美元符號(hào) $。該 段代碼如下。DATA DIVISION.WORKING-STORAGE SECTION.01 TEST-STRING PIC X(10.*PROCEDURE DIVISION.MOVE 0000567.90 TO TEST-STRING.DISPLAY SOURCE DATA: , TEST-STRING.INSPECT TEST-STRINGREPLACING LEADING 0 BY * .DISPLAY CONVERTED DATA-1: , TEST-STRING.INSPECT TEST-STRINGREPLACI
44、NG FIRST * BY $ .DISPLAY CONVERTED DATA-2: , TEST-STRING.STOP RUN.該段代碼執(zhí)行后,將有如下輸出信息。SOURCE DATA: 0000567.90CONVERTED DATA-1: *567.90CONVERTED DATA-2: $*567.90以上程序首先將前綴字符進(jìn)行轉(zhuǎn)換,其后在此基礎(chǔ)上再對(duì)首字符進(jìn)行轉(zhuǎn)換。通過兩次轉(zhuǎn)換,最終將 原始數(shù)據(jù) 0000567.90轉(zhuǎn)換成了標(biāo)準(zhǔn)輸出格式 $*567.90。5.4.4 字符串替換的綜合應(yīng)用除以上講解的 3種字符串常用替換方式外,在實(shí)際應(yīng)用中還有一些其他小技巧。下面這個(gè)例子說明 了字符
45、串替換的綜合應(yīng)用。DATA DIVISION.WORKING-STORAGE SECTION.01 TEST-STRING PIC X(12.*PROCEDURE DIVISION.MOVE B2.C-AB3H/DE TO INPUT-STRING.DISPLAY SOURCE DATA: , TEST-STRING.INSPECT TEST-STRINGREPLACING FIRST B BY C AFTER INITIAL A .DISPLAY CONVERTED-1: , TEST-STRING.INSPECT TEST-STRINGREPLACING CHARACTERS BY 0 B
46、EFORE INITIAL . .DISPLAY CONVERTED-2 : , TEST-STRING.INSPECT TEST-STRINGCONVERTING ABCDEFGHI TO 123456789AFTER INITIAL -BEFORE INITIAL / .DISPLAY CONVERTED-3 : , TEST-STRING.STOP RUN.該段代碼執(zhí)行后,將有如下輸出信息。SOURCE DATA: B2.C-AB3H/DECONVERTED-1: B2.C-AC3H/DECONVERTED-1: 00.C-AC3H/DECONVERTED-1: 00.C-1338/DE
47、以上程序?qū)嶋H上共對(duì)原字符串進(jìn)行了 3次替換操作。這 3次替換操作分別如下。第 1次替換操作對(duì)應(yīng)的代碼如下。INSPECT TEST-STRINGREPLACING FIRST B BY C AFTER INITIAL A .此次操作將原字符串中第一個(gè)字符 A 后出現(xiàn)的首個(gè)字符 B 替換成了字符 C 。本次替換前和替換后的字符串分別為:B2.C-AB3H/DE /替換前的字符串B2.C-AC3H/DE /替換后的字符串第 2次替換操作對(duì)應(yīng)的代碼如下。INSPECT TEST-STRINGREPLACING CHARACTERS BY 0 BEFORE INITIAL . .此次操作將原字符串中小
48、數(shù)點(diǎn)前面的所有字符替換為字符 0。其中此處的原字符為第一次替 換后所生成的新字符串。本次替換前和替換后的字符串分別如下所示:B2.C-AC3H/DE /替換前的字符串00.C-AC3H/DE /替換后的字符串第 3次替換操作對(duì)應(yīng)的代碼如下。INSPECT TEST-STRINGCONVERTING ABCDEFGHI TO 123456789AFTER INITIAL -BEFORE INITIAL / .此次操作將原字符串里中劃線和反斜杠之間的所有字母字符替換成了相應(yīng)的數(shù)字字符。其中此 處的原字符為第二次替換后所生成的新字符串。本次替換前和替換后的字符串分別如下所示。 00.C-AC3H/D
49、E /替換前的字符串00.C-1338/DE /替換后的字符串該段代碼反映了字符串替換的綜合應(yīng)用。同前面講過的 3種常用的字符串替換方式相比,此處共有 以下 3點(diǎn)擴(kuò)展內(nèi)容。BEFORE INITIAL 和 AFTER INITIAL :這兩個(gè)選項(xiàng)用以指定字符串所替換的范圍。 BEFORE INITIAL 后面的字符對(duì)應(yīng)原字符串中用以替換部分的首字符。 AFTER INITIAL 后面的字符對(duì) 應(yīng)原字符串中用以替換部分的末尾字符。CHARACTERS :泛指全體字符,而非特定的某一個(gè)字符。此種表示方式通常結(jié)合 BEFORE INITIAL 或 AFTER INITIAL 使用。CONVERTIN
50、G :用于同時(shí)指定多個(gè)字符的替換內(nèi)容。該選項(xiàng)相當(dāng)于多個(gè) REPLACING BY語句 的綜合。5.5 字符串轉(zhuǎn)換本節(jié)將講解字符串的轉(zhuǎn)換。字符串轉(zhuǎn)換是以原字符串的字符為基礎(chǔ)進(jìn)行的格式上的轉(zhuǎn)換,并不對(duì)原 字符進(jìn)行替換。本節(jié)將主要介紹兩種常用的轉(zhuǎn)換方式。其中一種是對(duì)于由字母組成的字符串中字母大小 寫的轉(zhuǎn)換方式。另一種則是將由數(shù)字組成的字符串轉(zhuǎn)換為具體數(shù)值。5.5.1 字符串中字母大小寫的轉(zhuǎn)換對(duì)于由字母組成的字符串,通常需要對(duì)該字符串里面的字母進(jìn)行大小寫轉(zhuǎn)換。字符串中字母大小寫 的轉(zhuǎn)換主要是通過 FUNCTIONG 語句實(shí)現(xiàn)的。其關(guān)鍵之處是在該語句后加上 LOWER-CASE ,或者 UPPER-CA
51、SE 選項(xiàng)。下面這段代碼使用 LOWER-CASE 選項(xiàng),將字符串中的字母全部轉(zhuǎn)換為小寫格式 , 代碼如下。DATA DIVISION.WORKING-STORAGE SECTION.01 SOURCE-STR PIC X(5.01 NEW-STR PIC X(5.*PROCEDURE DIVISION.MOVE AB-CDE TO SOURCE-STR.DISPLAY SOURCE-STR.DISPLAY FUNCTION LOWER-CASE(SOURCE-STR.MOVE Ab-Cde TO SOURCE-STR.DISPLAY SOURCE-STR.DISPLAY FUNCTION L
52、OWER-CASE(SOURCE-STR.MOVE FUNCTION LOWER-CASE(SOURCE-STR TO NEW-STR.DISPLAY NEW-STR.DISPLAY SOURCE-STR.STOP RUN.該段代碼執(zhí)行后,將有以下輸出信息。AB-CDEab-cdeAb-Cdeab-cdeab-cdeAb-Cde通過該段代碼,說明了如何使用 LOWER-CASE 將字符串中的字母轉(zhuǎn)換為小寫形式。同時(shí),對(duì)應(yīng)原 程序的輸出結(jié)果,關(guān)于 LOWER-CASE 的使用還有以下幾點(diǎn)需要注意。LOWER-CASE 只將字符串中的大寫字母轉(zhuǎn)換為對(duì)應(yīng)的小寫形式。對(duì)于字符串中原本為小寫的 字母字符
53、,以及其他字符不做處理。LOWER-CASE 只是臨時(shí)對(duì)其進(jìn)行轉(zhuǎn)換,轉(zhuǎn)換后的結(jié)果只在該條語句有效。也就是說, LOWER-CASE 并不將轉(zhuǎn)換結(jié)果保存到原字符串中。 若要保存轉(zhuǎn)換后的字符串, 通常使用 MOVE 語句將其保存到一個(gè)新的字符串變量中。與 LOWER-CASE 對(duì)應(yīng), UPPER-CASE 是將字符串中的字母轉(zhuǎn)換為對(duì)應(yīng)的大寫形式。 下面這段代碼 綜合應(yīng)用了 LOWER-CASE 和 UPPER-CASE 進(jìn)行字符串轉(zhuǎn)換。DATA DIVISION.WORKING-STORAGE SECTION.01 SOURCE-STR PIC X(10.01 NEW-STR PIC X(5.*P
54、ROCEDURE DIVISION.MOVE String Convert! TO SOURCE-STR.DISPLAY SOURCE-STR.DISPLAY FUNCTION LOWER-CASE (SOURCE-STR.DISPLAY SOURCE-STR.DISPLAY FUNCTION UPPER-CASE (SOURCE-STR.MOVE FUNCTION LOWER-CASE (SOURCE-STR TO NEW-STR.DISPLAY NEW-STR.DISPLAY SOURCE-STR.STOP RUN.該段代碼執(zhí)行后,將有以下輸出信息。String Convert!string convert!String Convert!STRING CONVERT!string convert!String Convert!5.5.2 將字符串轉(zhuǎn)換為具體數(shù)值將字符串轉(zhuǎn)換為具體數(shù)值將是字符串轉(zhuǎn)換中用處很大的一種轉(zhuǎn)換方式。將字符串轉(zhuǎn)換為具體數(shù)值 后,該數(shù)值同其他普通字符一樣,便可參與算術(shù)運(yùn)算了。同時(shí),當(dāng)需要從鍵盤輸入相應(yīng)數(shù)值時(shí),也更加 方便一些。將字符串轉(zhuǎn)換為具體數(shù)值同前一小節(jié)將的字符串大小寫轉(zhuǎn)換類似,都是使用的 FUNCTIONG 語句。 不同的是,此處是通過在 FUNCTION
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國(guó)汽車美容行業(yè)開拓第二增長(zhǎng)曲線戰(zhàn)略制定與實(shí)施研究報(bào)告
- 2025-2030年中國(guó)電影行業(yè)營(yíng)銷創(chuàng)新戰(zhàn)略制定與實(shí)施研究報(bào)告
- 2025-2030年中國(guó)礦用車輛維修行業(yè)營(yíng)銷創(chuàng)新戰(zhàn)略制定與實(shí)施研究報(bào)告
- 2025-2030年中國(guó)動(dòng)力總成零部件行業(yè)并購(gòu)重組擴(kuò)張戰(zhàn)略制定與實(shí)施研究報(bào)告
- 2025-2030年中國(guó)模擬集成電路設(shè)計(jì)行業(yè)開拓第二增長(zhǎng)曲線戰(zhàn)略制定與實(shí)施研究報(bào)告
- 建設(shè)數(shù)據(jù)倉(cāng)庫(kù)的八個(gè)步驟
- 廣東省2025屆兩校高三上學(xué)期第一次聯(lián)合模擬考試英語試題
- 2021-2026年中國(guó)動(dòng)物用疫苗市場(chǎng)調(diào)查研究及行業(yè)投資潛力預(yù)測(cè)報(bào)告
- 二年級(jí)數(shù)學(xué)計(jì)算題專項(xiàng)練習(xí)集錦
- 5米古樹提前放電避雷針 防側(cè)擊輕質(zhì)玻璃鋼接閃桿 伸縮式抱箍
- 工程總承包(EPC)項(xiàng)目管理辦法
- 小學(xué)三年級(jí)上冊(cè)數(shù)學(xué)應(yīng)用題100題
- 石油工程概論
- 加油站安全生產(chǎn)檢查表(資質(zhì)管理、安全生產(chǎn)規(guī)章制度、設(shè)備設(shè)施、特種作業(yè)人員管理、教育培訓(xùn)、勞防用品)
- 運(yùn)維應(yīng)急預(yù)案
- 漫談班主任的道與術(shù)
- 如何高效學(xué)習(xí)學(xué)習(xí)通超星課后章節(jié)答案期末考試題庫(kù)2023年
- 【航空個(gè)性化服務(wù)淺析4700字(論文)】
- 《巧擦黑板》(教案)-一年級(jí)下冊(cè)勞動(dòng)浙教版
- 腫瘤-實(shí)驗(yàn)四腫瘤(病理學(xué)課件)
- 亞洲杯足球比賽應(yīng)急預(yù)案
評(píng)論
0/150
提交評(píng)論