Поменять местами первый и последний столбец

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
admokep
Сообщения: 1
Зарегистрирован: 12 янв 2015, 06:01

Помогите пожалуйста поменять местами первый и последний столбец массивов (их два) изначально программа написана для инвертирования каждой строки двумерного массива

Код: Выделить всё

#include <stdio.h>
#include <iostream.h>
#include <windows.h>
#include <winuser.h>
#pragma hdrstop
 
#pragma argsused
char* rus(const char* text) {
  char* bufRus = new char[strlen(text)];
  CharToOem(text, bufRus);
  return bufRus;
}
int main(int argc, char* argv[]) {
  int** matrix, N = 0, M = 0;
  int** matrix1;
  int i, j, c, n, g;
  cout << rus("Введите количество массивов: ");
  cin >> n;
  for (g = 0; g < n; g++) {
    {
      printf(rus("Количество строк= "));
      scanf("%d", &N);
      printf(rus("Количество столбцов= "));
      scanf("%d", &M);
    }
    if (N > 1 && M > 1) {
      c = M - 1;
      matrix = new int* [N];
      for (i = 0; i < N; i++) matrix[i] = new int[M];
      /*Ввод массива*/
      for (i = 0; i < N; i++) {
        for (j = 0; j < M; j++) {
          matrix[i][j] = rand() % 100;  // случайные числа от нуля до 99
        }
      }
      cout << rus("Исходная матрица") << endl;
      for (int i = 0; i < N; ++i) {
        for (int j = 0; j < M; ++j) cout << matrix[i][j] << " ";
        cout << endl;
      }
      matrix1 = new int* [N];
      for (i = 0; i < N; i++) matrix1[i] = new int[M];
      for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
          matrix1[i][j] = matrix[i][c - j];
        }
      }
      for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) matrix[i][j] = matrix1[i][j];
      }
      cout << rus("Матрица с инвертированными строками") << endl;
      for (int i = 0; i < N; ++i) {
        for (int j = 0; j < M; ++j) cout << matrix1[i][j] << " ";
        cout << endl;
      }
    } else {
      if (N <= 0 || M <= 0) {
        cout << rus("Матриц ") << N << ("X") << M << rus(" не существует")
             << endl;
      } else {
        cout << rus("Данная матрица не двумерный массив") << endl;
      }
    }
    cout << endl;
  }
  system("pause");
  return 0;
}
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Ни для инвертирования строк, ни для обмена первой и последней строки вспомогательная матрица не требуется. Всё легко делается в одной матрице без вспомогательных буферов. Такое преобразование ещё называют "in place".

Чтобы поменять первую и последнюю стороку, нужен следующий код:

Код: Выделить всё

for (int j = 0; j < M; ++j)
{
   const int temp = matrix[0][j];
   matrix[0][j] = matrix[N-1][j];
   matrix[N-1][j] = temp;
}
Если тебе нравится вспомогательная матрица, и ты настаиваешь на оверхеде, то можешь подогнать код соответствующим образом.

P.S. А ещё я хотел спросить, кто будет делать delete? Нельзя так. Это memory leak.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить