C语言中简单的图形打印问题

C语言中简单的图形打印问题(打印菱形)

以PTA中的题为例

下面我将主要介绍“打印沙漏”,“打印菱形”,“编程打印空心字符菱形”问题的解决。这类问题主要使用循环结构和选择结构实现,并需要借助一定的数学知识。
在这里插入图片描述据题意(注意空格数以及输出格式的要求):
题中有输出的内容有:“ ”,“* ”。
下面我用第一重循环控制行的输出,用第二重循环控制列的输出。容易发现题中所要求的图形在每一行都进行了n次的输出(输出包括“空格”和“星号空格”)。

#include <stdio.h>
int main(){int i,j,n;
scanf("%d",&n);
for(i=1;i<=(n+1)/2;i++)//将图形分为两部分输出打印。
{   for(j=1;j<=n;j++)//n表示输出的次数
      (j<=-2*i+n+1)?printf(" "):printf("* ");//此处等价于“if else”语句,并用此控制输出的是“星号”还是“星号空格”。
printf("\n");}
for(i=1;i<=(n-1)/2;i++)
{  for(j=1;j<=n;j++)
     (j<=2*i)?printf(" "):printf("* ");
printf("\n");}
return 0; }
  

总结:1.二重循环控制行列;
2.据规律找出行数以及每一行需要输出的次数;
3.借助“if else”语句控制在每一行不同列输出的内容;
这种方法能够解决绝大部分的打印图形的问题,问题关键在于找出正确的数学规律。

打印沙漏

在这里插入图片描述
值得注意的是:

  1. 给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
  2. 首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
#include <stdio.h>
#include <math.h>
int main(int argc, char** argv){
int n,i,k,j,m;
char ch;
scanf("%d %c",&m,&ch);
for(i=1; ;i++)
   if(i>-1+sqrt(2+2*m)/2)
       {k=i-1;
        break;}//找出与第一部分图形高有关的量K
/*下面按照上题总结的方法*/   
for(i=1;i<=k+1;i++)
{   for(j=1;j<=2*k+2-i;j++)
        if(j<=i-1)
        printf(" ");
        else
        printf("%c",ch);
 printf("\n");}
for(i=1;i<=k;i++)
{   for(j=1;j<=k+i+1;j++)
        if(j<=k-i)
        printf(" ");
        else
        printf("%c",ch);
 printf("\n");}
printf("%d",m-1-k*(4+2*k));
    return 0;
  }

在这里插入图片描述在这里插入图片描述此题初次输入的是可使用符号的个数,按照例子第一行有5个*,第二行有3个*,第三行有1个* …借助数学中等差数列的相关知识找出打印“每行输出奇数个符号”的漏斗所需符号的最大个数。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值