Двумерный массив "си"

Рейтинг: 1Ответов: 2Опубликовано: 18.12.2014

Дана матрица А(10х10). Расставить строки таким образом, чтобы элементы в первом столбце были упорядочены по убыванию.

#include <stdio.h>
#include <stdlib.h>
#define n 4
#define m 4
int main()
{
    int i, j, mem;
    int a[n][m]; 
    for (i=0;i<n;i++)
        for (j=0;j<m;j++)
            scanf("%d", &a[i][j]);

    for ( i=0; i<n/2; i++)
    {
        mem=a[i][1];
        a[i][1]=a[n-i-1][1];
        a[n-i-1][1]=mem;
    }

    printf ("%d", a[i][j]);
    system("Pause");
    return 0;
}

Ответы

▲ 2

В качестве первого шага напишите программу, которая сортирует (т.е. упорядочивает (переставляет)) числа в первом столбце.

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

А потом, когда все это уже освоите, задумайтесь о более эффективном решении (минимизации суммы перестановок чисел).

▲ 1

Отлично - Ваш swap умеет переставлять числа!

    // swap
    { int mem = a[i][1];
      a[i][1] = a[n-i-1][1]; // мы знаем, что массивы в С нумеруются с 0?
      a[n-i-1][1] = mem;
    }

Теперь напишем то же самое для перестановки столбцов: (т.е. мы знаем, как можно организовать матрицы в С: как массив указетелей (а указатель=массив, если он указывает на кусок памяти, содержащей элементы одинакового типа, записанные в ней без промежутков - друг за другом), и указетели, как любые элементы с одинаковым размером можно переставлять внутри массива). Таким образом:

void  swap_columns (int *(col1[]), int *(col2[]))
// можно писать (int **col1, int **col2)
// В функции нам нужен указатель на указатель, чтобы вернуть изменения
{ int *temp_column = *col1;
  *col1 = *col2;
  *col2 = temp_column;
} // ** - это, наверно, непонятно, но это правильно.

int main (void)
{ int i=0, j=0;
  // ...
  int matrix[][]; // или int **matrix; - указатели,
  // на которые malloc-ом надо навесить память, если вы проходили
  // динамическое распределенение памяти:
  // В нашем случае, надо вызвать первый malloc для массива столбцов,
  // размера (int*) * columns_count
  // и в цикле для каждого массива-столбца, размера int*rows_count
  // ...

  // А это - "сортировка пузырьком" для столбцов по первому значению
   for (i=0; i<columns_count; ++i)
    for (j=i+1; j<columns_count; ++j)
     if( matrix[i][0] > matrix[j][0] )
      swap_columns (&matrix[i], &matrix[i+1]);

  // ...
  return 0;
}