| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7270 人关注过本帖
标题:如何打印出垂直的直方图~与打印直方图的方法思路~
取消只看楼主 加入收藏
Man丶諦
Rank: 1
等 级:新手上路
帖 子:50
专家分:5
注 册:2016-7-22
收藏
得分:0 
自己对输出直方图的理解;
    至直方图的顶部开始判断数组里的值在那个位置是否需要打印*否则打印空格
    然后继续直方图的下一行,重复判断是否需要打印
 直到打印完直方图的最大值

不知道自己的理解对不对~
程序代码:
#include <stdio.h>

#define MAXHIST 15                            /* 直方图的最大长度 */
#define MAXWORD 11                            /* 输入单词的最大长度 */
#define IN 1                                /* 在一个单词内部 */
#define OUT 0                                /* 在一个单词外部 */

main()
{
    int c, i, j, nc, state;
    int maxvalue;                            /* wl[] 数组里最大的值 */
    int ovflow;                                /* 溢出的词数 */
    int wl[MAXWORD];                        /* 计算单词长度 */

    state = OUT;
    nc = 0;                                    /* 一个单词的字符数 */
    ovflow = 0;                                /* 单词字符数大于最大长度 */

    for (i = 0; i < MAXWORD; ++i)            /* 给数组赋值 */
        wl[i] = 0;
   

    while ( (c = getchar()) != EOF ){
        if (c == ' ' || c == '\n' || c == '\t'){    /* 遇到空格,换行,Tab表示一个单词的结束 */
            state = OUT;
            if (nc > 0)                        /* 单词长度大于0 */
                if (nc < MAXWORD)            /* 长度小于最大值 */
                    ++wl[nc];                /* 在相应的单词长度上加1 */
                else
                    ++ovflow;                /* 大于最大值的单词加1 */
            nc = 0;
        } else if (state = OUT) {            /* 是否是单词的开始 */
            state = IN;                        /* 把状态改为在单词内 */
            nc = 1;                            /* 重新开始记录单词数 */
        } else
            ++nc;
    }

    maxvalue = 0;
    for (i = 1; i < MAXWORD; ++i)            /* 找出数组里最大的值 */
        if (wl[i] > maxvalue)
            maxvalue = wl[i];

    for (i = MAXHIST; i > 0; --i) {            /* 循环最大直方图的次数  15 */
        for (j = 1; j < MAXWORD; ++j)        /* 每循环一次直方图次数,就循环一回数组的值。判断并输出*或空格,好打印出垂直的直方图 */
            if (wl[j] * MAXHIST / maxvalue >= i)    /* 这样可可以打印出一个 15*10 的直方图,每次输出一行输出15次 */
                printf("*");        /* 这里的计算 是判断是否需要在一个位置输出*号 */
            else                /* 用单词长度数 × 直方图最大值 / 单词长度最大值 >= 直方图对应的行数 */
                printf(" ");        /* 大于行数就打印 * 否则打印空格 */
        putchar('\n');                /* 在循环完10次后换行,在继续循环下一行 */
    }

    for (i = 1; i < MAXWORD; ++i)
        printf("%d ", i);
    putchar('\n');

    for (i = 1; i < MAXWORD; ++i)
        printf("%d ", wl[i]);
    putchar('\n');

    if (ovflow > 0)
        printf("There are %d words >= %d\n", ovflow, MAXWORD);
}


电脑小白~啥也不懂~
现在掉进了Linux的坑~
从C语言开始~我的计算机旅行~
2016-07-25 21:16
Man丶諦
Rank: 1
等 级:新手上路
帖 子:50
专家分:5
注 册:2016-7-22
收藏
得分:0 
程序代码:
#include <stdio.h>

int main(void)
{
        int y, i, j;
        int x[11];
        y = 15;

        for(i=1; i<11; ++i)
                x[i] = i;

        for(i=y; i>0; --i){
                for(j=1; j<11; ++j){
                        if( x[j] >= i )
                                printf("*");
                        else
                                printf(" ");
                } putchar('\n');
        }
}

终于理解如何打印出垂直的直方图了。自己写了个程序验证~

还发现了前面程序的问题:
     for (i = MAXHIST; i > 0; --i) {            /* 打印直方图 */
        for (j = 1; j < MAXWORD; ++j)
            if (wl[j] * MAXHIST / maxvalue >= i)    /* 这条语句是什么原理? */
                printf("*");
            else
                printf(" ");
        putchar('\n');
    }

是没有把if语言用大括号括起来导致不能正常输出换行符~

    for (i = MAXHIST; i > 0; --i) {            /* 打印直方图 */
        for (j = 1; j < MAXWORD; ++j)
            if (wl[j] * MAXHIST / maxvalue >= i) {    /* 这条语句是什么原理? */
                printf("*");
            else
                printf(" ");
        } putchar('\n');
    }

改成这样就可以了~

电脑小白~啥也不懂~
现在掉进了Linux的坑~
从C语言开始~我的计算机旅行~
2016-07-26 11:55
Man丶諦
Rank: 1
等 级:新手上路
帖 子:50
专家分:5
注 册:2016-7-22
收藏
得分:0 
这个程序看了两天了,可以用别的方法打印出垂直的直方图。可是就是看不懂,练习题给的答案~

其中打印直方图里的这一句算数表达式还是不理解
语句是这样的:
         if (wl[j] * MAXHIST / maxvalue >= i)    /* 这句到底有啥用~(用当前的值×直方图最大值 ÷数组的最大值)>= 打印直方图当前的行数 */
                printf("*");                                           /* 我直接不计算,用 当前值是否 >= 打印直方图当前的行数  来输出直方图 */
            else
                printf(" ");
   
求解:这个算数表达式是如何判断需不需要打印 *   的?



程序代码:
#include <stdio.h>

#define MAXHIST 15                            /* 直方图的最大长度 */
#define MAXWORD 11                            /* 输入单词的最大长度 */
#define IN 1                                /* 在一个单词内部 */
#define OUT 0                                /* 在一个单词外部 */

main()
{
    int c, i, j, nc, state;
    int maxvalue;                            /* wl[] 数组里最大的值 */
    int ovflow;                                /* 溢出的词数 */
    int wl[MAXWORD];                        /* 计算单词长度 */

    state = OUT;
    nc = 0;                                    /* 一个单词的字符数 */
    ovflow = 0;                                /* 单词字符数大于最大长度 */

    for (i = 0; i < MAXWORD; ++i)            /* 给数组赋值 */
        wl[i] = 0;
  


    while ( (c = getchar()) != EOF ){
        if (c == ' ' || c == '\n' || c == '\t'){    /* 遇到空格,换行,Tab表示一个单词的结束 */
            state = OUT;
            if (nc > 0)                        /* 单词长度大于0 */
                if (nc < MAXWORD)            /* 长度小于最大值 */
                    ++wl[nc];                /* 在相应的单词长度上加1 */
                else
                    ++ovflow;                /* 大于最大值的单词加1 */
            nc = 0;
        } else if (state = OUT) {            /* 是否是单词的开始 */
            state = IN;                        /* 把状态改为在单词内 */
            nc = 1;                            /* 重新开始记录单词数 */
        } else
            ++nc;
    }

    maxvalue = 0;
    for (i = 1; i < MAXWORD; ++i)            /* 找出数组里最大的值 */
        if (wl[i] > maxvalue)
            maxvalue = wl[i];

    for (i = MAXHIST; i > 0; --i) {            /* 循环最大直方图的次数  15 */
        for (j = 1; j < MAXWORD; ++j)        /* 每循环一次直方图次数,就循环一回数组的值。判断并输出*或空格,好打印出垂直的直方图 */
            if (wl[j] * MAXHIST / maxvalue >= i)    /* 这样可可以打印出一个 15*10 的直方图,每次输出一行输出15次 */
                printf("*");        /* 这里的计算 是判断是否需要在一个位置输出*号 */
            else                /* 用单词长度数 × 直方图最大值 / 单词长度最大值 >= 直方图对应的行数 */
                printf(" ");        /* 大于行数就打印 * 否则打印空格 */
        putchar('\n');                /* 在循环完10次后换行,在继续循环下一行 */
    }

    for (i = 1; i < MAXWORD; ++i)
        printf("%d ", i);
    putchar('\n');

    for (i = 1; i < MAXWORD; ++i)
        printf("%d ", wl[i]);
    putchar('\n');

    if (ovflow > 0)
        printf("There are %d words >= %d\n", ovflow, MAXWORD);
}

   


[此贴子已经被作者于2016-7-26 23:56编辑过]


电脑小白~啥也不懂~
现在掉进了Linux的坑~
从C语言开始~我的计算机旅行~
2016-07-26 23:34
Man丶諦
Rank: 1
等 级:新手上路
帖 子:50
专家分:5
注 册:2016-7-22
收藏
得分:0 
回复 7楼 linlulu001
程序代码:
#include <stdio.h>
#include <ctype.h>

int main(void)
{
    int y, i, j, c, max, nc, test;
    int x[11];
    y = 15;
    test = 0;
    nc = 0;

    for(i=1; i<11; ++i)
        x[i] = 0;

    //x[1] = 1;
    //x[2] = 2;
    //x[3] = 1;
    while ((c=getchar()) != EOF ){
        if(isalpha(c)){
            ++nc;
            test = 1;
        } else {
            if(test == 1){
                ++x[nc];
                nc = 0;
                test = 0;
            }
        }
    }
   

   

    max = 0;
   

    for(i = 1; i < 11; ++i)
        if (x[i] > max)
            max = x[i];

    for(i=y; i>0; --i){
        for(j=1; j<11; ++j){
            //if( (x[j]*15/max) >= i )     /* 主要就是改动这两个表达式,它的直方图就完全不一样了 */
            if (x[j] >= i)   

                printf("* ");
            else
                printf("  ");
        } putchar('\n');
    }
}

电脑小白~啥也不懂~
现在掉进了Linux的坑~
从C语言开始~我的计算机旅行~
2016-07-27 03:28
快速回复:如何打印出垂直的直方图~与打印直方图的方法思路~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029016 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved