end;
writeln(a,' ',b); //输出运算结果 end.
例2-2 输入一个三位数的整数,将数字位置重新排列,组成一个尽可能大的三位数。 【样例输入】213 【样例输出】321
【分析】先用DIV、MOD结合分离出来整数的每一位数字,然后将这三位数字按照由大到小进行排序,然后把最大的作为百位数,次之作为十位数,最小的作为个位数即可。
【参考程序】 program aa;
var t,a,b,c,n:integer; begin
read(n);
a:=n div 100;
b:=n div 10 mod 10; c:=n mod 10;
if a
例2-3 小红开了一个花店,她规定凡在店里购花不超过50元时,按九折付款,如超过50元,不到200元,超过50元部分按七点五折收费,如果超过200元,超过200元部分,将按6折收费。现在她想请你帮她编一程序完成花店自动计费的工作。
【分析】根据题意,我们可以得到计费S的收费公式:
【样例输入】50 【样例输出】45.00 【参考程序】 program aa;
var p,s:real; begin
read(p); //输入应付款数
if p<=50 then s:=0.9*p //进行自动计费 else if p<=200 then s:=0.9*50+(p-50)*0.75 else s:=0.9*50+150*0.75+(p-200)*0.6; writeln(s:0:2); //输出实际付款数 end.
三、CASE语句 1.格式:
CASE语句又称为分情况语句,格式如下: case 测试表达式 of
情况标号1:语句1; 情况标号2:语句2; ??
情况标号n:语句n;
16 / 53
(1)先计算出测试表达式的值,注意:这个测试表达式中不能含有trunc、round函数,测试表达式的值不能是实数。
(2)然后用测试表达式的值依次与各情况标号进行对照,当找到一个与测试表达式的值相匹配的情况标号,就去执行该CASE情况标号后面的语句块,然后跳到与CASE相对应的END后面的语句继续执行。
(3)如果找不到与之匹配的情况标号(若有ELSE则执行它后面的语句),退出CASE语句,执行它后面的语句。
例2-4 打印某年某月有几天。 【样例输入】2000 2 【样例输出】29 【参考程序】 program aa; var
y,m,d:integer; begin
read(y,m); //读入年和月 case m of
1,3,5,7,8,10,12:d:=31; 4,6,9,11:d:=30;
2:if (y mod 4=0) and (y mod 100<>0) or (y mod 400=0) //判断闰年布尔表达式
then d:=29 else d:=28; end;
writeln(d); //输出这个月的天数 end.
第三节 循环结构
一、计数循环
1.其语句格式是:
(1)for 控制变量:=初值 to 终值 do 一条语句;
(2)for 控制变量:=初值 downto 终值 do 一条语句;
其中for、to、downto和do是Pascal语言保留字,一条语句可以是一条简单语句或一条复合语句,但只能是一条语句,它适合用于能事先确定循环次数的事件。
2.执行过程
(1)先将初值赋给左边的变量(称为循环控制变量);
(2)判断循环控制变量的值是否已\超过\递增是大于,递减是小于)终值,如已超过,则跳到步骤(6);
(3)如果未超过终值,则执行do后面的那个语句(称为循环体); (4)循环变量递增(对to)或递减(对downto)1; (5)返回步骤(2);
(6)循环结束,执行for循环下面的一个语句。 3.注意事项
(1)for循环控制变量必须是顺序类型的变量,如整数,但不能是实数,也不能是8字节整型,如int64、qword等。
17 / 53
(2)for语句的循环体中不能修改循环控制变量,它将会自动增加或减少。 (3)break:中断当前所在的循环。
例2-5 输入n(0<=n<=200),计算从1累加到n之和。
【分析】设置一个循环变量初值为1,终值为n,重复进行n次加法的循环。每次将循环控制变量(I)的值迭加在S中,不断重复该过程,故当循环结束的时候,S变量表示的就是总和了。s:=s+i;这里的s称为累加器,它使用前要清0。
【样例输入】100 【样例输出】5050 【参考程序】 program aa;
var i,n,s:integer; begin
read(n); s:=0;
for i:=1 to n do s:=s+i; writeln(s); end.
例2-6 输入一个自然数x(x<=10000),求这个自然数的所有约数之和s。
【分析】如果某数i能被x整除,则有x mod i=0,要找出x的所有约数,也就是要让1至X循环并进行断定。
【样例输入】2328 【样例输出】5880 【参考程序】 program aa;
var x,i,s:integer; begin
read(x);
s:=0; //累加器使用前要清0
for i:=1 to x do //求X的所有约数和
if x mod i=0 then s:=s+i; //如果i是x的约数,则将i累加到s中
writeln(s); end.
例2-7 假设有一个三位数a,将它的个位数字与十位数字对调后得到一个新数b,此时b恰好比a 大27,请编程找出所有这样的三位数。
【输出结果】 103 ?? 169
【参考程序】 program aa;
var a,b,t,k:integer; begin
for a:=100 to 999 do begin
t:=a mod 10; //得到a的个位数
k:=(a div 10) mod 10; //得到a的十位数字 b:=100+t*10+k; //组合一个新数b
if b-a=27 then writeln(a); //用式子b-a=27筛选出符合条件的数a并输出
end;
18 / 53
end.
例2-8 求100以内所有素数,输出时数与数之间隔一空格。
【分析】若i存在约数,肯定不是素数,所以让f=1,中断循环退出。如果是素数,则f=0,就输出i。
【输出结果】2 3 5 7 ?? 89 97 【参考程序】 program aa;
var i,j,k,p,f:integer; begin
for i:=2 to 100 do begin f:=0;
for j:=2 to i div 2 do //判断i是否为素数,如果不是,则f的值变为1
if i mod j=0 then begin f:=1; break; end;
if f=0 then write(i,' '); //若经过上面的程序段,f的值没有改变,则i是素数并输出它
end; writeln; end.
二、当型循环
1.语句格式: while 布尔表达式 DO 一条语句 2.注意事项:
(1)执行过程:先求出布尔表达式的值,当其值为真(TRUE)时,重复执行指定语句,当其值为假(FALSE)时,终止循环。注意这里的一条语句可以是一条简单语句,也可以是一条复合语句。
(2)为了能使WHILE循环正常终止,表达式中所含变量在循环指定的语句中一定要有更改,即有可能使表达式的值为假,以便循环能够结束,否则循环永不结束,而出现死循环。
(3)由于先判断条件,所以布尔表达式中的变量必须在循环语句开始之前先赋初值,如果当条件一开始就不成立,这时将跳过WHILE语句执行它下面的语句。
例2-9 输入若干个字符,它的终止符是’.’,计算输入的字符中字母’A’出现的次数(包含大小写)。
【分析】先读入一个字符赋给ch,然后进入while循环,若是'A'(或'a'),则s累加1,再读入下一个字符,最后输出s的值。
【样例输入】sdkfjaAgsdfAdsfsAs323sdfs. 【样例输出】4 【参考程序】 program aa;
var ch:char; s:integer; begin s:=0; read(ch);
while ch<>'.' do begin
if (ch='a')or(ch='A') then s:=s+1; read(ch); end; writeln(s); end.
例2-10 求输入的一个整数N(0 19 / 53 【样例输出】270 【参考程序】 program aa; var n,t,s:integer; begin read(n); s:=1; //s为累乘器,它使用前要置1 while n<>0 do begin t:=n mod 10; s:=s*t; n:=n div 10; //每次分离出n的个位数赋值给t,并将之累乘到s中,然后将个位数字去掉 end; writeln(s); end. 例2-11 求两个自然数m,n的最小公倍数。 【样例输入】12 8 【样例输出】24 【参考程序】 program aa; var m,n,i,s:longint; begin read(m,n); //输入两个自然数m,n i:=1; //让一个变量i呈自然数列增长,刚开始设为1 s:=m*i; //s为m的倍数 while s mod n<>0 do //若s又刚好是n的倍数,则s就是m,n的最小公倍数 begin i:=i+1; s:=m*i end; writeln(s); //输出最小公倍数 end. 习题 2-1 判断下面题目是否正确 (1)复合语句与程序执行部分的“Begin..End”意义相同。 (2)布尔型数据是顺序型数据。 (3)NOT false 的值是False。 (4)一个变量或常量不可以看成为一个表达式。 2-2 判断读入的整数a是奇数还是偶数,若是奇数,输出“jishu”,否则输出“oushu” 【样例输入】5 【样例输出】jishu 2-3 输入三个数,将它们按由大到小的顺序输出。 【样例输入】12 56 9 【样例输出】56 12 9 2-4 根据学生的成绩给予相应的等级,若成绩在90-100之间输出A,在80-89之间输出B,在60-79之间输出C,60以下输出D。现在输入一个学生的成绩S(0<=S<=100),请输出这个学生的成绩等级。 【样例输入】85 【样例输出】B 2-5 某服装公司为了推销产品,采取这样的批发销售方案:凡订购超过100 套的,每套定价为50 元,否则每套价格为80元。现输入订购套数,输出应付款的金额数。 20 / 53