280 likes | 374 Views
字符与字符串. 东城八小 李计绸. 一、字符型. 字符型用 char 作为标识符。字符型必须用单引号括起来,字母作为字符型时,大小写是不等价的,并且字符型只允许单引号中有一个字符,否则就是字符串。. Var a:char; a:=‘b’; a:=‘B’; a:=‘2’;. 知识点: 1 、字符的 ASCII 码(序号):一一对应关系. 2、函数: ord(x) chr(x) 1)、 ord(x): 返回字符 x 的 ASCII 码。
E N D
字符与字符串 东城八小 李计绸
一、字符型 字符型用char作为标识符。字符型必须用单引号括起来,字母作为字符型时,大小写是不等价的,并且字符型只允许单引号中有一个字符,否则就是字符串。 Var a:char; a:=‘b’; a:=‘B’; a:=‘2’;
知识点: 1、字符的ASCII码(序号):一一对应关系
2、函数:ord(x) chr(x) 1)、ord(x):返回字符x的ASCII码。 i:=ord(‘A’); j:=ord(‘B’);n:=ord(‘1’); write(I,j,n); 65 66 49 2)、 chr(x):返回ASCII码为x的字符。 var a:char; a:=chr(98); writeln(a); write(chr(97));
3、字符大小的比较(相应字符ASCII码大小的比较):3、字符大小的比较(相应字符ASCII码大小的比较): ASCII码大的字符大。 ‘b’>’a’ ‘5’>’1’ ‘a’>’A’ 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:array[1..26] of integer; {统计字母出现的次数} begin for i:=1 to 26 do a[i]:=0; read(ch); while ch<>'#' do begin if(ch>='a')and(ch<='z') then begin i:=ord(ch)-96; a[i]:=a[i]+1; end; read(ch); end; for i:=1 to 26 do {输出字符及出现的次数} if a[i]>0 then writeln(chr(i+96),' ',a[i]); end. 算法一:
var ch:char; n,i:integer; a:array[97..122] of integer; {统计字母出现的次数} begin for i:=97 to 122 do a[i]:=0; read(ch); while ch<>'#' do begin if(ch>='a')and(ch<='z') then a[ord(ch)]:=a[ord(ch)]+1; read(ch); end; for i:=97 to 122 do {输出字符及出现的次数} if a[i]>0 then writeln(chr(i),' ',a[i]); end. 算法二:
var ch:char; n,i:integer; a:array['a'..'z'] of integer; {统计字母出现的次数} begin for ch:='a' to 'z' do a[ch]:=0; read(ch); while ch<>'#' do begin if(ch>='a')and(ch<='z') then a[ch]:=a[ch]+1; read(ch); end; for ch:='a' to 'z' do {输出字符及出现的次数} if a[ch]>0 then writeln(ch,' ',a[ch]); end. 算法三:
二、字符串 字符串用于存放批量字符的一串字符。 Var:a:string; 或Var:a:string[n]; A:=‘hello’ 其中正整数n(1<=n<=255)表示构成字符串的字符最多个数。 若字符串说明中没有指定长度,缺省值为255。 Freepascal中新增加的字符串类型: ansistring;默认长度可达2562 -1=65535 Var St:ansistring;
字符串使用中的有关说明和注意事项: 1、字符串的输入和输出: 输入:字符串是以回车作为的结束标志.所以输入必须readln(s);每个readln语句只能读入一个字符串。不能readln(s1,s2); 输出:writeln(s); 2、字符串可以和数组一样操作: a:=’nabcdeg’;则:a[1]:=‘n’;a[3]:=b;输出:writeln(a);或:for i:=1 to length(a) do write(a[i]); 3、从键盘只能接受127个字符;一般都是文件输入。 4、严格区分数字字符、数字字符串与数值的区别,但可以相互转化。 ‘4’<>4 ‘1326’<>1326如:var a:char; i:integer; a:=‘4’;i:=ord(a)-48; writeln(i); {i=4}
5、字符串大小的比较。 ‘123’=‘123’ ‘12345’>’12325’ ‘12345’>’1234’ ‘456’>’123456’ 6、数字串转化为数值型 两种方法: 一、过程 val 二、直接转化
字符串应用举例: 1、输入一个正整数n(<10250),求它的各位数字之和S。 var n:string; s,k,i:integer; begin readln(n); k:=length(n); s:=0; for i:=1 to k do s:=s+ord(n[i])-48; writeln(s); end.
2、编写一个程序,统计从键盘输入的n(<100)个英文单词中以c开头的单词,并输出个数。2、编写一个程序,统计从键盘输入的n(<100)个英文单词中以c开头的单词,并输出个数。 样例: 输入: 4 an cat bee Cow 输出: cat Cow 2
var a:array[1..100] of string; {记录输入的单词} n,i,s:integer; begin readln(n); {输入单词个数} for i:=1 to n do {输入单词} readln(a[i]); s:=0; {记录单词中一c开头的数目} for i:=1 to n do if (a[i,1]='c')or(a[i,1]='C') then begin s:=s+1; {累加} writeln(a[i]); {输出以c开头的单词} end; writeln(s); end.
3、编程验证一个数是不是是回文数(<10250)(一个数的第一位和倒数第一位相同,第二位和倒数第二位相同……如:13531,3443)。3、编程验证一个数是不是是回文数(<10250)(一个数的第一位和倒数第一位相同,第二位和倒数第二位相同……如:13531,3443)。 样例: 输入: 123456435400565654656565 输出: no
var a:string; n,i,len:integer; yn:boolean; begin readln(a); len:=length(a); n:=len div 2; yn:=true; for i:=1 to n do if a[i]<>a[len+1-i] then begin yn:=false; break; end; if yn then writeln('yes') else writeln('no'); end. 方法一
var a:string; i,j,k:integer; begin readln(a); k:=length(a); i:=1; j:=k; while (a[i]=a[j])and(i<j) do begin i:=i+1; j:=j-1; end; if i>=j then writeln('yes') else writeln('no'); end. 方法二
4、完成计算器功能:完成30000以内的正整数加法运算。4、完成计算器功能:完成30000以内的正整数加法运算。 样例:输入:130+100 输出:230 算法: 1)找到‘+’的位置k。 2)将运算符前的字符转化为数值a,运算符后的字符串转化为b。 3)求a+b的值。
var a,b,k,c:integer;ab:longint; s:string; begin readln(s); k:=pos('+',s); val(copy(s,1,k-1),a,c); val(copy(s,k+1,length(s)-k),b,c); ab:=a+b; writeln(ab); end. 方法一 过程:val(s,a,c)中,c只能是整型数,如果转化成功:c=0。a可以是实数也可以是整数. Val(’12.6’,a,c);a:=12.6
var a,b,k,c,n,i:integer;ab:longint; s:string; begin readln(s); k:=pos('+',s); n:=length(s); a:=0; for i:=1 to k-1 do a:=a*10+ord(s[i])-48; b:=0; for i:=k+1 to n do b:=b*10+ord(s[i])-48; ab:=a+b; writeln(ab); end. 方法二
5、编程完成30000以内的正整数的+、-、*、/一种运算,只含一个运算符号。5、编程完成30000以内的正整数的+、-、*、/一种运算,只含一个运算符号。 样例:输入:130*100 输出:13000
var a,b,k,c,len:integer; s:string; op:char; begin readln(s); len:=length(s); for k:=1 to len do if not((s[k]<='9')and(s[k]>='0')) then break; op:=s[k]; val(copy(s,1,k-1),a,c); val(copy(s,k+1,length(s)-k),b,c); case op of '+':writeln(a+b); '-':writeln(a-b); '*':writeln(a*b); '/':if b=0 then writeln('no answer') else writeln(a/b:0:2); end; end.
6、删数问题 键盘输入一个正整数N,去掉其中任意S个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的N和S,寻找一种方案使得剩下的数字组成的新数最小。(N不超过240位) 输入:两行,第一行:正整数n,第二行:正整数S。 输出:n去掉的s个数字后组成的新的最小的正整数m。 样例: 输入:123006 2 输出:1006
每一次删除的一个数字都是从首位开始的最长连续上升序列的最末位数字。每一次删除的一个数字都是从首位开始的最长连续上升序列的最末位数字。 428760005 4 672397104 5 40002876 2 12145789 4
var n:string; s,i:integer; begin readln(n); {输入数字} read(s); {输入删除的数字个数} while s>0 do begin i:=1; while (i<length(n))and(n[i]<=n[i+1]) do inc(i); {寻找不下降序列} delete(n,i,1); {删除不下降序列的末位} dec(s); end; for i:=1 to length(n)-s do while (length(n)>1)and(n[1]='0') do delete(n,1,1);{删除处理后开头的0,并保证n不为空} writeln(n); end.
练习一 编成实现:同时含有多个+、- 运算符的表达式求值。 如: 输入: 45+5-4+10 输出: 56