文档库 最新最全的文档下载
当前位置:文档库 › 数组练习题

数组练习题

数组练习题

一、数组的输入输出

1、计算并输出s=错误!未找到引用源。,其中xi的值为1,3,5,7,……17,19,yi的为

21,22,23,……29,30。

2、总务室在商店购买了八种文具用品,其数量及单价如下表:编程计算各物品计价及总

计价。

3、读入10个数,输出偶数项及它们的和,输出奇数项及它们的平均数。

4、读入N个数,打印其中的最大数及其位置号。

5、用筛法求出100以内的全部素数,并按每行五个数显示。

解:⑴把2到100的自然数放入a[2]到a[100]中(所放入的数与下标号相同);

⑵在数组元素中,以下标为序,按顺序找到未曾找过的最小素数minp,和它的位

置p(即下标号);

⑶从p+1开始,把凡是能被minp整除的各元素值从a数组中划去(筛掉),也

就是给该元素值置0;

⑷让p=p+1,重复执行第②、③步骤,直到minp>Trunc(sqrt(N)) 为止;

⑸打印输出a数组中留下来、未被筛掉的各元素值,并按每行五个数显示。

Program Exam53;

const N=100;

Var a: array[1..n] of boolean; t,i,j: integer;

Begin

Fillchar(a,sizeof(a),true);

a[1] := False;

for i:=2 to Trunc(sqrt(N)) do

if a[I] then

for j := 2 to N div I do

a[I*j]:= False;

t:=0;

for i:=2 to N do

if a[i] then

Begin

write( i:5); inc(t);

if t mod 5=0 then writeln

end;

End.

二、数组元素的移动

1、将A数组中的第一个元素移到最后数组末尾,其余数据依次往前平移一个位置。

2、将a数组中的元素实现逆序交换

program exa2;

Const n=10;

var a:array[1..n] of integer;

i,temp:integer;

begin

writeln(‘read’,n,’datas’);

for i:=1 to n do read(a[i]);

for i:=1 to n div 2 do

begin

temp:=a[i] ;

a[i]:=a[n+1-i];

a[n+1-i]:=temp;

end;

for i:=1 to n do write(a[i],’‘);

3、有一组数(设有N个)其排列顺序如下:3,6,11,45,23,70,67,34,26,89,90,

15,56,50,20,10。编一程序交换这组数中任意指定的两段不重合数据

program a1;

const n=16;

const a:array[1..n] of integer =(3,6,11,45,23,70,67,26,89,90,15,56,50,20,10,34);

var i,k,b1,e1,b2,e2:integer;

var b:array[1..n] of integer;

begin

writeln('please read data:');

write('begin 1=');read(b1);

write('end 1=');read(e1);

write('begin 2=');read(b2);

write('end 2=');read(e2);

if b1

begin

i:=b1;b1:=b2;b2:=i;

i:=e1;e1:=e2;e2:=i;

end;

for i:=1 to b1-1 do b[i]:=a[i];

for k:=0 to e2 -b2 do b[b1+k]:=a[b2+k];

for k:=1 to b2 -e1-1 do b[b1+e2-b2+k]:=a[e1+k];

for k:=0 to e1-b1 do b[e2-e1+b1+k]:=a[b1+k];

for i:=e2+1 to n do b[i]:=a[i];

writeln('number:':7,'begin:':7,'end:':7);

for i:=1 to n do writeln(i:7,a[i]:7,b[i]:7);

end.

三、数组元素的查找、插入、删除

1、对于数组A,输入一个测试数据X,如果X存在于数组A,则把X元素删除,否则将X 插在相应的位置,要求数组仍然有序(假设数组递增)

Program exa3;

Const n=10;

Var a:array[1..n+1] of integer

x, i, j :integer;

Begin

writeln(‘ read array a:’);

for i:=1 to n do read(a[i]);

write(‘ x=’);

readln(x);

a[n+1]:=x;

i:=1;

while a[i]

if i=n+1 then write(‘Not found and no place to insert.’)

else if a[i] = x then

begin

writeln(‘Found and deleted.Result:’);

for j:=i to n-1 do a[j]:=a[j+1];

