字符串、字符数组
一、字符、字符串类型
字符 是一个有序的, 字符的大小顺序按其ASCⅡ代码的大小而定。函数succ、pred、ord适用于字符类型。 ord(ch)求字符ch对应的ASCII代码值;如 ord ( 'A' )结果为65; 相反:chr(65)结果为 'A'。
字符串:
字符串是由字符组成的有穷序列。
为了使程序能够处理文字信息,Turbo Pascal特别引入了字符串类型,其值表示一个具有可变长度的字符序列。
字符串类型定义:
var 字符串变量: string [n] 或者string
其中正整数n(1~255)表示构成字符串的字符最多个数,即string字符串类型的字符串其最大
字符串类型定义:
var 字符串变量: string [n] 或者string
其中正整数n(1~255)表示构成字符串的字符最多个数,即string字符串类型的字符串其最大
长度不能超过255。而字符串的实际长度决定程序运行时的实际字符个数,可以由函数length返回。若字符串说明中没有指定长度,则默认n值为255。
字符数组也叫紧缩数组 字符串变量其实就是紧缩型的一维字符数组。字符串变量可以象数组一样使用,且又具有与一般数组不同的附加特征,更便于字符串的操作。例如:
字符数组也叫紧缩数组 字符串变量其实就是紧缩型的一维字符数组。字符串变量可以象数组一样使用,且又具有与一般数组不同的附加特征,更便于字符串的操作。例如:
允许对字符串整体输入输出,如,read(ch); weite(ch);等都是合法的;
允许把字符串直接写在文本文件中;
允许对字符串变量进行赋值;等等。
下面两个定义是等价的:
var ch:packed array[1..10] of char;
var ch:string[10];
string[10]第0单元中存放串的长度,第1~10号单元中存放串的字符
字符串常量可以通过常量说明语句
字符串和函数是什么
字符串常量可以通过常量说明语句
字符串和函数是什么
const 字符串常量名:string[n]='字符串';
规定其常量的串长n,并赋初值。例如:const head:string[7]='zhoufei';
规定其常量的串长n,并赋初值。例如:const head:string[7]='zhoufei';
例1、输入一串字符,字符个数不超过100,且以“.”结束。 判断它们是否构成回文。
分析:回文指从左到右和从右到左读一串字符的值是一样的,如12321,ABCBA,AA等。先读入要判断的一串字符,放入数组中,并记住这串字符的长度,然后首尾字符比较,并不断向中间靠拢,就可判断出是否为回文。
var letter:array[1..100]of char;
i,j:0..100; ch:char;
分析:回文指从左到右和从右到左读一串字符的值是一样的,如12321,ABCBA,AA等。先读入要判断的一串字符,放入数组中,并记住这串字符的长度,然后首尾字符比较,并不断向中间靠拢,就可判断出是否为回文。
var letter:array[1..100]of char;
i,j:0..100; ch:char;
begin
write('Input a string:'); read(ch); i:=0;
while ch<>'.' do { 读入一个字符串以'.'号结束 }
begin i:=i+1; letter[i]:=ch; read(ch) end;
j:=1;
while ch<>'.' do { 读入一个字符串以'.'号结束 }
begin i:=i+1; letter[i]:=ch; read(ch) end;
j:=1;
while (j<i) and (letter[j]=letter[i]) do { 判断它是否是回文 }
begin i:=i-1; j:=j+1 end;
if j>=i then writeln('Yes.') else writeln('No.');
end.
begin i:=i-1; j:=j+1 end;
if j>=i then writeln('Yes.') else writeln('No.');
end.
数组letter定义为: var letter:array[1..100]of char; 占用100个字长。
说明可改为紧缩方式定义:var letter:packed array[1..100]of char; 在32位微机中只占用25个字长。
说明可改为紧缩方式定义:var letter:packed array[1..100]of char; 在32位微机中只占用25个字长。
Turbo Pascal中,一个字符串中的字符可以通过其对应的下标灵活使用。
例2、var name:string; i:integer;
begin
readln(name);
for i:=1 to ord(name[0])do writeln(name[i]);
end.
语句writeln(name[i])输出name串中第i个字符。
语句writeln(name[i])输出name串中第i个字符。
二、字符串的操作
由字符串的常量、变量和运算符组成的表达式称为字符串表达式。字符串运算符包括:
1、连接运算符 +: 如:'Turbo '+'PASCAL'的结果是'Turbo PASCAL'。
若连接的结果字符串长度超过255,则被截成255个字符。若连接后的字符串存放在字符串变量中,当其长度超过定义的字符串长度时,超过部份字符串被截断。
例如:var str1,str2,str3:string[9];
begin str1:='Turbo ';str2:='PASCAL'; str3:=str1+str2 end.
则str3的值为:'Turbo PAS'。
2、关系运算符 =、〈〉、〈、〈=、〉、〉=:
由字符串的常量、变量和运算符组成的表达式称为字符串表达式。字符串运算符包括:
1、连接运算符 +: 如:'Turbo '+'PASCAL'的结果是'Turbo PASCAL'。
若连接的结果字符串长度超过255,则被截成255个字符。若连接后的字符串存放在字符串变量中,当其长度超过定义的字符串长度时,超过部份字符串被截断。
例如:var str1,str2,str3:string[9];
begin str1:='Turbo ';str2:='PASCAL'; str3:=str1+str2 end.
则str3的值为:'Turbo PAS'。
2、关系运算符 =、〈〉、〈、〈=、〉、〉=:
两个字符串的比较规则为,从左到右按照ASCⅡ码值逐个比较,遇到ASCⅡ码不等时,规定ASCⅡ码值大的字符所在的字符串为大。
例如:'that'< 'this' 结果为true;
'12'< '2' 结果为true;
'PASCAL '= 'PASCAL' 结果为false;
例如:'that'< 'this' 结果为true;
'12'< '2' 结果为true;
'PASCAL '= 'PASCAL' 结果为false;
例3、 对给定的10个国家名,按其字母的顺序输出。
var i,j:integer;
t:string[20];
const name:array[1..10] of string[20]=( 'China', 'France', 'Canada', 'Australia',
const name:array[1..10] of string[20]=( 'China', 'France', 'Canada', 'Australia',
'Spain', 'American', 'Sweden', 'Poland', 'Turkey', 'Japan');
begin
for i:=1 to 9 do
for j:=i+1 to 10 do
for i:=1 to 9 do
for j:=i+1 to 10 do
if name[i]>name[j] then
begin t:=name[i]; name[i]:=name[i]; name[i]:=t end;
for i:=1 to 10 do writelname[i]);
for i:=1 to 10 do writelname[i]);
end.
例4 输入一串字符,字符个数不超过100,且以"·"结束,判断它们是否构成回文
分析:所谓回文指从左到右和从右到左读一串字符的值是一样的,如12321、ABCBA、AA等;先读入要判断的一串字符(放入数组letter中),并记住这串字符的长度,然后首尾字符比较,并不断向中间靠拢,就可以判断出是否为回文。
源程序如下:
program ex5_5;
var
letter:array[1..100] of char;
i,j:0..100;
ch:char;
分析:所谓回文指从左到右和从右到左读一串字符的值是一样的,如12321、ABCBA、AA等;先读入要判断的一串字符(放入数组letter中),并记住这串字符的长度,然后首尾字符比较,并不断向中间靠拢,就可以判断出是否为回文。
源程序如下:
program ex5_5;
var
letter:array[1..100] of char;
i,j:0..100;
ch:char;
begin
{读入一个字符串以'.'号结束}
write('Input a string:');
i:=0;read(ch);
while ch<>'.' do
begin
i:=i+1;letter[i]:=ch;
read(ch)
end;
{判断它是否是回文}
j:=1;
while (j<i)and(letter[j]=letter[i])do
begin
i:=i-1;j:=j+1;
end;
{读入一个字符串以'.'号结束}
write('Input a string:');
i:=0;read(ch);
while ch<>'.' do
begin
i:=i+1;letter[i]:=ch;
read(ch)
end;
{判断它是否是回文}
j:=1;
while (j<i)and(letter[j]=letter[i])do
begin
i:=i-1;j:=j+1;
end;
if j>=i then writeln('Yes.')
else writeln('No.');
end.
else writeln('No.');
end.
三、字符串的函数和过程
Turbo Pascal提供了八个标准函数和标准过程,利用它们可以灵活解决字符串解题中的一些问题。设变量s,str,str1,str2均为字符串类型(string){多个字符};ch为字符类型(char){单个字符}
Turbo Pascal提供了八个标准函数和标准过程,利用它们可以灵活解决字符串解题中的一些问题。设变量s,str,str1,str2均为字符串类型(string){多个字符};ch为字符类型(char){单个字符}
标准函数有:
(1)copy(str,n,m)从字符串str的左边第n个开始截取m个字符;若pos大于st的长度,则返回空串。 如:copy(' Pascal ' ,3,2)的结果为'sc ' ;
(2)concat(str1,str2)将两个字串连接成为一个新的字串;
如:s:=str1+str2;同等于两串字符相加
(3)Length(str)求字串str的长度(字符个数);函数值字节型 byte 0~255。
(4)pos(str1,str2)求字串str1在字串中开始的位置;到后返回值为sub在st中的位置,若没到,函数值为0。 如: pos('sca','pascal')结果为3;
(5)upcase(ch)将字符ch转为大写字母,如 upcase( 'a' )结果为'A' ;
标准过程有:
(1)Val(str,x,code)将数字型字串转为数字并存入变量x中;code返回st中第一个非法字符的位置,未有错,code为0。
如:Val(‘768’,x,code),x值为768,code为检测错误代码,若code=0表示没有错误;
(2)str(n,s)将数字n转化为字串存入s中,如str(768,s)s的结果为 '768' ;
(3)insert(str1,str2,n)把字串str1插入在字串str2的第n个字符之前,结果在str2中;{此过程中的str2为变量形参,具有传入传出的功能};
(4)delete(str,n,m)从字串str的第n个开始,删除m个字符,把剩余的字符存在str中,{此过程中的str为变量形参,具有传入传出的功能};
例5、有一个四位数①它是一个完全平方数②千位数和百位数相等,十位数和个位数相等。求这个四位数。
var m,n:integer;
st:string[4];
begin
for n=32 to 99 do
begin
m:=n*n; str(m,st);
if (copy(st,1,1)=copy(st,2,1)) and (copy(st,3,1)=copy(st,4,1))
then writeln(m)
end
end.
var m,n:integer;
st:string[4];
begin
for n=32 to 99 do
begin
m:=n*n; str(m,st);
if (copy(st,1,1)=copy(st,2,1)) and (copy(st,3,1)=copy(st,4,1))
then writeln(m)
end
end.
例6、输入两个整数 x、y(0<x,y<10100),输出它们的和。
var x,y:array[0..100] of integer; { 高精度计算 }
st1,st2:string;
var x,y:array[0..100] of integer; { 高精度计算 }
st1,st2:string;
i,j,sw1,sw2:integer;
begin
write('input x:'); readln(st1); { x,y作为字符串读入 }
write('input y:'); readln(st2);
sw1:=length(st1); sw2:=length(st2); { 记录数组x,y的位数 }
fillchar(x,sizeof(x),0);
fillchar(y,sizeof(y),0); { 数组x,y的元素赋0 }
for i:=sw1 downto 1 do { 将st1反向存入数组x中 }
x[sw1-i]:=ord(st1[i])-ord('0'); {第一次循环 x[sw1-i]为x[0],存放个位数 }
for i:=sw2 downto 1 do { 将st2反向存入数组y中 }
y[sw2-i]:=ord(st2[i])-ord('0');
if sw1<sw2 then sw1:=sw2; { 置sw1为加法时的最大位 }
for i:=0 to sw1 do
begin
x[i]:=x[i]+y[i];
begin
write('input x:'); readln(st1); { x,y作为字符串读入 }
write('input y:'); readln(st2);
sw1:=length(st1); sw2:=length(st2); { 记录数组x,y的位数 }
fillchar(x,sizeof(x),0);
fillchar(y,sizeof(y),0); { 数组x,y的元素赋0 }
for i:=sw1 downto 1 do { 将st1反向存入数组x中 }
x[sw1-i]:=ord(st1[i])-ord('0'); {第一次循环 x[sw1-i]为x[0],存放个位数 }
for i:=sw2 downto 1 do { 将st2反向存入数组y中 }
y[sw2-i]:=ord(st2[i])-ord('0');
if sw1<sw2 then sw1:=sw2; { 置sw1为加法时的最大位 }
for i:=0 to sw1 do
begin
x[i]:=x[i]+y[i];
x[i+1]:=x[i+1]+x[i] div 10; { 进位 }
x[i]:= x[i] mod 10
end;
write(st1,'+',st2,'=');
j:=100;
while x[j]=0 do j:=j-1; { 到第一个有效数位 }
writeln
end.
x[i]:= x[i] mod 10
end;
write(st1,'+',st2,'=');
j:=100;
while x[j]=0 do j:=j-1; { 到第一个有效数位 }
writeln
end.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论