Удалить из матрицы строки, в которых элементы не образуют монотонную последовательность - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Дана матрица размером 12х6. Удалить из нее строки (одну или несколько) в которых элементы не образуют монотонную последовательность. Как это сделать? Подскажите пожалуйста

Решение задачи: «Удалить из матрицы строки, в которых элементы не образуют монотонную последовательность»

textual
Листинг программы
#include <stdio.h>
#include <stdbool.h>
 
#define M 6
#define N 4
 
static bool NonDescendingRatio(const int item, const int nextItem)
{
  return (item <= nextItem);
}
 
static bool NonAcsendingRatio(const int item, const int nextItem)
{
  return (item >= nextItem);
}
 
static bool IsRowMonotonic(const int* const row, const int n, bool (*ratio)(const int, const int))
{
  bool isMonotonic = true;
  int i = 0;;
  while ((i < n - 1) && isMonotonic)
  {
    isMonotonic = ratio(row[i], row[i + 1]);
    i++;
  }
  
  return isMonotonic;
}
 
static void DeleteRow(int (*matrix)[N], const int index, const int m,
  const int n)
{
  for (int i = index; i < m - 1; i++)
  {
    for (int j = 0; j < n; j++) matrix[i][j] = matrix[i + 1][j];
  }
}
 
static void TransformMatrix(int (*matrix)[N], int* const rowCountPtr, const int colCount)
{
  int m = *rowCountPtr;
  int n = colCount;
  int i = 0;
  while (i < m)
  {
    if (!IsRowMonotonic(matrix[i], n, NonAcsendingRatio) &&
      !IsRowMonotonic(matrix[i], n, NonDescendingRatio))
    {
      DeleteRow(matrix, i, m, n);
      m--;
    }
    i++;
  }
  *rowCountPtr = m;
}
 
int main(void)
{
  int m = M;
  int n = N;
  
  int a[M][N] = {
    {1, 2, 3, 4}, // +
    {3, 2, 6, 1}, // -
    {4, 4, 4, 4}, // +
    {9, 8, 7, 6}, // +
    {9, 6, 7, 4}, // -
    {1, 1, 2, 2}  // +
  };
  
  printf("Before:\n");
  for (int i = 0; i < m; i++)
  {
    for (int j = 0; j < n; j++) printf("%d ", a[i][j]);
    printf("\n");
  }
  
  TransformMatrix(a, &m, n);
  
  printf("After:\n");
  for (int i = 0; i < m; i++)
  {
    for (int j = 0; j < n; j++) printf("%d ", a[i][j]);
    printf("\n");
  }
  
  return 0;
}

Объяснение кода листинга программы

В этом коде реализована функция, которая удаляет строки из матрицы, в которых элементы не образуют монотонную последовательность. Сначала определены две функции-оболочки для проверки монотонности возрастающей и убывающей последовательностей. Затем определена функция для проверки монотонности строки матрицы. Функция удаления строки определена внутри функции проверки, и она вызывается, если строка не является монотонной. В функции main определена матрица, и перед выполнением кода выводится её исходное состояние. Затем вызывается функция TransformMatrix, которая проверяет каждую строку матрицы на монотонность и, если строка не является монотонной, удаляет её. После выполнения функции выводится измененное состояние матрицы. Код удаляет строки с элементами, не образующими монотонную последовательность, и выводит измененное состояние матрицы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.846 из 5
Похожие ответы