目录
一、为什么需要循环控制
例如,从键盘输入一百个学生的成绩,求总成绩。
从前面所学,有两种解决方法。
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);
}