用循环打印菱形星号字符的两种方法~
最近一个小学妹问我C语言的题目,是关于打印一个菱形星号的题目。我给出的代码如下:程序代码:
#include <stdio.h>
#include <math.h>
void main()
{
int n,i,j;
printf("n=?\n");
scanf("%d",&n);
for(i=0;i<(n*2+1);i++)
{
for(j=0;j<fabs(i-n);j++) printf(" ");
for(j=0;j<(2*(n-fabs(i-n))+1);j++) printf("*");
printf("\n");
}
}
#include <math.h>
void main()
{
int n,i,j;
printf("n=?\n");
scanf("%d",&n);
for(i=0;i<(n*2+1);i++)
{
for(j=0;j<fabs(i-n);j++) printf(" ");
for(j=0;j<(2*(n-fabs(i-n))+1);j++) printf("*");
printf("\n");
}
}
后来她又发给我一段代码,我发现这也是打印菱形星号的代码,我稍作修改,使n的意义和我的代码中的n的意义相同,代码如下:
程序代码:
#include<stdio.h>
void main()
{
int i,j,n;
printf("n=?\n");
scanf("%d",&n);
for(i=0; i<2*n+1; i++)
{
for(j=0; j<2*n+1; j++)
{
if( i+j>=n && i+j<=3*n && i-j>=-n && i-j<=n ) printf("*");
else printf(" ");
}
printf("\n");
}
}
void main()
{
int i,j,n;
printf("n=?\n");
scanf("%d",&n);
for(i=0; i<2*n+1; i++)
{
for(j=0; j<2*n+1; j++)
{
if( i+j>=n && i+j<=3*n && i-j>=-n && i-j<=n ) printf("*");
else printf(" ");
}
printf("\n");
}
}
第一种方法的思路是按行打印,每一行的星号和空格的数量是纵坐标(i)的函数关系,由于图形是上下对称(关于横轴对称),因此字符的数量就和字符的纵坐标距离中间位置的距离有关,这个距离就是纵坐标减去中间位置纵坐标的绝对值。
第二种方法在一个正方形区域内所有字符根据其所在位置的坐标来判断是星号还是空格。这里称为坐标法。
/* 打印菱形*的另一种方法(坐标法)
* ----------------> j
* | |01234567
* |0| *
* |1| ***
* |2|*****
* |3| ***
* |4| *
* i
*/
综合而言,第二种方法思路是用4条直线划分出一个菱形区域,在该区域内部打印星号,外部打印空格。每打印一个字符都要进行判断。第一种方法在每一行打印时都计算好要打印的字符数量,另外一点是第二种方法比第一种要多打印一些行尾的空格,第一种方法从效率上略好一些。
[[it] 本帖最后由 hoodlum1980 于 2008-3-29 22:18 编辑 [/it]]
----------------解决方案--------------------------------------------------------
我写的一个,简洁一点:
#include<stdio.h>
#include<math.h>
#define N 5
void main()
{
int i,j;
for(i=-N;i<=N;i++)
{
for(j=-N;j<=N;j++)
{
if(abs(i)+abs(j)<=N)
printf("*");
else
printf(" ");
}
printf("\n");
}
getchar();
}
----------------解决方案--------------------------------------------------------