第四单元  PASCAL语言程序设计
在上一册教材中,我们已经初步了解了PASCAL语言的三种基本结构、程序设计的基本思想和方法。本单元是在上册内容的基础上进一步深入学习PASCAL语言的数组、子程序、字符串处理等基础知识。随着学习的深入,程序设计的题目类型越来越广泛,难度也越来越大,程序设计者不能“完全”把求解的任务推给计算机,而应对题目作较充分的分析,用较优的算法去求解,因此在计算机上编程解题是一项极好的实践活动,它可以训练观察能力、逻辑思维能力、形式化描述问题能力、规划能力、动手动脑分析问题和解决问题的能力。
第一课  循环结构的程序设计
在程序设计中,经常处理一些需要重复执行某些操作的问题,这就需要循环结构程序设计,循环结构是程序设计的三种基本结构之一,循环结构是指当某个条件满足时反复执行某些语句,否则不执行。利用循环结构,使得我们能用少而精的程序编码,来完成大量的重复计算。
在Pascal语言中,实现循环程序设计的主要语句有For语句(计数循环)、While语句(当型循环)、Repeat语句(直到型循环)。上册教材已经介绍了For语句,本节课介绍While语句、Repeat语句及多重循环结构。
一、 While语句结构
For循环语句适用于已知次数的循环结构,而在实际的问题中,有时我们并不能确切知道循环要执行多少次,我们判断是否结束循环的依据是某个条件是否满足,比如“当……时就做……”,或者是“一直做到……时为止”,这种循环我们称之为条件循环。在Pascal中条件循环语句有两种,分别是While循环语句和Repeat循环语句。下面分别介绍这两种语句的使用方法。
While语句用于“当满足某一条件时进行循环”的情况,因此它也被称为“当型循环”。While语句的语法格式如下:
    While  <布尔表达式>  do  <循环体语句>;
While循环语句的执行流程如图1-1-1所示。
图1-1-1 While循环语句执行流程
While语句使用说明:
(1)当布尔表达为true则执行循环体,若为false,则根本不进入循环体;
(2)如果一开始布尔表达式的值就为假时,While循环就会一次循环体都不执行;
(3)相反的,如果布尔表达式永远是真的,那么循环就无法结束,从而成为“死循环”,为了避免这种情况的发生,在循环体中就一定要有能改变布尔表达式结果的操作;
(4)循环体中的语句一般情况下是多条语句,必须使用begin和end将它们括起来形成一条复合语句。
[例1] 计算S=1+3+5+……+n(n为大于1的奇数)
程序如下:
program ex1_1;
var
  odds,n,sum:integer;
begin
  write(‘input a odd data:’);readln(n);
  sum:=0; odds:=1;
  while odds<=n do
    begin
      sum:=sum+odds;
      odds:=odds+2;
    end;
  writeln(sum);
end.
[例2] 输入若干个字符,它的终止符是“?”,计算输入的字符中字母“a”出现的次数(包括大小写)。
程序如下:
program ex1_2;
var
  ch:char;
  i:integer;
begin
  i:=0;
  read(ch);
  while ch<>’?’ do
    begin
      if  (ch=’a’) or (ch=’A’)
        then i:=i+1;
      read(ch);
    end;
  writeln(‘i=’,i)
end.
在执行时,每当输入的字符为“a”或“A”时,则将变量i原有的值加上1再赋给i,相当于使i在原有的基础上加1。当输入一个“?”的时候,循环条件不成立,循环结束,输出结果。在本程序中,输入数据“?”就是循环结束的标志,这种在程序中人为设置循环结束条件的方法我们将它叫作结束标志法,在设计循环结构程序时经常要用到这种方法。
二、 Repeat语句结构
Repeat语句与While语句正好相反,Repeat语句用于“重复执行循环体,一直到指定的条件为真时为止”的循环结构,它又被称为“直到型循环”。
Repeat语句的语法格式为:
repeat
      循环体语句
until 布尔表达式;
Repeat循环语句的执行流程如图1-2-1所示。
图1-2-1 Repeat循环语句执行流程
Repeat语句使用说明:
1、先执行循环体,然后判断布尔表达式的值,为false,则继续循环,为true则终止循环;
2、为了使repeat循环重复能终止,与while循环一样,循环体中一定要有影响布尔表达式值的操作,否则该循环就是一个死循环;
3、repeat语句的特点是:先执行循环,后判断结束条件,因而至少要执行一次循环体;
4、repeat-until是一个整体,它是一个(构造型)语句,不要误认为repeat是一个语句,until是另一个语句;
5、repeat循环体可以是若干个语句,不需用begin和end。
另外需要说明的是,由于while循环与repeat语句都属于条件循环语句,因此一般可以将这两种语句互相转换,而具体使用哪条语句时要看实际情况决定。
[例3] 利用泰勒公式求e的值,直到最后一项小于10-7为止。泰勒公式如下:
e=1+1/1!+1/2!+1/3!+ ……+1/n!
分析:逐步往后递推,直到最后一项小于10-7为止。
程序如下:
program ex1-3;
var
  e,p:real;
  i:longint;
Begin
  e:=1;p:=1;i:=1;
  repeat
    p:=p/i;
    e:=e+p;
    i:=i+1
  until p<1e-7;
  writeln(‘e=’,e);
end.
[4] 求两个正整数mn的最大公约数。
分析:求两个正整数的最大公约数采用的辗转相除法求解。以下是辗转的算法:
分别用m,n,r表示被除数、除数、余数。
①求m/n的余数r
②若r=0,n为最大公约数,r0,执行第③步;
③将n的值放在m字符常量与字符串常量的区别,r的值放在n中;
④返回重新执行第①步。
程序如下:
program ex1_4;
var
m,n,,r : integer;
begin
write('Input m,n='); readln(m,n);
repeat
r:=m mod n;
m:=n;n:=r;
until r=0;
writeln('The greatest common divide is',m);
end.
三、多重循环结构
前面学习的循环结构都是由单一重复语句构成,即循环体部分不再是循环语句,我们把它称之为单重循环。事实上,当一个循环体语句的循环体中包含另一个循环语句时,就构成了多重循环,我们也称之为循环语句的嵌套结构。
由嵌套的层数分别称之为双重循环、三重循环等,处于内部的循环称为内循环,处于外部的循环称为外循环,在循环的嵌套结构中,读者应牢牢掌握其执行过程满足“外层循环执行一次,内层循环执行一遍”的规律。
设计多重循环时,要特别注意内、外循环之间的关系,以及各语句安放的位置,内外循环控制变量不得同名,多重循环的执行次数为各层循环执行次数的乘积。
[例5] 用多重循环求100999之间的所有水仙花数,所谓水仙花数,是该数等于它各位数字的立方和,例如:153=13+33+53
分析:根据题意,我们可以利用循环枚举三个数位上的数字,采用三重循环来求解,由于循环次数一定,用for循环最为简单,程序如下:
program ex1_5;
var
  a,b,c:integer;
begin
  for a:=1 to 9 do
    for b:=0 to 9 do
      for c:=0 to 9 do
        if a*a*a+b*b*b+c*c*c=a*100+b*10+c
          then write(a*100+b*10+c:6);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。