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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© caopengxu 中级黑马   /  2014-7-16 22:29  /  5494 人查看  /  27 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

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

解题思路:
*/
#include<stdio.h>

void PaiXu(int,int,int,int);

int main()
{
    int i,a = 0,b = 0,c = 0,d = 0;
    char f[100];
    printf("请输入字符串(以空格隔开):\n");
    scanf("%s",f);
   
    for(i = 0;f[i] != '\0';i++)
    {
        if(f[i] == 'A')
            a++;
        else if(f[i] == 'B')
            b++;
        else if(f[i] == 'C')
            c++;
        else if(f[i] == 'D')
            d++;
    }
   
    printf("%d%d%d%d\n",a,b,c,d);
    PaiXu(a,b,c,d);
    return 0;
}

void PaiXu(int a,int b,int c,int d)
{
    int i,j,max,x[4] = {a,b,c,d};
   
    for(i = 0;i < 3;i++)
    {
        for(j = i + 1;j < 4;j++)
        {
            if(x[i] < x[j])
            {
                max = x[i];
                x[i] = x[j];
                x[j] = max;
            }
        }
    }
   
    for(i = 0;i < 4;i++)
    {
        if(x[i] == a)
            printf("%c",'A');
        else if(x[i] == b)
            printf("%c",'B');
        else if(x[i] == c)
            printf("%c",'C');
        else
            printf("%c",'D');
        
        printf(":%d次\n",x[i]);
    }
}
问题:如果输入的ABCD的个数有相同的,会出现打印错误。

27 个回复

正序浏览
443201683@qq.co 发表于 2014-7-17 00:49
按照楼主的思路修改,修改处已经注释了。用二维数组代替原来的一维数组就好了。

...

给力,按照你的思路想通了。
回复 使用道具 举报
感觉关键点就是对应字母的次数排序后,原来字母的关系没办法对应!好苦恼
回复 使用道具 举报
这个题困扰了我一天,来看看思路,我写的代码运行后出问题:Q
回复 使用道具 举报
我们可以标记三个变量用来标记打印或者未打印。
// 从键盘输入一大堆字符串,统计A、B、C、D的出现次数,最后出现次数由高到低输出字母和出现次数。
#include <stdio.h>
#include <string.h>
int main()
{   
//定义一个字符串
    char array[100];
//提示输入字符串
    printf("请输入一串字符串:\n");
    scanf("%s",array);
//printf("刚刚输入的字符串是:%s\n",array);
    //申明要调用的函数
void count(char [100]);
//将输入的字符串作为形参,调用count函数进行运算。
    count(array);
return 0;
}
void count(char array[100])  
{
    int a = 0;//用a来记录A出现的次数
    int b = 0;//用b来记录B出现的次数
    int c = 0;//用c来记录C出现的次数
    int d = 0;//用d来记录D出现的次数
    unsigned long length = strlen(array);
int i,j,temp;
for (i = 0; i<length; i++)
{
        if (array[i] == 'A') {//统计A出现的次数
            a++;
        }
        else if (array[i] == 'B'){//统计B出现的次数
            b++;
        }
        else if (array[i] == 'C'){//统计C出现的次数
            c++;
        }
        else if (array[i] == 'D'){//统计D出现的次数
            d++;
        }
    }
    //printf("A出现了%d次\tB出现了%d次\tC出现了%d次\tD出现了%d次\n",a,b,c,d);
int x[4] = {a,b,c,d};//定义一个数组存放次数
//用冒泡法给这个数组里面的次数按照从大到小的顺序排序
    for (i = 0; i<3; i++)//排序的趟数
    {
        for(j = 0;j<3-i;j++)//每趟比较次数
        {
            if (x[j] < x[j+1])//如果前一个数比后一个数要小,则借助第三方变量temp交换位置
            {
                temp = x[j];
                x[j] = x[j+1];
                x[j+1] = temp;
            }
        }
}


//为了防止出现次数相同重复打印的情况给打印的语句做一个标记0代表未打印,1代表已打印
int a1=0;
int b1=0;
int c1=0;
for(i=0;i<4;i++){
  if(x[i]==a && a1==0){//当a=b=c=d,如果没有打印标记,那么将重复打印第一条语句
      a1++;//打印标记
   printf("A出现了%d次\n",x[i]);
  }
  else if(x[i]==b && b1==0){
   b1++;//打印标记
   printf("B出现了%d次\n",x[i]);
  }
  else if(x[i]==c && c1==0){
   c1++;//打印标记
   printf("C出现了%d次\n",x[i]);
  }else printf("D出现了%d次\n",x[i]);//在if最后一个判断条件,所以不需标记。
}
}

回复 使用道具 举报

