【垂直直方图】

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 如图所示:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值