【C Programming】单词直方图

C programming一栏用于记录《The C Programming Learning》中的学习历程,代码均来源于其对应习题解答。
习题1-13 打印输入中单词长度的直方图。

//单词水平长度直方图

#include<stdio.h>
#define MAXWORD 11 //单词最长的长度
#define MAXHIST 15 //直方图最长的长度
#define OUT 0
#define IN  1

int main()
{
	int c,i,j,state;
	int wl[MAXWORD];//各长度的次数
	int nc; //一个单词的长度
	int len;//输出*的长度
	int maxvalue;//单词长度的最大值
	int overflow;
	state=OUT;
	overflow=0;
	nc=0;
	for(i=0;i<MAXWORD;i++)
		wl[i]=0;
	while((c=getchar())!=EOF){
		if(c==' '|| c=='\t' || c=='\n'){
			if(nc>0){
			    if(nc<MAXWORD)
					wl[nc]++;
				 else
					overflow++;
		     }
	         nc=0;
		     state=OUT;		
		}
		else if(state==OUT){ //一个单词开头
			nc=1;
	        state=IN;
		}
		else                //一个单词内部
			nc++;
	}
	//给maxvalue赋值
	maxvalue=0;
	for(i=1;i<MAXWORD;i++){
	    if(wl[i]>maxvalue)
		   maxvalue=wl[i];
	}
	for(i=1;i<MAXWORD;i++){
		printf("%5d  --%5d  : ",i,wl[i]);
	    if(wl[i]>0){
	        if((len=wl[i]*MAXHIST/maxvalue)<=0) //len=wl[i]*MAXHIST/maxvalue归一化
			len=1;
		}
		else
			len=0;
		for(j=len;j>0;j--)
			printf(" * ");
	    printf("\n");
	}
	if(overflow>0)
		printf("有 %d 个单词长度超过了 %d  ",overflow,MAXWORD);
}


以下为打印垂直直方图代码段,从两个for语句开始,前面同水平直方图

for(j=MAXHIST;j>0;j--){ //行
	    for(i=1;i<MAXWORD;i++)       //列
		  if((len=wl[i]*MAXHIST/maxvalue)>=j)
			printf("   *");
		  else
			printf("    ");
	    printf("\n");
	}
	for(i=1;i<MAXWORD;i++)
		 printf("%4d",wl[i]);
	printf("\n");
	for(i=1;i<MAXWORD;i++)
		 printf("%4d",i);
	printf("\n");
	if(overflow>0)
		printf("有 %d 个单词长度超过了 %d  ",overflow,MAXWORD);


各字符出现频度的直方图,同水平。

#include<stdio.h>
#include<ctype.h>
#define MAXCHAR 128 //
#define MAXHIST 15 //直方图最长的长度
int main()
{
	int c,i,j;	
	int len;//输出*的长度
	int maxvalue;	
	int cc[MAXCHAR];
	for(i=0;i<MAXCHAR;i++)
		cc[i]=0;
	while((c=getchar())!=EOF){
		if(c<MAXCHAR)
		  cc[c]++;	
	}
	maxvalue=0;
	for(i=1;i<MAXCHAR;i++){
	    if(cc[i]>maxvalue)
		   maxvalue=cc[i];
	}
	for(i=1;i<MAXCHAR;i++){
	    if(isprint(i))
		    printf("%5d --  %c  --%5d  :",i,i,cc[i]);
		else
			printf("%5d --      --%5d  :",i,cc[i]);
        if(cc[i]>0){
		    if((len=cc[i]*MAXHIST/maxvalue)<=0)
			   len=1;
		}
		else
			len=0;
		for(j=len;j>0;j--)
			printf(" * ");
	printf("\n");
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值