双for循环
我们可以把菱形看成两部分
第一部分,先打印上半部分
int main()
{
int i, j, n=0, k;
scanf("%d", &n); //输入n值,会打印一个(2*n-1)的菱形;若输入n=5 则会打印一个9行的菱形
for (i = 0; i < n; i++) //打印前4行*号
{
for (j = 0; j < n-i; j++) //打印空格
{
printf(" ");
}
for (k = 0; k < 2 * i - 1; k++) //打印*号
{
printf("*");
}
printf("\n");
}
第二部分,打印下半部分,跟第一步基本一样;
for (i = 0; i < n; i++) //打印后5行*号
{
for (j = 0; j < i; j++)
{
printf(" ");
}
for (k = 0; k < 2 * n - 2 * i - 1; k++)
{
printf("*");
}
printf("\n");
}
return 0;
}
当我们合起来之后就可以得到一个菱形
单for循环打印
这种方法一般来说挺少用的,大部分都是使用双for循环
int main()
{
int i, j, k, n;
scanf("%d", &n); //输入行数
for (i = -n / 2; i <= n / 2; i++) //先给i赋值为-n/2,使其从负到正
{
if (i < 0) j = -i; //当i值为负时,使其转为i正并赋值给j
else j = i;
for (k = 0; k < j; k++) //打印空格
{
printf(" ");
}
if (i > 0) j = -i;
else j = i;
for (k = 0; k < (j+ n / 2) * 2 + 1; k++) //打印*号
{
printf("*");
}
printf("\n");
}
return 0;
}
输入行数9,如图
当我们输入n=9时,i<=9/2=4,把i赋值为-4时,我们在打印*号时,当i<0时,j赋值为i,由于(j+n/2)*2=0,所以k<1,就只打印一个星号。以此类推,可以得到一个行数为9的菱形。
二维数组打印菱形
利用二维数组打印菱形,其实就是将菱形的上半部分储存到二维数组中,并打印出来。
#include <stdio.h> int main() { char arr[100][100]; int i,j,n; scanf("%d",&n); for(i=0;i<(n+1)/2;i++) { for(j=0;j<n+1-2*(i+1);j++) arr[i][j]=' '; for(j=n+1-2*(i+1);j<n-1+2*(i+1);j+=2) { arr[i][j]='*'; arr[i][j+1]=' '; } } for(i=0;i<(n+1)/2;i++) //打印菱形的上半部分 { for(j=0;j<n-1+2*(i+1);j++) printf("%c",arr[i][j]); printf("\n"); } for(i=(n+1)/2-2;i>=0;i--) //打印菱形的下半部分 { for(j=0;j<n-1+2*(i+1);j++) printf("%c",arr[i][j]); printf("\n"); } return 0; }
这是我打印菱形的三种方法,有不足之处还望提出