当前位置:首页 >> 学科竞赛 >>

数组pascal


数据类型:
简单类型
自定义类型 构造类型

整型、实型、字符型、布尔型
枚举类型、子界类型 数组类型、集合类型、文件类型

子界类型定义
定义的一般格式为: type <子界类型标识符>=<常量1>..<常量2>
type agetype=1..150

; chtype='a'..'z';

子界类型简单应用
type agetype=1..150; chtype='a'..'z'; var a1,a2:agetype; ch:chtype; {定义了a1、a2为子界类型agetype的两个变量,ch为子界类 型chtype的变量。} 也可将类型定义与变量定义合并起来在变量说明中进行定义: var a1,a2:1..150; ch:'a'..'z';

判断下列类型定义哪些是正确的,哪些是错误的。 (1)type atype=10..10*10; (2)type atype=1.2..2.0; (3)type atype=a..z; (4)type atype='1'..'5'; (5)type atype='k'..'e';

引例:
输入50名学生某门课程的成绩,要求把高于 平均分的那些成绩打印出来.
同一类型的变量,用同一个名字代表,比如: A[1],A[2],A[3],..,A[50],由此组成了A的数组,括号 里的数字称为A数组的下标,每个下标变量称为数组元 素 数组A
86 79 92 …… 67

A[1]

A[2]

A[3]

A[50]

一维数组的定义
TYPE 数组类型名=ARRAY[下标类型] OF 数组元素类型 例如: TYPE scoretype = array[1..50] of integer; VAR score : scoretype; 直接在VAR区中定义数组,形式如下: VAR 数组名: ARRAY [下标类型] OF 数组元素类型; 例如: VAR score: array [1..50] of integer;

一维数组的定义
a1 a2 ……

在内存中开辟一片连续的 存储空间,存放一批具有 相同类型的数据元素。

ai
ai+1 ……

an

数组的基本操作
?数组元素的输入、输出

例1:按照顺序读入十个数,然后以逆序方式输出。
Program ex3_1; const n=10; var a:array[1..n] of integer; {读入} i,m:integer; {输出} begin for i:=1 to n do read(a[i]); readln; for i:=n downto 1 do write(a[i],‘ ‘);writeln; end.

数组的基本操作
思考:将上题A数组中的各元素的值按逆序重新放置
再输出,如何操作?
数1 数2 数3 数4 数5 数6 数7 数8 数9 数10

A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10]

数1

数2

数3

数4 数5

数6

数7

数8

数9

数10

A[10] A[9] A[8] A[7] A[6] A[5]

A[4] A[3] A[2] A[1]

可以先开一个B数组,将A数组各元素的值按逆序 赋值B数组元素,再将B数组各元素的值按顺序回到A 数组相应元素中。

程序如下:
Program ex3_2_1; const n=10; var a:array[1..n] of integer; i,m:integer; begin for i:=1 to n do read(a[i]); readln; {读入} for i:=1 to n do b[i]:=a[n-i+1 ]; for i:=1 to n do a[i]:=b[i]; for i:=1 to n do write(a[i],’ ‘);writeln; end.

若不允许重新开数 组呢? 试比较两种方法的 优缺点?

时间 空间

var a:array[1..n] of integer; i,m,t:integer; begin for i:=1 to n do read(a[i]); readln; for i:=1 i:=1 to to (n (n div div 2) 2) do do for begin t:=a[i]; t:=a[i];a[i]:=a[n-i+1] a[i]:=a[n-i+1] a[n-i+1]:=t; a[n-i+1]:=t; end; end; for i:=1 to n do write(a[i],’ ‘);writeln; end.

数组的基本操作
字符统计 例2:输入一串小写字母(以?.”为结束标 志),统计出每个字母在该字符串中出现 的次数(若某字母不出现,则不要输出)。 例: 输入:aaaabbbccc. 输出: a:4 b:3 c:3

程序:
var a:array['a'..'z']of integer; i,ch:char; begin for i:='a' to 'z' do a[i]:=0; repeat read(ch); a[ch]:=a[ch]+1; until ch='.'; for i:='a' to 'z' do if a[i]<>0 then writeln(i,':',a[i]); end.

