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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

/*从键盘输入一大堆字符串,统计A、B、C、D的出现次数,最后出现次数由高到低输出字母和出现次数。*/

#include <stdio.h>
void count(char*p,int a[]);//用来统计字符串里ABCD字符的个数,放入字符
void sort(int a[]); // 将个数在数组里按从大到小排序
int main()
{
  int a[4];
  char *s;
  scanf("%s",s)
  count(s,a);
  int b[4]=a[4];
  sort(b);
for(int i=0;i<4;i++)
{
     if(b[i]==a[0])
     printf("A:%d\n",b[i]);
  else if(b[i]==a[1])
     printf("B:%d\n",b[i]);
  else if(b[i]==a[2])
     printf("C:%d\n",b[i]);
  else if(b[i]==a[3])
     printf("D:%d\n",b[i]);

} // 按要求打印
return 0;
}

void count(char*p,int a[])
{
   whlile((*p)!='\0')
{
   if(s=='A')
     a[0]++;
   else if(s=='B')
    a[1]++;
   else if(s=='C')
    a[2]++;
   else if(s=='D')
    a[3]++;
}
}
void sort(int a[])
{
  int i,j,t;
  for(j=0;j<4;j++)
{
    for(i=0;i<4-1-j;i++)
    if(a[i]>a[i+1])
    {
        t=a[i];
        a[i]=a[i+1];
        a[i+1]=t;
    }
  }
}

点评

都么试过吗? 师姐?? 好像不行耶  发表于 2015-7-30 23:36

30 个回复

正序浏览
对我来说  是大神了
回复 使用道具 举报
用OC字典一一对应的特点做做看 ....
回复 使用道具 举报
郭嘉 中级黑马 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. }
复制代码
回复 使用道具 举报
Hanle 中级黑马 2015-10-24 18:06:48
27#
十楼写的很详细,但是好像犯了个错,c语言不能在程序中间定义变量
回复 使用道具 举报
hero200521296bj 发表于 2015-3-14 01:14
我的代码,绝对测试过,可以按照出现次数从大到小,把ABCD的一次打印出来。想了很久的方法哦,不用结构体, ...

很棒的方法,谢谢!
回复 使用道具 举报
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
回复 使用道具 举报
来学习了。
回复 使用道具 举报
我的,大家可以指导下,

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

        
    }
   
  
      
   
   
}
回复 使用道具 举报
你们有的写得太复杂了,我简单的理解了下,不完美的地方就是当两个字符出现次数相同的时候,打印出来的字符是一样的,,,,
回复 使用道具 举报
#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);
                }
       

        
    }
   
  
      
   
   
}


仔细琢磨了下,模块化比较简单,难点在于理解将次数和字符结合起来,排序完成后继续使用一次循环打印出与之对应的字符即可。
回复 使用道具 举报
10楼的写的不错,好好学习,,看能不能有更简单的方法
回复 使用道具 举报
都值得学习,好的方法交流 ,举一反山挺不错的,顶一个
回复 使用道具 举报
whymerain 发表于 2015-3-13 21:39
我的代码,不论ABCD次数相不相等,都可以打印,倒数第二个for循环if里面条件可以对付ABCD次数相等的情况。
...

