【少儿编程】循环嵌套打印图形

今天继续分享少儿编程项目经验,上一篇讲到了条件和循环语句以及几种常见的算法;这一篇主要分享循环嵌套打印图形。这里打印图形并非复杂图形,而是使用星号打印正三角形、倒三角形、平行四边形、菱形、空心三角形、大箭头图形。大概就如下图:

这些图形很有特点吧?!

下面我们就逐个来实现吧。

1.正三角形
首先,要搞明白什么是正三角形。对于青少年来说,还是不清楚的。当时我也忘记了,经过复习才明白了,它就是三个角都是60度的三角形。

从星号的数量来说,就是第1行1个星,第2行3个星,第3行5个星,第4行7个星;第5行9个星。

然后,再继续分析,从编程角度来说:
首先需要明白:这是一个两重for循环,第一重for循环是遍历总行数;第二重for循环,先遍历空格;后遍历星号。

第一重for循环,就是
for(int i = 1; i <= n; i++) //遍历总行数

再分析第二重for循环的空格,星号的个数(以5行为例):
第1行,4个空格, 1个星号
第2行,3个空格,3个星号
第3行,2个空格,5个星号
第4行,1个空格,7个星号
第5行,0个空格,9个星号

上述的空格和星号,再扩展到i 行,那就是如下的格式
第 i 行,(n – i) 个空格, (2 * i – 1 )个星号。

通过上述的分析,就得到如下的代码:

include

using namespace std;
int main() {

int n;
cin>>n;
/*
*
***
*****
*
***
*/

/*
思路:
1. 首先确定有多少行.即确定整体行数.

2.  1行    4个空格,   1个星
    2      3个空格,   3个星
    3      2个空格,   5个星

    i     n-i个空格,  2i - 1 

*/
for (int i = 1; i <= n; i++) {

for(int j = 1; j <= n - i; j++) {
  cout<<" ";
}

for(int j = 1; j <= 2*i - 1; j++) {
  cout<<"*";
}
cout<<endl;

}
}
运行上述代码,就得到示例中的正三角形图形。

这里要注意: 当i或者j从0开始的时候,就有错误,老是得不到正确的图形.这里记录下.
//不正确的打印
for (int i = 0; i < n; i++) {

  for(int j = 0; j <= n - i; j++) {
    cout<<" ";
  }

  for(int j = 0; j <= 2*i - 1; j++) {
    cout<<"*";
  }
  cout<<endl;

}*

2.倒三角形
明白了正三角形,那么倒三角形就简单了:把打印空格和星号的次序倒过来就OK了。这里就直接上代码。

include

using namespace std;
int main() {

int n;
cin>>n;
/*
*

***
*
*/

/*
思路:
1. 首先确定有多少行.即确定整体行数.

 2. 分析  第1行   0个空格, 9个星
          2行   1个空格,  7个星
          3行   2个空格, 5个星

      i行   i-1 个空格,  2 * i -1 个星  

*/

for(int i = 1; i <= n; i++) {

for (int j = 1; j <= i - 1; j++ ) {
  cout<<" "; 
}


for (int j = 1; j <= 2 * n - (2 * i - 1); j++ ) {
  cout<<"*"; 
}
cout<<endl;

}
}
运行上述代码,就得到示例中的倒三角形图形。

3.平行四边形
这个图形与前面的正倒三角形基本类似,星号前面的空格是变化的,而星号的个数是固定的。这样倒觉得平行四边形更简单了。

还是按正三角形的逻辑:
先循环总行数;
然后在先打印空格,后打印星号。

而对空格的分析就是如下:
第1行 0个空格, 星号不变(5个)
第2行 1个空格, 星号不变(5个)
第3行 2个空格, 星号不变(5个)
第4行 3个空格, 星号不变(5个)
第5行 4个空格, 星号不变(5个)

这样可以类推出 第 i 行 的空格为 i – 1 个。
经过这样分析,得到如下的代码:

include

using namespace std;

