字符串讲义.docx

上传人:b****6 文档编号:6775691 上传时间:2023-01-10 格式:DOCX 页数:12 大小:43.71KB
下载 相关 举报
字符串讲义.docx_第1页
第1页 / 共12页
字符串讲义.docx_第2页
第2页 / 共12页
字符串讲义.docx_第3页
第3页 / 共12页
字符串讲义.docx_第4页
第4页 / 共12页
字符串讲义.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

字符串讲义.docx

《字符串讲义.docx》由会员分享,可在线阅读,更多相关《字符串讲义.docx(12页珍藏版)》请在冰豆网上搜索。

字符串讲义.docx

字符串讲义

字符串

一、复习字符型:

1、类型:

char(有序型)

2、定义:

vara,b:

char;

3、占用空间:

每个变量占用1个字节。

每个变量只能存放一个字符。

4、每个字符都有唯一对应的ASCII码。

0-9A-Za-z

48-5765-9097-120

5、相关函数:

(1)Chr(i)求ASCII码为i的字符

(2)Ord(a)求字符的ASCII玛

(3)Pred(a)求字符的前趋字符

(4)Succ(a)求字符的后继字符

二、字符串类型

1、类型名:

sting(有序型)

2、定义:

vars,st:

string;

Vars:

string[20];

3、占用空间:

默认256字节,即最大串长256。

4、引用方法:

(1)整体引用:

Vars,s1:

string;

Read(s);(整个输入行都将被作为一个串读入,包括空格)

Readln(s);

Write(s);

S1:

=s;

S:

=’abcdefg’;

(2)下标引用:

S:

=’abcdefg’;

S[2]:

=’B’;

Write(s);aBcdefg

Write(s[4]);d

S1[1]:

=s[1];

S1[2]:

=s[3];

Write(s1);ac

(注意:

下标引用时,每个元素等同于一个字符型变量)

5、字符串运算:

a)布尔运算:

比较字符串大小,按从前到后的顺序逐个比较字符串的ASCII码,直到比出大小时停止。

(与串长无关)

如:

’a’>’bcdefg’,‘abcdefg’>’abcdef’

b)加法运算(字符串连接):

将+号后面的串连接在+号前面的

串的后面。

(注意:

不遵守加法交换率)

如:

’abcd’+’efg’=’abcdefg’,‘efg’+’abcd’=’efgabcd’

6、相关函数和过程:

1、测字符串长度(Length)函数:

测字符串的字符个数。

Vars:

string;

I:

integer;

Begin

S:

=’abcdefg’;

I:

=length(s);

Write(i);

End.输出结果:

7

2、查找子串位置(pos)函数:

找出子串在母串中出现的第一个字符位置,如果出现多次,只找出第一次出现的位置。

Vars,s1,s2:

string;

I,i1,i2:

integer;

Ss:

char;

Begin

S:

=’abcdefg’;

S1:

=’def’;

S2:

=’1234’;

Ss:

=’c’;

I:

=pos(s1,s);i=4

I1:

=pos(s2,s);i=0

I2:

=pos(ss,s);i=3

End;

3、复制子串(copy)函数:

复制母串中指定位置的子串。

Vars,s1:

string;

Begin

S:

=abcdefg’;

S1:

=copy(s,3,3);

Write(s1);

End.输出:

cde

4、插入子串(insert)过程:

语法:

insert(s1,s,n);将子串S1插入到串S的第N个位置

例如:

Vars,s1:

string;

Begin

S:

=’abefg’;

S1:

=’cd’;

Insert(s1,s,3);

Write(s);

End.输出:

abcdefg

5、删除子串(delete)过程:

语法:

delete(s,n,m);将串S的第N个字符开始的M个字符删除

例如:

Vars:

string;

Begin

S:

=’abcdefg’;

Delete(s,2,4);

Write(s);

End.输出:

afg

6、数转串(str)过程:

语法:

str(I,s);将数值变量I的值转换成字符串并保存在S中。

例如:

Vars,s1,s2:

string;

I:

integer;

M:

real;

Begin

I:

=1234;

M:

=1.5;

Str(I,s);

Writeln(s);

Str(m,s1);输出:

1234

Writeln(s1);输出:

1.500000000000000E+000

Str(m:

3:

1,s2);输出:

1.5

Writeln(s2);

End.

7、串转数(val)过程:

语法:

val(s,n,code);将字符串S转换成数值并保存在变量n中。

