信息学第四课循环语句.docx

上传人:b****8 文档编号:29237970 上传时间:2023-07-21 格式:DOCX 页数:9 大小:24.38KB
下载 相关 举报
信息学第四课循环语句.docx_第1页
第1页 / 共9页
信息学第四课循环语句.docx_第2页
第2页 / 共9页
信息学第四课循环语句.docx_第3页
第3页 / 共9页
信息学第四课循环语句.docx_第4页
第4页 / 共9页
信息学第四课循环语句.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

信息学第四课循环语句.docx

《信息学第四课循环语句.docx》由会员分享,可在线阅读,更多相关《信息学第四课循环语句.docx(9页珍藏版)》请在冰豆网上搜索。

信息学第四课循环语句.docx

信息学第四课循环语句

第四课 for循环语句

在实际应用中,会经常遇到许多有规律性的重复运算,这就需要掌握本章所介绍的循环结构程序设计。

在Pascal语言中,循环结构程序通常由三种的循环语句来实现。

它们分别为FOR循环、当循环和直到循环。

通常将一组重复执行的语句称为循环体,而控制重复执行或终止执行由重复终止条件决定。

因此,重复语句是由循环体及重复终止条件两部分组成。

    一、for语句的一般格式

  for<控制变量>:

=<表达式1>to<表达式2>do<语句>;

  for<控制变量>:

=<表达式1>downto<表达式2>do<语句>;

  其中for、to、downto和do是Pascal保留字。

表达式1与表达式2的值也称为初值和终值。

  二、For语句执行过程

  ①先将初值赋给左边的变量(称为循环控制变量);

  ②判断循环控制变量的值是否已"超过"终值,如已超过,则跳到步骤⑥;

  ③如果末超过终值,则执行do后面的那个语句(称为循环体);

  ④循环变量递增(对to)或递减(对downto)1;

  ⑤返回步骤②;

  ⑥循环结束,执行for循环下面的一个语句。

  三、说明

  ①循环控制变量必须是顺序类型。

例如,可以是整型、字符型等,但不能为实型。

  ②循环控制变量的值递增或递减的规律是:

选用to则为递增;选用downto则递减。

  ③所谓循环控制变量的值"超过"终值,对递增型循环,"超过"指大于,对递减型循环,"超过"指小于。

  ④循环体可以是一个基本语句,也可以是一个复合语句。

  ⑤循环控制变量的初值和终值一经确定,循环次数就确定了。

但是在循环体内对循环变量的值进行修改,常常会使得循环提前结束或进入死环。

建议不要在循环体中随意修改控制变量的值。

  ⑥for语句中的初值、终值都可以是顺序类型的常量、变量、表达式。

  四、应用举例

  例1.输出1-100之间的所有偶数。

    vari:

integer;

    begin

     fori:

=1to100do

     ifimod2=0thenwrite(i:

5);

    end.

  例2.求N!

=1*2*3*…*N,这里N不大于10。

  分析:

程序要先输入N,然后从1累乘到N。

  程序如下:

  var

    n,i:

integer;{i为循环变量}

    S:

longint;{s作为累乘器}

  begin

   write('Entern=');readln(n);{输入n}

  s:

=1;

   fori:

=2tondo{从2到n累乘到s中}

    s:

=s*i;

   writeln(n,'!

=',s);{输出n!

的值}

  end.

练 习

  1.求s=1+4+7+…+298的值。

  2.编写一个评分程序,接受用户输入10个选手的得分(0-10分),然后去掉一个最高分和一个最低分,求出某选手的最后得分(平均分)。

  3.用一张一元票换1分、2分和5分的硬币,每种至少一枚,问有哪几种换法(各几枚)?

第二部分 WHILE循环与REPEAT

一、WHILE循环

  对于for循环有时也称为计数循环,当循环次数未知,只能根据某一条件来决定是否进行循环时,用while语句或repeat语句实现循环要更方便。

  while语句的形式为:

  while<布尔表达式>do<语句>;

  其意义为:

当布尔表达式的值为true时,执行do后面的语句。

  while语句的执行过程为:

  ①判断布尔表达式的值,如果其值为真,执行步骤2,否则执行步骤4;

  ②执行循环体语句(do后面的语句);

  ③返回步骤1;

  ④结束循环,执行while的下一个语句。

  说明:

这里while和do为保留字,while语句的特点是先判断,后执行。

当布尔表达式成立时,重复执行do后面的语句(循环体)。

  例1、求恰好使s=1+1/2+1/3+…+1/n的值大于10时n的值。

  分析:

