04-控制结构-循环控制--c语言初学系列

第四节 控制结构-循环控制

知识要点

4.1 while语句

4.2 do-while语句

4.3 for语句

4.4 break和continue语句

4.5 循环结构的嵌套

4.6 goto语句

结构化程序设计的三种结构

顺序结构:是按照书写顺序依次执行的。

选择结构:是对给定的条件进行判断,再根据判断的结果决定决定执行哪一个分支

循环结构:是在给定条件成立时反复执行某段程序。

§4.1 while语句

while语句的一般形式: 
        while (条件)  语句;

流程图:

while语句的执行过程是:当条件成立时执行循环体中的语句,然后再次判断条件,重复上述过程,直到条件不成立结束循环。while语句的特点是:当一开始条件就不成立时,一次也不执行循环语句。

例4.1 求1+2+… …+100的结果。

第一步, 计算 0+1;

第二步, 计算 (0+1)+2;

第 n 步, 计算 (0+1+…+n-1)+n;

第100步,计算 (0+1+…+99)+100;

所以只要定义一个变量s,初值为0,则第

1次循环加1,第n次循环加n,直到第100

次循环加100即可

伪代码算法:

定义s、n存放累计的和以及循环次数

累计和清零s=0; 循环变量赋初值n=1;

while (n<=100)
{s=s+n;
    n=n+1; }

输出结果s

 #include <stdio.h>
 void main()         
 {
  int s,n;
  s=0;
  n=1;
  while (n<=100) 
     {s=s+n; 
      n=n+1; }
  printf("1+2+3+… ...+100=%d\n",s);
 }

上例程序5~10行也可以改写如下两种常见形式:

形式一:s=1;n=2;形式二:s=1;n=1;

while (n<=100)     while (n<100)
     {s=s+n;              {n=n+1;
      n=n+1;}             s=s+n;}

通过以上三种形式的比较,我们可以看到在循环结构中,初值

(包括循环变量初值和计算结果初值等)与循环条件是相互影

响的,所以为了避免出错,可以通过验算循环结构开始和结束

的运行状态,如上例中代入n=1、n=2以及n=99、n=100,

进一步判断是否符合要求。习惯上,累计求和初值为0、累计求

积初值为1,所以我们推荐例4.1的形式。

在循环结构的设计中,特别需要注意的是:避免死循环。循环

体中必须有改变条件的语句,并且可以使程序执行到某一时刻

不满足这个条件而结束循环。

举一反三:从键盘输入n,求1+2+… …+n的结果并输出。

§4.2 do-while语句

do-while语句的一般形式:

        do
                循环体语句
         while (条件) ;

流程图:

do-while语句的执行过程:执行循环体中的语句,然后判断条件,条件成立再执行循环体;重复上述过程,直到条件不成立时结束循环

do-while语句的特点是:当一开始条件就不成立时,已经执行了一次循环语句。

此外特别注意while(条件)后面的分号不要省。

例4.2 求1+2+… …+100的结果。

算法分析同例4.1。

伪代码算法:

定义s、n存放累计的和以及循环次数

累计和清零s=0; 循环变量赋初值n=1;

do
  {s=s+n;
   n=n+1; 
  }

while (n<=100);

