C 2D-массивы, удаляющие определенные заранее определенные строки, сдвигая те, которые находятся ниже - PullRequest
0 голосов
/ 13 ноября 2018

Это мой первый пост здесь.

Задание моего онлайн-курса на C попросило меня удалить каждую строку в вещественной (не динамически размещаемых, указатели не используются), у которых средняя сумма больше, чем средняя сумма всей матрицы. Строки должны быть «удалены», сдвинув те, что ниже, на одну позицию вверх.

Я настроил матрицу со следующим кодом:

int matrix[100][100]

Теперь моя идея состояла в том, чтобы создать обычный одномерный массив, который хранит индексы строк, которые будут удалены .

Вот как я это сделал:

k = 0;                                                    
for (i = 0; i < no_of_rows; i++) {                        
  average_sum_of_row = 0;                                 
  for (j = 0; j < no_of_columns; j++) {                   
    average_sum_of_row += matrix[i][j];                   
  }                                                       
  average_sum_of_row = average_sum_of_row / no_of_columns;

  if (average_sum_of_row > average_sum_of_matrix) {       
    indexes_of_rows_to_remove[k] = i;                     
    k++;                                                  
    l++;                                                  
  }                                                       
}                                                         

Который работает просто отлично! Я получаю массив, элементы которого являются индексами строк, которые должны быть удалены. Тем не менее, при реализации моего кода в следующем:

m = 0;                                     
for (i = 0; i < V; i++) {                  
  if (indexes_of_rows_to_remove[m] == i) { 
    for (k = i; k < no_of_rows - 1; k++) { 
      for (j = 0; j < no_of_columns; j++) {
        matrix[k][j] = matrix[k + 1][j];   
      }                                    
    }                                      
    i--;                                   
    no_of_rows--;                          
  }                                        
  m++;                                     
}                                          

Это не работает. То, что я использовал, это мой существующий код удаления строки, сдвигая те, которые находятся ниже, и уменьшая количество строк на одну, но это просто не работает, и я не знаю почему.

Я пытался использовать отдельное целое число (m), чтобы просмотреть все элементы массива индексов, но по какой-то причине он не работает.

Спасибо всем!

1 Ответ

0 голосов
/ 13 ноября 2018

Вы можете использовать этот алгоритм, который пропускает удаляемые строки:

k = 0
For i in number of rows:
  If i not to be deleted:
    matrix[k] = matrix[i] # copy the whole row here
    k++

Алгоритм, который вы пытаетесь реализовать, сложен и очень неэффективен.

...