1、第5讲 字符与字符串,字符型用char作为标识符。字符型必须用单引号括起来,字母作为字符型时,大小写是不等价的,并且字符型只允许单引号中有一个字符,否则就是字符串。,Var a:char; a:=b; a:=B; a:=2;,一、字符型,知识点: 1、字符的ASCII码(序号):一一对应关系,、函数:ord(x) chr(x))ord(x):返回字符x的ASCII码。i:=ord(A); j:=ord(B);n:=ord(1); write(I,j,n); 65 66 49)chr(x):返回ASCII码为x的字符。var a:char;a:=chr(98); writeln(a); writ
2、e(chr(97);,3、字符大小的比较(相应字符ASCII码大小的比较):ASCII码大的字符大。ba 51 aA,4、数字字符转换为相应的数字的方法。var x:char;a:integer;x:=3;a:=ord(x)-48;,练习题目:从键盘上输入一串字符(可能含数字、小写字母),以#作为输入结束标志。 编程完成: 统计输入字符中每个小写字母出现的次数(没有出现的不输出)。 样例: 输入: 2bcdaab33wycc# 输出: a 2 b 2 c 3 d 1 w 1 y 1,算法一:,var ch:char;n,i:integer;a:array126 of integer; 统计字母
3、出现的次数 beginfor i:=1 to 26 do ai:=0;read(ch);while ch# dobeginif(ch=a)and(ch0 then writeln(chr(i+96), ,ai); end.,var ch:char;n,i:integer;a:array97122 of integer; 统计字母出现的次数 beginfor i:=97 to 122 do ai:=0;read(ch);while ch# dobegin if(ch=a)and(ch0 then writeln(chr(i), ,ai); end.,算法二:,算法三:,var ch:char;n
4、,i:integer;a:arrayaz of integer; 统计字母出现的次数 beginfor ch:=a to z do ach:=0;read(ch);while ch# dobeginif(ch=a)and(ch0 then writeln(ch, ,ach); end.,字符串用于存放批量字符的一串字符。 Var:a:string; 或Var:a:stringn; A:=hello 其中正整数n(1=n=255)表示构成字符串的字符最多个数。 若字符串说明中没有指定长度,缺省值为255。 Freepascal中新增加的字符串类型: ansistring;默认长度可达216 -1
5、=65535 Var St:ansistring;,二、字符串,字符串的有关操作,字符串使用中的有关说明和注意事项: 1、字符串的输入和输出: 输入:字符串是以回车作为的结束标志.所以输入必须readln(s);每个readln语句只能读入一个字符串。不能readln(s1,s2); 输出:writeln(s); 2、字符串可以和数组一样操作:a:=nabcdeg; 则:a1:=n;a3:=b; 输出:writeln(a); 或:for i:=1 to length(a) do write(ai); 3、从键盘只能接受127个字符;一般都是文件输入。 4、严格区分数字字符、数字字符串与数值的区
6、别,但可以相互转化。4 4 1326 1326 如:var a:char; i:integer; a:=4;i:=ord(a)-48; writeln(i); i=4,5、字符串大小的比较。123=123 1234512325123451234456123456,6、数字串转化为数值型两种方法:一、过程 val二、直接转化,1、输入一个正整数n(10250),求它的各位数字之和S。,var n:string;s,k,i:integer; beginreadln(n);k:=length(n);s:=0;for i:=1 to k do s:=s+ord(ni)-48;writeln(s); e
7、nd.,字符串应用举例:,2、编写一个程序,统计从键盘输入的n(100)个英文单词中以c开头的单词,并输出个数。 样例: 输入: 4 an cat bee Cow 输出: cat Cow 2,var a:array1100 of string; 记录输入的单词n,i,s:integer; beginreadln(n); 输入单词个数for i:=1 to n do 输入单词readln(ai);s:=0; 记录单词中一c开头的数目for i:=1 to n doif (ai,1=c) or (ai,1=C) thenbegins:=s+1; 累加writeln(ai); 输出以c开头的单词en
8、d;writeln(s); end.,成绩排名 【问题描述:】 根据期末考试的成绩单信息,把所有的学生按总分从高到低的顺序输出。 【输入:】 第一行:学生的个数n(n=1000)。 以下n行:每行包含一个学生的信息,依次是:学号(1n)、姓名、语文成绩、数学成绩。他们中间有且仅有一个空格隔开,输入信息中没有多余的空格。姓名全是字母,长度不大于20,各科成绩不超过100。 【输出:】 N行,每行包含一个学生的信息:学号、姓名、总分。中间用一个空格隔开,不能有多余的空格。总分相同的学生,学号小的在前。,【样例输入:】 4 3 Tom 90 80 1 Jack 85 85 4 Rose 90 90
9、2 Mark 70 80,【样例输出:】 4 Rose 180 1 Jack 170 3 Tom 170 2 Mark 150,分析,3、信息的保存:num:array11000 of integer;name:array11000 of string;sum:array11000 of integer;,1、每一行是一个同学的信息:数字和字符串。只能以字符串方式读入。,2、怎样把一个同学的信息分离:3 Tom 90 80,4、排序:第一关键字:sum 第二关键字:num,readln(s); m:=length(s);k:=0;for j:=1 to m do if sj= thenbegi
10、n inc(k); pk:=j; p1第一个空格的位置,end;val(copy(s,1,p1-1),numi,c);namei:=copy(s,p1+1,p2-p1-1);val(copy(s,p2+1,p3-p2-1), x, c);val(copy(s,p3+1,m-p3), y, c);sumi:=x+y;,信息分离1: 123 Tom 90 80(第i个人的信息),readln(s); m:=length(s);k1:=pos( ,s);k2:=k1+pos( ,copy(s,k1+1,m-k1);k3:=k2+pos( ,copy(s,k2+1,m-k2);val(copy(s,1
11、,k1-1), numi,c);namei:=copy(s,k1+1,k2-k1-1);val(copy(s,k2+1,k3-k2-1),x,c);val(copy(s,k3+1,m-k3),y,c);sumi:=x+y;,信息分离2: 3 Tom 90 80,begin readln(n);for i:=1 to n dobeginreadln(s); m:=length(s);k:=0;for j:=1 to m do if sj= thenbegin inc(k); pk:=j; end;val(copy(s,1,p1-1),numi,c);namei:=copy(s,p1+1,p2-p
12、1-1);val(copy(s,p2+1,p3-p2-1),x,c);val(copy(s,p3+1,m-p3),y,c);sumi:=x+y;end;,varnum:array11000 of integer;name:array11000 of string;sum:array11000 of integer;n,i,j:integer;s:string;k,x,y,c:integer;,常量的定义: Constmaxn=1000;,for i:=1 to n-1 dofor j:=i+1 to n doif (suminumj) thenbeginx:=numi; numi:=numj; numj:=x;s:=namei; namei:=namej; namej:=s;x:=sumi; sumi:=sumj; sumj:=x;end;for i:=1 to n dowriteln(numi, ,namei, ,sumi); End.,排序:,