"恰好使s的值大于10"意思是当表达式s的前n-1项的和小于或等于10,而加上了第n项后s的值大于10。

从数学角度,我们很难计算这个n的值。

故从第一项开始,当s的值小于或等于10时,就继续将下一项值累加起来。

当s的值超过10时,最后一项的项数即为要求的n。

  程序如下:

  var

    s:

real;

    n:

integer;{n表示项数}

  begin 

   s:

=0.0;n:

=0;

   whiles<=10do{当s的值还未超过10时}

    begin

     n:

=n+1;{项数加1}

     s:

=s+1/n;{将下一项值累加到s}

    end;

   writlen('n=',n);{输出结果}

  end.

  例2、求两个正整数m和n的最大公约数。

  分析:

求两个正整数的最大公约数采用的辗转相除法求解。

以下是辗转的算法:

  分别用m,n,r表示被除数、除数、余数。

  ①求m/n的余数r.

  ②若r=0,则n为最大公约数.若r≠0,执行第③步.

  ③将n的值放在m中,将r的值放在n中.

  ④返回重新执行第①步。

  程序如下:

  programex4_4;

  varm,n,a,b,r:

integer;

  begin

    write('Inputm,n:

');

    readln(m,n);

    a:

=m;b:

=n;r:

=amodb;

    whiler<>0do

    begin

     a:

=b;b:

=r;

     r:

=amodb;

    end;

    writeln('Thegreatestcommondivideis:

',b:

8);

  end.

二、直到循环(REPEAT-until语句)

  用while语句可以实现"当型循环",用repeat-until语句可以实现"直到型循环"。

repeat-until语句的含义是:

"重复执行循环,直到指定的条件为真时为止"。

  直到循环语句的一般形式:

  Repeat

   <语句1>;

   :

   <语句n>;

  until<布尔表达式>;

  其中Repeat、until是Pascal保留字,repeat与until之间的所有语句称为循环体。

  说明:

  ①repeat语句的特点是:

先执行循环,后判断结束条件,因而至少要执行一次循环体。

  ②repeat-until是一个整体,它是一个(构造型)语句,不要误认为repeat是一个语句, until是另一个语句。

  ③repeat语句在布尔表达式的值为真时不再执行循环体,且循环体可以是若干个语句,不需用begin和end把它们包起来,repeat和until已经起了begin和end的作用。

while循环和repeat循环是可以相互转化的。

  对于例2中求两个正整数的最大公约数,程序可用repeat-until循环实现如下:

  var

    m,n,a,b,r:

integer;

  begin

   write('Inputm,n=');

   readln(m,n);

   a:

=m;b:

=n;

   repeat

    r:

=amodb;

    a:

=b;b:

=r;

   untilr=0;

   writeln('Thegreatestcommondivideis',a);

  end.

  以上我们已介绍了三种循环语句。

一般说来,用for循环比较简明,只要能用for循环,就尽量作用for循环。

只在无法使用for循环时才用while循环和repeat-until循环,而且while循环和repeat-until循环是可以互相替代的。

for循环在大多数场合也能用whiel和repeat-until循环来代替。

一般for循环用于有确定次数循环,而while和repeat-until循环用于未确定循环次数的循环。

  当一个循环的循环体中又包含循环结构程序时,我们就称之为循环嵌套。

  三、循环结构程序设计

  例3求1!

+2!

+…+10!

的值。

  分析:

这个问题是求10自然数的阶乘之和,可以用for循环来实现。

程序结构如下:

  forn:

=1to10do

  begin

   ①N!

的值àt

   ②累加N!

的值t

  end

  显然,通过10次的循环可求出1!

2!

…,10!

并同时累加起来,可求得S的值。

而求T=N!

又可以用一个for循环来实现:

  t=1;

  forj:

=1tondo

   t:

=t*j;

  因此,整个程序为:

  programex4_5;

  vart,s:

real;

    i,j,n:

integer;

  begin

   S:

=0;

   forn:

=1to10do

   begin

    t:

=1;

    forj:

=1tondo

     t:

=t*j;

    S:

=S+t;

   end;

   writeln('s=',s:

0:

0);

  end.

  以上的程序是一个二重的for循环嵌套。

这是比较好想的方法,但实际上对于求n!

,我们可以根据求出的(n-1)!

乘上n即可得到,而无需重新从1再累乘到n。

  程序可改为:

  programex4_5;

  vart,s:

real;

    i,j,n:

integer;

  begin

   S:

=0;t:

=1;

   forn:

=1to10do

   begin

    t:

=t*n;

    S:

=S+t;

   end;

   writeln('s=',s:

0:

0);

  end.

  显然第二个程序的效率要比第一个高得多。

第一程序要进行1+2+…+10=55次循环,而第二程序进行10次循环。

如题目中求的是1!

+2!

+…+1000!

,则两个程序的效率区别更明显。

  例4一个炊事员上街采购,用500元钱买了90只鸡,其中母鸡一只15元,公鸡一只10元,小鸡一只5元,正好把钱买完。

问母鸡、公鸡、小鸡各买多少只?

  分析:

设母鸡I只,公鸡J只,则小鸡为90-I-J只,则15*I+10*J+(90-I-J)*5=500,显然一个方程求两个未知数是不能直接求解。

必须组合出所有可能的i,j值,看是否满足条件。

这里I的值可以是0到33,J的值可以0到50。

  源程序如下:

  programrex4_6;

  vari,j,k:

integer;

  begin

   fori:

=1to5do

   forj:

=1to8do

    begin

     k:

=90-i-j;

     if15*i+10*j+5*k=500thenwriteln(i:

5,j:

5,k:

5);

    end;

  end.

  例5、求100-200之间的所有素数。

  分析:

我们可对100-200之间的每一整数进行判断,判断它是否为素数,是则输出。

而对于任意整数i,根据素数定义,我们从2开始,到,找i的第一个约数。

若找到第一个约数,则i必然不是素数。

否则i为素数。

  源程序如下:

  var

    i:

integer;

    x:

integer;

  begin

   fori:

=100to200do

    begin

     x:

=2;

     while(x<=trunc(sqrt(i)))and(imodx<>0)do

      begin

       x:

=x+1;

      end;

     ifx>trunc(sqrt(i))thenwrite(i:

8);

    end;

  end.

练 习

  1、输入一个正整数n,将n分解成质因子幂的乘积形式。

     例如:

36=22*32

  2、输出如下图形。

    

  3、编写一程序,验证角谷猜想。

所谓的角谷猜想是:

"对于任意大于1的自然数n,若n为奇数,则将n变为3*n+1,否则将n变为n的一半。

经过若干次这样的变换,一定会使n变为1。

"

  4.有一堆100多个的零件,若三个三个数,剩二个;若五个五个数,剩三个;若七个七个数,剩五个。

请你编一个程序计算出这堆零件至少是多少个?

提示:

万年历的相关数学知识

由于每年有365.2425天,所以400年共有365.2425*400天。

如果以365天作为一年,每400年就少了97天。

这97天就要靠设置闰年(每年366天)来凑齐,所以每400年设置97个闰年。

确定闰年的方法是:

A、年份的末尾两位数字,如果不能为00,且被4整除,则是闰年。

B、年份的末尾两位数字如果为00,且年份前两位数字被4整除,则该年为闰年。

推导出万年历公式:

S=(N-1)+(N-1)/4-(N-1)/100+(N-1)/400+C

其中N为公元年数;C为从元旦算起的日期数。

一般取C=1

而S/7的余数是星期几。

[较难习题,希望有能力的学生去做]

适用方法

(1)A、B、C、D四个学生参加了一次计算机比赛,别的同学想知道他们当中谁获得第一名。

结果他们却说以下几句话:

A说:

B不是第一名,D是第一名。

B说:

我不是第一名,C是第一名。

C说:

A不是第一名,B是第一名。

D说:

我不是第一名。

辅导老师听后说了,他们每人说的不是全对就是全错。

你知道谁获得第一?

(B是第一)

(2)打印字母塔,图形如下

输入行数(奇数),例如7,得出上述图形。

(3)求出100——9999所有的绝对素数,并统计个数。

绝对素数的定义:

首先本身为素数,当从低位向前截去一位、两位、三位……后该素数余下的数字仍然是素数。

例如2333是个素数,当233,23,2均为素数时,则2333是绝对素数。

(4)有52张纸牌,全部正面朝上,从第二张开始,凡是2的倍数的位置上的纸牌翻转一次。

接着从第三张纸牌开始,凡是3的倍数的位置上的纸牌翻转一次。

依次类推,当第一张翻的纸牌超过52时为止。

统计正面朝上的纸牌位置。

“思考题”

(5)在一个瓶中装有80毫升化学溶剂,实验中需准确地平分成两份,没有量具,只有两个分别为50毫升和30毫升的杯子。

设计一程序,将溶剂平分成两个40毫升。

以最少的步骤给出答案。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 职高对口

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1