FREE-PASCAL入门-循环结构程序_第1页
FREE-PASCAL入门-循环结构程序_第2页
FREE-PASCAL入门-循环结构程序_第3页
FREE-PASCAL入门-循环结构程序_第4页
FREE-PASCAL入门-循环结构程序_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、循环结构程序设计第1节 For循环程序实例【问题描述】计算一副扑克牌的点数,其中牌A为1点,牌J、Q、K分别为11、12、13点,大、小王不算点。【问题分析】根据题意,要计算一副扑克牌的点数,可以先求出一种花色牌的点数和,再乘以4即可。进一步分析,求一种花色牌的点数和,即是求113的连续自然数之和。我们用S表示所求数的和,用T表示加数,这样可以让T从1变化到13,每次让T不断加入到S中,就可以求出S的值,最后乘以4即可。【算法设计】u         自然语言置初值,即S=0,T=1;使S=S+T ,所求出的和仍放

2、入S中;使T增加1,即T=T+1;如果T小于等于13,转第二步,否则转第五步;输出计算结果。u         程序流程图和结构化流程(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在程序处理过程中,经常需要对某一条或一组语句重复执行多次,以最终完成某项任务,这就是循

3、环。对于重复次数已知,而不依赖循环中语句的结果,常用计数循环(for / to /do 语句)。2for循环语句格式:格式一: for 控制变量 := 初值 to 终值 do 循环体语句;格式二: for 控制变量 := 初值 downto 终值 do循环体语句;其中for、to、downto、do为保留字,do后面的语句称为循环体。其中循环控制变量可以是整型、字符或布尔型,但不能为实型。一般地,可以是顺序类型数据。初值、终值表达式通常要与控制变量的类型相同。在for语句中如果使用的是to,称为递增型计数循环语句,如果使用的是downto,称为递减型计数循环语句。3For语句的执行过程:先将初

4、值表达式的值计算出来并赋给循环控制变量。判断循环控制变量的值是否已“超过”终值(对于递增型循环来说,“超过”是指“大于”;对递减型循环来说,“超过”是指“小于”)。如已超过,则跳到步骤。如果未超过终值,则执行do后面的语句(称为循环体)。循环变量递增(或递减)。返回执行步骤。循环结束,执行for循环下面的一个语句4使用For语句的的注意事项:循环控制变量必须为顺序类型。例如,可以是整型、字符型、布尔型,不能为实型,如:for i=3.5 to 8.5 do write(i)是错误的。循环控制变量的值递增或递减的规律是:若是递增型循环,则按Succ函数规律变化;若是递减型循环,则按Pred函数规

5、律变化。例如:for k:=ato zdo write(k)将按顺序打印出26个小写英文字母“abcdz”。循环体可以是一条基本语句,也可以是一条复合语句。例如:for j:=1 to n dobegin readln(x);wreteln(x+1)end;循环语句的范围直到end才结束。循环控制变量不得在循环体内再被赋值。例如:for x;=1 to 10 dobegin x:=2*z+1;end;是错误的。循环控制变量的初值和终值一经确定,循环次数就确定不变了。循环的次数可用如下公式计算:0 若初值终值 递增型循环的循环次数= Ord(终值)-Ord(初值)+1 若初值终值0 若初值终值递

6、减型循环的循环次数= Ord(初值)-(终值)+1 若初值 终值 【同步练习】1宰相的麦子:相传古印度宰相达依尔,是国际象棋的发明者。有一次,国王因为他的贡献要奖励他,问他想要什么。达依尔说:“只要在国际象棋棋盘上(共64格)摆上这么些麦子就行了:第一格一粒,第二格两粒,后面一格的麦子总是前一格麦子数的两倍,摆满整个棋盘,我就感恩不尽了。”国王一想,这还不容易。于是令人扛来一袋麦子,可很快用完了,又扛来一袋,很快用完了国王很奇怪,请你帮国王计算一下,要多少麦子。(1立方米的麦子约为1.42×108粒)问题分析:对于编程类问题的描述,要特别注意正确、全面地理解题意,要学会从描述性语言中

7、抽象出具体的数据,并建立数学模型。在本题中根据“国际象棋棋盘上共有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

8、,t:integer begin s:=0; for n:=0 to 63 do s: =s+2n; t:=s/(1.42*108) writeln(s=,s,)writeln(t=,t );end. 运行示例S=1.84467441E+19T=1.29906648E+112阅读下面的程序,说明该程序的作用。程序清单program p3_1_3(input,output);var a,b,c:integer此处integer表示整型数据begingwriteln(´请任意输入一个数:´);readln(b);for c:=1 to 5 do beginread(a);if

9、a>b then b:=a; end;writeln(最后的值是:´,b:5);end.运行示例请任意输入一个数:64 7 13 8 11最后的值是:13第2节 当循环程序实例【问题描述】农场主的预算报告放暑假学校组织夏令营来到一个农场,农场主热情的接待了他们。在参观时,同学们发现在农场的左上角圈出了一块地方,这儿阳光充足,通风也不错,但却什么也没有,觉得很奇怪。农场主告诉大家因为农场四周由许多小朋友因没钱交学费而缀学,所以决定引进品种不错的雌雄一对小白兔,在这饲养。小白兔需经过一个月才能长大,长大后每个月都生雌雄一对小白兔。想等小白兔繁殖到1000对的时候,在分发给周围贫困的

10、人,希望能帮助他们重新进入课堂。现正在写一份预算报告,其中预计所需时间却却没算出来。同学们现在就让我们来帮助这位好心的农场主算出时间。【问题分析】这问题从表面来看好象没有什么规律,不妨设计一张表格来推算一下。月 份123456兔子数(对)12481632因为第一个月小白兔没长大,所以兔子数是1对。到了第二个月小白兔长大了,生了一对小白兔,兔子数是2对。第三个月小白兔也长大了,大白兔是2对,它们都生了一对小白兔,兔子数是4对。依此类推,发现除了第一个月,其它都是:前一个月的兔子数 × 2 = 本月兔子数 。我们发现这又是一个循环,直到兔子数为1000对的时候结束。可是用for语句显然不

11、行,因为我们不知道循环的次数。下面我们用当型循环(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 dobeginmonth:=month + 1;rabbit:= ra

12、bit * 2;end; writeln(The months is :,month);end.【知识拓展】1while循环语句 当型循环(while语句)是这样描述循环的:当指定条件成立时,重复执行指定的语句。格式:while 布尔表达式 do 语句;       例如:     k:=10;      WHILE k>0 DO      BEGIN      

13、0;   Writeln (k);           k:=k-1      END;      其中      (1)WHIlE 和DO是PASCAL保留关键字,是WHILE循环语句的组成部分。      (2)保留关键字DO后面的“语法”只能是一条语句,称为“循环体”;如果循环体中需要包含多个语句则应该如上例所示,采用一条

14、复合语句。2WHILE循环的执行功能当执行到WHILE语句时(1)  求出布尔表达式的值(2)若布尔表达式的值为真,则执行循环体内的语句;若为“假”,执行步骤4 (3)重复步骤1和2 (4)循环结束,执行循环后面的语句。3本例While循环的结构化流程图如下:While 布尔表达式循环体语句【同步练习】1周末小明遇到一个有趣的题目:找出四位整数abcd中满足下述关系的数:( ab + cd )( ab + cd )= abcd请你帮小明编写一个程序,找出满足条件的所有的数。问题分析:这道题属于搜索问题,因为是四位整数,不难看出范围是从10009999,所求的数究竟在哪里,无法确定,只

15、有在这个范围内从小到大一个一个进行搜索,对每一个数看它的高两位数与低两位数和的平方是否与该数相等。ab和cd 两个数可以在abcd中将高两位与低两位分离开来。我们可以这样考虑,将abcd整除100,可得到高两位ab。如:abcd=1234 , 1234 div 100 = 12。有了ab,也就可用下面的式子把低两位cd分离出来:abcd ab × 100 = abcd ab00 = cd如: 1234 12 × 100 = 1234 1200 = 34同学们仔细想想,在求解的过程中,条件都是一样的,只是abcd这个数不同。实际上是在反复做同一个步骤。下面我们用当型循环来解这

16、道题。程序清单Program xuhuan(input,output); Var i,m,n,k:integer; BeginI:=1000;给I赋值,即abcd假设一个数;While I<=9999 do 判断I(即abcd)的值是否超出范围,;如果超过则不执行循环 Begin 体中的语句,结束循环; M:=I div 100; 分离出ab和cd两个数,如果符合条件,就写出来; N:=I - m*100; K:=(m+n)*(m+n); If k=I then Writeln(符合条件的四位整数是:,I); I:=I+1 I的值加1; End;End. 运行示例符合条件的四位整数是:2

17、025符合条件的四位整数是:3025符合条件的四位整数是:98012从n个数中挑选出最大的数。问题分析:本题可以借助于古代比武的“打擂台”来比喻:先有任意一人站在擂台上,然后第二个人上来与它比武,胜者留在台上,如此反复进行下去,直到第n个人比完为止(要注意:一共比n-1次),这样最后留在台上的人肯定是最强者。设计算法:     从n个数中任选一数放在变量X中,并设一计数器m=0(这里变量X就是比武的擂台,m=0表示尚未进行比较);     将下一个数与X中的数进行比较;    

18、; 使m的值加1(计一次数);     若m的值小于(n-1),则重新进行第步,否则执行下一步;     输出此时X的值,即为n个数中的最大者;     结束。程序清单PROGRAM 323(input,output);VAR n,x,m,y:integer;BEGIN write('输入共需参加比较的总数:'); readln(n); write(先将n个数的第一个数输入给变量x); readln(x); m:=0; while m<=n-1 DO B

19、EGIN write(输入一个其他参加比较的数) readln(y); if x>=y then x:=y; m:=m+1; END;write (n , 个数中最大的是: , x);END. 运行示例输入共需参加比较的总数: 3先将n个数的第一个数输入给变量x:1输入一个其他参加比较的数2输入一个其他参加比较的数103个数中最大的是:10第3节 直到循环程序实例【问题描述】小明和小强是好朋友,他俩都喜爱数学,一个周末的下午他们进行了一场比赛,题目是这样的:任意给出两个正整数M和N,求出M和N的最大公约数,看谁算的又快又准。请你用计算机编写一程序帮助他俩又快又准的计算出M和N的最大公约数

20、。【问题分析】设用M作为被除数,N作为除数,R作为余数。这样我们就可以用辗转相除法求出M和N的最大公约数,辗转相除法的具体算法如下:第1步:输入M和N的值;第2步:求出M除以N所得的余数R;第3步:将N的值赋给M,R的值赋给N;第4步:若R=0,则M为所求得的最大公约数,转第5步,否则转第1步;第5步:输出最大公约数M的值。根据上述算法,我们可以用结构化流程(N-S)图表示该算法: 【程序设计】程序清单Program p3_3_1(input,output);varm,n,r:real;beginwrite(输入两个正整数:);readln(m,n);if n>m then b

21、egin r:=n; n:=m; m:=r;end; repeat r:=m mod n; m:=n; n:=r; until r=0;writeln(m,和,n,最大公约数是:,m)end. 运行示例输入两个正整数:112 77112和77最大公约数是:7输入两个正整数:12 3412和34最大公约数是:2【知识拓展】1在程序设计中,如果需要在执行了某操作过程之后,再根据某一指定条件判定是否重复执行,应采用直到循环语句,即repeat-until语句实现循环。此语句的含义是:“重复执行循环体,直到指定条件为真时为止”。2Repeat-until语句格式:repeat<语句>unt

22、il <布尔表达式> 它的N-S图如下图所示 。循环体语句until 布尔表达式 其中repeat 和until为保留字。 3它的执行过程:     执行循环体;     计算布尔表达式的值,若为false则返回,否则,退出循环体执行下一语句。4它的特点是:先执行(循环体),后判断(布尔表达式)。repeat-until是一个整体,它是一个语句(构造型语句),在这个句中可以包含若干个语句,不要误认为repeat是一个语句,until是一个语句;5Repeat语句与while语句都可以实现循环结构,且可以

23、相互转化,但有四点不同:Repeat 语句While语句先执行语句,后判断条件。先判断后执行语句。指定语句可以是多条语句,无需用begin 和 end。指定语句只能是一条语句或一条复合语句。当条件不成立时重复执行。当条件成立时重复执行。无论条件是否成立,总要执行一次指定语句序列。当条件一开始就不成立时,则不执行循环中的指定语句。【同步练习】1利用格里高公式求。 =1- + - +,直到最后一项的值小于10-6为止。问题分析:解本题的关键就是求右边数值序列的和,序列有明显的特点:分母是从1开始的奇数,加、减号轮流出现,因此,我们可以用n = n + 2表示序列数值的变化,用f = - f来设置它

24、们各项的符号位。画出程序的N-S图。程序清单 program ex2_34; var pai:=0; t:=1; n:=1; f:=1pai:=pai+tn:=n+2.0f:=-ft:=f/nuntil abs(t)<1e-6pai:=4*pai输出pai的值 f:integer; n,t,pai:real; begin pai:=0; t:=1; n:=1.0; f:=1; repeat pai:=pai+1; n:=n+2.0; f:=-f; t:=f/n until abs(t)<1e-6; pai:=pai*4; writln(pai=,pai:10:8); readln

25、end.运行示例pai =3.141590662输入10个数,求最大值、最小值、和及平均值。问题分析:本题要求随机连续输入10个数,我们可以用循环的特点依次比较,累加求和,最后算出平均值.设计算法:     键盘读入一个数;     这个数分别赋值给最大值max、最小值min、和s;     用repeat循环连续输入其他9个数;     在循环体内依次比较,求出最大值max、最小值min,和s;   &#

26、160; 在循环体外,由和求出平均值avg;     输出最大值max、最小值min、和s以及平均值avg。程序清单PROGRAM 333(input,output);VAR a,s,max,min,avg:real; i:integer;BEGIN write('please input:'); read(a); s:=a; max:=a; min:=a; i:=1; repeat read(a); s:=s+a; IF a>max THEN max:=a ELSE IF a<min THEN min:=a i:=i+1;

27、until i>=9 avg:=s/i;writeln(最大值是: ,max, 最小值是: , min);writeln(10个数和是: , s , 10个数平均值是: , avg:5:1 );END. 运行示例please input:1 2 3 4 5 6 7 8 9 10最大值是:10 最小值是:110个数和是:55 10个数平均值是:5.5第4节 多重循环程序实例【问题描述】一个炊事员上街采购,用500元钱买了90只鸡, 其中母鸡一只15元,公鸡一只10元,小鸡一只5元,正好把钱买完。问母鸡、公鸡、小鸡各买多少只?【问题分析】设母鸡I只 ,公鸡J只,小鸡为k只,我们可列方程组:I

28、+J+K=90 15I+10J+5K=500 显然这是一个不定方程组,一般情况下有多解。由方程可得I和J、K的取值范围:0I90,0J90,0K90我们用穷举法在范围内搜索求解。【程序设计】程序清单program ex3_4_1;var i,j,k:integer; begin for i:=0 to 90 do for j:=0 to 90 dofor k:=0 to 90 do if(i+j+k=90)AND (15*i+10*j+5*k=500)then writeln(i:5,j:5,k:5); end;运行示例 0 10 801 8 812 6 823 4 834 2 845 0 8

29、5【知识拓展】1  以上的程序是一个三重的for循环嵌套。循环体由PASCAL语句构成,当然也可以包含FOR语句,这就构成了循环的嵌套,形成多重循环。2  为了减少无用的循环次数,我们进一步研究题目,分析后,可以将循环次数缩小,这里I的值可以是0到33(因为如果500元钱全部用来买母鸡,最多可以买500/15 只),同样J的值可以从0到50。知道I和J的值,又可求出K的值为90-I-J,这样又可减少循环嵌套的层数。以上的程序可以优化为:programr ex4_6;var i,j,k:integer; begin for i:=0 to 33 do for j:=0 to

30、50 do begin k:=90-i-j; if 15*i+10*j+5*k=500 then writeln(i:5,j:5,k:5); end;end.优化后的程序运行速度会大大提高。在以后设计程序时,同学们不仅要注意如何解题,还要尽量使程序优化,提高运行速度。【同步练习】1试编写能够打印输出如下图形的程序:# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #问题分析:这道题属于打印平面图形问

31、题。程序的设计如下:由两个并列循环外加一个嵌套循环构成的。各环的作用为:1。外层循环控制打印的行数,此倒三角形共需8行,故外层循环的设置为递减型循环。2嵌套在外环内的第一个并列循环为空格输出,根据图形变化控制输出不同数量的空格。3外环内第二个并列循环为控制三角形每行中“#”号的个数。程序清单program ex2_36;var i,j,k:integer;bgin for i:=8 downto 1 do begin for j:=1 to 8 i do write(); for k:=2*i-1 downto 1 do writeln; end; readlnend. 2求s=1!+2!+3!+10!的值。问题分析:这个问题是求10自然数的阶乘之和,可以用for 循环来实现,通过10次的循环可求出1!,2!,10!,并同时累加起来, 可求得S的值。而求T=N!,又可以用一个for循环来实现,构成了二重循环。程序清单program ex4_5;var t,s:real; i,j,n:integer; begin S:=0; for n:=1 to 10 do begin t:=1; for j:=1 to n do t:=t*j; S:=S+t; end; wri

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论