C语言教程,循环结构
学习目的:循环控制结构程序设
计是三大程序结构中最重要的
部分。通过讲解,使学生熟悉
循环控制结构程序设计的编写
方式、运行方法,能够正确、
快速的编程。
循环结构内容介绍
4.1 循环结构
4.2 循环结构
4.5 其它控制语句
4.6 程序举例
循环结构概述
C语言提供了多种循环语句,可以组成各
种不同形式的循环结构。
1) 用 goto语句和 if语句构成循环;
2) 用 while语句或用 do-while语句;
3) 用 for语句;
goto语句以及用 goto语句构成循环
goto 语句的使用格式为,
goto 语句标号;
特别说明,goto语句通常不用,主要因为它将使程序层次不清,且不易读。
【 例 】 用 goto语句和 if语句构成循环,。
main()
{ int i,sum=0;
i=1;
loop,if(i<=100)
{sum=sum+i;
i++;
goto loop;}
printf("%d\n",sum);
}
while语句的一般形式为,while(表达式 )语句
其中表达式是循环条件,可以是一个任意类
型的表达式,但通常都是关系或逻辑型的;
语句为循环体。 【 例 】 用 while语句求。用
传统流程图和 N-S结构流程图表示算法,见
图,main( )
{ int i=1,sum=0;
while(i<=100)
{sum=sum+i;
i++; }
printf("%d\n",sum);
}
使用 while语句应注意以下几点,
1) while语句中的表达式一般是关系表达或逻辑表
达式,只要表达式的值为真 (非 0)即可继续循环。分
析如下程序,
main( ){ int a=0,n;
printf("\n input n,");
scanf("%d",&n);
while (n--) printf(“%d,,a++*2); }
本例程序将执行 n次循环,每执行一次,n值减 1。
循环体输出表达式 a++*2的值。该表达式等效于 (a*2;
a++)。
2) 循环体如包括有一个以上的语句,则必须用 {}
括起来,组成复合语句。
do-while语句的一般形式为,
do{ 语句
} while(表达式 );
这个循环与 while循环的不同
在于,它先执行循环中的语句,
然后再判断表达式是否为真,
如果为真则继续循环;如果
为假,则终止循环。因此,do-
while循环至少要执行一次循
环语句。 【 例 】 用 do-while
语句求。用传统流程图和 N-
S结构流程图表示算法,见
图,
main( )
{ int i,sum=0;
i=1;
do{ sum=sum+i;
i++;
}while(i<=100)
printf("%d\n",sum); }
【 分析 】 while和 do-while循环比较,分析分别输入 1
和 11时两个程序执行的结果的异同。
( 1) main()
{int sum=0,i;
scanf(“%d”,&i);
while(i<=10)
{sum=sum+i;
i++;
}
printf(“sum=%d”,sum);
}
( 2) main()
{int sum=0,i;
scanf(“%d”,&i);
do
{sum=sum+i;
i++;
}
while(i<=10);
printf(“sum=%d”,sum);
}
for语句使用最为灵活。它的一般形式为,
for(表达式 1;表达式 2;表达式 3) 语句
它的执行过程如下,
1)先求解表达式 1。
2)求解表达式 2,若其值为真
(非 0),则执行 for语句中指
定的内嵌语句,然后执行下面
第 3)步;若其值为假( 0),
则结束循环,转到第 5)步。
3)求解表达式 3。
4) 转回上面第 2)步继续执行。
5)循环结束,执行 for语句下面
的一个语句。
其执行过程可用下图表示。
for语句最简单的应用形式也是最容易理解的形式
如下,
for(循环变量赋初值;循环条件;循环变量增
量 ) 语句
循环变量赋初值总是一个赋值语句 ; 循环条件
是一个关系表达式,它决定什么时候退出循环;
循环变量增量,定义循环控制变量每循环一次
后按什么方式变化。这三个部分之间用“;”
分开。特别注意:三个表达式可以没有但是
“;”却万万不能没有。
例如, for(i=1; i<=100; i++)sum=sum+i;
先给 i赋初值 1,判断 i是
否小于等于 100,若是则
执行语句,之后值增加 1。
再重新判断,直到条件
为假,即 i>100时,结束循
环。
相当于,
i=1;
while( i<=100)
{ sum=sum+i;
i++; }
对于 for循环中语
句的一般形式,就是
如下的 while循环形
式,
表达式 1;
while(表达式 2)
{语句
表达式 3;
}
注意,1)for循环中的“表达式 1(循环变量赋初值)”、
“表达式 2(循环条件 )”和“表达式 3(循环变量增量 )”都
是选择项,即可以缺省,但“;”不能缺省。 2)省略了
“表达式 1(循环变量赋初值)”,表示不对循环控制
变量赋初值。 3)省略了“表达式 2(循环条件 )”,则不做
其它处理时,便成为死循环,相当于循环条件恒为真。
例如,for(i=1;;i++)sum=sum+i; 相当于,
i=1;
while(1) {sum=sum+i; i++; }
但是我们可以在循环体中加入一个循环结束条件的判断。
如,
for(i=1;;i++)
{ if (i>100) break;
sum=sum+i; }
4)省略了“表达式 3(循环变量增量 )”,则不对
循环控制变量进行操作,这时可在语句体中加入
修改循环控制变量的语句。例如,
for(i=1;i<=100;) {sum=sum+i; i++;}
5)省略了“表达式 1(循环变量赋初值)”和
“表达式 3(循环变量增量 )”。例如,
for(;i<=100;) {sum=sum+i; i++;} 相当于,
while(i<=100)
{sum=sum+i; i++; }
6) 3个表达式都可以省略。例如,
for(;; )语句 相当于,while(1)语句
7) 表达式 1可以是设置循环变量的初值的赋值
表达式,也可以是其他表达式。例如:
for(sum=0;i<=100;i++)sum=sum+i;
8)表达式 1和表达式 3可以是一个简单表达式
也可以是逗号表达式。for(sum=0,i=1;i<=100;i++)sum=sum+i;
或,for(i=0,j=100;i<=100;i++,j--)k=i+j;
9)表达式 2一般是关系表达式或逻辑表达式,
但也可是数值表达式或字符表达式,只要其值
非零,就执行循环体。例如:for(i=0;(c=getchar())!=’\n’;i+=c);
又如,for(;(c=getchar())!=’\n’;)
printf(“%c”,c);
循环的嵌套
【 例 】 分析如下程序的运行
结果
main( )
{ int i,j,k;
printf("i j k\n");
for (i=0; i<2; i++)
for(j=0; j<2; j++)
for(k=0; k<2; k++)
printf(“%d %d %d\n",i,j,k);
}
几种循环的比较
1)四种循环都可以用来处理同一个问题,一般可
以互相代替。但一般不提倡用 goto型循环。
2)while和 do-while循环,循环体中应包括使循环
趋于结束的语句。 for语句功能最强。
3)用 while和 do-while循环时,循环变量初始化的
操作应在 while和 do-while语句之前完成,而 for
语句可以在表达式中实现循环变量的初始化。
break语句
break语句通常用在循环语句和 switch语句中。
当 break用于 switch语句中时,可使程序跳出
switch而执行 switch以后的语句。
当 break语句用于 do-while,for,while循环语句
中时,可使程序终止循环而执行循环后面的语句,
如果没有 break语句,有可能成为一个死循环而
无法退出。 通常 break语句总是与 if语句联在一
起。即满足条件时便跳出循环。
注意,1)break语句对 if-else的条件语句不起作用。
2)在多层循环中,一个 break语句只向外跳一层。
main( ) //【 例 】
{ int i=0; char c;
while(1) /*设置循环逻辑为永真 */
{ c='\0'; /*变量赋初值 */
while(c!=13&&c!=27) /*键盘接收字符直到按回车或 Esc
键 */
{c=getch();
printf("%c\n",c); }
if(c==27) break; /*判断若按 Esc键则退出循环 */
i++; printf("The No,is %d\n",i); }
printf("The end"); }
continue语句的作用是跳过循环本中剩余的语句而强行执行下
一次循环。 continue语句只用在循环体中,常与 if条件语句一起
使用,用来加速循环。其执行过程可用下图表示。
while(表达式 1)
{ ……
if(表达式
2)break;
…… } // 左图
while(表达式 1)
{ ……
if(表达式 2)continue;
…… } // 右图
【 例 】 判断 m是否素数。看程序和 N-S流程图,
#include<math.h>
main( )
{int m,i,k;
scanf(“%d”,&m);
k=sqrt(m);
for(i=2;i<=k;i++)
if(m%i==0)break;
if(i>=k+1)
printf(“%d is a prime number\n”,m);
else printf(“%d is not a prime
number\n”,m);
}
结束