Зеркально отобразить матрицу C++

sam, представленный мной код работает. Но не выполняется зеркальное отображение, ибо туго соображаю как его реализовать.

Ничего, что этот исходник не компилируется?

Кроме неописанных переменных код содержит ошибки и недоработки:

  1. Неправильное удаление массива.
  2. Неправильная инициализация массива числами, если я правильно понял в радиусе от «a» до «b» как в диапазоне от «a» до «b» включительно.
  3. «Enter size (number line and numbers in line) N<M» — странное пожелание. Взаимоотношение N и M здесь непринципиально. А вот требование, что бы N и M были больше 0 — это важно.
  4. Для #include заголовков из библиотеки компилятора используются угловые скобки.
  5. Проверка введенных пользователем n, m, a, b сделана не user friendly. Лучше сразу проверять ввод и при некорректном вводе повторять запрос, а не выходить из программы.

Если это всё реализовать, плюс добавить зеркальное отображение, то получится примерно так:

#include <iostream>
#include <iomanip>
#include <ctime>

using namespace std;

int main() {
    int n, m, a, b;
    bool ok;
    do {
        cout << "   Enter size (number line and numbers in line) N > 0 and M > 0" << endl;
        cout << "Input N - "; cin >> n;
        cout << "Input M - "; cin >> m;
        ok = n > 0 && m > 0;
        if (!ok)
            cout << "Error !!! Array size must be greater than 0. Repeat please." << endl;
    } while (!ok);
    do {
        cout << "   Enter interval number in size A and B (A<B)" << endl;
        cout << "Input A - "; cin >> a;
        cout << "Input B - "; cin >> b;
        ok = a < b;
        if (!ok)
            cout << "Error !!! The number A must be less than B. Repeat please." << endl;
    } while (!ok);

    // создание массива
    int **dina = new int*[n];
    for (int i = 0; i < n; i++)
        dina[i] = new int[m];

    // заполнение массива
    srand((unsigned int)time(0));
    for (int j = 0; j < n; j++)
        for (int o = 0; o < m; o++)
            dina[j][o] = rand() % (b - a + 1) + a;

    // вывод массива
    cout << "   |NORMAL ARRAY|" << endl << "========================================" << endl;
    for (int j = 0; j < n; j++) {
        for (int o = 0; o < m; o++)
            cout << setw(4) << dina[j][o] << "   ";

        cout << endl;
    }
    cout << "========================================" << endl;

    // отзеркалить массив относительно средней строки
    for (int i = 0; i < n / 2; ++i) {
        swap(dina[i], dina[n - i - 1]);
    }

    // вывод массива
    cout << "   |MIRRORED ARRAY|" << endl << "========================================" << endl;
    for (int j = 0; j < n; j++) {
        for (int o = 0; o < m; o++)
            cout << setw(4) << dina[j][o] << "   ";

        cout << endl;
    }
    cout << "========================================" << endl;



    cout << "Number in interval A/2 and B/2. (" << a / 2 << " - " << b / 2 << ")" << endl;
    for (int f = 0; f < n; f++) {
        for (int w = 0; w < m; w++) {
            if (dina[f][w] >= a / 2 && dina[f][w] <= b / 2)
                cout << setw(3) << dina[f][w];
        }
    }

    // удаление двумерного динамического массива
    for (int i = 0; i < n; i++)
        delete[] dina[i];
    delete[] dina;

    cout << endl;
    system("PAUSE");
    return 0;
}

Благодарю за потраченное время, и за правки, учту.
Но отзеркаливание полностью отражает матрицу относительно горизантальной оси, а нужно верхнюю моловину матрицы на нижнюю.

P.S. Дальше уже сам понял как отобразить верхнюю часть на нижнюю.
Еще раз спасибо.

Но отзеркаливание полностью отражает матрицу относительно горизантальной оси, а нужно верхнюю моловину матрицы на нижнюю.

// отзеркалить верхнюю половину массива на нижнюю половину
for (int i = 0; i < n / 2; ++i) {
    for (int j = 0; j < m; ++j) {
        dina[n - i - 1][j] = dina[i][j];
    }
}

Так что ли?

Кстати, в результате такого «зеркаления» набор чисел в матрице изменится. Поэтому видимо «вывести на екран все числа которые попадают в радиус то a/2 до b/2» надо сделать до изменения матрицы.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.