难点:循环的嵌套常见问题,break;和continue;的区别例题

1.单个for循环的使用

   for(1;2;3)

   语句A;

执行的流程:1→2,如果不成立(假)就跳出循环,如果成立(真)就语句A→3。然后开始第二轮循环,就直接3的值给2判断,如果不成立(假)就跳出循环,如果成立(真)就语句A→3。……依次这样循环。

Tips:需要特别注意表达式3是先执行循环体了再执行的。

2.多个for循环的使用( 外循环控制单个语句 )

   for(1;2;3)  //1

      for(4;5;6)  //2

      语句A;   //3

      语句B;   //4

解释:整体上有2个语句,//1,//2,//3是第一个语句,//4是第二个语句。第一个for控制的语句是第二个for(即//2和//3)为整体,第二个for控制//3行。

执行流程:内循环完毕再进行外循环。具体流程:首先2对1进行判断,如果成立,则4给5进行判断,如果成立则执行语句A,然后6,然后5,然后语句A,然后6,然后5这样一直循环……直到在5的时候判断不成立就回到第一个for语句的3,再2,如果成立就4,再5,这样一直循环……直到不成立就回到第一个for,如果第一个for的2也不成立则跳出控制的循环,开始执行语句B。

Q:为什么B不算在第二个的语句呢?

A:因为循环跟选择语句if一样只控制一个语句(花括号阔起来的多个语句算一个语句块,i.e一个语句),语句A和语句B没有用花括号阔起来,所以只控制语句A。

3.多个for循环的使用( 外循环控制多个语句 )

 for(1;2;3){  //1

      for(4;5;6)  //2

      语句A;   //3

      语句B;   //4 }

      语句C;  //5

解释:整体上有2个语句。//1,//2,//3,//4是第一个语句,//5是第二个语句。第一个for控制的语句是//2,//3,//4;第二个for控制的是//3。

执行流程:内循环完毕再进行外循环。具体流程:首先2对1进行判断,如果成立,则4给5进行判断,如果成立则执行语句A,然后6,然后5,然后语句A,然后6,然后5这样一直循环……直到在5的时候判断不成立就开始执行语句B,再3,再2进行判断,如果成立就4,再5,这样一直循环……直到如果第一个for的2也不成立跳出控制的循环,执行语句C

例题1:输出九九乘法表

答案:

 1 # include <stdio.h>
 2 # include <math.h>
 3 int main(){
 4     int i, j;
 5     for (i = 1;i <= 9; i++){
 6         for (j = 1; j <= i; j++)
 7             printf("%d*%d=%d\t", j, i, i * j);
 8         printf("\n");
 9         }
10     return 0;
11 }

运行结果:

 

 

  解析:\t是水平制表(相当于一个Tab=4个空格,一般用于数据对其)。

 

 例题2:

答案:

 

 解析:需要注意的是:内循环for语句中表达式1中没有给n赋值。这个n是外面定义的,所以外循环执行内循环时,n始终还是一直在加。j表达式1中定义了的,外循环到内循环首先 j 就变成了1。

例题3:

 Q:break;continue;的区别?

A:break;是提前终止循环(直接跳出了,表达式3不执行,直接执行该循环以外的语句;break;只能用于循环语句和switch语句),continue;是结束结束本次循环(即表达式3都还是会执行)。break;是直接跳出整个循环,表达式3啥的都不执行了。continue;相当于结束了这个花括号内continue;后面的循环体语句了,表达式3还是会执行的。

Q:第三行为什么空白?第四行不应该在第三行吗?

A:当执行第二排10那个数字的时候 j=5,n=9。光标是在10的后面的,没有在下一排。然后回到for的表达式3,好了,j变成了6,n变成了10。表达式2进行判断,为假。

开始执行外循环,i=3,j=1,n还是等于10。然后表达式2判断,为真,从原先光标在第二排那个10后面,换到了下一行。然后if进行判断,为真,执行break;跳出了内循环。

又一轮外循环:i=4,j=1,n还是等于10,因为上面它跳过了直接break;内循环,n是没有进行再自加的。所以在第一个if语句中,又执行换行\n

例题4: 

 

posted @ 2021-11-12 23:06  iZJ"Qq4577105  阅读(505)  评论(0)    收藏  举报