C:扫描阵列时忽略一个值

时间:2013-05-20 14:39:25

标签: c arrays

我正在分析一个数组,并使用结构来保存每个项的位置和值,我想得到这个数组的三个最小值。这个问题是我要忽略一个值,在这种情况下为'-5'。如果我试图忽略这个值,那么索引就会混乱,我不知道该怎么做。

这是我的尝试:

#include <cstdlib>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <stdlib.h>

using namespace std;
typedef struct pair {
        int value, column;
    } Pair;
int cmp(const void *a, const void *b);

int main(int argc, char** argv) {

    Pair data_pair[8];

    int row[8] = {0, 3, 1, -5, 1, 2, 3, 4};
    for (int i=0;i<8;++i){
        if (row[i] != -5){ // Ignore the value -5 from the array
              data_pair[i].value = row[i];
              data_pair[i].column = i;
        }    
    }

    printf("\n\nThe three minimum values of this line are:");
    qsort(data_pair, 8, sizeof(Pair), cmp);
    for(int i=0;i<3;++i)
        printf("\nvalue = %d, column = %d", data_pair[i].value, data_pair[i].column);

    return 0;
}

 int cmp(const void *a, const void *b){
     Pair *pa = (Pair *)a;
     Pair *pb = (Pair *)b;
     return pa->value - pb->value; }

这是我的出口:

  

这一行的三个最小值是:
  value = 0,column = 0
  value = 0,column = 0
  value = 1,column = 4

当所需的解决方案是:

  

这一行的三个最小值是:
  value = 0,column = 0
  value = 1,column = 2
  value = 1,column = 4

我做错了什么?我想有一个解决方案只是改变暴露代码的一些部分。
提前致谢

2 个答案:

答案 0 :(得分:4)

您手头的问题源于使用共享索引i并对数组进行排序,无论您在数组中实际拥有多少项(例如,无条件地传递8作为大小)。

如果没有在data_pair中的所有索引处设置值,那么您将在混合中对一些垃圾结果进行排序!

因此,您可以使用带有data_pair的第二个索引器来帮助过滤结果:

/* somewhere above: int j; */
for (i=0, j=0;i<8;++i){
    if (row[i] != -5){ // Ignore the value -5 from the array
        data_pair[j].value = row[i];
        data_pair[j].column = i;
        j++; /* indexes data_pair */
    }    
}

现在j将包含Pair中找到的data_pair的计数:

/* j substitutes for an explicit 8 */
qsort(data_pair, j, sizeof(Pair), cmp);

答案 1 :(得分:1)

if (row[i] != -5){ // Ignore the value -5 from the array
    data_pair[i].value = row[i];
    data_pair[i].column = i;
} else {// add
    data_pair[i].value = INT_MAX;//#include <limits.h>
    data_pair[i].column = i;
}