请解释这个功能

时间:2015-04-04 01:39:32

标签: c++ c++11 visual-c++

下面的代码用于按升序或降序对int数组进行排序

//codes borrowed from learncpp.com
#include<iostream>
#include<algorithm>
using namespace std;
void SelectionSort(int *anArray, int nSize, bool(*pComparison)(int, int)) {
    for(int iii=0; iii<nSize; iii++) {
        int nCurrent = iii;
        for(int jjj=iii+1; jjj<nSize; jjj++) {
            if(pComparison(anArray[nCurrent], anArray[jjj]))
                nCurrent = jjj;
            }
        swap(anArray[nCurrent], anArray[iii]);
    }
}
bool Ascending(int nX, int nY) {
    return nY>nX;
}
bool Descending(int nX, int nY) {
    return nY<nX;
}
bool EvensFirst(int nX, int nY) {
    if((nX%2)&&!(nY%2))
        return false;
    if(!(nX%2)&&(nY%2))
        return true;
    return Ascending(nX, nY);
}
void PrintArray(int *pArray, int nSize) {
    for(int kkk=0; kkk<nSize; kkk++)
        cout << pArray[kkk] << " ";
    cout << endl;
}
int main() {
    int anArray[9] = {3, 5, 1, 8, 9, 4, 6, 2, 7};
    SelectionSort(anArray, 9, EvensFirst);
    PrintArray(anArray, 9);
    return 0;
}

打印结果为9 7 5 3 1 8 6 4 2而不是2 4 6 8 1 3 5 7 9

请有人在这里解释一下bool如何运作EvensFirst?

3 个答案:

答案 0 :(得分:3)

这个程序的主要内容是使用函数指针。 bool(*pComparison)(int, int)是指向函数的指针,该函数返回bool类型值并将其作为参数2 int值。您可以检查不同的输出SelectionSort(anArray, 9, Ascending);SelectionSort(anArray, 9, Descending);(如果您已正确编码选择排序功能)。

注意:基于不同的函数指针,这个常规排序例程将给出不同的输出。其余的例程是基本的排序例程,将minmax的值交换到当前元素。

bool EvensFirst(int nX, int nY) {
    if((nX%2)&&!(nY%2)) //if nX is odd and nY is even the 
//nY should be in first position. So to change the order return false
        return false;
    if(!(nX%2)&&(nY%2))//if nX is even and nY is odd the 
//nX should be in first position. So to retain the order return true
        return true;
    return Ascending(nX, nY);// both even or both odd return the ascending function's output.
}
  

如果nx是偶数,如果我们除以2,它将得到0的余数。   例如,12   12%2 = 0

     

34%2 = 0

     

9%2 = 1 ----&gt;这就是为什么这很奇怪。

     

每个奇数都可以用2m+1形式写出现在如果我们将这个数除以2,我们将得到1的余数,因为第一部分给出余数为0。

     

偶数,解释是相同的偶数由2m表示。所以当除以2时,它将得到余数为0.

if((nX%2)&&!(nY%2))  
       return false;
if nX is even it nX%2=0 and if nY is odd then ny%2=1
So expressin becomes
if(0 && 1)-->which evaluates to false and go to next condition. 

很少有例子可以澄清你的想法 -

检查x是否为偶数

if(x%2==0) 
  //x is even.

Also can be written as
if(!x%2)
  //x is even.

检查x是否为奇数

 if(x%2==1)
      // x is odd
    Also can be written as

    if(x%2)
      // x is odd.

检查x和y是否均为

   if(!x%2 && !y%2)
    //both even

检查其中一个是否为

 if(!x%2 || !y%2)
    //either of them is even

答案 1 :(得分:1)

运算符modulo % 返回其操作数的剩余部分。它可以用来检查数字是偶数还是奇数,因为如果x/2的余数是0,则意味着x是偶数。 这意味着,如果x%2=0比x是偶数,则为奇数。


这是 EvensFirst如何运作

bool EvensFirst(int nX, int nY) {
    if((nX%2)&&!(nY%2)) //if nX is even and nY is odd
        return false;   //returns false
    if(!(nX%2)&&(nY%2)) //if nX is odd and nY is even
        return true;    //returns true
    //if they are both odd or even returns the result of ascending
    return Ascending(nX, nY); //true if nY > nX 
}

这是你如何使用EvensFirst

void SelectionSort(int *anArray, int nSize, bool(*pComparison)(int, int) {
    for(int iii=0; iii<nSize; iii++) {   //for each number in the array
        int nCurrent = iii;
        for(int jjj=iii+1; jjj<nSize; jjj++) {  //for each following elemnt
            if(pComparison(anArray[nCurrent], anArray[jjj])) //compare the two elements
                nCurrent = jjj; 
            }
        swap(anArray[nCurrent], anArray[jjj]); //and switch their positions if they are in the wrong order
    }
}

答案 2 :(得分:1)

标准引用:

  

二进制%运算符从第一个表达式除以第二个表达式得到余数。如果/或%的第二个操作数为零,则行为未定义;否则(a / b)* b + a%b等于a。   如果两个操作数都是非负的,那么余数是非负的;如果没有,余数的符号是​​实现定义的(74)

     

(74)根据正在进行的ISO C修订工作,整数除法的首选算法遵循ISO Fortran标准ISO / IEC 1539:1991中定义的规则,其中商始终向零舍入。

示例:

11 % 3 = 2,因为11 = 3*3 + 2

现在,操作modulo-2只能给我们两个可能的结果:0或1.另外:

1)对于任何给定的偶数NN % 2将始终给出0.这是因为偶数是定义的乘法2。

2)对于任何给定的奇数MM % 2将始终给出1.因为任何偶数都可以定义为{{1} },其中2K + 1K(自然数或零)。

由于上述原因,我们可以使用N0表达式作为逻辑条件,因为在C / C ++&#34; 0为假,其他一切都是真的&#34;。

所以:

x % 2

现在,让我们回到您的if(x%2) { //x%2 != 0, which means x%2 = 1, which means x is an odd number } else { //x%2 == 0, which means x is an even number } 功能:

EvensFirst

此函数接受两个参数:bool EvensFirst(int nX, int nY) { if((nX%2)&&!(nY%2)) return false; if(!(nX%2)&&(nY%2)) return true; return Ascending(nX, nY); } nX如果nY应放在nX之前,则返回true(否则为false)。首先,它检查条件nY。这种情况基本上意味着:

&#34;检查,如果(nX%2)&&!(nY%2)是奇数且nX是偶数。&#34;

如果它的计算结果为true,则函数返回false - 首先取消evens,因此nY应放在nY之前。

然后,它检查第二个条件:nX,这意味着:

&#34;检查,如果!(nX%2)&&(nY%2)是偶数且nX是奇数。&#34;

如果计算结果为true,则函数返回true - 首先采用evens,因此nY应放在nX之前。

如果这两个条件都被评估为假,则意味着它们两者都是奇数或两者都是平均值。在这种情况下,函数使用&#34; Ascending&#34;来比较它们。比较 - 将首先采用较低的数字。