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

Матрица. Диагонали в прямоугольнике - C++

Восстановить пароль Регистрация
 
StriBog45
5 / 5 / 2
Регистрация: 03.09.2013
Сообщений: 80
07.10.2013, 19:40     Матрица. Диагонали в прямоугольнике #1
Задание дано так: Дана матрица с размерами A[10][12]
Максимум среди сумм модулей элементов диагоналей, параллельных побочной диагонали матрицы.

Есть идея разделить всю матрицу на три части,на три типа диагоналей.
1. Увеличивающийся.
Например:
C++
1
2
3
4
           summa1 = abs( A[0][0] );
    summa2 = abs( A[0][1] ) + abs( A[1][0] );
    summa3 = abs( A[0][2] ) + abs( A[1][1] ) + abs( A[2][0]) ;
    summa4 = abs( A[0][3] ) + abs( A[1][2] ) + abs( A[2][1]) + abs( A[3][0];
Конечно это для примера,это нужно как то продумать в массиве.
2. Повторяющие.
Когда диагональ перестаёт увеличиваться и начинает повторятся(по количеству элементов) т.к. матрица прямоугольная.
3. Уменьшающийся. Аналогично увеличивающийся только в обратную сторону.
Эти три массива можно связать между собой условиями if,но как написать сами массивы..
Да здесь видна закономерность.
Во второй можно в каждом индексе элемента по 1 и диагональ будет смещаться в право.
Но как прибавлять в массиве новые элементы и удалять?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Alexdemath
 Аватар для Alexdemath
125 / 122 / 6
Регистрация: 11.04.2010
Сообщений: 253
08.10.2013, 05:38     Матрица. Диагонали в прямоугольнике #2
Пример вывода нужных диагоналей

Кликните здесь для просмотра всего текста
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
#include <iostream>
using namespace std;
 
int main()
{   
    setlocale(0,"");
 
    int A[10][12] = {{3, 8, 2, 7, 5, 2, 9, 1, 6, 4, 0, 1},
                     {2, 1, 6, 0, 5, 6, 8, 3, 6, 9, 3, 0},
                     {1, 2, 5, 2, 2, 1, 0, 7, 9, 4, 4, 9},
                     {1, 6, 1, 0, 2, 2, 5, 4, 0, 0, 5, 7},
                     {2, 2, 1, 9, 1, 2, 6, 9, 7, 8, 9, 4},
                     {1, 5, 7, 1, 5, 1, 8, 8, 2, 1, 1, 3},
                     {9, 5, 1, 0, 2, 2, 0, 5, 5, 3, 2, 1},
                     {0, 1, 1, 3, 1, 6, 7, 1, 2, 2, 9, 5},
                     {3, 5, 6, 1, 9, 2, 3, 7, 5, 7, 4, 0},
                     {2, 2, 7, 5, 5, 8, 9, 2, 4, 3, 0, 0}};
    int m = 10, n = 12;
 
    cout << "Матрица 10 на 12:" << "\n\n";
    for (int i = 0; i < m; i++)
     { for (int j = 0; j < n; j++) cout << "  " << A[i][j];
       cout << "\n";
     }
 
    cout << "\nПобочная диагональ:\n\n";
    for (int i = 0; i < m; i++){ cout << "  " << A[i][n-1-i]; }
 
    cout << "\n\nДиагонали, параллельные побочной:\n\n";
    for (int i = 0; i < m; i++)
     { for (int j = 0; j <= i; j++) cout << "  " << A[j][i-j];
       cout << "\n";
     }
    cout << "\n";
    for (int i = 0; i < m; i++) cout << "  " << A[i][n-2-i];
    cout << "\n\n";
    for (int i = 1; i < m; i++)
     { for (int j = 1; j <= m-i; j++) cout << "  " << A[i+j-1][n-j];
       cout << "\n";
     }
     
    cout << endl << endl;
    system("pause");
    return 0;
}

Пример решения (надеюсь не ошибся)

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
#include <iostream>
using namespace std;
 
int main()
{   
    setlocale(0,"");
 
    int A[10][12] = {{3, 8, 2, 7, 5, 2, 9, 1, 6, 4, 0, 1},
                     {2, 1, 6, 0, 5, 6, 8, 3, 6, 9, 3, 0},
                     {1, 2, 5, 2, 2, 1, 0, 7, 9, 4, 4, 9},
                     {1, 6, 1, 0, 2, 2, 5, 4, 0, 0, 5, 7},
                     {2, 2, 1, 9, 1, 2, 6, 9, 7, 8, 9, 4},
                     {1, 5, 7, 1, 5, 1, 8, 8, 2, 1, 1, 3},
                     {9, 5, 1, 0, 2, 2, 0, 5, 5, 3, 2, 1},
                     {0, 1, 1, 3, 1, 6, 7, 1, 2, 2, 9, 5},
                     {3, 5, 6, 1, 9, 2, 3, 7, 5, 7, 4, 0},
                     {2, 2, 7, 5, 5, 8, 9, 2, 4, 3, 0, 0}};
    int m = 10, n = 12;
 
    cout << "Матрица 10 на 12:" << "\n\n";
    for (int i = 0; i < m; i++)
     { for (int j = 0; j < n; j++) cout << "  " << A[i][j];
       cout << "\n";
     }
 
    int a = abs(A[0][0]),  b = abs(A[0][n-2]),  c = abs(A[m-1][n-1]);
 
    for (int i = 0; i < m; i++)
     { int sum = 0;
       for (int j = 0; j <= i; j++) sum += abs(A[j][i-j]);
       if (sum > a) a = sum;
     }
 
    for (int i = 1; i < m; i++) b += abs(A[i][n-2-i]);
 
    for (int i = 1; i < m; i++)
     { int sum = 0;
       for (int j = 1; j <= m-i; j++) sum += abs(A[i+j-1][n-j]);
       if (sum > c) c = sum;
     }
 
    int max = (a > b && a > c) ? a : (b > a && b > c) ? b : c;
 
    cout << "\nМаксимум среди сумм модулей элементов диагоналей,\n";
    cout << "параллельных побочной диагонали: " << max;
    cout << endl << endl;
    system("pause");
    return 0;
}
StriBog45
5 / 5 / 2
Регистрация: 03.09.2013
Сообщений: 80
08.10.2013, 17:32  [ТС]     Матрица. Диагонали в прямоугольнике #3
Я попробовал в ваш код подставить за место заранее введённых чисел подставить случайное число. Сумма максимума получается не правильной,больше чем есть у всех диагоналей
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
#include "stdafx.h"
#include <ctime>
#include <iostream>
#include <locale>
using namespace std;
 
int main()
{   
    setlocale(LC_ALL,"Russian");
 
    const int size = 10; const int size2 = 12;
    int A[size][size2], m = 10, n = 12;
 
    cout << "Матрица 10 на 12:" << endl;
    for (int i = 0; i < m; i++)
     { 
         for (int j = 0; j < n; j++)
         {
             A[i][j] = rand() % 9 - 5;
             if (A[i][j] >= 0)
             {
                 cout << "   ";
             }
             else
             {
                 cout << "  ";
             }
             cout << A[i][j];
         }
         cout << endl;
     }
 
    int a = abs(A[0][0]),  b = abs(A[0][n-2]),  c = abs(A[m-1][n-1]);
 
    for (int i = 0; i < m; i++)
    { 
         int sum = 0;    
         for (int j = 0; j <= i; j++) sum += abs(A[j][i-j]);     
         if (sum > a) a = sum;
    }
 
    for (int i = 1; i < m; i++) 
    {
        b += abs(A[i][n-2-i]);
    }
 
    for (int i = 1; i < m; i++)
    { 
        int sum = 0;
        for (int j = 1; j <= m-i; j++) sum += abs(A[i+j-1][n-j]);
        if (sum > c) c = sum;
    }
 
    int max = (a > b && a > c) ? a : (b > a && b > c) ? b : c;
 
    cout << "Максимум среди сумм модулей элементов диагоналей"
         << endl
         << "параллельных побочной диагонали: " 
         << max
         << endl;
    system("pause");
    return 0;
}
Добавлено через 9 минут
Честно говоря не совсем понимаю строки:
C++
1
2
int a = abs(A[0][0]),  b = abs(A[0][n-2]),  c = abs(A[m-1][n-1]);
int max = (a > b && a > c) ? a : (b > a && b > c) ? b : c;
Больше привык видеть через if
C++
1
2
3
4
5
max = A[0][0]
if (A[i][j] > max)
{
   max = A[i][j];
}
Добавлено через 7 минут
p.s.
Побочная диагональ матрица
000000000001 Единичка показывает побочную диагональ
000000000010
000000000100
000000001000
000000010000
000000100000
000001000000
000010000000
000100000000
001000000000
Alexdemath
 Аватар для Alexdemath
125 / 122 / 6
Регистрация: 11.04.2010
Сообщений: 253
08.10.2013, 20:57     Матрица. Диагонали в прямоугольнике #4
Цитата Сообщение от StriBog45 Посмотреть сообщение
Я попробовал в ваш код подставить за место заранее введённых чисел подставить случайное число. Сумма максимума получается не правильной,больше чем есть у всех диагоналей

Кликните здесь для просмотра всего текста
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
#include "stdafx.h"
#include <ctime>
#include <iostream>
#include <locale>
using namespace std;
 
int main()
{   
    setlocale(LC_ALL,"Russian");
 
    const int size = 10; const int size2 = 12;
    int A[size][size2], m = 10, n = 12;
 
    cout << "Матрица 10 на 12:" << endl;
    for (int i = 0; i < m; i++)
     { 
         for (int j = 0; j < n; j++)
         {
             A[i][j] = rand() % 9 - 5;
             if (A[i][j] >= 0)
             {
                 cout << "   ";
             }
             else
             {
                 cout << "  ";
             }
             cout << A[i][j];
         }
         cout << endl;
     }
 
    int a = abs(A[0][0]),  b = abs(A[0][n-2]),  c = abs(A[m-1][n-1]);
 
    for (int i = 0; i < m; i++)
    { 
         int sum = 0;    
         for (int j = 0; j <= i; j++) sum += abs(A[j][i-j]);     
         if (sum > a) a = sum;
    }
 
    for (int i = 1; i < m; i++) 
    {
        b += abs(A[i][n-2-i]);
    }
 
    for (int i = 1; i < m; i++)
    { 
        int sum = 0;
        for (int j = 1; j <= m-i; j++) sum += abs(A[i+j-1][n-j]);
        if (sum > c) c = sum;
    }
 
    int max = (a > b && a > c) ? a : (b > a && b > c) ? b : c;
 
    cout << "Максимум среди сумм модулей элементов диагоналей"
         << endl
         << "параллельных побочной диагонали: " 
         << max
         << endl;
    system("pause");
    return 0;
}
StriBog45, сделайте скрин с неверным расчетом.

Проверил корректность расчетов. Например

Матрица. Диагонали в прямоугольнике
Alexdemath
 Аватар для Alexdemath
125 / 122 / 6
Регистрация: 11.04.2010
Сообщений: 253
08.10.2013, 21:07     Матрица. Диагонали в прямоугольнике #5
Цитата Сообщение от StriBog45 Посмотреть сообщение
Честно говоря не совсем понимаю строки:

C++
1
2
int a = abs(A[0][0]), *b = abs(A[0][n-2]), *c = abs(A[m-1][n-1]);
int max = (a > b && a > c) ? a : (b > a && b > c) ? b : c;
Во второй строке для компактности записи используется тернарный условный оператор для отыскания максимума трех чисел a,b,c.
С помощью if-else можно записать так

C++
1
2
3
4
  int max;
  if (a > b && a > c)      max = a;
  else if (b > a && b > c) max = b;
  else                     max = c;
Alexdemath
 Аватар для Alexdemath
125 / 122 / 6
Регистрация: 11.04.2010
Сообщений: 253
08.10.2013, 21:42     Матрица. Диагонали в прямоугольнике #6
Вот скрин с наглядным обозначением

Матрица. Диагонали в прямоугольнике
Yandex
Объявления
08.10.2013, 21:42     Матрица. Диагонали в прямоугольнике
Ответ Создать тему
Опции темы

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