C语言第五讲(循环结构)

目录

一、为什么需要循环控制

二、用while语句和do-while语句实现循环

三、用for语句实现循环(计数循环-当型循环)

四、循环的嵌套

五、改变循环执行的状态-break和continue语句

六、几种循环的比较

七、循环程序举例


一、为什么需要循环控制

例如,从键盘输入一百个学生的成绩,求总成绩。

从前面所学,有两种解决方法。

1.设一百个变量,分别输入学生的成绩,然后求和。这种方法浪费内存空间,显然不实际

2.设一个变量,每次输入一个学生成绩,累加后再输入下一个学生成绩,如下:

这样写显然非常麻烦

scanf(“%f” ,&a);

S=S+a;

scanf(“%f”,&a);

S=s+a;

这样重复一百,然后输出s的值。

注意到程序中的

scanf(“%f”,&a);

S=S+a;

两个语句是一直重复的,如果能用一种语句使这两语句能自动的重复执行一百次,就可以简化了书写的麻烦,这就是循环语句。

C语言有while、do-while和for语句三种循环结构语句。前两个称为条件循环,即根据条件来决定是否继续循环;后一个称为计数循环,即根据设定的执行次数来执行循环。


二、用while语句和do-while语句实现循环

1.while语句:当型循环先判断后执行

(1)while(表达式)语句

执行流程:1.计算表达式。

               2.如果表达式的值为非零,执行语句。

               3.返回第一步,重新计算表达式,

               4.如果表达式的值为零,则结束循环

               如果表达式的值一开始就为0,则语句一次也不会被执行。

(2)例题:写一个程序,输入一个班学生的成绩,求全班的平均成绩,分析:考虑到成绩没有负数,这就可以把循环条件定为每当输入的分数大于等于0时就继续输入成绩,输入的分数小于0时就停止输入。

解题思路如下:

(1)输入一个分数。

(2)当“分数>=0”时,做下列工作。

① 累计总分;           ② 人数加一;

③ 输入下一分数

重复以上步骤,直到发现“分数<0’

(3)计算并输出平均分

算法分析:

1.定义变量score存储学生成绩,定义s=0存储累加的成绩定义n=0统计录入的成绩数目。

2.输入第一个学生的score

3.若score>=0,执行第4步,否则执行第7步

4.n++

5.s=s+score

6.录入下一个score,并返回第3步7.如果n>0.输出s/否则输出没有学生成绩

程序:

#include<stdio.h>
int main( )

{int n=0 ;

float s=0,score;

scanf(“f”,&score);

while(score >= 0 )

{ n++;

s=s+score;

scanf(“f”,& score);

}

if(n>0)printf(“\n %f”,s/n);

else printf( “no student score!”);

}

2.用do-while语句实现循环(直到型循环)先执行后判断

(1)一般形式:

do{

语句

  }  while(表达式);

注意:分号不能丢

执行流程:1.执行语句

                2.计算表达式

                3.表达式的值为非零,返回第1步

                4.表达式的值为零,结束循环

                语句至少被执行一次.

(2)用do-while语句编写例题程序:

#include<stdio.h>
int main( )

{int n=0;

float s=0,score;

do { scanf(“f” ,& score);

n++;

s=s+score;

}while(score>=0);

if(n>1)printf(“ \n %f”,(s-score)/(n-1));

else printf( “no student score!” );

}

注意:此处不能强行用第一种方法实现do-while循环
调整循环内的语句顺序,可使累加变量与计数变量数据正常但无法保证首次输入数据合法。

注意:while语句的循环体部分只有一条语句。

例如这样的一段循环语句的执行结果:

i=1;

while (i<=100)

