描述 * 组成的菱形图案,用户输入一个奇数n,来表示菱形的最大宽度(即中间一行的星号数),要求使用while循环生成这个图案。
程序代码及结果显示:
程序代码:
#include<stdio.h>
int main()
{
int i,j;
int n,k;
loop: printf("请输入菱形的宽:");
scanf("%d",&n);
if(n%2==0)
{
printf("请输入一个奇数!\n");
goto loop;
}
//菱形的上一半及中间一行
i=1;
while(i<=(n+1)/2)
{
j=1;
k=1;
while(k<=(n+1)/2-i)//上面一半第i行空格的个数
{
printf(" ");
k++;
}
while(j<=2*i-1)//上面一半第i行*的个数
{
printf("*");
j++;
}
i++;
putchar(10);
}
//菱形的下面一半
i=2;
while(i<=(n+1)/2)
{
j=1;
k=1;
while(k<=i-1)//下面一半第i行空格的个数
{
printf(" ");
k++;
}
while(j<=n-2*i+2)//下面一半第i行*的个数
{
printf("*");
j++;
}
i++;
putchar(10);
}
}
结果展示:
拓展方法:for循环
程序代码:
#include<stdio.h>
int main()
{
int i,j,k;
int n;
loop: printf("请输入菱形的宽:");
scanf("%d",&n);
if(n%2==0)
{
printf("请输入一个奇数!\n");
goto loop;
}
//菱形的上面一半包括中间一行
for(i=1;i<=(n+1)/2;i++)
{
for(k=1;k<=(n+1)/2-i;k++)
{
printf(" ");
}
for(j=1;j<=2*i-1;j++)
{
printf("*");
}
putchar(10);
}
//菱形的下面一半
for(i=2;i<=(n+1)/2;i++)
{
for(k=1;k<=i-1;k++)
{
printf(" ");
}
for(j=1;j<=n-2*i+2;j++)
{
printf("*");
}
putchar(10);
}
}
结果展示:
思路解析:
思路解析:
以n=5为例,最终效果如下:
*
***
*****
***
*
将整体分为上面一半
* 第一行
*** 第二行
***** 第三行
上面一半第i行的*数 = 2*i-1 个
第i行前面的空格数 =(n+1)/2-i 个
和下面一半
***
*
(a)
完成下面一半的思路为:
先把上面一半倒过来如(b)所示:
*数 空格数
***** 第一行 5-2*0 1-1
*** 第二行 5-2*1 2-1
* 第三行 5-2*2 3-1
(b) n-2*(i-1) i-1
对(b):第i行的*数 = n-2*(i-1) = n-2*i+2 个
第i行前面空格数 = i-1 个
由(b)变为(a):从第二行开始取,及下面一半菱形的i的初始值为2