字符串
§9.1 字符串类型,其一般形式: TYPE <标识符>=STRING[N];
N必须是小于256的整数,表示字符串的最大长度,N缺省值为255。 例如: var name1 : string[20]; {字符串name1的最大长度为20} ss : string; {字符串ss的最大长度为255}
◆ 字符串的实际长度取决于程序执行时所赋予的实际字符个数, 可以用函数Length(字符串名)取得,如:
t=length(ss); {t为整型变量,利用length函数取得字符串ss的实际长度} ◆ 字符串类型变量可以整体输入和输出,如: read(ss); write(ss);
◆ 字符串可以进行连接,连接符为“+”,如: ‘good’ + ‘ morning’ = ‘good morning’
◆ 字符串中的每一个字符可以对应字符数组中的一个元素,可以用字符串名加下标(类似数组)的方法来表示,如:
ss:= ‘computrr’; ss[7]:= ‘e’;
writeln(ss); {将输出‘computer’}
字符串与字符数组的区别在于字符串最大长度只有255,而数组元素的个数可以超过255。 ◆ 字符串可以进行六种关系运算:=、<>、>=、<=、>、< 。当两个字符串进行比较时,是从左到右逐个字符按照它们的ASCII码值进行比较。例如: ‘a’ < ‘b’ 为 true
‘ABCD’ < ‘ABC’ 为 false
◆ Pascal提供了不少函数和过程用于字符串的操作,如: copy(S :string;i , L :integer):string;
返回字符串S中从第i个字符开始的L个字符所组成的字符串 concat(S1,S2,……,Sn:string):string; 合并一系列字符串 Pos(P , S :string):byte; 返回子字符串P在字符串S中的位置 delete(S :string;I,L:ineger); 从字符串S中删除从第I个字符开始的L个字符 Insert(S :string;D :string;P :integer); 在字符串D的P位置插入字符串S
str(I :integer / real;S :string); 整数 / 实数转字符串 val(S :srting;R :real;D :integer); 字符串转整数 / 实数 【例】编写一个学生成绩统计的程序。 输入:n个学生的姓名、成绩;
输出:平均分,成绩低于平均分的学生的姓名。 参考程序:
program exam; const maxn=100;
48
var
name : array[1..maxn] of string; {数组name用于存放学生姓名,数组元素为字符串}
score : array[1..maxn] of integer; {数组score用于存放学生成绩} n , i , sum : integer; ave : real; begin
readln(n); sum:=0;
for i:=1 to n do begin
readln(name[i]); {字符串、字符不能和整型数据共用一个read} readln(score[i]); sum:=sum+score[i]; end;
ave:=sum/n;
writeln(ave:8:1); for i:=1 to n do
if score[i] 【例】输入一个字符串(长度<255),判断是否是回文串(回文串是指从左到右和从右到左读字符串是一样的)。 参考程序: program hwc; var s : string; i , j , n : integer; t : boolean; begin readln(s); n:=length(s); t:=true; i:=1; j:=n; repeat if s[i]<>s[j] then t:=false; i:=i+1; j:=j-1; until (i>=j) or (t=false); if t then writeln('Y') else writeln('N'); end. ● Pascal还允许在字符串中嵌入控制字符。有两种表示控制字符的方法: 49 ① 在符号# 后跟0…255之内的整数,表示与ASCII码相应的一个字符,如: # 65 表示字符‘A’ # 50 表示字符‘2’ # 10 表示换行 ② 在符号^ 后跟一个字符,表示控制字符,如: ^ G 表示响铃 当它们与字符串常量混合在一起时,控制字符不能用单引号括起来,例如: writeln (‘waiting for input!’ ^G^G^G ’ please ’ #27 ‘ u ’); 输出: waiting for input! please ← u (同时响铃) §5.4 类型强制转换 Pascal 提供把变量类型强制转换的功能,即把一种变量作为另一种变量引用,其形式是在要转换的变量前冠以强制转换的类型标识符。 如: A(B) 就是把变量B强制转换为A类型。 ◆ 字符型与整型可以相互转换 字符变量c转换为整型变量i,i的值为该字符对应的ASCII码值; 整型变量i转换为字符变量c,c为以i为ASCII码值所对应的字符。 ◆ 布尔型与整型可以相互转换 布尔变量转换为整型变量时,布尔值true对应1,false对应0; 整型变量转换为布尔变量时,整型值为0时对应false,不等于0时对应true。 ◆ 实型不能和其它类型相互转换,但整型变量可以直接赋给实型变量,如i为整型变量,r为实型变量,可以如下赋值: r:=i; ◆ 数组也可以使用类型强制转换,如数组B是一个二维整型数组,而类型A是一个一维整型数组类型,它们的定义如下: type A = array[1..20] of integer; var B : array[1..2 , 1..10] of integer; 一般,数组B应采用B[ i , j ]的形式,但可以将B强制转换为A,就可以把它当一维数组使用,如A(B)[ i ]。 转换前后的两个数组的对应关系如下: B[1,1] B[1,2] …… B[1,10] B[2,1] B[2,2] …… B[2,10] ? ? ? ? ? ? A(B)[1] A(B)[2] …… A(B)[10] A(B)[11] A(B)[12] …… A(B)[20] 例如: program var c : char; b : boolean; i : integer; begin 运行结果: c:= ‘a’; writeln(‘c=’,c); c=a i:=integer(c); writeln(‘i=’,i); i=97 i:=i+3; writeln(‘i=’,i); i=100 50 c:=char(i); writeln(‘c=’,c); c=d b:=false; writeln(‘b=’,b); b=false i:=integer(b); writeln(‘i=’,i); i=0 i:=2; writeln(‘i=’,i); i=2 b:=boolean(i); writeln(‘b=’,b); b=true end. §5.5 常见错误 数组使用最常出现的错误是数组元素下标超出数组定义时规定的界限。由于默认状态下(即不在程序开头加{$R+}进行检查),运行时即使数组下标越界,系统将不出任何出错信息,依旧给数组赋值,因此常导致我们花很多时间去寻找程序中的错误。 Pascal提供了下标越界检查的功能,即在程序首部使用编译开关{$R+}(即option菜单中compile中的Range Checking)通知系统运行时对下标越界进行检查。但这种方法将占用运行时间,所以建议调试时加入{$R+},调试结束后撤销(缺省时为{$R-})。 练 习 五 1. 统计单词数 读入一英文句子,单词之间用空格或逗号隔开,统计其中单词个数,并输出各个字母出现的频率。(句子末尾不一定用\结束) 要注意连续两个空格或逗号与空格连在一起时的误判断。 2. 一个句子,只含英文字母,单词间用空格或逗号作为分隔符。统计句子中的单词数,如果含有其他的字符,则只要求输出错误信息及错误类型。 含有大写字母 错误类型 error 1 数字(0-9) 错误类型 error 2 其他非法字符 错误类型 error 3 如 输入: It is 12! 输出: error 1 2 3 输入: i am ,a student 输出: 4 3. 输入10个英文单词,按字典顺序排序后输出。 51