首页 PASCAL教学 PASCAL教程 PASCAL练习题 基础知识 常用算法 阶段测试 初赛试题 复赛题库 FP错误代码 留言板
第一章 简单程序
第一节 程序结构和基本语句
第二节 顺序结构程序与基本数据类型
第二章 分支程序
第一节 条件语句与复合语句
第二节 情况语句与算术标准函数
第三章 循环程序
第一节 程序结构和基本语句
第二节 Repeat 循环
第三节 While 循环
第四章 函数与过程
第一节 函数
第二节 自定义过程
第五章 自定义数据类型
第一节 数组与子界类型
第二节 二维数组与枚举类型
第三节 集合类型
第四节 记录类型和文件类型
第五节 指针类型与动态数据结构
第六章 程序设计与基本算法
第一节 递推与递归算法
第二节 回溯算法
第七章 数据结构及其应用
第一节 线性表
第二节 队列
第三节 栈
第四节 数组
第八章 搜索
第一节 深度优先搜索
第二节 广度优先搜索
第九章 其他常用知识和算法
第一节 图论及其基本算法
第二节 动态规划
 
   

第三章 循环程序

在编程中经常遇到需要多次规律相同的重复处理,这就是循环问题。Turbo Pascal采用不同的循环方式来实现,常用的环循有三种:  forrepeatwhile.

 

第一节 for 循环

for循环是一种自动计数型循环。

[3.1] 试打印出1~20的自然数。

解:① a代表1~20各数,同时也用a兼作计数,以控制循环次数;

    a1开始;

    输出a

    a自动计数(加1),如果未超越所规定的循环范围则重复步骤③,否则结束循环。

Pascal程序:

Program Exam12

Var a: byte

Begin

  for a:=1 to 20 do

    Writeln (a)

  Readln

End.

 

程序中  for a:=1 to 20 do Writeln (a) for循环语句。

for 循环语句有两种格式:

(1) for 循环变量:=初值  To 终值 do 语句;    

    (2) for 循环变量:=初值 downto 终值 do 语句;

(1)种格式的初值小于等于终值,循环变量值按自动加1递增变化;

(2)种格式的初值大于或等于终值,循环变量值按自动减1递减变化。for 循环是 (以递增1或以递减1) 计数型循环。

比如: 若将[3.1]程序改为倒计数(递减)循环,则输出201的自然数数:

Program Exam31

Var a: byte

Begin

  for a:=20 downto 1 do

Writeln(a)

  Readln

End.

[3.2]打印出3060的偶数。]

解:

方法一:

 = 1 \* GB3 ①设a表示3060的所有的数,可用for循环列出;

 = 2 \* GB3 ②用式子 a mod 2=0 筛选出其中的偶数并输出。

Pascal程序:

Program ex32;

Var a       : integer;

Begin

  For a := 30 to 60 do

       If (a mod 2=0) then writeln(a);

  Readln;

End.

在这个程序中,for循环后的循环语句是一个条件分支语句。

 

方法二:我们知道,在式子a=2*n中,若n取自然数123,时,则a依次得到偶数246。因此要想得到3060的偶数,就可以让上面式子中的n1530的自然数就可以了。所以本题还可以按以下步骤处理:

 = 1 \* GB3 ①设n表示1530的所有自然数,可用for循环列出;

 = 2 \* GB3 ②用式子 a := 2*n 求出其中的偶数;

 = 3 \* GB3 ③将结果输出至屏幕。

Pascal程序:

Program ex32;

Begin

  For n := 15 to 30 do

    Begin

         a := 2*n;

         Writeln(a);

End;

         Readln;

End.

 

[3.3]自然数求和:编一个程序,求从1100的自然数的和。

解:① S0

a表示1100的自然数,用循环列出;

将这些自然数用公式S:=S+a 逐一累加到S中去;

 = 4 \* GB3 循环结束后,S即为1100的自然数的和,输出即可。

Pascal程序:

Program ex33;

var s,a : integer;

Begin

  S := 0;

  For a := 1 to 100 do

    S := S+a;

  Writeln(‘S=’,S);

  Readln;

End.

 

[3.4]一个两位数x,将它的个位数字与十位数字对调后得到一个新数y,此时y恰好比x36,请编程求出所有这样的两位数。

