A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

#include <stdio.h>
#include <string.h>
// 定义一个主函数,作为程序的入口
int main()
{
    // 定义一个数组str用来存放输入的字符串
    char str[100];
   
    // 提示输入一个字符串
    printf("please input a string:\n");
   
    // 接收输入的字符串,并赋值给数组str
    gets(str) ;
   
    // 定义两个变量用于for循环条件变量
    int i,j;
   
    // 定义四个变量用来存放ABCD出现的次数
    int a,b,c,d;
    a=b=c=d=0;
   
    // 定义变量length用来存放输入字符串的长度
    unsigned long length = strlen(str);
   
    // 定义for循环,当i小于字符串长度时,执行循环体,i加1
    for (i = 0; i<length; i++)
        {
        
        // 统计A出现的次数
        if (str[i] == 'A')
                {
            a++;
        }
        
        // 统计B出现的次数
        else if (str[i] == 'B')
                {
            b++;
        }
        
        // 统计C出现的次数
        else if (str[i] == 'C')
                {
            c++;
        }
        
        // 统计D出现的次数
        else if (str[i] == 'D')
                {
            d++;
        }
       

    }
   
    // 定义一个数组sort用来存放ABCD出现的次数
    int sort[] = {a,b,c,d};
   
    // 定义temp用于冒泡排序标记排序趟数
    int temp;
   
    // 冒泡排序  将a,b,c,d降序排序,i表示排序的趟数,j表示每趟排序的比较次数
    for (i = 0; i<4; i++)
   
    for(j = i+1;j<4;j++)
        
            if (sort[i] < sort[j])
            {
                // 当前一个元素小于后一个元素时,交换它们的位置
                temp = sort[i];
                sort[i] = sort[j];
                sort[j] = temp;
            }

   
   
    // 遍历排序数组
    for (i = 0; i<4; i++)
    {
        // 如果出现a次,则打印A出现的次数
        if(sort[i] == a )
        {
              printf("A出现%d次\n",a);
        }
        // 如果出现b次,则打印B出现的次数
        else if(sort[i] == b)
        {
              printf("B出现%d次\n",b);
        }
        // 如果出现c次,则打印C出现的次数
        else if(sort[i] == c)
        {
             printf("C出现%d次\n",c);
        }
        // 如果出现d次,则打印D出现的次数
        else if(sort[i] == d)
                {
      
                        printf("D出现%d次\n",d);
                }
       

        
    }
   
  
      
   
   
}


仔细琢磨了下,模块化比较简单,难点在于理解将次数和字符结合起来,排序完成后继续使用一次循环打印出与之对应的字符即可。
回复 使用道具 举报
你们有的写得太复杂了,我简单的理解了下,不完美的地方就是当两个字符出现次数相同的时候,打印出来的字符是一样的,,,,
回复 使用道具 举报
我的,大家可以指导下,

