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

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

Войти
Регистрация
Восстановить пароль
 
victory19933
2 / 2 / 0
Регистрация: 24.04.2011
Сообщений: 70
#1

Прокомментируйте программу (программа внутри) - C++

27.11.2012, 23:35. Просмотров 429. Ответов 12
Метки нет (Все метки)

Пожалуйста помогите прокомментить. Для чего нужны вектора ,хоть немного....
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#include <iostream>
#include <iomanip>
#include <fstream>
#include <vector>
#include <cmath>
#include <cassert>
#include <algorithm>
using namespace std;
 
typedef double ld;
const ld pi = 3.14159265358979;
const ld eps = 0.0001;
 
vector <vector<ld> > a, b, c, d;
 
int main()
{
    freopen("input.txt", "rt", stdin);
    freopen("output.txt", "wt", stdout);
    int n;
    cin >> n;
    a = vector<vector<ld> >(n, vector<ld>(n, 0.0));
    b = vector<vector<ld> >(n, vector<ld>(n, 0.0));
    c = vector<vector<ld> >(n, vector<ld>(n, 0.0));
    d = vector<vector<ld> >(n, vector<ld>(n, 0.0));
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cin >> a[i][j];
        }
    }
    for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
    assert(a[i][j] == a[j][i]);
    int k = 0;
    ld t;
    for (int i = 0; i < n; i++)
    c[i][i] = 1;
    do
    {
        int idx, jdx;
        ld maxVal = 0;
        idx = jdx = -1;
        for (int i = 0; i < n; i++)
        {
            for (int j = i + 1; j < n; j++)
            {
                if (fabsl(a[i][j]) > maxVal)
                {
                    idx = i;
                    jdx = j;
                    maxVal = fabsl(a[i][j]);
                }
            }
        }
        ld phi;
        if (fabs(a[idx][idx] - a[jdx][jdx]) < eps)
            phi = pi / 4;
            else
                phi = atan(2 * a[idx][jdx] / (a[idx][idx] - a[jdx][jdx])) / 2;
        ld si = sin(phi);
        ld co = cos(phi);
        for (int v = 0; v < n; v++)
        {
            for (int s = 0; s < n; s++)
            {
                if (s == idx)
                {
                    b[v][s] = a[v][idx] * co + a[v][jdx] * si;
                    d[v][s] = c[v][idx] * co + c[v][jdx] * si;
                    continue;
                }
                if (s == jdx)
                {
                    b[v][s] = -a[v][idx] * si + a[v][jdx] * co;
                    d[v][s] = -c[v][idx] * si + c[v][jdx] * co;
                    continue;
                }
                b[v][s] = a[v][s];
                d[v][s] = c[v][s];
            }
        }
        c = d;
        for (int v = 0; v < n; v++)
        {
            for (int s = 0; s < n; s++)
            {
                if (v == idx)
                {
                    a[v][s] = b[idx][s] * co + b[jdx][s] * si;
                    continue;
                }
                if (v == jdx)
                {
                    a[v][s] = -b[idx][s] * si + b[jdx][s] * co;
                    continue;
                }
                a[v][s] = b[v][s];
            }
        }
        t = 0;
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
            {
                if (i != j)
                t += (a[i][j] * a[i][j]);
            }
            ++k;
    } while (t >= eps);
    cout.precision(7);
    vector <ld> lambdas;
    for (int i = 0; i < n; i++)
    {
        lambdas.push_back(a[i][i]);
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = i + 1; j < n; j++)
        {
            if (lambdas[i] <= lambdas[j])
            {
                swap(lambdas[i], lambdas[j]);
                for (int k = 0; k < n; k++)
                {
                    swap(c[k][i], c[k][j]);
                }
            }
        }
    }
    sort(lambdas.begin(), lambdas.end());
    reverse(lambdas.begin(), lambdas.end());
    for (int i = 0; i < n; i++)
    {
        cout << lambdas[i] << " ";
    }
    cout << endl << endl;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cout << c[j][i] << " ";
        }
        cout << endl;
    }
    return 0;
    system ("pause");
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2012, 23:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Прокомментируйте программу (программа внутри) (C++):

Прокомментируйте программу - C++
void displayMoneyOfFirm() {cout&lt;&lt;MoneyOfFirm&lt;&lt;endl;} }; void Worker::work(float period) { MoneyOfWorker+=2*period; ...

Прокомментируйте программу - C++
#include&quot;iostream&quot; #include&quot;string&quot; using namespace std; int main() {string s, s1, s2; cout&lt;&lt;&quot;Enter string&quot;&lt;&lt;endl; ...

Прокомментируйте программу - C++
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;string&gt; using namespace std; int main() { int n; cout &lt;&lt; &quot;n = &quot;; cin...

Прокомментируйте программу - C++
#include &lt;iostream&gt; using namespace std; int main() { int n; cout&lt;&lt;&quot;n=&quot;; cin&gt;&gt;n; int a; for (int i=0; i&lt;n; ++i) {cout&lt;&lt;&quot;a=&quot;;...

Прокомментируйте программу - C++
Если с можете помагите с этим программой #include &lt;iostream&gt; #include &lt;ctime&gt; using namespace std; class Budilnik { private:...

Прокомментируйте программу на массивы - C++
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;string&gt; using namespace std; int main() { int n; cout &lt;&lt; &quot;n = &quot;; cin...

12
David Sylva
27.11.2012, 23:39
  #2

Не по теме:

Цитата Сообщение от victory19933 Посмотреть сообщение
Прокомментируйте программу
Неплохая программа.Такой комментарий пойдёт?

2
Croessmah
Эксперт CЭксперт С++
13408 / 7558 / 853
Регистрация: 27.09.2012
Сообщений: 18,591
Записей в блоге: 3
Завершенные тесты: 1
28.11.2012, 01:11 #3
Цитата Сообщение от victory19933 Посмотреть сообщение
Для чего нужны вектора ,хоть немного...
Обертка над "динамическим массивом".
1
victory19933
2 / 2 / 0
Регистрация: 24.04.2011
Сообщений: 70
29.11.2012, 00:11  [ТС] #4
Цитата Сообщение от David Sylva Посмотреть сообщение

Не по теме:

Неплохая программа.Такой комментарий пойдёт?

а какая строчка особенно понравилась?))

Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
Обертка над "динамическим массивом".
Тут же не используется динамический массив?..что-то пока не очень понятно
0
ValeryS
Модератор
6651 / 5060 / 470
Регистрация: 14.02.2011
Сообщений: 16,918
29.11.2012, 00:17 #5
Цитата Сообщение от victory19933 Посмотреть сообщение
Тут же не используется динамический массив?.
а вот это по Вашему что?
Цитата Сообщение от victory19933 Посмотреть сообщение
C++
1
a = vector<vector<ld> >(n, vector<ld>(n, 0.0));
Цитата Сообщение от victory19933 Посмотреть сообщение
C++
1
2
3
4
5
6
7
for (int i = 0; i < n; i++)
{
 for (int j = 0; j < n; j++)
 {
    cin >> a[i][j];
 }
 }
в MFC есть такой класс CArray(динамический массив) ужасно похож на вектор я даже уже методы их путаю
пора выбрать уж что то одно
0
Ev[G]eN
iOS/Android Developer
Эксперт С++
5097 / 1535 / 381
Регистрация: 23.01.2011
Сообщений: 3,148
29.11.2012, 00:17 #6
Цитата Сообщение от victory19933 Посмотреть сообщение
а какая строчка особенно понравилась?))
лично мне понравился этот момент
C++
1
2
3
4
5
6
7
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cin >> a[i][j];
        }
    }
но был бы вообще в восторге, если было бы так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    for (int i = 0; i < n; i++)
    {
        {
             {
                 {
                      {
                               for (int j = 0; j < n; j++)
                               {
                                   {
                                        {
                                            {
                                                 {
                                                          cin >> a[i][j];
                                                 }
                                            }
                                        }
                                   }
                               }
                      }
                 }
             }
        }
    }
1
ValeryS
Модератор
6651 / 5060 / 470
Регистрация: 14.02.2011
Сообщений: 16,918
29.11.2012, 00:22 #7
Цитата Сообщение от victory19933 Посмотреть сообщение
assert(a[i][j] == a[j][i]);
вот это вот нехорошо
если элементы не равны вылетаем из программы?
Процедура assert печатает диагностическое сообщение и за-
вершает вызванный процесс, если expression ложно, 0.
0
victory19933
2 / 2 / 0
Регистрация: 24.04.2011
Сообщений: 70
29.11.2012, 12:43  [ТС] #8
Цитата Сообщение от ValeryS Посмотреть сообщение
вот это вот нехорошо
если элементы не равны вылетаем из программы?
да.Это правильно,ведь этот метод нам нужен только, когда матрица симметрическая

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
а вот это по Вашему что?



в MFC есть такой класс CArray(динамический массив) ужасно похож на вектор я даже уже методы их путаю
пора выбрать уж что то одно
аааааа......вот оно что.. я привыкла что динамические массивы с помощью **указателей созд.
а можете помочь переписать к более привычному виду со** (без векторов то есть)
0
ValeryS
Модератор
6651 / 5060 / 470
Регистрация: 14.02.2011
Сообщений: 16,918
29.11.2012, 15:06 #9
Цитата Сообщение от victory19933 Посмотреть сообщение
да.Это правильно,ведь этот метод нам нужен только, когда матрица симметрическая
только пользователю об этом не сказали
Цитата Сообщение от victory19933 Посмотреть сообщение
C++
1
2
3
4
5
6
7
for (int i = 0; i < n; i++)
{
 for (int j = 0; j < n; j++)
 {
  cin >> a[i][j];
 }
}
он тупо вбивает значения и вылетает из программы без всяких уведомлений
не думаю что число поклонников от этого возрастет
надо проверять значения тем же if ом и просить ввести пользователя правильные данные

