Pascal基础知识复习(一)
内容:标准数据类型、基本运算符、基本语句、数组、字符串、常用标准函数或过程、记录
1、标准数据类型:
①整数
类 型 |
单 词 |
范 围 |
分配的空间 |
短整数 |
Shortint |
-128..127 |
1个字节 |
整 数 |
Integer |
-32768..32767 |
2个字节 |
长整数 |
Longint |
-2147483648..2147483647 |
4个字节 |
字节型 |
Byte |
0..255 |
1个字节 |
字 型 |
Word |
0..65535 |
2个字节 |
FP中Dword类型 |
Dword |
0..4294967295 |
4个字节 |
FP中Qword类型 |
Qword |
0..18446744073709551615 |
8个字节 |
FP中Int64类型 |
Int64 |
-9223372036854775808.. 9223372036854775807 |
8字节 |
②、实数类型:
Pascal中有以下几种实数类型:(其中后4种必须用{$Sn+}编译才可用)
类型 |
单词 |
范围 |
有效数字 |
分配的空间 |
基本实数类型 |
Real |
2.9×10-39—1.7×1038 |
11—12 |
6 |
单精度 |
Single |
1.5×10-45—3.4×1038 |
7—8 |
4 |
双精度 |
double |
5.0×10-324—1.7×10308 |
15—16 |
8 |
扩展型 |
extended |
1.9×10-4951—1.1×104932 |
19—20 |
10 |
装配十进制型 |
comp |
-9.2×1018—9.2×1018 |
19—20 |
|
③、字符类型(Char)
字符类型对应一个英文字符、数字、符号等字符,在Pascal中为其分配1个字节的空间,每一字符对应一个编号,我们称之为ASCII码(美国国家标准信息交换码),我们可以用函数Ord( )来求出某个字符的ASCII码,如:
Ord(’A’)=65,Ord(’B’)=66,……,Ord(’Z’)=90。
Ord(’a’)=97,Ord(’b’)=98,……,Ord(’z’)=122
Ord(’0’)=48,Ord(’1’)=49,……,Ord(’9’)=57
我们也可以用函数Chr( )来求出某个ASCII码对应的字符,如:
Chr(65)= ’ A’,Chr(66)= ’B’……,
由此可以看出:Chr与Ord是两个互逆运算:如:
Chr(Ord(’1’))= ’1’ ord(chr(99))=99
若要将小写字母’y’转换成大写字母,我们可以Chr(ord(’y’)+32)实现;也可以用函数Upcase( )来实现:Upcase(’y’)=’Y’。
④、布尔类型(Boolean)
布尔类型表示一种判断的结果,其值只有True(正确)和 False(错误)两个,如5>3的判断结果是True,而3>5的判断结果是False。
在Pascal中规定:Ord(false)=0;ord(true)=0;
2、基本运算符
数学运算: +、-、*、/ 、Div、Mod;
布尔运算: Not、And、Or;
关系运算符: =、<>、>、<、>=、<=
这些运算符优先顺序规则是:
I 括号内的表达式先计算
II运算符的优先级有4级,排列如下
最高级 Not
第一级 * 、/、div、 mod、 and
第二级 + 、-、 or
第三级 =、<>、>、<、>=、<=
根据上面运算符的顺序,请写出下列表达式的值:
not 5>3= 27+8 div 3 =7-6 mod 4=
思考题:
5 and 3= 7 or 0=
3、基本语句:
输入语句:Read和Readln
格式:Read(x1,x2,…,xn); 或Readln(x1,x2,…,xn);
功能:从输入文件中(即Input)中读入数据,如果没有特别地用过程Assign将Input指明具体的用户输入文件时,Input就是“键盘”。
注意:一次读入多个数据时,数据之间用空格隔开,但字符类型则字符见不用空格;
readln语句后可不跟变量,表示输入任意键或者换一行;
readln语句输入完后,自动跳到下一行行首,后面的输入语句从下一行行首开始读数据;
例如:给整型变量x,y,z输入值。
程序1:从键盘输入 |
程序2:从文件data.in中输入 |
Var x,y,z:Integer; Begin Readln(x,y,z); End. 缺省的输入文件是键盘 |
Var x,y,z:integer; Begin Assign(input,’data.in’);{指明从其他文件读} reset(input); {读方式} Readln(x,y,z); {读数据} Close(input); {关闭文件} End. |
输出语句: write和writeln
格式:write(V1,V2,…,Vn); 或writeln(V1,V2,…,Vn);
功能:将括号中的实际内容写到标准文件(Output)中,如果没有特别地用过程Assign将output指明具体的用户输入文件时,Output就是“显示器的屏幕”。
注意:如果是变量或表达式,则应输出他们的值,如果是常量或字符串,则照原样输出。
Write语句输出后光标不换行,writeln语句输出后,光标换一行,writeln语句后可不跟仁任何内容,表示输出一个换行符。
可以用场宽来控制输出的位置:
单场宽:假设变量a=56;则语句write(a:8)和 语句write(a:1)分别输出为:
□□□□□□56 占用8个格子
56 由于56本身必须占用2个格子,而指定的场宽1小于2,故照原样输出
双场宽:主要针对实数,第一个场宽表示整个实数占用的格子,第2个场宽指明小数位数。
假设a=54.098;则语句write(a:8:2); 和语句write(a:1:0);分别输出
□□□54.10
54
赋值语句: :=
格式:变量:=表达式;
功能:计算表达式的值并赋值给变量。
注意:赋值号两边的数据类型必须相同或相容,对于这一点的理解:变量:=表达式
左边是整数类型,则右边表达式计算结果的类型必须是整数类型;
左边是字符类型,则右边表达式计算结果的类型必须是字符类型;
左边是实数类型,则右边表达式计算结果可以是整数类型、也可以是实数类型。
左边是boolean,则右边表达式计算结果的类型boolean;
由此可见:只有实属可以兼容整数,所以整数类型与实数类型是相容的。
两变量a,b值交换的代码:c:=a; a:=b; b:=c;
或:c:=a+b; a:=c-a; b:=c-b;
分支语句:If 条件 Then 语句;
格式一: If (条件)then 语句; <——如果条件成立,则执行语句;
格式二: If (条件)then 语句1 else 语句2;
<—如果条件成立,则执行语句1,否则执行语句2;
分情况语句 |
|
Case <情况表达式> of 情况1:语句1; 情况2:语句2; …… 情况n:语句n; else 语句n+1 {者条语句可省略} End; |
If 情况表达式=情况1 then 语句1; If 情况表达式=情况2 then 语句2; …… If 情况表达式=情况n then 语句n; |
循环语句
For 循环
格式一:For 变量:=初值 to 终值 do 循环体;
格式二:For 变量:=初值 downto 终值 do 循环体;
说明:◆格式一的循环次数是:终值-初值+1、格式二的循环次数是:初值-终值+1;
◆是一个枚举型循环:例如:
For I:=1 to 10 do s:=s+I;
变量i分别取:1 2 3 4 5 6 7 8 9 10;每取得一个值,循环语句执行一次;
◆该循环是先判断后执行,循环有可能依次也不执行。
While循环
格式: While (条件) do 循环体; {当条件满足,则循环执行,知道条件不满足为止}
Repeat循环
格式: Repeat
循环体
until 条件; {执行循环知道条件满足为止}
循环语句中用到的两条命令:Break和Continue:Break推出当前循环、contiune 不执行循环体中Continue后面的语句,直接进行下次循环。
4、数组
定义:一维数组:a:Array[1..50] of Integer;,相当于50 个整型单变量,用下标来区分,例如:a[1]、a[2]、a[30]等,理解一维数组时可用表格的方式来形象理解:比如上面的数组图示为:
二维数组:g:Array[1..10,1..5] of integer,相当于10*5=50个整型单变量,用双下标区分,依次为:a[1,1]、a[1,2]、a[1,3]、a[1,4]、a[1,5]、a[2,1]、a[2,2]、…、a[10,5]。理解二维数组可以用表格来形象理解,g数组可以图示为:
注意:
◆关于Fillchar过程在给数组所有元素赋值的运用:比如要对上面一维数组a全部清0时的使用方法:
Fillchar(a,sizeof(a),0); 对于数组g:Fillchar(g,sizeof(g),0)。
◆数组元素存储地址的计算:假设a数组元素类型是Integer,第一个元素a[1]的地址是100,则a[2]的存储地址是102、a[3]的存储地址是104、……如下图示。
可以推导出公式:a[I]的地址=第一元素地址+(I-1)*2;
如果a的元素是Longint,则a[I]的地址=第一元素地址+(I-1)*4;
5、字符串
所谓字符串,就是一串字符,与字符是有本质区别的。
定义形式:Var s:String;
或 s:String[n];这里的n是常数,如果n=5则字符串s的长度不能超过5。但这里的n不能超过255,即字符串string类型的变量,最长长度不能超过255。
例如:Var s:string[10];
注意:
◆字符串的理解可以一维字符数组来理解,例如:
Var s:string[50]; 相当于Var s:Array[1..50] of char;
◆String的最长长度不超过255,FP中的ansistring的长度几乎没有限制,可以达到2GB的长度。
◆ 字符串中常用的的函数:如下:
求长度length : 定义:function Length(S: String): Integer;
例子:var
S: String; L:Integer;
begin
Readln (S);
L:=Length(s);
end.
---------------------------------------------------------------------------------------
复制子串copy: 定义: function Copy(S: String; Index: Integer; Count: Integer): String;
注意:S 是字符串类型的表达式。Index和Count是整型表达式。Copy 返回S中从Index开始,Count个字符长的一个子串。
例子: var S: String;
begin
S := 'ABCDEF';
S := Copy(S, 2, 3); { 'BCD' }
end.
---------------------------------------------------------------------------------------
插入子串insert: 定义:procedure Insert(Source: String; var S: String; Index: Integer);
注意:Source 是字符串类型的表达式。 S 是任意长度字符串类型变量。Index 是整型表达式。Insert 把 Source插在S中Index处。如果结果字符串的长度大于255,那么255之后的字符将被删除。
例子: var
S: String;
begin
S := 'Honest Lincoln';
Insert('Abe ', S, 8); {s= 'Honest Abe Lincoln' }
end.
--------------------------------------------------------------------------------------
删除子串delete
定义:procedure Delete(var S: String; Index: Integer; Count:Integer);
注意:S 是字符串类型变量。 Index和Countare是整型表达式。Delete 删除S中从Index开始的Count个字符。如果Index大于S的长度,则不删除任何字符;如果Count大于S中从Index开始的实际字符数,则删除实际的字符数。
例子:var
s: string;
begin
s := 'Honest Abe Lincoln';
Delete(s,8,4);
Writeln(s); { 'Honest Lincoln' }
Delete(s,9,10);
Writeln(s); { 'Honest L' }
end.
-------------------------------------------------------------------------------------
字符串转为数值val: 定义: procedure Val(S; var V; var Code: Integer);
在这里: S 是由一系列数字字符构成的字符串类型变量;。
V 是整型或实型变量;
Code 是Integer型变量
注意:Val将S转为它的数值形式。
例子:
var s:string;I, Code: Integer;
begin
s:='1234';
val(s,i,code);
writeln(i); { 1234 }
end.
---------------------------------------------------------------------------------
数值转为字符串str: 定义: procedure Str(X [: Width [: Decimals ]]; var S:string);
注意:将数值X转成字符串形式。
例子: var
S: string[11];
I:Integer;
R:Real;
Begin
I:=123; r:=34.78;
Str(I, S); {s='123’}
Str(I:5,S); {s='□□123’}
Str(r,s); {s='3.478000000000E+01’}
Str(r:8:3,s);{s='□□34.780’}
end;
---------------------------------------------------------------------------------------
求子串起始位置pos: 定义:function Pos(Substr: String; S: String): Byte;
注意:Substr和S字符串类型表达式。Pos在S中搜索Substr并返回一个integer值。这个值是Substr的第一个字符在S中的位置。如果在S中没有找到Substr,则Pos返回0。
例子:var S: String; p:Byte;
begin
S:= '123.5';
P:=pos('2’,S); {p=2}
P:=pos('6’,s); {p=0}
end.
-------------------------------------------------------------------------------------
字符完全串连 + 定义:操作符+把两个字符串联在一起。
例子: var s1,s2,s:string;
begin
s1:='Turbo ';
s2:='pascal';
s:=s1+s2; { 'Turbo pascal' }
end.
-----------------------------------------------------------------------------------
字符串压缩空格串连 - : 定义:操作符-去掉第一个字符串最后的空格后,将两个字符串联在一起。
例子: var s1,s2,s:string;
begin
s1:='Turbo ';
s2:='pascal';
s:=s1-s2; { 'Turbopascal' }
end.
常用的其它过程或函数:
abs(x)=|x|、 sqr(x)=x2 、 sqrt(x)=、
exp(x)=ex、ln(x)=(这里的e=2.1234)
pred(x)
{求前驱、如pred(1)=0、prd(0)=-1、pred(‘1’)=’0’、pred(‘b’)=’a’}、
succ(x)
{求后继、如succ(‘1’)=2、succ(‘1’)=’2’、succ(true)=false} 、
ord(x)
{求序号、如ord(1)=1、ord(‘1’)=49、ord(’8’)-ord(‘0’)=8}
chr(x)
{求字符、如chr(65)=’A’、chr(’48’)=’0’、chr(ord(‘a’)-32)=’A’}
upcase(x)
{求x的大写字母、如upcase(‘a’)=’A’、upcase(‘B’)=’B’}
odd(x)
{若x为奇数则odd(x)=true,若x为偶数则odd(x)=false,如odd(5)=true}
round(x)
{求最接近x的整数、如:round(3.15)=3、round(4.52)=5}
trunc(x)
{去掉x的小数部分、如:trunc(3.15)=3 、trunc(4.52)=4}
取整函数int(x):定义:function Int(X: Real): Real;
注意:X是实型数,返回值也是实型的;返回的是X的整数部分,也就是说,X被截尾了(而不是四舍五入)
例子: var R: Real;
begin
R := Int(123.567); { 123.0 }
R := Int(-123.456); { -123.0 }
end.
取小数函数frac(x): 定义:function Frac(X: Real): Real;
注意:X 是实型表达式. 结果返回 X 的小数部分; 也就是说,Frac(X) = X - Int(_X).
例子:var R: Real;
begin
R := Frac(123.456); { 0.456 }
R := Frac(-123.456); { -0.456 }
end.
下面4道试题,测试数据在“网上邻居jiaoshijib 练习题数据”下:测测自己能得多少分!!!
本 周 测 试 题 目
第1题:分割自然数(文件名:1.pas 100分)
找出N位自然数中(N<=8,且是偶数)具有下列性质的数:如果将这个自然数分为2部分,且位数相等,然后将这两部分相加,所得和的平方等于原来的N位数。
例如整数81分解成8和1两部分,并且(8+1)*(8+1)=81,所以81就是符合上面条件的一个整数
输入文件number.in,文件中只有一个N位整数。
输出文件number.out,文件只有一行,全部符合性质的数(由小到大输出),整数之间用空格隔开。
第2题:最大最小整数(文件名:2.aps 100分)
给出4个整数(>=0),编程输出由这4个数组成的最大整数(max)和最小整数(min)。
例如:
输入文件inp.in:4个整数,用空格分隔;
输出文件oup.out:两个整数,第一个是最大整数,第2个是最小整数,用空格隔开;
输入样例:12 30 8 121
输出样例:83012121 12112308
第3题:求最大质数子串(100分)
一个整数的整数子串是由该整数的连续数位的数字构成。
例如6158的子串包括:6、1、5、8、61、15、58、615、158、6158
任务:找出最大的质数子串。
输入文件prime.in:一个正数N,N<=109;
输出文件prime.out:N的最长质数子串,若所有子串都是非质数,则输出”NO”。
例如:输入样例1:2319
输出样例1:31
输入样例2:6804
输出样例2:NO
第4题:计算器改良(100分)
NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能。实验室将这个任务交给了一个刚进入的新手ZL先生。为了很好的完成这个任务,ZL先生首先研究了一些一元一次方程的实例:
4+3x=8
6a-5+1=2-2a
-5+12y=0
ZL先生被主管告之,在计算器上键入的一个一元一次方程中,只包含整数、小写字母及+、-、=这三个数学符号(当然,符号“─”既可作减号,也可作负号)。方程中并没有括号,也没有除号,方程中的字母表示未知数。
问题求解 :编写程序,解输入的一元一次方程, 将解方程的结果(精确至小数点后三位)输出。
你可假设对键入的方程的正确性的判断是由另一个程序员在做,或者说可认为键入的一元一次方程均为合法的,且有唯一实数解。
输入文件:computer.in:一个字符串,表示一个一元一次方程(一定有解,不须判错);
输出文件:computer.out:一个保留三位小数的实数,表示方程的解。
输入样例:6a-5+1=2-2a
输出样例:a=0.750