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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 铅笔头 中级黑马   /  2015-3-30 17:41  /  3169 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

15黑马币
  1. <p style="font-size: 18px; line-height: normal; font-family: 'Heiti SC Light'; color: rgb(29, 148, 33);"><div class="blockcode"><blockquote> 5、 从键盘输入一大堆字符串,统计A、B、C、D的出现次数,最后出现次数由高到低输出字母和出现次数。(C语言)

  2. #import <Foundation/Foundation.h>

  3. int main()
  4. {
  5.    
  6.     char array[100]; // 设置一个存放字符串的数组
  7.    
  8.     printf("请输入一串字符串:\n");
  9.    
  10.     scanf("%s",array);  // 输入字符串
  11.     int a,b,c,d;
  12.     a=0;
  13.     b=0;
  14.     c=0;
  15.     d=0;
  16.    
  17.     unsigned long length = strlen(array); // 存储字符串长度
  18.    
  19.     for (int i = 0; i<length; i++) // 遍历字符串
  20.     {
  21.         
  22.         if (array[i] == 'A') // 判断A的次数累加
  23.         {
  24.             a++;
  25.         }
  26.         
  27.         else if (array[i] == 'B'){  // 判断B的次数累加
  28.             b++;
  29.         }

  30.         else if (array[i] == 'C'){ // 判断C的次数累加
  31.             c++;
  32.         }
  33.    
  34.         else if (array[i] == 'D'){ // 判断D的次数累加
  35.             d++;
  36.         }
  37.         
  38.     }
  39.    
  40.     int x[4] = {a,b,c,d}; //创建数组,存放累加数
  41.      // 冒泡排序,排列ABCD的个数
  42.     int temp;
  43.    
  44.     for (int j = 0; j<3; j++)
  45.     {
  46.         for(int k = 0;k<3-j;k++)
  47.         {
  48.             if (x[k] < x[k+1])
  49.             {
  50.                 temp = x[j];
  51.                 x[k] = x[k+1];
  52.                 x[k+1] = temp;
  53.             }
  54.             
  55.         }
  56.     }
  57.    
  58.     char y[4]; // 创建数组存放字符标志
  59.    
  60.     for (int i = 0; i<4; i++) // 遍历变量名,并与字符标志相对应。
  61.     {
  62.       
  63.         if(x[i] == a && y[0] != 'A' && y[1] != 'A' && y[2] != 'A' && y[3] != 'A')
  64.         {
  65.             y[i] = 'A';
  66.         }
  67.       
  68.         else if(x[i] == b && y[0] != 'B' && y[1] != 'B' && y[2] != 'B' && y[3] != 'B')
  69.         {
  70.             y[i] = 'B';
  71.         }
  72.       
  73.         else if(x[i] == c && y[0] != 'C' && y[1] != 'C' && y[2] != 'C' && y[3] != 'C')
  74.         {
  75.             y[i] = 'C';
  76.         }
  77.       
  78.         else
  79.         {
  80.             y[i] = 'D';
  81.         }
  82.     }
  83.     for (int i = 0; i<4; i++)  // 循环输出ABCD的的标志既次数。
  84.         printf("%c出现%d次\n",y[i],x[i]);
  85.    
  86.     return 0;
  87. }
复制代码
  我自己写了这个 程序,但在网上有如上排序写法 我不明白这if(x == a && y[0] != 'A' && y[1] != 'A' && y[2] != 'A' && y[3] != 'A')
为什么要y[0]不等于这些呢?求解惑?

最佳答案

查看完整内容

1、先说第一个问题,为什么if((x == a && y[0] != 'A' && y[1] != 'A' && y[2] != 'A' && y[3] != 'A') 这样写的原因是为了防止出现相同次数的情况。 举个例子: a b c d 4 3 3 2 如果没有后面的判断:那么就会导致(x = b会成功两次, 第一次将y[1] =b 第二次y[2] = b,其实应该是y[2] = c; 通过后面的判断,y[0] != 'B' && y[1] != 'B' && y[2] != 'B' && y[3] != 'B',如果y[1] = ...

7 个回复

倒序浏览
1、先说第一个问题,为什么if((x == a && y[0] != 'A' && y[1] != 'A' && y[2] != 'A' && y[3] != 'A')
这样写的原因是为了防止出现相同次数的情况。
举个例子:
a       b         c         d
4       3         3          2
如果没有后面的判断:那么就会导致(x = b会成功两次,
第一次将y[1] =b
第二次y[2] = b,其实应该是y[2] = c;
通过后面的判断,y[0] != 'B' && y[1] != 'B' && y[2] != 'B' && y[3] != 'B',如果y[1] = 'B',说明已经存在了B,
然后程序会继续向下if判断,就会y[2] = c;
这样就得出正确的结果了。不知道你懂了没有?
第二个问题:
C语言中,字符与数字相加减,是取对应的ASSIC码值进行加减。
  • printf("%d",'a' + 1); 输出98
  • printf("%d",'a' - 1); 输出96


回复 使用道具 举报
还有一个问题,字符串练习中有  两个字母的差          字符差%26  + 'A'; 求分析
回复 使用道具 举报
我的理解是这样的:我们已经对得到的A,B,C,D所对应的个数a,b,c,d进行了排序,他为了对应输出A--a,B--b,C--c,D--d,但我们一开始并不知道他们的个数是多少 ,排完序后也不知道a,b,c,d在哪个位置,因此要测试,当想x[i]==a时,我们用y[i]记录这是A字符,前题是所有y[ ]是不能为A,因为这样说明可能已经出现了一个与a相同个数的字符。
回复 使用道具 举报
你这个程序你运行了没,一大堆错误啊
回复 使用道具 举报
y[0] != 'A' && y[1] != 'A' && y[2] != 'A' && y[3] != 'A'后面这句完全就是多余的吧,不用这么判断,因为Y初始化为空,x中第几个是a,那么y中第几个就是A,x和y下标一一对应就行了,没有必要判断这面这些。即便是用了,也没太大意义,因为如果第二个是A那到后面判断B、C、D的时候确定的那一个肯定不等于B、C或D。
回复 使用道具 举报
Himoriarty 发表于 2015-3-30 22:13
你这个程序你运行了没,一大堆错误啊

完全没有错的亲!后面的对应判断必须那样写!但是这种写法的内在原理,我不清楚!我用的xcode编的用得是foundation框架
回复 使用道具 举报
邓士林 发表于 2015-3-30 22:21
1、先说第一个问题,为什么if((x == a && y[0] != 'A' && y[1] != 'A' && y[2] != 'A' && y[3] != 'A')
这 ...

谢谢邓先生!第一个明白了,第二个我 知道是您说的那样,但是,我不知道这种数学的写法X%26是怎么想出来的?还有C语言中还有类似的写法吗,求教育
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马