解:① for循环列举出所有的两位数,x为循环变量;

用公式a:= x div 10分离出x的十位数字;

用公式b:= x mod 10分离出x的个位数字;

用公式y:= b*10+a合成新数y

 = 5 \* GB3 用式子y-x=36筛选出符合条件的数x并输出。

Pascal程序:

Program ex34;

Begin

  For x := 10 to 99 do

  Begin

  a := x div 10;

  b := x mod 10;

  y := b*10+a;

  if y-x=36 then writeln(x);

End;

Readln;

End.

 

[3.5] 把整数3025从中剪开分为3025两个数,此时再将这两数之和平方,(30+25)2=3025计算结果又等于原数。求所有符合这样条件的四位数。

:设符合条件的四位数为N,它应当是一个完全平方数,用(a*a)表示。

   为了确保N=(a*a)在四位数(10009999)范围内,可确定a3299循环;

   计算N=a*a;将四位数N拆分为两个数n1n2

   若满足条件(n1+n2)*(n1+n2)N 就输出 N

Pascal程序:

Program  Exam35

Var Na xn1n2: Integer

Begin  

for a:=32 to 99 do

  begin 

N:=a*a

    n1:= N div 100     {拆取四位数的前两位数}

    n2:= N-n1*100     {拆取四位数的后两位数}

    X:=n1+n2

    if  x*x=N  then  writeln (N)

  end

  Readln

End.

 

[3.6]用“*”号打印出如下的长方形图案。

  *********

    *********

  *********

  *********

解:① 上面给出的图例共有4行,我们可以用一个循环控制行的变化;

在每行中又有9列,我们可以在前面控制行的循环中再套一个循环来控制列的变化。

Pascal程序:

Program ex36;

Begin

  For a := 1 to 4 do                      {外循环控制行的变化}

  Begin

  For b := 1 to 9 do                         {内循环控制列的变化}

    write(‘*’);

  Writeln;                                       {输出一行的“*”后换行}

End;

Readln;

End.

程序中的循环对于a的每个值都包含着一个b=(19)次的内循环。外循环for a 将内循环for b 包含在里面,称为for循环的嵌套。嵌套形式如:

             for a:=n1 to n2 do    

                 for b:=m1 to m2 do  循环体语句; 

 

[3.7] 打印出九九乘法表:

:a为被乘数,范围为19b为乘数,范围为1a;乘式为a*b=(a,b的乘积),则

   a=1:    b=1a   1*1=1

   a=2:    b=1a   2*1=2   2*2=4

   a=3:    b=1a   3*1=3   3*2=6   3*3=9

   a=4:    b=1a   4*1=4   4*2=8   4*3=13   4*4=16

               

   a=9     b=1a   9*1=9   9*2=18         9*9=81

⑴从上面分解的横行中看到共有9行,这里的“行”数变化与a的变化从19相同,可用a控制“行”的循环;

⑵每“行”里面相乘的次数与b的范围相关,由b控制每“行”里面的“内部”循环;

⑶内循环被包含在最里层,执行完每“行”的内部循环,就到下一“行”去执行新“行”里面的循环,每“行”都拥有形式相同的( b=1a )内循环。

即每到一“行”都要执行该“行”的内循环。这里所指的“行”可以理解成抽象的行,不一定是实际上具体对应的行,可以是一个处理“块”。

Pascal程序:

Program Exam37

Var ab: byte

Begin

  for a:=1 to 9 do                 {外循环 }

   begin

     for b:=1 to a do                       {内循环 }

       write(a,’* ’,b,’= ’,a*b,’  :3)

     writeln

   end

  Readln

End.

 

根据这种格式还可以实现多层循环嵌套,例如:

            for a:=n1 to n2 do    

                for b:=m1 to m2 do

                     for c:=k1 to k2 do  循环体语句; 

   

[3.8]从七张扑克牌中任取三张,有几种组合方法?请编程输出所有组合形式。

解:设每次取出三张分别为a,b,c。用三重循环分别从17的范围里取值;为了排除取到重号,用(a-b)*(b-c)*(a-c) < >0进行判断。

Pascal程序:

program Exam38;

const  n=7;

var  a,b,c,t: integer;

Begin

  t:=0;

 for a:=1 to n do

   for b:=1 to n do

         for c:=1 to n do

       if (a-b) * (b-c) * (a-c) < >0 then

           Begin

                 inc (t); 

writeln (a:3, b:3, c:3)

          End;

         writeln ( total:, t :5);

         readln

 End.

 [3.9] 数学上把除了1和它本身,没有别的数能够整除它的自然数叫做素数(或质数)。现在由键盘输入一个自然数N,编程判断N是否是素数,是则输出“Yes”,否则输出“No”。

解:根据定义,对于给定的自然数N,只需判断除1和它本身外,还有没有第三个自然数即可。

K1循环至N

根据N mod K是否为0可统计K的约数的个数;

N的约数的个数超过2个,则判定N不是素数。

Pascal程序:

Program Exam39

Var  nmkt: integer

Begin

  write(‘N=’);

  ReadLn(N);

t:=0

  for  k:=1 to N do                             {外循环 }

    if  N mod k=0 then t := t+1;                        {如果N是奇数 }

  if t>2 then writeln(‘No’)

          else writeln(‘Yes’);

  Readln;

End.

程序中的变量yse为布尔(或逻辑)类型(Boolean)。布尔值只有两个:

 True()          False(

 布尔值与条件判断结果为真(条件成立)或为假(条件不成立)的作用相同,常用于条件语句和循环语句中。

上面程序中用 if yes and (t mod 7=0) then writeln;实现每行打印七个素数换行,程序中布尔变量yes为真,在逻辑上表示是素数;关系式(t mod 7=0) 的值为真时,表示该行输出素数巳是7个;用and将这两个“条件”连起来是作一种布尔(逻辑)运算。

Pascal 共有四种逻辑运算符:

    and (两条件都为True时,其结果值为True;否则为False

    or ()   两条件中只要有一个为True ;其结果值为True;否则为False

    xor (异或) 两条件的逻辑值不相同时,其结果值为True;否则为False

    not ()   条件为True时,其结果值为False;否则为True(取反)

 

 

 

 

习题3.1:

1.打印出120的平方数表。

2.打印出100200之间的奇数。

3. 鸡兔同笼(for循环程序完成)

4.一辆快车和一辆慢车开往同一地点,快车票价为18元,慢车票价为13. 5元,共售出400张,共计5940元,求快车票和慢车票各多少张?.

5.求出能被5整除的所有四位数的和。

6.在下面式子中的二个□内填入一个合适的同样的数字,使等式成立。

3*6528=3*8256

7.有一个三位数,它的各位数字之和的11倍恰好等于它自身,请编程求出这个三位数。

8.在自然数中,如果一个三位数等于自身各位数字之立方和,则这个三位数就称为是水仙花数。如:153=13+53+33,所以153是一个水仙花数。求所有的水仙花数。

9.编程序打印出下列图案:

平行四边形            等腰三解形      菱形

  ******          *                *

   ******          ***                ***

  ******          *****              *****

 ******          *******              ***

******          *********              *

10.编程打印出如下图案:

          1

         222

        33333

       4444444

      555555555

11.有三种明信片:第一种每套一张,售价2元;第二种每套一张,售价4元; 第三种每套9张,售价2元。现用100元钱要买100张明信片,要求每种明信片至少要买一套,问三种明信片应各买几套?请输出全部购买方案。

12.某人想把一元钱换成伍分、贰分、壹分这样的零钱, 在这三种零钱中每种零钱都至少各有一个的情况下,共有多少种兑换方案。并打出这些方案。

13.

14. 输出100 以内的全部素数,要求每行显示5 个。

15.AB两个自然数的和、差、积、商四个数加起来等于243,求AB两数。

16.百钱买百鸡:今有钱100元,要买100只鸡,公鸡3元一只,母鸡1元一只,小鸡13只,若公鸡、母鸡和小鸡都至少要买1只,请编程求出恰好用完100元钱的所有的买鸡方案。


 
 

© 版权所有 桐乡市高级中学计算机组 王建献 2005-
制作与维护:
桐高计算机组 王建献 邮箱:omnislash2000@163.com
建议使用:800*600分辨率,IE5.0以上版本浏览器