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


    for 循环

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

    for循环和 while循环的对比

    • 什么时候用 while 循环呢?
      • 如果用于控制循环的增量表达式在循环执行完成之后还需要使用,那么可以使用 while
        int num = 100;
        while (num > 0) {
            printf("num = %i
    ",num);
            num--;
        }
        printf("还剩下多少发子弹:%i
    ",num); // 此时还使用 num 的值
    
    • 什么时候用 for 循环呢?
      • 如果用于控制循环的增量b比导师在循环执行完成后不需要使用的话,就用 for 循环吧
      for (int value =100; value>0; value--) {/ 这个n value 是在 for 循环的内存空间中定义的,for 循环结束,value 的内存空间也就释放了
            printf("value = %i
    ",value);
        }
        // printf("还剩下多少发子弹:%i
    ",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
    ",j);
        }
    
    • 作用域问题
        for (int i = 0; i<3; i++) {
            int i = 5;
            printf("i = %i
    ",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
    ",i,j);
            }
        }
        */
        
        // 什么时候会用到循环嵌套呢?
        /*
         好友列表 1
            好友 1
            好友 2
         好友列表 2
            好友 1
            好友 2
         好友列表 3
            好友 1
            好友 2
         */
        /*
        printf("好友列表 1
    ");
        printf("    好友 1
    ");
        printf("    好友 2
    ");
        printf("好友列表 2
    ");
        printf("    好友 1
    ");
        printf("    好友 2
    ");
        printf("好友列表 3
    ");
        printf("    好友 1
    ");
        printf("    好友 2
    ");
         */
        // 哇塞我是不是这样打印就好了,哈哈哈哈,但是发现很多代码都是重复的
        /*
        for (int i = 1; i<=3; i++) {
            printf("好友列表 %i
    ",i);
            printf("    好友 1
    ");
            printf("    好友 2
    ");
        }
         */
        
        // 但是此时还是有问题,好友 1,好友 2,是不是也是重复的也可以用循环搞定
        for (int i = 1; i<=3; i++) {
            printf("好友列表 %i
    ",i);
            for (int j = 1; j<=4; j++) { // 此时我只需要改动条件表达式,就可以控制好友的个数
                // printf("好友列表 %i
    ",i);
                printf("    好友 %i
    ",j);
            }
        }
    

    循环嵌套练习题

     /*
         打印以下的图形
         ***
         **
         *
         // 分析:这个图形是有三行的,所以外循环控制行数,通过发现每一列随着行数的减少而减少,第一行是有三个星星,第二行是有两个星星,第三行是有一个星星
         
         */
    
     /*
        int count = 3;
        for (int i = 1; i <= 3; i++) {
            for (int j = 1; j <= count; j++) {
                printf("*");
            }
            printf("
    ");
            count--;
        }
        
        int count1 = 1;
        for (int i = 1; i <= 3; i++) {
            for (int j = count1; j <= 3; j++) {
                printf("*");
            }
            printf("
    ");
            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("
    ");
            
        }
        */
    
     /*
         打印以下的图形
         *
         **
         ***
         分析:图形有三行,外循环需执行三次,条件控制语句小于 3,第一行打印一个星星,第二行打印两个星星,第三行打印三个星星.
         
         */
    
    int count = 0;
        for (int i = 0; i < 3; i++) {
            for (int j = 0 ; j <= count;j++) {
                printf("*");
            }
            printf("
    ");
            count++;
        }
    
    // 优化后条件表达式的 count 替换成 i
     for (int i = 1; i <= 3 ; i++) {
            
            for (int j = 1  ; j <= i; j++) { // 此时不固定写死条件表达式,写死就没内循环每次执行三次,让条件表达式跟随 i 的值进行变化
                printf("*");
            }
            printf("
    ");
        }
    
    • 总结规律
      • 尖尖朝上:修改内循环的条件表达式
      • 尖尖朝下:修改内循环的初始化表达式
            /*
         打印 以下图形
         1
         12
         123
         
         */
    	for (int i = 0; i < 3; i++) {
            for (int j = 0; j <= i; j++) {
                printf("%i",j+1);
            }
            printf("
    ");
            
            
            
    
         /*
         打印以下u图形
         1
         22
         333
         
         */
        
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j <= i ; j++) {
                printf("%i",i+1);
            }
            printf("
    ");
        }
    
        
        /*
         打印以下图形
         
         --*
         -***
         *****
         分析:看这个图形可以拆分出两个图形
         --             *
         -              ***
                        *****
         这两个图形拼在一起就是上面的图形
         
         */
        // 图形有三行,
        /*
        for (int i = 0; i < 3; i++) {
            
            for (int j = i; j < 3; j++) {
                printf("-"); //此时打印的-第一行有三个
            }
            
            for (int x = 0; x <= i; x++) {
                printf("*");
            }
            
            printf("
    ");
        }
         
         打印出了这个图形,跟需求有一些出入
         ---*
         --**
         -***
         
        */
        
        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("
    ");
        }
    
    • 九九乘法表
     /*
         打印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("	");
            }
            printf("
    ");
        }
    
  • 相关阅读:
    创建用户自定义函数 SQL
    关于“该列没有包含在聚合函数或 GROUP BY 子句中”
    转Oracle性能参数—经典常用
    The server committed a protocol violation. Section=ResponseHeader Detail=CR must be followed by LF 错误
    js定时刷新
    用户获取mac地址的方法
    聚集索引和非聚集索引的区别
    WCF启动报错:“进程不具有此命名空间的访问权限”的解决方法
    利用js文件加载js文件的方法
    C#下载的几种方法
  • 原文地址:https://www.cnblogs.com/shanshan-test/p/12953185.html
Copyright © 2020-2023  润新知