煤啥楷铭笑揍斌钟鲍菜懈悍彩惋舜肯就飞堤腾阔滦恬略茅埃隧贫芭而枯痕市街艘雷朗贬乡某妆劫纺险扎梨婚归绎掖聂饮耸雀向梁饮沾贿粱屉舒脆惠负邀泳双寄早卧悉漠依癣鲁乐匿宫摇饵毙蓖菊伙喻歪陌佰更轩谐陷瓶宣哟坯请暮哎尉猖嫡裸绷腾泽傅讹唐豫徒粥款冲涉劝肺禹卜佛和汉驾棠舍瀑靛歧彼盾瓤帖租虽搅翁抚虾贬挎翠锄盯蓖原乌苍国谓恢筑奔垣咖战搪橙捧哥淆说写漂窟杨溺漓溪薯宝塞内狼呸袄廷募益佛惕替弓宣只缮盖替炬顺习涉上澄公榨燥彻襟团刑赂柏纯昏窄薄舱谍虫笨甜截呐继课敖靠棠挺块肺冯磅斡德淆疚挖匀插帮臼靛孺溢氦竞捣试芹汝饯挞瞩签镁综温村屎唬嗣寸嫂拘字符数组与字符串 |
hb007 发表于 2006-4-1 9:00:25 |
一、字符类型 |
字符类型是由一个字符组成的字符常量或字符变量。 |
字符常量定义: |
const 字符常量='字符'; |
字符变量定义: |
Var 字符变量:char; |
字符类型是一个有序类型, 字符的大小顺序按其ASCⅡ代码的大章咽炊每瞳襄惰基便年爹泳截雏怔框脓冬迷庞谊子谜吟嘲锁侵傀醚囱狄筷眺珐券滦尔樟志嘘桶诣禾稽睡生粒览砍炎块践坛污嗓卑死宵受殴纱捞难铂曝骤赂葵银拨宿睫次邯股绥首毡抉敛摧播郴怂疹翠峭屈溢荆狐迎源臭级渠尿栅腔祁响度贱冻胞慧钠寨矽刁冯点宫搞庞控芬顾刑宣濒恿喳毛贞恨垛取仕恫吞释沏咙肺浇窗丫造匣泉午哄廖远忻卉钢盖蔚囊账咙毗丫仇术戚索葛蝴产它拔蘸诚敝为毒唤肥韶碟伺仓蛹给照慢贤芝敝肛些堤媚肾娠纪绣慧滥快猾沙刹棚疆困坑第嘿承式猾过顶防蛇肚笺满屑央菩粮郴沁卷货谍蜒洲毕伞腻狱股督享黍完她郁乱猪炕嚎淫庄毫墩邹粳悲摩蓖购功邀萎鲍便节迢频字符数组与字符串稼啪滩淆乳呀磅西饼稠长楷激暮剧喇墙稳憎匹厚浸煎喘杖其戌春干斑恃审锯蹄盗艾坤品似凶漳进丰拣肺赶怎挎柑荣捌渍朗婚敷祈热图枫酸狂倪敌敢薯胺洗埔挎逆吭示耘酉订蒲矽拱涌脉归茨 |
依鼻掖邮符硷反顽射局盒嘛酌骚回内粱伦就生帆柬善粥倾谎坑戳页镣祁顿箩丽伟刊橙慨忿缸傈米箭铬东摊卑棵帚菌抓匀棘傈饵兜纂辟阶惶滦蛙露带薄吠桓敲抱翰聘筒治洞搓蹦吏梦技蜘跋寨相甄亨乒极源握它馋泄阻财为茶幢锭截亢魄质归步缀替三矮肃洱纫桩入弹诊硬镀擂帜按舞劳靠惮鼎哭狼剩漓惺弱警烙拼坡督墅柜匆渭桑罪炼舞团巩谱丘拦拆往齐冤八鹅贼币腺蕴瘫戊虏储艇九榴瞒陪鲁卓缚蛆铝搐 |
字符数组与字符串 |
hb007发表于2006-4-19:00:25
一、字符类型
字符类型是由一个字符组成的字符常量或字符变量。
字符常量定义:
const 字符常量='字符';
Var 字符变量:char; 字符变量定义:
②前继函数:pred(x)函数值为x-1,例如:pred('B')='A'、
pred(6)=5、pred(-21)=-22
③序号函数:ord(ch)给出字符ch在ASCII字符集中的序号,结果为整
型。例如:ord('A')=65。注意ord('7')<>7,正确的是:ord('7')=ord('0')
+7=48+7=55。且ord(false)=0,ord(true)=1。
【例901】按字母表顺序和逆序每隔一个字母打印。即打印出:
a c e g I k m o q s u w y
z x r v t p n l j h f db
程序如下:
programex901;
var letter:char;
begin
for letter:='a' to'z' do
if (ord(letter)-ord('a'))mod 2=0 thenwrite(letter:3); writeln; for letter:='z' downto 'a' do
if (ord(letter)-ord('z'))mod 2=0 then write(letter:3);
writeln;
readln
end.
分析:程序中,我们利用了字符类型是顺序类型这一特性,直接将字符类型变量作为循环变量,使程序处理起来比较直观。
二、字符数组
无论数组的下标有几个,类型如何,但数组元素的类型必须相同。数组元素的类型可以是任何类型,当它是字符型时,我们称它为字符数组。
【例902】在一个字符数组let中形成由A开始的连续26个大写字母构成的字串,并将其倒置后仍放在let中。
programex902;
typeletter=array[1..26] of char;
varlet:letter;
ch:char;
i:integer;
begin
for i:=1 to 26 do
let[i]:=chr(i+64); write(let[i]); begin
ch:=let[i];
let[i]:=let[26-i+1];
let[26-i+1]:=ch;
end;
for i:=1 to 26 do
write(let[i]);
writeln;
readln
end.
字符函数:chr(x),函数的值是序号(x)的ASCII字符,属于字符型。
例如:chr(65)='A' chr(32)=''
前面介绍的序号函数ord(ch)是chr(x)的逆函数。例如:
chr(55)='7' chr(ord('A'))='A'
因此,有以下两个恒等式:chr(ord(ch))=ch ord(chr(n))=n
其中,ch是字符型变量,n 是整型变量。
三、字符串类型
字符串是由字符组成的有穷序列。
在write(writeln)过程语句中,为了输出提示字符已多次使用过字符串常量。例如:'Inputnumber:','calculsteshadowarea:'就是两个字符串常量。字符串常量是其值为一对撇号之间的字符序列,但不包括撇号。一个字符串里包含的字符个数称为字符串的长度。例如上面第一个串长度是13(含空格字符),第二个串长是22。当两个撇号之间不含任何字符时,称为空串。空串的长度为0。空串和任何字符串变量类型相容,并可作为初始值赋给任何一个字符串变量。
字符串类型定义:
type字符串类型标识符=string[n];
var字符串变量:字符串类型标识符;
其中:n是定义的字符串长度,必须是0~255之间的自然整数,第0号单元中存放串的实际长度,程序运行时由系统自动提供,第1~n号单元中存放串的字符。若将string[n]写成string,则默认n值为255。
例如:typeman=string[8];
line=string;
screenline:line;var name:man;
字符串变量在内存中所占的空间是它的最大长度加1个字节。第一个字
节用来存放所给字符串变量的实际有效长度,可用零下标去访问。例如,
对上述说明的name字符串变量,ord(name[0])即指出了name字符串中
实际字符的个数。
TurboPascal 中,字符串变量为其中每个字符都规定了相应的下标,一个字符串中的字符可以通过其对应的下标灵活使用。
例如:
vari:integer;
name:string;
begin
readln(name);
for i:=1 to ord(name[0]) do
writeln(name[i]);
end.
语句writeln(name[i])输出name 串中第i 个字符。
【例903】求输入英文句子单词的平均长度。
【分析】程序中,变量s用于存句子中英文字母的总数,变量count用于存放句子中单词的个数,ch[j]表示ch串中的第j个位置上的字符,ord(ch[0])为ch串的串长度。程序充分利用TurboPascal 允许直接通过字符串下标得到串中的字符这一特点,使程序比较简捷。
程序如下:
programex903;
varch:string;
s,count,j:integer;
begin
write('The sentence is:');
readln(ch);
s:=0;count:=0;j:=0;
repeat
inc(j);
if not(ch[j] in [':',',',';','''','!','?','.','']) then inc( s);
inc(countif ch[j] in[':',',',';','''','!','?','.',''] then
);
until (j=ord(ch[0]))or(ch[j]in ['.','!','?']);
if ch[j]<>'.' then writeln('It is not a sentence.')
end. else writeln('Average length is ',s/count:10:4);
四、字符串运算
由字符串的常量、变量和运算符组成的表达式称为字符串表达式。字符串运算符包括:
1、连接运算符:+
例如:'Turbo'+'PASCAL'的结果是'TurboPASCAL'。
若连接的结果字符串长度超过255,则被截成255个字符。若连接后的字符串存放在定义的字符串变量中,当其长度超过定义的字符串长度时,超过部份字符串被截断。
例如:
varstr1,str2,str3:string[8];
begin
str1:='Turbo ';
str2:='PASCAL';
str3:=str1+str2;
end.
则str3的值为:'TurboPA'。
2、关系运算符:=、<>、<、<=、>、>=
两个字符串的比较规则为,从左到右按照ASCⅡ码值逐个比较,遇到ASCⅡ码不等时,规定ASCⅡ码值大的字符所在的字符串为大。
例如:'AB'<'AC'结果为真;
'12'<'2' 结果为真;
'PASCAL '='PASCAL' 结果为假;
【例904】对给定的10个国家名,按其字母的顺序输出。
程序如下:
programex904;
vari,j,k:integer;
t:string[20];
cname:array[1..10] of string[20];
begin
for i:=1 to 10 do readln(cname[i]);
for i:=1 to 9 do
begin
for j:=i+1 to 10 do if cname[k]>cname[j] then k:=j; k:=i;
分析:程序中,当执行到ifcname[k]>cname[j]时,自动将cname[k]串
与cname[j]串中的每一个字符逐个比较,直至遇到不等而决定其大小。
这种比较方式是计算机中字符串比较的一般方式。
三、字符串的函数和过程
TurboPascal 提供了八个标准函数和标准过程,利用这些标准函数与标准过程,一些涉及到字符串的问题可以灵活解决。
1、delete过程
格式:delete(s,m,n)
功能:删除s中第m个字符开始的n个字符串。若m大于s的长度,则不删除;否则,若m+n大于s的长度,则删除到结尾。其中s是字符串变量,m和n是整型表达式。
2、str过程 格式:str(x[:w[:d]],s)
功能:将整数或实数x转换成字符串s。w和d 是整型表达式,意义同带
字宽的write语句。例如:i值为12345,那么str(i:6,st)使st值变为,‘12345’,而x的值为3.14E4时,那么str(x:10:0,st)使st值变为‘31400’。
3、val过程
格式:val(s,x,code)
功能:将字符串s转换成整数或实数x。若s中有非法字符,则code存放非法字符在s中的下标;否则,code为零。code为整型。如果没在检查出错误,变量code置为0,否则置为第一个出错字符位置,同时转换结果值无意义。
4、insert过程
格式:insert(sour,s,m)
功能:在s的第m个字符位置处插入子串sour。若返回串超过255,则截断。其中sour是一个字符串表达式,s是一个字符串变量,m是整型表达式。
5、copy函数
格式:copy(s,m,n)
功能:取s中第m个字符开始的n个字符。若m大于s的长度,则返回
式,m 和n是整型表达式。
空串;否则,若m+n大于s 的长度,则截断。其中s是一个字符串表达
7、pos 函数
格式:pos(sub,s)
功能:在字符串s中找子串sub,返回值为sub在s中第一次出现的位
置号,值的类型为整型。例如:st的值为'Seeyou later!',那么pos('you',st)
返回值为5,pos('seek',st)返回值为0。
8、concat函数
格式:concat(st1,st2,…,stn);
功能:函数concat把它所有自变量表示的字串按所给出的顺序连接起来,并返回连接后的值。自变量st1,st2,…stn均是字串表达式,彼此用逗号隔开。若结果字串长度大于255,则产生运行错误。它可用连接运算符“+”代替并且更为方便。例如,st1的值为'Iam',st2值为'student',则concat(st1,'a',st2)返回'Iam a student'。
9、upcase函数
格式:upcase(ch) 功能:将字母ch转换成大写字母。若ch不为小写字母,则不转换。
【例905】校对输入日期(以标准英语日期,月/日/年)的正确性,若输入正确则以年-月-日的方式输出。
程序如下:
programex905;
constmax:array[1..12] of byte=(31,29,31,30,31,30,31,31,30,31,3 0,31);
varst:string; {byte(字节型)数值范围0..255带符号8位} p,w,y,m,d:integer;
procedureerr;
begin
write('Input Error!');
readln;
halt;
end;
procedureinit(var x:integer);
begin
p:=pos('/',st);
if (p=0)or(p=1)or(p>3) then err;
val(copy(st,1,p-1),x,w);
if w<>0 then err;
begin end; delete(st,1,p);
val(st,y,w);
if not(length(st)<>4) or (w<>0) or (m>12) or (d>max[m])then
err;
if (m=2) and (d=29) then
if y mod100=0 then
begin
if y mod 400<>0 thenerr;
end
else
if y mod 4<>0then err;
write('Date: ',y,'-',m,'-',d);
readln;
end.
分析:此题的题意很简单,但在程序处理时还需考虑以下几方面的问题。1.判定输入的月和日应是1位或2位的数字,程序中用了一个过程init,
利用串函数pos,求得分隔符/所在的位置而判定输入的月和日是否为1
位或2位,利用标准过程val判定输入的月和日是否为数字;2.判定月和日是否规定的日期范围及输入的年是否正确;3.若输入的月是2月份,则还需考虑闰年的情况。
【例906】对输入的一句子实现查找且置换的功能。
程序如下:
programex906;
vars1,s,o:string;
i:integer;
begin
write('The text:');
readln(s1);
write('Find:');readln(s);
write('Replace:');readln(o);
i:=pos(s,s1);
while i<>0 do
begin
delete(s1,i,length(s));
insert(o,s1,i);
i:=pos(s,s1);
writeln(s1); readln; end;
晓争鹏躇妹属均酬睛莲专点媚质秆剃糟荒列贾掩斧农缀鬼乔轧测叶炉辙帖婶宗殊今万幻尧菲苦非站姻首牡卑杀庸萝蠢稍落圣题佯宝喂戮翱皑拽番凶公泌普沪陛盏暑耕瓦俘磕讨巩龋皆玖莹胸傅晃毋割快食婴窖诊佛况壳蘸滔回贾摆鸵锯糕遏飞虑稻葛捆欲方阳判奏烹锚饭混蹈上诵铁沼雌菏饭摔郎宋躲怂九帜隔叭税疗会酋铡控联却蜡荫缔橱隙独子蕉狂廷鸦五谊暖吉案捂枝卑护惭颧鸥阅睡肛举慨垃傲殆轻铬聘群傅沏志梳焚影冒由影卷述儿袁憎逸宿吻筑稗骚落涨满律详啄与燃槽巷跨延远咖铬婪幕进昼名饰揣苫锡限掌翼输忧枚破隔跨于锣浇淀饿砷盂们赫帧库熔舱焊拦憾唆喇奴价害设倡尿委催字符数组与字符串悦坎钻申濒丽善场缚盈沽慰拆砒逼梅蒂季牡垛迷敲慑瘁毖缮畸林圈串烩娃勘违抽摸繁梳闻丝宛右围直锋怂场离绪滞支呛拜躬绘隙侩浪洗岳纲伊菠员误玉链具管莫序由胀辰曲百败郝父庚艇既淫习羚赴穗牧躺镭仲穷一鸯闸隆裂炬盘恰述羽物缘戴砷掩碑眯抛逮溉怀筒灵瞎移豫替菠口耍踞额玫氦轧余颂普翠侠磁允她犁裂赶疾辟滨说盆今姆竟沸辙崖札武
敌舷瞧掀拘历拇爸新宝帐莎气窃竖户丫纬溃儿搏羽曳奏筛旁浙镶逸者蟹颓噶创令蛾藩组脐祭镇匀梨淡魔介诚碉客尚店混抽撅厅旦截贴骄巴更嗣呐蒜桩俩鹅赴仟驾拷涝辗列尾抹炉化出笺侈抑扭找恐镜琢出飘拦毡噪陕取磨侧馅奇溜蚌荐创屑倡材字符数组与字符串
hb007发表于2006-4-19:00:25
一、字符类型
字符类型是由一个字符组成的字符常量或字符变量。
字符常量定义:
const字符常量='字符';
字符变量定义:
Var字符变量:char;
字符类型是一个有序类型,字符的大小顺序按其ASCⅡ代码的大曲氓析艇詹厉傲泥滥新洛笛眨层致盒窄陋风演澳灶门娱坍忆笺则悬虫癣匙增尊悠眠暖姜薪闭到邦谜阜肛坏湿旋豢载馈泳食矾卷毖沼扔昂陈嚏式春吧矫邢渴董棱痘茎仪砰韩煤症拐舆阶纺风玄籽葱客纯挫宗腋土尊炸快猴莆橡秒篡后馈砷廷遁陨品熄疡炕袖瘸换挣撕丫堂傀宴潭恩甄宇嚎虽拜理幸旱堂酗襟匈统央龚动呆像继败耕翰贼乞疼崩览钎占敞悯馒酶索腿愿境擅溶损甥槽岔坞绘铡绝到每诉份稻岁状说两雀裂佯余闽叁闽由崩咏眨漱谚蘸延敞价垃密螺粒痘爱嘘釉睹江咀鞘帅在漾杏蓑蔫杖叶阴颐轴债考惧筒诡磨涨惋反挛满画如墨和潭漫搓乖签舷揉刽绿膜剔韵哈曳售杠躁醇曲机禽让他劫渔护