for(i=0;i<n;i++)   //使用for循环遍历字符串
        {
              //  k=i;  //将i赋值给变量k
                for(j=i+1;j<n;j++)  //使用for循环遍历i之后的字符串
                        if(b.b<b[j].b) {  //判断第j个字符出现的次数和第i个字符出现的次数的大小
                            //    k=j;  //将j赋值给变量k
                        //以下数据交换变量i和变量k中的数据
                        temp=b.b;     
                        b.b=b[j].b;
                        b[j].b=temp;
                        tem=b.c;
                        b.c=b[j].c;
}//这样也行。你为什么把//将i赋值给变量k //将j赋值给变量k
回复 使用道具 举报
温天恩 发表于 2014-7-16 23:51
楼主可以试试看!我的代码是没问题的,你可以优化一下。

看到57行之后脑子就转不动打结了,
回复 使用道具 举报
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<time.h>
#pragma warning(disable:4996)

void swap(int *a, int *b)//交换位置
{
        int tmp = *b;
        *b = *a;
        *a = tmp;
}
void getsort(int *a, int *b, int *c, int *d)//冒泡排序
{
        int data[4] = { a, b, c, d };
        for (int i = 0; i < 3; i++)
        {
                for (int j = 1; j < 3 - i; j++)
                {
                        if (data[j - 1] < data[j])
                                swap(&data[j - 1], &data[j]);
                }
        }
        int add[4];
        for (int i = 0; i < 4; i++)
        {
                if (data[i] == a)
                        add[i] = 'A';
                else if (data[i] == b)
                        add[i] = 'B';
                else if (data[i] == c)
                        add[i] = 'C';
                else
                        add[i] = 'D';
        }
        for (int i = 0; i < 4; i++)
        {
                printf("%c %d\n", add[i], data[i]);
        }
}
int main()
{
        int a = 0;
        int b = 0;
        int c = 0;
        int d = 0;
        char buf[100];
        scanf_s("%s\n", buf);
        int len = strlen(buf);
        for (int i = 0; i<len; i++)
        {
                if (buf[i] == 'A')
                a++;
                else if (buf[i] == 'B')
                b++;
                else if (buf[i] == 'C')
                c++;
                else if(buf[i] == 'D')
                d++;
        }
        //printf("%d%d%d%d\n", a, b, c, d);//输出ABCD出现的次数
        getsort(&a,&b,&c,&d);//排序打印
        return 0;
}
回复 使用道具 举报
之前基础测试的时候也有这道题,纠结了好几天。。
回复 使用道具 举报
温天恩 发表于 2014-7-16 23:51
楼主可以试试看!我的代码是没问题的,你可以优化一下。

没能理解到如何将排序和字母对应起来,能简单描述一下思路吗?
回复 使用道具 举报
rocki 中级黑马 2014-7-18 08:25:51
17#
yingzhuo1314 发表于 2014-7-17 17:10
已经编译过,木有警告~~

不是X-code编译的把。。X-code用gets函数给警告的。
回复 使用道具 举报
{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}
回复 使用道具 举报
我有一点修改在for循环里打印语名后加上x[i] -= 1000;这样再怎么循环也不会重复了,自加还是有可能重复的
回复 使用道具 举报
yingzhuo1314 发表于 2014-7-17 17:10
已经编译过,木有警告~~

啊,我回头再研究研究。
回复 使用道具 举报
caopengxu 发表于 2014-7-17 09:53
你这应该会有警告吧,提示gets( )不安全。

已经编译过,木有警告~~
回复 使用道具 举报

你这应该会有警告吧,提示gets( )不安全。
回复 使用道具 举报
443201683@qq.co 发表于 2014-7-17 00:49
按照楼主的思路修改,修改处已经注释了。用二维数组代替原来的一维数组就好了。

...

是诶,又一种思路,感谢。
回复 使用道具 举报
按照楼主的思路修改,修改处已经注释了。用二维数组代替原来的一维数组就好了。

  1. #include"stdlib.h"
  2. #include<stdio.h>
  3. #include <ctype.h>
  4. void PaiXu(int,int,int,int);

  5. int main()
  6. {
  7.      int i,a = 0,b = 0,c = 0,d = 0;
  8.      char f[100];
  9.      printf("请输入字符串(以空格隔开):\n");
  10.      gets_s(f);
  11.          printf("%s",f);
  12.      for(i = 0;f[i] != '\0';i++)
  13.      {
  14.          if(f[i] == 'A')
  15.              a++;
  16.          else if(f[i] == 'B')
  17.              b++;
  18.          else if(f[i] == 'C')
  19.              c++;
  20.          else if(f[i] == 'D')
  21.              d++;
  22.      }
  23.      
  24.      printf("%d%d%d%d\n",a,b,c,d);
  25.      PaiXu(a,b,c,d);
  26.      return 0;
  27. }

  28. void PaiXu(int a,int b,int c,int d)
  29. {
  30.          int i,j,max,x[4][4] = {{a,1},{b,2},{c,3},{d,4}}; //此处用二维数组代替,第二列用来表示ABCD字符。
  31.      
  32.      for(i = 0;i < 3;i++)
  33.      {
  34.          for(j = i + 1;j < 4;j++)
  35.          {
  36.              if(x[i][0] < x[j][0])
  37.              {
  38.                  max = x[i][0];
  39.                  x[i][0] = x[j][0];
  40.                  x[j][0] = max;
  41.                                  max = x[i][1];
  42.                  x[i][1] = x[j][1];
  43.                  x[j][1] = max;
  44.              }
  45.          }
  46.      }
  47.      
  48.      for(i = 0;i < 4;i++)
  49.      {
  50.         if(x[i][1] == 1)
  51.              printf("A");
  52.          else if(x[i][1] == 2)
  53.              printf("B");
  54.          else if(x[i][1] == 3)
  55.              printf("C");
  56.          else
  57.              printf("D");
  58.          
  59.          printf(":%d次\n",x[i][0]);
  60.      }
  61.          system("pause");
  62. }
复制代码

点评

二维数组的定义可以优化一下,第2维只用到2个数,声明为x[4][2]就可以了  发表于 2014-7-17 10:06
回复 使用道具 举报
大家都这么给力的啊
回复 使用道具 举报
温天恩 发表于 2014-7-16 23:51
楼主可以试试看!我的代码是没问题的,你可以优化一下。

给力,有过这个思路,但没想到具体的方法,感谢。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马