c语音学习----循环结构程序设计(1)

来源:互联网 发布:日本教科书知乎 编辑:程序博客网 时间:2024/05/27 02:29
  1. while语句

while语句最简单的情况为循环体只有一个语句,其形式如下:

      while(表达式)语句;

但是,while语句通常使用更复杂的形式,也就是其一般形式:

       while(表达式)

      {

           语句序列;

      }



其中表达式是循环条件,语句序列为循环体。其执行过程是:先计算while后面圆括号内表达式的值,如果其值为真(非0),则执行语句序列(循环体),然后再计算while后面圆括号内表达式的值,并重复上述过程,直到表达式的值为“假”(值为0)时,退出循环,并转入下一语句去执行。

While循环的执行流程如图6-1所示。

使用while语句时,需注意如下几个问题:

(1)while语句的特点是先判断表达式的值,然后根据表达式的值决定是否执行循环体中的语句,因此,如果表达式的值一开始就为“假“,则循环体将一次也不执行。

(2)当循环体由多条语句组成时,必须用左、右花括号括起来,使其形成复合语句。如:

 while(x>0)

  1.       {

        s+=x

        x--;

    }

    (3)为了使循环最终能够结束,而不至于使循环体语句无穷执行,即产生“死循环”。因此,每执行一次循环体,条件表达式的值都应该有所变化,这既可以在表达式本身中实现,也可以在循环体中实现。


   【例6-1】利用while语句,编写程序,求1+2+3+…+100的值。

   main()

{

int i=1, sum=0;       /*i的初值为1,sum的初值为0*/

while(i<=100)         /*当i小于或等于100时执行循环体*/

{

  sum=sum+i;          /*在循环体中累加一次,i增加1*/

  i=i+1;                /*在循环体中i增加1*/

}       

printf("sum=%d\n",sum);

}

注意:

  1. 如果在第一次进入循环时,while后圆括号内表达式的值为0,循环一次也不执行。在本程序中,如果i的初值大于100将使表达式i<=100的值为0,循环体不执行。

  2. 在循环体中一定要有使循环趋向结束的操作,以上循环体内的语句i=i+1使i不断增加1,当i>100时循环结束。如果没有这一语句,则i的值始终不变,循环将无限进行。

  3. 在循环体中,语句的先后位置必须符合逻辑,否则将会影响运算结果,例如,若将上例中的While循环体改写成:

    while(i<=100)

    {   i++;         /*先计算i++,后计算sum的值*/

        sum=sum+i;

    }

    运行后,将输出:

    sum=5150

    运行的过程中,少加了第一项的值1,而多加了最后一项的值101。


 【例6-2】利用while语句,计算1+1/2+1/4+…+1/50的值,并显示出来。

#include“stdio.h”

main()

{

float sum=1;

int  i=2;

while (i<=50)

{

sum +=1/(float) i;

i+=2;

}

printf("sum=%f",sum);

}   

运行结果:

sum=2.907979

   注意:在此程序中,在循环体中进行累加计算时,必须要对变量i进行强制类型转换,即利用(float)i使其变为浮点型中间变量后再参加运算,否则,由于i中存放的是大于1的整型量,所以,1/i将按整型规则运算,其结果总是为0。


2.do-while循环语句

  1.      do-while循环结构的形式如下:

           do

              语句序列(循环体);

           while(表达式);

          例如:

            do

            {

              i++;

              s+=i;

         }

       while(i<10);

    说明:

  1. do是C语言的关键字,必须与while联合使用。

  2. do-while循环由do开始,用while结束。必须注意的是:在while(表达式)后的“;”不可丢,它表示do-while语句的结束。

  3. while后一对圆括号中的表达式,可以是C语言中任意合法的表达式。由它控制循环是否执行。

按语法,在do和while之间的循环体只能是一条可执行语句。若循环体内需要多个语句,应该用大括号括起来,组成复合语句。

do-while 循环的执行过程是这样的(如图6-3所示):

  1. 执行do后面循环体中的语句。

  2. 计算While后面一对圆括号中表达式的值。当值为非零时,转去执行步骤1;当值为零时,执行步骤(3)。

  3. 退出do-while循环。

    由do-while构成的循环与while循环十分相似,它们之间的主要区别是: while循环结构的判断控制出现在循环体之前,只有当 while后面表达式的值为非零时,才能执行循环体;在do-while构成的循环结构中,总是先执行一次循环体,然后再求表达式的值,因此,无论表达式的值是零还是非零,循环体至少要被执行一次。


【例6-3】利用do-while语句,编写程序,求1+2+3+…+100的值。

