pascal 习题 完善程序.docx
《pascal 习题 完善程序.docx》由会员分享,可在线阅读,更多相关《pascal 习题 完善程序.docx(30页珍藏版)》请在冰豆网上搜索。
pascal习题完善程序
第1题(14分)以下程序是将一组整数按从小到大的顺序排列。
排序的方法是将长度为n的数a分为两个长度分别为(ndiv2)与(n-ndiv2)的子数组a1,a2。
然后递归调用排序过程,将a1,a2分别排序,最后将a1,a2归并成数组a。
例如a=(3,1,2,4),那么a1=(3,1),a2=(2,4)。
调用排序过程将a1,a2排序,得到a1=(1,3),a2=(2,4),然后进行合并排序。
从键盘输入数的长度n以及n个整数,存在数组a中,调用子过程sort进行排序,最后输出排序结果。
programwsh;
constmaxn=100;.
typearr:
array[1..maxn]ofinteger;
var
a:
array[1..maxn]ofinteger;
n,i:
integer;
proceduresort(n:
integer;vara:
arr);
var
i,p1,p2,n1,n2:
integer;
a1,a2:
arr;
begin
ifn=1thenexit;
fillchar(a1,sizeof(a1),0);
fillchar(a2,sizeof(a2),0);
n1:
=0;n2:
=0;
n1:
=ndiv2;n2:
=(____
(1)____);
fori:
=1ton1doa1[i]:
=a[i];
fori:
=1ton2doa2[i]:
=____
(2)____;
____(3)____;
sort(n2,a2);
p1:
=1;p2:
=1;
n:
=0;
while(p1<=n1)and(____(4)____)do
begin
n:
=n+1;
if____(5)____
thenbegina[n]:
=a1[p1];inc(p1);end
elsebegin____(6)____;inc(p2);end;
end;
ifp1<=n1
thenfori:
=____(7)____ton1dobeginn:
=n+1;a[n]:
=a1[i]end
elsefori:
=p2ton2dobeginn:
=n+1;a[n]:
=a2[i];end;
end;
begin
write('n=');
readln(n);
fori:
=1tondoread(a[i]);
readln;
sort(n,a);
fori:
=1tondowrite(a[i],'');
writeln;
end.
答案:
n-n1
a[n1+i]
sort(n1,a1)
(p2<=n2)
a1[p1]a[n]:
=a2[p2]
p1
第2题(8分)有n(1≤n≤100)个同学种m(1≤n≤m≤100)种小树苗,例如:
4个同学(1、2、3、4)每小时种4种树苗(A、B、C、D)的数量估算如下表所示,编程输出每人种1种苗所用的总时间最少的安排方案和所花费的时间。
学生ABCD
15245
24353
35242
43233
programwsh;
const
maxn=100;maxm=100;
var
a:
array[1..maxn,1..maxm]ofinteger;
m,n:
integer;
i,j,t:
integer;
procedurework(k,t1:
integer);
vari:
integer;
begin
if____
(1)____then
begin
ift1=t;
exit;
end;
fori:
=___
(2)___to___(3)___do
work(k+1,___(4)___);
end;
begin
readln(n,m);
fori:
=1tondo
begin
forj:
=1tomdoread(a[i,j]);
readln
end;
t:
=maxint;
work(1,0);
writeln(t)
end.
答案:
k>n
1
m
t1+t[k,i]
第3题(10分)程序的任务是用0…9中的数字填入如下乘法运算的*处,数字可重复使用,且所用的数字至少有一个是素数,要求输出满足下列算式的方案数。
***
x**
----------------
***
***
----------------
***
programwsh;
constp:
setof0...9=[2,3,5,7];
var
s:
setof0..9;
n:
integer;
ans:
longint;
f:
text;
procedureinit;
var
i:
integer;
t:
byte;
begin
readln(n);
s:
=[];
fori:
=1tondo
begin
read(t);
s:
=s+[t];
end;
close(f);
end;
functionok(x,l:
integer):
boolean;{此函数判断x是否符合条件}
vart:
byte;
begin
ok:
=false;
if___
(1)___<>lthenexit;
whilex<>0do
begin
t:
=xmod10;
ifnot(tins)thenexit;
x:
=xdiv10;
end;
ok:
=true;
end;
functioninset(x:
integer):
boolean;{此函数判断x中是否包含素数字}
vart:
byte;
begin
inset:
=false;
while___
(2)___do
begin
t:
=xmod10;
iftinpthen
begin
inset:
=true;
exit;
end;
___(3)___;
end;
end;
procedurework;
vari,i1,i2,i3,j1,j2:
integer;
begin
ans:
=0;
fori1:
=1to9do
ifi1insthen
fori2:
=1to9do
ifi2insthen
fori3:
=1to9do
ifi3insthen
begin
___(4)___;
forj1:
=1to9do
if(j1ins)andok(j1*i,3)then
forj2:
=1to9do
if(j2ins)andok(j2*i,3)and___(5)___then
begin
if(i1inp)or(i2inp)or(i3inp)
or(j1inp)or(j2inp)orinset(j1*i)orinset(j2*i)
theninc(ans);
end;
end;
writeln(ans);
end;
begin
init;
work;
end.
答案:
trunc(ln(x)/ln(10))+1
x>0
x:
=xdiv10
i:
=i1*100+i2*10+i3
ok(j1*i*10+j2*i,4)
第4题(15分)下列程序是对冒泡排序的一种改进,数组elem中有n个元素elem[1]、elem[2]…、elem[n]。
要排序的关键字是key。
先从一端开始扫描,进行比较、交换,然后改变下一趟的扫描方向进行同样的处理。
请完善下面的过程。
programwsh;
type
Td=record
key:
integer;
inf:
real;
end;
var
elem:
array[1..1000]ofTd;
n,i:
integer;
procedureshakesort(n:
integer);
var
i,t,h:
integer;
c:
boolean;
temp:
Td;
begin
h:
=1;
t:
=n;
repeat
____
(1)____;
fori:
=htot-1do
ifelem[i].key>elem[i+1].keythenbegin
temp:
=elem[i];
elem[i]:
=elem[i+1];
elem[i+1]:
=temp;
____
(2)____;
end;
____(3)____;
fori:
=t-1downtohdo
ifelem[i].key>elem[i+1].keythenbegin
temp:
=elem[i];
elem[i]:
=elem[i+1];
elem[i+1]:
=temp;
____(4)____;
end;
____(5)____;
untilc;
end;
begin{主过程}
…{略}
end.
答案:
c:
=true
c:
=false
t:
=t-1
c:
=false
h:
=h+1
第5题(15分)读入一个10x10的数字矩阵,矩阵中的数字各不相同,输出这个矩阵经过旋转、翻转后的7种不同样式。
programwsh;
var
matrix:
array[0..7,1..10,1..10]ofinteger;
lr,lc,which:
integer;
procedureoverturn(which:
integer);
var
lr,lc:
integer;
begin
forlr:
=1to10do
forlc:
=1to10do
matrix[which,lr,lc]:
=matrix[which-1,___
(1)___,___
(2)___];
end;
procedurerotate(which:
integer);
var
lr,lc:
integer;
begin
forlr:
=1to10do
forlc:
=1to10do
matrix[which,lr,lc]:
=matrix[which-1,___(3)___,___(4)___];
end;
begin
forlr:
=1to10do
forlc:
=1to10do
read(matrix[0,lr,lc]);
readln;
forwhich:
=1to7do
begin
if___(5)___thenoverturn(which)
elserotate(which);
forlr:
=1to10do
begin
forlc:
=1to10do
write(matrix[which,lr,lc]:
3);
writeln;
end;
readln;
end;
end.
答案:
11-lr
lc
11-lc
lr
which=4
第6题(16分)[问题描述]在n个元素的集合S中,找最大和最小元素(设n的值为2m).
[解题思路]把集合S分成两个子集S1和S2,每个子集有n/2个元素.应用递归过程search(S,Y,MAX,MIN)(S中有2k个元素),过程返回一对(MAX,MIN)值,为最大和最小元素,最后,把S1和S2中的最大和最小元素进行比较,从而得到S中的最大和最小元素.
[程序]
programwsh;
typedata=array[1..256]ofbyte;
jh=setofbyte;
vars,ss:
jh;
a:
data;
i,j,d,largest,smallest:
byte;
functionsq(k:
byte):
byte;
begin
ifk=1thensq:
=2elsesq:
=2*sq(k-1);
end;
procedureseareh(x:
jh;y:
byte;varmax,rain:
byte);
vark,p,w,nxl,nx2,ni1,ni2,n:
byte;
m:
array[1..2]ofbyte;
s1,s2:
jh;
begin
ify=2then
begin
p:
=0;
fork:
=1toido
if___
(1)___then
begin
p:
=p+1;m[p]:
=___
(2)___;
end;
if___(3)___then
begin
w:
=m[1];m[1]:
=m[2];m[2]:
=w;
end;
max:
=m[1];min:
=m[2];exit;
end
else
begin
si:
=[];n:
=O;y:
=___(4)___;
fork:
=1toido
if___(5)___then
begin
n:
=n+1;ifn<=ythens1:
=___(6)___;
end;
s2:
=___(7)___;
search(s1,y,nx1,ni1);search(s2,y,nx2,ni2);
ifnx1>nx2thenmax:
=nx1elsemax:
=nx2;
ifni1=ni1elsemin:
=ni2;
end
end;
begin
i:
=0;s:
=[];ss:
=[];
forj:
=1to7doss:
=ss+[sq(j)];
writeln('enter2^ndata:
');
repeat
whilenoteolndo
begin
i:
=i+1;read(d);
if___(8)___theni:
=i-1
elsebegin
a[i]:
=d;s:
=s+[a[i]];
end;
end;readln;
untiliinss;
search(s,i,largest,smallest);
writeln('largest-data:
',largest,'smallest-data:
',smallest)
end.
答案:
a[k]inx
m[p]:
=a[k]
m[1]<=m[2]
y:
=trunc(y/2)
a[k]inx
s1:
=s1+[a[k]]
s2:
=x-s1
dins
第7题(14分)[问题描述]将一个含有运算符为:
(、)、+、-、*、/、^(乘幂运算)、~(求负运算)的中缀表达式,如:
((1+2)*5)^2-(3+5)/2转化为后缀表达式,如:
12+5*2^35+2/-.
[解题思路]将中缀表达式转化为后缀表达式,首先规定运算符的优先数如下:
┌───┬───┬───┬─────┬──────┬───┬───┐
│运算符│(│)│+,-│*,/│~│~│
├───┼───┼───┼─────┼──────┼───┼───┤
│优先数│0│1│2│3│4│5│
└───┴───┴───┴─────┴──────┴───┴───┘
1.若输入是运算量,则将该运算量输出;
2.若是左括号“(”,则将该符号的优先数压入设置的运算符堆栈e[p]中去;
3.输入运算符优先数是2,3,4,5时,如果栈空,则将运算符的优先数进栈。
如果栈不空,则将它与栈顶元素进行比较,倘若优先数大于栈顶元素的优先数,则进栈;小于顶元的,则顶元退栈并输出该运算符,然后再继续比较,直到大于顶元或栈空时进栈;
4.若是右括号“)”,同时栈顶元又为左括号“(”,则栈顶元退栈,并抹去右括号“)”.否则转3处理;
5.输入完而栈非空,则将栈内内容逐一退栈并输出。
所有输出的结果就为后缀表达式。
过程中用到的相关数据结构如下:
typearraydata=array[1..100]ofstring[20];
constfh:
array[1..8]ofstring[1]
=('(',')','+','-','*','/','~','^');
b:
array[1..8]ofbyte=(0,1,2,2,3,3,4,5);
vard:
arraydata;{存储运算量及运算符号}
i,j,m,k:
byte;
[过程程序]
procedurehzbds(vard:
arraydata;varm:
byte);
var:
array[1'-.100]ofbyte;
i,p,k,bi:
byte;
bl:
boolean;
begin
p:
=O;k:
=1;bj:
=0;
whilek<=mdo
begin
if___
(1)___then
begin
p:
=p+1;e[p]:
=1
end
elsebegin
fori:
=2to8do
if___
(2)___then
begin
b1:
=true;
repeat
if___(3)___then
begin
p:
=p+1;e[p]:
=i;bj:
=1;b1:
=false
end
elseif____(4)___then
ife[p]<>1then
begin
p:
=p+1;e[p]:
=i;bj:
=1;b1:
=false
end
elseifd[k]<>')'then
begin
p:
=p+1;e[p]:
=i;bj:
=1;b1:
=false
end
elsebegin
___(5)___;bj:
=1;b1:
=false;
end
elsebegin
write(fh[e[p]],'');p:
=p-1
end;
untilb1=false;
end
if___(6)___thenwrite(d[k],'')elsebj:
=0;
end;
k:
=k+1
end
b1:
=true;
repeat
ifp=0thenb1:
=false
elsebegin
___(7)___;p:
=p-1;
end
untilb1=false;
writeln;
end;
答案:
d[k]:
='('
d[k]:
=fh[i]
p=0
b[e[p]]
p:
=p-1
bj=0
write(fh[e[p]],'')
第8题(15分)以下程序完成对数组每个元素向后移动n个单位。
数组元素的下标依次为0到m-1,对任意一个数组元素a[i]而言,它的值移动后将存储在数组元素a[(i+n)modm]中。
例如,m=10,n=3,移动前数组中存储的数据如下前一行所示,则程序运行后数组中存储的数据如下后一行所示。
038620276731163742
163742038620276731
程序清单:
programwsh;
constmaxm=10000;
vari,k,m,n,rest,start,temp:
longint;
a:
array[0..maxm]oflongint;
begin
write('inputm,n:
');
readln(m,n);
fori:
=0tom-1doa[i]:
=random(100);
writeln('beforemove');
fori:
=0tom-1dowrite(a[i]:
5);
writeln;
rest:
=m;start:
=0;
while___
(1)___do
begin
k:
=start;
repeat
k:
=(k+n)modm
untilk<=start;
if___
(2)___then
begin
temp:
=a[k];
repeat
a[k]:
=a[(m*n+k-n)modm];
k:
=(m*n+k-n)modm;
___(3)___;
untilk=start;
___(4)___;
end;
___(5)___;
end;
writeln('aftermove');
fori:
=0tom-1dowrite(a[i]:
5);
writeln
end.
答案:
rest>0
k:
=start
rest:
=rest-1
a[(k+n)modm]:
=temp
start:
=start+1
第9题(15分)设m叉树采用列表法表示,即每棵子树对应一个列表,表的结构为:
子树根顶点的值部分(设为一个字符)和用“()”括起来的各树的列表(如有子树的话),各子列表间用“,”分隔。
例如下面的三叉树可用表a(b(c,d),e,f(g,h,i))表示。
本程序输入列表,生成一棵m叉树,并由m叉树输出列表。
假定输入无错误。
程序清单:
programwsh;
constm=3;
typepointer=^node;
node=record
val:
char;
subtree:
array[1..m]ofpointer
end;
var
i:
integer;
bur:
string;
root:
pointer;
proceduremaketree(vars:
pointer);{由列表生成m叉树}
vark:
integer;
begin
___
(1)___;
s^.val:
=buf[i];
i:
=i+1;
fork:
=1tomdos^.subtree[k]:
=nil;
ifbuf[i]='('then
begin
k:
=1;
repeat
i:
=i+1;
___
(2)___;
ifbuf[i]=')'then
begini:
=i+1;breakend;
k:
=k+1
until___(3)___;
end
end;
procedurewalkt