当前位置:   article > 正文

数字菱形图案(绘制图形题的通用思路解法)(C++)

变成用数字编程半菱形图形

数字菱形图案(双重循环)(C++)

//找到一道比较有代表性的,较为全面的绘制图形,并且控制绘制字符在变化的题目,惊喜。

【问题描述】
编程打印用数字构成的菱形图案,菱形上半部分的行数n( 1<n<10 )从键盘输入,总行数为2n-1。图案的样式按下面的样例。

【输入形式】
从键盘输入包括中间一行在内的菱形上半部分的行数n ( 1<n<10 )。

【输出形式】
输出用数字构成的菱形图案,样式按下面的样例,其中各数字间用1个空格间隔,中间一行的起始数字1位于第1列。

【样例输入】
4

【样例输出】

  1. 1
  2. 1 2 1
  3. 1 2 3 2 1
  4. 1 2 3 4 3 2 1
  5. 1 2 3 2 1
  6. 1 2 1
  7. 1
解题思路(绘制图形的题套用)
  1. 把图形分块:(不是唯一分块法)

    1. 1|
    2. 1 2| 1
    3. 1 2 3| 2 1
    4. 1 2 3 4| 3 2 1
    5. ——————————————
    6. 1 2 3| 2 1
    7. 1 2| 1
    8. 1|
  2. 把分成四块的菱形,每块三角形单独写出代码(通用循环格式:for循环,i表示行数,j表示列数)

先给出完整代码:

  1. #include <iostream>
  2. #include <iomanip>
  3. using namespace std;
  4. int main()
  5. {
  6. int n;//上半部分行数
  7. cin >> n;
  8. for( int i=1; i <= n; ++i )
  9. {
  10. cout << setw( 2*(n-i)+1 );//打印空格
  11. for( int j=1; j <= i; ++j )//左上三角形
  12. cout << " " << j;
  13. for( int j=i-1; j > 0; --j )//右上三角形
  14. cout << " " << j;
  15. cout << endl;//一行结束换行
  16. }
  17. for( int i=1; i <= n-1; ++i )
  18. {
  19. cout << setw( 2*i+1 );//打印空格
  20. for( int j=1; j <= n-i; ++j )//左下三角形
  21. cout << " " << j;
  22. for( int j=n-i-1; j > 0; --j )//右下三角形
  23. cout << " " << j;
  24. cout << endl;//一行结束换行
  25. }
  26. }

详解:
左上三角形:
(TIP:先行提醒一下setw()的用法,不是调用setw(6)就空6个空格,而是表示设域宽为6个字符,如果后面连续输出其他字符,这会在域宽中从右到左覆盖“空格”)

  1. //可以自己用以下这个代码自行体验测试
  2. #include <iostream>
  3. #include <iomanip>
  4. using namespace std;
  5. int main()
  6. {
  7. int a=6;
  8. cout<<setw(1)<<a<<endl;
  9. cout<<setw(2)<<a<<endl;
  10. }
  1. #include <iostream>
  2. #include <iomanip>//使用控制符时,要在程序的头上加专门的头文件
  3. using namespace std;
  4. int main()
  5. {
  6. int n;
  7. cin >> n;//接下来以用户输入的n是4,即样例输出的菱形来做说明
  8. for( int i=1; i <= n; i++ )//作为左上三角形,行数明显与n一样,所以使i循环n次
  9. {
  10. cout << setw( 2*n-2*i+1 );//setw()即设域宽为()个字符,数格子找规律
  11. //(找规律的详解见代码结束后的表格)
  12. for( int j=1; j <= i; j++ )//定义列数j和每列输出的字符
  13. cout << " " << j;//注意题目要求是每个字符之间都有空格
  14. cout << endl;//换行不能在for j 的循环里面,应该是每完全输出一行,才考虑换行
  15. }
  16. }

以n=4为例:

行数i空格数
17
25
33
41

普遍推广到n:
(注意:空格数肯定是跟n和i有联系的,就往这上面凑)

行数i空格数
1(1=n-(n-1))2*(n-1)+1
2(2=n-(n-2))2*(n-2)+1
n-25
n-13
n1

概括的规律:
空格数=2*(n-i)+1
即setw(2*(n-i)+1)
(后面几个找规律都是按这样的思路来一一列表找,之后就不再如此反复地解释)

右上三角形:

  1. #include <iostream>
  2. #include <iomanip>
  3. using namespace std;
  4. int main()
  5. {
  6. int n;
  7. cin >> n;
  8. for( int i=1; i <= n; i++ )//行数循环
  9. {
  10. //注意,以左上的三角形为参考,则右上的三角形第一行不能输出东西,在第二行才开始输出
  11. for( int j=i-1; j > 0; j-- )//列数j循环,而且我不想再多设置一个变量,就直接把j当作输出的东西一起来循环
  12. //首先要保证循环的列数是从1到i-1,其次要保证输出的字符是左边三角形最大的数减1的那个数(即i-1)
  13. cout << " " << j;
  14. cout << endl;
  15. }
  16. }
  17. }

左下三角形:

  1. #include <iostream>
  2. #include <iomanip>
  3. using namespace std;
  4. int main()
  5. {
  6. int n;
  7. cin >> n;
  8. for( int i=1; i <= n-1; i++ )//只要输出n-1行
  9. {
  10. cout << setw( 2*i+1 );//每行前面的“空格”找规律(肯定是一个与i有关的式子)
  11. for( int j=1; j <= n-i; j++ )
  12. cout << " " << j;
  13. cout << endl;
  14. }
  15. }

右下三角形:

  1. #include <iostream>
  2. #include <iomanip>
  3. using namespace std;
  4. int main()
  5. {
  6. int n;
  7. cin >> n;
  8. for( int i=1; i <= n-1; i++ )
  9. {
  10. for( int j=n-i-1; j > 0; j-- )//同右上三角形,不仅j控制列数循环次数,而且控制输出字符,找个规律就很容易得答案了
  11. cout << " " << j;
  12. cout << endl;
  13. }
  14. }
  1. 模块组合:我们把以上四个小块组合在一起,就很容易得到完整的菱形了。
    **思路:**上下关系的模块在main()函数内按顺序并列排,左右关系的模块在for i 循环内按顺序并列排,先内左右,后外上下,删除相同的代码,保留不同的部分。

模块关系解释:

左上为 ①右上为②
左下为③右下为④

则①②为左右关系,③④也为左右关系,①②与③④则为上下关系。

PS:这样就搞定了
推广用法,菱形是比较全面的模型:

  1. 如果只是输出左上三角,左下三角,怎么组合代码呢?
  2. 如果不输出数字,而全部用“#”代替会变化的数字输出,怎么改代码呢?
  3. 如果每个输出字符之间不要留空格,怎么寻找循环规律呢?
  4. 如果打九九乘法表,怎么组合模块呢?

转载于:https://www.cnblogs.com/yuzilan/p/10626216.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/977464
推荐阅读
相关标签
  

闽ICP备14008679号