• C语言输出空心菱形的实现


    输出空心菱形是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");
        }
    }

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

  • 相关阅读:
    C#后台利用正则表达式查找匹配字符
    C# Dictionary 的几种遍历方法
    eval解析JSON中的注意点
    jquery datatables api (转)
    Replication--镜像+复制
    Replication--分区+复制
    Replication--进程无法在“xxxx”上执行“sp_replcmds”
    Replication--无法将事务提升为分布式事务,因为在事务中有活动的保存点
    Replication--使用MSlogreader_history查看日志读起的延迟和事务命令
    Partition--分区拆分和分区合并
  • 原文地址:https://www.cnblogs.com/liutogo/p/3110394.html
Copyright © 2020-2023  润新知