这家伙又emo了 2021-12-09 17:31 采纳率: 84.6%
浏览 77
已结题

the C Programming Language 练习1-13的打印直方图的细节问题

该程序主要是实现打印输入中单词长度的水平方向的直方图

(len = nl[i] * MAXHIST / maxvalue) <= 0)这个while语句循环的条件让我有些困惑。它会出现len小于0的情况吗?如果不会出现,那么他这个条件改成(len = nl[i] * MAXHIST / maxvalue) = 0)也是可以的吗?如果会出现,那么可否帮忙具体举个例子。谢谢大家了!

#include<stdio.h>
#define IN 1      //单词内部
#define OUT 0  //单词外部
#define MAXNUMBER 11    //一个单词的最大长度
#define MAXHIST 15          //直方图的最大长度
int main()
{
    int c,i,nc,state;
    int overflow;    //长度超过规定范围的单词个数
    int maxvalue;   //nl[]数组元素中的最大值
    int nl[MAXNUMBER];    //储存单词长度
    nc = 0;    //一个单词的字符个数
    state = OUT;    //初始状态是在单词外
    overflow = 0;    //意味着长度大于MAXNUMBER 的单词个数
    for (i=0;i< MAXNUMBER;i++)
    {
        nl[i] = 0 ;
    }
    while ((c=getchar())!=EOF)
    {
        if (c==' '||c=='\n'||c=='\t')
        {
            state = OUT;//在结束时,开始记录对应单词长度的个数
            if (nc > 0)
            {
                if (nc <= MAXNUMBER)
                {
                    nl[nc]++;
                }
                else
                {
                    overflow++;
                }
            }
            nc = 0;
        }
        else if (state==OUT)
        {
            state = IN;
            nc=1;    //状态:一个单词的开始
        }
        else
        {
            nc++;//状态:在一个单词中
        }
    }
    maxvalue = 0;
    int len = 0;
    for (i=1;i< MAXNUMBER;i++)//find nl[i] maxvalue
    {
        if (nl[i] > maxvalue)
        {
            maxvalue = nl[i];
        }
    }
    for (i = 1; i < MAXNUMBER; i++)
    {
        printf("%5d - %5d :",i,nl[i]);
        if (nl[i] > 0)
        {
            if ((len = nl[i] * MAXHIST / maxvalue) <= 0)//此处将程序编的更加简单
                //len = nl[i] * MAXHIST / maxvalue这样的赋值操作是一个表达式
                //因此可以作为更大表达式的一部分出现,所以说len并不是只在if分支语句中起作用的局部变量。
                //这里进行完该操作语句后,持续进行while循环语句。
                //同时,该语句可以看成len = nl[i] / maxvalue * MAXHIST,nl[i]表示长度为i单词的个数
                //maxvalue表示最大频数,两者之比再乘以直方图最大高度,所以得到的便是相应高度。
                //同时这样也起到了限制打印长度的作用
            {
                len = 1;
            }
        }
        else
        {
            len = 0;
        }
        while (len > 0)
        {
            putchar('*');
            len--;
        }
        putchar('\n');
    }
    if (overflow > 0)
    {
        printf("there are %d words >=%d\n",overflow,MAXNUMBER);
    }
    return 0;
}
 
 
 

  • 写回答

2条回答 默认 最新

  • 於黾 2021-12-13 13:16
    关注
    获得2.50元问题酬金

    应该是避免引发除零错误的吧,其实就是把判断maxvalue不为0和判断nl[i]为0写一起了

    评论

报告相同问题?

问题事件

  • 系统已结题 12月17日
  • 修改了问题 12月15日
  • 修改了问题 12月14日
  • 赞助了问题酬金 12月12日
  • 展开全部

悬赏问题

  • ¥15 求修改代码,图书管理系统
  • ¥15 请问有没求偏多标签数据集yeast,reference,recreation,scene,health数据集。
  • ¥15 传感网应用开发单片机实训
  • ¥15 Delphi 关于sAlphaImageList使用问题
  • ¥15 寻找将CAJ格式文档转txt文本的方案
  • ¥20 数电设计提问求帮助,出租车计费器
  • ¥15 shein测试开发会问些啥我是写java的
  • ¥15 关于#单片机#的问题:我有个课程项目设计,我想在STM32F103veTX单片机,M3主控模块上设计一个程序,在Keil uVision5(C语言)上代码该怎么编译?(嫌钱少我可以加钱,急急急)
  • ¥15 opnet仿真网络协议遇到问题
  • ¥15 在安装python的机器学习程序包scikit-learn(1.1版本)时遇到如下问题