思考:
输入一串字母(以“.”为结束标 志),统计出每个字母在该字符串中出 现的次数(若某字母不出现,则不要输 出)。大小写字母算同一个。 例: 输入:aaAAbbbCcc. 输出: A:4 B:3 C:3

数组的基本操作
?数组元素的查找

顺序查找法
从头开始,根据给定的值,依次与数组中元素 进行比较,相同即为找到,若查遍整个数组仍然 没有,则表示该元素不存在。

For i:=1 to n do if x=a[i] then writeln(‘yes!’) else writeln(‘no’)

p:=1;t:=N,f:=false; 1、顺序查找法 repeat i:=(p+t) div 2; 从头开始,根据给定的值,依次与数组中 if x=a[i] then f:=true 元素进行比较,相同即为找到,若查遍整个数 else 组仍然没有,则表示该元素不存在。 if x<a[i] then t:=i-1; else p:=i+1; For i:=1 to n do until (t<p) or (f=true); If not‘yes! f then ‘no’) ‘no’) if x=a[i] then writeln( ’) writeln( else writeln( else writeln(‘yes’) 2、折半查找法

数组元素的查找

利用三个变量分别指向头、尾和中间元素, 每次都与中间元素比较,若相同,则找到,否 则,调整头或尾指针,重新折半。

数组的基本操作
?数组元素的移动 t:=a[1]; 6 7 8 9 for i:=1 to n-1 do 1 第一步: 取出A[1]中的数 A[i]:=a[i+1]; a[n]:=t; 2 3 4 5 6 7 8 9
1 2 3 4 5 10

A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10] 程序段: (移动一个 )

10

第二步: 后面所有元素向前移动
2 3 4 5 6 7 8

1
9 10

第三步: 将A[1]的值放到A[10]处
2 3 4 5 6 7 8 9 10
1

?数组元素的插入
program ex3_2_3(input,output); const n=10; var a:array[1..n+1] of integer; i,m,x,p:integer; begin for i:=1 to n do read(a[i]); readln; write('x='); readln(x); write('p='); readln(p); for i:=n downto p do a[i+1]:=a[i]; a[p]:=x; for i:=1 to n+1 do write(a[i]:4); writeln; end.

?数组元素的删除
program ex1_2_4(input,output); const n=10; var a:array[1..n+1] of integer; i,m,x,p:integer; begin for i:=1 to n do read(a[i]);readln; write('p=');readln(p); for i:=p to n-1 do a[i]:=a[i+1]; for i:=1 to n-1 do write(a[i]:4); writeln; end.

(1)遵循?先定义,后使用?的原则,分清类型和变量。 数组命名与简单变量的要求相同。 (2)下标可以由常量、简单变量、表达式或下标变量等 构成。下标表达式值的类型与数组类型定义中下标 类型一致,且不许超越所定义的下标下界和上界。 a:array[‘a’..‘z’]of integer; 如: (3)数组存储位置是连续的,可通过下标随机存取其元 var a,b,c:array[1..100] of integer; 素,运算与其类型相适应。 begin (4) 如果两个数组类型一致 ,它们之间可以整个数组元 c:=a;a:=b;b:=c; 素进行传送。 end.

二维数组与线性表
二维数组的一个形象比喻——多个纵队形 成的方块 m * n a11 a21 … a12 a22 … a13 a23 … a14 a24 … … … … a1n a2n … am
n

按行优先顺序存储
a11 a12 … a1n a21 …

am1 am2 am3 am4 …

aij
… amn

二维数组元素有两个下标,第一个下标 表示该元素在第几行,第二个下标表示 在第几列 。

数组地址计算问题
题目描述:已知n*(n+1) / 2个数据构成的三角数阵, 按行的顺序存入数组b[1],b[2],…中。其中第一个 下标表示行,第二个下标表示列。若aij (i>=j ,j=1,2,…,,n)存于b[k]中,问:k,i,j之间的关 系如何表示?
a11 a21 a31 … an1 a22 a32 … an2 a33 … an3 … an4 … … ann

k=i*(i-1)/2+j

一个数组在内存中对应着一块连续的存储空 间,我们借用数组开辟存储空间,每个元素在 存储器中占用的空间大小相同。若第一个元素

k1存放的位置是LOC(k1),每个元素占用的空间
大小为s,则元素ki的存放位置为: LOC(ki)=LOC(k1)+s*(i-1)

(1)设数组A[10..100,20..100]以行优先的方 式顺序存储,每个元素占4个字节,且已知A[10,20] 的地址为1000,则A[50,90]的地址是__________。 A[i,j]的起始地址计算公式:
1000+[(i-10)*(100-20+1)*+(j-20)] *4 (2)已知数组A中,每个元素A[I,j]在存储时要 占3个字节,设i从1变化到8,j从1变化到10,分 配内存时是从地址sa开始连续按行存储分配的。 试问:A[5,8]的起始地址为__________。

? 二维数组元素的输入、输出 例5:输入5名学生5门功课的考试成绩,输出各人的各科 成绩及总分。 分析:通过二重循环实现对二维数组各元素的赋值和输出。
program ex1_2_6(input,output); const n=50; type atype=array[1..50,1..6] of real; var a:atype;i,j:integer; begin write('input score:'); for i:=1 to n do begin writeln('No. ',i); for j:=1 to 5 do read(a[i,j]); readln; end;

for i:=1 to n do begin a[i,6]:=0; for j:=1 to 5 do a[i,6]:=a[i,6]+a[i,j]; end; writeln('No.':4,'yw':4,'sx':4,'wl':4,'hx':4,'yy':4,'zf':4); for i:=1 to n do begin write(i:4); for j:=1 to 5 do write(a[i,j]:4); writeln; end;

例6:鞍点 求一个5× 5数阵中的马鞍数,输出它的位置。所 谓马鞍数,是指在行上最小而在列上最大的数。 如下: 5 6 7 8 9 4 5 6 7 8 3 4 5 2 1 2 3 4 9 0 1 2 5 4 8 则1行1列上的数就是马鞍数。

鞍点程序:
program ex1_2_10; type atype=array[1..5,1..5] of integer; var a:atype; i,j,min,minj:integer; flag:boolean; begin for i:=1 to 5 do for j:=1 to 5 do read(a[i,j]);

for i:=1 to 5 do begin min:=a[i,1]; minj:=1; for j:=2 to 5 do if a[i,j]<min then begin min:=a[i,j];minj:=j;end; flag:=true; for j:=1 to 5 do if a[i,minj]<a[j,minj] then flag:=false; if flag then write('a[',i,',',minj,']=',a[i,minj]); end; end.

3、求二维数组中最大元素值及其行列号。 4、从键盘上输入9个数,保存在二维数组中,按数组原来位置输出第 一行和第一列的所有元素。

经典方阵
1.拐角方阵 2.回形方阵 3.螺旋方阵

经典方阵
1.对于键入的n(1≤n≤20),显示一个n行n列 的拐角矩阵。下面给出的是n=7时的拐角矩阵。
1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 2 3 3 3 3 3 1 2 3 4 4 4 4 1 2 3 4 5 5 5 1 2 3 4 5 6 6 1 2 3 4 5 6 7 分析:找出位置和其值的对 应关系 。 i i<=j i>j

A[i,j]=
j

program jz1; var n,i,j,k:integer; begin readln(n); for i:=1 to n do begin for j:=1 to n do begin if i>=j then k:=j else k:=i; write(k:4) end; writeln; end end.

想一想:
找出位置和其值的对应关系 。 5 4 3 2 1 4 4 3 2 1 3 3 3 2 1 2 2 2 2 1 1 1 1 1 1
1 2 3 4 5 1 2 3 4 4 1 2 3 3 3 1 2 2 2 2 1 1 1 1 1 1 1 1 1 1 2 2 2 2 1 3 3 3 2 1 4 4 3 2 1 5 4 3 2 1

n+1-j i≤j a(i,j)= n+1-i i>j

i a(i,j)= j

j≤n-i j>n-i

j j≤n-i a(i,j)= i j>n-i

回形方阵
任给n,试输出如下方阵,例如: N=7 1 1 1 1 1 1 1 1 2 2 2 2 2 1 1 2 3 3 3 2 1 1 2 3 4 3 2 1 1 2 3 3 3 2 1 1 2 2 2 2 2 1 1 1 1 1 1 1 1

有两条对角线,虚对角线上的 元素位置的共同点是i=n+1-j, 即:i+j=n+1。其上、下半部分 别满足i+j<n+1和 i+j>n+1。 观察虚对角线的上、下部,得出:
i j a(i,j)= n+1-j n+1-i i+j≤n+1且i≤j i+j≤n+1且i>j i+j>n+1且i≤j i+j>n+1且i>j

任给n,试输出如下方阵,例如: N=7 1 1 1 1 1 1 1 1 2 2 2 2 2 1 1 2 3 3 3 2 1 1 2 3 4 3 2 1 1 2 3 3 3 2 1 1 2 2 2 2 2 1 1 1 1 1 1 1 1

将回形方阵看成由若干圈构成, 最外圈全是1,次外圈都是2。 只要我们找出任意一点(i,j)所 在圈的圈号就好了。如:下图 上的点(4,3)到四边的距离分别 是i=4,n+1-j=7,n+1-i=6, j=3,那 么它所在圈号就是4个距离中 的最短者,即3。由此:

a(i,j)=min(i,n+1-j,n+1-i,j)

1 1 1 1 1 1 1 1 2 2 2 2 2 1 1 2 3 3 3 2 1 1 2 3 4 3 2 1 1 2 3 3 3 2 1 1 2 2 2 2 2 1 1 1 1 1 1 1 1

法III:

a[i,1]=1

1

j<mi

a[i,j+1]=a[i,j]+ 0 mi<=j<ma -1 ma<=j mi=min(i,n+1-i),ma=max(i,n+1-i)

程序:
program ex1_2_2; var n,i,j,k,mi,ma:integer; begin readln(n); for i:=1 to n do begin if i>=n+1-i then ma:=i else ma:=n+1-i; mi:=n+1-ma; k:=1; for j:=1 to n do begin write(k:4); if j<mi then k:=k+1 else if j>=ma then k:=k-1; end; writeln end end.

螺旋方阵
任给n,试按如下方式对a[i,j]赋值,例如: N=3 N=7 7 8 1 19 20 21 22 23 24 6 9 2 18 37 38 39 40 25 5 4 3 17 36 47 48 41 26 16 35 46 49 42 27 15 34 45 44 43 28 14 33 32 31 30 29 13 12 11 10 9 8

1 2 3 4 5 6 7

算法分析:
算法设计:逐圈考虑,每圈四边,顺序为右上 ?右下, 右下?左下,左下?左上,左上?右上 第1圈的四边为: A[1,n]—>A[n-1,n] 第i圈的四边为: A[n,n]—>A[n,2] A[n,1]—>A[2,1] A[i,n+1-i]—>A[n-i,n+1-i] A[1,1]—>A[1,n-1] A[n+1-i,n+1-i]—>A[n+1-i,i+1] A[n+1-i,i]—>A[i+1,i]

A[i,i]—>A[i,n-i]

程序:
while (i<(n+1) div 2) do begin for j:=i to n+1-i do begin a[j,n+1-i]:=k;k:=k+1;end; for j:=n-i downto i do begin a[n+1-i,j]:=k; k:=k+1; end; for j:=n-i downto i do begin a[j,i]:=k; k:=k+1;end; for j:=i+1 to n-i do begin a[i,j]:=k; k:=k+1; end; i:=i+1; end; if i:=n+1-i then a[i,j]:=k;

字符与字符串

1、字符型(char) ? 字符型可以是字母、符号、数字(0~9) 等ASCII码的所有字符。将字符用单引号引起 来即成字符常数, 如’a’、’7’、’D’、’?’、’+’。
?

Var a:char; a:=‘b’;

a:=‘B’;
a:=‘2’;

2、函数:ord(x) chr(x)

字符的输入: 字符不需要用空格隔开,因 为空格也是字符。

练习

输入N个字符,判断是否是回 文,若是则输出“yes”,否则 输出‘no’。

2、字符串类型定义
?
? ? ?

?

<类型标识符>=string[长度]; 变量声明: Var s:string; s1:string[n] 其中n 是定义的字符串s1的长度,必须是0~255之 间的自然数,如果省略n则默认字符串长度为255,比如s。 当字符串长度超过255时,超出部分自动省略,为了解决这个 问题新增了字符串类型ansistring。 ansistring; 可存储2G的内容,可以认为没有长度限制。 Var St:ansistring; 意义:处理非数值数据

字符串的长 度可以省略, 最长不能超 过255

?

? ? ?

字符串的引用
?例如:

s:= 'lucky! ';
s 下标:

s的存储方式:

… l u c k y ! …

1 2 3 4 5 6 则访问s串中第二个字符’u’的方法为s[2],第5个字符’y’的 方法为s[5]。
Write( s[2],s[5],s[6]) 输出结果: uy!

字符串的操作
(1) +:连接运算符 ? 例如: ? ‘happy’+’dog’ =‘happydog’ ? ‘ free’+’pascal’=‘freepascal’
?

? ?

? ? ? ? ?

(2)=、<>、<、<=、>、>=:关系运算符 字符串大小比较的规则:按照ASCII码值从左到右逐 个比较,直到找到不相同字符为止,此时,ASCII码值大 的字符所在的串就大。(如果两个字符串的长度不等,且 直到较短串的最后一个字符两者都相同,则认为长串值 大。) ‘abc’ < ’dab’ ; ‘false’ < ‘true’ ‘hello’ < ‘hellobaby’ ‘5’ > ’26’ ‘abc’ = ‘abc’

例7. 输入两串字母,并按字典顺序将其输出。

var str1,str2:string; begin readln(str1); readln(str2); if str1<str2 then begin

writeln(str1); writeln(str2); end else begin writeln(str2); writeln(str1); end; end .

常用的字符串函数、过程与运算符
操作 length(s) 类型 函数 作用 求字符串s的长度 返回值 整型 s:=‘hello!'; l:=length(s); 例子 {l的值为6}

Copy(s,pos,n)
Pos(sub, S)

函数
函数

复制s中从pos开始的n位
求字符串sub在串s中的位 置 将两个字符串连接起来

字符串
整型

s:=‘happystar'; s1:=copy(s,3,5); {s1的值是‘ppyst'} S := 'Sunshine'; i :=Pos(‘h ', S); {i的值为5}

Concat(s1,…sn) 函数 +

s1:='1234'; s2:='5678'; s:=s1+s2; {'12345678' var s:string;k,code:integer; s:='1234'; val(s,k,code); write(k); {k=1234} i:=1234; str(i,s); write(s); {s='1234'}

val(s,k,code)

过程

将字符串s转为数值,存在 k中;code是错误代码 将数值i转为字符串s 在s中删除从第w位开始的 k个字符

str(i,s)

过程

Delete(s,w,k)

过程

s := 'Honest Abe Lincoln'; Delete(s,8,4); Writeln(s); { 'Honest Lincoln' } S := 'Honest Lincoln'; Insert('Abe ', S, 8); { 'Honest Abe Lincoln' }

Insert(s1, S, w)

过程

将s1插到s中第w位

S=‘student’

s1=‘stu’

s2=‘dent’

1) L=length(s)

{L的值是7}

2) Copy(s,w,k) :复制s中从第w开始长度为k的子串。
s4=copy(s,5,3) {s4的值是‘ent'} 3) Pos(c, S): 求字符(串)c在串s中的位置 k=pos(s2,s) {K的值是4} 4) concat(s1,……,sn)(相当于’+’) : {s5的值是‘student'} 将两个字符串连接起来 s5=s1+s2; 或 s5:=concat(s1,s2);

