循环结构程序设计
第1节 For循环程序实例
【问题描述】
计算一副扑克牌的点数,其中牌A为1点,牌J、Q、K分别为11、12、13点,大、小王不算点。
【问题分析】
根据题意,要计算一副扑克牌的点数,可以先求出一种花色牌的点数和,再乘以4即可。进一步分析,求一种花色牌的点数和,即是求1~13的连续自然数之和。我们用S表示所求数的和,用T表示加数,这样可以让T从1变化到13,每次让T不断加入到S中,就可以求出S的值,最后乘以4即可。
【算法设计】
◆自然语言
①置初值,即S=0,T=1;
②使S=S+T ,所求出的和仍放入S中;
③使T增加1,即T=T+1;
④如果T小于等于13,转第二步,否则转第五步;
⑤输出计算结果。
◆程序流程图和结构化流程(N-S)图
【程序设计】
[程序清单]
program ex3_1;
var
s,t:integer;
begin
s:=0; {S置初值为0}
for t:=1 to 13 do {For循环语句}
s:=s+t;
writeln(‘total:’,s*4);
end.
[运行示例]
total:364
【知识拓展】
1.在程序处理过程中,经常需要对某一条或一组语句重复执行多次,以最终完成某项任务,这就是循环。对于重复次数已知,而不依赖循环中语句的结果,常用计数循环(f or / to /do 语句)。
2.for循环语句格式:
格式一:for 控制变量:= 初值to 终值do
循环体语句;
格式二:for 控制变量:= 初值downto 终值do
循环体语句;
其中for、to、downto、do为保留字,do后面的语句称为循环体。其中循环控制变量可以是整型、字符或布尔型,但不能为实型。一般地,可以是顺序类型数据。
初值、终值表达式通常要与控制变量的类型相同。
在for语句中如果使用的是to,称为递增型计数循环语句,如果使用的是downto,称为递减型计数循环语句。
3.For语句的执行过程:
①先将初值表达式的值计算出来并赋给循环控制变量。
②判断循环控制变量的值是否已“超过”终值(对于递增型循环来说,“超过”是指“大于”;对递减型循环来说,“超过”是指“小于”)。如已超过,则跳到步骤⑥。
③如果未超过终值,则执行do后面的语句(称为循环体)。
④循环变量递增(或递减)。
⑤返回执行步骤②。
⑥循环结束,执行for循环下面的一个语句
4.使用For语句的的注意事项:
①循环控制变量必须为顺序类型。例如,可以是整型、字符型、布尔型,不能为实型,如:
for i=3.5 to 8.5 do write(i)是错误的。
②循环控制变量的值递增或递减的规律是:若是递增型循环,则按Succ函数规律变化;若是递减型循环,则按Pred函数规律变化。例如:
for k:=’a’to ’z’do write(k)
将按顺序打印出26个小写英文字母“abcd…z”。
③循环体可以是一条基本语句,也可以是一条复合语句。例如:
for j:=1 to n do
begin
readln(x);
wreteln(x+1)
end;
循环语句的范围直到end才结束。
④循环控制变量不得在循环体内再被赋值。例如:
for x;=1 to 10 do
begin
x:=2*z+1;
end;
是错误的。
⑤循环控制变量的初值和终值一经确定,循环次数就确定不变了。
循环的次数可用如下公式计算:
0 若初值〉终值
递增型循环的循环次数=
Ord(终值)-Ord(初值)+1 若初值≤终值
0 若初值〈终值
递减型循环的循环次数=
Ord(初值)-(终值)+1 若初值≥终值【同步练习】
1.宰相的麦子:相传古印度宰相达依尔,是国际象棋的发明者。有一次,国王因为他的贡献要奖励他,问他想要什么。达依尔说:“只要在国际象棋棋盘上(共64格)摆上这么些麦子就行了:第一格一粒,第二格两粒,……,后面一格的麦子总是前一格麦子数的两倍,摆满整个棋盘,我就感恩不尽了。”国王一想,这还不容易。于是令人扛来一袋麦子,可很快用完了,又扛来一袋,很快用完了……国王很奇怪,请你帮国王计算一下,要多少麦子。(1立方米的麦子约为1.42×108粒)
问题分析:
对于编程类问题的描述,要特别注意正确、全面地理解题意,要学会从描述性语言中抽象出具体的数据,并建立数学模型。在本题中根据“国际象棋棋盘上共有64格,第一
格一粒,第二格两粒,……,后面一格的麦子总是前一格麦子数的两倍”的题意,我们可以建立数学模型:第一格为20,第二格为21,第三格为22,……第64格为263,设64格中应放麦子数为S,则可用下面的公式表示:
S= 20+21+22+23+……+263
1立方米的麦子约为1.42×108粒,那么S粒麦子的体积T为:
T=S/(1.42×108)立方米。
这样我们将问题转化为一般数学模型,再根据数学模型写出算法设计,再写出具体程序就水道渠成。
[程序清单]
program p3_1_2(input,output);
var
n,s,t:integer
begin
s:=0;
for n:=0 to 63 do
s: =s+2^n;
t:=s/(1.42*10^8)
writeln(‘s=’,s,)
writeln(‘t=’,t );
end.
[运行示例]
S=1.84467441E+19
T=1.29906648E+11
2.阅读下面的程序,说明该程序的作用。
[程序清单]
program p3_1_3(input,output);
var a,b,c:integer {此处integer表示整型数据}
beging
writeln(′请任意输入一个数:′);
readln(b);
for c:=1 to 5 do
begin
read(a);
if a>b then b:=a;
end;
writeln(‘最后的值是:‘′,b:5);
end.
[运行示例]
请任意输入一个数:
6↙
4↙ 7↙ 13↙ 8↙ 11↙
最后的值是:13
第2节当循环程序实例
【问题描述】
农场主的预算报告
放暑假学校组织夏令营来到一个农场,农场主热情的接待了他们。在参观时,同学们发现在农场的左上角圈出了一块地方,这儿阳光充足,通风也不错,但却什么也没有,觉得很奇怪。农场主告诉大家因为农场四周由许多小朋友因没钱交学费而缀学,所以决定
引进品种不错的雌雄一对小白兔,在这饲养。小白兔需经过一个月才能长大,长大后每个月都生雌雄一对小白兔。想等小白兔繁殖到1000对的时候,在分发给周围贫困的人,希望能帮助他们重新进入课堂。现正在写一份预算报告,其中预计所需时间却却没算出来。同学们现在就让我们来帮助这位好心的农场主算出时间。
【问题分析】
这问题从表面来看好象没有什么规律,不妨设计一张表格来推算一下。
因为第一个月小白兔没长大,所以兔子数是1对。到了第二个月小白兔长大了,生了一对小白兔,兔子数是2对。第三个月小白兔也长大了,大白兔是2对,它们都生了一对小白兔,兔子数是4对……。依此类推,发现除了第一个月,其它都是:前一个月的兔子数× 2 = 本月兔子数。我们发现这又是一个循环,直到兔子数为1000对的时候结束。可是用for语句显然不行,因为我们不知道循环的次数。下面我们用当型循环(while/do语句)来编写程序。
农场主的预算可以描述如下:
月份:=1;
兔子数:=1; { 预定义第一个月的兔子数是1对}
while 兔子数<1000 do{当兔子数小于1000对时进入循环}
begin
月份:=月份+1;
兔子数:=兔子数*2;
end;
【程序设计】
[程序清单]
program p4-1(input,output);
var
month, rabbit: integer;
begin
month:= 1;
rabbit:= 1;
while rabbit<1000 do
begin
month:=month + 1;
rabbit:= rabit * 2;
end;
writeln(‘The months is :’,month);
end.
【知识拓展】
1.while循环语句
当型循环(while语句)是这样描述循环的:当指定条件成立时,重复执行指定的语句。
格式:while 布尔表达式 do 语句;
例如:
k:=10;
WHILE k>0 DO
BEGIN
Writeln (k);
k:=k-1
END;