三个值的中位数

时间:2018-02-15 04:05:26

标签: c

我正在尝试编写一个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?

2 个答案:

答案 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;
}