字符串讲义.docx
《字符串讲义.docx》由会员分享,可在线阅读,更多相关《字符串讲义.docx(12页珍藏版)》请在冰豆网上搜索。
![字符串讲义.docx](https://file1.bdocx.com/fileroot1/2023-1/9/7f469ab0-8678-4fef-865d-93a4d81193fb/7f469ab0-8678-4fef-865d-93a4d81193fb1.gif)
字符串讲义
字符串
一、复习字符型:
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。