Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
_Лето_
1 / 1 / 0
Регистрация: 03.11.2013
Сообщений: 68
#1

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

04.08.2014, 20:31. Просмотров 360. Ответов 9
Метки нет (Все метки)

Здравствуйте. У меня есть программа, но я не могу понять как она работает. Пожалуйста, объясните ее и, если можете, упростите...

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;
};
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.08.2014, 20:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Наибольший элемент матрицы в левом углу - объяснить код программы (C++):

Добиться того, чтобы наибольший элемент данной матрицы оказался в верхнем левом углу - C++
Дана вещественная матрица размером N x M . Переставляя ее строки и столбцы, добиться того, чтобы наибольший элемент (один из них)...

Переставляя строки и столбцы матрицы, добиться, чтобы наибольший элемент оказался в верхнем левом углу - C++
Дана вещественная матрица A размером 7*4. Переставляя ее строки и столбцы,добиться того,чтобы наибольший элемент (один из них) оказался в...

Переставлять строки и столбцы матрицы до тех пор, пока наибольший элемент не окажется в верхнем левом углу - C++
Помогите пожалуйста. Сам не смог. Условие: дана матрица размером NxM , добиться того, чтобы наибольший элемент матрицы стоял в верхнем...

Массив: Переставляя ее строки и столбцы достичь того, чтобы наибольший элемент матрицы оказался в верхнем левом углу - C++
Написать программу для обработки матрицы. Переставляя ее строки и столбцы достичь того, чтобы наибольший элемент матрицы оказался в верхнем...

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

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

9
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 / 1 / 0
Регистрация: 03.11.2013
Сообщений: 68
05.08.2014, 18:40  [ТС] #3
а что делает эта операция? 25 строка

C++
1
if ( !i && !j ) max_num = matrix[i][j];
0
zss
Модератор
Эксперт С++
6537 / 6099 / 2009
Регистрация: 18.12.2011
Сообщений: 15,867
Завершенные тесты: 1
05.08.2014, 18:53 #4
Цитата Сообщение от _Лето_ Посмотреть сообщение
а что делает эта операция
Она эквивалентна
C++
1
if ( i==0 && j==0 ) max_num = matrix[0][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];
 }
Как можно ее продолжить, чтобы в левом углу перестановкой столбцов оказалось наибольшее число?
0
zss
Модератор
Эксперт С++
6537 / 6099 / 2009
Регистрация: 18.12.2011
Сообщений: 15,867
Завершенные тесты: 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 / 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;
};
0
zss
Модератор
Эксперт С++
6537 / 6099 / 2009
Регистрация: 18.12.2011
Сообщений: 15,867
Завершенные тесты: 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 строки
0
_Лето_
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;
};
0
zss
Модератор
Эксперт С++
6537 / 6099 / 2009
Регистрация: 18.12.2011
Сообщений: 15,867
Завершенные тесты: 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;
}
0
08.08.2014, 08:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.08.2014, 08:09
Привет! Вот еще темы с ответами:

Выяснить, есть ли четные числа в левом верхнем или в нижнем левом углу матрицы - C++
Дано двумерный массив целых чисел. выяснить: а) есть ли четные числа в левом верхнем или в нижнем левом углу; б) есть ли числа,...

Путем перестановки элементов квадратной матрицы добиться того,чтобы ее макс элемент находился в левом верхнем углу - C++
Путем перестановки элементов квадратной матрицы добиться того,чтобы ее макс элемент находился в левом верхнем углу,следующий по величине- в...

Путем перестановки элементов квадратной действительной матрицы достичь того, чтобы ее максимальный элемент находился в левом верхнем углу... - C++
Это задание: путем перестановки элементов квадратной действительной матрицы достичь того, чтобы ее максимальный элемент находился в левом...

Переставляя строки и столбцы, добиться того, чтобы наибольший элемент матрицы оказался в правом нижнем углу - C++
Сформировать матрицу B(M,N) элементами которой являются случайные числа, равномерно распределённые в интервале (-5,7). Переставляя её...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru