Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.02.2018, 00:32   #1
Andrei.Ch
 
Регистрация: 24.01.2018
Сообщений: 6
По умолчанию Найти максимальный элемент массива и переставить его.

вот условие

Задан двумерный массив N x N. Последовательно рассматриваются квадратные подмассивы, правый верхний элемент которых лежит на побочной диагонали. В каждом таком подмассиве находится максимальный элемент. Путем перестановок строк и столбцов (целиком) элемент надо переместить в правый верхний угол подмассива. Проверить получилась ли на побочной диагонали убывающая последовательность элементов.


У меня получается не перестановка строк и столбцов, а их замена
помогите исправить ошибку

Код:
#include <iostream>
#include <iomanip>
#include <ctime>
#include <conio.h>
 
using namespace std;
int main() {
    setlocale(LC_ALL, "Russian");
    int n, imax, jmax;
    double a[15][15], b[15], r;
    bool f;
    srand(time(0));
    do {
        cout << "Задайте размер матрицы до 15 n = ";
        cin >> n;
        cout << "Исходный массив:" << endl;
    } while (n < 1 || n > 15);
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            a[i][j] = rand() % 10;
            cout << setw(5) << a[i][j];
        }
        cout << endl;
    }
    for (int i = 1; i <= n-1; i++) { 
        imax = i;                  
        jmax = 0;
        for (int k = i; k <= n; k++)  
            for (int j = 1; j <= n-i+1; j++)
                if (a[k][j] > a[imax][jmax]) {  
                    imax = k;  
                    jmax = j;
                }
                if (imax > i) {                 
                    for (int j = 1; j <= n; j++) 
                        b[j] = a[imax][j];  
                    for (int k = imax; k >= i+1; k--)  
                        for (int j = 1; j <= n; j++)
                            a[k][j] = a[k-1][j];
                    for (int j = 0; j < n; j++)  
                        a[i][j] = b[j];
                }
        if (jmax < n-i+1) {              
            for (int k = 1; k <= n; k++)  
                b[k] = a[k][jmax]; 
            for (int j = jmax; j >= n-i; j--) 
                for (int k = 1; k <= n; k++)
                    a[k][j] = a[k][j+1];
            for (int k = 1; k <= n; k++)  
                a[k][n-i+1] = b[k];
        }
    }
    cout << "Массив после перестановок:" << endl;
    for (int i = 1; i <= n; i++) {  
        for (int j = 1; j <= n; j++)
            cout << setw(5) << a[i][j];
        cout << endl;
    }
    f = true;
    int i = 2;
    while (i < n && f)
        if (a[i][n-i+1] > a[i-1][n-i+2]) f = false;
        else i++;
    if (f) cout << "На побочной диагонали убывающая последовательность";
    else cout <<"Убывающая последовательность не получилась, ошибка в программе";
    getch();
    return 0;
}
Andrei.Ch вне форума Ответить с цитированием
Старый 03.02.2018, 00:42   #2
Andrei.Ch
 
Регистрация: 24.01.2018
Сообщений: 6
По умолчанию

Оказывается все норм написал сам плохо проверил массивы
но вот волнует теперь другой вопрос.
Когда я задаю массив больше 4 то всегда выходит
" Убывающая последовательность не получилась, ошибка в программе"
где я накасячил ?
Andrei.Ch вне форума Ответить с цитированием
Старый 03.02.2018, 02:17   #3
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Цитата:
Сообщение от Andrei.Ch Посмотреть сообщение
где я накасячил ?
Ты серьёзно думаешь, что найдётся адепт ктулху, который реально будет вот это читать и пытаться понять? Ты, чо, больной?

Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 03.02.2018, 13:45   #4
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

Отрефакторь код

Например, можно написать такие хелперы и вынести обмен строк в них:
Код:

#include <utility>
inline void swap_rows(tmat& matr, const size_t r1, const size_t r2)
{
    for (size_t i =0; i<N; ++i)
        std::swap(matr[r1][i], matr[r2][i]);
}


inline void swap_columns(tmat& matr, const size_t c1, const size_t c2)
{
    for (size_t i =0; i<N; ++i)
        std::swap(matr[i][c1], matr[i][c2]);
}
Ещё можно и поиск максимума вынести:
Код:
std::pair<size_t, size_t> get_max(const tmat& matr, const size_t left, const size_t top, const size_t sub_size)
{
    // ищешь строку и столбец
    // обращаешься к элементу как к 
    // matr[top + i][left + j]
    return std::make_pair(row, col);
}
После этого сам поймёшь.
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задана матрица Am*n . Найти максимальный по модулю элемент матрицы. Переставить строки и столбцы матрицы (в Delphi) Natashakosmos Помощь студентам 3 12.01.2014 00:28
одномерный массив размера n. Найти максимальный элемент массива среди элементов массива,после первого отрицательного (Паскаль) Элиза12345 Паскаль, Turbo Pascal, PascalABC.NET 7 13.11.2012 16:03
Найти максимальный элемент массива и его порядковый номер через функцию на С ++ SeReGa48 Помощь студентам 1 31.05.2010 23:08
найти максимальный элемент одномерного массива Серый777 Паскаль, Turbo Pascal, PascalABC.NET 4 05.05.2010 20:54