c语言中一些图案打印题的总结

本文总结了C语言中直角三角形、翻转三角形、带空格三角形、金字塔、倒金字塔、菱形、K形、空心正方形、空心三角形、平行四边形、星号梯形、空心六边形等经典图案的打印方法,通过实例和代码展示如何利用循环和条件语句实现各种形状。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

c语言中一些图案打印题的小总结

  • 打印直角三角形

    输入描述:

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

    示例:

    输入 : 4

    输出:

    *

    * *

    * * *

    * * * *

     
    
    #include <stdio.h>
    int main()
    {
        int n = 0;
        while(~scanf("%d",&n))// //这种写法是因为scanf读取失败返回EOF,EOF是-1,所以按位取反后的结果是0,0为假,可以让循环停止。
        {
            int i =0 ;//行数
            for(i=1;i<=n;i++)
            {
                
                int j =0 ;
                for(j=1;j<=i;j++)
                {
                    printf("* ");
                }
                printf("\n");
            }
        }
        return 0;
    }
  • 翻转直角三角形

    输入描述:

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

    示例:

    输入:5

    输出:

    * * * * *

    * * * *

    * * *

    * *

    *

     
    
    #include <stdio.h>
     int main()
     {
         int n =0;
         while(scanf("%d",&n)!=EOF)
         {
             int i = 0;
             for(i=n;i>=1;i--)
             {
                 int j = 0;
                 for(j=i;j>=1;j--)
                 {
                     //注意空格
                     printf("* ");
                 }
                 printf("\n");
             }
         }
         return 0;
     }
     
  • 带空格的直角三角形

    输入描述:

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

    示例:

    输入:5

    输出:

    *

    * *

    * * *

    * * * *

    * * * * *

     
    //常规解法
     #include <stdio.h>
     int main()
     {
         int n =0;
         while(scanf("%d",&n)!=EOF)
         {
             int i = 0;
             for(i=0;i<n;i++)
             {
                 //先打印空格
                 int j =0;
                 for(j=0;j<n-i-1;j++)
                 {
                     printf("  ");
                 }
                 //打印 *
                 for(j=0;j<=i;j++)
                 {
                     printf("* ");
                 }
                 printf("\n");
             }
         }
         return 0;
     }
     ​
     //解法2(根据行列关系来找关系)
     #include <stdio.h>
     int main()
     {
         int n = 0;
         while(scanf("%d",&n)!=EOF)
         {
             int i = 0;
             int j = 0;
             //行数
             for(i=0;i<n;i++)
             {
                 //每一行
                 for(j=0;j<n;j++)
                 {
                     //行和列的和
                     if(i+j<n-1)
                     {
                         printf("  ");
                     }
                     else
                     {
                         printf("* ");
                     }
                 }
                 printf("\n");
             }
         }
         return 0;
     }
     ​

     

   上图为方法2i+j<n-1理解的配图

  • 金字塔图案

    输入描述:

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

    示例:

    输入:4

    输出:

       *

      * *

     * * *

    * * * *

 
#include <stdio.h>
 int main()
 {
     int n = 0;
     while(scanf("%d", &n) != EOF)
    {
         int i = 0;
         for(i=0; i<n; i++)
        {
             int j = 0;
             //空格
             for(j=0; j<n-1-i; j++)
            {
                 printf(" ");
            }
             //*
             for(j=0; j<=i; j++)
            {
                 printf("* ");
            }
             printf("\n");
        }
     }
     return 0;
 }
  • 倒金字塔图案

    输入描述:

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

    示例:

    输入:5

    输出:

    * * * * *

     * * * *

      * * *

       * *

        *

 #include <stdio.h>
 int main()
 {
     int n = 0;
     while(scanf("%d", &n) != EOF)
    {
         int i = 0;
         for(i=0; i<n; i++)
        {
             //一行
             int j = 0;
             for(j=0; j<i; j++)
            {
                 printf(" ");
            }
             for(j=0; j<n-i; j++)
            {
                 printf("* ");
            }
             printf("\n");
        }
    }
     return 0;
 }
  • 打印菱形

    输入描述:

    输入一个整数(2~20)。

    示例:

    输入:2

    输出:

      *

     * *

    * * *

     * *

      *

    输入:4

    输出:

        *

       * *

      * * *

     * * * *

    * * * * *

     * * * *

      * * *

       * *

        *

     
    #include <stdio.h>
     //打印一个菱形
     int main()
     {
         int line = 0;
         scanf("%d", &line);//注释以line = 7为例
         //上
         int i = 0;
         for (i = 0; i < line; i++)
         {
             //打印空格
             int j = 0;
             for (j = 0; j < line - i - 1; j++)
             //上半部分为7,下半部分为6,所以要减去1(7为数字举例),逐行递减,所以减去i
             {
                 printf(" ");
             }
             //打印*
             for (j = 0; j < 2 * i + 1; j++)//1,3,5,7,9。。。。
             {
                 printf("*");
             }
             printf("\n");
         }
         //下
         for (i = 0; i <= line - 1; i++)//上半部分为7,下半部分为6,所以要减去1
         {
             int j = 0;
             //空格
             for (j = 0; j <= i; j++)//在下半部分,空格数和行数一样
             {
                 printf(" ");
             }
             for (j = 0; j < 2 * (line - 1 - i) - 1; j++)//*为11,9,7,5,3,1。。。。
             {
                 printf("*");
             }
             printf("\n");
         }
         return 0;
     }

  • K形图案

    输入描述:

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

    示例:

    输入:3

    输出:

    * * * * *

    * * * *

    * * *

    * *

    *

    * *

    * * *

    * * * *

    * * * * *

:做题的时候一定仔细看看给出的示例图有没有空格!!!

 #include <stdio.h>
 //这个题有坑
 int main()
 {
     int n = 0;
     //如果输入的是n,其实每行打印n+1组字符(*和空格)
     while(scanf("%d", &n) != EOF)
    {
         int i = 0;
         for(i=n; i>=0;i--)
             {
             int j = 0;
             for(j=0; j<=i; j++)
            {
                 printf("* ");
            }
             //*的后面还有空格-这个比较坑
             for(j=i; j<n; j++)
            {
                 printf(" ");
            }
             printf("\n");
        }
         for(i=1; i<=n; i++)
        {
             int j = 0;
             for(j=0; j<=i; j++)
            {
                 printf("* ");
            }
             //*的后边还有空格-这个比较坑
             for(j=i; j<n; j++)
            {
                 printf(" ");
            }
             printf("\n");
         }
     }
     return 0;
 }
  • 空心正方形

    输入描述: 多组输入,一个整数(3~20),表示输出的行数,也表示组成正方形边的“ * ”的数量。 示例:

    输入:4

 输出:
 * * * * 
 *     * 
 *     * 
 * * * * 
 #include <stdio.h>
 int main()
 {
     int n = 0;
     while(scanf("%d", &n) != EOF)
    {
         int i = 0;
         int j = 0;
         for(i=0; i<n; i++)
        {
             for(j=0; j<n; j++)
            {
                 if(i==0 || i==n-1)
                     printf("* ");
                 else if(j==0 || j==n-1)
                     printf("* ");
                 else
                     printf(" ");
            }
             printf("\n");
        }
    }
     return 0;
 }
  • 空心三角形图案

    输入描述:

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

    输入:4

 输出:
 *         
 * *       
 *   *     
 *     *   
 * * * * *
 #include <stdio.h>
 int main()
 {
     int n = 0;
     while(scanf("%d", &n) != EOF)
    {
         int i = 0;
         for(i=1; i<=n; i++)
        {
             int j = 0;
             for(j=1; j<=n; j++)
            {
                 if((i == j) || (j==1) || (i==n))
                {
                     printf("* ");
                }
                 else
                {
                     printf(" ");
                }
            }
             printf("\n");
        }
    }
     return 0;
 }
  • 打印平行四边形

    输入描述:

    输入一个整数(0<n<10)打印字符图形

    示例:

    输入:5

 输出:
 *****
  *****
   *****
    *****
     *****
 
#include <stdio.h>
 int main()
 {
     int i, j, z, n;
     scanf("%d", &n);
     for (i = n; i >= 1; i--)
     {
         for (j = 0; j < n - i; j++)
         {
             printf(" ");
         }
         for (z = 1; z <= n; z++)
         {
             printf("*");
         }
         printf("\n");
     }
     return 0;
 }
  • 打印星号梯形

    输入描述:

    输入一个整数(0<n<10)打印字符图形

    示例:

    输入:3

 输出:
   ***
  *****
 *******
 #include <stdio.h>
 int main()
 {
     int i, j, n, z;
     scanf("%d", &n);   
     for (i = 1; i <= n ; i++)
     {
         for (j = 1; j <= n - i ; j++)
         {
             printf(" ");
         }
         for (z = 1; z <= 2 * i +1; z++)
         {
             printf("*");
         }
         printf("\n");
     }
     return 0;
 }

输入描述

只有一个正整数n(0 < n < 20),代表正六边形的边长。

示例:

输入:5

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

直接硬写的话可能非常繁琐, 最好的方法是将代码的共性抽象出来作为函数.

如顶部和底部的代码是一样的, 可以单独作为一个top函数; 其余的每一行都可以抽象为两个参数 : 第一个星号左边有多少个空格、两个星号之间有多少个空格, 由此可以形成line函数

 #include <stdio.h>
 #include <math.h>
 #include <string.h>
 ​
 //打印num次ch字符
 void prints(char ch, int num)
 {
     while(num --)
         printf("%c", ch);
 }
 ​
 //打印顶部和底部
 void top(int n)
 {
     prints(' ', n-1);
     prints('*', n);
     prints('\n', 1);
 }
 ​
 //打印每一行
 void line(int left, int mid)
 {
     prints(' ', left);
     prints('*', 1);
     prints(' ', mid);
     prints('*', 1);
     prints('\n', 1);
 }
 ​
 int main()
 {
     int n; scanf("%d", &n);
     top(n);
     for(int i=2; i<=n; i++)
         line(n-i, n + 2*(i-2));
     for(int i=n-1; i>=2; i--)
         line(n-i, n + 2*(i-2));
     top(n);
     return 0;
 }
 ​

(很厉害的解法呢)

 

综上呢,其实这些都是找规律,运用循环来打印出符合要求的图案~

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值