CHARACTER=?a?..?z?;
上述语句定义了两个子界类型的变量,第一个NUMBER的取值为1至9;第二个CHARACTER的取值为小写字母‘a’至‘z’。
三、记录类型
记录型数据类型是PASCAL语言中做搜索问题中一定要用到的数据类型,所以,它在PASCAL语言中占着非常重要的地位。学过数据库管理软件的人都知道,在数据库文件中,有一个非常重要的概念—记录,例如:一个人的各门成绩,一个人的各种信息(姓名、性别等等),我们都把它们存放成一条记录而给予一个统一的名称。
1、 记录说明:记录类型和枚举类型一样,都要在程序头部用TYPE引导说明。语法如下:
TYPE 类型名称=RECORD
域变量1:基类型; 域变量2:基类型;
???? END;
然后在常/变量说明中就要以用这种类型了。在程序中使用必须指定变量名与域名。 [例6、2]编一程序,用来记录20个学生的姓名、年级、班级、性别、语文成绩、数学成绩、总分,平均分。
Type student=record Name:string; Grade,class,chinese,mathe,sum:integer; Average:real; Male:boolean; End;
Var s:array[1..20] of student; I,j:integer; Begin
For I:=1 to 20 do begin Write(?please input the student?s name,grade,class,male,chinese,mathe);
Readln(s[I].name); Readln(s[I].grade); Readln(s[I].class); Readln(s[I].male); Readln(s[I].chinese);
Readln(s[I].mathe);
S[I].sum:=s[I].chinese+s[I].mathe; S[I].average:=s[i].sum/2
End; ????
{如果程序要求打印或排序,只需在此增加这些功能语句} end.
30
第四节、字符串(重要,注意用法及相关函数和过程)
在PASCAL语言中,字符串的处理是非常方便的,在定义字符串时,我们不仅可以定义成CHAR型(单个字符);STRING型(任意个字符);STRING[N]型(指定只有N个字符)。在后两种类型中,我们都可以使用:变量名[I],来指定字符串中的第I字符,以便得到它的值或对其赋值。而且,我们还可以使用如下函数对字符串进行各种操作:
1、 CHR(N):返回N(ASCII码)对应的字符。如:CHR(66)的值是?b?;
2、 UPCASE(C):把字符串全部转成大写字母。 3、 CONCAT(S1,S2):把两个字符串相加,如:CONCAT(‘ABC’,‘123’)的结果
是‘ABC123’;
4、 COPY(S,M,N):这是很有用的一个函数,它的作用是取字符串S第M个字符
开始的N个字符作为一个新的子串。如:COPY(‘ABCDE’,3,2)的值是‘CD’; 5、 LENGTH(S):求字符串S的长度。如:LENGTH(‘ABCD’)的值是4; 6、 DELETE(S,M,N):与COPY的功能正好相反,作用是把字符串S的第M个字符开始的N个字符删除掉。如DELETE(‘ABCDEF’,3,2)的结果是‘ABEF’; 7、 INSERT(S1,S2,N):把字符串S1插入到字符串S2中,插在S2的第N个字符后面。如:INSERT(‘ABCD’,‘12345’,2)的结果是:‘12ABCD345’。 8、 POS(S1,S2):这是一个非常有用的函数,其作用是判断S1是否是S2的子串,
返回结果是:(1)如果是子串,只返回S1在S2中的起始位置;(2)如果不是子串,
则返回0。如:POS(‘123’,‘ABCDEF’)的值为0;POS(‘AB’,‘BABCD’)的值为2;
另外,我们还可以使用如下几个过程: 1、 STR(N,S):这是一个过程,作用是把N这个数值转化为S这个字符串。如:STR
(123,S),作用是把S的值赋成了‘123’; 2、 VAL(S,N,CODE):这也是一个过程,作用是把S这个字符串转化为N这个数值,并且同时返回CODE这个错误代码(整数型)。如:VAL(‘135’,N,C);作
用是把N的值赋成了135这个数值,而且返回C这个错误代码。为什么会有错误代码呢?大家看这个语句是否错误,错在哪里:VAL(‘12ABC’,M,C);
[例6、3]把26个英语字母正向、逆向打印出来。 Const s:string[26]=?abcdefghijklmnopqrstuvwxyz?; Var t:string[26];
I:integer;
Begin
t:=? ?; {共26个空格} For I:=1 to 26 do begin T[I]:=s[27-I]; End; Writeln(s); Writeln(t); End.
31
[例6、4]找出所有的四位回文数:(回文数就是一个数从左往右读与从右往左读都是同一个数) var s:string[4];
n:integer; begin
for n:=1000 to 9999 do begin
str(n,s);
if (s[1]=s[4]) and (s[2]=s[3]) then write(n:6); end;
end.
或者用如下程序: var n:integer; s,t:string; begin
for n:=10 to 99 do begin
str(n,s); t:=s+s[2]+s[1]; write(s:6); end;
end.
上述两个程序,哪个快,哪个慢?
1、编写一个译码程序,把一个全部是大写英语句子译成数字代码。译码规则是以数字1代
替字母A,数字2代替字母B,……,26代替字母Z,如遇空格则打印一个星号?*?,英文句子以?.?结束。
2、输入一个字符串,内有数字和非数字字符。如A123X456Y7A,302ATB567BC,打印字符串中所有连续(指不含非数字字符)的数字所组成的整数,并统计共有多少个整数。
32
信息学竞赛基础训练题
综合训练二
数值计算
1.1. 找出100到999之间的整数中所有等于它每位数字立方和的数. 28.pas
1.2. 已知四位数3025有一个特殊性质: 它的前两位数字30和后两位数字25的和是 55, 而55的平方刚好等于该数(55*55=3025). 试编一程序打印所有具有这种性质的四位数 29.pas
1.3.找出四个互不相等的自然数, 它们之中任意两数之和为偶数,任意三数之和可以被3整除,而且这四个数的和越小越好(已知它们的和不大于50). 30.pas 数字游戏
2.1. 以不同的字母代表0--9之间的数字, 现有如下等式成立: a+bc+def=ghij,编程求出满足上述条件等式的个数并将所有等式打印输出. 31.pas
2.2. 下面的竖式表示, 图中的\号只能用素数2,3,5,7代替, 因此称为素数乘法竖式. 32.pas
* * * × * * --------------- * * * * * * * * ---------------- * * * * *
编程找出此乘法竖式的所有可能方案.
2.3. 出售金鱼: 出售金鱼者决定将缸里的金鱼分五次全部卖出: 33.pas 第一次卖出全部金鱼的一半加二分之一条;
第二次卖出剩余金鱼的三分之一加三分之一条; 第三次卖出剩余金鱼的四分之一加四分之一条; 第四次卖出剩余金鱼的五分之一加五分之一条;
现在还剩下11条金鱼一次卖出. 问缸里原来有多少条金鱼.
2.4. 一个四位数是一个完全平方数,减去一个每位数字都相同的四位数( 如 1111, 5555)后, 仍是一个完全平方数. 请编程打印出所有这样的四位数. 34.pas
2.5. 将1,2,3,4,5,6,7,8,9这九个数字组成三个三位数, 使每个数都是完全平方数,输出这样的三个三位数 35.pas
2.6. 如果一个数从左边读和从右边读都是同一个数, 就称为回文数. 例如: 6886就是一个回文数. 编程找出所有既是回文数又是素数的四位数. 36.pas 穷举法(枚举法)
3.1. 16/64是一个分子和分母都是两位数的真分数, 且分子的个位数与分母的十位数相同. 非常奇怪的是: 如果把该分数的分子的个位数和分母的十位数同时划去, 所得到的结果正好等于原分数约分后的结果. 例 16/64=1/4. 编程找出所有满足上述条件的真分数. 37.pas
3.2、某个班有48个同学, 按1--48编号, 称为学号. 按学号顺序分为6个组, 每组 8人.请挑出所有学号是所在组号倍数的学生的学号.。38.pas
3.3 从A,B,C三个字母中选出两个按先后顺序排在一起, 打印所有排法. 39.pas 数字问题
33
4.1. 从键盘输入一个整数, 如果是奇数就直接打印, 否则反复除以2, 直到商为奇数为止, 打印这个奇数商. 40.pas 4.2. 求100以内的所有素数. 41.pas
4.3. 某自然数N(1 4.4. 求1992个1992相乘结果的最后三位数. 43.pas 4.5. 从键盘输入两个自然数, 求它们的最大公约数和最小公倍数. 44.pas 4.6. 一个自然数是素数, 且它的数字位置经过任意对换后仍为素数, 称为绝对素数. 例如13. 试找出所有这样的四位绝对素数. 45.pas 4.7. 五位数 4H97H 能被3整除, 且它的最低二位数字所组成的数 7H 能被6整除, 求这个五位数字. 46.pas 4.8. 975*935*972*( ), 在( )中填什么自然数使四个数的乘积末四位全为0, 求出最小值. 47.pas 4.9. 修改31743的某一位上的数字, 使之成为823的倍数. 48.pas 4.10. 一个自然数, 若它的质因数至少是两重的(相同的质因数至少个数为二个, 如36=2*2*3*3)则称该数为\漂亮数\若相邻两个自然数都是\漂亮数\就称它们为\孪生漂亮数\例如8与9就是一对.编程再找出一对\孪生漂亮数\ 49.pas 4.11.在自然数中, 各位数字之和的11倍正好等于自身的自然数只有一个. 请找出这个自然数. 50.pas 4.12. 验证下面结论: 一个各位数字不同且都不为0的N位数X(3<=N<=5), 将组成该数的各位数字重新排列成一个最大数和一个最小数作减法, 其差值再重复前述运算, 若干次后必出现一个N位数Y, 使之重复出现. 例如: X=213, 则有213→321-123=198 981-189=892 982-289=693 963-369=594 954-459=495 954-459=495 这时Y=954. 51.pas 4.13、计算: 1?11?11*2?11*2*3?......?11*2*3*...*20 52.pas 关于字符及字符串****** 要求: 1. 熟悉ASCII码; A 65 a 97 2. 熟悉关于字符串的函数及过程: COPY(STRING, N, M)函数; DELETE(STRING, N, M)过程; LENGTH(STRING)函数; POS(STRING1, STRING2)函数; STR(S, STRING)过程; VAL(STRING,S,CODE)过程; 3.字符的两个操作:chr(65)=’A’ ord(‘A’)=65 5.1. 从键盘输入一个字符串, 打印出其所有子串. 53.Pas 8.2. 三位数学系的大学生走在马路上, 发现一辆汽车违反交通规则后逃走了. 他们没有记下汽车的号码, 不过每个人都注意到了这是个四位数. 甲记得这个汽车号码的前二位数字相同, 乙记得后两位数字相同, 丙记得整个四位数恰好是一个完全平方数. 请问这个号码是什么? 8.3. 打印如下图形: (1) 1 (2) 1111111 (3) 1 (4) 4444444 111 11111 222 33333 11111 111 33333 222 1111111 1 4444444 1 34