C语言-for 循环,嵌套循环

for 循环

    /*
     while (条件表打死){
        代码块
     }
     
     for(初始化表达式;条件表达式;循环后增量表达式){
        代码块
     }
     条件表达式:只有条件满足时,代码块中的内容才会执行,
     初始化表达式:在整个 for 循环的生命周期中,初始化表达式只会执行一次
     循环后增量表达式:会在每次循环完成之后调用一次
     for 循环执行流程:
     1,初始化条件表达式(只执行了一次)
     2,条件表达式是否满足
     3,满足执行代码块中的代码
     4,循环后增量表达式
     5,条件表达式是否满足-->代码块代码-->循环后增量表达式....
     
     
     
     */
    
    // 继续打子弹
//    int num = 100; // 定义的这个 num 变量是遇到大括号才会结束,那么就会占用很长一段时间的内存空间
//    while (num>0) {
//        printf("num = %i\n",num);
//        num--;
//    }
    
    // 如果定义的变量仅仅是用于控制循环什么时候结束,j循环结束之后就不使用了,那么可以使用 for 循环
    
            // 1            2/5          4/7
    for (int value = 100; value > 0; value--) { // value 的生命周期是在 for 循环中,出了 for 循环变量就释放了
        // 3/6
        printf("value = %i\n",value);
    }

for循环和 while循环的对比

  • 什么时候用 while 循环呢?
    • 如果用于控制循环的增量表达式在循环执行完成之后还需要使用,那么可以使用 while
    int num = 100;
    while (num > 0) {
        printf("num = %i\n",num);
        num--;
    }
    printf("还剩下多少发子弹:%i\n",num); // 此时还使用 num 的值
  • 什么时候用 for 循环呢?
    • 如果用于控制循环的增量b比导师在循环执行完成后不需要使用的话,就用 for 循环吧
  for (int value =100; value>0; value--) {/ 这个n value 是在 for 循环的内存空间中定义的,for 循环结束,value 的内存空间也就释放了
        printf("value = %i\n",value);
    }
    // printf("还剩下多少发子弹:%i\n",value); // 此时 value 报错显示没有被定义

for 循环注意点

  • 1,任何数值都有真假性
for(;1;){
    printf("你好");
}// 此时条件表达式一直为真,会一直执行
  • 2,for 循环也可以省略大括号

  • 3,省略大括号只会执行离他最近的第一条语句

    /*
    for (; 1; )
        printf("nihao");
    printf("jieshu");
    
    for (; 0; )
           printf("nihao");
       printf("jieshu");
    */
    
  • 作用域混乱
    for (; 1; )
        int num = 0;
    printf("jieshu");
  • 空语句
    for (; 1; );{ // 分号为空语句
        printf("nihao");
    }
    printf("jieshu");
  • 初始化表达式和增量表达式语句可以写多条语句,语句之间用逗号连接
  for (int i = 0 ,j =0; i<3; i++,j++) {
        printf("i = %i  ",i);
        printf("j = %i\n",j);
    }
  • 作用域问题
    for (int i = 0; i<3; i++) {
        int i = 5;
        printf("i = %i\n",i); // 此时输出的是 5,这个 i 是在大括号中定义的
    }
    

-

  • 作用域问题 2

        for (int i = 0; i < 3; j++) {
            int j = 0;// i = 0,小于 3 成立执行 int j = 0 初始化,然后执行增量表达式j++,但是此时有定义 j 么?初始化 j 后h执行了大括号,此时 j 的这个变量就释放了
        }
    
  • 最简单的死循环

    for(;1;);
    	printf("你好");
    
    for(;;)
        printf("nihao");// for 循环中默认条件表达式为真
    

循环嵌套

  • 什么是循环嵌套
    • 在一个循环结构中嵌套另一个循环结构
    • 如:while 循环中写 for,for 循环中再写一个 for 循环等等
    // 循环嵌套
    // 问题:会打印几次
    // 分析:外循环执行两次,但是内循环每次执行三次,所以需要执行六次
    // 结论:循环j嵌套的次数 = 外循环的执行次数 * 内循环的执行次数
    /*
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            printf("i = %i, j = %i\n",i,j);
        }
    }
    */
    
    // 什么时候会用到循环嵌套呢?
    /*
     好友列表 1
        好友 1
        好友 2
     好友列表 2
        好友 1
        好友 2
     好友列表 3
        好友 1
        好友 2
     */
    /*
    printf("好友列表 1\n");
    printf("    好友 1\n");
    printf("    好友 2\n");
    printf("好友列表 2\n");
    printf("    好友 1\n");
    printf("    好友 2\n");
    printf("好友列表 3\n");
    printf("    好友 1\n");
    printf("    好友 2\n");
     */
    // 哇塞我是不是这样打印就好了,哈哈哈哈,但是发现很多代码都是重复的
    /*
    for (int i = 1; i<=3; i++) {
        printf("好友列表 %i\n",i);
        printf("    好友 1\n");
        printf("    好友 2\n");
    }
     */
    
    // 但是此时还是有问题,好友 1,好友 2,是不是也是重复的也可以用循环搞定
    for (int i = 1; i<=3; i++) {
        printf("好友列表 %i\n",i);
        for (int j = 1; j<=4; j++) { // 此时我只需要改动条件表达式,就可以控制好友的个数
            // printf("好友列表 %i\n",i);
            printf("    好友 %i\n",j);
        }
    }

循环嵌套练习题

 /*
     打印以下的图形
     ***
     **
     *
     // 分析:这个图形是有三行的,所以外循环控制行数,通过发现每一列随着行数的减少而减少,第一行是有三个星星,第二行是有两个星星,第三行是有一个星星
     
     */

 /*
    int count = 3;
    for (int i = 1; i <= 3; i++) {
        for (int j = 1; j <= count; j++) {
            printf("*");
        }
        printf("\n");
        count--;
    }
    
    int count1 = 1;
    for (int i = 1; i <= 3; i++) {
        for (int j = count1; j <= 3; j++) {
            printf("*");
        }
        printf("\n");
        count1++;
    }
    */

// 优化一下既然定义的 count 值与 i 的值是一样的,并且 i 与 count 的值每次内循环结束后都会进行自增

    /*
    for (int i = 1; i <= 3; i++) {
        for (int j = i; j <= 3 ; j++) {
            // 第一行打印三个星星,j 应该小于等于 3--->第一行需要打印三次*--->j=i 时,内循环执行三次打印了三个星星
            // 第二行打印两个星星,j 应该小于等于 2
            // 第三行打印一个星星,j 应该小于等于 1
            printf("*");
        }
        printf("\n");
        
    }
    */
 /*
     打印以下的图形
     *
     **
     ***
     分析:图形有三行,外循环需执行三次,条件控制语句小于 3,第一行打印一个星星,第二行打印两个星星,第三行打印三个星星.
     
     */

int count = 0;
    for (int i = 0; i < 3; i++) {
        for (int j = 0 ; j <= count;j++) {
            printf("*");
        }
        printf("\n");
        count++;
    }

// 优化后条件表达式的 count 替换成 i
 for (int i = 1; i <= 3 ; i++) {
        
        for (int j = 1  ; j <= i; j++) { // 此时不固定写死条件表达式,写死就没内循环每次执行三次,让条件表达式跟随 i 的值进行变化
            printf("*");
        }
        printf("\n");
    }
  • 总结规律
    • 尖尖朝上:修改内循环的条件表达式
    • 尖尖朝下:修改内循环的初始化表达式
        /*
     打印 以下图形
     1
     12
     123
     
     */
	for (int i = 0; i < 3; i++) {
        for (int j = 0; j <= i; j++) {
            printf("%i",j+1);
        }
        printf("\n");
        
        
        

     /*
     打印以下u图形
     1
     22
     333
     
     */
    
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j <= i ; j++) {
            printf("%i",i+1);
        }
        printf("\n");
    }
    
    /*
     打印以下图形
     
     --*
     -***
     *****
     分析:看这个图形可以拆分出两个图形
     --             *
     -              ***
                    *****
     这两个图形拼在一起就是上面的图形
     
     */
    // 图形有三行,
    /*
    for (int i = 0; i < 3; i++) {
        
        for (int j = i; j < 3; j++) {
            printf("-"); //此时打印的-第一行有三个
        }
        
        for (int x = 0; x <= i; x++) {
            printf("*");
        }
        
        printf("\n");
    }
     
     打印出了这个图形,跟需求有一些出入
     ---*
     --**
     -***
     
    */
    
    for (int i = 0; i < 3; i++) {
        
        for (int j = i; j < 2; j++) {
            printf("-");
        }
        
        for (int x = 0; x <= i * 2; x++) {
            printf("*"); // 此时发现需求第一行是一个,第二行是三个,第三行是五个,那么肯定不能是小于等于 i 了,需要让他第二行循环三次,第三行循环无次,那么将 i 乘以 2即可
        }
        
        printf("\n");
    }
  • 九九乘法表
 /*
     打印c九九乘法表
     1 * 1 = 1
     1 * 2 = 2  2 * 2 = 4
     1 * 3 = 3  2 * 3 = 6   3 * 3 = 9
     ....
     */
    
    // 尖尖朝上,总共有九行
    for (int i = 1; i <= 9; i++) {
        for (int j = 1; j <= i; j++) {
            printf("%i * %i = %i",j,i,i*j);
            printf("\t");
        }
        printf("\n");
    }

猜你喜欢

转载自www.cnblogs.com/shanshan-test/p/12953185.html