• 练习题之打印图案


    前言

    本次的练习题,相信大家在第一次遇到打印图案时,总是会摸不着头脑,不知道如何去操作

    笔者也一样,我真诚的希望通过这么一篇博客可以让大家在遇到打印图案这类题目时,有自己的应

    对方法,所以本次博客文字居多并且由浅入深,请大家耐心看完

    我们从最简单的开始吧

    题目一

    KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的线段图案。

    输入:

    10
    2
    

    输出 **********

            **

    1分析 为什么要有这么简单的题目呢,为的是能够循序渐进,让初学者也能够入门,首先它的输入可以

    通过while(scanf()==1)通过scanf的返回值来重复输入 那输出也同样是简单了只要根据输入的值通过for循环来打印即可

    2代码实现

    1. #include<stdio.h>
    2. int main()
    3. {
    4. int a;
    5. while(scanf("%d",&a)!=EOF)
    6. {
    7. int i=0;
    8. for(i=0;i<a;i++)
    9. printf("*");
    10. printf("\n");
    11. }
    12. return 0;
    13. }

    题目二

    KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的正方形图案。

    多组输入,一个整数(1~20),表示正方形的长度,也表示输出行数。

    针对每行输入,输出用“*”组成的对应边长的正方形,每个“*”后面有一个空格。

    输入:

    4

    输出:

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

    1分析,哎呀就是两个for循环嵌套,没有难度,两个循环控制的数 j i 都等于输入的数

    内层代码就直接打印* 就行

    2代码实现

    1. #include <stdio.h>
    2. int main() {
    3. int a;
    4. while (scanf("%d", &a) != EOF) {
    5. int i=0;
    6. for(i=0;i<a;i++)
    7. {
    8. int j=0;
    9. for(j=0;j<a;j++)
    10. {
    11. printf("* ");
    12. }
    13. printf("\n");
    14. }
    15. }
    16. return 0;
    17. }

    题目三

    KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的直角三角形图案。

    多组输入,一个整数(2~20),表示直角三角形直角边的长度,即“*”的数量,也表示输出行数。

    针对每行输入,输出用“*”组成的对应长度的直角三角形,每个“*”后面有一个空格。

    输入:

    4
    

    输出:

    *
    * *
    * * *
    * * * *

    1分析,首先他同样是两个for循环,只是两个控制的数 i j  看 第一行打印一个

    第二行打印两个 等等    i j 一个控制行 一个控制列数 

    我们以4为例   那么就应该打印4行,每行的 * 多少取决于下一个操作数 j

    我们让i一开始为0,让它小于4

    i的取值范围为0~3 共有4个数字 分别对应每一行

    刚好,当i等于0时打印一个 *  我们让j一开始为0让它小于等于i 然后让 j++

    正好可以一 一对应

    2代码实现

    1. #include <stdio.h>
    2. int main() {
    3. int a;
    4. while (scanf("%d", &a) != EOF) {
    5. int i=0;
    6. for(i=0;i<a;i++)
    7. {
    8. int j=0;
    9. for(j=0;j<=i;j++)
    10. {
    11. printf("* ");
    12. }
    13. printf("\n");
    14. }
    15. }
    16. return 0;
    17. }

    3复盘 这个代码固然简单但它的思路很重要,打印图案的终极诀窍在于找到

    输入数与循环控制数 i j 的关系

    题目四

    KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的翻转直角三角形图案。

    多组输入,一个整数(2~20),表示翻转直角三角形直角边的长度,即“*”的数量,也表示输出行数。

    针对每行输入,输出用“*”组成的对应长度的翻转直角三角形,每个“*”后面有一个空格。

    输入:

    5
    

    输出:

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

    1分析 这个题目和上个题目是一样的,只是第二层循环的控制关系发生了改变

    以5为例

    我们其实仍然可以是使 i 的范围为0-4 他仍然是执行五次

    但是j与i的关系要发生改变

    我们完全可以使j一开始就为输入的数5,但是我们得要每一行少打印一个符号

    那我们可以看到 i是在递增的呀,是不是 所以关系不就来了

    只要      j-i>0不就行了

    当i为0时  j一开始就为5(输入的数)那么此时 j的可执行语句的值为 5 4 3 2 1 打印5个

    当i为1时  j一开始就为5(输入的数)那么此时 j的可执行语句的值为 5 4 3 2  打印4个

    等等·······

    这就是 i 与 j 与我们要得到的东西之间的关系

    但还有一种思路

    你看 我们难道不可以先让我们的i 的值为输入值 5(还是以5为例)

    i 决定行数 那么i的取值就应该为 5 4 3 2 1

    那么i的结束条件应该为i>0

    第一层循环就决定了   重点还是在第二层循环

    我们得让j 和i和输出打印图案构建关系

    当 i为5时  我们要打印5个符号 诶这是不是非常的对应吗 这时只需

    让j 为5,让j至少大于0   j--  j的值可以为5 4 3 2 1

    那么j就可以被i赋值,完成图案打印

    2代码实现

    1. #include <stdio.h>
    2. int main() {
    3. int a;
    4. while(scanf("%d",&a)!=EOF)
    5. {
    6. int i=a;
    7. for(i=a;i>0;i--)
    8. {
    9. int j=0;
    10. for(j=0;j<i;j++)
    11. {
    12. printf("* ");
    13. }
    14. printf("\n");
    15. }
    16. }
    17. return 0;
    18. }

    3复盘我们这个代码是第二种思路,第一种思路大家可以自行尝试

    这个代码就更加体现了 数字无所谓,主要是上下限以及循环与打印内容之间的对应关系

    从这题开始我们就不那么详细的讲解了

    题目五

    KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的带空格直角三角形图案。

    多组输入,一个整数(2~20),表示直角三角形直角边的长度,即“*”的数量,也表示输出行数

    针对每行输入,输出用“*”组成的对应长度的直角三角形,每个“*”后面有一个空格。

    输入:

    5
    

    输出:

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

    1分析 这个题目有两种字符需要打印,咱们可以通过三目操作符来打印

    看嘛,随便来

    以5为例

    直接让我们的 i 初始化为 1   i<=5(输入数)  i++呗

    第一行4个空格一个*

    第二行3个空格两个*

    等等·········

    那么此时要打印的内容是一样多的 只是什么时候打印空格什么时候打印*

    直接看,我们让j的取值从1到5,也就是 j一开始为1   j++

    那么中间的判断为 j<=5

    这时只需要在内层循环中printf  再加上一个三目操作符

    当i>=j时 打印* 否则打印空格,至此思路已经很清晰了

    1. #include<stdio.h>
    2. int main()
    3. {
    4. int a;
    5. while(scanf("%d",&a)!=EOF)
    6. {
    7. int i=0;
    8. for(i=1;i<=a;i++)
    9. {
    10. int j=1;
    11. for(j=1;j<=a;j++)
    12. {
    13. printf(i-j>=0?"*":" ");
    14. }
    15. printf("\n");
    16. }
    17. }
    18. return 0;
    19. }

    让我们看看结果

    题目六

    KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的金字塔图案。

    多组输入,一个整数(2~20),表示金字塔边的长度,即“*”的数量,,也表示输出行数。

    针对每行输入,输出用“*”组成的金字塔,每个“*”后面有一个空格。

    输入:

    4
    

    输出:

       * 
      * * 
     * * * 
    * * * * 

    1分析 首先这个图案里有空格

    我们以4为例 第一行3个空格 第二行2个空格 第三行1个空格 第四行没有空格

    我们不妨将 i从大到小 也就是 i=4(输入数) i>0 i--

    那接下来就是 j 此时j可以作为两个分别的for循环

    一个打印空格 一个打印 * 

    1空格 如果让j开始为1  那么第一行要打印(输入数-1)的空格

     怎么办 我们完全可以 让 j

    此时可以看到 第一行 j的取值为 1 2 3刚好3次

    然后随着i的减少打印的次数也减少

    2*  打完空格后 怎么来打印*  随着i的减少*打印的越多

    所以j与i可以构建关系  我们让j一开始为1

    j

    那么此题目就解决了,大家其实可以多换几个数字来做题,结果也可以是一样的

    2代码实现

    1. #include <stdio.h>
    2. int main() {
    3. int a;
    4. while (scanf("%d", &a) != EOF) {
    5. int i = a;
    6. for (i = a; i > 0; i--)
    7. {
    8. int j = 1;
    9. for (j = 1; j <i; j++)
    10. printf(" ");
    11. for (j = 1; j < a - i + 2; j++)
    12. {
    13. printf("* ");
    14. }
    15. printf("\n");
    16. }
    17. }
    18. return 0;
    19. }

    看看结果

    题目七

    KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的菱形图案。

    多组输入,一个整数(2~20)

    针对每行输入,输出用“*”组成的菱形,每个“*”后面有一个空格。

    1分析我不想解释了,下半部分思路是一样的

    2代码实现

    1. #include <stdio.h>
    2. int main() {
    3. int a;
    4. while (scanf("%d", &a) != EOF) {
    5. int i=a;
    6. //第一部分
    7. for(i=a;i>0;i--)
    8. {
    9. int j=1;
    10. for(j=i;j>0;j--)
    11. {
    12. printf(" ");
    13. }
    14. for(j=a;j>=i;j--)
    15. {
    16. printf("* ");
    17. }
    18. printf("\n");
    19. }
    20. //第二部分
    21. for(i=a+1;i>0;i--)
    22. {
    23. printf("* ");
    24. }
    25. printf("\n");
    26. //第三部分
    27. for(i=1;i<=a;i++)
    28. {
    29. int j=1;
    30. for(j=i;j>0;j--)
    31. {
    32. printf(" ");
    33. }
    34. for(j=a;j>=i;j--)
    35. {
    36. printf("* ");
    37. }
    38. printf("\n");
    39. }
    40. }
    41. return 0;
    42. }

    看结果

    扩展题目

    C语言必打代码 爱心代码
    1.加上f是为节省步骤,因为浮点数是会默认为double类型 加上f直接不用转化
    2.(x * x + y * y - 1)的三次方 - x * x * y * y * y = 0为公式
    3.x y 的改变不同这是由于 x y轴 在控制台里不是等距的

    直接看代码,最后一个了,祝大家天天开心

    1. int main()
    2. {
    3. printf("祝你每天都开心呦\n");
    4. system("color 0e");
    5. float x, y, a;
    6. for (y = 1.5f; y > -1.5; y -= 0.1f)
    7. {
    8. for (x = -1.5f; x < 1.5f; x += .05f)//x轴走的比y轴少,所以打印的多
    9. {
    10. a = x * x + y * y - 1;
    11. printf(a * a * a - x * x * y * y*y< 0.0f ? "x" : " ");//笛卡尔心形线公式
    12. }
    13. Sleep(200);
    14. printf("\n");
    15. }
    16. return 0;
    17. }

    看结果

    所以通过数学的解析几何,我们理论上是可以打印出任何一种用表达式表示的图案

    最后我们可以试一试打印圆形

    看代码

    1. int main()
    2. {
    3. float a, b;
    4. system("color 0e");
    5. for (a = 0.0f; a < 2.0f; a += 0.05f)
    6. {
    7. for (b = 0.0f; b < 2.0f; b += 0.025f)
    8. {
    9. printf((a - 1) * (a - 1) + (b - 1) * (b - 1) < 1.0f ? "*" : " ");
    10. }
    11. printf("\n");
    12. }
    13. return 0;
    14. }

    看结果

    是不是很奇妙,大家可自行去打印其他的图案,但要注意的是横轴的密集程度一般比纵轴多一倍

    是他的两倍,因为 在小黑窗上一个字符是一个立起来的长方形 高比长大

    ok 也算是敲完了 希望大家在遇到一般的图案题目时能够轻松解决,祝大家开心

  • 相关阅读:
    机场航站楼热成像视频下融入运动信息的显著人体检测方法
    FFmpeg源代码简单分析-编码-av_write_trailer()
    序列化(二)Parcelable
    认识京东联盟API,获取APPkey和APPsecret|直接调用KEY方式
    【实战-05】 flinksql look up join
    进公司第二天:绿盾+TFS拉取代码
    《知识点累积》Vue2.x
    VSCODE编译阿里云HaaS程序时遇到Win32file找不到错误怎么办?
    Worthington肽合成应用丨胰凝乳蛋白酶方案
    [附源码]Python计算机毕业设计Django绿色生活交流社区网站
  • 原文地址:https://blog.csdn.net/comeonworld/article/details/136698037