#include <stdio.h>
#include <string.h>
// 定义一个主函数,作为程序的入口
int main()
{
    // 定义一个数组str用来存放输入的字符串
   
    char str[100];
   
    // 提示输入一个字符串
   
    printf("please input a string:\n");
   
    // 接收输入的字符串,并赋值给数组str
   
   gets(str) ;
   
    // 定义两个变量用于for循环条件变量
   
    int i,j;
   
    // 定义四个变量用来存放ABCD出现的次数
    int a = 0;
    int b = 0;
    int c = 0;
    int d = 0;
   
    // 定义变量length用来存放输入字符串的长度
    unsigned long length = strlen(str);
   
    // 定义for循环,当i小于字符串长度时,执行循环体,i加1
    for (i = 0; i<length; i++)
        {
        
        // 统计A出现的次数
        if (str[i] == 'A')
                {
            a++;
        }
        
        // 统计B出现的次数
        else if (str[i] == 'B')
                {
            b++;
        }
        
        // 统计C出现的次数
        else if (str[i] == 'C')
                {
            c++;
        }
        
        // 统计D出现的次数
        else if (str[i] == 'D')
                {
            d++;
        }
       

    }
   
    // 定义一个数组sort用来存放ABCD出现的次数
    int sort[] = {a,b,c,d};
   
    // 定义temp用于冒泡排序标记排序趟数
    int temp;
   
    // 冒泡排序  将a,b,c,d降序排序,i表示排序的趟数,j表示每趟排序的比较次数
    for (i = 0; i<4; i++)
   
    for(j = i+1;j<4;j++)
        
            if (sort[i] < sort[j])
            {
                // 当前一个元素小于后一个元素时,交换它们的位置
                temp = sort[i];
                sort[i] = sort[j];
                sort[j] = temp;
            }

   
   
    // 遍历排序数组
    for (i = 0; i<4; i++)
    {
        // 如果出现a次,则打印A出现的次数
        if(sort[i] == a )
        {
              printf("A出现%d次\n",a);
        }
        // 如果出现b次,则打印B出现的次数
      
        else if(sort[i] == b)
        {
              printf("B出现%d次\n",b);
        }
        // 如果出现c次,则打印C出现的次数
        
        else if(sort[i] == c)
        {
             printf("C出现%d次\n",c);
        }
        // 如果出现d次,则打印D出现的次数
        else if(sort[i] == d)
                {
      
                        printf("D出现%d次\n",d);
                }
       

        
    }
   
  
      
   
   
}
回复 使用道具 举报
来学习了。
回复 使用道具 举报
hero200521296bj 发表于 2015-3-14 01:14
我的代码,绝对测试过,可以按照出现次数从大到小,把ABCD的一次打印出来。想了很久的方法哦,不用结构体, ...

很棒的方法,谢谢!
回复 使用道具 举报
Hanle 中级黑马 2015-10-24 18:06:48
26#
十楼写的很详细,但是好像犯了个错,c语言不能在程序中间定义变量
回复 使用道具 举报
郭嘉 中级黑马 2015-11-28 23:27:40
27#
本帖最后由 郭嘉 于 2015-11-28 23:34 编辑
  1. #include <stdio.h>
  2. #include<string.h>
  3. typedef struct {    //定义一个结构体
  4.     char a;
  5.     int count;
  6. } TheChar;
  7. int main (int argc,const char *argv[])
  8. {
  9.     TheChar tc[4]={{'a',0},{'b',0},{'c',0},{'d',0}}; 定义一个结构体数组用来存放每个字符和其出现的次数
  10.     char str[40];
  11.     printf("请输入一个字符串:\n");
  12.     scanf("%s",str);
  13.     for (int i=0;i<strlen(str);i++)
  14.     {
  15.         for(int j=0;j<4;j++)
  16.         {
  17.             if((*(str+i)==tc[j].a)||((*(str+i)+32)==tc[j].a))  //判断每个元素的值
  18.             {
  19.                 tc[j].count++;
  20.                 break;
  21.             }
  22.         }
  23.     }
  24.     for(int i=0;i<4;i++){
  25.         printf("%c的次数是%d",tc[i].a,tc[i].count);}
  26.     for(int i=0;i<4-1;i++)  //冒泡排序
  27. {
  28.     for(int j=0;j<4-1-i;j++)
  29.     {
  30.         if(tc[j].count<tc[j+1].count)
  31.         {TheChar tctemp=tc[j];
  32.             tc[j]=tc[j+1];
  33.             tc[j+1]=tctemp;
  34.         }
  35.         
  36.     }
  37.    
  38. }
  39.     for(int i=0;i<4;i++){  
  40.         printf("  %c  ",tc[i].a);}
  41. return 0;
  42. }
复制代码
回复 使用道具 举报
用OC字典一一对应的特点做做看 ....
回复 使用道具 举报
对我来说  是大神了
回复 使用道具 举报
12
您需要登录后才可以回帖 登录 | 加入黑马