2016-06-14 72 views
1

我想创建一个C函数,它接受一个数组,找到最小的元素,并将该元素的值设置为零。找到一个数组的最小元素,并将其索引设置为0

这是我迄今的功能。

void find_minimum(double a[], int n) { 

    int i, smallest = 0; 

    smallest = a[0]; 

    for (i = 0; i < n; i++) { 
     if (a[i] < smallest) { 
      smallest = a[i]; 
     } 
     a[i] = 0; 
    } 
} 

当我运行它时,除最后一个之外的每个索引都是零,但我只想要最小的元素为零。

+0

在if语句中移动'a [i] = 0;'并且从索引1开始比较,即for循环中的'i = 1' –

+0

如果存在多于1个最小元素,该怎么办? –

+0

@ImranAli不,那么它会设置最小为0,每次发现一个新的最小值为 –

回答

0

我想解决的情况是,有多个唯一的最小值。

在这种情况下,需要两个循环。一个找出整个数组的最小值,另一个找出所有具有该值的元素。

我会继续跟踪的最小和最大索引,其中,该值出现在阵列中以最小化所述第二回路的范围:

void set_smallest_to_zero(double a[], size_t n) { 

    if (!a || !n) { 
     return; 
    } 

    double smallest = a[0]; 
    size_t min_index = 0,    
      max_index = 0, 
      i; 

    // find the smallest values 
    for (i = 1; i < n; ++i) { 
     if (a[i] > smallest) { 
      continue; 
     } else if (a[i] < smallest) { 
      smallest = a[i]; 
      min_index = i; 
      max_index = i; 
     } else {      // a[i] == smallest 
      max_index = i; 
     } 
    } 

    // set to zero all the the minimum values 
    for (i = min_index; i <= max_index; ++i) { 
     if (a[i] == smallest) { 
      a[i] = 0.0; 
     } 
    } 
} 

HERE有一个活例子。

+0

谢谢。这工作,并感谢您解决其他情况 –

2

你的代码有几个问题,我很惊讶你的编译器没有爆炸你。

void find_minimum(double a[], size_t n) { 

    size_t i, index; 
    double smallest; 

    // sanity check to make sure we're not accessing outside allocated memory 
    if (n > 0) { 
    smallest = a[0]; 
    index = 0; 
    } else { 
    // nothing left to do here 
    return; 
    } 

    // start at 1 because 0 is initial default 
    for (i = 1; i < n; i++) { 
    if (a[i] < smallest) { 
     smallest = a[i]; 
     index = i; 
    } 
    } 

    // assign only the smallest index 
    a[index] = 0.0; 
} 

如果您有任何问题,随时发表评论。

+0

你可以删除第二个完整性检查通过在第一个 – pm100

+0

@ pm100好点上做一个“else return”,以及更多的DRY回答。我会更新,谢谢。现在已经修复了。 –

+0

嘿帕特里克。我实现了你的代码,但它并没有改变数组中的任何东西。我感谢你的帮助。我知道现在开始我在1而不是0,也知道size_t –

1

如果我们假定只有一个最小的像OP和一些答案,我们也可以跟踪最小的仅仅是指数的,而不是最小的值,让事情变得简单:

void find_minimum(double a[], size_t n) { 
    if (n <= 0) { 
     return; 
    } 

    size_t smallest = 0; 

    for (size_t i = 1; i < n; i++) { 
     if (a[i] < a[smallest]) { 
      smallest = i; 
     } 
    } 

    a[smallest] = 0.0; 
} 
+0

谢谢,但这个函数没有改变任何数组的值。我想我可能有一个编译器问题,因为其他解决方案不起作用 –

+0

这可行。在测试时发生转储错误 –

相关问题