第六章 循环控制任课老师:台安返回下一页上一页第六章 循环控制第六章 循环控制
6.1 概述
6.2 while 语句(当型循环)
6.3 do~while语句(直到型循环
6.4 for语句
6.5 循环的嵌套
6.6 几种循环的比较
6.7 break语句和 continue语句
6.8 程序举例返回下一页上一页第六章 循环控制
6.1 概述
循环:同一程序段重复执行若干次 ;
循环结构是结构化程序三种基本结构之一。
(顺序结构、分支结构、循环结构)。
根据开始循环的初始条件和结束循环的条件不同,C语言中用如下语句实现循环
1、用 goto语句和 if语句构成循环。
2、用 while语句。
3、用 do-while语句。
4、用 for语句。
返回下一页上一页第六章 循环控制
6.2 while 语句(当型循环)
形式,while(表达式)
{ 循环体 }
执行过程:先计算表达式的值,如果表达式为真,执行循环体(可由一到多句组成,若多句,
用 { }括起来);若表达式的为假,就退出循环返回下一页上一页第六章 循环控制
While语句简单举例例 1。打印 1~10内的所有整数。
main( )
{ int i ;
i= 1 ;
while ( i < = 10 )
{ printf(“%d \n”,i);
i + +;
}
printf(“OK”);
}
定义循环变量循环变量赋初值循环条件(结束条件)
循环执行的内容结果:
1
2
3
4
5
6
7
8
9
10
ok
使循环趋于结束的语句返回下一页上一页第六章 循环控制编写循环语句要注意的四点:
1。循环的初始条件
2。循环的条件(或循环终止的条件)
3。循环执行的内容
4。有没有使循环趋于结束的语句。
返回下一页上一页第六章 循环控制例 2 求 1+2+3+…+100 =?
1)发现规律,
1 + 2+ 2 + 3+ 2 + 3 + 4+ 2 + 3 + 4 + 5+ 2 + 3 + 4 + 5 + 6
2)实现规律,
定义一个变量 sum保存累加和,初始值为 0;定义一个变量 i 来依次表示这 100个数。
则每次的操作为,sum = sum + i ;
15sum
假设 i的值为 6,此时 sum的值为
15(前 5位数的和 )。请看该语句执行前与执行后 sum值的变化。
15 + 6
21 21
返回下一页上一页第六章 循环控制例 2 求 n=1+2+3+…100
main( )
{ int i=1,sum=0;
while(i<=100)
{sum=sum+i;
i++; }
printf (“sum=%d\n”,sum);
} 问题的提出:( 1)什么条件下循环体一句也不执行?
( 2)什么条件下出现死循环
( 3)哪一句使循环趋于结束返回下一页上一页第六章 循环控制
6.3 do~while语句(直到型循环)
形式,do {
语句
}while(表达式);
操作:先执行语句,再计算表达式,为真时,继续执行语句,为假时,退出循环
特点:“直到型”循环结构。先执行一次“语句”,
判“表达式”,当“表达式”非 0,再执行“语句”,
直到“表达式”为 0,循环结束。
返回下一页上一页第六章 循环控制例 3 求 n=1+2+3+…100
main( )
{ int i=1,sum=0;
do {
sum=sum+i;
i++;
} while(i<=100);
printf (“sum=%d \n”,sum);
}
返回下一页上一页第六章 循环控制例 4,以下是 while和 do~while两种循环的比较
结论,(1)当条件表达式第一次为真时,两种循环得到的结果相同,
(2)当条件表达式一开始为假时,两种循环结果是不同的,
main( )
{ int sum=0,i;
scanf(“%d”,&i);
while(i<=10) {
sum=sum+i; i++; }
printf (“sum=%d \ n”,sum);
}
输入,1? 10? 11?
输出,sum=55 sum=10 sum=0
返回下一页上一页第六章 循环控制以下是 while和 do~while两种循环的比较
main( )
{ int sum=0,i;
scanf (“%d”,&i);
do {
sum=sum+i;
i++;
} while (i<= 10);
printf(,sum=%d \n”,sum);
}
输入,1?
10?
11?
输出:
sum=55
sum=10
sum=11
返回下一页上一页第六章 循环控制说明
( 1) while后的表达式第一次为真时,两种循环结果相同;
( 2) while后的表达式第一次为假时,两种循环结果不同;
( 3)死循环,while(表达式 ) 当表达式的值为非 0值,如 0.2,-5.5,-100,345.67;
( 4) do 后面若干语句是整体,必须用
{ }括起。
返回下一页上一页第六章 循环控制例 5,while后表达式非零即真
main( )
{ int i=3;
do {
printf(“\n%d”,i);
i - = 2;
} while(- -i = =0);
}
试问:该程序的输出结果是什么? 3 0
返回下一页上一页第六章 循环控制
6.4 for 语句
for语句是使用最为灵活的一种循环语句
形式,for (表达式 1;表达式 2;表达式 3)
{ 循环体 }
其中,表达式 1:循环变量赋初值
表达式 2:循环判断条件,
为真时继续循环,为假时,结束循环;
表达式 3:循环变量的增量。
执行过程,请见右图:
返回下一页上一页第六章 循环控制
for语句执行过程示意图
for (表达式 1;表达式 2;表达式 3)
{
循环体
}
1 2
3
4
5
6
3’ 6’
真假返回下一页上一页第六章 循环控制例 6 求,n=1+2+3…100
main( )
{ int i,sum=0;
for(i=1; i<=100; i++)
sum=sum+i;
printf (“sum=%d \ n”,sum);
}
返回下一页上一页第六章 循环控制几点说明:
for(表达式 1;表达式 2;表达式 3) 语句
1.若省去表达式 1,则此前要对循环变量置初值,
且“;”不能省去
如,i=1; s=0; for(; i<=100; i++) s=s+i;
2.若省去表达式 2,则被作为真处理,循环无终止
如,for (i=1; ; i++) s=s+i;
3.若省去表达式 3,则要在循环体内有使循环变量增量的语句
如,for(i=1 ; i<=100 ; ) { s=s+i ; i++; }
返回下一页上一页第六章 循环控制几点说明:
4.若省去表达式 1 和 3,则必须使循环变量有初值,能使循环变量增量
如,i=1; s=0; for( ; i<=100 ; ) {s=s+i; i++; }
5.省去表达式 1,2,3,
如,for( ; ; ) 则相当于,while( 1 ) 循环无终止。
6.表达式 1与循环变量可以有关也可无关,也可以是逗号表达式
如,for ( s=0,i=1 ; i<=100 ; i++ ) s=s+i;
for ( i=0,j=100 ; i<j ; i++,j--) k=k+i+j;
7.表达式 2可以是关系、逻辑、算术、字符表达式,非 0时,执行循环体,为 0时退出循环。
返回下一页上一页第六章 循环控制几点说明:
8.三个表达式可以是任一类型的表达式
三个表达式之一是逗号表达式
for ( sum=0,i=0; i<=100; i++,i++)
三个表达式之一是函数
for ( i=0 ; (c=getchar( )) !=?\n’ ; i++)
口令程序,
int x ; char str[10];
for (x=0; x<3 && strcmp(str,password) ; ++x)
{ printf(,请输入口令” );
gets(str);
}
if(strcmp(str,password)= =0) printf("You are welcome.");
else printf("You can not access,");
返回下一页上一页第六章 循环控制例 7 输入字符,输出字符 ASCII的值。
#include,stdio.h”
main( )
{ int i ; char c;
for(i=0; (c=getchar ( ) ) !=? \ n? ; i++)
printf(“%d,,c );
}
注:从终端键盘向计算机输入 字符时,是在输入回车后才把输入的一串字符送到内存缓冲区中的,
此例中,表达式 3的增量 与表达式
2的结束条件无关。
输入,a b c d?
输出,97 98 99 100
返回下一页上一页第六章 循环控制
6.5 循环的嵌套
循环嵌套:一个循环(称为“外循环”)的循环体内包含另一个循环(称为“内循环”)。内循环中还可以包含循环,形成多层循环。(循环嵌套的层数理论上无限制)。
三种循环( while循环,do-while循环,for循环)可以互相嵌套。例、
(1) while()
{…
while()
{… }
}
(2)do{

do{
…}while()
}while()
返回下一页上一页第六章 循环控制
(3)
for( ; ; )
{ ┆
for( ; ; )
{...}
}
(4)
while( )
{ ┆
do
{....}
while( );

}
(5)
for( ; ; )
{ ┆
while( )
{....}

}
(6)
do
{

for( ; ; )
{....}

}
while( );
返回下一页上一页第六章 循环控制
6.6 几种循环的比较
1,while,do ~while 中循环变量 初始化 在该语句之前,而 for一般是在表达式 1中;
2,while和 do~while中循环体是反复执行的部分,要有使循环 趋于结束 的语句。 for中使循环趋于结束的操作在表达式 3中。
3,while,for先 判断表达式,然后 再 执行语句,而 do ~ while先 执行语句,再 判表达式;
返回下一页上一页第六章 循环控制例 8:打印九九乘法表
main( )
{int i,j ;
for(i=1; i<=9 ; i++ )
printf(“%4d”,i);
printf(“\n”);
for(i=1; i<=79 ; i++ )
printf(“%c”,?-?);
printf(“\n”);
for(i=1; i<=9; i++)
{
for(j=1; j<= 9 ; j++ )
printf(“%4d”,i* j );
printf(“\n”);
}
}
打印第 i 行返回下一页上一页第六章 循环控制
6.7 break 和 continue 语句
6.7.1 break 语句
一般形式,break;
功能:结束循环语句,
转向循环语句的下一语句,在多层循环结构中,
只退出包含它的那层循环语句。
本语句仅限用于 while,
do ~ while,for,switch
语句返回下一页上一页第六章 循环控制例 9 已知半径 r,计算圆面积
要求,当 area > 100时结束程序的运行。
main( )
{ int r ;
float pi=3.14159,area;
for( r=1 ; r <=10 ; r++ )
{area=pi * r * r ;
if(area > 100) break ;
printf(,r=%d,area=%5,2f\ n”,r,area);
}
}
返回下一页上一页第六章 循环控制
6.7.2 continue语句
一般形式,continue;
功能:跳过循环体中后面的语句,进入本循环结构的下次循环,
① 在 while 和 do ~ while
中立即转到 while(表达式 )进行判断。
② 在 for语句中,转到表达式 3进行增量,再转到表达式 2进行判断。
返回下一页上一页第六章 循环控制例 10,把 100 - 120之间不能被 3整除的数输出
main( )
{ int n;
for(n=100; n<=120; n++)
{ if(n%3==0)
{ printf (“\ n” );
continue; }
printf(,%d,”,n);
}
}
返回下一页上一页第六章 循环控制
break语句和 continue语句的区别
while (表达式 1)
{ ┇
if (表达式 2) break;

}
break语句跳出循环
while (表达式 1)
{ ┇
if (表达式 2) continue;

}
continue语句结束本次循环体的执行,进入下一次循环返回下一页上一页第六章 循环控制
6.8 循环结构程序举例例 11 用公式 … 求 Pi的近似值,精确到小数点后第 6位 。
#include,math.h”
main( )
{ int s; float n,t,pi;
t=1; pi=0; n=1.0; s=1;
while((fabs(t)) > = 1e-6)
{pi=pi+t; n=n+2; s=-s; t=s/n; }
pi=pi*4;
printf(“pi=%10.6f\ n”,pi );
}
n s t
1 1 1
3 -1 -1/3
5 1 1/5
7 -1 -1/7
9 1 1/9
71513114/?
试想一想每个变量的作用返回下一页上一页第六章 循环控制例 12,求 Finonacci 数列,1,1,2,3,5,8,13, 的前 40个数
main( )
{ long int f1,f2;
int i; f1=1; f2=1;
for(i=1; i<=20; i++)
{ printf (“%12ld %12ld,,f1,f2);
if( i%2 = =0)
printf(“\n”);
f1=f1+f2;
f2=f2+f1;
}
}
i f1 f2
1 1 1
f1=f1+f2 f2=f2+f1
2 3
2 5 8
3 13 21
4 34 55
5 89 144
返回下一页上一页第六章 循环控制例 13 判断 m 是否是素数
#include,math.h”
main( )
{ int m,i,k;
scanf(“%d”,&m);
k=m/2;
for(i=2; i<=k; i++)
if(m % i = =0) break;
if(i <= k)
printf(,%d is not a prime number\ n”,m);
else
printf(,%d is a prime number \ n”,m);
}
返回下一页上一页第六章 循环控制例 14 求 100 ~ 200 间的全部素数
#include,math.h”
main( )
{ int m,k,i,n=0;
for(m=100; m<=200; m=m+1)
{ if (n % 10 = = 0) printf(“\ n”);
k=m/2;
for(i=2; i<=k; i++)
if(m % i = =0) break;
if(i > = k+1)
{ printf (“%d,,m);
n=n+1; }
}
}
返回下一页上一页第六章 循环控制例 15:用函数方法求 100 ~ 200 间的全部素数
#include,math.h”
main( )
{int m,n=0;
for(m=100; m<=200; m++)
{if (n % 10 = = 0)
printf(“\ n”);
if (prime(m)= =1)
{printf (“%d,,m);
n=n+1; }
}
}
int prime(int m)
{int i,k;
k=m/2;
for(i=2; i<=k; i++)
if(m % i = =0) break;
if(i <= k)
return(0);
else
return(1);
}
返回下一页上一页第六章 循环控制例 16 译密码
#include,stdio.h”
main( )
{ char c;
while((c=getchar( )) !=?\ n? )
{ i f ((c >=?a? && c <=?z? ) || (c >=?A? && c <=?Z? ))
/*判断是大写字符或者小写字符 */
{ c = c + 4;
i f(c >?Z? && c <=?Z? +4 || c >?z? )
c=c-26 ;
}
printf(“%c”,c);
}
}
返回下一页上一页第六章 循环控制例,译密码返回下一页上一页第六章 循环控制
[小结 ]
从以上几个例子可以看到,程序设计中的关键环节有:
1、算法。如求 π值的算法、求 Fibonicci数列的算法、验证素数的算法、字符的 ASCII码间的关系。
算法分析是程序设计中的第一个步骤,也是最重要的步骤。
2、框图。根据算法的要求,列出程序实现的步骤。框图是保证程序正确性的重要手段,它可以避免程序分支错误或分支遗漏。
复杂的算法必须画出框图。
3、程序设计环境。如操作系统的特征、键盘输入的特点(如,
仅在按回车键后输入的字符才进入程序缓冲区)、开发系统环境
(如 #include的使用)等。
4、程序设计的方法(结构化、面向对象)和风格(如适当的缩进)。
5、语言。注意语法规定。如 while,do-while,for语句的执行流程和特点,break,continue语句的作用等。
程序 = 算法 + 数据结构 + 程序设计方法 + 语言工具和环境