练习1.13(2)

编写一个程序:打印输入单词的直方图,垂直方向的直方图。

例如:

长度为1、2、3、4、5、6、7的单词数分别为:1、2、4、4、7、0、5

则输出为:

1*

2**

3****

4****

5*******

7*****

PS:你们用的画程序流程图的软件是什么?我用visio之后,画出的图片不能上传。。。。。

程序思路:

1、得到各种长度的单词在输入中出现的次数(称为频度)。用数组保存。

流程图如下: 。。第一次画。。画得不好。。

 

2、根据这个数组,打印垂直方向的直方图。

这个打印就很简单了。。下面给出代码。。

代码如下:

#include <stdio.h>
#include <ctype.h>
#include <string.h>

#define TABLE_LEN 30

void getWordFrequecy(FILE *fin, size_t *table, size_t len);
void displayHistogram(FILE *fout, size_t *table, size_t len);

int main(int argc, char *argv[])
{
    size_t wordTable[TABLE_LEN];
    for (size_t i = 0; i != TABLE_LEN; ++i)
        wordTable[i] = 0;
    getWordFrequecy(fopen("main.c", "r"), wordTable, TABLE_LEN);
    displayHistogram(stdout, wordTable, TABLE_LEN);
    return 0;
}


void getWordFrequecy(FILE *fin, size_t *table, size_t len)
{
    for (size_t i = 0; i != len; ++i)
        table[i] = 0;
        //初始化,每次统计前将表清零

    char inword = 'n'; //判断是否在单词中标识 n-no y-yes
    size_t n = 0;//单词的长度
    int c = 0;//读入的字符
    while ((c = fgetc(fin)) != EOF) {
        if ('y' == inword) {
            if (! isalnum(c)) {
                //出单词:若在单词内,当遇到非数字或非字母的时候,出单词
                inword = 'n';
                ++table[n];
                n = 0;
            } else {
                ++n;
            }
        } else {
            if (isalnum(c)) {
                inword = 'y';
                ++len;
            }
        }
    }
}

void displayHistogram(FILE *fout, size_t *table, size_t len)
{
    for (size_t i = 0; i != len; ++i) {
        if (table[i] == 0) continue;
        printf("%ld", i);
        for (size_t j = 0; j != table[i]; ++j)
            printf("*");
        printf("\n");
    }
}


 

就是这样了。。 觉得画流程图很有用。。一点要耐心画下去!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值