/liutogo/archive//05/31/3110394.html
输出空心菱形是c语言初学者经常遇到的问题,由于涉及c语言的基础知识较多,也是经常在考试中出现的题型。
第一个程序是我自己想的,要是要找方便记忆的简便方法,请直接跳过前半部分,看后半部分的其他代码,我觉得这些代码的思想很好
在写程序之前要仔细观察空心菱形的规律。先分析,不要急于写程序。
将问题化整为零:
1、输入行数
printf("pleaseinputn:");
scanf("%d",&n);
3、在输出n行的空心菱形时,发现第一行和最后一行与其他行有些区别,可以使用单独的语句将此两行输出,为了使代码整洁,使用子函数完成。
voidstar_end(intn)
{
inti;
for(i=1;i<=(n-1)/2;i++)
printf("");
printf("*");
printf("\n");
}
传递参数:要完成的菱形行数n
使用循环输出空格数:(n-1)/2
2、以9行的空心菱形为例,讨论中间部分的情况:
上图中部黑色数列为中间每行的空格数,用右侧红色数列为表示黑色数列(见箭头)。
使用一数列a,将a初始化,使a为上图右侧的的红色数列形式。
inta[20];
for(i=1;i<=(m+1)/2;i++)
a[m-i+1]=a[i]=i;
例如:n=7时a[1]-a[7]为1234321
此时左侧的红色数列可表示为(m+1)/2-a[i]
3、使用循环输出每行的””与”*”
for(i=1;i<=m;i++)
{
for(j=1;j<=(m+1)/2-a[i];j++)
printf("");
printf("*");
for(j=1;j<=2*a[i]-1;j++)
printf("");
printf("*");
printf("\n");
}
对于每行,
先输出(m+1)/2-a[i]个””,
再输出一个”*”,
再输出2*a[i]-1个””,
再输出一个”*”
完整程序:
#include
void star_end(int n);
main()
{
int n,m,i,j,a[20];
printf("please input n:");
scanf("%d",&n);
m=n-2;
for(i=1;i<=(m+1)/2;i++)
a[m-i+1]=a[i]=i;
star_end(n);
for(i=1;i<=m;i++)
{
for(j=1;j<=(m+1)/2-a[i];j++)
printf(" ");
printf("*");
for(j=1;j<=2*a[i]-1;j++)
printf(" ");
printf("*");
printf("\n");
}
star_end(n);
}
void star_end(int n)
{
int i;
for(i=1;i<=(n-1)/2;i++)
printf(" ");
printf("*");
printf("\n");
}
其他算法:(这些思想很好)
一、//空心菱形图,原理是建立坐标系,原点为菱形中心
#include
void main()
{
int y,x,n,k;
printf("please input number of rows:");
scanf("%d",&n);
k=n/2;
for(y=-k;y<=k;y++)
{
for(x=-k;x<=k;x++)
{
if((x==y+k)||(x==y-k)||(x==k-y)||(x==-k-y))
printf("%c",'*');
else
printf(" ");
}
printf("\n");
}
}
二、以上程序可使用math.h中的abs()函数,用于求绝对值。
Abs函数描述返回数字的绝对值。语法Abs(number)
代码简化为
#include
#include
main()
{
int i,j,n,k;
printf("Please input the number of rows:");
scanf("%d",&n);
k=n/2;
for(i=-k;i<=k;i++)
{
for(j=-k;j<=k;j++)
{
if(abs(i)+abs(j)==k)
printf("*");
else
printf(" ");
}
printf("\n");
}
}
/************水平有限,仅供参考,欢迎批评指正****************/