求pascal语言各种类型练习题

2025-02-24 20:30:53
推荐回答(4个)
回答1:

练习1:有三个小朋友甲乙丙。甲有50粒糖果,乙有43粒糖果,两有13粒糖果。现在他们做一个游戏。从甲开始,将自己的糖分三份,自己留一份,其余两份分别给乙与丙,多余的糖果自己吃掉,然后乙与丙也依次这样做。问最后甲、乙、丙三人各有多少粒糖果?
分析:在游戏中每个小朋友拥有的的糖果数是在变化的,用a,b,c三个变量分别存放甲乙丙在某一时刻所拥有的糖果数。对于每人,分糖后,他的糖果数一定为原来的糖果数 div 3(用整除恰可以表示多余的糖自己吃掉)。而其他两人则增加与这个小朋友现在拥有的糖果数。
program xpo;
var a,b,c:integer;
begin
a:=50;
b:=43;
c:=13;
a:=a div 3;
b:=b+a;
c:=c+a;
b:=b div 3;
a:=a+b;
c:=c+b;
c:=c div 3;
a:=a+c;
b:=c+b;
writeln('a=',a,'b=':5,b,'c=':5,c);
readln;
readln;
end.

练习2:对某产品征收税金,在产值1万元以上征收税5%;在1万元以下但在5000元以上的征收税3%;在5000元以下但在1000元以上征收税2%;1000元以下的免收税。编程计算该产品的收税金额。
提示:设x为产值,tax为税金,用P表示情况常量各值
P=0: tax=0 (x<1000 )
P=1,2,3,4: tax=x*0.02 (1000<=x<5000 )
P=5,6,7,8,9: tax=x*0.03 (5000 P=10: tax=x*0.05 (x> 10000 )
这里的P是“情况”值,用产值x除以1000的整数值作为P,如果P>10也归入P=10的情况。Pascal语言用P=trunc(x/1000)取整计算,
解: program xpo;
var x,p:integer;tax:real;
begin
write('input x=');
read(x);
p:=trunc(x/1000);
if p>0 then
case p of
0:tax:=0;
1,2,3,4:tax:=x*0.02;
5,6,7,8,9:tax:=x*0.03;
else tax:=x*0.05;
end;
write('tax=',tax:0:2);
readln;
readln;
end.

两个小题,希望对你有所帮助 ^_^

回答2:

我这里有本书恩 叫奥赛经典 挺符合你的要求 我qq514154351

回答3:

1.在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
program queens;
var a:array [1..8] of integer;
b,c,d:array [-7..16] of integer;
t,i,j,k:integer;
procedure print;
begin
t:=t+1;
write(t,': ');
for k:=1 to 8 do write(a[k],' ');
writeln;
end;
procedure try(i:integer);
var j:integer;
begin
if i>8 then print;{完成任务,打印结果}
for j:=1 to 8 do {每个皇后都有8种可能位置}
if (b[j]=0) and (c[i+j]=0) and (d[i-j]=0) then {判断位置是否冲突} begin
a[i]:=j; {摆放皇后}
b[j]:=1; {宣布占领第J行}
c[i+j]:=1; {占领两个对角线}
d[i-j]:=1;
try(i+1); {8个皇后没有摆完,递归摆放下一皇后}
b[j]:=0; {回溯}
c[i+j]:=0;
d[i-j]:=0;
end;
end;
begin
fillchar(a,sizeof(a),0); {初始化数组}
fillchar(b,sizeof(b),0);
fillchar(c,sizeof(c),0);
fillchar(d,sizeof(d),0);
try(1);{从第1个皇后开始放置}
end.

2.有三根塔,第一根塔上从小到大摆有n片铜片,要求把这些铜片摆到第三根塔上.但大铜片不能压在小铜片上面.
输入:[KEYBOARD] 输出:[SCREEN]
3
a->c a->b c->b a->c b->a b->c a->c

program hanoitower;

uses crt;

var n:integer;

procedure hanoi(x:integer;a,b,c:char);
begin
if x=1 then write(' ',a,' -> ',c,' ') else
begin
hanoi(x-1,a,c,b);
write(' ',a,' -> ',c,' ');
hanoi(x-1,b,a,c);
end;
end;

begin
clrscr;
write('Hanoi tower,Please input n:');
readln(n);
hanoi(n,'a','b','c');
readln;
end.

3.A、B、C三根细柱,A上有2n个圆盘,共有n个不同的尺
寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘足不加区分的。现要将这些圆盘移到C柱上,在移动过程中可放在B柱上暂存。
要求:
(1)每次只能移动一个圆盘;
(2)A、B、C三根细柱上的圆盘都要保持上小下大的顺序;
计算为2n个圆盘完成上述任务所需的最少移动次数。
program hanoi;
var
a:array[1..10000] of integer;
i,j,x,k:longint;
begin
readln(n);
a[1]:=1;k:=1;
for i:=1 to n do
begin
x:=0;
for j=1 to k do
begin
x:=x+a[j]*2;
a[j]:=x mod 10;
x:=x div 10;
end;
while x>0 do
begin
inc(k);
a[k]:=x mod 10;
x:=x div 10;
end;
end;
x:=2;
k:=1;
while x>0 do
begin
a[j]:=a[j]+x;
x:=x div 10;
end;
for i:=k downto 1 do write(a[i]);
end.

希望对你有用!

回答4:

第二章 顺序结构程序设计
2.1 顺序结构程序
2.1.1 顺序结构
所有计算机程序都可以用四种基本结构表示。这就是顺序结构、选择结构、循环结构以及函数与过程结构。顺序结构是一组按书写顺序执行的一组语句。函数与过程结构使得可以通过简单的函数或过程调用执行一组复杂的语句。这四种结构对外界而言都有唯一的一个入口和一个出口。养成使用这四种结构编程的习惯,可使你的程序结构清晰,可读性好,同时也方使调试和修改。
我们通常把解题的方法和步骤称为算法。为了形象精确地描述算法,我们常常采用流程图描述方法,而PDL框图与N-S框图常用于描述算法用,以后我们将同时介绍这两种框图描述方法,但以N-S框图为主。顺序结构程序是最简单而又最基本的一种结构。用PDL框图及N-S框图描述如下:

语句1
. . . . . .
语句n

2.1.2 赋值语句
赋值语句是PASCAL中最常用的语句,它主要用于计算表达式的值,并将其赋给一个变量。
赋值语句的一般格式为:
<变量标识符>:=<表达式> ;
其中“:=”称为赋值运算符,它表示将运算符右侧表达式的结果送入运算符左侧变量相对应的存储单元中,作为其当前值。语法图如下:

赋值语句使用注意以下几点:
(1) 表达式的类型必须是左端变量的类型能相容的。
(2) 赋值运算符“:=”与等号“=”具有完全不同的含义。
例如2.1:找出下面程序的错误

program rzy3;
var
a : integer;
b : real;
c : char;
d : string;
e:boolean;
begin
b:=5;
a:=b+1;
a:=2*16384
e:= (5>0);
c:='I';
d:=c+' am a boy';
c:=d;
end .

说明:字符串型变量(string)可相容字符型(char)数据,实数型变量(real)可相容整型(integer)数据,反过来则不可以。如上例:b+1结果为实型,不能送入整型变量a中。
2.2 顺序结构程序设计

例2.2 我们用“1”代表牛奶,用“2”代表蜜糖,现有三个杯,其中一个杯装有牛奶,另一杯装有蜜糖,剩下的一个杯为空杯,试编程模拟交换牛奶和蜜糖两杯内容的过程。
思路:借助空杯实现交换,设a:=1; b:=2; c:=0; 交换图示如下:
N-S流程图及程序如下:
program rzy4;
var
a,b,c:integer;
begin
writeln('a b c');
开始
赋予a为1,b为2,c为0
输出开始状态,即a,b,c的值
把a杯牛奶送入c杯
显示当前a,b,c值
把b杯蜜糖送入a杯
显示显示当前a,b,c值
把c杯牛奶送入b杯
显示显示当前a,b,c值
清空c杯
显示当前a,b,c值
结束
a:=1; b:=2; c:=0;
writeln(a,b,c);
c:=a;
writeln(a,b,c);
a:=b;
writeln(a,b,c);
b:=c:
writeln(a,b,c);
c:=0;
writeln(a,b,c);
end.
运行结果:
a b c
1 2 0
1 2 1
2 2 1
2 1 1
2 1 0
问题:从运行时a,b,c的值发现:执行过程中会多一杯牛奶或蜜糖,如1 2 1 ,您知到为什么会这样吗?
原因:PASCAL中对变量的操作是:
“取数用复制,存数用替换”
因此程序中,c:=a; 的操作是:从a中复制数“1”到c中,结果c中值为1,而a中值仍然为1,结果多一杯牛奶了!

改进后运行结果
a b c
1 2 0
0 2 1
2 0 1
2 1 0
你能进一步修改程序,使模拟过程更加合理,并要求输出左边的运行结果吗?看谁做得最快!

例2.3 已知甲、已两港间的水路为S千米,一只船从甲港开往乙港,顺水T1小时到达,从乙港返回甲港,逆水T2小时到达,求船速VB和水速VW。编程实现从键盘中输入S、T1和T2则可打印出船速和水速。
思路:从题意注意到有下面基本数量关系
顺水速度=船速 + 水速
开始
提示输入数据
输入水路及顺逆水时间
计算船速及水速
输出船速及水速
结束
逆水速度=船速 - 水速
因此可建立下面数学模型
顺水速度=水路/顺水时间 即VT1=S/T1
逆水速度=水路/逆水时间 即VT2=S/T2
船速=(顺水速度+逆水速度)/2 即VB=(S/T1+S/T2)/2
水速=(顺水速度-逆水速度)/2 即VW=(S/T1-S/T2)/2
程序如下:

program rzy5;
var
s,t1,t2,vb,vw:real;
begin
write('s,t1,t2=');
readln(s,t1,t2);
vb:=(s/t1+s/t2)/2;
vw:=(s/t1-s/t2)/2;
writeln('vb=',vb:8:2);
writeln('vw=',vw:8:2);
end .

运行输入数据:
s,t1,t2= 208 8 13
运行输出结果:
vb= 21.00
vw= 5.00
再运行输入数据:
s,t1,t2= 300 10 15
请记录运行输出结果:
vb=
vw=

例2.4 猜数游戏,运行程序时,计算机会随机产生一个1到10间的数,然后您输入一个数,您猜对了,计算机会显示“right! computer number is X”,否则显示“wrong! computer number is X”。其中X为计算机随机产生的数。
思路:主要使用到计算机提供的随机函数random(x),产生[0,x-1]之间的随机数,再与输入的数比较而决定不同的输出。randomize过程可使每次运行程序产生的随机数更加随机。
program rzy6;
var
开始
把输出信息存入变量name中
产生一个随机数存入变量c中
提示输入猜测数
输入一个猜测数并存入p中
判断两数是否相同,结果b中存入了true或false
用copy函数从name中复制相应信息输出。
结束
c,p:integer;
name:string;
b:boolean;
begin
name:='wrong!right!';
randomize;
c:=random(11);
write('your guess number:');
readln(p);
b:=(c=p);
writeln( copy(name,1+ord(b)*6,6) , ' computer number is ' , c );
end .
程序理解:假设计算机随机产生数为3,即c为3,读者输入猜数为4,即p为4,则b:=(3=4);故b值为false, 则copy(name,1+ord(b)*6,6)简化为copy(name,1+ord(false)*6,6),因为ord(false)的值为0,则copy('wrong!right!',1,6),结果为 'wrong!' 。试分析输入猜数为3时,又如何。有关函数random,copy,ord请参阅第一章或Turbo Pascal帮助说明。

例2.5 编程实现从键盘中输入一个字符,打印输出该字符的ASCII码值。
思路:程序很简单,只须用ord(x)求出字符在ASCII字符集中的序号即可。
程序如下:

program rzy7;
运行程序:
enter a charater: A
输出结果:
A ASCII is 65
var
ch:char;
begin
write('enter a charater:');
readln(ch);
writeln( ch,' ASCII is ',ord(ch) );
end.
本章练习
练习1:编程实现输入三角形的底边和高,求三角形的面积。
(提示:三角形面积=(底*高)/2 )
练习2:编程用writeln语句及“*”号输出你的姓名。例如“王平”,输出如下:
******* *********
* * * *
* ***
******* ***********
* *
* *
******* *
练习3:问题:有两支蜡烛,燃烧速度相同,第一支n小时燃尽,第二支m小时燃尽,其中n>m。如果同时点燃这两支蜡烛,在点燃多少小时以后,第一支蜡烛的长度是第二支蜡烛的k倍。要求编程实现从键盘输入不同的m,n,k值,则输出应点燃时间t。
提示:
(1)设燃烧速度为L
(n*L-t*L)=k*(m*L-t*L)
即 t=(k*m-n)/(k-1)
(2)设n,m, k,t为real型。
(3)试测试数据n,m, k对应4 3 3
正确结果t为2.5000000000E+00

练习4:一人骑自行车从甲地到乙地,速度是9千米/小时,如果车速改为12千米/小时,结果就会比原速早到半小时。问甲乙两地之间的距离是多少千米?
提示:(1)设甲乙距离为S,原速成为v1=9千米/小时,提速后v2=12千米/小时,相差时间为dt=0.5小时。
(2)有s/v1-s/v2=dt 即有s=dt/(1/v1-1/v2)
(3)可设s,v1,v2,dt为实数型real;
(4)测试数据v1,v2,dt分别为9 12 0.5 , 输出正确结果:s= 18:00 。