| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1540 人关注过本帖
标题:对C程序设计语言练习1-13打印单词长度直方图的答案有所不解
只看楼主 加入收藏
耶耶耶耶耶爷
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2017-7-27
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:5 
对C程序设计语言练习1-13打印单词长度直方图的答案有所不解
以下是答案中的代码

程序代码:
#include <stdio.h>  
  
#define MAXHIST 15  
#define MAXWORD 12 
#define IN  1  
#define OUT 0  
  
main()  
{  
    int c, i, nc, len, state;  
    int wl[MAXWORD]; 
    int ovflow;  
    int maxvalue; 
  
    state = OUT;  
    ovflow = 0;  
    nc = 0;  
    for(i = 0; i < MAXWORD; ++i)  
        wl[i] = 0;  //初始化各数组

    while((c = getchar()) != EOF)  
    {  
        if(c == ' ' || c == '\t' || c == '\n')   
        {  
            state = OUT;  
            if(nc > 0)  
                if(nc < MAXWORD)  
                    ++wl[nc];  
                else  
                    ++ovflow;  
            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 = 1; i < MAXWORD; ++i)  
    {  
        printf("%5d - %5d:", i, wl[i]);  
        if(wl[i] > 0)  
        {  
            if((len = wl[i] * MAXHIST / maxvalue) <= 0) //len为直方图中直方条的长度  
                len = 1;  
        }  
        else  
            len = 0;  
        while(len > 0)  
        {  
            putchar('*');
            --len;  
        }  
        putchar('\n');  
    }  
    if(ovflow > 0)  
        printf("There are %d words >= %d\n", ovflow, MAXWORD);  
    return 0;  
}  


其中
程序代码:
    for(i = 1; i < MAXWORD; ++i)  
    {  
        printf("%5d - %5d:", i, wl[i]);  
        if(wl[i] > 0)  
        {  
            if((len = wl[i] * MAXHIST / maxvalue) <= 0) 
                len = 1;  
        }  
        else  
            len = 0;  
        while(len > 0)  
        {  
            putchar('*');
            --len;  
        }  
        putchar('\n');  
    } 

这里不能理解

1.理解不了len的这个计算方式怎么才会使它<=0
2.判断len == 0之后,使len = 1,到while循环的时候不是只会循环一次输出一个*吗
图片附件: 游客没有浏览图片的权限,请 登录注册

小白一名,卡在这里懵逼了很久,求解!
搜索更多相关主题的帖子: OUT int state ++i putchar 
2017-07-27 12:20
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
        if(wl[i] > 0)  //这一句才是关键
        {  
            if((len = wl[i] * MAXHIST / maxvalue) <= 0) //这里是在计算百分比,计算百分比是有可能得到值为0的,因此如果得到值为0,需要让它循环一次。
                len = 1;  
        }

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-07-27 12:45
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:20 
你想一想如果你来写这个程序,你会怎么写,你就会对答案有更深的理解。
一上来就看答案祝你好运。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-07-27 12:46
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
程序代码:
/*

 * 编写一个程序,打印输入中单词长度的直方图。    *

 * 水平方向的直方图比较容易绘制,垂直方向的    *

 * 直方图则要困难些                *

 */


#include <stdio.h>
#include <ctype.h>
void 
Insert( int value );
int
First( void );
void 
Delete( void );
int
IsEmpty( void );
int
IsFull( void );


int
main( void )
{
    int ch;
    int count;

    count = 0;

    while( EOF != ( ch = getchar() ) )
    {
        if( isalpha( ch ) && !IsFull() )
        {
            Insert( ch );
            count++;
        }
        else if( !IsEmpty() && ( isspace( ch ) || ispunct( ch ) ) )
        {
            while( !IsEmpty() )
                putchar( First() );
            putchar(':');
            while( 0 < count-- )
                putchar( '|' );
            putchar( '\n' );
            count = 0;
        }
        else if( isdigit( ch ) )
            Delete();

    }
    return 0;
}

#define MAX_QUEUE_SIZE 100
int Queue[ MAX_QUEUE_SIZE ];
int read;
int frnot = 1;

int
IsEmpty( void )
{
    return ( read + 1 ) % MAX_QUEUE_SIZE == frnot;
}


int
IsFull( void )
{
    return ( read + 2 ) % MAX_QUEUE_SIZE == frnot;
}


void
Insert( int value )
{
    read = ( read + 1 ) % MAX_QUEUE_SIZE;
    Queue[ read ] = value;
}


int
First( void )
{
    int i;
    i = Queue[ frnot ];
    frnot = ( frnot + 1 ) % MAX_QUEUE_SIZE;
    return i;
}


void
Delete( void )
{
    read = 0;
    frnot = 1;
}

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-07-27 12:51
耶耶耶耶耶爷
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2017-7-27
收藏
得分:0 
回复 楼主 耶耶耶耶耶爷
谢谢,看了回复后自己去写了一下,但没有用这个写法,这个写法还是不太能理解

回复写到一半的时候顿然明朗……
一直在纠结len的值是从哪里得来的,
突然发现是因为if条件中的赋值是会被保留的。

谢谢
2017-07-27 14:23
巡山王
Rank: 1
等 级:新手上路
帖 子:2
专家分:4
注 册:2014-12-14
收藏
得分:0 
我也有写这个,为什么感觉答案这么复杂我发到代码贴里了,原来这个还有标准答案啊
2017-07-27 23:27
快速回复:对C程序设计语言练习1-13打印单词长度直方图的答案有所不解
数据加载中...
 
   



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

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