高中信息技术竞赛班第二阶段培训第五课数组应用及字符串教案.docx
- 文档编号:25666212
- 上传时间:2023-06-11
- 格式:DOCX
- 页数:19
- 大小:28.78KB
高中信息技术竞赛班第二阶段培训第五课数组应用及字符串教案.docx
《高中信息技术竞赛班第二阶段培训第五课数组应用及字符串教案.docx》由会员分享,可在线阅读,更多相关《高中信息技术竞赛班第二阶段培训第五课数组应用及字符串教案.docx(19页珍藏版)》请在冰豆网上搜索。
高中信息技术竞赛班第二阶段培训第五课数组应用及字符串教案
§5数组
【引例】输入20个数,将它们按从大到小的次序排序后输出。
讨论:
如果按我们前面学的知识,我们应设20个变量来存储这20个数,如果要排序的数不是20个,而是100个,那我们就应设100个变量?
没这么笨吧,我们有更好的办法解决。
§5.1一维数组
数组是由固定数量的相同类型的元素按一定顺序排列而成。
只有一个下标类型的数组称为一维数组。
1.数组类型定义和说明
类型定义的一般形式为:
TYPE<类型标识符>=ARRAY[下标类型]OF<基类型>;
数组说明:
VAR<数组名>:
<数组类型标识符>;
数组名是由用户定义的标识符,下标类型可以是子界类型或枚举类型,下标规定了数组元素的个数和排列次序。
基类型表示数组中每个元素的类型,它可以是任何数据类型,但同一数组中的元素类型必须相同。
如:
type
A=array[1..20]ofinteger;
B=array[0..50]ofchar;
Var
x,y:
A;
a:
B;
其中x、y被说明为A类型数据,即均为拥有20个元素的数组,下标从1到20,元素类型为整型;a被说明为B类型数据,即拥有51个元素的数组,下标从0到50,元素类型为字符型。
★数组也可以直接在说明部分说明数组的类型,如:
varx,y:
array[1..20]ofinteger;
a:
array[0..50]ofchar;
0
1
2
3
4
5
6
7
……
50
数组中的每个元素都是变量,每个元素在数组中有固定的位置,可以用数组名及方括号括起的下标来表示。
如a数组中的第5个元素可表示为:
a[4]
数组元素的运算和变量相同,如:
readln(a[4]);x[3]:
=x[3]+y[1];
2.数组元素的赋值和引用
如为一个数组A[1..10]赋值,可用下列语句实现:
fori:
=1to10doread(A[i]);
如果两个数组类型相同,如数组x和y,可用赋值语句:
x:
=y;
把y的10个元素值赋给x的相应元素,它等效于:
fori:
=1to20dox[i]:
=y[i];
但要给数组元素赋同一个值,不能这样赋值:
x:
=0;
而应该用如下语句:
fori:
=1to20dox[i]:
=0;
【例1】求100以内的所有素数。
筛法:
主要用于求一个区间上的质数表
•去掉1
•从2开始,把凡是2的倍数的数去掉(2保留)
•从下一个未被去掉的数k开始,把凡是k的倍数的数去掉(k保留)
•依此类推,直至
筛选过程:
(a)234567891011121314151617181920212223……9899100
(b)234567891011121314151617181920212223……9899100
(c)234567891011121314151617181920212223……9899100
…………
算法分析:
(1)设布尔类型数组A[2..100]
以下标2~100代表整数2~100;数组元素的布尔值代表其是否为素数;
设A[i]=true则i为素数,A[i]=false则i为合数;
A中元素初始均赋为true;
(2)从数组中新找一个素数P;
(3)从P+1开始,把凡是P的倍数的数筛去(赋为false);
(4)重复步骤2、3,直到P>
(5)打印数组中未被筛去的元素(元素值为true);
√
√
√
√
√
√
√
√
√…
√
2
3
4
5
6
7
8
9
……
100
√
√
X
√
X
√
X
√
……
X
2
3
4
5
6
7
8
9
……
100
参考程序:
programprime;
constn=100;
var
a:
array[2..n]ofboolean;
i,p:
integer;
begin
fori:
=2tondoa[i]:
=true;{a数组初始化,全部置true}
fori:
=2tondiv2do
ifa[i]thenbegin{a[i]相当于a[i]=true}
p:
=i*2;
whilep<=ndobegin{将a中i的倍数去掉}
a[p]:
=false;
p:
=p+i;
end;{while}
end;{then}
fori:
=2tondo{打印素数}
ifa[i]=truethenwrite(i:
4);
end.
【例2】输入n个数,将它们按从小到大排序后输出。
请先思考自己的算法,再看以下内容!
[方法一]选择排序
基本思想:
每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
排序过程:
在数组元素[1..n]中找出最小数,将数组第1位上的数与最小数交换;
在剩下的数中[2..n]中找出最小数,与第2位上的数交换;
依次类推,直到全部的数排完。
技巧:
寻找最小数——借助哨兵变量x,存放的不是最小数的值,而是最小数的位置(下标),扫描一趟后,最小数即S[x]。
交换数组元素S[i]和最小数——即交换S[i]和S[x]
例如:
初始状态[4938659776132749]
第一趟排序后13[38659776492749]
第二趟排序后1327[659776493849]
第三趟排序后132738[9776496549]
第四趟排序后13273849[49976576]
第五趟排序后1327384949[979776]
第六趟排序后132738494976[7697]
第七趟排序后13273849497676[97]
最后排序结果1327384949767697
参考程序:
programsort1;
vars:
array[1..1000]ofreal;
i,j,n,x:
integer;
temp:
real;
begin
readln(n);
fori:
=1tondoread(s[i]);{输入n个数}
fori:
=1ton-1dobegin
x:
=i;
forj:
=i+1tondo{在s[i+1]至s[n]中寻找最小值}
ifs[j]
=j;
ifx<>ithenbegin{交换s[i]和s[x]}
temp:
=s[i];s[i]:
=s[x];s[x]:
=temp;
end;
end;
fori:
=1tondowrite(s[i]:
5);
end.
[方法二]冒泡排序
基本思想:
两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据元素为止。
算法设计:
设想被排序的数组R[1..n]垂直竖立,将每个数据元素看作有重量的气泡,根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R,凡扫描到违反本原则的轻气泡,就使其向上"漂浮",如此反复进行,直至最后任何两个气泡都是轻者在上,重者在下为止。
排序过程:
首先,从底部R[n]和R[n-1]开始比较,小数上浮(R[n-1]),大数下沉(R[n]);然后比较R[n-1]和R[n-2],小数上浮……直到比较R[2]和R[1],小数上浮,此时第一趟结束,R[1]中的数必是最小数。
第二趟仍从底部R[n]和R[n-1]开始比较,直到比较R[3]和R[2],小数上浮,结束时R[2]中的数为次小数(本趟中的最小数);
重复以上过程,直到将所有数排完。
例如:
4913131313131313(R[1])
3849272727272727(R[2])
6538493838383838(R[3])
9765384949494949(R[4])
7697654949494949(R[5])
1376976565656565(R[6])
2727769776767676(R[7])
4949497697979797(R[8])
参考程序:
programsort2;
varR:
array[1..1000]ofreal;
i,j,n:
integer;
temp:
real;
begin
readln(n);
fori:
=1tondoread(R[i]);{输入n个数}
fori:
=1ton-1do
forj:
=n-1downto1do
ifs[j+1]
temp:
=s[j+1];s[j+1]:
=s[j];s[j]:
=temp;
end;
fori:
=1tondowrite(s[i]:
5);
end.
§5.2多维数组
1.二维数组
类型定义的一般形式为:
TYPE<类型标识符>=ARRAY[下标类型1,下标类型2]OF<基类型>;
数组说明:
VAR<数组名>:
<数组类型标识符>;
也可以直接在说明部分说明数组的类型,如:
VAR<数组名>:
ARRAY[下标类型1,下标类型2]OF<基类型>;
例如:
vara:
array[1..3,0..4]ofinteger;
a数组是一个二维数组,有两个下标,一维下标的值从1到3,二维下标从0到4,数组元素的类型为integer。
它共有15个元素,可以看成3×5的矩阵。
2.多维数组
如果下标个数有n个,则称为n维数组。
类型定义的一般形式为:
TYPE<类型标识符>=ARRAY[下标类型1,……,下标类型n]OF<基类型>;
数组说明:
VAR<数组名>:
<数组类型标识符>;
也可以直接在说明部分说明数组的类型,如:
VAR<数组名>:
ARRAY[下标类型1,……,下标类型n]OF<基类型>;
例如:
金山中学全体在校生的期末成绩可以用以下的多维数组来表示
S:
array[1..3,1..12,1..70,1..10]ofinteger;
其中第一维下标1..3表示3个年级,第二维下标1..12表示每年级12个班,第三维1..70表示各班同学的学号,第四维表示该同学各门课程的成绩。
【例3】求两矩阵的乘积
设矩阵A和B的形式如下:
计算矩阵A和B的乘积矩阵C:
根据矩阵相乘公式:
(详见《数学基础》矩阵)
参考程序:
programtimematrix;
constmaxnm=100;
var
i,j,k,n,m,s:
integer;
a,b,c:
array[1..maxnm,1..maxnm]ofinteger;
begin
write('n,s,m:
');readln(n,s,m);
writeln('A:
');
fori:
=1tondo
forj:
=1tosdoread(a[i,j]);
writeln('B:
');
fori:
=1tosdo
forj:
=1tomdoread(b[i,j]);
fori:
=1tondo
forj:
=1tomdobegin
c[i,j]:
=0;
fork:
=1tosdoc[i,j]:
=c[i,j]+a[i,k]*b[k,j];
end;
writeln('C:
');
fori:
=1tondobegin
forj:
=1tomdowrite(c[i,j]:
5);
writeln;
end;
end.
【例4】求奇数幻方
幻方是指n2个自然数排成n行n列的n阶方阵,且每行、每列和两条对角线上n个数之和都等于同一个数S。
8
1
6
3
5
7
4
9
2
S称为幻方和,S=n(n2+1)/2
奇数幻方的排列方法:
①首先确定1的位置——放在第一行的中间位置;
②然后在当前自然数的右上方放下一个自然数;
如果当前自然数在第一行,则下一个自然数放在最后一行;
如果当前自然数在最右侧,则下一个自然数放在最左侧;
如果准备放下一个数的格内已有数,则下一个自然数放在当前自然数的正下一格。
参考程序:
programjshf;
constmaxn=100;
var
s:
array[1..maxn,1..maxn]ofinteger;
n,i,j,ii,jj,k:
integer;
begin
readln(n);
fori:
=1tondo{s数组初始化}
forj:
=1tondos[i,j]:
=0;
i:
=1;
j:
=(ndiv2)+1;
fork:
=1ton*ndobegin
s[i,j]:
=k;
jj:
=j;ii:
=i;{备份i、j}
j:
=j+1;ifj>nthenj:
=1;
i:
=i-1;ifi<1theni:
=n;
ifs[i,j]>0thenbegin{若准备放下一个数的格内已有数}
j:
=jj;
i:
=ii+1;ifii>nthenii:
=1;
end;
end;
fori:
=1tondobegin{输出结果}
forj:
=1tondowrite(s[i,j]:
4);
writeln;
end;
end.
§5.3字符串
字符串类型,其一般形式:
TYPE<标识符>=STRING[N];
N必须是小于256的整数,表示字符串的最大长度,N缺省值为255。
例如:
varname1:
string[20];{字符串name1的最大长度为20}
ss:
string;{字符串ss的最大长度为255}
◆字符串的实际长度取决于程序执行时所赋予的实际字符个数,可以用函数Length(字符串名)取得,如:
t=length(ss);{t为整型变量,利用length函数取得字符串ss的实际长度}
◆字符串类型变量可以整体输入和输出,如:
read(ss);write(ss);
◆字符串可以进行连接,连接符为“+”,如:
‘good’+‘morning’=‘goodmorning’
◆字符串中的每一个字符可以对应字符数组中的一个元素,可以用字符串名加下标(类似数组)的方法来表示,如:
ss:
=‘computrr’;
ss[7]:
=‘e’;
writeln(ss);{将输出‘computer’}
字符串与字符数组的区别在于字符串最大长度只有255,而数组元素的个数可以超过255。
◆字符串可以进行六种关系运算:
=、<>、>=、<=、>、<。
当两个字符串进行比较时,是从左到右逐个字符按照它们的ASCII码值进行比较。
例如:
‘a’<‘b’为true
‘ABCD’<‘ABC’为false
◆Pascal提供了不少函数和过程用于字符串的操作,如:
copy(S:
string;i,L:
integer):
string;
返回字符串S中从第i个字符开始的L个字符所组成的字符串
concat(S1,S2,……,Sn:
string):
string;合并一系列字符串
Pos(P,S:
string):
byte;返回子字符串P在字符串S中的位置
delete(S:
string;I,L:
ineger);从字符串S中删除从第I个字符开始的L个字符
Insert(S:
string;D:
string;P:
integer);在字符串D的P位置插入字符串S
str(I:
integer/real;S:
string);整数/实数转字符串
val(S:
srting;R:
real;D:
integer);字符串转整数/实数
【例5】编写一个学生成绩统计的程序。
输入:
n个学生的姓名、成绩;
输出:
平均分,成绩低于平均分的学生的姓名。
参考程序:
programexam;
constmaxn=100;
var
name:
array[1..maxn]ofstring;{数组name用于存放学生姓名,数组元素为字符串}
score:
array[1..maxn]ofinteger;{数组score用于存放学生成绩}
n,i,sum:
integer;
ave:
real;
begin
readln(n);
sum:
=0;
fori:
=1tondobegin
readln(name[i]);{字符串、字符不能和整型数据共用一个read}
readln(score[i]);
sum:
=sum+score[i];
end;
ave:
=sum/n;
writeln(ave:
8:
1);
fori:
=1tondo
ifscore[i] end. 【例6】输入一个字符串(长度<255),判断是否是回文串(回文串是指从左到右和从右到左读字符串是一样的)。 参考程序: programhwc; vars: string; i,j,n: integer; t: boolean; begin readln(s); n: =length(s); t: =true; i: =1;j: =n; repeat ifs[i]<>s[j]thent: =false; i: =i+1;j: =j-1; until(i>=j)or(t=false); iftthenwriteln('Y') elsewriteln('N'); end. ●Pascal还允许在字符串中嵌入控制字符。 有两种表示控制字符的方法: ①在符号#后跟0…255之内的整数,表示与ASCII码相应的一个字符,如: #65表示字符‘A’ #50表示字符‘2’ #10表示换行 ②在符号^后跟一个字符,表示控制字符,如: ^G表示响铃 当它们与字符串常量混合在一起时,控制字符不能用单引号括起来,例如: writeln(‘waitingforinput! ’^G^G^G’please’#27‘u’); 输出: waitingforinput! please←u(同时响铃) §5.4类型强制转换 Pascal提供把变量类型强制转换的功能,即把一种变量作为另一种变量引用,其形式是在要转换的变量前冠以强制转换的类型标识符。 如: A(B)就是把变量B强制转换为A类型。 ◆字符型与整型可以相互转换 字符变量c转换为整型变量i,i的值为该字符对应的ASCII码值; 整型变量i转换为字符变量c,c为以i为ASCII码值所对应的字符。 ◆布尔型与整型可以相互转换 布尔变量转换为整型变量时,布尔值true对应1,false对应0; 整型变量转换为布尔变量时,整型值为0时对应false,不等于0时对应true。 ◆实型不能和其它类型相互转换,但整型变量可以直接赋给实型变量,如i为整型变量,r为实型变量,可以如下赋值: r: =i; ◆数组也可以使用类型强制转换,如数组B是一个二维整型数组,而类型A是一个一维整型数组类型,它们的定义如下: typeA=array[1..20]ofinteger; varB: array[1..2,1..10]ofinteger; 一般,数组B应采用B[i,j]的形式,但可以将B强制转换为A,就可以把它当一维数组使用,如A(B)[i]。 转换前后的两个数组的对应关系如下: B[1,1]B[1,2]……B[1,10]B[2,1]B[2,2]……B[2,10] ↕↕↕↕↕↕ A(B)[1]A(B)[2]……A(B)[10]A(B)[11]A(B)[12]……A(B)[20] 例如: program varc: char; b: boolean; i: integer; begin运行结果: c: =‘a’;writeln(‘c=’,c);c=a i: =integer(c);writeln(‘i=’,i);i=97 i: =i+3;writeln(‘i=’,i);i=100 c: =char(i);writeln(‘c=’,c);c=d b: =false;writeln(‘b=’,b);b=false i: =integer(b);writeln(‘i=’,i);i=0 i: =2;writeln(‘i=’,i);i=2 b: =boolean(i);writeln(‘b=’,b);b=true end. §5.5常见错误 数组使用最常出现的错误是数组元素下标超出数组定义时规定的界限。 由于默认状态下(即不在程序开头加{$R+}进行检查),运行时即使数组下标越界,系统将不出任何出错信息,依旧给数组赋值,因此常导致我们花很多时间去寻找程序中的错误。 Pascal提供了下标越界检查的功能,即在程序首部使用编译开关{$R+}(即option菜单中compile中的RangeChecking)通知系统运行时对下标越界进行检查。 但这种方法将占用运行时间,所以建议调试时加入{$R+},调试结束后撤销(缺省时为{$R-})。 练习五 1.随机产生50个数,求其中最大数和最小数。 2.输入n个整数(n不大于1000),将这n个整数按从大到小排序,然后输出排序结果。 采用选择排序算法。 3.采用冒泡排序算法完成上题。 4.有一组数,其排列形式如下: 11,19,9,12,5,20,1,18,4,16
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 高中 信息技术 竞赛 第二阶段 培训 第五 数组 应用 字符串 教案