用C语言打印一个菱形-公式法
今天和我新浪微博的一位好友Misacat聊起了C语言,用C语言打印一个菱形,今天上午抽空写了写,好久没有写C语言,竟生疏了很多…
其实这些打印类的问题,都能用一个固定的方法来做,我把它叫做“公式法”,打印类的题目都可归结为在一个平面打印一个图形,这个图形由星号组号。再进一步说,无非就是两种情况,打印一个空格,或者打印一个星号。不同的打印空格和星号的规则不同,就打印成了不同的图形。说到这里就更好理解了,一个平面图形是由什么构成的?就是纵坐标和横坐标,将它们定义为两个变量,i和j.这样任何的打印问题都可以由两个for循环来做
for(int i=0;i<M;i++){//这个是扫描i即纵坐标,就构成了一条线
for(int j=0;j<N;j++){//这个是在定了一个i的情况下,再扫描横坐标,
//这样就构成了一个面
method(){}:
}
}那个method()方法其实在定义了一个i即横坐标之后,相应的纵坐标的规则,一般的打印都是有规则的,有了i,一定有个相应的规则来求出j。不会有人无聊到打印一个毫无规律的东东吧。即一定可以写出 j = getJMethod(i);这样的一个方法。
有了j=getJMethod(i);的方法就好办了,在内层循环里一个一个匹配吧,如果符合j=getJMethod(i)的,就打印一个星号,如果不符合,就打印一个空格。如下所示:
for(int i=0;i<M;i++){//这个是扫描i即综坐标,就构成了一条线
for(int j=0;j<N;j++){//这个是在定了一个i的情况下,再扫描横坐标,
//这样就构成了一个面
method(){
if(j==getJMethod(i)) print("*");
else print(" ";)
}
}
print("\n");//打印完一整行后,别忘了打印一个换行符。
}下面我们就可以套用这个公式来完成这个题目了,完整C语言代码如下,相信聪明的你一定可以读懂的:)
#include <stdio.h>
int main()
{
int i;
int j;
for(i=1;i<=7;i++)
{
if(i<=4){//前4行
for(j=1;j<=7;j++){//打印每一行的星号或者空格
int temp=i-1;
/*
*找规律,i=1时,即第一行,是第4个位置星号,其他地方空格
*第二行,是4,5,6三个位置星号,其他地方空格
*第三行,是2,3,4,5,6五个位置星号,其他地方空格
*所以j应该满足,j>=(4-(i-1))并且j<=(4+(i-1))时是星号,其他空格
*/
if(j>=4-temp&&j<=4+temp) printf("*");
else printf(" ");
}
/**打印完以后有回车*/
printf("\n");
}
else //后三行
{
for(j=1;j<=7;j++){
int temp=7-i;
/*
找规律,i=5时,即第五行,是第3,4,5个位置星号,其他地方空格
第二行,是4,5,6三个位置星号,其他地方空格
第三行,是2,3,4,5,6五个位置星号,其他地方空格
所以j应该满足,j>=(4-(i-1))并且j<=(4+(i-1))时是星号,其他空格
*/
if(j>=4-temp&&j<=4+temp) printf("*");
else printf(" ");
}
printf("\n");
}
}
system("PAUSE");
return 0;
}打印完的界面如下:
这时一定有朋友说了,“这个太复杂了,打印菱形我有更好的办法,比这个简洁多了”,没错,你说的是对的。我只是抽象出了一种公共的方法,以后无论任何打印的问题,都是可以这么做的,可谓是个万能方法。
我之前写过一篇“用java打印一个圆”,用的就是这个方法。
好了,希望我这个公式法可以对你有所帮助:-)