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");
}
}