第四讲数组及其应用【引例1:】从键盘上输入n个数,输出他们的最大数,最小数,平均数。输入:第一行:n(100).第二行:n个正整数([1,1000]),中间一个空格隔开。输出:第一行:最大数。第二行:最小数。第三行:n个数的平均值(小数点后保留2位小数)。样例:输入:41042030输出:30416.00【引例2:】输入全校学生的期中考试总分,按照成绩从高分到低分输出。学校人数不超过1800人。如:输入:5600580620610635输出:635620610600580一、数组一)一维数组1.数组的定义用来描述由固定数目的同一类型的元素组成的数据结构。一维数组类型的定义一维数组类型的一般格式:array[下标1..下标2]of基类型;全校1800名学生:如:vara:array[1..1800]ofinteger;1)、a是数组名,代表的并不是一个变量,而是一批变量:a[1],a[2],a[3]……a[1800]共1800个变量。2)、array、of是定义数组的保留字;3)、[1..1800]是数据编号的下限和上限,说明了数据的个数(上限-下限+1);4)、最后一个是数据的基类型:每个数据元素的数据类型。2、数组元素的使用:数组的每个元素和普通的变量完全一样,可以赋值、输入、输出等操作。如:vara:array[1..1800]ofinteger;读入1800个学生的语文成绩:read(a[1]);a[1]:=90;a[i+j]:=120;数组元素的输入与输出通常用for循环完成:Fori:=1to1800doread(a[i]);//读入Fori:=1to1800dowrite(a[i]);//输出1、(练习数组的输入与输出基本操作)从键盘上顺序输入n(N100)的数,按输入顺序和反序输出。输入:520104526输出:2010452626541020varn,i:integer;a:array[1..100]ofinteger;beginreadln(n);fori:=1tondoread(a[i]);fori:=1tondowrite(a[i],’‘);fori:=ndownto1dowrite(a[i],’‘);end.二)数组的应用2、编程将一个十进制整数k转化为二进制数(k1000000)。样例:输入:19输出:10011进制基数R基本符号二进制20,1八进制80,1,2,3,4,5,6,7十进制100,1,2,3,4,5,6,7,8,9十六进制160,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F四种进制:各种进制之间的转换(整数部分):1、十转换为二、八、十六进制:方法:除R取余法2、二、八、十六进制转换为十进制:按权展开即可3、二、八、十六进制之间的相互转换:间接法和直接法vark,n,i:longint;a:array[1..20]ofinteger;beginreadln(k);n:=0;whilek0dobeginn:=n+1;a[n]:=kmod2;k:=kdiv2;end;fori:=ndownto1dowrite(a[i]);end.3、编程将一个十进制整数k转化为十六进制数(k1000000)。样例:输入:200输出:C8vark,n,m,i:longint;a:array[1..20]ofbyte;beginreadln(k);m:=0;whilek0dobeginm:=m+1;a[m]:=kmod16;k:=kdiv16;end;fori:=mdownto1dobeginifa[i]=9thenwrite(a[i]);end;end.ifa[i]=10thenwrite('A');ifa[i]=11thenwrite('B');ifa[i]=12thenwrite('C');ifa[i]=13thenwrite('D');ifa[i]=14thenwrite('E');ifa[i]=15thenwrite('F');casea[i]of10:write('A');11:write('B');12:write('C');13:write('D');14:write('E');15:write('F');end;方法一vark,n,i:longint;a:array[1..20]ofbyte;beginreadln(k);n:=0;whilek0dobeginn:=n+1;a[n]:=kmod16;k:=kdiv16;end;fori:=ndownto1doifa[i]=9thenwrite(a[i])elsewrite(chr(a[i]+55));end.方法二constb:array[1..6]ofchar=('A','B','C','D','E','F');vark,n,i:longint;a:array[1..20]ofbyte;beginreadln(k);n:=0;whilek0dobeginn:=n+1;a[n]:=kmod16;k:=kdiv16;end;fori:=ndownto1doifa[i]=9thenwrite(a[i])elsewrite(b[a[i]-9]);end.方法三4、砝码称重1克、2克、50克的砝码各10个,问用这些砝码一共能称出多少种重量。输出种数以及每种重量。constmax=530;vara:array[0..max]ofinteger;i,j,k,s:integer;beginfori:=0tomaxdoa[i]:=0;fori:=0to10doforj:=0to10dofork:=0to10doa[i+2*j+50*k]:=1;s:=0;fori:=1tomaxdos:=s+a[i];writeln(s);fori:=1tomaxdoifa[i]0thenwrite(i,'');end.5、用求n(N=10000000)以内的素数个数。样例3输入:10000000输出:664579样例1:输入:10000输出:1229样例2:输入:1000000输出:78498vars,k,n,i,f:longint;beginreadln(k);s:=0;forn:=2tokdobeginf:=0;fori:=2totrunc(sqrt(n))doifnmodi=0thenbeginf:=1;break;end;iff=0theninc(s);end;writeln(s);end.一般算法varn,i,j:longint;s:int64;a:array[1..10000000]of0..1;{0:不是,1:是}beginreadln(n);fori:=1tondoa[i]:=1;a[1]:=0;fori:=2totrunc(sqrt(n))doifa[i]=1thenbeginj:=2*i;whilej=ndobegina[j]:=0;j:=j+i;end;end;fori:=2tondos:=s+a[i];writeln(s);end.筛选法求素数6、输入全班学生的期中考试总分,按照成绩从高分到低分输出。如:输入:5600580620610635输出:635620610600580选择排序算法基本思想:对待排序的序列进行n-1遍处理:第1遍处理是从a[1],a[2],……a[n]中选择最小的放在a[1]位置;第2遍处理是从a[2],a[3],……a[n]中选择最小的放在a[2]位置;……第I遍处理是将a[i],a[i+1],……a[n]中最小的数与a[i]交换位置,这样经过第i遍处理后,a[i]是所有的中的第i小。即前i个数就已经排好序了。N-1遍处理后,剩下的最后一个一定是最大的,不需要再处理了。a:待排序的数组;//从小到大排序fori:=1ton-1do{从第一个元素开始,进行n-1遍处理}forj:=i+1tondo{第i遍处理}Ifa[i]a[j]then{交换a[i]和a[j]}begint:=a[i];a[i]:=a[j];a[j]:=t;end;constmaxn=100;vara:array[1..maxn]ofinteger;n,i,j,t:integer;beginreadln(n);fori:=1tondoread(a[i]);fori:=1ton-1doforj:=i+1tondoifa[i]a[j]thenbegint:=a[i];a[i]:=a[j];a[j]:=t;end;fori:=1ton-1dowrite(a[i],'');writeln(a[n]);end.二、多维数组及应用。当一维数组元素的类型也是一维数组时,便构成了二维数组。二维数组定义的一般格式:array[下界1..上界1,下界2..上界2]of元素类型;如:vara:array[1..5,1..4]ofinteger;则表示a是二维数组,共有5*4=20个元素,它们是:a[1,1]a[1,2]a[1,3]a[1,4]a[2,1]a[2,2]a[2,3]a[2,4]a[3,1]a[3,2]a[3,3]a[3,4]a[4,1]a[4,2]a[4,3]a[4,4]a[5,1]a[5,2]a[5,3]a[5,4]对二维数组的输入与输出也可用二重循环来实现:输入:fori:=1to5doforj:=1to4doread(a[i,j]);输出:fori:=1to5dobeginforj:=1to4dowrite(a[i,j],’‘);writeln;end;数组初始化为0;forI:=1tondoforj:=1tondoa[I,j]:=0;或者:fillchar(a,sizeof(a),0);1、输入班级中每个学生的数学、英语、物理成绩,求出每个人的总分、以及各科的平均分。输入:第一行:n(人数);以下n行:每行3个数分别代表数学、英语、物理成绩。输出:第一行:n个同学的总分。第二行:三科的平均分输入:5778899897897908070689578978779输出:26426424024126384.285.684.6vara:array[1..60,1..4]ofinteger;n,i,j:integer;beginreadln(n);fori:=1tondoforj:=1to3doread(a[i,j]);fori:=1tondoforj:=1to3doa[i,4]:=a[i,4]+a[i,j];fori:=1tondoforj:=1to3doa[n+1,j]:=a[n+1,j]+a[i,j];fori:=1tondowrite(a[i,4],'');writeln;fori:=1to3dowriteln(a[n+1,i]/n:0:1);end.2、输出杨辉三角输出杨辉三角的前N行(N=10)。样例:输入:4输出:111121133114641vara:array[1..100,1..100]ofint64;n,i,j:integer;beginreadln(n);fillchar(a,sizeof(a),0);{数组初始为0}fori:=1tondoforj:=1toidoa[i,j]:=1;{下三角形改为1}fori:=3tondoforj:=2toi-1doa[i,j]:=a[i-1,j-1]+a[i-1,j];{自上而下递推求值}fori:=1tondo{输出三角形}beginforj:=1toidowrite(a[i,j],'');writeln;end;end.