skip / ignore包含c中值的数组索引

时间:2016-06-15 13:47:35

标签: c arrays iteration

我的目标是创建一个C函数,找到数组的最小值并将其设置为零。到目前为止,我的函数确实如此,但我希望它忽略/跳过已经为零的索引。

<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
    <wb-module deploy-name="jarProjName">
        <wb-resource deploy-path="/" source-path="/src/main/java"/>
    </wb-module>
</project-modules>

我也尝试使用这样的void find_minimum(double a[], int n) { int i, index; double low; index = 0; low = a[0]; for (i = 1; i < n; i++) { if ( a[i] < low && a[i] != 0.0) { low = a[i]; index = i; } } a[index] = 0.0; } 语句:

continue

我错过了什么或搞砸了什么?

3 个答案:

答案 0 :(得分:1)

问题是,当a[0]为零时,您的代码会忽略大小写。尝试将DOUBLE_MAX分配给低常量并迭代整个数组(i = 0初始化语句中的for而不是i = 1)。

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

    int i, index;
    double low;    

    index = 0;
    low = DOUBLE_MAX;

    for (i = 0; i < n; i++) {
        if ( a[i] < low && a[i] != 0.0) {
            low = a[i];
            index = i;
        }
    }
    a[index] = 0.0;      
}

答案 1 :(得分:0)

您需要将最小查找器与更改数据的代码分开。您可能还需要在其他地方找到最小值以用于不同目的。此外,您找到low,但是,您将索引处的元素设置为0。

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

    int i, index;
    double low;    

    index;
    low = DOUBLE_MAX;

    for (i = 0; i < n; i++) {
        if ((a[i]) && (a[i] < low)) {
            low = a[i];
            index = i;
        }
    }
    return low;      
}

//...
int main() {
    //...
    a[find_minimum(a, n)] = 0;
    //...
    return 0;
}

答案 2 :(得分:0)

如果您按照其他帖子的建议使用DOUBLE_MAX,则需要在输入数组中包含一些最大可能值的先验信息。

但是使用下面的代码,您可以在没有任何此类先验信息的情况下解决此问题。
阅读内联评论:

#include<stdio.h>

#define SIZE 5    //  change the array size as per your requirement

void find_minimum_set_zero(double a[]) {

    int i, index;
    double low;

    index = 0;
    low = a[index];

    while(low == 0.0 && index < SIZE){    // This will make sure "low" is non-zero
        index++;
        low = a[index];
    }

    for (i = index+1; i < SIZE; i++) {    // This loop starts with "index+1"
        if ( (a[i] < low) && a[i] ) {
            low = a[i];
            index = i;
        }
    }
    a[index] = 0.0;
}


int main(){

    double a[SIZE];
    int i;

    for(i=0;i < SIZE; i++){
        scanf("%lf", &a[i]);
    }

    find_minimum_set_zero(a);

    for(i=0;i < SIZE; i++){
        printf("%lf ", a[i]);
    }

    return 0;
}

样本输入(第一行)和输出(第二行):

99 98 95 96 97
99.000000 98.000000 0.000000 96.000000 97.000000

0 99 98 96 95
0.000000 99.000000 98.000000 96.000000 0.000000

99 0 98 0 97
99.000000 0.000000 98.000000 0.000000 0.000000

91 99 0 97 0
0.000000 99.000000 0.000000 97.000000 0.000000

PS:我将您的功能名称从find_minimum更改为find_minimum_set_zero,以提高可读性。