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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

温天恩 发表于 2014-7-16 23:51
楼主可以试试看!我的代码是没问题的,你可以优化一下。

看到57行之后脑子就转不动打结了,
回复 使用道具 举报

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
回复 使用道具 举报
我们可以标记三个变量用来标记打印或者未打印。
// 从键盘输入一大堆字符串,统计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最后一个判断条件,所以不需标记。
}
}

回复 使用道具 举报
这个题困扰了我一天,来看看思路,我写的代码运行后出问题:Q
回复 使用道具 举报
感觉关键点就是对应字母的次数排序后,原来字母的关系没办法对应!好苦恼
回复 使用道具 举报
443201683@qq.co 发表于 2014-7-17 00:49
按照楼主的思路修改,修改处已经注释了。用二维数组代替原来的一维数组就好了。

...

给力,按照你的思路想通了。
回复 使用道具 举报
12
您需要登录后才可以回帖 登录 | 加入黑马