免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1195 | 回复: 8
打印 上一主题 下一主题

(初学者)各位大哥帮我分析下我看一本书时遇到的疑难好吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-12-02 09:38 |只看该作者 |倒序浏览
我看的书是 机械工业出版社出版 c语言设计语言(第2版·新版)习题解答
第12页有一个程序
编写一个程序,打印输入中各个字符出现的频率的直方图。
#include <stdio.h>;
#include <ctype.h>;
#define MAXHIST 15      /*max length of histogram*/
#define MAXCHAR 128   /*max different characters*/
main()
{
    int c, i;
    int len;
    int maxvalue;
    int cc[MAXCHAR];
   
    for(i = 0; i < MAXCHAR; ++i)
         cc = 0;
    while((c = getchar()) != EOF)
         if(c < MAXCHAR)
             ++cc[c];

    maxvalue = 0;
    for(i = 1; i < MAXCHAR; ++i)
         if(cc >; maxvalue)
             maxvalue = cc;

    for(i =1; i < MAXCHAR; ++i){
        if(isprint(i))
            printf("%5d - %c - %5d : ", i , i, cc);
        else
            printf("%5d -   -%5d : ", i , cc);
        if(cc >; 0){                                                     /*
            if((len = cc * MAXHIST / maxvalue) <= 0) /*
                len = 1;                                                   /*
        }else                                                               /*
            len = 0;                                                       /*
        while(len >; 0){                                                /*
            putchar('*');                                                /*
            --len;                                                           /*
        }
        putchar('\n');
    }
}
原程序中因为cc, MAXHIST,maxvalue都是大于等于0的,所以len肯定大于等于0,当len>;0时,按原程序
    else
        len = 0;
那么len = 0,这样的话,就不会继续执行后面的while语句了,也就是说
当 cc *MAXHIST / maxvalue大于0时,将不打印*.  可是   当我运行此程序时发现,
上面最后的做了*/记号的那几行竟然等效于
        len = cc * MAXHIST / maxvalue;
        while(len >; 0){
            putchar('*');
            --len;
        }
各位大哥帮我看看,我对原程序的分析哪里出问题了?

论坛徽章:
0
2 [报告]
发表于 2004-12-02 10:34 |只看该作者

(初学者)各位大哥帮我分析下我看一本书时遇到的疑难好吗?

我哪里分析错了,大家能耐心点帮我看看吗?

论坛徽章:
0
3 [报告]
发表于 2004-12-02 10:40 |只看该作者

(初学者)各位大哥帮我分析下我看一本书时遇到的疑难好吗?

我给你标出成对的花扩号你就明白了,注意下面扩号的颜色


#include <stdio.h>;
#include <ctype.h>;
#define MAXHIST 15 /*max length of histogram*/
#define MAXCHAR 128 /*max different characters*/
main()
{
int c, i;
int len;
int maxvalue;
int cc[MAXCHAR];

for(i = 0; i < MAXCHAR; ++i)
cc = 0;
while((c = getchar()) != EOF)
if(c < MAXCHAR)
++cc[c];

maxvalue = 0;
for(i = 1; i < MAXCHAR; ++i)
if(cc >; maxvalue)
maxvalue = cc;

for(i =1; i < MAXCHAR; ++i){
if(isprint(i))
printf("%5d - %c - %5d : ", i , i, cc);
else
printf("%5d - -%5d : ", i , cc);
if(cc >; 0){ /*
if((len = cc * MAXHIST / maxvalue) <= 0) /*
len = 1; /*
}else /*
len = 0; /*
while(len >; 0){ /*
putchar('*'); /*
--len; /*
}
putchar('\n');
}
}

论坛徽章:
0
4 [报告]
发表于 2004-12-02 10:46 |只看该作者

(初学者)各位大哥帮我分析下我看一本书时遇到的疑难好吗?

楼主没有看懂这一句吧:

  1. if ((len = cc[i] * MAXHIST / maxvalue) <= 0)
复制代码

只要有输入,这个地方计算机出来的len是大于0的。

论坛徽章:
0
5 [报告]
发表于 2004-12-02 10:56 |只看该作者

(初学者)各位大哥帮我分析下我看一本书时遇到的疑难好吗?

没什么问题吧,原来程序不会执行到else的,可以把那段if去掉

论坛徽章:
0
6 [报告]
发表于 2004-12-02 11:57 |只看该作者

(初学者)各位大哥帮我分析下我看一本书时遇到的疑难好吗?

受不了了!看清楚程序了。。。。。。
两个非零的整数相除是可以得出0来的!!!
if(cc >; 0){  
        if((len = cc * MAXHIST / maxvalue) <= 0)  
        len = 1;
}else  
         len = 0;

————————————————
这样做很明显为了有输入,就能至少打印一个*出来

论坛徽章:
0
7 [报告]
发表于 2004-12-02 12:08 |只看该作者

(初学者)各位大哥帮我分析下我看一本书时遇到的疑难好吗?

[quote]原帖由 "kj501"]只要有输入,这个地方计算机出来的len是大于0的。[/quote 发表:


是啊,那么当有输入的时候,就会执行
else
     len = 0;
吧,那么就不会输出*了啊
怎么回事?

论坛徽章:
0
8 [报告]
发表于 2004-12-02 12:11 |只看该作者

(初学者)各位大哥帮我分析下我看一本书时遇到的疑难好吗?

[quote]原帖由 "li2002"]没什么问题吧,原来程序不会执行到else的,可以把那段if去掉[/quote 发表:


为什么不会?当 (len = cc *MAXHIST / maxvalue) >; 0 时不就执行else了吗?

论坛徽章:
0
9 [报告]
发表于 2004-12-02 12:16 |只看该作者

(初学者)各位大哥帮我分析下我看一本书时遇到的疑难好吗?

哦,我知道了,看错了,对不起大家,浪费大家时间了,我把
else 与 if((len = .......) >;= 0) {}相匹配了
它应该与if(cc >; 0) 相匹配。
我下次一定要注意这个问题,谢谢大家这么耐心,关心我这么个菜鸟!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP