#include <stdio.h>
#include <stdlib.h>
/*打印输入中各字符出现的频度 */
/*思想:定义两个数组,一个存放具体的字符名称,一个存放出现次数。 两者要保持对应关系 */
/*用选择法对数组排序,重写垂直直方图打印程序*/
//增加一个对数组有效长度的检测,确定长度后,后续的打印程序会非常简单清晰
#define MAX 20
int main()
{
int c,i,j,k;
j=k=0;
int nchar[MAX],number[MAX];
int maxnumber,length; //字母最多数量,及有效行
maxnumber = 0;
length = MAX; //先默认有效行为MAX
int index,indexchar;
index = indexchar =0;
for (i = 0;i< MAX;++i)
{nchar[i] = 0;
number[i] = 0;
}
while((c = getchar()) != EOF){
for(i = 0;i< MAX;++i)
{if (c =='\n'||c =='\t'||c ==' ') //输入换行制表符及空格不予统计跳出
break;
else if(nchar[i] == c) //if existence char, then the accordly number +1,一定要跳出
{++number[i];
break;
}
else if(nchar[i] == 0) //if don't find the existence char, then 赋值第1个非零的nchar,同时对应计数+1
{nchar[i] = c;
++number[i];
break;
}
}
}
/*以下是打印内容*/
for(i=0;i<MAX;++i){
if ((number[i])!= 0)
{printf("第%d: ",i+1);
putchar(nchar[i]);
printf("字母有%2d个\n",number[i]);
}
}
printf("\n\n");
//以下数组变化,数量从多到少排列,选择法
for(i=0;i<MAX;++i) //对数组实际有效长度判断
if(number[i] == 0)
{
length = i;
break;
}
for(k=1;k<length;++k) //选择法对数组排序
for(i=k;i<length;++i)
{
j = (k-1);
if(number[j]<number[i])
{
index = number[i];
number[i] = number[j];
number[j] = index;
indexchar = nchar[i];
nchar[i] = nchar[j];
nchar[j] = indexchar;
}
}
//以下打印直方图
for(i=0;i<length;++i) //找出最多字母数量
if(number[i]>maxnumber)
maxnumber = number[i];
for (;maxnumber>0;--maxnumber)
{
printf("%2d|",maxnumber); //打印竖坐标头
for(j=0;j<length;++j) //行打印循环
{
if(number[j]<maxnumber)
printf(" ");
else
printf(" *");
}
printf("\n");
}
/*打印横坐标线*/
printf(" ");
for(i=0;i<length;++i) //打印横坐标线--
printf("--");
printf("\n");
/*打印横坐标下面字符 */
printf(" ");
for(i=0;i<length;++i) //打印横坐标线下字符,直到遇到nchar[]=0
{printf(" ");
putchar(nchar[i]);
}
printf("\n");
return 0;
}
#include <stdlib.h>
/*打印输入中各字符出现的频度 */
/*思想:定义两个数组,一个存放具体的字符名称,一个存放出现次数。 两者要保持对应关系 */
/*用选择法对数组排序,重写垂直直方图打印程序*/
//增加一个对数组有效长度的检测,确定长度后,后续的打印程序会非常简单清晰
#define MAX 20
int main()
{
int c,i,j,k;
j=k=0;
int nchar[MAX],number[MAX];
int maxnumber,length; //字母最多数量,及有效行
maxnumber = 0;
length = MAX; //先默认有效行为MAX
int index,indexchar;
index = indexchar =0;
for (i = 0;i< MAX;++i)
{nchar[i] = 0;
number[i] = 0;
}
while((c = getchar()) != EOF){
for(i = 0;i< MAX;++i)
{if (c =='\n'||c =='\t'||c ==' ') //输入换行制表符及空格不予统计跳出
break;
else if(nchar[i] == c) //if existence char, then the accordly number +1,一定要跳出
{++number[i];
break;
}
else if(nchar[i] == 0) //if don't find the existence char, then 赋值第1个非零的nchar,同时对应计数+1
{nchar[i] = c;
++number[i];
break;
}
}
}
/*以下是打印内容*/
for(i=0;i<MAX;++i){
if ((number[i])!= 0)
{printf("第%d: ",i+1);
putchar(nchar[i]);
printf("字母有%2d个\n",number[i]);
}
}
printf("\n\n");
//以下数组变化,数量从多到少排列,选择法
for(i=0;i<MAX;++i) //对数组实际有效长度判断
if(number[i] == 0)
{
length = i;
break;
}
for(k=1;k<length;++k) //选择法对数组排序
for(i=k;i<length;++i)
{
j = (k-1);
if(number[j]<number[i])
{
index = number[i];
number[i] = number[j];
number[j] = index;
indexchar = nchar[i];
nchar[i] = nchar[j];
nchar[j] = indexchar;
}
}
//以下打印直方图
for(i=0;i<length;++i) //找出最多字母数量
if(number[i]>maxnumber)
maxnumber = number[i];
for (;maxnumber>0;--maxnumber)
{
printf("%2d|",maxnumber); //打印竖坐标头
for(j=0;j<length;++j) //行打印循环
{
if(number[j]<maxnumber)
printf(" ");
else
printf(" *");
}
printf("\n");
}
/*打印横坐标线*/
printf(" ");
for(i=0;i<length;++i) //打印横坐标线--
printf("--");
printf("\n");
/*打印横坐标下面字符 */
printf(" ");
for(i=0;i<length;++i) //打印横坐标线下字符,直到遇到nchar[]=0
{printf(" ");
putchar(nchar[i]);
}
printf("\n");
return 0;
}