C语言打印直方图(垂直方向)

C语言打印直方图(垂直方向)

    本人学生,在学习C时用的是学校编的书,效果很差,后来买了《The C Programming Language》,重新学习C语言,感觉很好。做里面的习题,打印单词长度的直方图,参考网上大神的代码,并加以修改,达到了自己满意的效果,代码方面我自己加了许多注释,希望对大家有用。

程序功能说明

   输入:输入单词,以空格、回车、制表符为间隔,EOF为结束输入。(window 下CTRL+Z ,Linux 下CTRL +D)

   输出:打印输入的单词数量、最大单词长度以及单词长度直方图。

程序功能展示

输入
输入:I am a student  CTRL +Z 结束

输出
这里写图片描述

代码片段
绘制直方图的代码,两个For循环

/*
     绘制直方图
     备注:本来想用\t制表符来替换空格的,但发现\t 打出来的空格不一样多
           下面我会注释用了多少空格的 ,用空格是为了打印出来的直方图对齐 
*/
void vertical(int array[],int len)
{
    int maxValue = max(array,len);    
    int j;
    int i;  
    printf("  y/num↑\n");               /* 打印直方图的y轴顶部 , y前面2个SP    */ 

    for(i = maxValue + 1; i > 0; i--)
    {
        printf("%8d|_  ", i);           /*  打印直方图的y轴    */
        for(j = 0; j < len; j++)
        {
            if(array[j] == i)           /*  打印直方图的顶部 ,1个SP,3个_,4个SP */
            {
                printf(" ___    ");      
            }
            else if(array[j] >= i)      /*  打印直方图的侧部 ,2个|,3个SP,3个SP */
            {
                printf("|   |   ");
            }
            else if(array[j] == i-1)    /*  打印该数据,位于直方图顶部的上方     */
            {
                printf(" (%d)    ",array[j]);
            }
            else
            {
                printf("        ");     /*  无数据     8个SP                 */
            }
        }

        printf("\n");
    }

    /*
    *   纯属美观需要,并打印 X轴 
    *
    */
    printf("       0");

    for(i = 0; i < len + 1; i++)
    {
        printf("|___|___");
    }
    printf("|___→\n");

    for(i = 0; i< (2 * len); i++)
    {
        printf("\t");
    }
    printf("\tx/word\n\t ");

    for(i = 0; i < len; i++)
    {
        printf("   word%d",i+1);     /* 3个SP */ 
    }
    printf("\n\n");
}

最终代码

#include<stdio.h>
#include<string.h>

/* word 数量*/
#define NUM 100


/*  
    数组中的最大数
*/
int max(int* array,int len)
{
    int maxValue = 0;
    int i=0;
    for(i = 0; i < len; i++)
    {
        if(array[i] > maxValue)
        {
            maxValue = array[i];
        }
    }
    return maxValue;
}

/*
     绘制直方图
     备注:本来想用\t制表符来替换空格的,但发现\t 打出来的空格不一样多
           下面我会注释用了多少空格的 ,用空格是为了打印出来的直方图对齐 
*/
void vertical(int array[],int len)
{
    int maxValue = max(array,len);    
    int j;
    int i;  
    printf("  y/num↑\n");               /* 打印直方图的y轴顶部 , y前面2个SP   */ 

    for(i = maxValue + 1; i > 0; i--)
    {
        printf("%8d|_  ", i);           /*  打印直方图的y轴    */
        for(j = 0; j < len; j++)
        {
            if(array[j] == i)           /*  打印直方图的顶部 ,1个SP,3个_,4个SP */
            {
                printf(" ___    ");      
            }
            else if(array[j] >= i)      /*  打印直方图的侧部 ,2个|,3个SP,3个SP */
            {
                printf("|   |   ");
            }
            else if(array[j] == i-1)    /*  打印该数据,位于直方图顶部的上方    */
            {
                printf(" (%d)    ",array[j]);
            }
            else
            {
                printf("        ");     /*  无数据     8个SP                        */
            }
        }

        printf("\n");
    }

    /*
    *   纯属美观需要,并打印 X轴 
    *
    */
    printf("       0");

    for(i = 0; i < len + 1; i++)
    {
        printf("|___|___");
    }
    printf("|___→\n");

    for(i = 0; i< (2 * len); i++)
    {
        printf("\t");
    }
    printf("\tx/word\n\t ");

    for(i = 0; i < len; i++)
    {
        printf("   word%d",i+1);     /* 3个SP */ 
    }
    printf("\n\n");
}

int main()
{
    int words[NUM];
    char temp[NUM][100];
    int i;
    int num;

    num = 0;

    printf("请输入单词:");
    while(1)                                /* 循环输入单词,直到EOF结束 */ 
    {
        if (scanf("%s", temp[num])==EOF)
        {
            break;
        }
        else
        {
            num++;
        }
    }
    printf("\n共输入了%d个单词:", num);


    for(i = 0; i < num; i++)
    {
        printf("\n\t word%2d is %s\n", i+1, temp[i]);
    }

    for(i = 0; i < num; i++)
    {
        words[i] = strlen(temp[i]);
    }

    int maxValue = max(words,num);
    printf("maxValue =%d \n", maxValue);
    vertical(words,num);
    return 0;
}
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值