各种各样的打印菱形
打印菱形
1.初级版
Description
由键盘输入正数n(n<30),要求输出如下2*n+1行的菱形图案。
输入样例
2
输出样例
代码实现1:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,j,k,n;
scanf("%d",&n);
for(i=1;i<=n+1;i++)
{
for(j=1;j<=n+1-i;j++)
printf(" ");
for(k=1;k<=2*i-1;k++)
printf("*");
printf("\n");
}
for(i=1;i<=n;i++)
{
for(j=1;j<=i;j++)
printf(" ");
for(k=1;k<=(2*n+1)-2*i;k++)
printf("*");
printf("\n");
}
return 0;
}
解析:
分为上半部分和下半部分
上半部分
一共有n+1行,最外面的循环控制行数,所以有
for(i=1;i<=n+1;i++)
接下来将图形分为打印空格和打印 * 号
打印空格:
(用o代表*前的空格数)
可以看出
每行空格数和行数的关系是
空格=n+1-行数 |
---|
所以空格处用循环
for(j=1;j<=n+1-i;j++)
打印*号:
易看出 每行 * 号和行数的关系是
*号=2×行数-1 |
---|
所以打印 * 用循环
for(k=1;k<=2*i-1;k++)
每循环一行别忘了换行哦
下半部分:
不难看出一共有n行
控制行数用循环:for(i=1;i<=n;i++)
每行的空格数显然和该行 行序数一样
(下半部分重新从第一行开始计算 )
所以打印空格的循环用
for(j=1;j<=i;j++)
打印*号
结合 * 号最多的这行来看
*和空格存在关系
2×n+1=2×空格个数+*个数 |
---|
所以打印*用循环
for(k=1;k<=2 * n+1-2 * i;k++)
----------over-----------
代码实现2:(绝对值)
#include "stdio.h"
#define abs(x) ((x)>0?(x):-(x))
main()
{ int n,i,j;
scanf("%d",&n);
for(i=-n;i<=n;i++)
{
for(j=1;j<=abs(i);j++) printf(" ");
for(j=1;j<=2*n+1-2*abs(i);j++) printf("*");
printf("\n");
}
}
2.空心菱形
打印挖空菱形
一.打印边框菱形
代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
int i,j,k,l,m;
scanf("%d",&n);
for(i=1;i<=n;i++)
printf("*");
printf("\n");
for(i=1;i<=(n-1)/2;i++)
{
for(j=1;j<=(n+1)/2-i;j++)
printf("*");
for(k=1;k<=i;k++)
printf(" ");
for(k=1;k<=i-1;k++)
printf(" ");
for(j=1;j<=(n+1)/2-i;j++)
printf("*");
printf("\n");
}
for(i=1;i<=(n-1)/2-1;i++)
{
for(j=1;j<=i+1;j++)
printf("*");
for(k=1;k<=(n+1)/2-(j-1);k++)
printf(" ");
for(k=1;k<=(n-1)/2-(j-1);k++)
printf(" ");
for(j=1;j<=i+1;j++)
printf("*");
printf("\n");
}
for(i=1;i<=n;i++)
printf("*");
return 0;
}
想法:
老规矩 将菱形拆分成上下两部分
这里有一点不同是原来用来呈现菱形的*号作为背景,而背景用 * 号呈现
上半部分:
再将上半部分拆分成四个部分:左 * 左空格(图上o部分) 右空格(图上p部分) 右 *
我们需要寻找 * 和空格之间的关系,但如果加上顶行,我们发现好像关系比较难找,所以将第一行全是 * 的单独写一个循环实现:for(i=1;i<=n;i++)
接下来我们可以找规律了:
从有空格的一行开始计数,一共是(n-1)/2行,最外层用一个for循环控制行数:for(i=1;i<=(n-1)/2;i++)
左半部分一共是有(n+1)/2个符号,而左空格的个数刚好和行数i一致,左 * 的个数即为(n+1)/2-i个
o+ * =(n+1)/2 |
---|
先打印 * :for(j=1;j<=(n+1)/2-i;j++) printf("*");
再打印空格:for(k=1;k<=i;k++) printf(" ");
/ * 右半部分(p和*)一共有(n-1)/2个符号,右 * 和左 * 个数相等,所以右空格个数=(n-1)/2-(j-1) //这里是j-1而不是j的原因是因为
右半部分:先打印空格:for(k=1;k<=(n-1)/2-j;
*/
下半部分:
空心菱形改进版:
描述
由键盘输入n(n为奇数),打印如下图空心菱形
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
scanf("%d",&n);
int i,j,k;
for(i=1;i<=(n+1)/2;i++)
{
for(j=1;j<=(n+1)/2-i;j++)
printf(" ");
printf("*");
for(k=1;k<=(i-1)*2-1;k++)
printf(" ");
if(i>=2)printf("*");
printf("\n");
}
for(i=1;i<=(n-1)/2;i++)
{
for(j=1;j<=i;j++)
printf(" ");
printf("*");
if(i<(n-1)/2)
{for(j=1;j<=n-2*i-2;j++)
printf(" ");
printf("*");}
printf("\n");
}
return 0;
}
打印数字菱形
1.
代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,j,i,k;
int m;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
for(j=1;j<=n-i;j++)
printf(" ");
for(k=1;k<=i;k++)
printf("%d",k);
for(m=i-1;m>=1;m--)
printf("%d",m);
printf("\n");
}
for(i=1;i<=n-1;i++)
{
for(j=1;j<=i;j++)
printf(" ");
for(k=1;k<=n-i;k++)
printf("%d",k);
for(m=n-i-1;m>=1;m--)
printf("%d",m);
printf("\n");
}
return 0;
}