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 个回复

倒序浏览
错了。,,,,没检查?????
回复 使用道具 举报
如果ABCD出现的次数是一样呢?
回复 使用道具 举报
没做标记,如果ABCD都相等会出问题
回复 使用道具 举报
我就是简单写了一款 仅供参考!!!

#include <stdio.h>
#include <string.h>


int main()
{
    //定义字符串
    char str[100];
    printf("请输入一串字符串:\n");
    scanf("%s",str);
    // 定义四个变量用来存放ABCD出现的次数
    int a = 0;
    int b = 0;
    int c = 0;
    int d = 0;
    // 定义变量length用来存放输入字符串的长度
    unsigned long length = strlen(str);
    //for循环判断ABCD出现的次数
    for (int i = 0; i<length; i++) {
        
        // 统计A和a出现的次数
        if (str[i] == 'A' || str[i] == 'a') {
            a++;
        }
        
        // 统计B和b出现的次数
        else if (str[i] == 'B' || str[i] == 'b'){
            b++;
        }
        
        // 统计C和c出现的次数
        else if (str[i] == 'C' || str[i] == 'c'){
            c++;
        }
        
        // 统计D和d出现的次数
        else if (str[i] == 'D' || str[i] == 'd'){
            d++;
        }
    }
    //输出次数
    printf("A出现了%d次\n",a);
    printf("B出现了%d次\n",b);
    printf("C出现了%d次\n",c);
    printf("D出现了%d次\n",d);
    return 0;
}
回复 使用道具 举报
你们的ABCD都不排序的???  要让ABCD与出现的次次一一对应才行!!!
回复 使用道具 举报
sun397721060 发表于 2015-2-7 10:13
我就是简单写了一款 仅供参考!!!

#include

我的算法和你的一样,不过你忘记最后的排序了
回复 使用道具 举报
MacxChina 来自手机 中级黑马 2015-2-9 02:57:13
8#
检查先!来自: iPhone客户端
回复 使用道具 举报
这道题必须要排序,用c语言泡冒法排序就行,两两比较交换
回复 使用道具 举报
我的代码,不论ABCD次数相不相等,都可以打印,倒数第二个for循环if里面条件可以对付ABCD次数相等的情况。
  1. #include <stdio.h>
  2. #include <string.h>
  3. // 定义一个主函数,作为程序的入口
  4. int main()
  5. {
  6.     // 定义一个数组array用来存放输入的字符串
  7.     char array[100];
  8.    
  9.     // 提示输入一个字符串
  10.     printf("请输入一串字符串:\n");
  11.    
  12.     // 接收输入的字符串,并赋值给数组array
  13.     scanf("%s",array);
  14.    
  15.     // 定义两个变量用于for循环条件变量
  16.     int i,j;
  17.    
  18.     // 定义四个变量用来存放ABCD出现的次数
  19.     int a = 0;
  20.     int b = 0;
  21.     int c = 0;
  22.     int d = 0;
  23.    
  24.     // 定义变量length用来存放输入字符串的长度
  25.     unsigned long length = strlen(array);
  26.    
  27.     // 定义for循环,当i小于字符串长度时,执行循环体,i加1
  28.     for (i = 0; i<length; i++) {
  29.         
  30.         // 统计A出现的次数
  31.         if (array[i] == 'A') {
  32.             a++;
  33.         }
  34.         
  35.         // 统计B出现的次数
  36.         else if (array[i] == 'B'){
  37.             b++;
  38.         }
  39.         
  40.         // 统计C出现的次数
  41.         else if (array[i] == 'C'){
  42.             c++;
  43.         }
  44.         
  45.         // 统计D出现的次数
  46.         else if (array[i] == 'D'){
  47.             d++;
  48.         }
  49.     }
  50.    
  51.     // 定义一个数组x用来存放ABCD出现的次数
  52.     int x[4] = {a,b,c,d};
  53.    
  54.     // 定义temp用于冒泡排序标记排序趟数
  55.     int temp;
  56.    
  57.     // 冒泡排序  将a,b,c,d降序排序,i表示排序的趟数,j表示每趟排序的比较次数
  58.     for (i = 0; i<3; i++)
  59.     {
  60.         for(j = 0;j<3;j++)
  61.         {
  62.             if (x[j] < x[j+1])
  63.             {
  64.                 // 当前一个元素小于后一个元素时,交换它们的位置
  65.                 temp = x[j];
  66.                 x[j] = x[j+1];
  67.                 x[j+1] = temp;
  68.             }
  69.             
  70.         }
  71.     }
  72.    
  73.     // 定义一个数组y用来存放ABCD标志
  74.     char y[4];
  75.    
  76.     // 将数组x与数组y的出现次数和标志一一对应
  77.     for (i = 0; i<4; i++)
  78.     {
  79.         // 如果出现a次,则y[i]='A'
  80.         if(x[i] == a && y[0] != 'A' && y[1] != 'A' && y[2] != 'A' && y[3] != 'A')
  81.         {
  82.             y[i] = 'A';
  83.         }
  84.         // 如果出现b次,则y[i]='B'
  85.         else if(x[i] == b && y[0] != 'B' && y[1] != 'B' && y[2] != 'B' && y[3] != 'B')
  86.         {
  87.             y[i] = 'B';
  88.         }
  89.         // 如果出现c次,则y[i]='C'
  90.         else if(x[i] == c && y[0] != 'C' && y[1] != 'C' && y[2] != 'C' && y[3] != 'C')
  91.         {
  92.             y[i] = 'C';
  93.         }
  94.         // 如果出现d次,则y[i]='D'
  95.         else
  96.         {
  97.             y[i] = 'D';
  98.         }
  99.     }
  100.    
  101.     // 降序打印输出每个字母出现的次数
  102.     for (i = 0; i<4; i++)
  103.         printf("%c出现%d次\n",y[i],x[i]);
  104.    
  105.     return 0;
  106. }

复制代码

回复 使用道具 举报
我的代码,绝对测试过,可以按照出现次数从大到小,把ABCD的一次打印出来。想了很久的方法哦,不用结构体,不用二维数组。仅仅是简单的讲abcd打印后赋值-1。

#define N 100
    char s[N];//定义一个字符数组用来存放用户输入的字符串
    printf("请输入一组字符");
    gets(s);//从电脑接收用户输入的字符串
    int a = 0,b = 0,c = 0,d = 0;
    for (int i = 0; i < N; i++) {//循环N次,遇到字符ABCD,分别让变量abcd自加1,最终abcd就是字符ABCD出现的次数
        switch (s[i]) {
            case 65:
                a++;
                break;
            case 66:
                b++;
                break;
            case 67:
                c++;
                break;
            case 68:
                d++;
                break;
            default:
                break;
        }
    }
   
    int num[4] = {a,b,c,d};//讲ABCD的次数赋值到一个整形数组中
    for (int m = 0 ; m < 3; m++) {//用冒泡排序使整形数组得数字从高到低排序
        for (int n = 0; n < 3-m; n++) {
            int temp = 0;
            if (num[n] < num[n+1]) {
                temp = num[n+1];
                num[n+1] = num[n];
                num[n] = temp;
            }
        }
    }
   
    for (int t = 0; t < 4; t++) {//循环4次,看每个数组的值哪个和初始值abcd相同,并把对应的字母和次数打印出来,同时把次数赋值为一个不可能出现的数字负数,避免下次循环再次打印。
        if (num[t] == a){
                printf("A的个数是%d\n",a);
            a = -1;
        }if(num[t] == b){
                printf("B的个数是%d\n",b);
            b = -1;
        }if (num[t] == c){
                printf("C的个数是%d\n",c);
            c = -1;
        }if (num[t] == d){
                printf("D的个数是%d\n",d);
            d = -1;
        }
    }
回复 使用道具 举报
hero200521296bj 发表于 2015-3-14 01:14
我的代码,绝对测试过,可以按照出现次数从大到小,把ABCD的一次打印出来。想了很久的方法哦,不用结构体, ...

我也看到了这个冒泡方法论 ,就是没弄懂这个-1起到啥作用,不会是起作到排除作用把?
回复 使用道具 举报
10楼的解答很详细
回复 使用道具 举报
这个是我的思路
/*
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;
}
回复 使用道具 举报
这道题有这么麻烦么?

回复 使用道具 举报
#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;
}
回复 使用道具 举报
我只有个,你们可以看一下,原理很简单
  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. }
复制代码
回复 使用道具 举报
whymerain 发表于 2015-3-13 21:39
我的代码,不论ABCD次数相不相等,都可以打印,倒数第二个for循环if里面条件可以对付ABCD次数相等的情况。
...

领教了,努力学习中
回复 使用道具 举报
都值得学习,好的方法交流 ,举一反山挺不错的,顶一个
回复 使用道具 举报
10楼的写的不错,好好学习,,看能不能有更简单的方法
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马