编写程序打印输入中各个字符出现的频度

#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;
}

猜你喜欢

转载自blog.csdn.net/weixin_42384383/article/details/80571005