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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

        
    }
   
  
      
   
   
}
回复 使用道具 举报
来学习了。
回复 使用道具 举报
RIDP 中级黑马 2015-9-11 23:51:45
25#

  1. /**
  2. *  7、 从键盘输入一大堆字符串,统计A、B、C、D的出现次数,最后出现次数由高到低输出字母和出现次数。(C语言)
  3. */
  4. #include <stdio.h>
  5. #include <string.h>
  6. #define lenth 100
  7. int countA,countB,countC,countD;//创建四个存放统计结果的全局变量

  8. /**
  9. *  字符出现次数统计
  10. *
  11. *  @param s 需要统计的字符串
  12. */
  13. void count(char *s){
  14.    
  15.     //    创建一个for循环
  16.     for (int i = 0;i<lenth; i++) {
  17.         switch (s[i]) {
  18.             case 'A':
  19.                 countA++;
  20.                 break;
  21.                
  22.             case 'B':
  23.                 countB++;
  24.                 break;
  25.                
  26.             case 'C':
  27.                 countC++;
  28.                 break;
  29.                
  30.             case 'D':
  31.                 countD++;
  32.                 break;
  33.             default:
  34.                 break;
  35.         }
  36.     }
  37. }
  38. /**
  39. *  冒泡排序:从大至小排序
  40. *
  41. *  @param bu  需要排序的数组
  42. *  @param len 需要排序的数组长度
  43. */
  44. void bubble (int bu[],int len){
  45.     int temp = 0;
  46.     //冒泡排序-大->小
  47.     for (int n = len; n>0; n--) {
  48.         for (int i = 0; i<len-1 ; i++)
  49.         {
  50.             temp = 0;
  51.             if (bu[i] < bu[i+1])//判断条件是前者小于后者
  52.             {
  53.                 temp = bu[i];
  54.                 bu[i]=bu[i+1];
  55.                 bu[i+1]=temp;
  56.             }
  57.         }
  58.     }
  59. }

  60. /**
  61. *  匹配一次数字,并进行输出
  62. *
  63. *  @param target !排序后!的数组
  64. */
  65. void output (int target[]){
  66.     for (int i = 0; i < 4; i++) {
  67.         if (target[i] == countA) {
  68.             
  69.             printf("\nA出现次数为%d",countA);
  70.             countA = -1;
  71.             
  72.         }else if (target[i] == countB){
  73.             
  74.             printf("\nB出现次数为%d",countB);
  75.             countB = -1;
  76.             
  77.         }else if (target[i] == countC){
  78.             
  79.             printf("\nC出现次数为%d",countC);
  80.             countC = -1;
  81.             
  82.         }else if (target[i] == countD){
  83.             
  84.             printf("\nD出现次数为%d",countD);
  85.             countD = -1;
  86.             
  87.         }
  88.     }
  89. }


  90. int main(int argc, const char * argv[]) {
  91.     countA = countB = countC = countD = 0;//初始化这四个变量
  92.     char text[lenth]={0};//初始化数组
  93.     printf("RIDP Solution\n");
  94.     printf("Please input your text here:");
  95.     fgets(text,sizeof(text),stdin);//接收键盘输入的字符串
  96.     count(text);//调用统计方法
  97.     int res[4]={countA,countB,countC,countD};
  98.     bubble(res, 4);//排序
  99.     output(res);//输出
  100.     return 0;
  101. }
复制代码

对于这道题我是这样解答的,为了看起来方便所以定义了三个方法,分别用于统计,排序和输出,参见响应注释
从键盘获取文字我使用的是fgets(),记得这个方法是比较安全的获取键盘输入内容的方法
TIP:
1、记得先初始化临时数组,防止垃圾数据影响统计结果
2、记得修改冒泡排序的内容,从而让其从大到小排序
3、输出方法中记得修改统计结果到任意负值,避免重复影响统计结果


注意:
1、冒泡排序处,记得条件是lenth-1,不是lenth,我当时没发现这个错误结果导致输出结果神秘的少了一位,想起某大师说过的“喝口茶冷静一下”
      于是去冷静了一下,后来才发现这有问题


2、输出部分,切记不要忘记修正原先的统计结果


3、如果使用我的解题思路,你需要把统计结果声明为全局变量=,=


4、虽然有点较真,但是题目中要求统计ABCD而不是A,a,B,b,C,c,D,d,故,条件设置为了四个大写字母


5、嘛,如果出现次数相同,默认输出顺序为A-B-C-D
回复 使用道具 举报
hero200521296bj 发表于 2015-3-14 01:14
我的代码,绝对测试过,可以按照出现次数从大到小,把ABCD的一次打印出来。想了很久的方法哦,不用结构体, ...

很棒的方法,谢谢!
回复 使用道具 举报
Hanle 中级黑马 2015-10-24 18:06:48
27#
十楼写的很详细,但是好像犯了个错,c语言不能在程序中间定义变量
回复 使用道具 举报
郭嘉 中级黑马 2015-11-28 23:27:40
28#
本帖最后由 郭嘉 于 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
您需要登录后才可以回帖 登录 | 加入黑马