输出空心菱形是c语言初学者经常遇到的问题,由于涉及c语言的基础知识较多,也是经常在考试中出现的题型。

第一个程序是我自己想的,要是要找方便记忆的简便方法,请直接跳过前半部分,看后半部分的其他代码,我觉得这些代码的思想很好

 

在写程序之前要仔细观察空心菱形的规律。先分析,不要急于写程序。

 

将问题化整为零:

1、输入行数

printf("please input n:");

scanf("%d",&n);

 

3、在输出n行的空心菱形时,发现第一行和最后一行与其他行有些区别,可以使用单独的语句将此两行输出,为了使代码整洁,使用子函数完成。

 void star_end(int n)

{

int i;

for(i=1;i<=(n-1)/2;i++)

printf(" ");

printf("*");

printf("\n");

}

传递参数:要完成的菱形行数n

使用循环输出空格数:(n-1)/2

  

2、以9行的空心菱形为例,讨论中间部分的情况:

 

上图中部黑色数列为中间每行的空格数,用右侧红色数列为表示黑色数列(见箭头)。

使用一数列a将a初始化,使a为上图右侧的的红色数列形式。

int a[20];

for(i=1;i<=(m+1)/2;i++)

a[m-i+1]=a[i]=i;

 

例如:n=7时 a[1]-a[7]为 1 2 3 4 3 2 1

此时左侧的红色数列可表示为 (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<stdio.h>
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<stdio.h>
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<stdio.h>
#include<math.h>
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");
    }
}

 

/************水平有限,仅供参考,欢迎批评指正****************/

posted on 2013-05-31 14:52  cross the border  阅读(3126)  评论(0编辑  收藏  举报