Code是标志变量(整型),如果转换成功,code=0,否则,code的值等于转换不成功的第一个字符所在位置。

例如:

Vars,s1,s2,:

string;

I:

code:

integer;

M:

real;

Begin

S:

=’1234’;

S1:

=’1234+5678’;

S2:

=’12.34’;

Val(s,I,code);

Writeln(I);输出:

1234

Writeln(code);输出:

0

Val(s1,I,code);

Writeln(i);输出:

0

Writeln(code);输出:

5

Val(s2,m,code);

Writeln(m);输出:

1.234000000000000E+001

Writeln(code);输出:

0

Val(s2,I,code);

Writeln(i);输出:

0

Writeln(code);输出:

3

End.

三、freepascal的扩充字符串型:

ansistring(无限串长)

Vars:

ansistring;注意:

下标从0开始。

四、有关文件的函数:

1、Eof(inf):

测文件inf读入指针是否到达文件末尾。

True(false)

2、Eoln(inf):

测文件inf的读数指针是否达到行末。

五、练习:

1、读入一段英文短文(不超过255个字符),统计其中26个英文字母各自出现的次数。

2、读入一段英文短文(不超过255个字符),统计其中单词的个数。

3、读入任意位数的一个整数,分离它的各个数位。

4、读入一字串(长度不大于50),删去字串中相同的字符。

5、接收一个任意长度的字串(小于100个字符),将该字符串中的字符按照ASCII码表从小到大的顺序重新排列形成一个新的字符串并打印出来。

6、在两个字符串中,找出一个长度最长的公共子串。

7、判断输入的一个字符串是否是回文。

8、编制一个能进行二元数学运算的程序,如:

输入:

2+3,输出答案:

5;

输入:

2*4,输出答案:

8

9、字符串编辑

从键盘输入一个字符串(长度<=40个字符),并以字符’.’结束。

例如:

’Thisisabook.’现对该字符串进行编辑,编辑功能有:

D:

删除一个字符,命令的方式为:

Da其中a为被删除的字符

例如:

Ds表示删除字符’s’,若字符串中有多个‘s’,

则删除第一次出现的。

如上例中删除的结果为:

‘Thiisabook.’

I:

插入一个字符,命令的格式为:

Ia1a2其中a1表示插入到指定字符前面,a2表示将要插入的字符。

例如:

Isd表示在指定字符’s’的前面插入字符‘d’,若原串中有多个‘s’,则插入在最后一个字符的前面,如上例中:

原串:

’Thisisabook.’

插入后:

’Thisidsabook.’

R:

替换一个字符,命令格式为:

Ra1a2其中a1为被替换的字符,a2为替换的字符,若在原串中有多个a1则应全部替换。

例如:

原串:

‘Thisisabook.’

输入命令:

Roe

替换后的字符串为:

‘Thisisabeek.’

在编辑过程中,若出现被改的字符不存在时,则给出提示信息。

9、计算器改良:

NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:

需要在该公司某型号的计算器上加上解一元一次方程的功能。

实验室将这个任务交给了一个刚进入的新手ZL先生。

为了很好的完成这个任务,ZL先生首先研究了一些一元一次方程的实例:

4+3x=8

6a-5+1=2-2a

 -5+12y=0

ZL先生被主管告之,在计算器上键入的一个一元一次方程中,只包含整数、小写字母及+、-、=这三个数学符号(当然,符号“─”既可作减号,也可作负号)。

方程中并没有括号,也没有除号,方程中的字母表示未知数。

编写程序,解输入的一元一次方程,将解方程的结果(精确至小数点后三位)输出

10、乒乓球

【问题背景】国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。

其中11分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。

华华就是其中一位,他退役之后走上了乒乓球研究工作,意图弄明白11分制和21分制对选手的不同影响。

在开展他的研究之前,他首先需要对他多年比赛的统计数据进行一些分析,所以需要你的帮忙。

【问题描述】华华通过以下方式进行分析,首先将比赛每个球的胜负列成一张表,然后分别计算在11分制和21分制下,双方的比赛结果(截至记录末尾)。

比如现在有这么一份记录,(其中W表示华华获得一分,L表示华华对手获得一分):

WWWWWWWWWWWWWWWWWWWWWWLW

在11分制下,此时比赛的结果是华华第一局11比0获胜,第二局11比0获胜,正在进行第三局,当前比分1比1。

而在21分制下,此时比赛结果是华华第一局21比0获胜,正在进行第二局,比分2比1。