领教了,努力学习中
回复 使用道具 举报
我只有个,你们可以看一下,原理很简单
  1. #include<stdio.h>
  2. #define MAXLINE 100
  3. int main(void)
  4. {
  5.        
  6.         int i = 0,j;
  7.         int a=0,b=0,c=0,d=0;
  8.         char s[MAXLINE];
  9.         int x[4];
  10.         int temp1;
  11.         char temp2;
  12.         char ch[4] = {'A','B','C','D'};
  13.         printf("请输入字符串\n");
  14.         gets(s);
  15.         while(s[i]!='\0')
  16.         {
  17.                 if(s[i]=='A')
  18.                 {
  19.                         a++;
  20.                         x[0] = a ;
  21.                 }
  22.                 if(s[i]=='B')
  23.                 {
  24.                         b++;
  25.                         x[1] = b ;
  26.                 }
  27.                 if(s[i]=='C')
  28.                 {
  29.                         c++;
  30.                         x[2] = c ;
  31.                 }
  32.                 if(s[i]=='D')
  33.                 {
  34.                         d++;
  35.                         x[3] = d ;
  36.                 }
  37.                 i++;
  38.         }
  39.        
  40.    
  41.     for (i = 0; i<3; i++)
  42.     {
  43.         for(j = 0;j<3;j++)
  44.         {
  45.             if (x[j] < x[j+1])
  46.             {
  47.                 // 当前一个元素小于后一个元素时,交换它们的位置
  48.                 temp1 = x[j];
  49.                 x[j] = x[j+1];
  50.                 x[j+1] = temp1;
  51.                                 temp2 = ch[j];
  52.                                 ch[j]=ch[j+1];
  53.                                 ch[j+1]=temp2;
  54.             }
  55.             
  56.         }
  57.     }
  58.         printf("打印次数和对应的数字:\n");
  59.         for(i = 0;i<4;i++)
  60.         {
  61.                
  62.                 printf("%d ",x[i]);
  63.                 printf("%c \n",ch[i]);
  64.         }
  65.        

  66.         return 0;
  67. }
复制代码
回复 使用道具 举报
#include <stdio.h>
int main()
{
   
    int alen = 0,blen = 0,clen = 0,i;
    char a[1024],b[1024],c[1024];
    printf("请输入字符串:");
    gets(a);
    for(i=0;i<1024;i++)
    {
        if(a[i]=='a')
        {
            alen++;
        }
        else if(b[i]=='b')
        {
            blen++;
        }
        else if(c[i]=='c')
        {
            clen++;
        }
        

    }
    printf("a的输入次数是%d,b的输入次数是%d,c的输入次数是%d\n",alen,blen,clen);
   
   //
    return 0;
}
回复 使用道具 举报
这道题有这么麻烦么?

回复 使用道具 举报
这个是我的思路
/*
7、 从键盘输入一大堆字符串,统计A、B、C、D的出现次数,最后出现次数由高到低输出字母和出现次数。(C语言)
*/
#include <stdio.h>
#include <string.h>

int main()
{
    char str[100];
    // 定义a,b,c,d 来记录A,B,C,D出现的次数
    int a = 0, b = 0, c = 0, d = 0;
    printf("请输入一个字符串:");
    scanf("%s", str);
    // 遍历数组中的每一个字符串中的元素
    for (int i = 0; i < strlen(str); i++)
    {
        if (str[i] == 'A')
        {
            a++;
        }else if (str[i] == 'B')
        {
            b++;
        }else if (str[i] == 'C')
        {
            c++;
        }else if(str[i] == 'D')
        {
            d++;
        }
    }
    printf("A出现的次数:%d,B出现的次数:%d,C出现的次数:%d,D出现的次数:%d",a, b, c, d);
   
    // 定义两个中间变量来存放数字和字母
    int temp1 = 0, temp2 = 0;
    int array[4][2] = {
        {a,'A'},{b,'B'},{c, 'C'},{d, 'D'}
    };
    for (int i = 0; i < 3 ; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            // 利用冒泡法,当两两比较的时候,如果要交换,那么同时交换字母数字(为了保证字母跟次数的对应关系)
            if (array[j][0] <= array[j+1][0])
            {
                temp1 = array[j][0];
                temp2 = array[j][1];
                array[j][0] = array[j+1][0];
                array[j][1] = array[j+1][1];
                array[j+1][0] = temp1;
                array[j+1][1] = temp2;
            }
        }
        
    }
    printf("出现次数由高到低输出字母和出现次数:\n");
    // 利用for循环来,输出二维数组的字母和次数
    for (int i =0;i < 4; i++)
    {
        printf("%c,%d次\n",array[i][1],array[i][0]);
    }
    return 0;
}
回复 使用道具 举报
10楼的解答很详细
回复 使用道具 举报
hero200521296bj 发表于 2015-3-14 01:14
我的代码,绝对测试过,可以按照出现次数从大到小,把ABCD的一次打印出来。想了很久的方法哦,不用结构体, ...

我也看到了这个冒泡方法论 ,就是没弄懂这个-1起到啥作用,不会是起作到排除作用把?
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马