pascal 习题 完善程序.docx

上传人:b****4 文档编号:24476078 上传时间:2023-05-27 格式:DOCX 页数:30 大小:28.14KB
下载 相关 举报
pascal 习题 完善程序.docx_第1页
第1页 / 共30页
pascal 习题 完善程序.docx_第2页
第2页 / 共30页
pascal 习题 完善程序.docx_第3页
第3页 / 共30页
pascal 习题 完善程序.docx_第4页
第4页 / 共30页
pascal 习题 完善程序.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

pascal 习题 完善程序.docx

《pascal 习题 完善程序.docx》由会员分享,可在线阅读,更多相关《pascal 习题 完善程序.docx(30页珍藏版)》请在冰豆网上搜索。

pascal 习题 完善程序.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 简洁抽象

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1