2013-05-20 3 views
1

Я анализирую массив и, используя структуру для сохранения позиции и значения каждого элемента, хочу получить три минимальных значения этого массива. Проблема в том, что в этом случае я должен игнорировать значение «-5». И если я попытаюсь проигнорировать это значение, индекс испортится, и я не знаю, как это сделать.C: Игнорирование значения при сканировании массива

Это моя попытка:

#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; } 

Это выход у меня:

Три минимальных значений этой линии:
значения = 0, столбец = 0
Значение = 0, столбец = 0
значение = 1, столбец = 4

Когда желаемое решение:

Три минимальные значения этой линии являются:
значение = 0, столбец = 0
значение = 1, колонка = 2
значение = 1, колонка = 4

Что я делаю неправильно? Я хотел бы иметь решение, просто изменяющее некоторые части открытого кода.
Заранее спасибо

+0

Где определяется 'data_pair'? – user7116

+1

Удалить '#include ', '#include ' и 'using namespace std;', чтобы сделать это C. –

+0

Почему бы просто не отсортировать исходные значения, а затем прокрутить и выбросить -5, когда вы перечислите результаты? –

ответ

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; 
} 
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); 
Смежные вопросы