Форум программистов, компьютерный форум CyberForum.ru

Наибольший элемент матрицы в левом углу - объяснить код программы - C++

Восстановить пароль Регистрация
 
_Лето_
1 / 1 / 0
Регистрация: 03.11.2013
Сообщений: 68
04.08.2014, 20:31     Наибольший элемент матрицы в левом углу - объяснить код программы #1
Здравствуйте. У меня есть программа, но я не могу понять как она работает. Пожалуйста, объясните ее и, если можете, упростите...

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
#include<iostream>
#include<stdlib.h>
using namespace std;
 
int main()
{
    int **matrix; // это указатель что ли? почему его здесь объявляют, а не в 16 строке?
    int width, height;
    int max_num, pos_x=0, pos_y=0;
 
    cout << "Matrix width = ";
    cin >> width;
    cout << "Matrix height = ";
    cin >> height;
 
    matrix = new int*[width];
    for ( int i=0; i<width; i++ )
        *( matrix +i ) = new int[height]; //что это?
 
    cout << "Please number:\n";
    for ( int i=0; i<width; i++ )
        for ( int j=0; j<height; j++ ){
            cout << "matrix[" << i << "][" << j << "] = ";
            cin >> matrix[i][j];
            if ( !i && !j ) max_num = matrix[i][j];
            else if ( max_num < matrix[i][j] ){
                max_num = matrix[i][j];
                pos_x = i;
                pos_y = j;
            }
        }
 
    for ( int i=0; i<width; i++, cout << endl )
        for ( int j=0; j<height; j++ )
            cout << matrix[i][j] << ends;
    cout << "\n\n";
 
    int *x = matrix[0];
    matrix[0] = matrix[pos_x];
    matrix[pos_x] = x;
 
    int z;
    for ( int i=0; i<width; i++ ){
        z = matrix[i][0];
        matrix[i][0] = matrix[i][pos_y];
        matrix[i][pos_y] = z;
    }
 
    for ( int i=0; i<width; i++, cout << endl )
        for ( int j=0; j<height; j++ )
            cout << matrix[i][j] << ends;
 
    cout << "\n\n";
 
    return 0;
};
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.08.2014, 20:31     Наибольший элемент матрицы в левом углу - объяснить код программы
Посмотрите здесь:

C++ Путем перестановки элементов квадратной действительной матрицы достичь того, чтобы ее максимальный элемент находился в левом верхнем углу...
C++ Путем перестановки элементов квадратной матрицы добиться того,чтобы ее макс элемент находился в левом верхнем углу
Добиться того, чтобы один из элементов матрицы, обладающий наибольшим по модулю значением, располагался в левом верхнем углу матрицы C++
Массив: Переставляя ее строки и столбцы достичь того, чтобы наибольший элемент матрицы оказался в верхнем левом углу C++
C++ Добиться того, чтобы наибольший элемент данной матрицы оказался в верхнем левом углу
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
orange_fox
 Аватар для orange_fox
34 / 34 / 6
Регистрация: 06.04.2014
Сообщений: 189
04.08.2014, 21:20     Наибольший элемент матрицы в левом углу - объяснить код программы #2
Цитата Сообщение от _Лето_ Посмотреть сообщение
int **matrix; // это указатель что ли? почему его здесь объявляют, а не в 16 строке?
Автор кода явно тоскует по Си. Привык объявлять переменные в начале блока. Да, это указатель на указатель на int
16-ю строку можно переписать так:
C++
1
2
// Тут выделяется память для двумерного массива
int** matrix = new int*[width];
и удалит седьмую.
C++
1
2
3
4
//А тут для каждого одномерного, хранящегося в двумерном
( matrix +i ) = new int[height];
//Запись выше аналогична вот этой записи:
matrix[i] = new int[height];
_Лето_
1 / 1 / 0
Регистрация: 03.11.2013
Сообщений: 68
05.08.2014, 18:40  [ТС]     Наибольший элемент матрицы в левом углу - объяснить код программы #3
а что делает эта операция? 25 строка

