0 / 0 / 0
Регистрация: 17.10.2018
Сообщений: 51
1

Поиск максимального элемента на главной диагонали

13.12.2018, 22:15. Показов 3652. Ответов 6
Метки нет (Все метки)

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//Лаб 6 Вар 12 Дана вещественная квадратная матрица порядка n (n – нечетное), все элементы которой различны
//Найти наибольший элемент среди стоящих на главной и побочной диагоналях и поменять его местами с элементом,
//стоящим на пересечении этих диагоналей.
#include <iostream>
#include <iomanip>
#include <windows.h>
#include <time.h>
#include <conio.h> 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
    srand(time(nullptr));
    int len, i, j, max=0;
    cout << "Введите нечетное число, больше 1: "; // определение размера массива
    cin  >> len;
    cout << "Вывод исходного массива: " << endl;
    int **arr = new int *[len];
    for (int i = 0; i < len; i++)
    {
        arr[i]=new int [len];
        for (int j = 0; j < len; j++)
            {
                arr[i][j] =rand()%50-10; // заполнение массива
                cout << arr[i][j] << "\t";
            }
            if(arr[i][j]>=max) max=arr[i][j]; // поиск наибольшего значения на главной диагонали
                {
                    if(arr[i][len-1-i]>=max) max=arr[i][len-1-i]; // сравнение найденного максимального значения
                }                                                                   // главной диагонали со значениями побочной диагонали 
            cout<<endl;
    }
    cout << "Максимальный элемент = " << max << endl;    // вывод найденного максимального значения
    int med;                                                                 
    med = arr[len/2][len/2];                                               // вот здесь указываем элемент, где пересекаются диагонали   
    cout << "Пересечение диагоналей = " << med << endl; // вывод элемента на пересечение диагоналей
    swap (med, max);                                                            // меняем местами максимальный элемент и пересечение
    cout << "Вывод полученного массива: " << endl;           // выводим полученный массив
    for(i = 0; i < len; ++i)
    {
        cout << endl;
        for(j = 0; j < len; ++j)
        {
            cout << arr[i][j]<<"\t";
        }
    }
    
    cout << endl;
    system ("pause");
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.12.2018, 22:15
Ответы с готовыми решениями:

Составить функцию нахождения максимального элемента в диагонали матрицы, параллельной главной диагонали
Составить функцию нахождения максимального элемента в диагонали матрицы, параллельной главной...

Составить функцию нахождения максимального элемента Мх в диагонали матрицы, параллельной главной диагонали
Пожалуйста помогите с решением задачи на С++ Составить функцию нахождения максимального элемента...

Найти произведение максимального элемента главной диагонали на минимальный элемент побочной диагонали
Всем привет! Мастера помогите доделать задание с матрицой. Вот само задание: Найти произведение...

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

6
Параллельный Кот
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
13.12.2018, 22:42 2
Цитата Сообщение от VoronReki Посмотреть сообщение
Мне не нужен ноывй код, просто хочу для себя разобраться, почему не могу отработать задачу в такой последовательности
Начните с объявления переменных там, где они действительно требуются.

Цитата Сообщение от VoronReki Посмотреть сообщение
C++
1
int len, i, j, max=0;
Здесь переменные i, j еще не нужны, вы используете их для организации цикла. Если уберете их отсюда, получите ошибку при компиляции. Подумайте, почему она возникла. Исправите ее - получите правильный поиск максимума на диагоналях.

Цитата Сообщение от VoronReki Посмотреть сообщение
swap (med, max);
swap меняет местами значения двух переменных, и здесь это не элементы матрицы. Может быть тогда стоит запоминать не само значение максимума, а его координаты?
0
7424 / 5019 / 2890
Регистрация: 18.12.2017
Сообщений: 15,694
13.12.2018, 23:56 3
Цитата Сообщение от VoronReki Посмотреть сообщение
Мне не нужен ноывй код
VoronReki, Ваше право так считать, но уже с первых строк код ошибочен:
Цитата Сообщение от VoronReki Посмотреть сообщение
Дана вещественная квадратная матрица порядка n
Цитата Сообщение от VoronReki Посмотреть сообщение
int **arr = new int *[len];
массив целого типа
Цитата Сообщение от VoronReki Посмотреть сообщение
max=0
за начальный максимум принимается минимальный элемент массива. возможное значение минимального элемента от начинается от -10
Цитата Сообщение от VoronReki Посмотреть сообщение
if(arr[i][j]>=max) max=arr[i][j]; // поиск наибольшего значения на главной диагонали
индексы элементов главной диагонали равны, более логично применять arr[i][I]

остальные недочёты сказал valen10, возможно есть и другие (про освобождение памяти говорить не будем)

