从零开始学编程---第一步-C语言(十三)

时间:2014-03-05 11:40    点击:

循环嵌套你可能有点晕,没关系,我们慢慢来
看这个程序
#include <stdio.h>
main()
{
     int a,b;
     for(a=1;a<=3;a++)
     {
         for(b=1;b<=5;b++)
         {
             printf("%d ",b);
         }
         printf("\n");
     }

}

a为外循环,b为内循环
b的循环的作用是从1循环到5打印出来
a的循环是做什么?
a的循环作用是循环b循环主体3次,并每次回车
就是a循环去循环b循环3次,这很晕吧
注意:循环(名词)可以循环(动词)循环(名词)

程序说明:
当a=1     b进行循环 循环完毕打印1 2 3 4 5 然后回车
当a=2      b进行循环    循环完毕打印1 2 3 4 5 然后回车
当a=3      b进行循环    循环完毕打印1 2 3 4 5 然后回车
当a=4 条件不成立,退出循环
a的循环让b循环这个主体总共循环了3次
结果就是
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5



内外循环先循环哪个,由上面程序你应该知道了,先内后外,从里层循环后外层循环,但要从外层循环入手(等于是打开循环的门)

现在我们加大难度,你们可要多动脑筋了
看程序
#include <stdio.h>
main()
{
     int a, b, c;
     printf("a b c\n");
     for(a=0; a<2; a++)
     for(b=0; b<2; b++)
     for(c=0; c<2; c++)
     printf("%d %d %d\n",a,b,c);

}
这是3重循环,我先给你结果,你得明白结果是怎么来的,这很重要
结果
a b c
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1

这程序可能让你有点晕,我加个大括号
#include <stdio.h>
main()
{
     int a, b, c;
     printf("a b c\n");
     for(a=0; a<2; a++)
     {
         for(b=0; b<2; b++)
         {
              for(c=0; c<2; c++)
              {
                  printf("%d %d %d\n",a,b,c);
              }
         }
     }
   
}

这样应该很清晰了
先执行哪层循环,这是我们首先要解决的问题
当然是最里层,的确是先里后外,但是你得先从最外循环入手
最外循环是a循环,也就是第1层循环,b为第2层循环,c为第3层循环
开始入手
当a=0 满足条件 开始循环 a开始循环b循环的主体 下面进入b循环
当b=0 满足条件 开始循环 b开始循环c循环的主体 下面进入c循环
当c=0 满足条件 开始循环 打印 0 0 0 (a,b,c 3值都为0)
当c=1    满足条件 开始循环 打印 0 0 1
当c=2 条件不满足 退出c循环,回到b循环,此时b循环循环一次(c循环完成一次)
下面b循环开始继续循环
当b=1 满足条件 开始循环 b开始循环c循环的主体 下面进入c循环
当c=0    满足条件 开始循环 打印 0 1 0 (b已经是1了)
当c=1    满足条件 开始循环 打印 0 1 1
当c=2    条件不满足 退出c循环,回到b循环,此时b循环循环了两次(c循环又完成一次)
当b=2 条件不满足 退出b循环 回到a循环 a循环循环一次(b循环完成一次)
当a=1 条件满足 开始循环 a开始循环b循环的主体 下面进入b循环
当b=0    满足条件 开始循环 b开始循环c循环的主体 下面进入c循环
当c=0    满足条件 开始循环 打印 1 0 0 (a是为1)
当c=1    满足条件 开始循环 打印 1 0 1
当c=2    条件不满足 退出c循环,回到b循环,此时b循环循环一次(c循环完成一次)
下面b循环开始继续循环
当b=1 满足条件 开始循环 b开始循环c循环的主体 下面进入c循环
当c=0    满足条件 开始循环 打印 1 1 0
当c=1    满足条件 开始循环 打印 1 1 1
当c=2    条件不满足 退出c循环,回到b循环,此时b循环循环两次(c循环又完成一次)
当b=2 条件不满足 退出b循环 回到a循环 a循环循环两次(b循环完成两次循环)
下面开始a循环
a=2 条件不成立 退出a循环 整个程序结束

最终结果就是
a b c

0 0 0

0 0 1

0 1 0

0 1 1

1 0 0

1 0 1

1 1 0

1 1 1



这里分3层,每层循环结束后只能回到上层循环
看过盗梦空间的朋友,应该会很熟悉,那里梦中梦 3层概念类似于这里程序的层中层
这个程序可能会让大家晕很久 ,你得多点耐心,慢慢的把它弄明白
循环套循环以后会有很多,这里不明白,后面那些你就很难弄懂


来一题
用循环打印下面的图形
********
********
********
********

这可不是要你直接printf打印哦,要用循环
这题很简单
首先换行就肯定要循环的,总共4行
用for表示为
for(int a=1;a<=4;a++)
printf("\n");

一行有8个*号,也是要循环的
用fou表示
for(int b;b<=8;b++)
printf("*");

等一行*号循环到第8个时,就换行
你应该知道谁控制谁的循环,a控制b的循环 a为外循环,b为内循环

程序为
#include <stdio.h>
main()
{
  
    for(int a=1;a<=4;a++)
    {
        for(int b=1;b<=8;b++)
        {
            printf("*");
        }
        printf("\n");
    }

   
}

最外层循环为循环入口,先执行内循环
当a=1时 循环条件成立,进入循环,循环b循环主体
b循环开始循环,b循环条件成立,循环到第8个*时,条件不成立了,b循环结束,回到a循环
a循环继续循环余下部分,执行printf()语句(回车一次),第一次循环结束
回到a循环,开始a=2,接下来的大家就清楚了吧

注意: for(int a=1;a<=4;a++)这个语句里面可以直接定义a变量,这样就不需要一开始来定义循环变量了

下面用循环打印一个菱形,这是一个基础题



做这题,首先要考虑需要循环哪些
首先换行是肯定要循环的,我们定义变量a
其次,空格也是要循环的,我们定义变量b
最后,*号也是要循环的,我们定义变量c
我们先用for循环解

这个图形显然不能一次把它循环完,因为循环不是逐渐递增就是逐渐递减
这个图形到了第5行就突然递减,所以我们循环要分两部分
第1部分循环
###*
##***
#*****
*******

#号代表空格,也是我们需要循环的

第2部分循环
#*****
##***
###*

首先我们看第1部分
###*
##***
#*****
*******
换行的循环很简单,总共4行,回车4次
for(a=1;a<=4;a++)     这样也可以for(a=1;a<5;a++)或for(a=0;a<=3;a++)
printf("\n");
再让我们看看空格的循环
###
##
#
第1行空3格,第2行空2格,第3行空1格,第4行空0格
就是3,2,1,0这样的数列,数列公式为4-n (n为行数),也就是4-a
用for表示为
for(b=1;b<=4-a;b++) 或者初始化b=3 每行递减 for(b=3;b>=a;b--)
printf(" ");
最后让我们看*号的循环
很简单,第一行1个*,第2行3个*,第3行5个*,第4行7个*
1,3,5,7的数列,数列公式为2n-1 也就是2*a-1
for(c=1;c<=2*a-1;c++)
printf("*");

好了,a,b,c的循环都弄好了,怎么来循环,谁控制谁,谁在谁里面
不用说,a循环(行循环)肯定为外循环
然后b循环,c循环在内
当a=1时,第一行开始,先内循环,打印空格后接着打印*号,最后回车
所以a循环来循环b循环,c循环两个循环主体,只两层循环

      for(a=1;a<=4;a++)
      {
          for(b=3;b>=a;b--)
          {
              printf(" ");
          }
          for(c=1;c<=2*a-1;c++)
          {
              printf("*");
          }
          printf("\n");
      }

请注意:b循环和c循环都在a循环里,这里只是两层循环,而非3层循环
当a开始循环,是先循环b循环的主体后循环c循环的主体,不是b循环和c循环一起循环
当a循环循环b循环的主体,打印空格,b循环结束,继续循环a循环余下的部分,也就是c循环,打印*号,c循环结束,又接着循环a循环的余下部分,执行printf语句,第一次循环结束

当a=1时(第1行)条件成立,进入循环
开始循环b循环主体,b=1 条件成立,进入b循环,打印到第3个空格,条件不成立,b循环退出,回到a循环,a循环继续余下循环,开始c循环,c=1 条件成立
打印一个*后 条件不成立 c循环退出,回到a循环,继续a循环剩下的部分 回车

注意:程序基本都是按顺序执行语句的


循环完第1部分让我们循环第2部分
#*****
##***
###*

只要你会了上部分的循环,下部分的循环也就简单了
a循环(行循环)
for(a=1;a<=3;a++)

空格循环
1,2,3的数列    第几行就打印几个空格
for(b=1;b<=a;b++)

*号循环
5,3 ,1的数列 公式为7-2n      7-2*a
for(c=1;c<=7-2*a;c++)

整个程序为:
#include <stdio.h>
main()
{
      int a,b,c; //a为行 b为空格 c为*
      //打印前半部分
      for(a=1;a<=4;a++)
      {
          for(b=3;b>=a;b--)
          {
              printf(" ");
          }
          for(c=1;c<=2*a-1;c++)
          {
              printf("*");
          }
          printf("\n");
      }
      //打印后半部分
      for(a=1;a<=3;a++)
      {
          for(b=1;b<=a;b++)
          {
              printf(" ");
          }
          for(c=1;c<=7-2*a;c++)
          {
              printf("*");
          }
          printf("\n");
      }
  
}

用while循环解这道题
#include <stdio.h>
main()
{
      int a=1,b,c;
      while(a<=4)
      {
          b=3;
          while(b>=a)
          {
              printf(" ");
              b--;
          }
        
          c=1;
          while(c<=2*a-1)
          {
              printf("*");
              c++;
          }
          printf("\n");
          a++;
      }
    
      a=1;
      while(a<=3)
      {
          b=1;
          while(b<=a)
          {
              printf(" ");
              b++;
          }
          c=5;
          while(c>=2*a-1)
          {
              printf("*");
              c--;
          }
          printf("\n");
          a++;
      }
  
}


用for的同时也要了解while的用法,两个都很重要
数列找规律你得多加强练习,这是很基本的数学知识,编程很多都会用到


接着继续,用循环打印等腰三角形
##*
#***
*****

要打印这个要是你会打印菱形,那这个就没点难度
程序如下:
#include <stdio.h>
main()
{
      int a,b,c;
      for(a=1;a<=3;a++)
      {
          for(b=2;b>=a;b--)
          {
              printf(" ");
          }
          for(c=1;c<=2*a-1;c++)
          {
              printf("*");
          }
          printf("\n");
      }
    
}


现在加大难度,输入一个数N,打印腰为N长度的等腰三角形
比如我输入5,打印的等腰三角形如下
####*
###***
##*****
#*******
*********

其实输入这个数N,就是行数
我想这个程序你们应该能做出来的
程序如下
#include <stdio.h>
main()
{
      int a,b,c,n;
      printf("请输入一个数:\n");
      scanf("%d",&n);
      for(a=1;a<=n;a++)
      {
          for(b=n-1;b>=a;b--)
          {
              printf(" ");
          }
          for(c=1;c<=2*a-1;c++)
          {
              printf("*");
          }
          printf("\n");
      }
    
}


for(b=n-1;b>=a;b--)改为for(b=1;b<=n-a;b++)也可以
原因自己想吧

把等腰三角形倒着打印怎么弄?不就是我们打印菱形的下部分吗
不过照着图形打印还是简单(因为你知道需要循环的数目),但要打印输入数N的等腰三角形倒着打印,就没那么容易了
假如我输入n=4,就要这样打印
*******
#*****
##***
###*

首先行循环
for(a=1;a<=n;a++)
printf("\n");
然后是空格循环 每一行打印n-1个空格 比如第一行打印n-1个空格,就是0个
for(b=1;b<=a-1;b++)
printf(" ");
最后是*循环,难度就在这里
第1行开始 7个*     总共4行
7,5,3,1的数列        数列公式为9-2n


那n行呢?怎么表示
如果是3行,就是5,3,1的数列 公式为7-2n
如果是2行,就是3,1的数列    公式为5-2n
如果只1行,就是1的数列    公式为3-2n

看出规律的吗
1行----3
2行----5
3行----7

3,5,7的数列公式    就是2n+1

所以*循环为
for(c=1;c<=2*n+1-2*a;c++)
这只是其实一种逻辑

让我们让看另一种逻辑
这个图形如果直接打印
*******
#*****
##***
###*

*号循环的零外一种方法,递减
第1行7个*,我们就初始化c=7 循环条件为c>=2*a-1 c--
第一行7>=1打印7个,第2行7>=3打印5个 第3行7>=5打印3个
如果有n行,怎么让它自动初始化为第一行的星数?
如果有4行,c初始化为7
如果有3行,c初始化为5
如果有2行,c初始化为3
如果有1行,c初始化为1

规律就出来了
如果有n行,c就初始化为2n-1

所以*号循环又可以写为
for(c=2*n-1;c>=2*a-1;c--)


最后程序为
#include <stdio.h>
main()
{
      int a,b,c,n;
      printf("请输入一个数:\n");
      scanf("%d",&n);
      for(a=1;a<=n;a++)
      {
          for(b=1;b<=a-1;b++)
          {
              printf(" ");
          }
          for(c=1;c<=2*n+1-2*a;c++)
          {
              printf("*");
          }
          printf("\n");
      }
    
}


晕了吧,学到这里你该知道逻辑是多么的重要了吧
数列找规律得出公式这个能力你应该多加学习

来源:幻想编程//所属分类:站长原创/更新时间:2014-03-05 11:40
顶一下
(10)
90.9%
踩一下
(1)
9.1%
上一篇:从零开始学编程---第一步-C语言(十二)
下一篇:从零开始学编程---第一步-C语言(十四)
相关内容