int main() {

int n;
cin>>n;
/*




*
/ /
思路:
1. 首先确定有多少行.即确定整体行数.

 2. 分析  第1行   0个空格, n个星
          2行   1个空格,  n个星
          3行   2个空格, n个星

      i行   i - 1 个空格, n个星

*/

for(int i = 1; i <= n; i++) {

for(int j = 1; j <= i - 1; j++) {
  cout<<" "; 
}

for(int j = 1; j <= n; j++) {
  cout<<"*"; 
}
cout<<endl;

}

4.菱形
第四个图形是菱形,经过分析图形,可以得到菱形是由正三角形叠加倒三角形而成,区别就是中间少一排星号。

既然正三角形和倒三角形都已经实现过,对其改进下就得到菱形图形。以下就是菱形图形的代码。

include

using namespace std;

int main() {

int n;
cin>>n;
/*
*
***
*****
*
***
*
*
***
*

*/

/*
思路:
菱形就是前面正三角和倒三角的组合 .

唯一的不同是中间,重复了一行星号. 重复的一行的处理,就是倒三角部分从第二行开始绘制. 

*/

//正三角
for (int i = 1; i <= n; i++) {

for(int j = 1; j <= n - i; j++) {
  cout<<" ";
}

for(int j = 1; j <= 2*i - 1; j++) {
  cout<<"*";
}
cout<<endl;

}

//倒三角
//重复的一行的处理,就是倒三角部分从第二行开始绘制.
for(int i = 2; i <= n; i++) {

for (int j = 1; j <= i - 1; j++ ) {
  cout<<" "; 
}


for (int j = 1; j <= 2 * n - (2 * i - 1); j++ ) {
  cout<<"*"; 
}
cout<<endl;

}
}

还有一个大箭头图形,其实是平行四边形的一个变体,可以直接在平行四边形代码上进行调整。得到如下的代码:

include

using namespace std;
int main() {

int n;
cin>>n;

/*



********
 ********
******** 


*/
//正平行四边形
for(int i = 1; i <= n; i++) {

for(int j = 1; j <= i - 1; j++) {
  cout<<" "; 
}

for(int j = 1; j <= n; j++) {
  cout<<"*"; 
}
cout<<endl;

}

//倒平行四边形
/*
思路:
1. 首先确定有多少行.即确定整体行数.

 2. 分析  第1行   4个空格, n个星
          2行   3个空格,  n个星
          3行   1个空格, n个星

      i行   n - i 个空格, n个星

*/

for(int i = 1; i <= n; i++) {

for(int j = 1; j <= n - i; j++) {
  cout<<" "; 
}

for(int j = 1; j <= n; j++) {
  cout<<"*"; 
}
cout<<endl;

}
}
最后一个图形是空心三角形。

5.空心三角形
分析空心三角形,还是嵌套for循环,其中外层大循环是打印总行数;在内层循环中,打印星号部分做一些替换,每行中的第1列和最后一列要打印星号,其他列用空格替换。
通过上述实践后,发现第1行和最后1行,满足不了要求,那么针对于此,就针对第1行和最后1行,直接打印星号。

这样就得到如下的代码

include

using namespace std;
int main() {

int n;
cin>>n;

 /*
    *
   * *
  *   *
 *     *
*********

*/

/*
思路:
1. 首先确定有多少行.即确定整体行数.

 2. 分析:
      1. 星号前面的空格和正三角形的空格一样.   n-i个空格
      1. 第1行和最后一行要打印全部打印星号.

  2. 中间其他行 :
     第1列和最后一列 打印星号, 中间的列打印空格 

*/

for (int i = 1; i <= n; i++) {

//打印空格 
for(int j = 1; j <= n - i; j++) {
  cout<<" ";
}

 if ( i == 1 || i == n) { 
    //第1行 打印一个星 
    //最后一行,打印 2* i- 1 个星 
  for(int j = 1; j <= 2*i - 1; j++) {
    cout<<"*";
  }
}
else {  //除了第1行和最后一行,其他的行数,   第1列或最后一列 打印 星号,其他列打印空格 
  for(int j = 1; j <= 2*i - 1; j++) {
    if (j == 1 || j == 2 * i - 1) {
      cout<<"*";
    } else {
      cout<<" ";
    }
  }
}

cout<<endl;

}

}

总结:
通过这几个图形的分析,我们知道编写这一类程序题,要明白:是for循环嵌套使用,外层一个大循环,内层小循环。

具体就是有以下两个步骤:
1.第一层大循环,遍历总行数。
代码就是如下:
for(int i = 1; i <= n; i++)

2.第二层是内循环。这里就要分析空格和星号的变化规律,可以通过前面几行的枚举,推导出第i行的 空格和星号的变化规律。
以正三角形为例:
第1行,4个空格, 1个星号
第2行,3个空格,3个星号
第3行,2个空格,5个星号
第4行,1个空格,7个星号
第5行,0个空格,9个星号

再扩展到第 i 行,那就是如下的形式
第 i 行,(n – i) 个空格, (2 * i – 1 )个星号。

通过这两个步骤,基本上能编写出这种类型的程序了。

以上就是循环嵌套打印图形的示例。

声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/416211.html

(0)
联系我们
联系我们
分享本页
返回顶部