输出结果s;

 #include <stdio.h>
 void main()         
 {
  int s,n;
  s=0;
  n=1;
  do
    {s=s+n;
     n=n+1;      
     }
  while (n<=100);    
  printf("1+2+3+… ...+100=%d\n",s);
 }

 #include <stdio.h>
 void main()         
 {
  int s,n;
  s=0;
  n=1;
  do
    {s=s+n;
     n=n+1;      
     }
  while (n<=100);    
  printf("1+2+3+… 
   ...+100=%d\n",s);
 }

 #include <stdio.h>
 void main()         
 {
  int s,n;
  s=0;
  n=1;
  while (n<=100) 
     {s=s+n; 
      n=n+1; }
  printf("1+2+3+… ...+100=%d\n",s);
 }

通过例4.1和4.2可以看到用while语句可以转换为do-while语句,二者唯一不同的是:当一开始条件就不成立时,while语句不执行循环体,而do-while语句执行一次循环体。

程序一:void main()            程序二:void main()
{int s=0,n=101;                {int s=0,n=101; 
   while (n<=100)               do
   {s=s+n;n=n+1;}              {s=s+n;n=n+1;} 
   printf (“n=%d,s=%d”,n,s);       while (n<=100);
}                                printf (“n=%d,s=%d”,n,s); }
执行结果:                        执行结果:
n=101,s=0                         n=102,s=101

举一反三:求2+4+… …+100的结果并输出

§4.3 for语句

for语句的一般形式:

 for (表达式1;条件;表达式2)
           语句  

for语句的执行过程是:第一步执行表达式1,第二步判断条件,第三步当条件成立时执行循环体中的语句和表达式2;然后重复第二、三步直到条件不成立结束循环。

for语句可以改写成while语句形式:

表达式1;

while (条件)
           { 语句
          表达式2;
           }

§4.3 for语句

例4.3 求1+2+… …+100的结果

算法分析同例4.1。

伪代码算法:

定义s、n存放累计的和以及循环次数;

 for (s=0,n=1;n<=100;n=n+1)
          s=s+n;

输出结果s;

§4.3 for语句

#include <stdio.h>
 void main()         
 {
  int s,n;
  for(s=0,n=1;n<=100;n=n+1)
     s=s+n;
  printf("1+2+3+… ...+100=%d\n",s);
 }

for 语句中的表达式1,一般用于给循环前的某些变量赋初值的(超过一个语句用逗号间隔),如果在循环语句前已经赋过初值,表达式1可以省略,但是其后的分号不能省略。所以上例for语句可以改写如下:

s=0;n=1;
for ( ; n<=100; n=n+1)
                 s=s+n;

表达式2可以是用于修改循环一次后循环变量,确保循环在某一时刻可以结束,如果循环体语句中已经包含控制循环次数的内容,表达式2可以省略,但是表达式2前面的分号不能省略。上例for语句可以变换如下:

for (s=0,n=1; n<=100 ; )    
         {s=s+n;
           n=n+1;}

表达式1和表达式2也可以是与循环无关的量,甚至条件也可

以省略(如果条件省略,循环体中需要有跳出循环的语句,这

部分内容我们将在下一节中介绍)。但是一般来说,for语句写

成如下形式方便阅读和理解:

for (循环变量赋初值;循环条件;循环变量增值)

循环体语句

以上我们介绍了C语言常用的循环语句while语句、do-while语句和for语句。一般情况下三种循环语句可以互相替换,只有当一开始条件就不成立时,while语句和for语句不执行循环体,而do-while语句执行一次循环体。这三种循环语句中for语句最灵活,不仅循环变量的初始化可以放在表达式1中,而且循环变量的增值甚至整个循环体都可以放入表达式2中,所以在C语言中for语句最为常用。

举一反三:求100+99+… … +1的结果并输出。

猴子吃桃

猴子吃桃:有一天,一只猴子摘了一些桃子。它吃掉了一半,又吃了一个, 第二天也是这样,吃了所有桃子的一半,又多吃了一个... 到了 第十天,小猴子一看,只有1个桃子了。 求最早的时候,小猴子摘了几个桃子?

1534个桃子

§4.4 break和continue语句

break语句除了可以用在switch语句中,还可以用在循环体中。在循环体中遇见break语句,立即结束循环,跳到循环体外,执行循环结构后面的语句。一般形式为:

break;

在循环体中break语句常与if语句搭配使用,并且break语句只能用在switch语句和循环语句中。

例4.4 判断一个数n是否是素数。如果n不能被2到n-1中的任何一个数整除n为素数,所以循环让n除以i,i分别等于2到n-1,如果n不是素数,则2到n-1中至少存在一个数可以整除n,当i等于第一个这种数时,除法运算的余数为0,则提前结束循环,此时i小于n。如果n是素数,则经过2到n-1之间的除法运算,没有余数

为0的情况,循环由于不满足条件i小于等于n而结束。

 #include <stdio.h>
 void main()         
 {
  int n,i;
  scanf("%d",&n);
  for (i=2;i<=n-1;i=i+1)
     if (n%i==0) break;      
  if (i<n)    printf("%d不是素数\n",n);
  else  printf("%d是素数\n",n);
} 

写出下列两段循环语句的输出结果:

for (k=1;k<5;k=k+1)                           for (k=1;k<5;k=k+1)
  printf(“******\n”);                        {if (k==3) break;
                                               printf(“******\n”);}

在循环体中break语句常与if语句搭配使用,并且break语句只能用在switch语句和循环语句中。

continue语句用于结束本次循环,即在循环体中遇见continue语句,则循环体中continue语句后面的语句不执行,接着进行下一次循环的判定。它的一般形式为:

continue;

continue语句只用于循环结构的内部,一般同if配合使用。

例4.5 统计1~20之间不能被3整除的数的个数并输出这些数。

算法分析:

当n=1时,输出1,计数加1;

当n=2时,输出2,计数加1;;

当n=3时,结束本次循环,

转到第4次循环;

当n=4时,输出4,计数加1;;

伪代码算法:

定义n、s;

 for (n=1,s=0;n<=20;n=n+1)
     { if (n%3= = 0) continue;
        printf(“%d\t”,n);
         s=s+1;}

输出统计数s;

 #include <stdio.h>
 void main()         
 {
  int n,s;
  for (n=1,s=0;n<=20;n=n+1)
    { if (n%3==0)  continue;
      printf("%d\t",n);
      s=s+1;
     }
  printf("\ntotal:%d\n",s);
  }

continue语句和break语句用在循环体中的作用是不同的。continue语句只取消本次循环的continue语句后面的内容,而break语句终止了整个循环过程。

如例4.5中如果continue换成break,则输出结果为:

        1      2
        total:2

§4.5 循环的嵌套

一个循环语句的循环体内包含另一个完整的循环语句,称为循环的嵌套。While语句、do-while语句和for语句都可以互相嵌套,甚至可以多层嵌套。

例4.6 输出下列图形:

1

1 2

1 23

1 23 4

1 23 4 5

1 23 4 5 6

1 23 4 5 6 7

1 23 4 5 6 7 8

1 23 4 5 6 7 8 9

算法分析:

输出共9行,行号变量为n,从1到9,为外循环;

内循环输出1行中各个元素

我们知道:

第一行执行输出1次,输出1

第二行执行输出2次,第1次输出1,第二次输出2;

第n行执行输出n次,第1次输出1,第二次输出2,… … ,第n次输出n。

所以内循环变量m,执行输出操作从1到n次,

每次输出结果是内循环变量m的值

伪代码算法:

定义m、n;

for (n=1;n<=9;n=n+1)           
      {for (m=1;m<=n;m=m+1)
           printf(“%4d”,m);
     printf(“\n”); }           

#include <stdio.h>
void main()
{
 int m,n;
 for (n=1;n<=9;n=n+1)
  { for(m=1;m<=n;m=m+1)
           printf("%-4d",m);
     printf("\n"); }
   }

伪代码算法:

定义m、n;

for (n=1;n<=9;n=n+1)           
      {for (m=1;m<=n;m=m+1)
           printf(“%4d”,m);
     printf(“\n”); }             

循环嵌套时注意内循环变量的初始化问题。此外,break只能跳出一层循环(或者一层switch语句结构)。例如:

例4.7 输出3~100的所有素数。

伪代码算法:

定义n、i;

for (n=3;n<=100;n=n+1)
 { for (i=2;i<n;i=i+1)
         if (n%i= =0)  break;
  if (i>=n) 输出n;
           }

§4.6 goto语句

goto语句为无条件转移语句,它的一般形式为

goto 语句标号;

语句标号的命名需要符合C语言对标识符的命名规则,即语句标号由字母、数字和下划线组成,其中第一个字符不能是数字。

标号必须加在某个语句的前面,并且在标号后面使用冒号。当程序执行到goto语句后,程序转移到标号指定的语句继续执行。

标号只对goto语句有意义,当其它场合下遇见语句标号,则直接执行语句而忽视标号的存在。

§4.6 goto语句

例4.8 求1+2+… …+100的结果。

#include <stdio.h>
void main()         
{
  int n=1,s=0;
  loop: if (n<=100)
                { s=s+n;
                   n=n+1;
         goto loop ;
}
   printf("1+2+3+… ...+100=%d\n",s);
 }

上机练习与课后作业

1.用十进制、八进值、十六进制、字符形式输出ASCII码表33~126中的代码。

2.计算1!+2!+… …+10!的值

3.用循环的嵌套输出右方图形:

*

***

*****

*******

*********

***********

4.要求输出右方菜单

如果选择1,则显示“请输入”;选择2,则显示“请输入查找学生学号”;选择3,显示“正在输出”;选择0,显示“谢谢使用”;选择其它则显示“输入错误,请重新输入”。

用循环语句实现用户的重复输入,直到输入选择为“0”时,结束循环

主菜单

================

  1. 输入学生成绩
  2. 查询学生成绩
  3. 打印输出成绩

0. 退出系统

================

请选择 (1~4):

ps:此教程配套ppt下载地址如下,如果需要可以下一下,不过其实也无所谓,这篇文章就是全部文本。

https://download.csdn.net/download/qqhxmdq/86890588

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

锁住子锁不住

老少爷们向前冲!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值