putchar('*’);

i++;

这个循环永远不会结束,因为循环控制变量i没有在循环体内被改变,i++:不属于循环体。

应该改为:

i=1;

while (i<=100)

{putchar( '*’);

i++;

}

另外:循环语句中一定要注意表达式的值是否能在循环执行过程中被改变,以免造成死循环


三、用for语句实现循环(计数循环-当型循环)

1.for语句的一般形式

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

循环体语句

2.for语句中的各表达式含义

表达式1:通常用于循环开始前设置变量初值。

表达式2:控制循环执行的条件,决定循环次数。

表达式3:循环控制变量修改表达式。

循环体语句:被重复执行的语句。

2.例题

写程序计算s=1+2+3十….十 99。

分析:此题可用循环语句来编写程序,循环控制变量i从1增加到99。

设s的初值为0,则循环体为:s-s+i;

程序如下:

#include <stdio.h>
int main()
{int s =0,i;

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

s=s+i;

printf("s=%d",s);

}

for语句的执行过程:

① 计算表达式1“i=1;”,得到循环控制变

量的初值;

②求解表达式2,若表达式2的值为0(当i>=100),则结束for循环;

③ 执行循环体语句“s=s+i;”

④求解表达式3“i++;”,然后转向步骤②)。


四、循环的嵌套

循环体语句可以是任何形式的语句,简单语句、空语句、复合语句、流程控制语句都可作为循环体语句。

当循环体语句又是一条循环语句,或作为循环体的复合语句中又包含循环语句时称为循环的嵌套。嵌套可以是两层或多层。While、do-while、for三种循环都可以互相嵌套。

例.打印乘法表


五、改变循环执行的状态-break和continue语句

break、continue和goto

此类语句的功能是使程序从其所在的位置转向另一处。

goto语句使程序的结构性和可读性都变差要求尽量避免使用,此处不做介绍。

1 break语句

一般形式:

break;

它的作用是把流程转向所在结构之后。

在switch分支结构中,使用break语句可以使流程跳出switch分支结构。

在循环结构中,使用break语句使流程跳出当前的循环层,转向执行该循环结构后面的语句。

2 continve语句

一般形式:

continue;

该语句被称为继续语句。

在循环结构中执行continue语句,使本次循环提前结束,即跳过循环体中continue语句下面的尚未执行的循环体语句,但不结束整个循环,继续进行下一次循环的条件判别,条件为真,继续进行执行循环语句。

3.break和continve语句对比


六、几种循环的比较

所有需要用到循环结构的程序,都可以用for、while、do-while中的任何一个来实现,区别只在于某些问题用哪种语句更方便。

比如求1+2+...+99的问题我们也可以分别用while与do-while语句编写如下:

用while:

#include<stdio.h>

int main()

{int i=1,s=0;

while(i<=99)

{s=s+i; i++;}

printf(“\ns=%d”,s);

}

用do-while:

#include<stdio.h>

int main()

{int i=1,s=0;

  do{s=s+i;

     i++;

      }while(i<=99);

printf(“\ns=%d”,s);

}

七、循环程序举例

例:有一个八层高的灯塔,每层所点灯数都等于上一层的两倍,一共有765盏灯,求塔底灯数。

算法分析:

此题的关键在于塔顶的灯数,只要知道了塔顶的灯数,就可知道塔底灯数。这里采取试探的方法来求塔顶灯数。

设塔顶灯数为x,x的初值从1开始循环,每次值加1。求出相应的灯的总数,总数不为765,继续下一个x的循环,直到某次求得灯总数为765时,结束x的循环,输出此时塔底灯数。

1.x从1开始循环,每次值加1

2.设s初值为零,用于累加每层灯数;设k初值为x

3.i从1到8循环,每次值加1

4.s=s+ k;k=k*2:

5.如果s=-765 ,结束x的循环

6.输出k/2

程序:

#include<stdio.h>

int main()

{
   int x,s,i,k;

   for(i=1;;x++)

       do{s=0;k=x;

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

           {s=s+k;k=k*2;};

           if(s==765)break;}

       while(s!=765);

printf("%d",k/2);

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

jiao₍˄·͈༝·͈˄*₎◞ ̑̑

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值