今天继续分享少儿编程项目经验,上一篇讲到了条件和循环语句以及几种常见的算法;这一篇主要分享循环嵌套打印图形。这里打印图形并非复杂图形,而是使用星号打印正三角形、倒三角形、平行四边形、菱形、空心三角形、大箭头图形。大概就如下图:
这些图形很有特点吧?!
下面我们就逐个来实现吧。
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