C++
1
if ( !i && !j ) max_num = matrix[i][j];
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,204
Завершенные тесты: 1
05.08.2014, 18:53     Наибольший элемент матрицы в левом углу - объяснить код программы #4
Цитата Сообщение от _Лето_ Посмотреть сообщение
а что делает эта операция
Она эквивалентна
C++
1
if ( i==0 && j==0 ) max_num = matrix[0][0];
Т.е. при первом проходе в макс. значение записываем первый элемент массива
_Лето_
1 / 1 / 0
Регистрация: 03.11.2013
Сообщений: 68
05.08.2014, 19:35  [ТС]     Наибольший элемент матрицы в левом углу - объяснить код программы #5
zss, ясно, спасибо...
А в 28, 29 строке
pos_x = i;
pos_y = j;
зачем это нужно?

Потом уже в другой операции они всплывают...
C++
1
2
3
4
5
6
7
8
9
int *x = matrix[0];
    matrix[0] = matrix[pos_x];
    matrix[pos_x] = x; 
 
    int z;
    for ( int i=0; i<width; i++ ){
        z = matrix[i][0];
        matrix[i][0] = matrix[i][pos_y];
        matrix[i][pos_y] = z;
Я пробовал выводить по отдельности, но выводит какую-то абракадабру. И что делать, если, допустим, не писать в самом начале int **matrix c указателем на указатель, а просто записать, допустим int matrix[0][0]?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <time.h>
#include <iostream>
using namespace std;
int main()
{
 
srand(time(NULL));
int max_num, v_x=0, v_y=0;
int massiv[0][0];
int i,j;
for (i=0;i<2;i++, cout << endl)
    for (j=0;j<2;j++)
{
massiv[i][j] = rand()%9;
cout << massiv[i][j] << ends;
 
if(!i && !j) max_num = massiv[i][j]; 
else if (max_num < massiv[i][j])
 {
    max_num = massiv[i][j];
 }
Как можно ее продолжить, чтобы в левом углу перестановкой столбцов оказалось наибольшее число?
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,204
Завершенные тесты: 1
05.08.2014, 21:11     Наибольший элемент матрицы в левом углу - объяснить код программы #6
Цитата Сообщение от _Лето_ Посмотреть сообщение
А в 28, 29 строке
pos_x = i;
pos_y = j;
зачем это нужно?
Запоминаем не только максимальное значение, но и координаты этого места.

Добавлено через 3 минуты
Если не хотите динамического массива, то используйте обычный с константными размерами
C++
1
2
3
4
5
6
7
const int M=5;// к-во строк
const int N=5;  // к-во столбцов
int massiv[M][N];
for (int i=0;i<M;i++)
{
    for (int j=0;j<N;j++)
...
_Лето_
1 / 1 / 0
Регистрация: 03.11.2013
Сообщений: 68
07.08.2014, 19:45  [ТС]     Наибольший элемент матрицы в левом углу - объяснить код программы #7
zss, а эта операция?
C++
1
2
3
 int *x = massiv[0];
 massiv[0] = massiv[v_x];
 massiv[v_x] = x;
Ее можно как нибудь заменить. Я просто не понимаю, как именно работают указатели...
Я попробовал переделать, но он не компилируется теперь


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
#include<stdio.h>
#include<conio.h>
#include<iostream>
#include<stdlib.h>
#include <time.h>
using namespace std;
const int M=4;
const int N=4;  
int main()
{
    srand(time(NULL));
    int massiv[M][N];
    int max_num, v_x=0, v_y=0;
    for (int i=0;i<M;i++, cout << endl)
 
            for (int j=0;j<N;j++)
            {
                massiv[M][N] = rand()%9;
                cout << massiv[M][N] << ends;
 
if(!i && !j) max_num = massiv[i][j]; 
else if (max_num < massiv[i][j])
 {
    max_num = massiv[i][j];
    v_x = i;
    v_y = j;
 }}
 
 int *x = massiv[0];
 massiv[0] = massiv[v_x];
 massiv[v_x] = x;
 
int z;
for (int i=0; i<M; i++)
{
    z = massiv[i][0];
    massiv[i][0] = massiv[i][v_y];
    massiv[i][v_y] = z;
}
    for (int i; i<M; i++, cout << endl)
        for (int j=N; j<N; j++)
        cout << massiv[i][j] << ends;
 
    cout << "\n\n";
 
getch();
return 0;
};
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,204
Завершенные тесты: 1
07.08.2014, 22:16     Наибольший элемент матрицы в левом углу - объяснить код программы #8
C++
1
2
3
int *x = massiv[0]; // запомнили адрес нулевой строчки
 massiv[0] = massiv[v_x];// вместо адреса нулевой строки записали адрес v_x строки
 massiv[v_x] = x;// вместо адреса  v_x строки записали адрес нулевой строки (предварительно запомненный в x)
Т.е. в конечном итоге переставили нулевую и v_x строки
_Лето_
1 / 1 / 0
Регистрация: 03.11.2013
Сообщений: 68
07.08.2014, 22:54  [ТС]     Наибольший элемент матрицы в левом углу - объяснить код программы #9
zss, а почему это тогда не срабатывает и в моем варианте?

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
const int M=4;
const int N=4;  
int main()
{
    srand(time(NULL));
    int massiv[M][N];
    int max_num, v_x=0, v_y=0;
    for (int i=0;i<M;i++, cout << endl)
 
            for (int j=0;j<N;j++)
            {
                massiv[M][N] = rand()%9;
                cout << massiv[M][N] << ends;
 
if(!i && !j) max_num = massiv[i][j]; 
else if (max_num < massiv[i][j])
 {
    max_num = massiv[i][j];
    v_x = i;
    v_y = j;
 }}
 
 int *x = massiv[0];
 massiv[0] = massiv[v_x];
 massiv[v_x] = x;
 
int z;
for (int i=0; i<M; i++)
{
    z = massiv[i][0];
    massiv[i][0] = massiv[i][v_y];
    massiv[i][v_y] = z;
}
    for (int i; i<M; i++, cout << endl)
        for (int j=N; j<N; j++)
        cout << massiv[i][j] << ends;
 
    cout << "\n\n";
 
getch();
return 0;
};
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.08.2014, 08:09     Наибольший элемент матрицы в левом углу - объяснить код программы
Еще ссылки по теме:

C++ В матрицы A (m, n) каждый элемент aij заменить минимальным среди элементов подматрицы A '(i, j), которая расположена в верхнем левом углу матрицы A
Переставляя строки и столбцы расположить наибольший элемент массива левом верхнем углу. C++
Переставляя строки и столбцы, добиться того, чтобы наибольший элемент матрицы оказался в правом нижнем углу C++

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

Или воспользуйтесь поиском по форуму:
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,204
Завершенные тесты: 1
08.08.2014, 08:09     Наибольший элемент матрицы в левом углу - объяснить код программы #10
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Так можно поступать только для динамических двумерных массивов.
Вот исправленный код. (Еще нашлось 4 ошибки):
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
int main()
{
    srand(time(NULL));
    int M=4;
    int N=4;  
    int** massiv;
    massiv=new int*[M];
    for (int i=0;i<M;i++)
        massiv[i]=new int[N];
    int max_num, v_x=0, v_y=0;
    for (int i=0;i<M;i++)
    {
        for (int j=0;j<N;j++)
        {
            massiv[i][j] = rand()%9;
            cout << massiv[i][j] << '\t';
 
            if(i==0 && j==0) max_num = massiv[0][0]; 
            else if (max_num < massiv[i][j])
            {
                max_num = massiv[i][j];
                v_x = i;
                v_y = j;
            }
        }
        cout << endl;
    }
    cout << "\n\n";
    int *x = massiv[0];
    massiv[0] = massiv[v_x];
    massiv[v_x] = x;
 
    int z;
    for (int i=0; i<M; i++)
    {
        z = massiv[i][0];
        massiv[i][0] = massiv[i][v_y];
        massiv[i][v_y] = z;
    }
    for (int i=0; i<M; i++)
    {
        for (int j=0; j<N; j++)
            cout << massiv[i][j] <<'\t';
        cout<<endl;
    }
    for (int i=0; i<M; i++)
        delete[] massiv[i];
    delete[] massiv;
    cout << "\n\n";
    system("pause");
    return 0;
}
Yandex
Объявления
08.08.2014, 08:09     Наибольший элемент матрицы в левом углу - объяснить код программы
Ответ Создать тему
Опции темы

Текущее время: 08:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru