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

Работа с элементами над/под побочной диагональю - C++

Восстановить пароль Регистрация
 
Raikerian
9 / 9 / 1
Регистрация: 10.05.2011
Сообщений: 101
24.03.2012, 22:36     Работа с элементами над/под побочной диагональю #1
Доброго времени суток.
Имеется задание:
Дана квадратная вещественная матрица. Определить отдельно сумму S1 элементов, расположенных выше побочной диагонали, и сумму S2 элементов, расположенных ниже этой диагонали. Если эти суммы не равны, то ко всем элементам, образующим меньшую сумму, добавить такое значение, чтобы суммы S1 и S2 оказались равными.

Собственно рабочий код написал:
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
71
72
73
74
75
76
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main()
{
    setlocale(LC_ALL, "");
    srand(time(NULL));
    int size;
    cout << "Введите размер квадратной матрицы: ";
    cin >> size;
    double **A = new double *[size];
    int i, j;
    for (i=0; i<size; ++i)
        *(A+i) = new double [size];
    cout << "\nИсходная матрица:" << endl;
    for (i=0; i<size; ++i)
    {
        for (j=0; j<size; ++j)
        {
            *(*(A+i)+j) = double (rand()%901+100)/100;
            cout << *(*(A+i)+j) << "\t";
        }
        cout << endl;
    }
    double S1 = 0,
           S2 = 0,
           // кол-во элементов по одну из сторон побочной диагонали
           S_num = 0;
    // Находим S1, S2 и кол-во эл-тов
    for (i=0; i<size; ++i)
        for (j=0; j<size; ++j)
        {
            if (i+j<size-1) 
            {
                S1 += *(*(A+i)+j);
                S_num++;
            }
            if (i+j>size-1) S2 += *(*(A+i)+j);
        }
    cout << "\nS1 = " << S1 << endl
         << "S2 = " << S2 << endl;
    double S = 0;
    if (S1 < S2) S = S2-S1;
    else S = S1-S2;
    // Находим число, на которое требуется увеличить эл-ты
    S /= S_num;
    cout << "\nПолученная матрица:" << endl;
    // Преобразуем и выводим матрицу на экран
    for (i=0; i<size; ++i)
    {
        for (j=0; j<size; ++j)
        {
            if (S1<S2) 
            {
                if (i+j<size-1) *(*(A+i)+j) += S;
            }
            else
                if (i+j>size-1) *(*(A+i)+j) += S;
            cout << *(*(A+i)+j) << "\t";
        }
        cout << endl;
    }
    cout << "\nКаждый из элементов";
    if (S1 < S2) cout << " выше ";
    else cout << " ниже ";
    cout << "побочной диагонали увеличен на " << S << endl
         << "Поздравляем! Теперь суммы элементов выше и ниже побочной диагонали равны."
         << endl;
    for (i=0; i<size; ++i)
        delete [] A[i];
    delete [] A;
    cin.sync();
    cin.get();
    return 0;
}
Код получился достаточно громоздким, и мне кажется его можно в некоторых местах упростить, но идей уже нет. Есть ли какие нибудь идеи по упрощению? Может гдето в условиях или... Любые пожелания готов выслушать.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.03.2012, 22:36     Работа с элементами над/под побочной диагональю
Посмотрите здесь:

[C++] Подсчитать среднее арифметическое ненулевых эементов, расположенных над побочной диагональю. C++
Найти наибольший элемент среди элементов матрицы, расположенных над главной диагональю и под боковой диагональю C++
C++ вычислить сумму элементов матрицы над главной диагональю под главной диагональю и на главной диагонали
C++ Дан массив размером n×n. Подсчитать среднее арифметическое, расположенных над побочной диагональю
Среди элементов ниже побочной диагонали, найти количество меньших, чем любой элемент над побочной диагональю C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
24.03.2012, 22:59     Работа с элементами над/под побочной диагональю #2
Цитата Сообщение от Raikerian Посмотреть сообщение
Код получился достаточно громоздким, и мне кажется его можно в некоторых местах упростить, но идей уже нет.
можно совместить:

Цитата Сообщение от Raikerian Посмотреть сообщение
C++
1
2
3
4
double **A = new double *[size];
 int i, j;
 for (i=0; i<size; ++i)
 *(A+i) = new double [size];
Цитата Сообщение от Raikerian Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
cout << "\nИсходная матрица:" << endl;
 for (i=0; i<size; ++i)
 {
 for (j=0; j<size; ++j)
 {
 *(*(A+i)+j) = double (rand()%901+100)/100;
 cout << *(*(A+i)+j) << "\t";
 }
 cout << endl;
 }
Цитата Сообщение от Raikerian Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
double S1 = 0,
 S2 = 0,
 // кол-во элементов по одну из сторон побочной диагонали
 S_num = 0;
 // Находим S1, S2 и кол-во эл-тов
 for (i=0; i<size; ++i)
 for (j=0; j<size; ++j)
 {
 if (i+j<size-1) 
 {
 S1 += *(*(A+i)+j);
 S_num++;
 }
 if (i+j>size-1) S2 += *(*(A+i)+j);
 }
все это можно сделать за один раз с помощью двух циклов:
C++
1
2
 for (i=0; i<size; ++i)
 for (j=0; j<size; ++j)
Raikerian
9 / 9 / 1
Регистрация: 10.05.2011
Сообщений: 101
25.03.2012, 01:10  [ТС]     Работа с элементами над/под побочной диагональю #3
Можешь про совмещение немножко поподробней и с примером?
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
25.03.2012, 08:05     Работа с элементами над/под побочной диагональю #4
Цитата Сообщение от Raikerian Посмотреть сообщение
про совмещение немножко поподробней и с примером?
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
71
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main()
{
        setlocale(LC_ALL, "");
        srand(time(NULL));
        int size;
        cout << "Введите размер квадратной матрицы: ";
        cin >> size;
        double **A = new double *[size];
        cout << "\nИсходная матрица:" << endl;
        double S1 = 0,
                   S2 = 0,
                   // кол-во элементов по одну из сторон побочной диагонали
                   S_num = 0;
        // Находим S1, S2 и кол-во эл-тов
        int i, j;
        for (i=0; i<size; ++i)
        {
                *(A+i) = new double [size];
                for (j=0; j<size; ++j)
                {
                        *(*(A+i)+j) = double (rand()%901+100)/100;
                        cout << *(*(A+i)+j) << "\t";
                        if (i+j<size-1) 
                        {
                                S1 += *(*(A+i)+j);
                                S_num++;
                        }
                        if (i+j>size-1) S2 += *(*(A+i)+j);
                }
                cout << endl;
        }
        cout << "\nS1 = " << S1 << endl
                 << "S2 = " << S2 << endl;
        double S = 0;
        if (S1 < S2) S = S2-S1;
        else S = S1-S2;
        // Находим число, на которое требуется увеличить эл-ты
        S /= S_num;
        cout << "\nПолученная матрица:" << endl;
        // Преобразуем и выводим матрицу на экран
        for (i=0; i<size; ++i)
        {
                for (j=0; j<size; ++j)
                {
                        if (S1<S2) 
                        {
                                if (i+j<size-1) *(*(A+i)+j) += S;
                        }
                        else
                                if (i+j>size-1) *(*(A+i)+j) += S;
                        cout << *(*(A+i)+j) << "\t";
                }
                cout << endl;
        }
        cout << "\nКаждый из элементов";
        if (S1 < S2) cout << " выше ";
        else cout << " ниже ";
        cout << "побочной диагонали увеличен на " << S << endl
                 << "Поздравляем! Теперь суммы элементов выше и ниже побочной диагонали равны."
                 << endl;
        for (i=0; i<size; ++i)
                delete [] A[i];
        delete [] A;
        cin.sync();
        cin.get();
        return 0;
}
Yandex
Объявления
25.03.2012, 08:05     Работа с элементами над/под побочной диагональю
Ответ Создать тему
Опции темы

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