C语言输出一个19行实心菱形,C语言打印菱形

打印菱形这道题对于初学编程者来讲简直是噩梦,曾经我就是栽在这上面的,后来编程编多了以后对打印菱形也以为再也不那么难了,去年在公众号写了一篇推送是关于打印菱形的,以为对一些师弟师妹仍是有所帮助的,今天就把这道题分享出来。如下是我遇到的各类各样的菱形:

da05047ffb356a3764fcec0d215df2de.png

普通菱形,输入n,输出n行n列的菱形web

难度系数:♥

750a3e2391fe5eb0d601740766704248.png

n行空心菱形,输入n,输出n行空心菱形编程

难度系数:♥♥

c882e4509aa0ca507f00e7ef40b22cae.png

n行挖空菱形,输入n,输出n行n列空格菱形svg

难度系数:♥♥♥工具

365d34d41cdafdffda8ddd22c11026ea.png

n行数字菱形,输入n,输入n行数字从外到内递增的数字菱形code

难度系数:♥♥♥♥

52f39e650c91a270258b8584daedf8b0.png

有边框空心菱形,输入n,输出n行带有边框的空心菱形xml

难度系数:♥♥♥♥♥blog

首先咱们要明确这是一个随着n的大小改变的菱形,因此咱们确定要用到循环,而且循环的次数与n有关。若是题目要求是输出n行,那咱们的循环就是0(n-1)或者1n;若是要求是输出(2n+1)行,那咱们的循环就0-2n或者1~(2n+1)便可。(后面以输出n行为例分析)

第一个是普通的实心菱形,循环n行你们都懂,问题就在列要怎样循环。难道是看出来的吗?不错,我就是经过看得出来的循环次数。具体怎么看呢?

根据图直接看有点难度,因此咱们根据各行数据来看

40a767c555c0cc2387214608117f9b65.png

咱们须要将整个菱形分红四块来考虑,从上到下空格的个数先从n/2递减到0后递增到n/2,而行循环因子i又从0递增到n,故天然可联想到用i与n/2来表示空格个数。由于空格个数是非负数,因此咱们引进绝对值|n/2-i|表示空格个数。打完空格以后,咱们就要正式用 ’ * '打印菱形了。经过观察咱们发现 * 号的个数为奇数,而且变化规律跟空格正好相反,因此号个数便是-2*(空格个数)+1+C(常数)=-2*(空格个数)+C(常数),经过观察咱们发现这个常数C正好是n/2。因而第一种菱形就能够顺利完成了!

9be25eb2bfc400ff4833b0c8961a25a9.png

第二个是空心菱形,与实心菱形类似,可当作在实心菱形上再打了一个空格菱形。因为每行的号数很少,而且能够看到号正好位于空格菱形的外围,因此咱们能够将打印号放在打印空格菱形先后顺便打印,即在打印空格菱形以前打号,打印完空格菱形以后再打印号。一样,咱们将相关数据列出来而后观察规律。号前空格与实习菱形一致,而咱们发现n-2|n/2-i|-2的值除了首尾两行外,其余都与空格菱形的空格个数一致,而首尾两行是-1表示在该处不需打空格反而须要退一个格,但因为咱们当前位置为号,而退格后依旧要打号,因此咱们能够直接判断是否为第一行或最后一行,是则少打印一个号便可。

0333706b6731bfb9e93b9de4cd6d9f2a.png

第三个是挖空菱形,该菱形是上述两个的合体,咱们能够当作把一个实心菱形的各个字符替换成另外一种字符,再插入一个空心菱形。因此咱们把该菱形分红输出空心菱形先后号和输出空心菱形两部分。经过数据对比,咱们不难发现,输出空心菱形先后号的数据与实心菱形输出号前空格个数一致,而后就是输出一个空心菱形,最后要记得在输出空心菱形以后输出空心菱形以后的号,根据对称可知,空心菱形后号个数与空心菱形前号一致。

0196a30cca90ea8184e7f03221f131b3.png

第四个是数字菱形,该菱形的特色是数字从外到内逐层递增。咱们发现该菱形中轴线数字的变化规律是先从1递增到(n+1)/2,而后再递减到1,而且每一行的数字也是从1递增到中轴线,再递减到1,所以咱们要找到中轴线所在的位置(方便判断循环因子是否到达中轴线)。经过列数据咱们发现中轴线所在位置(j从0开始循环)为n/2-|n/2-i|,因此在每一行中咱们的数字加到“j==n/2-|n/2-i|”处时应该转成递减,因此咱们引进要填充的数字k,在每一行开始时k为1,在j从0到n/2-|n/2-i|-1中,k逐次递增,在j从n/2-|n/2-i|到n-2*|n/2-i|-1中k递减。而后将打印星号改成打印数字便可。

fc1a98fd23b2b0758eeced2dfd11d605.png

第五个是边框空心菱形。从名字可知,该菱形由边框和空心菱形组成,咱们能够将边框和空心菱形分开来考虑。第一行和最后一行为边框,可直接用从0到n-1打印号实现。左右边框在每一行的开头和结尾打印号便可实现。中间便是空心菱形的领域,基本上跟打印空心菱形同样,只是要注意被边框覆盖的地方空格和号要省略。

将打印空格和打印号分开考虑,经过数字之间的关系特色,运用循环完成菱形的打印。图片

因为菱形是对称的,因此绝对值是最好的数据描述工具,要巧妙地运用绝对值,将对称部分的循环用同一个带有绝对值的表达式表示出来。it

值得注意的是n/2为整数除,因此不会获得小数,也不是四舍五入。循环

中轴线所在位置(j从0开始循环)为n/2-|n/2-i|。

//挖空菱形

for(i=0;i

for(j=0;j

printf("*");

printf("*");

for(j=0;j

printf(" ");

if(j!=0)

printf("*");

for(j=0;j

printf("*");

printf("\n");

}

printf("\n");

//边框菱形

for(i=0;i

if(i==0||i==n-1){

for(j=0;j

printf("*");

printf("\n");

}

else{

printf("*");

for(j=0;j

printf(" ");

if(j!=0)

printf("*");

for(j=0;j

printf(" ");

if(j!=0)

printf("*");

for(j=0;j

printf(" ");

if(j!=0)

printf("*");

printf("\n");

}

}

//数字菱形

for(i=0;i

int k=1;

for(j=0;j

printf(" ");

for(j=0;j

printf("%d",k);

if(j

k++;

else

k--;

}

printf("\n");

}

//实心菱形

for(i=0;i

for(j=0;j

printf(" ");

for(j=0;j

printf("*");

printf("\n");

}

printf("\n");

//空心菱形

for(i=0;i

for(j=0;j

printf(" ");

printf("*");

for(j=0;j

printf(" ");

if(j!=0)

printf("*");

printf("\n");

}

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值