编写一个程序:打印输入单词的直方图,垂直方向的直方图。
例如:
长度为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");
}
}