我正在尝试编写一个C程序,它将3个值作为函数参数并返回中位数。该程序运行良好 - 直到我意识到它不能使用相同的值两次或更多。 例如,如果输入是1,2,3 - 我得到2,正确的中位数,但如果输入是1,2,1或1,1,1 ..循环从头开始重复。我想我的逻辑正确但是我必须犯一些微小的错误。
我的尝试:
int median(int firstInt,int secondInt, int thirdInt) {
if (secondInt>firstInt && secondInt>thirdInt ||
thirdInt>firstInt && firstInt>secondInt) {
printf("The median value is %d\n", firstInt);
}
if (firstInt>secondInt && secondInt>thirdInt ||
thirdInt>secondInt && secondInt>firstInt) {
printf("The median value is %d\n", secondInt);
}
if (firstInt>thirdInt && thirdInt>secondInt ||
secondInt>thirdInt && thirdInt>firstInt) {
printf("The median value is %d\n", thirdInt);
}
}
void main() {
int count = 100;
int firstInt,secondInt,thirdInt;
while(count--)
{
printf("Enter first Integer : ");
scanf("%d", &firstInt);
printf("Enter second Integer : ");
scanf("%d", &secondInt);
printf("Enter third Integer : ");
scanf("%d", &thirdInt);
median(firstInt, secondInt, thirdInt); //calling
}
}
Input : 1,2,1
Output :Enter first integer : // WHY is this happening?
答案 0 :(得分:7)
你应该做的第一个事情是决定你的功能是做什么的。
它的签名和名称表明它应该返回中位数,但代码实际上打印它(如果它只打印它,它应该有一个{{ 1}}返回类型)。
打印最好留给调用者,让函数只计算并返回中位数。这使它成为一个更通用的功能。
在任何情况下,使用void
而不是>
会导致您的问题,因为两个或更多数字相同的数据集往往不会导致{{1}语句是真的。
一个更“干净”的解决方案(在我看来)只是依次涵盖所有八种可能性:
>=
请注意,我在这里使用了if
,因为它更接近于条件与注释中显示的序列。重要的是使用包容性比较运算符,无论是int median (int a, int b, int c) {
if ((a <= b) && (b <= c)) return b; // a b c
if ((a <= c) && (c <= b)) return c; // a c b
if ((b <= a) && (a <= c)) return a; // b a c
if ((b <= c) && (c <= a)) return c; // b c a
if ((c <= a) && (a <= b)) return a; // c a b
return b; // c b a
}
还是 <=
,而不是像>=
这样的独占运算符。
当然还有另一种选择(几乎总是存在)。
由于只有三个值,因此对它们进行排序并返回中间值是一件简单的事情。它不必是一个复杂的类型,因为您可以使用从几个条件创建的展开的冒泡排序。这样做的代码如下所示:
<=
就个人而言,我认为这不像早期的代码那样可读,但如果您愿意,它肯定是有用的。
答案 1 :(得分:-1)
在通用C ++代码中,通常首选使用小于号运算符。
这可能会导致类似:
template<typename T>
T median(T a, T b, T c)
{
return (b<a)
? (b<c) ? (c<a) ? c : a : b
: (a<c) ? (c<b) ? c : b : a;
}