如果一局比赛刚开始,则此时比分为0比0。

你的程序就是要对于一系列比赛信息的输入(WL形式),输出正确的结果。

【输入格式】每个输入文件包含若干行字符串(每行至多20个字母),字符串有大写的W、L和E组成。

其中E表示比赛信息结束,程序应该忽略E之后的所有内容。

【输出格式】输出由两部分组成,每部分有若干行,每一行对应一局比赛的比分(按比赛信息输入顺序)。

其中第一部分是11分制下的结果,第二部分是21分制下的结果,两部分之间由一个空行分隔。

【输入样例】

WWWWWWWWWWWWWWWWWWWW

WWLWE

【输出样例】

11:

0

11:

0

1:

1

21:

0

2:

1

11、侦探推理:

明明同学最近迷上了侦探漫画《柯南》并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏。

游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情况下),明明的任务就是找出这个罪犯。

接着,明明逐个询问每一个同学,被询问者可能会说:

 

证词中出现的其他话,都不列入逻辑推理的内容。

明明所知道的是,他的同学中有N个人始终说假话,其余的人始终说真。

现在,明明需要你帮助他从他同学的话中推断出谁是真正的凶手,请记住,凶手只有一个!

【输入格式】

输入由若干行组成,第一行有二个整数,M(1≤M≤20)、N(1≤N≤M)和P(1≤P≤100);

M是参加游戏的明明的同学数,N是其中始终说谎的人数,P是证言的总数。

接下来M行,

每行是明明的一个同学的名字(英文字母组成,没有主格,全部大写)。

往后有P行,每行开始是某个同学的名宇,紧跟着一个冒号和一个空格,后面是一句证词,符合前表中所列格式。

证词每行不会超过250个字符。

输入中不会出现连续的两个空格,而且每行开头和结尾也没有空格。

【输出格式】

如果你的程序能确定谁是罪犯,则输出他的名字;如果程序判断出不止一个人可能是

罪犯,则输出CannotDetermine;如果程序判断出没有人可能成为罪犯,则输出Impossible。

【输入样例】

315

MIKE

CHARLES

KATE

MIKE:

Iamguilty.

MIKE:

TodayisSunday.

CHARLES:

MIKEisguilty.

KATE:

Iamguilty.

KATE:

Howareyou?

?

【输出样例】

MIKE

12、谁拿了最多奖学金

【问题描述】

某校的惯例是在每学期的期末考试之后发放奖学金。

发放的奖学金共有五种,获取的条件各自不同:

1)  院士奖学金,每人8000元,期末平均成绩高于80分(>80),并且在本学期内发表1篇或1篇以上论文的学生均可获得;

2)  五四奖学金,每人4000元,期末平均成绩高于85分(>85),并且班级评议成绩高于80分(>80)的学生均可获得;

3)  成绩优秀奖,每人2000元,期末平均成绩高于90分(>90)的学生均可获得;

4)  西部奖学金,每人1000元,期末平均成绩高于85分(>85)的西部省份学生均可获得;

5)  班级贡献奖,每人850元,班级评议成绩高于80分(>80)的学生干部均可获得;

只要符合条件就可以得奖,每项奖学金的获奖人数没有限制,每名学生也可以同时获得多项奖学金。

例如姚林的期末平均成绩是87分,班级评议成绩82分,同时他还是一位学生干部,那么他可以同时获得五四奖学金和班级贡献奖,奖金总数是4850元。

现在给出若干学生的相关数据,请计算哪些同学获得的奖金总数最高(假设总有同学能满足获得奖学金的条件)。

【输入文件】

输入文件scholar.in的第一行是一个整数N(1<=N<=100),表示学生的总数。

接下来的N行每行是一位学生的数据,从左向右依次是姓名,期末平均成绩,班级评议成绩,是否是学生干部,是否是西部省份学生,以及发表的论文数。

姓名是由大小写英文字母组成的长度不超过20的字符串(不含空格);期末平均成绩和班级评议成绩都是0到100之间的整数(包括0和100);是否是学生干部和是否是西部省份学生分别用一个字符表示,Y表示是,N表示不是;发表的论文数是0到10的整数(包括0和10)。

每两个相邻数据项之间用一个空格分隔。

【输出文件】

输出文件scholar.out包括三行,第一行是获得最多奖金的学生的姓名,第二行是这名学生获得的奖金总数。

如果有两位或两位以上的学生获得的奖金最多,输出他们之中在输入文件中出现最早的学生的姓名。

