黑马程序员技术交流社区

标题: C语言,请帮忙解读 [打印本页]

作者: 铅笔头    时间: 2015-3-30 17:41
标题: C语言,请帮忙解读
  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]不等于这些呢?求解惑?


作者: 邓士林    时间: 2015-3-30 17:41
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



作者: 铅笔头    时间: 2015-3-30 17:50
还有一个问题,字符串练习中有  两个字母的差          字符差%26  + 'A'; 求分析
作者: 刘大志    时间: 2015-3-30 21:56
我的理解是这样的:我们已经对得到的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相同个数的字符。
作者: Himoriarty    时间: 2015-3-30 22:13
你这个程序你运行了没,一大堆错误啊
作者: Himoriarty    时间: 2015-3-30 22:27
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。
作者: 铅笔头    时间: 2015-3-31 07:45
Himoriarty 发表于 2015-3-30 22:13
你这个程序你运行了没,一大堆错误啊

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

谢谢邓先生!第一个明白了,第二个我 知道是您说的那样,但是,我不知道这种数学的写法X%26是怎么想出来的?还有C语言中还有类似的写法吗,求教育




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2