下面的代码用于按升序或降序对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?
答案 0 :(得分:3)
这个程序的主要内容是使用函数指针。 bool(*pComparison)(int, int)
是指向函数的指针,该函数返回bool
类型值并将其作为参数2 int
值。您可以检查不同的输出SelectionSort(anArray, 9, Ascending);
或SelectionSort(anArray, 9, Descending);
(如果您已正确编码选择排序功能)。
注意:基于不同的函数指针,这个常规排序例程将给出不同的输出。其余的例程是基本的排序例程,将min
或max
的值交换到当前元素。
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)对于任何给定的偶数N
,N % 2
将始终给出0.这是因为偶数是定义的乘法2。
2)对于任何给定的奇数M
,M % 2
将始终给出1.因为任何偶数都可以定义为{{1} },其中2K + 1
是K
(自然数或零)。
由于上述原因,我们可以使用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;来比较它们。比较 - 将首先采用较低的数字。