1. 程式人生 > >練習1.13(2)

練習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");
    }
}
就是這樣了。。 覺得畫流程圖很有用。。一點要耐心畫下去!