1-13
打印统计结果的图形,
#include<stdio.h>
#define MAXHIST 15//nc 转 len 常量
#define MAXWORD 11//有效单词长度
#define IN 1//单词内
#define OUT 0//单词外
main()
{
int c, i, nc, state;//字符,for,单词当前长,单词内外,
int len;//处理过的nc,
int maxvalue;//输入的最长单词
int ovflow;//超出范围的单词个数
int wl[MAXWORD];//每种词长的个数,
state = OUT;
nc = 0;
ovflow = 0;
for(i=0; i<MAXWORD; i++)
wl[i] = 0;//初始化单词长度
while((c=getchar()) != EOF) //输入单词
{
if(c==' '||c=='\n'||c=='\t')//输入是空白符时
{
state = OUT;//更改为在单词外
if(nc > 0 && nc < MAXWORD)//单词长度属于这个范围则统计
wl[nc]++;
else
ovflow++;//超出范围统计
nc = 0;//输入词长清理
}
else if(state == OUT)//输入是非空字符时,且之前在单词外
{
state = IN;//更改为单词内,
nc = 1;//基数单词字符1个,
}
else
nc++;//在单词内且非空字符,单词长度累加
}
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 = 1;
}
else
len = 0;
while(len>0)
{
putchar('*');//个数直方图,
len--;
}
putchar('\n');
}
if(ovflow>0)
printf("超出范围的单词数%d 不可以大于%d\n", ovflow, MAXWORD);
}
输入多个单词, 每种长度输出一行,即长度, 个数, 个数的直方图。
1-4
统计输入每个字符出现的频率ascii码的字符个数是128个,可以用arr[0 - 127],累加
#include<stdio.h>
#include <ctype.h>//isprint 判断是否为字符
#define MAXHIST 15//nc 转 len 常量
#define MAXCHAR 128//有效字符集
main()
{
int c, i;//输入字符,for
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++)//0‘\0’是无法输入的
{
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;
while(len>0)
{
putchar('*');//次数直方图,
len--;
}
putchar('\n');
}
}
巧用数组,a[32]++, 这样就统计数空格的个数了,