根据do-while循环的结构,先画出流程图,见图6-4((a)是传统流程图,(b)是N-S图)。


程序如下:

#include"stdio.h"

main()

{

int i=1,sum=0;

do

{

sum=sum+i;

i=i+1;

}while(i<=100);

printf("sum=%d\n",sum);

}

使用do-while语句应注意如下几个问题:

  1. 由于do-while语句是先执行一次循环体,然后再判断表达式的值。所以,无论一开始表达式的值为“真”还是为“假”,循环体中的语句都至少被执行一次,这一点同while语句是有区别的。

  2. 如果do-while语句的循环体部分是由多个语句组成的话,则必须用左、右花括号括起来,使其形成复合语句。

  3. C语言中的do-while语句是在表达式的值为真时重复执行循环体,这一点与别的语言中类似语句有区别,在程序设计时应引起注意。


【例6-4】 利用do-while语句计算1+1/2+1/4++1/50的值,并显示出来。

main()

{

int i=2;      

float sum=1;

do

{

sum+=1/(float)i;

i+=2;

}while(i<=50);

printf("sum=%f\n",sum);

}

在一般情况下,用while语句和do-while语句处理同一问题时,若二者的循环体部分是一样的,它们的结果也一样。如例6-1和例6-3中的循环体是相同的,得到的结果也相同。但在while后面的表达式一开始就为假(0值)时,两种循环的结果是不同的。



【例6-5】while和do-while循环的比较

main()                                       main()

{                                            {

int sum=0,i;                                  int sum=0,i;

scanf("%d",&i);                               scanf("%d",&i);

while(i<=10)                                  do

{                                             {

sum=sum+i;                                    sum=sum+i;

i++;                                          i++;

}                                              }while(i<=10);

printf("sum=%d\n",sum);                        printf("sum=%d\n",sum);

}                                             }



3、for语句

for语句构成的循环通常称为for循环。for循环的一般形式如下:

for(表达式1;表达式2;表达式3)

     循环体;

for其后的圆括号中通常含有3个表达式,各表达式之间用“;”隔开。这三个表达式可以是任意表达式,通常主要用于for循环的控制。紧跟在for()之后的循环体,在语法上要求是一条语句,若在循环体内需要多条语句,应该用大括号括起来,形成复合语句。


for循环的执行过程如下:

  1. 计算“表达式1”。

  2. 计算“表达式2”,若其值为非零,则转步骤(3);若其值为零,则转步骤(5)。

  3. 执行一次循环体。

  4. 计算“表达式3”,然后转向步骤2。

  5. 结束循环,执行for循环之后的语句。


【例6-6】请编写一个程序,计算半径为0.5、1.5、2.5、3.5、4.5、5.5mm时的圆面积。本例要求计算6个不同半径的圆面积,且半径的变化是有规律的,从0.5mm开始按增1mm的规律递增,可直接用半径r作为for循环控制变量,每循环一次使r增1直到r大于5.5为止。程序如下:

#include "stdio.h"

main()

 {

float  r, s;

const float Pai=3.14159;

for (r=0.5; r<6.0; r++)

{

s=Pai*r*r;               /*计算圆面积s的值*/

printf("r=%3.1f  s=%5.2f\n", r, s);

    }

}

运行结果:

r=0.5   s=0.79

r=1.5   s=7.07

r=2.5   s=19.63

r=3.5   s=38.48

r=4.5   s=63.62

r=5.5   s=95.03

程序中定义了一个变量Pai,它的值是3.14159;变量r既用作循环控制变量又是半径的值,它的值由0.5变化到5.5,循环体共执行6次当r增到6.0时,条件表达式“r〈6.0”的值为0,从而退出循环。for循环的循环体是个用花括号括起来的复合语句,其中包含两个语句,通过赋值语句把求出的圆面积放在变量s中,然后输出r和s的值。



【例6-7】求正整数n的阶乘n!其中n由用户输入。

 在本例中省略了对用户输入的n的合理性的检测,整个流程如图6-6所示。

阶乘结果用fac表示,它的值一般比较大,因此定义为实型变量。程序如下:

#include"stdio.h"

main()

{

float fac=1;

int n,i;

scanf("%d",&n);  

   /*以下省略了对用户输入的n的合理性的检测*/

for(i=1;i<=n;i++)

fac=fac*i;

printf("fac=%7.0f\n",fac);

}

说明:

  1. for语句一般形式中的“表达式1”可以省略,此时应在for语句之间前给循环变量赋初值。注意省略表达式1时,其后的分号不能省略。如

         for(;i<=10;i++)

                fac=fac*i;

    执行时,跳过“求解表达式1”这一步,其它不变。

  2. 如果表达式2省略,即不判断循环条件,循环无终止地进行下去。也就是认为表达式2始终为真。见图6-7。例如:

  3.     for(i=1;;i++)

           fac=fac*i;

    它相当于:

       i=1;

       while(1)

         {

           fac=fac*i;

           i++;

         }

  4. 表达式3也可以省略,但此时程序设计者应另外设法保证循环能正常结束。如:

         for(i=1;i<=10;)

            {

              fac=fac*i;

              i++;

             }

    本例把i++的操作不放在for语句的表达式3的位置处,而作为循环体的一部分,效果是一样的,都能使循环正常结束。

  5. 可以省略表达式1和表达式3,只有表达式2,即只给循环条件。如:

    for( ;i<=10;)                    while(i<=10)

    {                               {

         fac=fac*i;    相当于:         fac=fac*i;

         i++;                           i++;

     }                               }

    在这种情况下,完全等同于while语句。可见for语句比while语句功能强,除了可以给出循环条件外,还可以赋初值,使循环变量自动增值等。

  6. 三个表达式都可以省略,如

     for(;;)  

       语句序列(循环体);

相当于

         while(1)

           语句序列(循环体);

即不设初值,不判断条件(认为表达式2为真),循环变量不增值。无终止地执行循环体。

  1. 表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其它表达式。如

               for  (fac=1;i<=10;i++)  fac=fac*i;

        表达式1和表达式3可以是一个简单的表达式,也可以是逗号表达式,即包含一个以上的简单表达式,中间用逗号间隔。如:

              for(fac=1,i=1;i<=10;i++)  fac=fac*i;

              for(i=0,j=100;i<=j;i++,j--) k=i+j;

    表达式1和表达式3都是逗号表达式,各包含两个赋值表达式,即同时设两个初值,使两个变量增值,执行情况见图6-8。

        在逗号表达式内按自左至右顺序求解,整个逗号表达式的值为其中最右边的表达式的值。如:

             for(i=1;i<=10;i++,i++)  fac=fac*i;

    相当于

             for(i=1;i<=10;i+2)  fac=fac*i;

  2. 表达式2一般是关系表达式(如i<10)或逻辑表达式(如a<b&&x<y),但也可以是数值表达式或字符表达式,只要其值为非零,就执行循环体。分析下面两个例子:

       ① for(i=0;(c=getchar() )! =\n;i+=c);

     在表达式2中先从终端接收一个字符给c,然后判断此赋值表达式的值是否不等于\n(换行符),如果不等于\n,就执行循环体。此for语句的执行过程见图6-9,它的作用是不断输入字符,将它们的ASCII码相加,直到输入一个“回车换行”符为止。

       注意:此for语句的循环体为空语句,把本来要在循环体内处理的内容放在表达式3中,作用是一样的。可见for语句功能强,可以在表达式中完成本来应在循环体内完成的操作。

        ② for(  ;(c=getchar() )! =\n;) 

             printf(%c,c);

        无表达式1和表达式3,其作用是每读入一个字符输出该字符,直到输入一个“回车换行”符为止。请注意,从终端键盘向计算机输入时,是在输入回车以后才送到内存缓冲区中去的。运行情况是:

            Computer↙         (输入)

            Computer           (输出)

    而不是

            CCoommppuutteerr         

    即不是从终端敲入一个字符马上输出一个字符,而是输入回车后数据送入内存缓冲区,然后每次从缓冲区读一字符,最后输出。



4、几种循环的比较

  1. whiledo-while型循环,只在while后面指定循环条件,在循环体中应包含使循环趋于结束的语句(如i++,i=i+1等)。

    for语句可以在表达式3中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式3中。由此可见,for语句的功能更强,凡用while循环能完成的,用for循环都能实现。

  2. whiledo-while循环时,循环变量初始化的操作应在whiledo-while语句之前完成。而for语句可以在表达式1中实现循环变量的初始化。

  3. whilefor循环是先测试表达式,后执行循环体;而do-while语句是先执行一次循环体,再判断表达式。

  4. while循环、do-while循环和for循环,可以用break语句跳出循环,用continue语句结束本次循环。


循环结构这一部分很重要,很多程序都得用到。比选择循环还有有意思。

一个比一个有意思哈哈哈。

都是书面文字,很好理解。很多都是借鉴的老师的。

很简单嘛。明白几种循环的要求就可以了。

还有后续。等会奉上。

----ENDING


0 0