for j:=1 to n-1 do write(a[j]:3);

end

else

begin

writeln(‘Not found and insert. Result:’);

for j:=n downto i do a[j+1]:=a[j];

a[i]:=x;

for j:=1 to n+1 do write(a[j],3);

end;

readln;

end.

2、从键盘输入若干个数,将它们按从小到大的顺序输出。

3、给定一串整数数列,求出所有的递增和递减子序列的数目。如数列7,2,6,9,8,3,

5,2,1可分为(7,2),(2,6,9),(9,8,3),(3,5),(5,2,1)5个子序列,答案就是5,我们称2,9,3,5为转折元素。

program aaa;

const n=9;

var a:array[1..n] of integer;

i,dz,dj:integer;

begin

for i:=1 to n do read(a[i]);

dz:=0;dj:=0;

if a[2]>a[1] then dz:=1 else dj:=1;

for i:=2 to n-1 do

begin

if(a[i]-a[i-1])*(a[i+1]-a[i])<0 then

begin

if a[i+1]

if a[i+1]>a[i] then dz:=dz+1;

end;

end;

writeln('dz:',dz);

writeln('dj:',dj);

writeln('total:',dz+dj);

end.

4、已知数组A中含N个整型元素,求A中有多少个最大数?多少个次大数?……多少个

互不相同的数。编程实现之。

program aaa;

const n=10;

var a:array[1..n] of integer;

i,j,temp,l:integer;

begin

writeln(n,'data:');

randomize;

for i:=1 to n do a[i]:=random(n);

for i:=1 to n do write(a[i]:4);writeln;

for i:=1 to n-1 do

for j:=i+1 to n do

if a[i]

begin temp:=a[i];a[i]:=a[j];a[j]:=temp; end;//排序

i:=1;j:=1; //统计数据,j记录不同的数据的个数

temp:=a[i];{temp初值即为最大值}

l:=0;{l记录相同数据个数}

writeln('data number');

write(temp:4,':');

while i<=n do

begin

if a[i]=temp then

begin i:=i+1;l:=l+1;end

else

begin

temp:=a[i];

writeln(l);

write(temp:4,':');

inc(j);l:=0;

end;

end;

writeln(l);

writeln('total:',j);

end.

四、数组的应用

1、一个两位以上的自然数,如果左右数字对称,就称为回文数,编程找出所有不超过6位

数字的回文数,同时又是完全平方数的数。如121是回文数,又是11的平方,所以是完全平方数。

解:①不超过6位数的完全平方数用循环在10~999范围产生(for i:=10 to 999) ;

②将完全平方数(i*i)转成字串类型存入s中;

③逐个取s的左右字符,检查是否相同(对称),检查对数不超过总长度的一半;

④如果是回文数,就调用打印过程(Print)。

Program Exam55;

Var n, k, j ,t : integer;

s : string; {字符串类型 }

i: longint; {长整数类型 }

Procedure Print; {打印过程(无形参)} begin

write(s : 10); inc(t); {打印s, 用t 计数 }

if t mod 6=0 then writeln {打印6个换行 } end;

Begin

t:=0;

for i:=10 to 999 do

begin

str(i*i,s); {将完全平方数转换成字串 }

k:=length(s); {计算字串长度 }

n:=k div 2; {计算字串长度的一半 }

j:=1;

while j < = n do {取左右字符检查是否对称 }

if copy(s,j,1) < > copy(s,k+1-j,1) then j:=1000

else inc( j ) ; {若不对称让j=1000,退出循环 } if j <1000 then Print { j <1000即是回文数,调打印 } end;

writeln; writeln('Total=':8, t); {打印总个数 }

readln

End.

2、裴波那契数列:数列1、1、2、

3、5、8、13、21…称为裴波那契数列,它的特点是:数

列的第一项是1,第二项也是1,从第三项起,每项等于前两项之和。编程输入一个正整数N,求出数列的第N项是多少?(N不超过30)。

3、将一个十进制整数转化为二进制数

Var bin:array[1..50] of 0..1;

X:longint;

k,i:integer;

Begin

write(‘read decimal data x:’); read(x);

