1
共 42页 第 2 页第一节 循环的基本概念第二节 while语句第三节 do -while语句第四节 for语句第五节 几种循环的比较第六节 循环的嵌套第七节 break和 continue语句第八节 应用实例共 42页 第 3 页
§ 6.1 循环的概念什么是循环?
为什么要使用循环?
循环是有规律的重复操作 。 将复杂问题 分解 为简单的操作过程,程序只对简单过程描述,这些过程的多次 重复 就可完成对问题的求解。
一、循环问题
100
1n
y n
问题 1:
问题 2,求学生平均成绩。 (分数相加后除以课数 )
求 1+2+3+… +100的和。
问题 3,找出 整 数 [1~1000]中 能同时被 3和 7整除的数。
if--goto 循环
while循环
for循环
do while循环先判断后循环
(当型循环)
先循环后判断
(直到型循环)
共 42页 第 4 页
循环变量的初始值
循环进入条件
循环体
循环变量的增值循环的基本要素循环变量的初值满足条件则执行循环体重复执行的语句循环变量的改变,进一步测试条件
§ 6.1 循环的概念 (完 )
二、循环结构循环体
N条件
Y
入口出口 条件
N
Y
循环体先循环后判断先判断后循环共 42页 第 5 页
§ 6.2 无条件转向语句二、标号语句格式,标号标识符:语句功能,指示语句在程序中的位置,作为 转移语句 的转移目标一,goto语句(无条件转向语句)
格式,goto 标号标识符功能,执行该语句时,将程序流程无条件地转向指定 标号所在的语句 继续执行。
标号由数字,字母,下划线组成goto loop;
loop,if(x<=y)
scanf(“%d,%d”,&x,&y);
loop,if(x<=y)
{ t=x;x=y;y=t;}
goto loop;
… …
共 42页 第 6 页
main( )
{ int k,sum=0;
k=1;
loop,if(k<=100)
{ sum=sum+k;
k++;
goto loop; }
printf(“%d”,sum);
}
说明,goto可以从较深的多重循环中转移到外层,或从函数 内,转移到函数 外,不能从外到内
§ 6.2 无条件转向语句共 42页 第 7 页
while循环
1,格式,while( 表达式 ) 循环体
2,功能,先 判断表达式 的值,若为 非零,重复 执行循环体语句,再判断 … 直到表达式的值为零,退出循环体。
即:测试 ---执行 --测试 --执行 --
§ 6.2 用 while设计循环结构
while (条件 )
{语句组 }
x
n
ns
1
main ( )
{ int s,n ;
s=0 ; n=1;
while(n<=100)
{ s=s+n ;
n++; }
printf(“%d\n”,s); }
100
共 42页 第 8 页
3.说明,
( 1)当循环体中语句多于一条时,用 { },否则,循环只对一个;起作用,
( 2)循环体内部必须有实现对循环变量增值的语句,否则,易出现“死循环”,
( 3) 条件表达式要有括号,
后面不加分号,
( 4) 注意条件的边界值,
例题,求 1+2+3…+ n<=10000
的最大的 n。
main( )
{ int a,n; a=n=0;
while(a<=10000)
{ ++n; a+=n;
}
printf(“1+2+3…..+%d=%d
\n”,n-1,a-n);
}
§ 6.2 用 while设计循环结构 (续 )
共 42页 第 9 页
main( )
{ int number=0;
while(number<=1)
{ number++;
printf(“%d \n”,number);
} }
结果,1
2
number初值为 0,条件为 number<=1
1.number为 0,满足条件
number为 0,然后自增为 1
输出 number 1
2.number为 1,满足条件
number为 1,然后自增为 2
输出 number 2
3.number为 2,不满足条件
§ 6.2 用 while设计循环结构 (续 )
共 42页 第 10 页
main( ) { int number=0;
while(number++<=1)
printf(“*%d\n”,number);
printf(“**%d\n”,number); }
循环进行了多少次?
输出的值?
结果,*1
*2
**3
条件表达式执行次数
1
2
3
条件表达式中变量的值
0
1
2
执行哪个
printf语句
@
@
#
@
#
输出的
number
的值
1
2
3
§ 6.2 用 while设计循环结构 (续 )
共 42页 第 11 页
§ 6.3 用 do-while设计循环结构
do 语句
while (条件 );
1,格式,do 循环体 while( 表达式 ) ;
2,功能,先 执行循环体,再 判断表达式 的值,若为 非零
,重复 执行循环体语句,再判断 ……,直到表达式的值为零,退出循环体
do -while循环即:执行 --测试 ---执行 --测试 --
条件
N
Y
循环体
x
n
ns
1
共 42页 第 12 页
main()
{ int n=1,s=0,x;
scanf("%d",&x);
do {s=s+n;
n++;}
while (n<=x);
printf("s=%d\n",s);
}
§ 6.3 用 do-while设计循环结构 (续 )
n<=x
s=s+n
Y
n++
开始初始化 n,s
N
结束输入 x
输出 s
共 42页 第 13 页
main()
{int s=0,x;
scanf("%d",&x);
while (x<=10)
{s=s+x;
x++;}
printf("s=%d\n",s);
}
main()
{int s=0,x;
scanf("%d",&x);
do
{s=s+x;
x++;}
while(x<=10);
printf("s=%d\n",s);
}
输入,12
输出:
s=12
循环至少执行一次 循环没有被执行输入,12
输出:
s=0
3,while与 do while的比较
§ 6.3 用 do-while设计循环结构 (完 )
共 42页 第 14 页计算 表达式 1初值 ;
计算 表达式 2并判断,0 时跳出循环,非 0 时执行循环;
当表达式 2非 0,执行循环体语句,计算 表达式 3增量 ;
自动转到第二步 (计算 表达式 2)…,..继续执行。
for语句 初值表达式 1 条件表达式 2 增量表达式 3
for (表达式 1;表达式 2;表达式 3) { 语句组 }
§ 6.4 用 for语句设计循环结构
1,格式,
2,功能,
main( ) { int n,s;
for(n=1 ; n<=100 ;n++)
s=s+n;
printf(“%d\n”,s); }
变量的增量循环体变量的初值循环条件共 42页 第 15 页
1.表达式 1,表达式 2和表达式 3均可缺省
for (;n<100;n++) 缺省 e1,n 应在循环之前赋初值
for (n=0;;n++) 缺省 e2,造成死循环,不可使用!
for (n=0;n<100;) 缺省 e3,n增量应在循环体内进行
for (; ;) 缺省 e1,e2,e3 死循环
for (;n<100;) 缺省 e1,e3
分号始终不能缺省!3.说明不可用
§ 6.4 用 for语句设计循环结构 (续 )
共 42页 第 16 页
for(初值 ;判断 ;增量 ) 语句;
for(初值 ;判断 ;增量 )
{复合语句 ;}
for(初值 ;判断 ;增量 );
2.表达式 1和 表达式 3可是与初值、增量无关的逗号表达式
for (s=0,n=1;n<=100;s=s+n,printf(,%d”,s)) n++;
for (s=0;n<100;s=s+n,n++) {printf(,%d”,s);}
求累加和
n的初值在
for之前 完成增量在 for
之外完成
for语句的形式:
§ 6.4 用 for语句设计循环结构 (续 )
共 42页 第 17 页
main()
{
int n=1,s=0,x;
scanf("%d",&x);
loop:if(n<=x)
{s=s+n;
n++;
goto loop;}
printf("s=%d\n",s);
}
10
s=55
100
s=5050
255
s=32640while(n<=x)
}
f r(;n<=x;
if-gotoWhile(n<=x)for(;n<=x;)
循环结束
§ 6.4 用 for语句设计循环结构 (续 )
n<=x
s=s+n
n++
开始初始化 n,s,x
N
结束输入 x
Y
输出 s
共 42页 第 18 页
main()
{
int n,s;
for(n=1;n<=10;n+=2)
printf("n=%d\n",n);
}
main()
{
int n,s;
for(n=1;n<=10;n+=2);
printf("n=%d\n",n);
}
以下 程序的输出结果输出结果:
n=11
输出结果:
n=1
n=3
n=5
n=7
n=9
无循环体 循环体特点:先判断后循环
printf("n=%d\n",n);
§ 6.4 用 for语句设计循环结构 (完 )
共 42页 第 19 页
§ 6.5 几种循环的比较
1,C中的三种循环语句 while( ),do-while( ),for( )
都可由表达式控制重复执行一个循环体,都可以用来解决同一个问题,一般情况下,可以相互代替。
2,三种循环各有特点,
1) 当循环次数及条件在程序运行中才能确定时,选用
while( )或 do-while( )语句两者区别,while( ) 顶部测试,可能一次也不执行
do-while( )底部测试,至少执行一次共 42页 第 20 页
§ 6.5 几种循环的比较 (完 )
( 2) 如果初值,条件明显,循环次数已给出,选用
for( )语句,功能最强。
( 3) 出现,死循环” 的几种情况
for( ; ; )
for( ….; 非零常数表达式; ……)
while(非零常数表达式)
do,.while(非零常数表达式)
main()
{ int I=0,j=5;
while(j<10)
{ j=I*2;
printf(“%d”,j);
} 结果为,?
共 42页 第 21 页
§ 6.6 循环的嵌套一、循环嵌套的概念
1 2 3 4 5 6 7 8 9
---------------------------------
1
2 4
3 6 9
4 8 12 16
5 10 15 20 25
6 12 18 24 30 36
7 14 21 28 35 42 49
8 16 24 32 40 48 56 64
9 18 27 36 45 54 63 72 81
在循环体中,又包含有循环结构。
行循环中包含了列循环。
将一元钱换成硬币,
共有多少种换法?
共 42页 第 22 页二、嵌套结构规则外循环内循环 交叉循环
外循环入口内循环出口内循环出口外循环出口
§ 6.6 循环的嵌套 (续 )
三、循环嵌套的运行过程外层循环取一个值,内层循环取遍所有的值共 42页 第 23 页每只公鸡 5元钱,每只母鸡 3元 钱,每 3只小鸡 1
元 钱,用 100元 钱,买 100只鸡,问公鸡、母鸡和小鸡各买几只?
分析定义变量 x,y,z,表示公鸡、母鸡和小鸡的只数
int x,y,z;
for(x=0;x<=20;x++)
for(y=0;y<=33;y++)
for(z=0;z<=300;z++)
{ ….}
程序运算多少次?
§ 6.6 循环的嵌套 (续 )
共 42页 第 24 页
§ 6.6 循环的嵌套(续)
x最多为 20,y最多为 33,当 x,y已确定时,z的值为
100-x-y
main() { int x,y,z;
for(x=0;x<20;x++)
for(y=0;y<=33;y++)
{ z=100-x-y;
if(5*x+3*y+z/3==100)
printf(“%d,%d,%d\n”,x,y,z); } }
共六组解,
x y z
3 20 77
4 18 78
7 13 80
8 11 81
11 6 83
12 4 84
所求的 z不能被 3整除如何解决?
& (z%3==0))
共 42页 第 25 页
main( ) { int a,b,c,k=0;
for(a=0;a<=100;a++)
for(b=0;b<=50;b++)
for(c=0;c<=20;c++)
{ if (a+2*b+5*c==100)
k++;
}
printf(“%d\n”,k); }
将一元钱换成一分,
二分和五分的硬币,
共有多少种换法?
定义变量 a,b,c
定义变量 k
§ 6.6 循环的嵌套 (续 )
共 42页 第 26 页
要求,从键盘输入 m值,输出 m行每行 m个 *号。
例:输入 m=4,输出的图形如下:
思路:
1,输入 m;
2,重复 打印 m行,每行打印 m个 *;
* * * ** * * *
* * * ** * * *
1,输入 m;
2,for ( k=1; k<=m; k++)
打印一行中的 m 个 * ;
§ 6.6 循环的嵌套 (续 )
共 42页 第 27 页
§ 6.6 循环的嵌套(完)
细化:
1,输入 m;
2,for ( k=1; k<=m; k++)
{ 打印 m 个 * ;
换新行 ; }
1,输入 m;
2,for ( k=1; k<=m; k++)
{ for ( j=1; j<=m; j++)
printf (“*” );
printf(“\n”) ;
}
main ( )
{ int k,m,j;
scanf (,%d”,&m);
for( k=1; k<=m; k++)
{ for ( j=1; j<=m; j++)
printf (“*” );
printf(“\n”) ; }
}
共 42页 第 28 页
§ 6.7 break和 continue语句
break语句格式
break;
break语句的功能
1.在 switch语句中结束 case子句,使控制转到
switch语句之外 。
2.在循环结构中,break语句使流程转向该循环体的外层 继续运行 。 向外退出 一层循环
break语句与 continue语句共 42页 第 29 页例题:求 100以下的整数中为 13的倍数的 最大数
main( )
{ int i;
for (i=100; i>=0; i--)
{ if((i%13)==0)
break;}
printf(“%d\n”,i);
}
如何求 100以下所有 13的倍数
§ 6.7 break和 continue语句 (续 )
共 42页 第 30 页
continue语句格式:
continue;
continue语句的功能:
continue语句仅能在循环语句中使用。
它的作用不是结束循环,而是开始一次新的循环。 结束一次循环对于 for语句,将控制转到执行增量和条件测试部分。
对于 while和 do-while语句,将控制转到条件测试部分。
§ 6.7 break和 continue语句 (续 )
共 42页 第 31 页
main( )
{ int x,y,z;
for(x=1;x<=20;x++)
for(y=1;y<=33-x;y++)
{ z=100-x-y;
if(5*x+3*y+z/3==100)
{ if(z%3!=0) continue;
printf(“%d,%d,%d\n”,x,y,z); } }
}
将前面例题中,小鸡的数 z中不能被 3整除的解筛除?
§ 6.7 break和 continue语句 (续 )
共 42页 第 32 页break的使用
main( ) { int i,j,a=0;
for(i=0;i<2;i++)
{ for(j=0;j<4;j++)
{ if(j%2) break;
a++;}
a++; #
}
printf(“a=%d\n”,a); }
a=4 a=5
a=6 a=7
1,i=0
j=0,if为 0,a从 0到 1
j=1,if为 1 退出 j循环执行 语句 # a从 1到 2
2,i=1
j=0,if为 0,a从 2到 3
j=1,if为 1 退出 j循环执行 语句 # a从 3到 4
§ 6.7 break和 continue语句 (续 )
共 42页 第 33 页
main( ) { int i,j,x=0;
for(i=0;i<2;i++)
{ x++;
for(j=0;j<=3;j++)
{ if(j%2) continue;
x++;}
x++; #
}
printf(“x=%d\n”,x); }
x=4 x=8
x=6 x=12
1,i=0,x从 0到 1
j=0,if 为 0,x从 1到 2
j=1,if 为 1
j=2,if为 0,x从 2到 3
j=3,if为 1
执行 语句 # x为 4
2,i=1,x从 4到 5
内部循环
j=0,if 为 0,x从 5到 6
j=1,if 为 1
j=2,if为 0,x从 6到 7
j=3,if为 1
x为 8
continue的使用
§ 6.7 break和 continue语句 (完 )
共 42页 第 34 页
§ 6.8 循环应用例题 C5-10
1,问题分析译密码 (输入一行字符,要求输出其相应的密码。 )
规律,将字母 A变成字母 E,(a
变成 e),即变成其后的第四个字母,W变成 A,X变成 B,Y变成
C,Z变成 D。 非字母字符不变
(如,China!”变成
,Glmre!”)
为使电文保密,往往按一定规律将其转换成密码,收报人再按约定的规律将其译回原文。
共 42页 第 35 页
#include<stdio.h>
main()
{char c;
while(c=getchar( )!=?\n?)
{if(c>=?a?&&c<?z?||c>=?A?&&c<=?Z?)
{ c=c+4;
if(c>?Z?&&c<=?Z?+4||c>?z?)
c=c-26; }
printf(“%c”,c);
}
}
§ 6.8 循环应用 (续 ) 开始定义 c
c!=?\n
Y
c=c+4
c=c-26
N
结束
c为字母?
Y
c>?Z?&&c
<?Z?+4||C>?z?
输出 c
Y
N
Y
N
小写字母都
>‘ Z?+4
共 42页 第 36 页
§ 6.8 循环应用 (续 )
例题:求两个数的最大公约数辗转相除法已知两个数 M和 N,假定 M>N,则求 M%N,若余数 r
为 0,则 N即为是所求,若余数 r不为 0,用 N除 r,再求其余数 …… 直到余数为 0,则除数就是最大公约数。
求 76 与 64的最大公约数
r=76%64,r 的值为 12 r不为 0
r=64%12,r 的值为 4 r不为 0
r=12%4,r 的值为 0
76与 64的最大公约数为 4
共 42页 第 37 页
§ 6.8 循环应用 (续 )
程序,main( )
{ int x,y,t,r;
scanf(“%d,%d”,&x,&y);
if(x<y)
{ t=x; x=y; y=t; }
while(x%y)
{ r=x%y;
x=y;
y=r;
}
printf(“%d\n”,y);
}
输入 64,76
交换 x,y
条件是:余数不为 0
除数做被除数,余数做除数共 42页 第 38 页第六章 总结一 有关循环的概念(满足条件重复执行一组语句)
二 循环结构的表达方法:四种语句( if-goto,while( ),do -
while( ),for( ) )
三 边界条件的处理(自增,自减在循环条件中的使用)
四 循环嵌套和多重循环五 break,continue 的作用和区别共 42页 第 39 页第六章 习题
1,设有一下程序段:则执行后结果为( )
int x=0,s=0; while(!x !=0) s+=++x; printf(“%d”,s);
A,输出 0 B,输出 1 C,条件表达非法 D,构成死循环
2,下面程序段的运行结果是,( )
x=y=0; while(x<15) y++,x+=++y;
printf(“%d,%d”,y,x);
A,20,7 B,6,12 C,20,8 D,8,20
3,下面程序段的运行结果是( )
for(y=1;y<10;)y=((x=3*y,x+1),x-1);
printf(“x=%d,y=%d”,x,y);
A,x=27,y=27 B,x=12,y=13 C,x=15,y=14 D,x=y=27
共 42页 第 40 页第六章 习题
4,下面程序的运行结果是 ( )
main( ) { int I,b,k=0;
for( I=1; I<=5; I++)
{b=I%2; while(b-- >=0) k++; }
printf(“%d,%d”,k,b);}
A,3,-1 B,8,-1 C,3,0 D,8,-2
5,有 1020个西瓜,第一天卖一半多两个,以后每天卖剩下的一半多两个,问第几天后能卖完?请填空。
main( ) { int day=0,x1=1020,x2;
while( ____) {x2=______; x1=x2; day++;}
printf(,day=%d \n”,day); }
共 42页 第 41 页第六章 习题
6,等差数列的第一项 a=2,公差 d=3,下面程序的功能是在前
n项和中,输出能被 4整除的所有的和。请填空。
main( ) { int a=2,d=3,sum=0;
do { sum+=a; a+=d;
if(______) printf(“%d \n”,sum);}
while(sum<=200); }
7,下面程序的运行结果是 ___________。
main( ) { int i,x,y; i=x=y=0;
do { ++i; if (i%2==0) {x=x+i; i++;}
y=y+i++; } while(i<=7);
printf(“x=%d,y=%d \”,x,y); }
共 42页 第 42 页第六章 习题
8,下面程序的运行结果是 ___________。
main( )
{ int i,j;
for(i=0;i<=3;i++)
{ for(j=0;j<=5;j++)
{if (i==0||j==0||i==3||j==5) printf(“*”);
else printf(,”); }
printf(“\n”); }
}
共 42页 第 43 页
1.一张纸厚度为 0.3毫米,现有一张无限大的纸,并进行若干次对折,请问对折几次后,
高度超过珠峰 8848米?
第六章 习题
2、输入 10个数,计算其中最大和最小的数。
3、编写程序,计算 1- 3+ 5- 7+ … - 99+
101的值。