Добавлено через 26 минут
Цитата Сообщение от victory19933 Посмотреть сообщение
привыкла что динамические массивы с помощью **указателей созд.
Это не динамические массивы, это слабое подобие
Динамические массивы подразумевают под собой изменение размера прямо во время выполнения (например сколько пользователь ввел данных такой и размер)
или есть массив на три элемента нужно расширить его до четырех

что vector что CArray позволяют это делать не заморачиваясь
А при помощи указателей
я должен выделить память на 3 элемента
ввести данные
понять что нужен четвертый элемент
выделить память под 4 элемента скопировать туда из предыдущей памяти 3 элемента
ввести четвертый
удалить предыдущую память
видишь сколько телодвижений вместо одного push_back
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
29.11.2012, 15:20 #10
Цитата Сообщение от ValeryS Посмотреть сообщение
А при помощи указателей
я должен выделить память на 3 элемента
ввести данные
понять что нужен четвертый элемент
выделить память под 4 элемента скопировать туда из предыдущей памяти 3 элемента
ввести четвертый
удалить предыдущую память
видишь сколько телодвижений вместо одного push_back
А вот это не надо! Программисты-создатели STL не использовали каких-то инопланетных технологий, создавая шаблон <vector>!

В векторе при push_back именно что проверяется, осталось ли ещё место в ранее зарезервированной под него памяти и если нет, происходит перераспределение: выделение памяти, копирование и.т.д. Естесственно оно происходит не при каждом пушбеке, но время от времени его внутренний "массив с хвостиком" заканчивается и приходится выделять массив размера n + x позиций и копировать в него.

Так что с вектором ты ничего не выигрываешь. Если нужен выигрышь в динамическом добавлении/удалении элементов, используй список <list>

Добавлено через 5 минут
(но тут будет проигрыш во времени произвольного доступа к элементу)
0
ValeryS
Модератор
6651 / 5060 / 470
Регистрация: 14.02.2011
Сообщений: 16,918
29.11.2012, 15:23 #11
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Так что с вектором ты ничего не выигрываешь
во первых выигрываю по скорости потому что он выделяет память не под один элемент а
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
с хвостиком
во вторых в написании программы
я здесь пишу одну строчку а там должен написать целую функцию
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Программисты-создатели STL не использовали каких-то инопланетных технологий,
никогда этого не утверждал
так же перераспределяют память и так же копируют
но все это скрыто от программиста (эдак мы договоримся до того что зачем библиотеки все можно ручками)

Добавлено через 30 секунд
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
(но тут будет проигрыш во времени произвольного доступа к элементу)
ты со списком не спутал?
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
29.11.2012, 15:38 #12
Цитата Сообщение от ValeryS Посмотреть сообщение
ты со списком не спутал?
ни в коем случае не путал, я именно о нём и говорил, сравнивая вектор и список.
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Так что с вектором ты ничего не выигрываешь. Если нужен выигрыш в динамическом добавлении/удалении элементов, используй список <list>
Добавлено через 5 минут
(но тут будет проигрыш во времени произвольного доступа к элементу)
0
ValeryS
Модератор
6651 / 5060 / 470
Регистрация: 14.02.2011
Сообщений: 16,918
29.11.2012, 15:40 #13
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
ни в коем случае не путал, я именно о нём и говорил.
извини писали одновременно
про <list> я и не приметил
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.11.2012, 15:40
Привет! Вот еще темы с ответами:

Прокомментируйте программу на векторы - C++
#include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;algorithm&gt; #include &lt;cmath&gt; using namespace std; int main () { vector...

Прокомментируйте пожалуста программу - C++
Что то я туплю, как-то все до меня не доходит толком. Прокомментируйте пожалуста программу, вернее два конструктора. Это ведь имено два...

Прокомментируйте мне программу - C++
поясняю...преподаватель сказал нам рассказать как работает программу помогите мне пожалуйста... надо написать каждую строчку что она...

Прокомментируйте программу побитового отрицания - C++
Привет друзья,помогите пож-та разобраться в программе,завтра надо её защитить,рассказать как она работает. Если кому не сложно распишите...


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

Или воспользуйтесь поиском по форуму:
13
Yandex
Объявления
29.11.2012, 15:40
Ответ Создать тему
Опции темы

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