第5章字符串及其操作.docx
- 文档编号:24553855
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:42
- 大小:30.55KB
第5章字符串及其操作.docx
《第5章字符串及其操作.docx》由会员分享,可在线阅读,更多相关《第5章字符串及其操作.docx(42页珍藏版)》请在冰豆网上搜索。
第5章字符串及其操作
第5章字符串及其操作
本章主要对COBOL程序中涉及到的字符串进行讲解。
本章首先将讲解字符串的基本概念。
其后,重点讲解和字符串有关的基本操作,其中包括字符串的合并,拆分,替换以及转换。
最后,还将讲解子字符串的概念,如何得到字符串大小的最值,以及如何计算字符串的长度。
5.1字符串的基本概念
COBOL中的字符串实际上就是由一组连续字符所形成的数据。
关于这一点,在前面学习的基本数据类型中的字符类型数据时曾提到过。
字符串的定义方式如下。
01STR-ONEPICXXXXX.
01STR-TWOPICX(10).
以上两种定义方式都是正确的。
其中第一种方式是通过5个连续出现的定义符号X进行定义的。
该语句定义了一个拥有5个字符长度的字符串。
第二种定义方式是通过在定义符号X后面加上一个括号,括号中所填数值为该字符串的长度。
这条语句定义了一个拥有10个字符长度的字符串。
在完成字符串的定义后,通常还应该对所定义的字符串赋上一个初值。
其中既可通过直接数对字符串赋值,也可通过VALUE语句对字符串赋值。
并且,当某一字符串中已含有数据时,也可通过MOVE语句对另一字符串赋值。
以下代码表明了这3种赋值方式。
……
DATADIVISION.
WORKING-STORAGESECTION.
01STR-1PICX(5)VALUE‘ABCED’.
01STR-2PICX(5).
01STR-3PICX(5).
*
PROCEDUREDIVISION.
MOVE‘ABCDE’TOSTR-2.
MOVESTR-1TOSTR-3.
DISPLAY‘STR-1:
’,STR-1.
DISPLAY‘STR-2:
’,STR-2.
DISPLAY‘STR-3:
’,STR-3.
DISPLAY‘COMPLETED!
’.
STOPRUN.
该段代码执行后,将会有以下输出结果。
STR-1:
ABCDE
STR-2:
ABCDE
STR-3:
ABCDE
COMPLETED!
对于以上代码,一共定义了3个字符串数据类型,分别为STR-1,STR-2以及STR-3。
其中字符串STR-1是通过VALUE语句在定义的同时对其赋的初值。
字符串STR-2是通过将直接数“ABCDE”对其赋的值。
字符串STR-3是通过MOVE语句将已存有数据的另一字符串STR-1中的内容拷贝到其下而完成的赋值。
同时还需注意的是,程序中出现的两个直接数“ABCDE”和“COMPLETED!
”实际上也属于字符串。
只是该字符串属于直接数类别,没有进行定义,因而没有对应的名称。
最后还需注意的一点是,COBOL中的字符串和通常使用C语言编写的程序中的字符串是有区别的。
在C语言中,字符串在机内存储时系统要在其末尾添加一个空字符’\0’作为其结束标志。
而COBOL中是不需对字符串添加任何结束标志的。
COBOL中字符串的存储长度即其显现出来的实际长度。
5.2使用STRING语句合并字符串
前面一节简单介绍了COBOL中字符串的基本概念。
下面,将重点介绍对字符串的实际操作。
字符串三大最基本的操作分别为合并,拆分以及转换。
本节主要介绍如何对字符串进行合并操作。
5.2.1STRING语句的基本用法
当需要将2个以上的字符串合并为一个字符串时,通常使用STRING语句完成。
下面这段代码表明了使用STRING语句合并字符串的基本操作。
……
DATADIVISION.
WORKING-STORAGESECTION.
01FIRST-NAMEPICX(10).
01LAST-NAMEPICX(10).
01FULL-NAMEPICX(20).
*
PROCEDUREDIVISION.
MOVE‘ADAM’TOFIRST-NAME.
MOVE‘SMITH’TOLAST-NAME.
STRING
FIRST-NAMEDELIMITEDBYSPACE
‘‘DELIMITEDBYSIZE
LAST-NAMEDELIMITEDBYSPACE
INTOFULL-NAME.
DISPLAY‘FIRSTNAME:
’,FIRST-NAME.
DISPLAY‘LASTNAME:
’,LAST-NAME.
DISPLAY‘FULLNAME:
’,FULL-NAME.
STOPRUN.
该段代码执行后,将有以下输出结果。
FIRSTNAME:
ADAM
LASTNAME:
SMITH
FULLNAME:
ADAMSMITH
以上程序实现的功能实际上,是将分开存储放置的某人姓与名字符串合并为一个完整的姓名字符串。
FIRST-NAME字符串存放该人的姓,LAST-NAME字符串存放该人的名。
FULL-NAME字符串存放该人完整的姓名,由以上两字符串合并而成。
该程序实现字符串合并操作的重点语句为。
STRING
FIRST-NAMEDELIMITEDBYSPACE
‘‘DELIMITEDBYSIZE
LAST-NAMEDELIMITEDBYSPACE
INTOFULL-NAME.
以上即为STRING语句的基本格式。
其中每项用于合并的字符串后面都要加上DELIMITEDBY子句。
DELIMITEDBY子句后面有两个选项,分别为SPACE和SIZE。
这两个选项的作用分别如下。
❑SPACE:
找到前面用于合并的字符串中第一次出现空格的地方。
将该空格以前的部分进行合并,空格以后的内容包括该空格在内不参与合并操作。
❑SIZE:
将前面对应的用于合并的字符串中的全部内容进行合并。
对应前面的代码,可以看到参与合并的字符串共有3项。
这3项字符串依次为FIRST-NAME,由一个空格所形成的直接数字符串,以及LAST-NAME。
其中,FIRST-NAME和LAST-NAME中的实际内容分别为。
FIRST-NAME:
ADAM______
LAST-NAME:
:
SMITH_____
此处使用下划线表示空格。
由于这两项字符串数据的定义语句如下,因此其存储长度都为10个字符的长度。
01FIRST-NAMEPICX(10).
01LAST-NAMEPICX(10).
同时,由于对这两个字符串的赋值语句如下,赋值的长度小于定义的长度。
因此,需要在这两个字符串数据后加上相应的空格以填充其定义的长度。
MOVE‘ADAM’TOFIRST-NAME.
MOVE‘SMITH’TOLAST-NAME.
然而,在进行合并时,我们并不希望将这些多余的空格也合并到新的字符串中。
因此,这里使用了DELIMITEDBY子句中的SPACE选项将多余的空格进行了截取。
截取之后,两者实际参与合并的内容如下。
FIRST-NAME:
ADAM
LAST-NAME:
:
SMITH
然而,如果仅仅是对以上这两项内容进行合并时,则最终输出结果会将二者连接在一起,不利区分。
也就是说,若使用下面这条STRING语句进行合并时,输出结果形式将不太理想。
STRING
FIRST-NAMEDELIMITEDBYSPACE
LAST-NAMEDELIMITEDBYSPACE
INTOFULL-NAME.
将原程序中的STRING语句替换为这条STRING语句后,输出结果如下所示。
FIRSTNAME:
ADAM
LASTNAME:
SMITH
FULLNAME:
ADAMSMITH
可以看到,这时输出的完整姓名FULLNAME,将组成姓和名的字母连接到了一起,无法区分开来。
因此,这时还需要在合并后的字符串中插入一个空格,以区分哪几个字母是姓,哪几个字母是名。
插入空格时,就不能再用DELIMITEDBYSAPCE子句了,否则将插入不进任何东西。
插入空格以及插入带空格的字符串时,必须使用DELIMITEDBYSIZE子句,将整个进行插入。
原程序中插入空格的语句如下。
‘‘DELIMITEDBYSIZE
这样,原程序依次将FIRSTNAME,一个空格(作为姓和名的分隔符),LASTNAME进行了合并。
并且,对于FIRSTNAME和LASTNAME这两个字符串,仅将其有效部分进行合并。
最终,合并后的3个字符串便组成了另一个新的字符串。
该字符串显示完整的姓名信息,并且在姓和名之间留有一个空格以进行区分。
5.2.2STRING语句的综合应用
上一小节简单介绍了STRING语句的基本用法。
根据其基本用法,该语句在实际开发中常常用于将文件中各条分开放置的记录组成一条完整的输出信息。
以下结合一个具体实例,说明STRING语句在实际开发中的综合应用。
假设某一公司员工各项财务收入信息文件INCOME-SYSIN包含有如下信息。
❑员工的工号
❑员工姓名
❑员工住址
❑工资
❑奖金
❑出差报销费用
❑本次工资及奖金发放的具体时间
❑本次出差报销的具体时间
该文件包含有多条记录,分别对应每一位员工的相关信息。
为方便说明问题,这里不妨假设其中第一条记录的具体信息如下。
10742
WANG_WEI_______
WU_HAN_SHI_JIANG_HAN_QU_YOU_YI_LU
3500
1000
802.75
08/01/31
08/01/25
现要求只输出员工及其出差报销信息,并且出差报销费用只取其整数部分。
此外,每条输出记录要有相应编号,编号从00001开始顺次往下排。
最后,每条输出信息要求统一从第5列开始输出。
则实现该功能完整的程序代码如下。
IDENTIFICATIONDIVISION.
PROGRAM-IDINCOME-PROG.
AUTHERXXX.
*
ENVIRONMENTDIVISION.
INPUT-OUTPUTSECTION.
FILE-CONTROL.
SELECTINCOME-FILE
ASSIGNTOINCOME-SYSIN.
*
DATADIVISION.
FILESECTION.
FDINCOME-FILE
RECORDINGMODEISF.
01RECORD.
05EMPLOEE-INFO.
10EMP-NUMBERPIC9(5).
10EMP-NAMEPICX(15).
10EMP-ADDRESSPICX(35).
05INCOME-INFO.
10SALARYPIC9(4).
10BONUSPIC9(4).
10REIMBURSEPIC999.99.
10SAL-DATEPICX(8).
10REIM-DATEPICX(8).
WORKING-STORAGESECTION.
77PRT-LINEPICX(100).
77LINE-POSPICS9(4).
77LINE-NOPIC9(5).
77DEC-POINTPICXVALUE‘.’.
77EOF-FLAGPICXVALUE‘N’.
*
PROCEDUREDIVISION.
OPENINPUTINCOME-FILE.
READINCOME-FILE
ATENDMOVE‘Y’TOEOF-FLAG
END-READ.
PERFORM100-PROCESS-RECORDS
VARYINGLINE-NOFROM1BY1
UNTILEOF-FLAG=‘Y’.
CLOSETEST-FILE.
STOPRUN.
100-PROCESS-RECORDS.
MOVE5TOLINE-POS.
STRING
LINE-NOSAPCEEMPLOEE-INFOSPACE
DELIMITEDBYSIZE
REIMBURSE
DELIMITEDBYDEC-POINT
SPACEREIMDATE
DELIMITEDBYSIZE
INTORPT-LINE
WITHPOINTERLINE-POS.
DISPLAYPRT-LINE.
READINCOME-FILE
ATENDMOVE‘Y’TOEOF-FLAG
END-READ.
该段程序执行后,将有如下输出信息(下划线表示空格)。
第5列
↓
00001_WANG_WEI________802_08/01/25
00002_……
……
其中省略号省略了其他记录对应的输出信息。
该段程序实际上完成了以下3个任务。
❑选择相关的字符串信息进行合并。
❑指定每条信息在输出字符串中所在的具体位置。
❑对报销费用字符串进行了截取。
对应于STRING的基本用法,该程序中所扩展的两条STRING子句如下。
❑DELIMITEDBYDEC-POINT:
这是对DELIMITEDBY子句的延伸。
在上一小节STRING的基本用法里只讲了在BY的后面接上SIZE或SPACE选项。
而此处BY后面接的是一个变量名称,该变量的内容为一个小数点。
因此这里是将REIMBURSE变量中小数点以前的部分进行截取并用于合并。
实际上,BY后可接任何一个变量,并将该变量中保存的字符作为原字符串的截取符。
截取符的用法同SPACE选项类似。
❑WITHPOINTER:
该语句指定合并生成字符串的起始位置,类似与一个指针。
原程序中其后为LINE-POS变量,且该变量保存有数值5。
因此合并后字符串的起始位置在新字符串PRT-LINE的第5位。
5.3使用UNSTRING语句拆分字符串
同使用STRING语句合并字符串相对应,通常使用UNSTRING语句拆分字符串。
本节仍然首先介绍UNSTRING语句的基本用法。
在此基础上,再讲解UNSTRING语句的综合应用。
5.3.1UNSTRING语句的基本用法
当需要将字符串进行拆分时,通常就要用到UNSTRING语句。
UNSTRING语句相当于是STRING语句的逆运算。
下面,仍然结合前面利用STRING语句合并姓名的例子介绍UNSTRING语句的基本用法。
这次假设此人的姓名“AdamSmith”已保存在一个变量之中。
此程序所需完成的功能是将该条完整的姓名拆分为姓和名两个字符串,并分别存放到不同的变量之中。
程序代码如下。
……
DATADIVISION.
WORKING-STORAGESECTION.
01FULL-NAMEPICX(20)
VALUE‘ADAMSMITH’.
01LAST-NAMEPICX(10).
01FIRST-NAMEPICX(10).
*
PROCEDUREDIVISION.
UNSTRINGFULL-NAME
DELIMITEDBY‘‘
INTOFIRST-NAME
LAST-NAME.
DISPLAY‘FULLNAME:
’,FULL-NAME.
DISPLAY‘FIRSTNAME:
’,FIRST-NAME.
DISPLAY‘LASTNAME:
’,LAST-NAME.
STOPRUN.
以上代码运行后,将有如下输出信息。
FULLNAME:
ADAMSMITH
FIRSTNAME:
ADAM
LASTNAME:
SMITH
由此可见,存放有完整姓名信息的FULLNAME字符串变量被拆分为了两个新的字符串。
其中一个字符串名称为FIRSTNAME,保存FULLNAME中的前一部分内容“ADAM”。
另一个字符串名称为LASTNAME,保存FULLNAME中的后一部分内容“SMITH”。
FULLNAME中的这两部分是通过空格分隔开来的。
因此,在拆分该字符串时使用了以下这条子句用以划分拆分的内容。
DELIMITEDBY‘‘
同样,此处的空格字符‘’也可被其他字符所替代。
例如,下面这段程序就使用日期分隔符‘/’替代了上面代码中的空格‘’。
该程序实现的功能是将一个完整的日期分成年,月,日三个部分,依次存放在不同变量中。
代码如下。
……
DATADIVISION.
WORKING-STORAGESECTION.
01DATEPICX(10)
01YEARPICX(4).
01MONTHPICX
(2).
01DAYPICX
(2).
*
PROCEDUREDIVISION.
MOVE‘2008/01/15’TODATE.
UNSTRINGDATE
DELIMITEDBY‘/‘
INTOYEAR
MONTH
DAY.
DISPLAY‘DATE:
’,DATE.
DISPLAY‘YEAR:
’,YEAR.
DISPLAY‘MONTH:
’,MONTH.
DISPLAY‘DAY:
’,DAY.
STOPRUN.
以上代码运行后,将有如下输出信息。
DATE:
2008/01/15
YEAR:
2008
MONTH:
01
DAY:
15
5.3.2UNSTRING语句的综合应用
同STRING语句一样,UNSTRING语句在实际应用中还有一些其他需要注意的地方。
下面结合一个实例进行讲解,以加深对UNSTRING语句的理解,同时提高实际应用能力。
假设一家公司对其运营的项目进行管理,需要将某一项目不同类别的信息分开保存到不同的变量中。
其中完整的项目信息从文件中的记录获得。
保存项目不同类别信息的变量在数据部的工作存储节中定义。
完整的代码如下。
IDENTIFICATIONDIVISION.
PROGRAM-IDDIVIDE-PROG.
AUTHERXXX.
*
ENVIRONMENTDIVISION.
INPUT-OUTPUTSECTION.
FILE-CONTROL.
SELECTPROJECT-FILE
ASSIGNTOP-SYSIN.
*
DATADIVISION.
FILESECTION.
FDPROJECT-FILE
RECORDINGMODEISF.
01PRO-RCD.
05LINE-NOPIC9(5).
05FILLERPIXX.
05PRO-CODEPICX(10).
05FILLERPICX.
05PRO-NAMEPICX(21).
05FILLERPICX.
05LEADER-NOPIC9(5).
05FILLERPICX.
05BUDGETPIC9(7).99.
WORKING-STORAGESECTION.
01DISPLAY-INFO.
05P-NAMEPICX(21).
05FILLERPICXVALUESPACE.
05P-UNITPICXXX.
05FILLERPICXVALUESPACE.
05P-BUDGETPIC9(7).
01OTHER-INFO.
05PJT-NOPIC9(6).
05PJT-LEADER-NOPIC9(5).
77LEN-1PIC99.
77LEN-2PIC99.
77DLMBYPICX.
77STDLM-1PICX.
77STDLM-2PICX.
77STR-POSPIC9.
77FIELD-NUMPIC9.
77EOF-FLAGPICXVALUE‘N’.
*
PROCEDUREDIVISION.
OPENINPUTPROJECT-FILE.
READPROJECT-FILE
ATENDMOVE‘Y’TOEOF-FLAG
END-READ.
MOVE‘.’TODLMBY.
MOVE7TOPOS-START.
PERFORM100-PROCESS-RECORDS
UNTILEOF-FLAG=‘Y’.
CLOSEPROJECT-FILE.
STOPRUN.
100-PROCESS-RECORDS.
UNSTRINGPRO-RCD.
DELIMITEDBYALLSPACESOR‘/’ORDLMBY
INTOPJT-NODELIMITERINSTDLM-1
P-UNIT
P-NAMECOUNTINLEN-1
PJT-LEADER-NODELIMITERINSTDLM-2COUNTINLEN-2
P-BUDGET
WITHPOINTERSTR-POS
TALLYINGINFIELD-NUM
ONOVERFLOWGOUNSTRING-FINISHED.
UNSTRING-FINISHED.
DISPLAYDISPLAY-INFO.
READPROJECT-FILE
ATENDMOVE‘Y’TOEOF-FLAG
END-READ.
以上程序的运行步骤如下。
(1)打开文件PROJECT-FILE,读入文件第1条记录。
如果遇到文件结束(即该文件为空),则将文件结束标志EOF-FLAG置为‘Y’。
其中F-FLAG默认值为‘N’。
对应代码为。
OPENINPUTPROJECT-FILE.
READPROJECT-FILE
ATENDMOVE‘Y’TOEOF-FLAG
END-READ.
(2)将拆分文件时自定义的分隔符小数点‘.’存入变量DLMBY中。
将拆分字符的起始位置7存入变量STR-POS中。
循环执行100-PROCESS-RECORDS处理过程,直至读取文件结束。
当读取文件结束时,关闭文件,程序结束。
对应代码如下。
MOVE‘.’TODLMBY.
MOVE7TOSTR-POS.
PERFORM100-PROCESS-RECORDS
UNTILEOF-FLAG=‘Y’.
CLOSEPROJECT-FILE.
STOPRUN.
(3)执行100-PROCESS-RECORDS处理过程,对文件中整条记录的字符串进行拆分。
拆分时,从该字符串的第7个位置开始拆分。
7由变量STR-POS指定。
拆分完成后,将拆分的条目数量保存到变量FIELD-NUM中。
当字符串末尾还有未被拆分数据(该程序省略掉项目运算金额的小数部分,因此都不会被完全拆分),转到处理过程UNSTRING-FINISHED。
对应代码为。
UNSTRINGPRO-RCD.
DELIMITEDBYALLSPACESOR‘/’ORDLMBY
INTOPJT-NODELIMITERINSTDLM.
P-UNIT
P-NAMECOUNTINLEN
PJT-LEADER-NO
P-BUDGETDELIMITERINSTDLM-2COUNTINLEN-2
WITHPOINTERSTR-POS
TALLYINGINFIELD-NUM
ONOVERFLOWGOUNSTRING-FINISH
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第5章 字符串及其操作 字符串 及其 操作