C------一种C语言实现:输入流文本所有字符垂直直方图实现方法。
打印输入流文本所有字符出现的次数-------垂直直方图
单词长度、单词出现频率、字符出现频率等,直方图问题有时出现。以下给出一种C语言输入流文本所有字符频度垂直直方图实现方法。水平直方图更加简单,修改一下就行!
#include <stdio.h>
void stdinwordfrequencyverticalhistogram(); //字符出现频度垂直直方图
int main()
{
printf("\nHello World! \"我爱,我疯狂!\"\n");
stdinwordfrequencyverticalhistogram();
return 0;
}
void stdinwordfrequencyverticalhistogram()//字符出现频度垂直直方图
{
int c, i,j,nmax,nrow;
int text[2][256]; //ascii码最大值256共256个字符
nmax =nrow= 0;
for (i = 0; i < 2; i++)
for (j = 0; j < 256; j++)
if(i==0)text[i][j]=j;
else text[i][j] = 0; //ascii值为0是NULL字符
while ((c = getchar()) != EOF) //写入字符判断
{
for (j = 0; j < 256; j++)
{
if (c==text[0][j])
text[1][j]++; //标记此ASCII码值字符出现次数
if (text[1][j] > nmax)
nmax = text[1][j]; //记录字符出现最大次数
}
}
for (j = 0; j < 256; j++) {
if(text[1][j]>=1)text[1][j]++; //标记此ASCII码值字符出现
}
nrow=++nmax;
for (i = 1; i <nrow; i++) { //打印垂直直方图
for (j = 0; j < 256; j++) {
if (text[1][j] <nmax&&text[1][j]>1) {
printf(" ");
}
else if (text[1][j] ==nmax) {
printf(" *");
text[1][j]--;
}
}
nmax--;
if(nmax>0)printf("\n");
}
for (j = 0; j < 256; j++) {
if (text[1][j] == 1) {
switch (text[0][j])
{
case '\t':
printf("\\t"); break;
case '\b':
printf("\\b"); break; //回退符\b怎么打印出来????????/ //转移字符\b回退符:只将光标向前移动一个字符(遇到\n或\r则停止移动),并从此位置开始输出(会出现一定数量的字符覆盖)后面的字符(空字符\0和换行符\n除外)
case '\n':
printf("\\n"); break;
case '\r':
printf("\\r"); break;
default:
printf(" %c", text[0][j]);
break;
}
}
}
}
Sample Input & Output 如图所示: