首先,我不认为这与精度有关,我认为变量会以某种方式失去作用域?
下面的功能,头文件排序。h:
#ifndef SORTING_H
#define SORTING_H
/*===========================================================================
Function find_median
Description: median values in a sorted array.
==========================================================*/
float find_median(float values[],int n );
#endif /* SORTING_H */
实施文件sorting.c:
#include "sorting.h"
float find_median(float values[],int n)
{
float val = 0.0f;
// check for even case
if (n % 2 == 0)
{
val = (float)values[n/2];
}
else
{
int low_index = (n)/2;
int high_index= low_index + 1;
val = (values[low_index] + values[high_index])/2.0f;
}
return val;
}
主要条目main.c:
int main(int argc, char** argv)
{
//unsorted
float output_array[] = { 3, 17, 13, 6, 9, -1, 10, 10 };
int row_length = sizeof(output_array) / sizeof(output_array[0]);
//sort
quicksort_iterative(output_array, row_length);
float median = 0.0f;
//get the median
median = find_median(output_array, row_length);
printf("median=%f", median);
}
输出:
已排序:,-1.000000,3.000000,6.000000,9.000000,10.000000,10.000000,13.000000,17.000000 中位数= 6422100.000000
我试图将最终的中值从中分配为返回值,也尝试将中值作为参数传递,但是两次尝试都返回不正确的值。
中位数应为11。
答案 0 :(得分:2)
您似乎想在调用函数中修改median
。在C ++中,您只需要做的是:
float median(float values[],int n, float& median)
C有点难。为此,您需要一个指针:
float median(float values[],int n, float *median)
{
// ...
*median = val;
// ...
}
// ...
find_median(output_array, row_length, &median);
答案 1 :(得分:0)
该函数在标头中称为find_median
,但在实现中称为median
...如何链接?
然后,您没有将find_median
的结果分配给变量median
答案 2 :(得分:0)
我认为您的公式有问题。试试这个。
float median(float values[],int n) //, float& median) //note: notice the & here.
{
float val = 0.0f;
// check for even case
if (n % 2 == 0)
{
//get the average of the 2 mid values.
int high_index = n/2;
int low_index = high_index - 1;
val = (values[high_index] + values[low_index])/2.0f;
//note: 2 is integer, 2.0f is float. there might be problem if you use 2 speciall in division.
printf("even case: val=%f\n", val);
printf("values[%d]=%f\n",low_index);
printf("values[%d]=%f\n",high_index);
}
else
{
val = values[n/2];
printf("odd case: val=%f\n", val);
}
//median = val; //2 way output?
return val;
}
更新 我在代码上添加了日志,以跟踪问题的原因。
答案 3 :(得分:0)
您在许多基本方面都感到困惑。首先,请查看您的函数find_median
,尤其是参数:(假定您实际上是要为函数float_median
命名,而不仅仅是用median
编写的sorting.c
)
float float_median(float values[],int n, float median);
您的函数将float
数组作为第一个参数,这很好。 (但可以简单地写为float *values
,因为数组在访问时会转换为指针,请参见:C11 Standard - 6.3.2.1 Other Operands - Lvalues, arrays, and function designators(p3) -它对C ++的作用相同)
现在,您的第二个参数int n
传递了数组中元素的数量(也可以),但是您的第三个参数float median
在float_median
中实际上未被使用。分配median = val;
的效果为零,因为在C参数中通过值传递,因此float_median
的{{1}}中的赋值仅更改副本的值 <函数中使用的{/ {1}}中的/ strong>,并且对median = val;
中原始的median
具有零影响。您要从函数中返回中值,因此只需删除第三个参数,例如
median
(注意:分母也从main()
更改为#include <math.h>
#include "sorting.h"
float find_median (float *values, int n)
{
float val = 0;
// check for even case
if (n % 2 == 0)
val = (float)values[n/2];
else {
int low_index = floor(n-1)/2;
int high_index = ceil(n-1)/2;
val = (values[low_index] + values[high_index]) / 2.;
}
return val;
}
,以消除生成的强制转换以避免整数除法)
做好使用标题保护程序的工作,以防止多次包含2
。您只需要更新函数原型即可删除第三个参数,例如
2.0
在您的sorting.h
(我称为#ifndef SORTING_H
#define SORTING_H
/*===========================================================================
Function find_median
Description: median values in a sorted array.
==========================================================*/
float find_median (float values[], int n);
#endif /* SORTING_H */
)中,您尝试使用您未提供的main()
函数。忘记了,只需为sort.c
中的元素编写一个快速比较函数,然后使用标准的quicksort_iterative
函数对数组进行排序即可,例如
output_array
现在只需编译:
qsort
(注意:我还建议添加#include <stdio.h>
#include <stdlib.h>
#include "sorting.h"
int compare (const void *a, const void *b)
{
return (*(int*)a > *(int*)b) - (*(int*)a < *(int*)b);
}
int main (void) {
float output_array[] = { 3, 17, 13, 6, 9, -1, 10, 10 };
int row_length = sizeof output_array / sizeof *output_array;
//sort
qsort (output_array, row_length, sizeof *output_array, compare);
float median = find_median (output_array, row_length);
for (int i = 0; i < row_length; i++)
printf (i ? " %g" : "%g", output_array[i]);
putchar ('\n');
printf ("\nmedian = %.2f\n", median);
}
来捕获任何阴影变量)
使用/输出示例
gcc -Wall -Wextra -pedantic -std=c11 -Ofast sorting.c -o bin/sort sort.c
仔细检查一下,如果还有其他问题,请告诉我。如果您在Windows上或使用gcc / clang以外的其他编译器,请告诉我,我可以为您发布等效的编译选项。