s=‘2007’

s1=‘324ab56’

5) val(s,k,code):将字符串s转为数值,存到变量k中; code是错误代码,转换成功值为0;否则返回出错位置。 val(s,k,c); 另一种转换方法: n:=length(s); k:=0; for i:=1 to n do k:=k*10+ord(s[i])-48; 过程:val(s,a,c)中,c只能是整型数,如果 转化成功:c=0。a可以是实数也可以是整数. Val(’12.6’,a,c);a:=12.6

S=‘student’

s1=‘stu’

s2=‘den’

s3=‘2007’

6) str(i,s) :将数值i转换为字符串s. i=2008 str(i,s); s=‘2008’ 7) delete(s,w,k) :在s中删除从第w位开始的连续k个字符 delete(s,4,3) {执行delete后,s的值是 ‘stut’} 8) Insert(s1, S, w) :将s1插到s中第w个位置。 insert(s3,s,5); {执行insert后,s的值是 ‘stud2007ent’}

字符串使用中的有关说明和注意事项:
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、从键盘只能接受254个字符;一般都是文件输入。 4、严格区分数字字符、数字字符串与数值的区别,但可以相互转化。 ‘4’<>4 ‘1326’<>1326 如:var a:char; i:integer; a:=‘4’;i:=ord(a)-48; writeln(i); {i=4}


