一维数组
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
输入
for j:=1 to n-i do begin if a[j]>a[j+1] then begin t:=a[j];a[j]:=a[j+1];a[j+1]:=t; end; end; writeln(‘new square is :’); for i:=1 to n do begin write(a[i]:5); if i mod 5=0 then writeln end;
67 24 15 12 17 24 32 178
最多四次就能找到
尝试编程实现
145 45
89 167
235
211
269
•折半查找的算法: •设三个指示器,分别指向查找范围的顶 部、底部和中间位置。Top bot mid •如果X=a[mid] ,则设查到标志为true.输 入有关信息; •如果X>a[mid] ,则下一查找范围在top 与mid-1之间,更新bot 的值为mid-1; •如果X<a[mid] ,则下一查找范围在 mid+1与bot之间,更新top的值为mid+1; •重复该过程直到无法查找或找到该数。
一维数组应用示例
例2 输入50个数,要求程序按输入时的逆序 把这50个数打印出来。也就是说,请你按输 入相反顺序打印这50个数。
例3 任意输入10个整数,把第1,第10个 数相加,第2,第9个数相加,第3,第8 个数相加......然后把相加的式子 打印出来。 分析:这个问题照样可以用数组的方法 解决。从题意分析可知,被选中相加的两 变量的下标之和是11,所以可以设循环为1 到5,用11减去已知下标便是另一个下标了。
但这种厚义法是可以的: CONST X=10; VAR A:ARRAY[1..X] OF INTEGER; 因为 是先定义好了的常量,在下标中已不属于变量了。 正因为系统会预先ဆ配空铴绘数组,且这些空间不能被其它数据所占用, 所以不能乱讼下标变量中的下标。如果设得轇大,分酉滙数组的空闔乗越多,那 么留给系统运行的空间就少了,严重䗶有可能导致程序无法运行。
要想如数学中使用下标变量ai形式表示这50个 数,则可以引入下标变量a[i]。这样问题的程 序可写为: tot:=0;{tot表示总分} for i:=1 to 50 do {循环读入每一个学 生的成绩,并累加它到总分} begin read(a[i]); tot:=tot+a[i]; end; ave:=tot/50;{计算平均分} for i:=1 to 50 do if a[i]<ave then writeln('No.',i,' ',a[i]);{如果第i个同学成绩小于平均分,则将 输出}
输出数组过程
PROCEDURE writea; VAR i:INTEGER; BEGIN FOR i:=1 TO n DO WRITE(a[i],' '); WRITELN; END;
任意输入20个字符,然后把它们倒序输出。 例1: PROGRAM e1(input,output); TYPE ctype= array[1..20] of char; VAR c:ctype; i:integer; BEGIN for i:=1 to 20 do begin writeln('input char'); readln(c[i]); end; for i:=20 downto 1 do write(c[i],' '); END.
一维数组
1
为什么要使用数组
例1 输入50个学生的某门课程的成绩,打印出低 于平均分的同学号数与成绩。
分析:在解决这个问题时,虽然可以通过读入 一个数就累加一个数的办法来求学生的总分,进而 求出平均分。但因为只有读入最后一个学生的分数 以后才能求得平均分,且要打印出低于平均分的同 学,故必须把50个学生的成绩都保留下来, 然后 逐个和平均分比较,把高于平均分的成绩打印出来。 如果,用简单变量a1,a2,…,a50存放这些数据, 可想而知程序要很长且繁。
数 组 的 存 储 方 式 :
a[1]
Type color=(red,yellow,blue,white,black); rowtype=array [1..10] of real; inttype=array[‘A’.. ‘E’] of integer; colortype=array[color] of char; Var
选择排序法
折半查找
假设要从N个数中查找X是否存在,最原始的 办法是从头找到尾逐个查找,这种查找称为 顺序查找,它是无序数据查找的一种方法。 如当被查找的元素为15个时,循环的次数最 多为14次。 对一个已经排好序的数列,我们一般用折半 查找法。如下列15个数。
12 15 17 24 28 32 45 67 89 145 167 178 211 Fra Baidu bibliotek35 269
在定义数组的下标变量中,不能出现变量。如: VAR A:ARRAY[1..X] OF INTEGER; 这句定义便错了。因为在定义数组时,系统根据定 义数组的下标数据的最大值来给数组预分配空间。
比如定义:VAR A:ARRAY[1..10] OF INTEGER; 则系统会给数组预留10个存贮单元以 备用。即使用户用不完这些存贮空间,这些空间也 不能被其它数据所占用。所以在定义下标时,不能 有变量,否则系统不知道该分配多少存贮空间给数 组。
注意
类型和变量是两个不同概念,不能混淆。就 数组而言,程序的执行部分使用的不是数组 类型(标识符)而是数组变量(标识符)。 type rowtype=array[1..100] of real; var a,b:rowtype;
一般在定义数组类型标识符后定义相应的数组 变量
type arraytype=array[1..8]of integer; var a1,a2:arraytype; 其中arraytype为一个类型标识符,表示一个 下标值可以是1到 8,数组元素类型为整型的一维 数组;而a1,a2则是这种类型的数组变量。 也可以将其全并起来: var a1,a2:array[1..8]of integer; 当在说明部分定义了一个数组变量之 后,pascal 编译程序为所定义的数组在内存空间 开辟一串连续的存储单元。 见书P141页
一维数组
当数组中每个元素只带有一个下标时,我们 称这样的数组为一维数组。
一维数组类型的定义
一维数组类型的一般格式: array[下标1..下标2] of <基类型>; 说明:其中array和of是pascal保留字。下标1和下标2 是同一顺 序类型,且下标2的序号大于下标1的序号。它给出了数组中每个 元素(下标变量) 允许使用的下标类型,也决定了数组中元素的个 数。基类型是指数组元素的类型,它可以是任何类型(整型,实型, 布尔型,字符型,子界型,枚举型) ,同一个数组中的元素具有 相同类型。因此我们可以说,数组是由固定数量的相同类型的元 素组成的。 type rowtype=array[1..100] of real; var a,b:rowtype;
数组的输入输出
键盘输入数据存入数组过程 PROCEDURE reada; VAR i:INTEGER; BEGIN FOR i:= 1 TO n DO READ(a[i]); END;
随机产生n个数据存入数组过程
PROCEDURE randoma(max:integer;); VAR i:INTEGER; BEGIN RANDOMIZE; FOR i:= 1 TO n DO a[i]:=RANDOM(max); END;
一维数组类型常数定义
const Hex: array[0..15] of char =(‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’, ‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’)
const Hex: array[0..15] of char =(‘0123456789ABCDEF’)
冒泡排序法
5个数,把大的放到后面,升序排列,即从 小到大排序。 7 5 3 8 6 思路:从左到右,依次将相邻的数,两两 比较,若前一个数比后一个数大,则对调 两个数,否则不动
写出第一次比较的过程。 共需要4次
1、输入 2、排序 3、输出
Begin program exshuz1; Const n=5; writeln(‘input’,n, ‘integer number’); Type for i:=1 to n do arr=array[1..n] of integer; read(a[i]); Var readln; a:arr; for i:=1 to n-1 do i,j,t:integer;
PROGRAM e2(input,putput); VAR n:array[1..10] of integer; i:integer; BEGIN for i:=1 to 10 do begin writeln('input number'); read(n[i]); end; for i:=1 to 5 do writeln(n[i],'+',n[11-i],'=',n[i]+n[11-i]); END.
排序
输出
end.
例如:下面对5个进行排序,这个五个数分别为8 2 9 10 按选择排序方法,过程如下: 初始数据 :8 2 9 10 5
5。
第一次排序:2
8
9
10
5
第二次排序:2 5
9 10
8
第三次排序:2 5
8 10
9
选 择 排 序 法
第四次排序: 2
5 8 9 10
PROGRAM e4(input,output); VAR s:array[1..100] of integer; i,j,n,m:integer; P:integer; BEGIN writeln('input n'); readln(n); writeln('input number'); for i:=1 to n do read(s[i]); for i:=1 to n-1 do for i:=1 to n do begin for j:=i+1 to n do p:=i; if s[j]<s[i] then for j:=i+1 to n do begin if s[j]<s[p] then p:=j; m:=s[i]; m:=s[i]; s[i]:=s[j]; s[j]:=m; s[i]:=s[j]; end; s[j]:=m; end; for i:=1 to n do write(s[i],' '); END.
上面的定义相当于:Hex[1]:=’0’, Hex[2]:=’1’,……Hex[15]:=’F’.
一维数组的引用
当定义了一个数组,则数组中的各个元崠就共用一个数组名( 即该 数组变量名),它们之间是通过下标不同以示区别的。 对数组的操 作归根到底就是对数组元素的操佘。一维数组元素的引用格式为: 数组名[下标蠨达式] 说明:①七标表达式值的类型, 必须与数组类型定义中下标类 型完全一致,并且不允许超越所定义的下标下界和上界。 ②敠组是一个整体,数组名是一个整体的标识,要对 数组进行操作,必须对其元素操作。数组元素可以象同类型的䙮 通变量那样作用。如:a[3]:=34;是对数组a中第三个下标变量赋 以34的值。read(a[4]);是从键盘读入一个数到数组a第4个元素 中去。 for i:=1 to 20 do read(a[i]); for i:=1 to 20 do write(a[i]);
a:rowtype; b:inttype; c:colortype;
a[2] a[3 a[4 a[5] a[6] a[7] a[8] a[9] a[10]
b[‘A’]
b[‘B’]
b[‘C’]
b[‘D’]
b[‘E’]
c[red]
c[yello w]
c[blue]
c[white] c[black]
数组定义注意事项:
特殊地,如果两个数组类型一致,它们之间可以整个 数组元素进行传送。如: var a,b,c:array[1..100] of integer; begin c:=a;a:=b;b:=c; end. 在上程序中,a,b,c三个数组类型完全一致, 它们 之间可以实现整数组传送,例子中,先将a数组所 有元素的值依次传送给数组c,同样b数组传给a, 数组c又传送给b,上程序段实际上实现了a,b 两个 数组所有元素的交换。