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”语句控制在每一行不同列输出的内容;
这种方法能够解决绝大部分的打印图形的问题,问题关键在于找出正确的数学规律。
打印沙漏
值得注意的是:
- 给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
- 首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
#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个* …借助数学中等差数列的相关知识找出打印“每行输出奇数个符号”的漏斗所需符号的最大个数。