相关文章:
pascal-一维数组
pascal-一维数组_IT/计算机_专业资料。pascal-一维数组第八课 一维数组 一、为什么要使用数组 例 1 输入 50 个学生的某门课程的成绩,打印出低于平均分的同学号数...
Pascal数组习题
Pascal数组习题_学科竞赛_高中教育_教育专区。适用于想要参加NOIP的中学阶段学生,NOIP,Pascal语言,数组练习 1. 2. 3. 4. 读入 10 个数,输出偶数项及它们的和,...
pascal习题(数组)
pascal数组习题 暂无评价 1页 1下载券 PASCAL习题 30页 免费 pascal数组 48页 1下载券 pascal数组 3页 2下载券 pascal习题 42页 2下载券 Pascal——数组1(第...
pascal 数组与字符串
pascal 数组与字符串_学科竞赛_高中教育_教育专区 暂无评价|0人阅读|0次下载|举报文档 pascal 数组与字符串_学科竞赛_高中教育_教育专区。第六章 数组与字符串 ...
pascal-多维数组
pascal-多维数组_IT/计算机_专业资料。pascal-多维数组第九课 多维数组 一、多维数组的定义 当一维数组元素的类型也是一维数组时, 便构成了二维数组。 二维数组定义...
pascal数组习题
pascal-多维数组 5页 免费 PASCAL习题 30页 免费 pascal 第4讲 数组及其应... 34页 免费 pascal习题 42页 2下载券p​a​s​c​a​l​数​组...
free pascal 数组必会的题目的解题思路
free pascal 数组必会的题目的解题思路_学科竞赛_初中教育_教育专区。数组必会的题目的解题思路 1、有一组数(设有 n 个) ,其排列顺序如下:3,6,11,45,23,...
pascal数组解决约瑟夫环问题
pascal数组解决约瑟夫环问题_电脑基础知识_IT/计算机_专业资料。pascal 数组解决约瑟夫环问题 数据结构: a:array[1..100] of integer; 保存约瑟夫环中所有人的编号...
Pascal入门简介:第四课 Pascal数组与字符串(5)
Pascal 入门简介:第四课 Pascal 数组与字符串(5) 入门简介: 数组与字符串( ) 要找的满足上述条件的位置,然后再从右到左找到第一个比该位置上的数字大的数字...
pascal 数组部分测试卷1
数组部分测试卷 1、当我们要输入 100 个数并按反序输出 Program test; Const n=100; Var x:array [1..100] of integer; Begin For i:=1 ( End. 2、...
更多相关标签:
pascal二维数组 | pascal数组赋值 | pascal数组定义 | pascal字符串数组 | pascal动态数组 | pascal常量数组 | 树状数组pascal | pascal数组初始化 |