第三行是这N个学生获得的奖学金的总数。

【样例输入】

4

YaoLin8782YN0

ChenRuiyi8878NY1

LiXin9288NN0

ZhangQin8387YN1

【样例输出】

ChenRuiyi

9000

28700

13、字符串的展开

【问题描述】

在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:

如果在输入的字符串中,含有类似于“d-h”或者“4-8”的字串,我们就把它当作一种简写,输出时,用连续递增的字母获数字串替代其中的减号,即,将上面两个子串分别输出为“defgh”和“45678”。

在本题中,我们通过增加一些参数的设置,使字符串的展开更为灵活。

具体约定如下:

(1)遇到下面的情况需要做字符串的展开:

在输入的字符串中,出现了减号“-”,减号两侧同为小写字母或同为数字,且按照ASCII码的顺序,减号右边的字符严格大于左边的字符。

(2)参数p1:

展开方式。

p1=1时,对于字母子串,填充小写字母;p1=2时,对于字母子串,填充大写字母。

这两种情况下数字子串的填充方式相同。

p1=3时,不论是字母子串还是数字字串,都用与要填充的字母个数相同的星号“*”来填充。

(3)参数p2:

填充字符的重复个数。

p2=k表示同一个字符要连续填充k个。

例如,当p2=3时,子串“d-h”应扩展为“deeefffgggh”。

减号两边的字符不变。

(4)参数p3:

是否改为逆序:

p3=1表示维持原来顺序,p3=2表示采用逆序输出,注意这时候仍然不包括减号两端的字符。

例如当p1=1、p2=2、p3=2时,子串“d-h”应扩展为“dggffeeh”。

(5)如果减号右边的字符恰好是左边字符的后继,只删除中间的减号,例如:

“d-e”应输出为“de”,“3-4”应输出为“34”。

如果减号右边的字符按照ASCII码的顺序小于或等于左边字符,输出时,要保留中间的减号,例如:

“d-d”应输出为“d-d”,“3-1”应输出为“3-1”。

【输入】

输入文件expand.in包括两行:

第1行为用空格隔开的3个正整数,一次表示参数p1,p2,p3。

第2行为一行字符串,仅由数字、小写字母和减号“-”组成。

行首和行末均无空格。

【输出】

输出文件expand.out只有一行,为展开后的字符串。

【输入输出样例1】

expand.in

expand.out

121

abcs-w1234-9s-4zz

abcsttuuvvw1234556677889s-4zz

【输入输出样例2】

expand.in

expand.out

232

a-d-d

aCCCBBBd-d

【输入输出样例3】

expand.in

expand.out

342

di-jkstra2-6

dijkstra2************6

【限制】

40%的数据满足:

字符串长度不超过5

100%的数据满足:

1<=p1<=3,1<=p2<=8,1<=p3<=2。

字符串长度不超过100

15、Y型项链(Necklace)

欢乐岛上众多新奇的游乐项目让小可可他们玩的非常开心。

现在他们正在玩比赛串项链的游戏,谁串的最快就能得到优厚的奖品。

这可不是普通的项链,而是一种Y型项链,项链的最中间有一颗大珍珠作为结合点,从大珍珠上连出来3条由各种宝石串起来的链子。

比赛的规则是这样的:

每次可以从三条链子中某一条的一端取下来一个宝石,或者安上去一个宝石,称为一次操作,经过若干次操作,最终使得三条链子完全相同。

想要赢得比赛,那么只能使用尽量少的操作次数。

假设每种宝石都有无数多个以供使用,且链子足够长。

你能帮助小可可赢得比赛吗?

注:

由于对Y型项链的宝石数没有特殊的要求,所以即使你把所有宝石都取下来,也是一个可以接受的方案(三根没有串宝石的绳子也是完全一样的)。

输入:

一共有3行,表示Y型项链的三条链子,每行开始有一个数字N,表示初始时这条链子上串有N个宝石(N<=50),随后是一个空格,然后是N个'A'和'Z'之间的字符,表示这个链子上的宝石,每个字母表示一种不同的宝石,这个字符串最左边的字符表示的是离大珍珠最近的那个宝石,而最右边的表示的是在链子末端的宝石。

输出:

只有一个整数,表示所需要的最少的操作次数。

样例:

输入:

3CAT

3TAC

5CATCH

输出:

8

提示:

100%的数据中,N<=50。

50%的数据中,N<=20。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1