P=10:
tax=x*0.05 (x>10000)
这里的P是“情况”值,用产值x除以1000的整数值作为P,如果P>10也归入P=10的情况。
Pascal语言用P=trunc(x/1000)取整计算,
Pascal程序:
ProgramExam22;
Var x,p:
integer;
Tax :
real;
Begin
Write('Number=');readln(x);
P:
=trunc(x/1000);
ifP>9thenP:
=10;
Case P of
0 :
tax:
=0;
1,2,3,4 :
tax:
=x*0.2;
5,6,7,8,9 :
tax:
=x*0.3;
10 :
tax:
=x*0.5
end;
Writeln('tt=',tt:
5:
2);
Readln
End.
情况表达式的计算必须考虑到“全部”情况,不要有遗漏。
如果情况常量表的“值”在某范围内是连续的,可将常量表写成:
n1..n2:
语句;
因此,上面程序中的情况常量表可以写成如下程序中表示形式:
ProgramExam22_1;
Varx,p:
integer;
tax:
real;
Begin
Write('Number=');readln(x);
P:
=trunc(x/1000);
ifP>9thenP:
=10;
Case P of
0 :
tax:
=0;
1..4 :
tax:
=x*0.2; {从1至4作为同一情况处理}
5..9 :
tax:
=x*0.3; {从5至9作为同一情况处理}
10 :
tax:
=x*0.5
end;
Writeln('tt=',tt:
5:
2);
Readln
End.
程序中的trunc(x)为取整函数,是Pascal的算术标准函数之一。
Pascal常用的算术标准函数有19个:
(1)abs(x)求x的绝对值(|x|);
(2)exp(x)求ex的值;(e为无理数2.71828…)
(3)frac(x)求x的小数部分;
(4)int(x)求x的整数部分(不舍入,函数值为实型);
(5)ln(x) 求以e为底的x的对数(logex );
(6)odd(x)判断x的奇偶数(当x为奇数时odd(x)值为true,否则为false);
(7)ord(x)求x的序号,结果为整型(x为有序类型量);
(8)pi π值(3.1415926535897932…);
(9)pred(x)求x(有序类型)的前趋值;
(10)succ(x)求x(有序类型)的后继值;
(11)random随机函数,产生0~1的随机值;
(12)random(n)产生0~n的随机数(n为word类型,先执行randomize,才能得到随机整数);
(13)round(x)求x的四舍五入整数;
(14)trunc(x)求x的整数部分(截掉小数部分,结果为整型);
(15)sqr(x)求x的平方值(x2);
(16)sqrt(x)求x的开平方根值( );
(17)sin(x)求x的正弦函数(x为弧度);
(18)cox(x)求x的余弦函数(x为弧度);
(19)arctan(x)正切的反三角函数(x为数值);
习题2.2
1.运输公司计算运费时,距离(S)越长,每公里运费越低,标准如下:
如果S<250公里;运费为标准运价的100%
如果250公里<=S<500公里,运费为标准运价的98%;
如果500公里<=S<1000公里,运费为标准运价的95%;
如果1000公里<=S<2000公里,运费为标准运价的92%;
如果2000公里<=S<3000公里,运费为标准运价的90%;
如果S=>3000公里,运费为标准运价的85%;。
请编计算运费的程序。
2.输入考试成绩,如果获85分以上为A等,获60分~84分为B等,60分以下为C等,编程输出考试等级。
3.某车间按工人加工零件的数量发放奖金,奖金分为五个等级:
每月加工零件数N<100者奖金为10元;100<=N<110者奖金为30元;110<=N<120者奖金为50元;120<=N<130者奖金为70元;N>130者为80元。
请编程,由键盘输入加工零件数量,显示应发奖金数。
第三章 循环程序
在编程中经常遇到需要多次规律相同的重复处理,这就是循环问题。
TurboPascal采用不同的循环方式来实现,常用的环循有三种:
for、repeat、while.
第一节 for循环
for循环是一种自动计数型循环。
[例3.1]试打印出1~20的自然数。
解:
①用a代表1~20各数,同时也用a兼作计数,以控制循环次数;
②让a从1开始;
③输出a;
④a自动计数(加1),如果未超越所规定的循环范围则重复步骤③,否则结束循环。
Pascal程序:
ProgramExam12;
Vara:
byte;
Begin
fora:
=1to20do
Writeln(a);
Readln
End.
程序中 fora:
=1to20doWriteln(a);是for循环语句。
for循环语句有两种格式:
(1)for 循环变量:
=初值 To终值do语句;
(2)for 循环变量:
=初值 downto终值do语句;
第
(1)种格式的初值小于等于终值,循环变量值按自动加1递增变化;
第
(2)种格式的初值大于或等于终值,循环变量值按自动减1递减变化。
for循环是(以递增1或以递减1)计数型循环。
比如:
若将[例3.1]程序改为倒计数(递减)循环,则输出20~1的自然数数:
ProgramExam31;
Vara:
byte;
Begin
fora:
=20downto1do
Writeln(a);
Readln
End.
[例3.2]打印出30至60的偶数。
]
解:
方法一:
=1\*GB3①设a表示30至60的所有的数,可用for循环列出;
=2\*GB3②用式子 amod2=0 筛选出其中的偶数并输出。
Pascal程序:
Programex32;
Vara :
integer;
Begin
Fora:
=30to60do
If(amod2=0)thenwriteln(a);
Readln;
End.
在这个程序中,for循环后的循环语句是一个条件分支语句。
方法二:
我们知道,在式子a=2*n中,若n取自然数1、2、3、…,时,则a依次得到偶数2、4、6、…。
因此要想得到30至60的偶数,就可以让上面式子中的n取15至30的自然数就可以了。
所以本题还可以按以下步骤处理:
=1\*GB3①设n表示15至30的所有自然数,可用for循环列出;
=2\*GB3②用式子 a:
=2*n 求出其中的偶数;
=3\*GB3③将结果输出至屏幕。
Pascal程序:
Programex32;
Begin
Forn:
=15to30do
Begin
a:
=2*n;
Writeln(a);
End;
Readln;
End.
[例3.3]自然数求和:
编一个程序,求从1至100的自然数的和。
解:
①令S=0;
②令a表示1至100的自然数,用循环列出;
③将这些自然数用公式S:
=S+a逐一累加到S中去;
=4\*GB3④循环结束后,S即为1至100的自然数的和,输出即可。
Pascal程序:
Programex33;
vars,a:
integer;
Begin
S:
=0;
Fora:
=1to100do
S:
=S+a;
Writeln(‘S=’,S);
Readln;
End.
[例3.4]一个两位数x,将它的个位数字与十位数字对调后得到一个新数y,此时y恰好比x大36,请编程求出所有这样的两位数。
解:
①用for循环列举出所有的两位数,x为循环变量;
②用公式a:
=xdiv10分离出x的十位数字;
③用公式b:
=xmod10分离出x的个位数字;
④用公式y:
=b*10+a合成新数y;
=5\*GB3⑤用式子y-x=36筛选出符合条件的数x并输出。
Pascal程序:
Programex34;
Begin
Forx:
=10to99do
Begin
a:
=xdiv10;
b:
=xmod10;
y:
=b*10+a;
ify-x=36thenwriteln(x);
End;
Readln;
End.
[例3.5]把整数3025从中剪开分为30和25两个数,此时再将这两数之和平方,(30+25)2=3025计算结果又等于原数。
求所有符合这样条件的四位数。
解:
设符合条件的四位数为N,它应当是一个完全平方数,用(a*a)表示。
①为了确保N=(a*a)在四位数(1000~9999)范围内,可确定a在32~99循环;
②计算N=a*a;将四位数N拆分为两个数n1和n2;
③若满足条件(n1+n2)*(n1+n2)=N就输出N。
Pascal程序:
Program Exam35;
VarN,a,x,n1,n2:
Integer;
Begin
fora:
=32to99do
begin
N:
=a*a;
n1:
=Ndiv100; {拆取四位数的前两位数}
n2:
=N-n1*100; {拆取四位数的后两位数}
X:
=n1+n2;
if x*x=N then writeln(N);
end;
Readln
End.
[例3.6]用“*”号打印出如下的长方形图案。
*********
*********
*********
*********
解:
①上面给出的图例共有4行,我们可以用一个循环控制行的变化;
②在每行中又有9列,我们可以在前面控制行的循环中再套一个循环来控制列的变化。
Pascal程序:
Programex36;
Begin
Fora:
=1to4do {外循环控制行的变化}
Begin
Forb:
=1to9do {内循环控制列的变化}
write(‘*’);
Writeln; {输出一行的“*”后换行}
End;
Readln;
End.
程序中的循环对于a的每个值都包含着一个b=(1~9)次的内循环。
外循环fora将内循环forb包含在里面,称为for循环的嵌套。
嵌套形式如:
fora:
=n1ton2do
forb:
=m1tom2do 循环体语句;
[例3.7]打印出九九乘法表:
解:
设a为被乘数,范围为1~9;b为乘数,范围为1~a;乘式为a*b=(a,b的乘积),则
a=1:
b=1~a 1*1=1
a=2:
b=1~a 2*1=2 2*2=4
a=3:
b=1~a 3*1=3 3*2=6 3*3=9
a=4:
b=1~a 4*1=4 4*2=8 4*3=13 4*4=16
:
:
a=9 b=1~a 9*1=9 9*2=18 … 9*9=81
⑴从上面分解的横行中看到共有9行,这里的“行”数变化与a的变化从1~9相同,可用a控制“行”的循环;
⑵每“行”里面相乘的次数与b的范围相关,由b控制每“行”里面的“内部”循环;
⑶内循环被包含在最里层,执行完每“行”的内部循环,就到下一“行”去执行新“行”里面的循环,每“行”都拥有形式相同的(b=1~a)内循环。
即每到一“行”都要执行该“行”的内循环。
这里所指的“行”可以理解成抽象的行,不一定是实际上具体对应的行,可以是一个处理“块”。
Pascal程序:
ProgramExam37;
Vara,b:
byte;
Begin
fora:
=1to9do {外循环}
begin
forb:
=1toado {内循环}
write(a,’*’,b,’=’,a*b,’ ’:
3);
writeln
end;
Readln
End.
根据这种格式还可以实现多层循环嵌套,例如:
fora:
=n1ton2do
forb:
=m1tom2do
forc:
=k1tok2do 循环体语句;
[例3.8]从七张扑克牌中任取三张,有几种组合方法?
请编程输出所有组合形式。
解:
设每次取出三张分别为a,b,c。
用三重循环分别从1~7的范围里取值;为了排除取到重号,用(a-b)*(b-c)*(a-c)<>0进行判断。
Pascal程序:
programExam38;
const n=7;
var a,b,c,t:
integer;
Begin
t:
=0;
fora:
=1tondo
forb:
=1tondo
forc:
=1tondo
if(a-b)*(b-c)*(a-c)<>0then
Begin
inc(t);
writeln(a:
3,b:
3,c:
3)
End;
writeln(total:
t:
5);
readln
End.
[例3.9]数学上把除了1和它本身,没有别的数能够整除它的自然数叫做素数(