第 7讲 循环的嵌套一,continue 语句和 break 语句
1,continue语句
2,break语句二、循环的嵌套三,goto语句一,continue 语句和 break 语句
1,continue语句格式,continue ;
功能:结束本次循环,使程序回行到循环条件,
判断是否提前进入下一次循环。
continue语句只用于循环结构的内部,常与 if语句联合起来使用,以便在满足条件时提前结束本次循环。
例 7.1 对除 5的倍数以外的 1~ 100的数求和。
main( )
{int i,s;
s=0;
for(i=1;i<=100;i++)
{if (! (i%5))
continue;
s+=i;
}
}
如果 if判断语句为真,则跳出本次循环,回到循环条件,
判断是否进行下一次循环此处,当 i为 5的倍数时,!(i%5)为真,
跳出本次循环,不执行 continue下面的语句,直接进入下一次循环,即执行 for语句运行序列如下:
i if(!(i%5)) s+= i
1 假 s=0+1=1
2 假 s=1+2=3
3 假 s=3+3=6
4 假 s=6+4=10
5 真 不执行
6 假 s=10+6=16
…… …… ……
main()
{
int n,s;
for (n=1,s=0;n<=20;n=n+1)
{ if (n%3==0) continue;
printf("%d\t",n);
s=s+1;
}
printf("\ntotal:%d\n",s);
}
例 7.2 统计 1~50之间不能被 3整除的数的个数并输出这些数。
运行结果:
1 2 4 5 7 8 10 11
13 14 16 17 19 20
total,14
格式,break;
功能,循环体中遇见 break语句,立即结束循环,跳到循环体外,执行循环结构后面的语句。
2,break语句在循环体中 break语句常与 if语句搭配使用,并且 break语句只能用在 switch语句和循环语句中。
break只能跳出一层循环(或者一层 switch
语句结构)
例 7.3 统计输入的字符个数,并输出它们,以“!”终止。 main( )
{char chr;
int s;
for( s=0; ; s++)
{chr=getchar( );
if (chr==?!?)
break;
else printf(“c%”,chr);}
printf(“s=%d \n”,s);
}
如果 if判断语句为真,则结束循环,
执行循环结构后面的语句此处,当输入字符为,!”时,
chr==?!?为真,结束 for循环,执行循环结构后面的语句,
即执行 printf
(“s=%d \n”,s)语句运行序列如下:
输入 if(chr==?!?) 输出
a 假 a
5 假 5
$ 假 $
B 假 B
! 真 4
例 7.4 计算半径 r=1到 r=10时圆的面积,直到面积
area大于 100为止。
#define pi 3.14159
main( )
{ int r;
float area;
for( r=1;r<=10 ; r++)
{area=pi*r*r;
if (area>100) break;
printf(,%f”,area);
}
}
二、循环的嵌套一个循环体内又包含另一个完整的循环结构,称为循环的嵌套,内嵌的循环中还可以嵌套循环即为多层循环。
说明:
⑴ 嵌套的原则,不允许交叉
⑵ 循环与分支可以相互嵌套但不允许交叉。
* * * * * * * *
* * * * * * * *
* * * * * * * *
* * * * * * * *
输出图形:
for(i=1;i<=4;i++)
{ printf(“* * * * * * * *”);
printf(“\n”);
}
其中语句,printf(“* * * * * * * *”);
等价于
for(j=1;j<=8;j++) printf(“*”);
于是构成了二重循环语句:
for(i=1;i<=4;i++)
{for(j=1;j<=8;j++) printf(“*”);
printf(“\n”);
}
上面的例子中:
外循环由外循环控制变量 i控制,i由 1递增到 4。
for(i=1;i<=4;i++)
{for(j=1;j<=8;j++) printf(“*”);
printf(“\n”);
}
每 1次的外循环中,都要执行由内循环控制变量 j控制的 8次内循环操作和 1次换行操作。
由此:每次内循环输出一个星号,每次外循环输出一行 (8个 )星号,4次外循环,输出了 4行 8列星号。
n = 1 ;
while ( n <= 3 )
{ printf( " 输出外循环 n=%d\n",n );
i = 1 ;
while ( i <= 2 )
{ printf( " 1) 输出内循环 i = %d\n",i );
i ++ ; }
j = 1 ;
while ( j <= 3 )
{ printf( " 2) 输出内循环 j = %d\n",j );
j ++ ; }
n ++ ; }
例 7.5读程序,写出运行结果:
输出外循环 n=1
1) 输出内循环 i =1
1) 输出内循环 i =2
2) 输出内循环 j =1
2) 输出内循环 j =2
2) 输出内循环 j =3
输出外循环 n=2
输出结果:
1) 输出内循环 i =1
1) 输出内循环 i =2
2) 输出内循环 j =1
……
输出外循环 n=3
1) 输出内循环 i =1
……
例 7.6 输出 九九乘法表
1 * 1 = 1
1 * 2 = 2 2 * 2 = 4
1 * 3 = 3 2 * 3 = 6 3 * 3 = 9
······
1 * 9 = 9 2 * 9 =18 ······ 9 * 9 = 81
递增
1~
9
递增
9~
9
递增
3~
9
递增
2~
9
相同为
1
相同为
2
相同为
3
相同为
9
外循环内循环
i = 1
j = j + 1
j = 1
输出乘法表
i ≤ 9
j ≤ i
i = i + 1
图 5,1 0
假真真假
main( )
{ int i,j ;
for ( i = 1 ; i < = 9 ; i ++ )
{ for ( j = 1 ; j < = i ; j ++ )
printf("%d*%d=%2d ",i,j,i*j );
printf ( "\n");
}
}
程序,
例 7.7 输出 3~100中的所有素数。
分析:
1)对于某个数 n,如果从 2到 n- 1都不能被 n
整除,则该数 n为素数。
此处,除数 2到 n可以用一个 for语句来表示,
for (i=2;i<=n-1;i=i+1)
2)对于 3~ 100之间的数,可以表示如下:
for (n=3;n<=100;n=n+1)
main( )
{int n,i;
for (n=3;n<=100;n=n+1)
{for (i=2;i<=n-1;i=i+1)
if (n%i==0) break;
if (i>=n) printf("%d\t",n);
}
}
程序,
例 7.8 读程序段,写出输出结果:
for(i=1;i<=2;i++)
{for(j=1;j<=3;j++)
{for(k=1;k<=4;j++) printf(“*”);
printf(“\n”);
}
* * * *
* * * *
* * * *
* * * *
* * * *
* * * *
输出如下图形:
i从 1到 2
k从 1到 4
j从 1到 3
例 7.9 输出如下图形:
* * * * *
* * * * * * * *
* * * * * * * *
* * * * * * *
* * * * * * * * *
* * * * *
* * * * * * * *
* * * * * * * *
* * * * * * *
* * * * * * * * *
分析,共有 5行,外循环 i,1~5
第一行输出 4个空格,1个星号第三行输出 2个空格,5个星号第二行输出 3个空格,3个星号第五行输出 0个空格,9个星号
……
空格用循环变量 j控制,j=5-i
星号用循环变量 k控制,k=2i-1
程序,
main( )
{int i,j,k;
for(i=1;i<=5;i++)
{for(j=1;j<=5-i;j++) printf(,”);
for(k=1;k<=2i-1;j++) printf(“*”);
printf(“\n”);
}
}
练习 7.10 输入一个整数 n,输出如下回文塔。
1
1 2 1
1 2 3 2 1
n= 3时
n= 5时 1
1 2 1
1 2 3 2 1
1 2 3 4 3 2 1
1 2 3 4 5 4 3 2 1
三,goto语句格式:
goto 语句标号 ;
····
标号:语句 ;
作用:
1)与 if 语句构成循环结构。
2)从循环体中强制退出。
说明:
1) goto语句为无条件转向语句。 goto语句可以从循环体内跳出循环,尤其在多层循环中,
使用 goto语句可以跳到任意一层循环体内。
2)标号的命名规则同变量名。
3) goto语句不符合结构化程序设计原则,一般不主张使用。
1,continue语句
2,break语句二、循环的嵌套三,goto语句一,continue 语句和 break 语句
1,continue语句格式,continue ;
功能:结束本次循环,使程序回行到循环条件,
判断是否提前进入下一次循环。
continue语句只用于循环结构的内部,常与 if语句联合起来使用,以便在满足条件时提前结束本次循环。
例 7.1 对除 5的倍数以外的 1~ 100的数求和。
main( )
{int i,s;
s=0;
for(i=1;i<=100;i++)
{if (! (i%5))
continue;
s+=i;
}
}
如果 if判断语句为真,则跳出本次循环,回到循环条件,
判断是否进行下一次循环此处,当 i为 5的倍数时,!(i%5)为真,
跳出本次循环,不执行 continue下面的语句,直接进入下一次循环,即执行 for语句运行序列如下:
i if(!(i%5)) s+= i
1 假 s=0+1=1
2 假 s=1+2=3
3 假 s=3+3=6
4 假 s=6+4=10
5 真 不执行
6 假 s=10+6=16
…… …… ……
main()
{
int n,s;
for (n=1,s=0;n<=20;n=n+1)
{ if (n%3==0) continue;
printf("%d\t",n);
s=s+1;
}
printf("\ntotal:%d\n",s);
}
例 7.2 统计 1~50之间不能被 3整除的数的个数并输出这些数。
运行结果:
1 2 4 5 7 8 10 11
13 14 16 17 19 20
total,14
格式,break;
功能,循环体中遇见 break语句,立即结束循环,跳到循环体外,执行循环结构后面的语句。
2,break语句在循环体中 break语句常与 if语句搭配使用,并且 break语句只能用在 switch语句和循环语句中。
break只能跳出一层循环(或者一层 switch
语句结构)
例 7.3 统计输入的字符个数,并输出它们,以“!”终止。 main( )
{char chr;
int s;
for( s=0; ; s++)
{chr=getchar( );
if (chr==?!?)
break;
else printf(“c%”,chr);}
printf(“s=%d \n”,s);
}
如果 if判断语句为真,则结束循环,
执行循环结构后面的语句此处,当输入字符为,!”时,
chr==?!?为真,结束 for循环,执行循环结构后面的语句,
即执行 printf
(“s=%d \n”,s)语句运行序列如下:
输入 if(chr==?!?) 输出
a 假 a
5 假 5
$ 假 $
B 假 B
! 真 4
例 7.4 计算半径 r=1到 r=10时圆的面积,直到面积
area大于 100为止。
#define pi 3.14159
main( )
{ int r;
float area;
for( r=1;r<=10 ; r++)
{area=pi*r*r;
if (area>100) break;
printf(,%f”,area);
}
}
二、循环的嵌套一个循环体内又包含另一个完整的循环结构,称为循环的嵌套,内嵌的循环中还可以嵌套循环即为多层循环。
说明:
⑴ 嵌套的原则,不允许交叉
⑵ 循环与分支可以相互嵌套但不允许交叉。
* * * * * * * *
* * * * * * * *
* * * * * * * *
* * * * * * * *
输出图形:
for(i=1;i<=4;i++)
{ printf(“* * * * * * * *”);
printf(“\n”);
}
其中语句,printf(“* * * * * * * *”);
等价于
for(j=1;j<=8;j++) printf(“*”);
于是构成了二重循环语句:
for(i=1;i<=4;i++)
{for(j=1;j<=8;j++) printf(“*”);
printf(“\n”);
}
上面的例子中:
外循环由外循环控制变量 i控制,i由 1递增到 4。
for(i=1;i<=4;i++)
{for(j=1;j<=8;j++) printf(“*”);
printf(“\n”);
}
每 1次的外循环中,都要执行由内循环控制变量 j控制的 8次内循环操作和 1次换行操作。
由此:每次内循环输出一个星号,每次外循环输出一行 (8个 )星号,4次外循环,输出了 4行 8列星号。
n = 1 ;
while ( n <= 3 )
{ printf( " 输出外循环 n=%d\n",n );
i = 1 ;
while ( i <= 2 )
{ printf( " 1) 输出内循环 i = %d\n",i );
i ++ ; }
j = 1 ;
while ( j <= 3 )
{ printf( " 2) 输出内循环 j = %d\n",j );
j ++ ; }
n ++ ; }
例 7.5读程序,写出运行结果:
输出外循环 n=1
1) 输出内循环 i =1
1) 输出内循环 i =2
2) 输出内循环 j =1
2) 输出内循环 j =2
2) 输出内循环 j =3
输出外循环 n=2
输出结果:
1) 输出内循环 i =1
1) 输出内循环 i =2
2) 输出内循环 j =1
……
输出外循环 n=3
1) 输出内循环 i =1
……
例 7.6 输出 九九乘法表
1 * 1 = 1
1 * 2 = 2 2 * 2 = 4
1 * 3 = 3 2 * 3 = 6 3 * 3 = 9
······
1 * 9 = 9 2 * 9 =18 ······ 9 * 9 = 81
递增
1~
9
递增
9~
9
递增
3~
9
递增
2~
9
相同为
1
相同为
2
相同为
3
相同为
9
外循环内循环
i = 1
j = j + 1
j = 1
输出乘法表
i ≤ 9
j ≤ i
i = i + 1
图 5,1 0
假真真假
main( )
{ int i,j ;
for ( i = 1 ; i < = 9 ; i ++ )
{ for ( j = 1 ; j < = i ; j ++ )
printf("%d*%d=%2d ",i,j,i*j );
printf ( "\n");
}
}
程序,
例 7.7 输出 3~100中的所有素数。
分析:
1)对于某个数 n,如果从 2到 n- 1都不能被 n
整除,则该数 n为素数。
此处,除数 2到 n可以用一个 for语句来表示,
for (i=2;i<=n-1;i=i+1)
2)对于 3~ 100之间的数,可以表示如下:
for (n=3;n<=100;n=n+1)
main( )
{int n,i;
for (n=3;n<=100;n=n+1)
{for (i=2;i<=n-1;i=i+1)
if (n%i==0) break;
if (i>=n) printf("%d\t",n);
}
}
程序,
例 7.8 读程序段,写出输出结果:
for(i=1;i<=2;i++)
{for(j=1;j<=3;j++)
{for(k=1;k<=4;j++) printf(“*”);
printf(“\n”);
}
* * * *
* * * *
* * * *
* * * *
* * * *
* * * *
输出如下图形:
i从 1到 2
k从 1到 4
j从 1到 3
例 7.9 输出如下图形:
* * * * *
* * * * * * * *
* * * * * * * *
* * * * * * *
* * * * * * * * *
* * * * *
* * * * * * * *
* * * * * * * *
* * * * * * *
* * * * * * * * *
分析,共有 5行,外循环 i,1~5
第一行输出 4个空格,1个星号第三行输出 2个空格,5个星号第二行输出 3个空格,3个星号第五行输出 0个空格,9个星号
……
空格用循环变量 j控制,j=5-i
星号用循环变量 k控制,k=2i-1
程序,
main( )
{int i,j,k;
for(i=1;i<=5;i++)
{for(j=1;j<=5-i;j++) printf(,”);
for(k=1;k<=2i-1;j++) printf(“*”);
printf(“\n”);
}
}
练习 7.10 输入一个整数 n,输出如下回文塔。
1
1 2 1
1 2 3 2 1
n= 3时
n= 5时 1
1 2 1
1 2 3 2 1
1 2 3 4 3 2 1
1 2 3 4 5 4 3 2 1
三,goto语句格式:
goto 语句标号 ;
····
标号:语句 ;
作用:
1)与 if 语句构成循环结构。
2)从循环体中强制退出。
说明:
1) goto语句为无条件转向语句。 goto语句可以从循环体内跳出循环,尤其在多层循环中,
使用 goto语句可以跳到任意一层循环体内。
2)标号的命名规则同变量名。
3) goto语句不符合结构化程序设计原则,一般不主张使用。