freepascal入门-循环结构程序

freepascal入门-循环结构程序

ID:8978659

大小:121.00 KB

页数:24页

时间:2018-04-13

上传者:U-5734
freepascal入门-循环结构程序_第1页
freepascal入门-循环结构程序_第2页
freepascal入门-循环结构程序_第3页
freepascal入门-循环结构程序_第4页
freepascal入门-循环结构程序_第5页
资源描述:

《freepascal入门-循环结构程序》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

循环结构程序设计第1节For循环程序实例【问题描述】计算一副扑克牌的点数,其中牌A为1点,牌J、Q、K分别为11、12、13点,大、小王不算点。【问题分析】根据题意,要计算一副扑克牌的点数,可以先求出一种花色牌的点数和,再乘以4即可。进一步分析,求一种花色牌的点数和,即是求1~13的连续自然数之和。我们用S表示所求数的和,用T表示加数,这样可以让T从1变化到13,每次让T不断加入到S中,就可以求出S的值,最后乘以4即可。【算法设计】u        自然语言①置初值,即S=0,T=1;②使S=S+T,所求出的和仍放入S中;③使T增加1,即T=T+1;④如果T小于等于13,转第二步,否则转第五步;⑤输出计算结果。u        程序流程图和结构化流程(N-S)图  【程序设计】[程序清单]programex3_1;vars,t:integer;begins:=0;{S置初值为0}fort:=1to13do{For循环语句}s:=s+t;writeln(‘total:’,s*4);end.[运行示例]total:364【知识拓展】1.在程序处理过程中,经常需要对某一条或一组语句重复执行多次,以最终完成某项任务,这就是循环。对于重复次数已知,而不依赖循环中语句的结果,常用计数循环(for/to/do语句)。2.for循环语句格式:格式一:for控制变量:=初值to终值do循环体语句; 格式二:for控制变量:=初值downto终值do循环体语句;其中for、to、downto、do为保留字,do后面的语句称为循环体。其中循环控制变量可以是整型、字符或布尔型,但不能为实型。一般地,可以是顺序类型数据。初值、终值表达式通常要与控制变量的类型相同。在for语句中如果使用的是to,称为递增型计数循环语句,如果使用的是downto,称为递减型计数循环语句。3.For语句的执行过程:①先将初值表达式的值计算出来并赋给循环控制变量。②判断循环控制变量的值是否已“超过”终值(对于递增型循环来说,“超过”是指“大于”;对递减型循环来说,“超过”是指“小于”)。如已超过,则跳到步骤⑥。③如果未超过终值,则执行do后面的语句(称为循环体)。④循环变量递增(或递减)。⑤返回执行步骤②。⑥循环结束,执行for循环下面的一个语句4.使用For语句的的注意事项:①循环控制变量必须为顺序类型。例如,可以是整型、字符型、布尔型,不能为实型,如:fori=3.5to8.5dowrite(i)是错误的。②循环控制变量的值递增或递减的规律是:若是递增型循环,则按Succ函数规律变化;若是递减型循环,则按Pred函数规律变化。例如:fork:=’a’to’z’dowrite(k)将按顺序打印出26个小写英文字母“abcd…z”。③循环体可以是一条基本语句,也可以是一条复合语句。例如:forj:=1tondo beginreadln(x);wreteln(x+1)end;循环语句的范围直到end才结束。④循环控制变量不得在循环体内再被赋值。例如:forx;=1to10dobeginx:=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+……+2631立方米的麦子约为1.42×108粒,那么S粒麦子的体积T为:T=S/(1.42×108)立方米。这样我们将问题转化为一般数学模型,再根据数学模型写出算法设计,再写出具体程序就水道渠成。[程序清单]programp3_1_2(input,output);varn,s,t:integerbegins:=0;forn:=0to63dos:=s+2^n;t:=s/(1.42*10^8)writeln(‘s=’,s,)writeln(‘t=’,t);end.[运行示例] S=1.84467441E+19T=1.29906648E+112.阅读下面的程序,说明该程序的作用。[程序清单]programp3_1_3(input,output);vara,b,c:integer{此处integer表示整型数据}begingwriteln(´请任意输入一个数:´);readln(b);forc:=1to5dobeginread(a);ifa>bthenb:=a;end;writeln(‘最后的值是:‘´,b:5);end.[运行示例]请任意输入一个数:6↙4↙7↙13↙8↙11↙最后的值是:13第2节当循环程序实例【问题描述】 农场主的预算报告放暑假学校组织夏令营来到一个农场,农场主热情的接待了他们。在参观时,同学们发现在农场的左上角圈出了一块地方,这儿阳光充足,通风也不错,但却什么也没有,觉得很奇怪。农场主告诉大家因为农场四周由许多小朋友因没钱交学费而缀学,所以决定引进品种不错的雌雄一对小白兔,在这饲养。小白兔需经过一个月才能长大,长大后每个月都生雌雄一对小白兔。想等小白兔繁殖到1000对的时候,在分发给周围贫困的人,希望能帮助他们重新进入课堂。现正在写一份预算报告,其中预计所需时间却却没算出来。同学们现在就让我们来帮助这位好心的农场主算出时间。【问题分析】这问题从表面来看好象没有什么规律,不妨设计一张表格来推算一下。月份123456……兔子数(对)12481632……因为第一个月小白兔没长大,所以兔子数是1对。到了第二个月小白兔长大了,生了一对小白兔,兔子数是2对。第三个月小白兔也长大了,大白兔是2对,它们都生了一对小白兔,兔子数是4对……。依此类推,发现除了第一个月,其它都是:前一个月的兔子数×2=本月兔子数。我们发现这又是一个循环,直到兔子数为1000对的时候结束。可是用for语句显然不行,因为我们不知道循环的次数。下面我们用当型循环(while/do语句)来编写程序。农场主的预算可以描述如下:月份:=1;兔子数:=1;{预定义第一个月的兔子数是1对}while兔子数<1000do{当兔子数小于1000对时进入循环}begin月份:=月份+1;兔子数:=兔子数*2;end; 【程序设计】[程序清单]programp4-1(input,output);varmonth,rabbit:integer;beginmonth:=1;rabbit:=1;whilerabbit<1000dobeginmonth:=month+1;rabbit:=rabit*2;end;writeln(‘Themonthsis:’,month);end.【知识拓展】1.while循环语句当型循环(while语句)是这样描述循环的:当指定条件成立时,重复执行指定的语句。格式:while布尔表达式do语句;      例如:    k:=10;    WHILEk>0DO    BEGIN         Writeln(k);        k:=k-1    END;    其中    (1)WHIlE和DO是PASCAL保留关键字,是WHILE循环语句的组成部分。    (2)保留关键字DO后面的“语法”只能是一条语句,称为“循环体”;如果循环体中需要包含多个语句则应该如上例所示,采用一条复合语句。2.WHILE循环的执行功能当执行到WHILE语句时(1) 求出布尔表达式的值(2)若布尔表达式的值为真,则执行循环体内的语句;若为“假”,执行步骤4(3)重复步骤1和2(4)循环结束,执行循环后面的语句。。3.本例While循环的结构化流程图如下:While布尔表达式循环体语句【同步练习】1.周末小明遇到一个有趣的题目:找出四位整数abcd中满足下述关系的数:(ab+cd)(ab+cd)=abcd请你帮小明编写一个程序,找出满足条件的所有的数。问题分析: 这道题属于搜索问题,因为是四位整数,不难看出范围是从1000~9999,所求的数究竟在哪里,无法确定,只有在这个范围内从小到大一个一个进行搜索,对每一个数看它的高两位数与低两位数和的平方是否与该数相等。ab和cd两个数可以在abcd中将高两位与低两位分离开来。我们可以这样考虑,将abcd整除100,可得到高两位ab。如:abcd=1234,1234div100=12。有了ab,也就可用下面的式子把低两位cd分离出来:abcd-ab×100=abcd-ab00=cd如:1234-12×100=1234-1200=34同学们仔细想想,在求解的过程中,条件都是一样的,只是abcd这个数不同。实际上是在反复做同一个步骤。下面我们用当型循环来解这道题。[程序清单]Programxuhuan(input,output);Vari,m,n,k:integer;BeginI:=1000;{给I赋值,即abcd假设一个数;}WhileI<=9999do{判断I(即abcd)的值是否超出范围,;如果超过则不执行循环Begin体中的语句,结束循环;}M:=Idiv100;{分离出ab和cd两个数,如果符合条件,就写出来;}N:=I-m*100;K:=(m+n)*(m+n);Ifk=IthenWriteln(‘符合条件的四位整数是:’,I);I:=I+1{I的值加1;}End;End.[运行示例] 符合条件的四位整数是:2025符合条件的四位整数是:3025符合条件的四位整数是:98012.从n个数中挑选出最大的数。问题分析:本题可以借助于古代比武的“打擂台”来比喻:先有任意一人站在擂台上,然后第二个人上来与它比武,胜者留在台上,如此反复进行下去,直到第n个人比完为止(要注意:一共比n-1次),这样最后留在台上的人肯定是最强者。设计算法:①    从n个数中任选一数放在变量X中,并设一计数器m=0(这里变量X就是比武的擂台,m=0表示尚未进行比较);②    将下一个数与X中的数进行比较;③    使m的值加1(计一次数);④    若m的值小于(n-1),则重新进行第②步,否则执行下一步⑤;⑤    输出此时X的值,即为n个数中的最大者;⑥    结束。[程序清单]PROGRAM323(input,output);VARn,x,m,y:integer;BEGINwrite('输入共需参加比较的总数:');readln(n);write(‘先将n个数的第一个数输入给变量x’);readln(x);m:=0; whilem<=n-1DOBEGINwrite(‘输入一个其他参加比较的数’)readln(y);ifx>=ythenx:=y;m:=m+1;END;write(n,‘个数中最大的是:’,x);END.[运行示例]输入共需参加比较的总数:3先将n个数的第一个数输入给变量x:1输入一个其他参加比较的数2输入一个其他参加比较的数103个数中最大的是:10第3节直到循环程序实例【问题描述】小明和小强是好朋友,他俩都喜爱数学,一个周末的下午他们进行了一场比赛,题目是这样的:任意给出两个正整数M和N,求出M和N的最大公约数,看谁算的又快又准。请你用计算机编写一程序帮助他俩又快又准的计算出M和N的最大公约数。【问题分析】设用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)图表示该算法: 【程序设计】[程序清单]Programp3_3_1(input,output);varm,n,r:real;beginwrite(‘输入两个正整数:‘);readln(m,n);ifn>mthenbeginr:=n;n:=m;m:=r;end;repeat r:=mmodn;m:=n;n:=r;untilr=0;writeln(m,’和’,n,’最大公约数是:’,m)end.[运行示例]输入两个正整数:11277112和77最大公约数是:7输入两个正整数:123412和34最大公约数是:2【知识拓展】1.在程序设计中,如果需要在执行了某操作过程之后,再根据某一指定条件判定是否重复执行,应采用直到循环语句,即repeat-until语句实现循环。此语句的含义是:“重复执行循环体,直到指定条件为真时为止”。2.Repeat-until语句格式:repeat<语句>until<布尔表达式>它的N-S图如下图所示。循环体语句until布尔表达式 其中repeat和until为保留字。3.它的执行过程:①    执行循环体;②    计算布尔表达式的值,若为false则返回①,否则,退出循环体执行下一语句。4.它的特点是:先执行(循环体),后判断(布尔表达式)。repeat-until是一个整体,它是一个语句(构造型语句),在这个句中可以包含若干个语句,不要误认为repeat是一个语句,until是一个语句;5.Repeat语句与while语句都可以实现循环结构,且可以相互转化,但有四点不同:Repeat语句While语句先执行语句,后判断条件。先判断后执行语句。指定语句可以是多条语句,无需用begin和end。指定语句只能是一条语句或一条复合语句。当条件不成立时重复执行。当条件成立时重复执行。无论条件是否成立,总要执行一次指定语句序列。当条件一开始就不成立时,则不执行循环中的指定语句。【同步练习】1.利用格里高公式求π。=1-+-+…,直到最后一项的值小于10-6为止。问题分析:解本题的关键就是求右边数值序列的和,序列有明显的特点:分母是从1开始的奇数,加、减号轮流出现,因此,我们可以用n=n+2表示序列数值的变化,用f=-f来设置它们各项的符号位。画出程序的N-S图。[程序清单]programex2_34; varpai:=0;t:=1;n:=1;f:=1pai:=pai+tn:=n+2.0f:=-ft:=f/nuntilabs(t)<1e-6pai:=4*pai输出pai的值f:integer;n,t,pai:real;beginpai:=0;t:=1;n:=1.0;f:=1;repeatpai:=pai+1;n:=n+2.0;f:=-f;t:=f/nuntilabs(t)<1e-6;pai:=pai*4;writln(‘pai=’,pai:10:8);readlnend.[运行示例]pai=3.141590662.输入10个数,求最大值、最小值、和及平均值。问题分析:本题要求随机连续输入10个数,我们可以用循环的特点依次比较,累加求和,最后算出平均值.设计算法:①    键盘读入一个数; ②    这个数分别赋值给最大值max、最小值min、和s;③    用repeat循环连续输入其他9个数;④    在循环体内依次比较,求出最大值max、最小值min,和s;⑤    在循环体外,由和求出平均值avg;⑥    输出最大值max、最小值min、和s以及平均值avg。[程序清单]PROGRAM333(input,output);VARa,s,max,min,avg:real;i:integer;BEGINwrite('pleaseinput:');read(a);s:=a;max:=a;min:=a;i:=1;repeatread(a);s:=s+a;IFa>maxTHENmax:=aELSEIFa=9avg:=s/i; writeln(‘最大值是:’,max,‘最小值是:’,min);writeln(‘10个数和是:’,s,‘10个数平均值是:’,avg:5:1);END.[运行示例]pleaseinput:12345678910最大值是:10最小值是:110个数和是:5510个数平均值是:5.5第4节多重循环程序实例【问题描述】一个炊事员上街采购,用500元钱买了90只鸡,其中母鸡一只15元,公鸡一只10元,小鸡一只5元,正好把钱买完。问母鸡、公鸡、小鸡各买多少只?【问题分析】设母鸡I只,公鸡J只,小鸡为k只,我们可列方程组:I+J+K=90①15I+10J+5K=500②显然这是一个不定方程组,一般情况下有多解。由方程①可得I和J、K的取值范围:0≤I≤90,0≤J≤90,0≤K≤90我们用穷举法在范围内搜索求解。【程序设计】[程序清单]programex3_4_1;vari,j,k:integer; beginfori:=0to90doforj:=0to90dofork:=0to90doif(i+j+k=90)AND(15*i+10*j+5*k=500)thenwriteln(i:5,j:5,k:5);end;[运行示例]0108018812682348342845085【知识拓展】1. 以上的程序是一个三重的for循环嵌套。循环体由PASCAL语句构成,当然也可以包含FOR语句,这就构成了循环的嵌套,形成多重循环。2. 为了减少无用的循环次数,我们进一步研究题目,分析后,可以将循环次数缩小,这里I的值可以是0到33(因为如果500元钱全部用来买母鸡,最多可以买500/15只),同样J的值可以从0到50。知道I和J的值,又可求出K的值为90-I-J,这样又可减少循环嵌套的层数。以上的程序可以优化为:programrex4_6;vari,j,k:integer;begin fori:=0to33doforj:=0to50dobegink:=90-i-j;if15*i+10*j+5*k=500thenwriteln(i:5,j:5,k:5);end;end.优化后的程序运行速度会大大提高。在以后设计程序时,同学们不仅要注意如何解题,还要尽量使程序优化,提高运行速度。【同步练习】1.试编写能够打印输出如下图形的程序:################################################################问题分析:这道题属于打印平面图形问题。程序的设计如下:由两个并列循环外加一个嵌套循环构成的。各环的作用为:1。外层循环控制打印的行数,此倒三角形共需8行,故外层循环的设置为递减型循环。 2.嵌套在外环内的第一个并列循环为空格输出,根据图形变化控制输出不同数量的空格。3.外环内第二个并列循环为控制三角形每行中“#”号的个数。[程序清单]programex2_36;vari,j,k:integer;bginfori:=8downto1dobeginforj:=1to8–idowrite(‘’);fork:=2*i-1downto1dowriteln;end;readlnend.2.求s=1!+2!+3!+……+10!的值。问题分析:这个问题是求10自然数的阶乘之和,可以用for循环来实现,通过10次的循环可求出1!,2!…,10!,并同时累加起来,可求得S的值。而求T=N!,又可以用一个for循环来实现,构成了二重循环。[程序清单]programex4_5;vart,s:real;i,j,n:integer; beginS:=0;forn:=1to10dobegint:=1;forj:=1tondot:=t*j;S:=S+t;end;writeln('s=',s:0:0);end.3.求100~999中的水仙花数。(若三位数ABC,ABC=A3+B3+C3,则称ABC为水仙花数。例如153,13+53+33=1+125+27=153,则153是水仙花数。)问题分析:根据题意,采用三重循环来求解。由于循环次数一定,用for循环最为简单。[程序清单]programex2_35_1;vara,b,c:integer;beginfora:=1to9doforb:=0to9doforc:=0to9doifa*a*a+b*b*b+c*c*c=a*100+b*10+cthenwrite(a*100+b*10+c:6);readln end.[运行示例]1533703714074.四个学生上地理课,回答我国四大谈水湖大小时这样说:甲:“最大洞庭湖,最小洪泽湖,鄱阳湖第三。”乙:“最大洪泽湖,最小油庭湖,鄱阳湖第二,太湖第三。”丙:“最小洪泽湖,油庭湖第三。”丁:“最大鄱阳湖,最小太湖,洪泽湖第二,洞庭湖第三。”对于每个湖的大小,每个学生仅答对一个,请编程确定四个湖的大小。问题分析:这是一个逻辑判断题,每个湖的大小都不一样,因此把它们数学化,每个湖必取得1~4里的一个整数,这个整数变代表它们名自的大小。由于循环的次数已经确定,所以采用for循环,用一个三重循环。[程序清单]programex2_39;vardong,hong,bo,tai:integer;beginfordong:=1to4doforhong:=1to4doifhong<>dongthenforbo:=1to4doif(hong<>bo)ana(bo<>dong)thenbegintai:=10-hong-bo;if(ord(dong=1)+ord(hong=4)+ord(bo=3)=1)and (ord(hong=1)+ord(dong=4)=ord(bo=2)+ord(tai=3)and(ord(dong=3)+ord(hong=4)=1)and(ord(bo=1)+ord(tai=4)+ord(hong=2)+ord(dong=3)=1)andthenwriteln(‘dong:’,dong,’hong:,’bo:’,tai:’,tai);end;readlnend.[运行示例]dong:2hong:4bo:1tai:3

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