#include <stdio.h>
#include <stdlib.h>
/*打印输入中各字符出现的频度 */
/*思想:定义两个数组,一个存放具体的字符名称,一个存放出现次数。 两者要保持对应关系 */
#define MAX 2
int main()
{
int c,i,j;
int nchar[MAX],number[MAX];
int maxnumber,maxv; //字母最多数量,前者变量,后者行高
maxnumber=maxv=0; //最高行
for (i=0;i<MAX;++i)
{nchar[i]=0;
number[i]=0;
}
// c=getchar();
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)
{putchar(nchar[i]);
printf("字母有%2d个\n",number[i]);
}
printf("列举完成\n\n");
for(i=0;i<MAX;++i){
if ((number[i])!= 0)
{putchar(nchar[i]);
printf("字母有%2d个\n",number[i]);
}
//else //此else语句加不加无所谓
// break;
}
printf("\n\n");
/*以下打印直方图 */
for(i=0;i<MAX;++i) //找出最多字母数量
if(number[i]>maxnumber)
maxnumber = number[i];
maxv = number[i];
for (i=0;i<maxv;++i)
{
if(maxnumber>0) //竖坐标打印到1为止
printf("%2d|",maxnumber); //打印竖坐标头
if (maxnumber==0) //后添加,如果不跳出循环,会多打印**
break;
for(j=0;j<MAX;++j) //行打印循环
{
if(number[j]<maxnumber && nchar[j]!= 0 && j<MAX-1) //小于maxnumber的数打印空格,一行打印到nchar[]=0为止
printf(" ");
else if(number[j]<maxnumber && nchar[j]!= 0 && j==MAX-1) //MAX-1作为结束判断,否则实际输入字符种类大于MAX值会出错
{printf("\n");
--maxnumber;
}
else if (number[j]>=maxnumber&&j<MAX-1) //大于maxnumber的列打印 *,同时避免maxnumber=0继续打印
printf(" *");
else if (number[j]>=maxnumber&&j==(MAX-1) ) //MAX-1作为结束判断,否则实际输入字符种类大于MAX值会出错
{
printf(" *\n");
--maxnumber; //必须增加此语句,否则会重复执行printf("%2d|",maxnumber);
break;
}
else if(nchar[j]== 0)
{--maxnumber; //maxnumber减一为下一行打印做判断依据;
printf("\n"); //此行打印结束
break; //遇到nchar[]为0,就跳出循环
}
}
}
/*打印横坐标线*/
printf(" ");
for(i=0;i<MAX;++i) //打印横坐标线--
if(nchar[i]!=0 && i<MAX-1)
printf("--");
else if (nchar[i]!=0 && i==MAX-1)
printf("--\n");
else
{
putchar(45);
printf("\n");
break; //遇到nchar[]=0跳出循环
}
/*打印横坐标下面字符 */
printf(" ");
for(i=0;i<MAX;++i) //打印横坐标线下字符,直到遇到nchar[]=0
if(nchar[i]!=0)
{printf(" ");
putchar(nchar[i]);
}
else
{
printf("\n");
break; //遇到nchar[]=0跳出循环
}
return 0;
}
#include <stdlib.h>
/*打印输入中各字符出现的频度 */
/*思想:定义两个数组,一个存放具体的字符名称,一个存放出现次数。 两者要保持对应关系 */
#define MAX 2
int main()
{
int c,i,j;
int nchar[MAX],number[MAX];
int maxnumber,maxv; //字母最多数量,前者变量,后者行高
maxnumber=maxv=0; //最高行
for (i=0;i<MAX;++i)
{nchar[i]=0;
number[i]=0;
}
// c=getchar();
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)
{putchar(nchar[i]);
printf("字母有%2d个\n",number[i]);
}
printf("列举完成\n\n");
for(i=0;i<MAX;++i){
if ((number[i])!= 0)
{putchar(nchar[i]);
printf("字母有%2d个\n",number[i]);
}
//else //此else语句加不加无所谓
// break;
}
printf("\n\n");
/*以下打印直方图 */
for(i=0;i<MAX;++i) //找出最多字母数量
if(number[i]>maxnumber)
maxnumber = number[i];
maxv = number[i];
for (i=0;i<maxv;++i)
{
if(maxnumber>0) //竖坐标打印到1为止
printf("%2d|",maxnumber); //打印竖坐标头
if (maxnumber==0) //后添加,如果不跳出循环,会多打印**
break;
for(j=0;j<MAX;++j) //行打印循环
{
if(number[j]<maxnumber && nchar[j]!= 0 && j<MAX-1) //小于maxnumber的数打印空格,一行打印到nchar[]=0为止
printf(" ");
else if(number[j]<maxnumber && nchar[j]!= 0 && j==MAX-1) //MAX-1作为结束判断,否则实际输入字符种类大于MAX值会出错
{printf("\n");
--maxnumber;
}
else if (number[j]>=maxnumber&&j<MAX-1) //大于maxnumber的列打印 *,同时避免maxnumber=0继续打印
printf(" *");
else if (number[j]>=maxnumber&&j==(MAX-1) ) //MAX-1作为结束判断,否则实际输入字符种类大于MAX值会出错
{
printf(" *\n");
--maxnumber; //必须增加此语句,否则会重复执行printf("%2d|",maxnumber);
break;
}
else if(nchar[j]== 0)
{--maxnumber; //maxnumber减一为下一行打印做判断依据;
printf("\n"); //此行打印结束
break; //遇到nchar[]为0,就跳出循环
}
}
}
/*打印横坐标线*/
printf(" ");
for(i=0;i<MAX;++i) //打印横坐标线--
if(nchar[i]!=0 && i<MAX-1)
printf("--");
else if (nchar[i]!=0 && i==MAX-1)
printf("--\n");
else
{
putchar(45);
printf("\n");
break; //遇到nchar[]=0跳出循环
}
/*打印横坐标下面字符 */
printf(" ");
for(i=0;i<MAX;++i) //打印横坐标线下字符,直到遇到nchar[]=0
if(nchar[i]!=0)
{printf(" ");
putchar(nchar[i]);
}
else
{
printf("\n");
break; //遇到nchar[]=0跳出循环
}
return 0;
}