内容正文:
第 六 章
循环跳出和循环嵌套
1
2
回顾
while循环
do-while循环
while 和 do-while 循环的区别
For循环
3
目标
理解break和continue
熟练使用嵌套循环
4
break 语句(一)
break语句两种用途:
1.终止switch语句中的case语句,保证多路分支情况的正确执行
2.强迫程序退出一个循环,跳过正常的循环条件测试
5
break 语句(二)
break语句通常在循环中与条件语句一起使用。若条件值为真,将跳出循环,控制流转向循环后面的语句
在多层循环中,一个break语句只向外跳一层
6
跳出 for 循环
int i;
for( i=0;i<100;i++; )
{
if(i==10) //当i等于10时退出整个循环
break;
printf(" %4d ",i);
}
printf("
",i);
}
break 示例
7
跳出 while 循环
while(1)
{
if(x == 10)
break;
}
跳出 for 循环
for( ; ; )
{
printf("这将一直进行下去");
i = getchar();
if(i == 'X' || i == 'x')
break;
}
break语句(三)
跳出 do-while 循环
do
{
if (x == 10)
break;
}while (x< 15);
8
continue语句(一)
continue 语句的作用是跳过循环体中剩余的语句而执行下一次循环
9
跳出 for 循环
int i;
for( i=0;i<100;i++; )
{
if(i==10) //当i等于10时退出本次循环
continue;
printf("%4d",i);
}
printf("
",i);
}
Continue示例
10
break与continue的区别
while(…)
{
……
……
break;
……
……
}
跳出整个循环
while(…)
{
……
……
continue;
……
……
}
继续下一次循环
11
循环嵌套
在一个循环体内又包含了一个完整的循环结构时,称为循环语句的嵌套。只有在内循环完全结束后,外循环才会进行下一趟。
嵌套 循环的语法
while(i <= 10)
{
. . .
while (i <= j)
{
. . .
. . .
}
. . .
}
外循环
内循环
12
循环嵌套示例(一)
在屏幕打印由星号构成的5行10列的矩形图形
13
在屏幕打印由星号构成的5行10列的矩形图形
#include <stdio.h>
void main()
{
int i,j;
for (i=0;i<5;i++) //打印5行
{
for(j=0;j<10;j++) //每行打印10个星号
{
printf("*");
}
printf("
"); //打印完一行星号后输出一个换行符
}
}
循环嵌套示
例(一)
14
循环嵌套示例(二)
打印九九乘法表。
15
#include <stdio.h>
void main()
{
printf("\t\t\t\t九九乘法表
");
printf("\t\t\t------------------------
");
for(int i=1; i<=9; i++) //输出行
{
for(int j=1; j<=9; j++) //输出每行的列数
{
printf("%d*%d=%2d\t",i,j,i*j);
}
printf("
");
}
}
16
注意
内循环控制变量,不能与外循环控制变量同名
外循环必须完全包含内循环,不能有交叉循环
for循环既可以嵌套for循环,也可以嵌套while或者 do-while循环,实际应用中三种循环可以互相嵌套。
在多层循环中, 一个break语句只向外跳一层。
17
程序举例(一)
百钱买百鸡问题。假设小鸡每只5角,公鸡每只2元,母鸡每只3元。现在有100元钱要求买100只鸡,请编程列出所有可能的购鸡方案。
设母鸡、公鸡和小鸡各为x、y、z只,根据题目要求,可以列出方程为
方程有3个未知量,故有无穷多解。,在计算机中可以使用“穷举法”(也称枚举法)来求解。即,将可能出现的各种情况一一测试,判断是否满足条件。
18
程序举例(二)
#include <stdio.h>
void main()
{
printf("\t\t购买方案
");
printf("\t------------------------
");
printf("\t母鸡\t公鸡\t小鸡
");
int x,y,z, sum=0;
for(x=1;x<=100;x++)
{
for(y=1;y<=100;y++)
{
for(z=1;z<=100;z++) {
if(((x+y+z)==100)&&((3*x+2*y+0.5*z)==100))
printf ("\t%d\t%d\t%d
",x,y,z);
sum ++;
} }
}
printf ("
方法一,程序总共运行了:%d
",sum);
}
程序举例(二)
在多重循环中为了提高运行速度,对程序要考虑优化问题。对于多重循环,可以提高速度的优化选项中需要考虑的因素如下:
尽量利用已给出的条件,减少循环的次数。
合理的选择内、外层的循环次数,即将循环次数多的放在内循环中。
根据三种鸡的只数为100的关系,用二重循环实现;同时每种鸡循环次数不必到100,因为还要满足总价格为100元的关系。因此,假如100元买母鸡最多能买100/3 = 33只,而如果用100元全部买公鸡,则最多可买50只。
19
20
程序举例(三)
#include <stdio.h>
void main()
{
printf("\t\t购买方案
");
printf("\t------------------------
");
printf("\t母鸡\t公鸡\t小鸡
");
int x,y,z,sum=0;
for(x=1;x<=33;x++)
{
for(y=1;y<=55;y++)
{
z =100 - x - y;
if((3*x+2*y+0.5*z)==100)
printf ("\t%d\t%d\t%d
",x,y,z);
sum ++;
}
}
printf (“
方法一,程序总共运行了d
",sum);
}
21
程序举例(四)
从键盘输入一串字符,以ctrl + z(^z)表示输入结束。统计其中包含的单词个数、字母个数、数字个数。规定单词之间用一个空白符分开(这里的空白符包括空格符、水平制表符和换行符)。
该题的关键是统计单词的个数,由于规定单词之间用一个空白符分开,则问题就变得很简单,只要统计空白符的个数就可以知道单词的个数。
22
#include <stdio.h>
void main()
{
char c;
int alpha=0,num=0,ch=0,word=0;
while((c=getchar())!=EOF) //EOF代表文本结束,键盘上对应Ctrl+Z
{
if(c==' ' || c=='\t' || c=='
') //当字符是空白符时将word计数变量自增
word++;
if(c>='a'&& c<='z' || c>='A' && c<='Z') //当字符是字母时将alpha计数变量自增
alpha++;
else if(c>='0'&&c<='9') //当字符是数值时将num计数变量自增
num++;
else //其他情况将ch计数变量自增
ch++;
}
printf("字母数=%d
",alpha);
printf("数字数=%d
",num);
printf("其他字符数=%d
",ch);
printf("单词数=%d
",word);
}
23
总结
break 语句用在循环中时,可以直接终止循环,将控制转向循环后面的语句
continue 语句的作用是跳过循环体中剩余的语句而执行下一次循环
嵌套循环时,必须将被嵌套的循环语句完整地包含在外层循环的循环体内
x + y + z = 100
3x + 2y + 0.5z = 100
$$