for i:=1 to 50 do bin[i]:=0; {将bin数组清0}

k:=1; {从第0位开始存储}

while x>0 do

begin

bin[k]:=x mod 2; x:=x div 2;

k:=k+1; {进位}

end;

write(‘Binar:’);

for i:=k-1 downto 1 do write(bin[i]:1); {第k位无效}

end.

4、如图所示,找出4个相邻的数,使其相加之和最大和最小的是哪4个数?并给出它们的起始位置。

分析:假设圆盘上20个数中5为第一个数,12为最后一个数,将这些数存放在数组a[0..19]中,由于起始位置的不同出现不同的情况:

0<=i<17, s=a[i]+a[i+1]+a[i+2]+a[i+3]

i=17, s=a[i]+a[i+1]+a[i+2]+a[0]

i=18, s=a[i]+a[i+1]+a[0]+a[1]

i=19, s=a[i]+a[0]+a[1]+a[2]

由此可以产生对i求s的通式:

s=a[i]+a[(i+1) mod 20]+a[(i+2) mod 20]+a[(i+3) mod 20](0≤i≤19)

Program exa4;

Var a:array[0..19] of integer;

S,max,min:integer;

Smax,smin:integer;

i:integer;

Begin

writeln(‘Please read 20 datas:’);

for i:=0 to 19 do read(a[i]);

max:=-maxint;min:=maxint;

for i:=0 to 19 do

begin

s=a[i]+a[(i+1) mod 20]+a[(i+2) mod 20]+a[(i+3) mod 20];

if s>max then begin max:=s; smax:=I; end;

if s

end;

write(‘max:’,a[smax]:2);

for i:=1 to 3 do write(‘+’,a[(smax+i) mod 20]:2);

write(‘=‘,max,‘start from’,smax+1);

write(‘min:’,a[smin]:2);

for i:=1 to 3 do write(‘+’,a[(smin+i) mod 20]:2);

write(‘=‘,min,‘start from’,smin+1);

End.

5、投票问题:竞选时,要求选民在A、B、C、D四个候选人中选择(人数不限),如果选择了ABCD以外的人员,则视为废票。统计时输入“#”结束,请按候选人得票数从大到小顺序输出候选人及得票情况。

分析:程序细化为:统计得票数、将票数从大到小排序、将候选人及其票数同时输出。Program xuanju;

Var score:array['A'..'D'] of integer;

name:array[1..4] of char;

i,j:integer;

s,ch:char;

Begin

for ch:='A' to 'D' do score[ch]:=0;

for i:=1 to 4 do name[i]:=chr(ord('A')+i-1);

writeln('Please read data'); read(s);

while s <> '#' do

begin

if s in ['A','B','C','D'] then score[s]:=score[s] +1;

read(s);

end;

for i:=1 to 3 do

for j:=i+1 to 4 do

if score[name[i]] < score[name[j]] then

begin ch:=name[i]; name[i]:=name[j]; name[j]:=ch; end;

writeln('Result:');

for i:=1 to 4 do writeln(name[i],':',score[name[i]]);

End.

6、将1-9这九个数分成3组(每个数字只能使用一次),分别组成3个三位数,且这三个三位数的值构成1:2:3的比例,试求出所有满足条件的三个三位数。

program a2;

var a:array[0..9] of integer;

i,g,s,b,k,t:integer;

begin

writeln('result');

for i:=100 to 333 do

begin

for k:=0 to 9 do a[k]:=0;

k:=i;

g:=k mod 10;

b:=k div 100;

s:=(k div 10) mod 10;

a[g]:=1;a[s]:=1;a[b]:=1;

k:=2*i;

g:=k mod 10;b:=k div 100;s:=(k div 10) mod 10;

a[g]:=1;a[s]:=1;a[b]:=1;

k:=3*i;

g:=k mod 10;b:=k div 100;s:=(k div 10) mod 10;

a[g]:=1;a[s]:=1;a[b]:=1;

t:=0;

for k:=1 to 9 do

t:=t+a[k];

if t=9 then writeln(i:4,i*2:4,i*3:4);

end;

end.

相关文档