練習1.13(2)
阿新 • • 發佈:2019-02-02
編寫一個程式:列印輸入單詞的直方圖,垂直方向的直方圖。
例如:
長度為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"); } }