1、使用*打印菱形,输入任意数字n,打印对应菱形
#include <stdio.h>
int main(int argc, char *argv[])
{
int i,j,k,n;
scanf("%d",&n);
//打印上半菱形
for(i=1;i<=n;i++)
{
for(k=1;k<(n+1-i);k++)//判断每一行需要打印的空格数
{
printf(" ");
}
for(j=1;j<=(2*i-1);j++)//对应每一行打印的*个数
{
printf("*");
}
printf("\n");
}
//打印下半菱形
for(i=1;i<=(n-1);i++)
{
for(k=1;k<=i;k++)//空格
{
printf(" ");
}
for(j=2*(n-1);j>(2*i-1);j--)//*
{
printf("*");
}
printf("\n");
}
return 0;
}
输入5之后我们会得到如下结果:
输入5我们得到的是一个第五行为菱形对称轴的菱形。
代码解析:此代码的思路是将空格和*号分开打印,菱形上半部分和下半部分分开打印。首先是*的打印,由结果我们可以知道*的个数与行数之间的关系,第一行一个*,第二行3*,第三行5*,所以行数i与*个数的关系就为2xi-1(x表示乘号);接下来就是每行打印的空格数,由图可知第一行4个空格,第二行3个空格,第三行2个空格,以此类推;接下来就是如何打印,打印的话我们需要使用三个for循环,一个for循环控制打印的行数,另外两个分别用于控制打印空格和*的个数,再根据第一个for循环i的变化可以得到打印空格的for循环表达式k=1;k<(n+1-i);k++,这样上半部分就解决了。
下半部分空格的打印跟行数的关系是第几行就打印几个空格,故直接用k=1;k<=i;k++,打印的*则是跟上半部分相反,根据输入的n和控制打印的for循环的i来确定表达式j=2*(n-1);j>(2*i-1);j--,这样就可以打印出一个由*组成的菱形。
2、第二种比较简便的办法是使用取绝对值函数,不分上下部分,整体打印。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int i,j,n;
scanf("%d",&n);
for(i=-(n-1);i<=(n-1);i++)
{
for(j=0;j<abs(i);j++)
{
printf(" ");
}
for(j=0;j<(2*n-(2*abs(i)+1));j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
解析:该方法是以菱形中间一行为对称轴,上面取负下面取正,通过取绝对值函数abs()来取i的值,这样通过表达式j=0;j<abs(i);j++实现空格由多到少再到多,j=0;j<(2*n-(2*abs(i)+1));j++实现*由少到多再到少的打印。
3、空心菱形打印:
使用一个二维数组来存储这个空心菱形,从键盘输入n来确定要打印的菱形行数
#include <stdio.h>
int main(int argc, char *argv[])
{
char a[100][100];
int n,i,j;
scanf("%d",&n);
int num=(2*n-1)/2;//找到菱形第一个*在数组中的位置
//将数组全部赋值为空格
for(i=0;i<2*n-1;i++)
{
for(j=0;j<2*n-1;j++)
{
a[i][j]=' ';
}
}
for(i=0;i<n;i++)
{
a[i][num-i]='*';
a[i][num+i]='*';
}
int k=0;
for(j=i;j<2*n-1;j++)
{
a[j][k+1]='*';
a[j][2*num-k-1]='*';
k++;
}
for(i=0;i<2*n-1;i++)
{
for(j=0;j<2*n-1;j++)
{
printf("%c",a[i][j]);
}
puts("");
}
return 0;
}
输入一个5,结果如下:
第五行5为中心的一行,根据我们的例子n=5,打印菱形我们需,9*9个元素,首先根据n将所有元素赋值为空格,之后再将*放入数组;对于*的存入我也是分为了上半部分跟下半部分,跟1一样的思想, a[i][num-i]='*';是以中间为对称,左边的*在素组中的位置,a[i][num+i]='*';是右边*在数组中的位置,行标由i控制,列标由num=+-i控制。下半部分跟上半部分规律类似。
4、使用方程的形式控制打印
#include <stdio.h>
int main(int argc, char *argv[])
{
int x,y,n;
scanf("%d",&n);
n-=1;
for(x=0;x<=2*n;x++)
{
for(y=0;y<=2*n;y++)
{
if(y==x+n||y==x-n||y==n-x||y==3*n-x)
printf("*");
else
printf(" ");
}
puts("");
}
return 0;
}
解析:把菱形放到一个坐标轴上,菱形的四条边分别看作四条直线,求出坐标系下四条直线的表达式,满足表达式的地方就打印*,不满足的就打印空格。具体理解如下图