咱们相想当初怎么构造出来的菱形
菱形得有四条线,然后还得在其中填充空。
语句有输入空、四条线、下一行,而菱形最左边的一个点有两条输入线的语句对其操作,最右边则是两条线加一个下一行。
菱形最左边的点第二条直线其上的操作被屏蔽,这没什么大碍。但是右边的点输入完成后必须得输入下一行,因此该点必须单独操作,并在最后两条线对其操作之前在操作。
那么,着手构造菱形了。加入你要输入的菱形行数为l(奇数),那么要用到的一个参数值为(l+1)/2,姑且设为h。
四线:i-j=±h i+j-2h=±h 最右点:该点操作要在输入*号之前操作,*\n。那么,填充空,使这个菱形膨胀起来的时间到了。输入空的语句放在哪里好,我认为放在最前面,因为空一旦放在后面,直线或点的语句就会提前输入出来,再也没办法在前面去输入空来填充它。输入行数我们得用到scanf函数,变量:i,j,l,h。
#include <stdio.h>
int main(void)
{
int i,j,l,h;//l行数,h=l/2+1.
printf("请大佬输入行数\n");
scanf("%d",&l);
h=(l-1)/2;
for(i=0;i<l;i++)
{
for (j=0;j<l;j++)
if (h!=i+j&&h!=j-i&&3*h!=i+j&&h!=i-j&&2*h!=j)//空
printf(" ");
else if(h==i+j)//左上直线
printf("*");
else if(h==i&&2*h==j)//最右点
printf("*\n");
else if(h==j-i)//右上直线
printf("*");
else if(3*h==i+j)//右下直线
printf("*");
else if (h==i-j)//左下直线
printf("*");
else if (2*h=j)//下一行
printf("\n");
}
}
成了。但是,假如人家输入偶数呢??
惨不忍睹是吧。又要改了,唉,这就是命吧----将来我们都会是这样的人----钱多话少死得早。
来看看哪里错了,输入偶数l,h其实等于(l-2)/2而不是等于l/2即当(l-1)/2运算完就会变成[(l-1)/2](取整)
就是(6-1)/2就tama等于4了,而不是四舍五入。
我想到两种改法,一加一个switch语句,用除余来决定h的去向
然而我天生家穷人丑农村户口,接受不了这么狂炫酷霸叼炸天的东西,我把for中的l改成2h+1(非主流了)
好了,蒙混过关了。自定义行数菱形,其实右边这个点是不必纠结的,只要拓宽列数,并在第七列输\n,然后调节一下语句的顺序就可以了。