VoronReki, Вы по-прежнему уверены
Цитата Сообщение от VoronReki Посмотреть сообщение
Мне не нужен ноывй код
или всё-же поправить ?
0
0 / 0 / 0
Регистрация: 17.10.2018
Сообщений: 51
13.12.2018, 23:59  [ТС] 4
Цитата Сообщение от valen10 Посмотреть сообщение
получите правильный поиск максимума на диагоналях
Следовательно сейчас он не верен. Но ведь промежуточная цель задачи выполняется? Максимум находится, при эирм не надо вводить какие-то дополнительные элементы..
Я находил решения подобных задачи на Киберфоруме, проавда в ряде случаев там поиск максимума был кривой.
Например, вот этот код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
#include <iomanip>
#include <windows.h>
#include <time.h>
#include <conio.h> 
#include <cstdlib>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
    srand(time(nullptr));
    int n, i, j, n_max, m_max, temp;
    cout << "Введите нечетное число, больше 1: ";
    cin  >> n;
    cout << "Вывод исходного массива: " << endl;
    int **arr = new int *[n];
    for (int i = 0; i < n; i++)
    {
        arr[i]=new int [n];
        for (int j = 0; j < n; j++)
        {
            arr[i][j] =rand()%10;
            cout << arr[i][j] << "\t";
        }
        cout<<endl;
    } 
    int max = arr[0][0];  
    cout << endl;
    for(i = 0, j = 0; i < n; i++, j++)
    {
        if(max < arr[i][j])
        {
            n_max = i;
            m_max = j;
        }
    }
    cout << endl << endl;
    for (i = 0, j = n; i < n; i++, --j)
    {
        if (max < arr[i][j])
        {
            n_max = i;
            m_max = j;
        }
    } 
    cout << "Максимальный элемент = " << arr[n_max][m_max] << endl;
    temp = arr[0][0];
    for (i=0 , j = 0; i < 0; i++, j++)
    {
        if (arr[i][j] == arr[i][n-i-1])
        {
            temp=arr[i][j];
        }
            cout<<endl;     
    }        
        cout<<"пересечение диагоналей= "<<temp<<endl;
        cout << "Вывод полученного массива: " << endl;
    for(i = 0; i < n; ++i)
    {
        cout << endl;
        for(j = 0; j < n; ++j)
        {
            cout << arr[i][j]<<"\t";
        }
    }
    cout << endl;
    system ("pause");
    return 0;
}
Именно поэтому и решил попробовать без промужуточных вычислений обойтись. Пока не получается((
0
7424 / 5019 / 2890
Регистрация: 18.12.2017
Сообщений: 15,694
14.12.2018, 00:05 5
Цитата Сообщение от VoronReki Посмотреть сообщение
Но ведь промежуточная цель задачи выполняется? Максимум находится
нет выполняется. максимум правильно находится не для любого массива
0
0 / 0 / 0
Регистрация: 17.10.2018
Сообщений: 51
14.12.2018, 00:09  [ТС] 6
Спасибо за объяснение. Давайте я подправлю то, на что вы указали.
Мне что не понятно: если закоментить кусок кода с заменой элементов, то выводится первоначальный массив и максимум. Если запустить код с заменой, выскакивает ошибка, выводится лишь первая строка массива и на этом все. Получается, где-то возникаеи конфликт между
Цитата Сообщение от VoronReki Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int **arr = new int *[len];
for (int i = 0; i < len; i++) {
    arr[i]=new int [len];
    for (int j = 0; j < len; j++) {
        arr[i][j] =rand()%50-10; // заполнение массива
        cout << arr[i][j] << "\t";
    }
    if(arr[i][j]>=max) max=arr[i][j]; // поиск наибольшего значения на главной диагонали
    {
     if(arr[i][len-1-i]>=max) max=arr[i][len-1-i]; // сравнение найденного максимального значения
    }  // главной диагонали со значениями побочной диагонали 
    cout<<endl;
}
и этой
Цитата Сообщение от VoronReki Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
temp = arr[0][0];
for (i=0 , j = 0; i < 0; i++, j++) {
    if (arr[i][j] == arr[i][n-i-1]) {
        temp=arr[i][j];
    }
    cout<<endl; * * 
}
cout<<"пересечение диагоналей= "<<temp<<endl;
cout << "Вывод полученного массива: " << endl;
for(i = 0; i < n; ++i) {
    cout << endl;
    for(j = 0; j < n; ++j) {
        cout << arr[i][j]<<"\t";
    }
Ты есть я это пытаюсь понять, где я написал так как не надо. Ведь по логике получается:
- отрабатывается создание массива, тут же ищется максимум
- выводится максимум на консоль
- указывается пересечение и тут же меняется местами (ну, здесь ошибка со swap, надо будет местами поменять по-другому)
- выводится изменнный массив.
Но длгика, видимо меня подвела. Вернее, реализация этой логики кривая(

Добавлено через 2 минуты
Цитата Сообщение от Yetty Посмотреть сообщение
нет выполняется. максимум правильно находится не для любого массива
- не свосем понял эту фразу, можете чутка более развернуто написать, пожалуйста.
0
7424 / 5019 / 2890
Регистрация: 18.12.2017
Сообщений: 15,694
14.12.2018, 00:29 7
Цитата Сообщение от VoronReki Посмотреть сообщение
не свосем понял эту фразу, можете чутка более развернуто написать, пожалуйста
самый элементарный пример: матрица 3x3 элементы главной диагонали: -1, -2, -3 что скажет Ваш код насчёт максимума ?

кстати должна выдаваться ошибка строка 28 j вне цикла
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.12.2018, 00:29
Помогаю со студенческими работами здесь

Найти координаты первого максимального элемента главной диагонали матрицы
Дан двумерный массив размера N×N. Требуется найти координаты первого максимального элемента главной...

Определить значение и индексы максимального элемента главной диагонали матрицы
Помогите, будьте любезны. Массив матрица - B(N,N) Определить значение и индексы максимального...

Рассчитывается произведение минимального и максимального элемента ниже главной диагонали массовых
Даны 2-мерных массовых X и Y . Рассчитывается произведение минимального и максимального элемента...

Реализовать шаблонную функцию нахождения максимального элемента главной диагонали квадратной матрицы
Составьте функцию-шаблон для нахождения максимального элемента главной диагонали квадратной матрицы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru