| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7359 人关注过本帖
标题:如何打印出垂直的直方图~与打印直方图的方法思路~
只看楼主 加入收藏
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:0 
二维字符串数组,你别告诉我你看不懂s[10][10]
垂直就比水平麻烦点,没什么意思。估计有人帮你。我反正对这个问题没兴趣了
2016-07-25 18:52
晓益
Rank: 4
来 自:江苏扬州
等 级:业余侠客
威 望:2
帖 子:85
专家分:220
注 册:2016-7-9
收藏
得分:0 
回复 5楼 Man丶諦
你这题目本就没那么复杂:输入单个单词, 再输出单个单词的直方图就是了。

我就说垂直的:其实答案你已经有了。
          ++length;//这是追踪你单词长度的变量
         for(i=1;i<=length;i++)// 你再循环输出也就可以了,没你想得那么复杂
                  printf("*\n");
                  

千里之行,始于足下。
思考问题伤细胞,得分不容易。解决完问题请尽快结贴
2016-07-25 19:22
Man丶諦
Rank: 1
等 级:新手上路
帖 子:50
专家分:5
注 册:2016-7-22
收藏
得分:0 
回复 11楼 linlulu001
谢谢你的帮助~
    那个数组什么的确是第一次见到,我应该先去百度一下在回复的。不好意思~
    我啥也不懂自学《c语言程序设计》现在也才学到第一章。有很多不理解的,可能你们觉得非常白痴的问题~
    可是都会让我疑惑个几天,都不一定可以理解。

希望你们多多谅解~谢谢~

电脑小白~啥也不懂~
现在掉进了Linux的坑~
从C语言开始~我的计算机旅行~
2016-07-25 19:26
Man丶諦
Rank: 1
等 级:新手上路
帖 子:50
专家分:5
注 册:2016-7-22
收藏
得分:0 
回复 12楼 晓益
单个单词的垂直直方图我理解怎么解决~
    可是如果输入多个单词的话,就不知道该用什么方法或思路来输出了

要不我去百度下,这个练习题的答案看看~

电脑小白~啥也不懂~
现在掉进了Linux的坑~
从C语言开始~我的计算机旅行~
2016-07-25 19:31
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) {            /* 打印直方图 */
        for (j = 1; j < MAXWORD; ++j)
            if (wl[j] * MAXHIST / maxvalue >= i)    /* 这条语句是什么原理? */
                printf("*");
            else
                printf(" ");
        putchar('\n');
    }

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

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

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


还有运行的结果,貌似也有点不对:
图片附件: 游客没有浏览图片的权限,请 登录注册


它的直方图,不是对应在相应的字符数上~不知道是哪里出了问题


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

还有这一个for循环输出直方图,可是不理解它是如何实现的。



电脑小白~啥也不懂~
现在掉进了Linux的坑~
从C语言开始~我的计算机旅行~
2016-07-25 20:46
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
zx315
Rank: 5Rank: 5
来 自:广东
等 级:职业侠客
威 望:2
帖 子:86
专家分:378
注 册:2016-7-13
收藏
得分:3 
程序代码:
#include <stdio.h>
#include <stdbool.h>
#include <ctype.h>

#define MAX_WORDS 10

int main(void) {
    int a[MAX_WORDS] = {0};
    // 所有单词的最大长度
    int max_len = 0;
    // 输入的单词数
    int nwords = 0;

    int c;
    int len = 0;
    bool is_inword = false;
    bool is_space;
    while (nwords < MAX_WORDS && (c = getchar())) {
        is_space = isspace(c);
        if (is_space && !is_inword) {
            continue;
        }
        else if (is_space) {
            a[nwords++] = len;
            if (len > max_len) {
                max_len = len;
            }
            len = 0;
            if (c == '\n') {
                break;
            }
        }
        else {
            ++len;
            is_inword = true;
        }
    }

    for (int i = max_len; i > 0; --i) {
        for (int j = 0; j <= nwords; ++j) {
            if (a[j] >= i) {
                printf("* ");
            }
            else {
                printf("  ");
            }
        }
        putchar('\n');
    }

    return 0;
}


[此贴子已经被作者于2016-7-25 22:08编辑过]


Read The Fucking Source Code~
2016-07-25 22:00
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.047579 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved