Uploaded by mr.shutterstock89

Курсовой проект

advertisement
3
ВГПК.2-400101. К20. 015 ПЗ
Введение
Матрицей называют прямоугольную таблицу, заполненную числами.
Важнейшие характеристики матрицы – число строк и число столбцов. Если у
матрицы одинаковое число строк и столбцов, ее называют квадратной.
Обозначают матрицы большими латинскими буквами.
Сами числа называют элементами матрицы и характеризуют их положением
в матрице, задавая номер строки и номер столбца и записывая их в виде
двойного индекса, причем вначале записывают номер строки, а затем столбца.
Например, a14 есть элемент матрицы, стоящий в первой строке и четвертом
столбце, a32 стоит в третьей строке и втором столбце.
Главной диагональю квадратной матрицы называют элементы, имеющие
одинаковые индексы, то есть те элементы, у которых номер строки совпадает
с номером столбца. Побочная диагональ идет «перпендикулярно» главной
диагонали.
Особую важность представляют собой так называемые единичные матрицы.
Это квадратные матрицы, у которых на главной диагонали стоят 1, а все
остальные числа равны 0. Обозначают единичные матрицы E. Матрицы
называют равными, если у них равны число строк, число столбцов, и все
элементы,
имеющие
одинаковые
индексы,
равны.
Матрица
называется нулевой, если все ее элементы равны 0. Обозначается нулевая
матрица О.
4
ВГПК.2-400101. К20. 015 ПЗ
1. ИССЛЕДОВАНИЕ ПРЕДМЕТНОЙ ОБЛАСТИ
1.1. Простейшие действия с матрицами
1. Умножение матрицы на число. Для этого необходимо умножить каждый
элемент матрицы на данное число.
2. Сложение матриц. Складывать можно только матрицы одинакового
размера, то есть имеющие одинаковое число строк и одинаковое число
столбцов. При сложении матриц соответствующие их элементы
складываются.
3. Транспонирование матрицы. При транспонировании у матрицы строки
становятся столбцами и наоборот. Полученная матрица называется
транспонированной и обозначается AT. Для транспонирования матриц
справедливы следующие свойства:
4. Умножение матриц. Для произведения матриц существуют следующие
свойства:




Умножать можно матрицы, если число столбцов первой матрицы равно
числу строк второй матрицы.
В результате получится матрица, число строк которой равно числу строк
первой матрицы, а число столбцов равно числу столбцов второй матрицы.
Умножение матриц некоммутативно. Это значит, что от перестановки
местами матриц в произведении результат меняется. Более того, если
можно посчитать произведение A∙B, это совсем не означает, что можно
посчитать произведение B∙A.
Пусть C = A∙B. Для определения элемента матрицы С, стоящего в i-той
строке и k-том столбце необходимо взять i-тую строку первой умножаемой
матрицы и k-тый столбец второй. Далее поочередно брать элементы этих
строки и столбца и умножать их. Берем первый элемент из строки первой
матрицы и умножаем на первый элемент столбца второй матрицы. Далее
берем второй элемент строки первой матрицы и умножаем на второй
элемент столбца второй матрицы и так далее. А потом все эти произведения
надо сложить.
5
ВГПК.2-400101. К20. 015 ПЗ
Свойства произведения матриц:
Определитель матрицы
Определителем (детерминантом) квадратной матрицы А называется число,
которое обозначается detA, реже |A| или просто Δ, и вычисляется
определённым образом. Для матрицы размера 1х1 определителем является сам
единственный элемент матрицы. Для матрицы размера 2х2 определитель
находят по следующей формуле:
Миноры и алгебраические дополнения
Рассмотрим матрицу А. Выберем в ней s строк и s столбцов. Составим
квадратную матрицу из элементов, стоящих на пересечении полученных строк
и столбцов. Минором матрицы А порядка s называют определитель
полученной матрицы.
Рассмотрим
квадратную
матрицу
А.
Выберем
в
ней s строк
и s столбцов. Дополнительным минором к минору порядка s называют
определитель, составленный из элементов, оставшихся после вычеркивания
данных строк и столбцов.
Алгебраическим дополнением к элементу aik квадратной матрицы А
называют дополнительный минор к этому элементу, умноженный на (–1)i+k,
где i+k есть сумма номеров строки и столбца элемента aik. Обозначают
алгебраическое дополнение Aik.
Вычисление определителя матрицы через алгебраические дополнения
Рассмотрим квадратную матрицу А. Для вычисления ее определителя
необходимо выбрать любую ее строку или столбец и найти произведения
каждого элемента этой строки или столбца на алгебраическое дополнение к
нему. А дальше надо просуммировать все эти произведения.
6
ВГПК.2-400101. К20. 015 ПЗ
Когда будете считать алгебраические дополнения, не забывайте про
множитель (–1)i+k. Чтобы счет был более простым, выбирайте ту строку или
столбец матрицы, который содержит наибольшее число нулей.
Расчет алгебраического дополнения может сводиться к расчету определителя
размером более чем 2х2. В этом случае такой расчет также нужно проводить
через алгебраические дополнения, и так далее до тех пор, пока алгебраические
дополнения, которые нужно будет считать, не станут размером 2х2, после чего
воспользоваться формулой выше.
Обратная матрица
Рассмотрим квадратную матрицу А. Матрица A–1 называется обратной к
матрице А, если их произведения равны единичной матрице. Обратная
матрица существует только для квадратных матриц. Обратная матрица
существует, только если матрица А невырождена, то есть ее определитель не
равен нулю. В противном случае обратную матрицу посчитать
невозможно. Для построения обратной матрицы необходимо:
1. Найти определитель матрицы.
2. Найти алгебраическое дополнение для каждого элемента матрицы.
3. Построить матрицу из алгебраических дополнений и обязательно
транспонировать ее. Часто про транспонирование забывают.
4. Разделить полученную матрицу на определитель исходной матрицы.
Таким образом, в случае, если матрица А имеет размер 3х3, обратная к ней
матрица имеет вид:
7
ВГПК.2-400101. К20. 015 ПЗ
1.2.
Анализ аналогов
Нахождение минимального и максимального элемента массива
// https://nicknixer.ru/programmirovanie/najti-maksimalnyj-i-minimalnyj-element-massiva-na-c/
Для начала нужно подключить заголовок ввода/вывода <iostream>,
заголовок стандартных функций <cstdlib> в ней имеется функция rand(),
которая позволит заполнить массив случайными числами. Заполнение
каждого элемента массива вручную требует времени, его можно сэкономить
автоматизировав процесс. Подключаем пространство имён std. Создаём
константу N, она будет определять количество элементов в массиве.
В теле функции main() инициализируем массив целых чисел
из N лементов, целочисленные переменные max и min, они будут хранить
значение максимального и минимального элементов массива соответственно.
Теперь заполним массив случайными числами. Для этого используем
цикл от 0 до N (не включительно), который пройдется по каждому элементу
массива и поместит случайное значение от 0 до 98. Это можно сделать,
использовав функцию rand(), которая возвращает случайное число. Поделить
возвращаемое значение на 99 и внести в ячейку остаток от деления, таким
образом значение ячейки будет иметь значение в диапазоне от 0 до 99(не
включая 99, т.к. остаток от деления не может быть кратным делителю). При
этом выведем значения элементов массива на экран.
Далее определим максимальный и минимальный элемент в массиве, для
этого вновь пройдемся по массиву циклом. При помощи условия определим
максимальный и минимальный элемент массива.
Перед циклом нужно будет занести первый элемент массива в
переменные min и max, они будут хранить минимальное и максимальное
значение изначально, а во время цикла поменяют его, если найдётся значение
меньше для min или больше для max.
После цикла выведем значения min и max.
После компиляции и запуска прогамма выводит следующее
Пробегаемся по элементам массива глазами и видим, что минимальное
значение — 1, а максимальное — 79. Переменные min и max имеют эти же
значения соответственно, следовательно алгоритм работает.
C++Выделить код
1
2
#include
<iostream>
8
ВГПК.2-400101. К20. 015 ПЗ
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
#include
<cstdlib>
using namespace
std;
const int N =
10;
int main()
{
int
mass[N], max,
min;
cout <<
"Элементы: |";
for(int r =
0; r<N; r++)
{
mass[r]
= rand()%99;
cout <<
mass[r] << "|";
}
cout <<
endl;
max =
mass[0];
min =
mass[0];
for(int r =
1; r<N; r++)
{
if(max
< mass[r]) max
= mass[r];
if(min
> mass[r]) min
= mass[r];
}
cout <<
"Min: " << min
<< endl;
cout <<
"Max: " << max
<< endl;
9
ВГПК.2-400101. К20. 015 ПЗ
return 0;
}
10
ВГПК.2-400101. К20. 015 ПЗ
2. ПРОЕКТИРОВАНИЕ И РЕАЛИЗАЦИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
2.1. Функционал ПО
Разрабатываемое ПО имеет возможность вести диалог с пользователем на базе
вопросов с вариантами ответов. По типу “Как вы хотите заполнять матрицу ? 0 – из файла;
1- с клавиатуры; 2 – рандомно ?” Вводимое пользователем число решает в каком режиме
будет работать программа. Так же будет функция подсчёта сумм строк и поиска
минимальной суммы. И вывода той строки сумма которой минимальна. Так же
присутствует функция обмена местами максимального элемента главной диагонали и
минимального элемента побочной диагонали. Вывод их позиций на экран. Присутствует
вывод изменённой матрицы на экран. Функция сохранения результатов выполнения
программы в текстовый файл.
2.2. Выбор средств разработки
Данный проект реализован в среде Visual Studio. Функциональная структура среды
включает в себя:
 редактор исходного кода, который включает множество дополнительных функций,
как автодополнение, рефракторинг кода и т. д.;
 отладчик кода;
 редактор форм, веб-редактор;
 дизайнер классов;
 дизайнер схем баз данных.
Visual Studio также позволяет создавать и подключать сторонние дополнения
(плагины) для расширения функциональности практически на каждом уровне, включая
добавление поддержки систем контроля версий исходного кода
Эта среда имеет множество достоинств, благодаря которым очень удобна в
использовании. По умолчанию Visual Studio форматирует код по мере его ввода,
автоматически вставляя необходимые отступы и применяя цветовое кодирование для
выделения элементов типа комментариев. Такие незначительные отличия делают код более
удобным для чтения и менее подверженным ошибкам. Имеет удобные функции, вроде
функции IntelliSense (которая умеет перехватывать ошибки и предлагать правильные
варианты), функции поиска и замены (которая позволяет отыскивать ключевые слова как в
одном файле, так и во всем проекте) и функции автоматического добавления и удаления
комментариев (которая может временно скрывать блоки кода), позволяют разработчику
работать быстро и эффективно. Visual Studio также имеет и множество других функций:
возможность управления проектом; встроенная функция управления исходным кодом;
возможность рефакторизации кода; мощная модель расширяемости.
11
ВГПК.2-400101. К20. 015 ПЗ
2.3. Алгоритм ПО
При запуске разработанного алгоритма программа начинает диалог с пользователем с
вопроса “ Как вы хотите заполнять матрицу? 0 - из файла; 1 - в ручную; 2 - рандомно: ”
При вводе соответствующей цифры (запись флаговой переменной number) благодаря
конструкции (switch case) запускаются нужные алгоритмы заполнение матрицы в ручную,
из файла или рандомно соответственно.
Рисунок 1.1. – Конструкция Switch-case режим запись из файла
После заполнение матрицы программа начинает её соответственно обробатывать. Далее
выполняется алгоритм поиска минимальной суммы каждой из строк заполняется массив
этих сумм.
Рисунок 1.2. – Алгоритм заполнения массива сумм каждой строки
12
ВГПК.2-400101. К20. 015 ПЗ
После чего выполняется поиск самой минимальной суммы массива этих сумм и
соответственно её вывод и вывод той строки. (Рисунок 1.2.)
Дальше идёт поиск максимального элемента по главной диагонали вывод этого элемента,
а так же её позиции. (Рисунок 2.1.)
Рисунок 2.2. – Алгоритм поиска максимального элемента главной диагонали
Далее поиск минимального элемента побочной диагонали его вывода, а так же его
позиции. (Рисунок 2.3.)
Рисунок 2.3. – Алгоритм поиска минимального элемента побочной диагонали
13
ВГПК.2-400101. К20. 015 ПЗ
Функция обмена их местами и вывода изменённой матрицы. (Рисунок 3.1)
Рисунок 3.1. – Алгоритм обмена местами максимального и минимально элемента
Далее идёт диалоговый вопрос к пользователю “Записывать изменённую матрицу и не
изменённую минимальную строку матрици ? 0 - Да; 1 - Нет:” При выборе
соответствующий цифры алгоритм записи результата выполнения программы в текстовый
файл выполняется или не выполняется.
14
ВГПК.2-400101. К20. 015 ПЗ
3. ПРИМЕР РАБОТЫ ПРОГРАММНОГО ПРОДУКТА
При запуске разработанного алгоритма программа начинает диалог с пользователем с
вопроса “ Как вы хотите заполнять матрицу? 0 - из файла; 1 - в ручную; 2 - рандомно: ”
При вводе соответствующей цифры запускаются нужные алгоритмы заполнение матрицы
в ручную, из файла или рандомно соответственно. После заполнение матрицы программа
начинает её соответственно обробатывать. Далее выполняется алгоритм поиска
минимальной суммы каждой из строк заполняется массив этих сумм. После чего
выполняется поиск самой минимальной суммы массива этих сумм и соответственно её
вывод и вывод той строки. Дальше идёт поиск максимального элемента по главной
диагонали вывод этого элемента, а так же её позиции. Далее поиск минимального
элемента побочной диагонали его вывода, а так же его позиции. Функция обмена их
местами и вывода изменённой матрицы. Далее идёт диалоговый вопрос к пользователю
“Записывать изменённую матрицу и не изменённую минимальную строку матрици ? 0 Да; 1 - Нет:” При выборе соответствующий цифры алгоритм записи результата
выполнения программы в текстовый файл выполняется или не выполняется.
Рисунок 4.1. – Конструкция Switch-case режим запись из файла
15
ВГПК.2-400101. К20. 015 ПЗ
ЗАКЛЮЧЕНИЕ
В процессе разработки программы для выполнения курсового проекта были
углублены знания программы «Visual Studio» и во многих её конструкции. Также были
найдены и проанализированы аналоги видов данной программы в интернете.
Поставленные задачи проекта были реализованы:
1. Исследована предметная область
2. Спроектирован программный продукт
3. Реализован программный продукт на языке C#
4. Проверена работоспособность программного продукта
5. Протестирован программный продукт.
16
ВГПК.2-400101. К20. 015 ПЗ
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
17
ВГПК.2-400101. К20. 015 ПЗ
ПРИЛОЖЕНИЕ А
ЛИСТИНГ ПРОГРАММЫ
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
#include <fstream>
#include <iostream>
#include <stdlib.h>
#include <cassert>
using namespace std;
int main()
{
setlocale(LC_ALL, "RUSSIAN");
cout << "Как вы хотите заполнять матрицу? 0 - из файла;
1 - в ручную; 2 - рандомно: ";
int number;
cin >> number;
switch (number) {
case 0: {
//Создаем файловый поток и связываем его с файлом
ifstream in("input.txt");
if (in.is_open())
{
//Если открытие файла прошло успешно
//Вначале посчитаем сколько чисел в файле
int count = 0;// число чисел в файле
double temp;//Временная переменная
while (!in.eof())// пробегаем пока не встретим
конец файла eof
{
in >> temp;//в пустоту считываем из файла
числа
count++;// увеличиваем счетчик числа чисел
}
//Число чисел посчитано, теперь нам нужно
понять сколько
//чисел в одной строке
18
ВГПК.2-400101. К20. 015 ПЗ
C++
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
//Для этого посчитаем число пробелов до знака
перевода на новую строку
//Вначале переведем каретку в потоке в начало
файла
in.seekg(0, ios::beg);
in.clear();
//Число пробелов в первой строчке вначале равно
0
int count_space = 0;
char symbol;
while (!in.eof())//на всякий случай цикл
ограничиваем концом файла
{
//теперь нам нужно считывать не числа, а
посимвольно считывать данные
in.get(symbol);//считали текущий символ
if (symbol == ' ') count_space++;//Если это
пробел, то число пробелов увеличиваем
if (symbol == '\n') break;//Если дошли до
конца строки, то выходим из цикла
}
//cout << count_space << endl;
//Опять переходим в потоке в начало файла
in.seekg(0, ios::beg);
in.clear();
//Теперь мы знаем сколько чисел в файле и
сколько пробелов в первой строке.
//Теперь можем считать матрицу.
int n = count / (count_space + 1);//число строк
int m = count_space + 1;//число столбцов на
единицу больше числа пробелов
double** x;
x = new double* [n];
for (int i = 0; i < n; i++)
x[i] = new double[m];
double* sum = new double[n];
for (int i = 0; i < n; i++) {
sum[i] = 0;
}
19
ВГПК.2-400101. К20. 015 ПЗ
C++
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
//Считаем матрицу из файла
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++) {
in >> x[i][j];
sum[i] += x[i][j];
}
double min_sum = 999999999999;
int num_str_min_sum = 0;
for (int i = 0; i < n; i++) {
if (sum[i] < min_sum) {
min_sum = sum[i];
num_str_min_sum = i;
}
}
cout << "\n" << "Минимальная сумма " <<
min_sum;
// Поиск минимальной суммы
// Вывод минимальной строки
cout << "\n";
cout << "Вывод минимальной строки";
cout << "\n";
for (int j = 0; j < n; j++) {
cout << x[num_str_min_sum][j] << "\t";
}
cout << "\n";
// Вывод минимальной строки
//Выведем матрицу
double max = x[0][0];
int pos_i_max = 0;
int pos_j_max = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++) {
cout << x[i][j] << "\t";
if (i == j) {
if (x[i][j] > max) {
20
ВГПК.2-400101. К20. 015 ПЗ
C++
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
max = x[i][j];
pos_i_max = i;
pos_j_max = j;
}
}
}
cout << "\n";
}
// Поиск минимального элемента по побочной
диагонали
double min = x[n - 1][0];
int pos_i_min = n - 1;
int pos_j_min = 0;
for (int i = 0; i < n - 1; i++) {
if (min > x[i][n - 1 - i]) {
min = x[i][n - 1 - i];
pos_i_min = i;
pos_j_min = (n - 1 - i);
}
}
// Поиск минимального элемента по побочной
диагонали
// Вывод минимального и макимального элемента
матрици
cout << "\n";
cout << max << " <-- Максимальный элемент
матрици главной диагонали ";
cout << "\n";
cout << min << " <-- Минимальный элемент
матрици побочной диагонали ";
cout << "\n";
// Вывод минимального и макимального элемента
матрици
cout << "\n";
// обмен местами
диагонали квадратной матрицы
побочной диагонали
cout << "Позиция
главноей д. " << pos_i_max +
1 << " столбец ";
cout << "\n";
максимального элемента главной
и минимального элемента
максимального элемента
1 << " строка " << pos_j_max +
21
ВГПК.2-400101. К20. 015 ПЗ
C++
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
cout << "Позиция минимального элемента побочной
д. " << pos_i_min + 1 << " строка " << pos_j_min + 1 << "
столбец ";
cout << "\n";
// обмен местами максимального элемента главной
диагонали квадратной матрицы и минимального элемента
побочной диагонали
x[pos_i_max][pos_j_max] = min;
x[pos_i_min][pos_j_min] = max;
// обмен местами максимального элемента главной
диагонали квадратной матрицы и минимального элемента
побочной диагонали
cout << "\n" << "Матрица после обмена местами
максимального элемента главной д. и минимального элемента
побочной д.";
cout << "\n";
// Вывод матрици после обмена местами элементов
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++) {
cout << x[i][j] << "\t";
}
cout << "\n";
}
// Вывод матрици после обмена местами элементов
cout << "\n";
int number2;
cout << "Записывать изменённую матрицу и не
изменённую минимальную строку матрици ? 0 - Да; 1 - Нет: ";
cin >> number2;
if (number2 == 0) {
ofstream os("output.txt"); // текстовый
файл для вывода
22
ВГПК.2-400101. К20. 015 ПЗ
C++
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
// проверка, открыт ли файл
if (!os)
{
cout << "Cannot open the file to
output. \n";
}
else {
cout << "Запись прошла успешно. \n";
}
os << "Изменённая матрица: ";
os << "\n";
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++) {
os << x[i][j] << "\t";
}
os << "\n";
}
os << "\n";
os << "Строка минимальной суммы: ";
os << "\n";
x[pos_i_max][pos_j_max] = max;
x[pos_i_min][pos_j_min] = min;
for (int j = 0; j < n; j++) {
os << x[num_str_min_sum][j] << "\t";
}
os.close(); // закрыть файл
}
for (int i = 0; i < n; i++) delete[] x[i];
delete[] x;
in.close();//под конец закроем файла
23
ВГПК.2-400101. К20. 015 ПЗ
C++
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
}
else
{
//Если открытие файла прошло не успешно
cout << "Файл не найден.";
}
break;
}
case 1: {
// объявление матрици
cout << "Введите число строк и столбцов ";
int n;
cin >> n;
double** x1;
x1 = new double* [n];
for (int i = 0; i < n; i++)
x1[i] = new double[n];
// объявление матрици
// Заполнение матрици и подсчёт суммы каждой её
строк
double* sum = new double[n];
for (int i = 0; i < n; i++) {
sum[i] = 0;
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> x1[i][j];
sum[i] += x1[i][j];
cout << i + 1 << " строка " << j + 1 << "
столбец элемент = " << x1[i][j] << "\n";
}
}
// Заполнение матрици и подсчёт суммы каждой её
строк
// Поиск минимальной суммы
24
ВГПК.2-400101. К20. 015 ПЗ
C++
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
double min_sum = 999999999999;
int num_str_min_sum = 0;
for (int i = 0; i < n; i++) {
if (sum[i] < min_sum) {
min_sum = sum[i];
num_str_min_sum = i;
}
}
cout << "\n" << "Минимальная сумма " << min_sum;
// Поиск минимальной суммы
// Вывод минимальной строки
cout << "\n";
cout << "Вывод минимальной строки";
cout << "\n";
for (int j = 0; j < n; j++) {
cout << x1[num_str_min_sum][j] << "\t";
}
// Вывод минимальной строки
// Поиск максимального элемента по главной
диагонали
// Вывод матрици
cout << "\n" << "Ввывод вашей введённой матрици";
cout << "\n";
double max = x1[0][0];
int pos_i_max = 0;
int pos_j_max = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++) {
cout << x1[i][j] << "\t";
if (i == j) {
if (x1[i][j] > max) {
max = x1[i][j];
pos_i_max = i;
pos_j_max = j;
}
}
25
ВГПК.2-400101. К20. 015 ПЗ
C++
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
}
cout << "\n";
}
// Вывод матрици
// Поиск максимального элемента по главной
диагонали
// Поиск минимального элемента по побочной
диагонали
double min = x1[n - 1][0];
int pos_i_min = n - 1;
int pos_j_min = 0;
for (int i = 0; i < n - 1; i++) {
if (min > x1[i][n - 1 - i]) {
min = x1[i][n - 1 - i];
pos_i_min = i;
pos_j_min = (n - 1 - i);
}
}
// Поиск минимального элемента по побочной
диагонали
// Вывод минимального и макимального элемента
матрици
cout << "\n";
cout << max << " <-- Максимальный элемент матрици
главной диагонали ";
cout << "\n";
cout << min << " <-- Минимальный элемент матрици
побочной диагонали ";
cout << "\n";
// Вывод минимального и макимального элемента
матрици
// обмен местами максимального элемента главной
диагонали квадратной матрицы и минимального элемента
побочной диагонали
x1[pos_i_max][pos_j_max] = min;
x1[pos_i_min][pos_j_min] = max;
26
ВГПК.2-400101. К20. 015 ПЗ
C++
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
// обмен местами максимального элемента главной
диагонали квадратной матрицы и минимального элемента
побочной диагонали
cout << "\n" << "Матрица после обмена местами
максимального элемента главной д. и минимального элемента
побочной д.";
cout << "\n";
// Вывод матрици после обмена местами элементов
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++) {
cout << x1[i][j] << "\t";
}
cout << "\n";
}
// Вывод матрици после обмена местами элементов
int number2;
cout << "Записывать изменённую матрицу и не
изменённую минимальную строку матрици ? 0 - Да; 1 - Нет: ";
cin >> number2;
if (number2 == 0) {
ofstream os("output.txt"); // текстовый файл
для вывода
// проверка, открыт ли файл
if (!os)
{
cout << "Cannot open the file to output.
\n";
}
else {
cout << "Запись прошла успешно. \n";
}
os << "Изменённая матрица: ";
os << "\n";
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++) {
os << x1[i][j] << "\t";
27
ВГПК.2-400101. К20. 015 ПЗ
C++
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
}
os << "\n";
}
os << "\n";
os << "Строка минимальной суммы: ";
os << "\n";
x1[pos_i_max][pos_j_max] = max;
x1[pos_i_min][pos_j_min] = min;
for (int j = 0; j < n; j++) {
os << x1[num_str_min_sum][j] << "\t";
}
os.close(); // закрыть файл
}
cout << "\n";
}
break;
case 2:
{
// объявление матрици
cout << "Введите число строк и столбцов ";
int n;
cin >> n;
double** x1;
x1 = new double* [n];
for (int i = 0; i < n; i++)
x1[i] = new double[n];
// объявление матрици
// Заполнение матрици и подсчёт суммы каждой её
строк
double* sum = new double[n];
for (int i = 0; i < n; i++) {
sum[i] = 0;
28
ВГПК.2-400101. К20. 015 ПЗ
C++
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
x1[i][j] = (rand() % 101 - 50) / 10.0;
sum[i] += x1[i][j];
cout << i + 1 << " строка " << j + 1 << "
столбец элемент = " << x1[i][j] << "\n";
}
}
// Заполнение матрици и подсчёт суммы каждой её
строк
// Поиск минимальной суммы
double min_sum = 999999999999;
int num_str_min_sum = 0;
for (int i = 0; i < n; i++) {
if (sum[i] < min_sum) {
min_sum = sum[i];
num_str_min_sum = i;
}
}
cout << "\n" << "Минимальная сумма " << min_sum;
// Поиск минимальной суммы
// Вывод минимальной строки
cout << "\n";
cout << "Вывод минимальной строки";
cout << "\n";
for (int j = 0; j < n; j++) {
cout << x1[num_str_min_sum][j] << "\t";
}
// Вывод минимальной строки
29
ВГПК.2-400101. К20. 015 ПЗ
C++
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
// Поиск максимального элемента по главной
диагонали
// Вывод матрици
cout << "\n" << "Ввывод вашей введённой матрици";
cout << "\n";
double max = x1[0][0];
int pos_i_max = 0;
int pos_j_max = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++) {
cout << x1[i][j] << "\t";
if (i == j) {
if (x1[i][j] > max) {
max = x1[i][j];
pos_i_max = i;
pos_j_max = j;
}
}
}
cout << "\n";
}
// Вывод матрици
// Поиск максимального элемента по главной
диагонали
// Поиск минимального элемента по побочной
диагонали
double min = x1[n - 1][0];
int pos_i_min = n-1;
int pos_j_min = 0;
for (int i = 0; i < n - 1; i++) {
if (min > x1[i][n - 1 - i]) {
min = x1[i][n - 1 - i];
pos_i_min = i;
pos_j_min = (n - 1 - i);
}
}
// Поиск минимального элемента по побочной
диагонали
30
ВГПК.2-400101. К20. 015 ПЗ
C++
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
// Вывод минимального и макимального элемента
матрици
cout << "\n";
cout << max << " <-- Максимальный элемент матрици
главной диагонали ";
cout << "\n";
cout << min << " <-- Минимальный элемент матрици
побочной диагонали ";
cout << "\n";
// Вывод минимального и макимального элемента
матрици
cout << "\n";
// обмен местами максимального элемента главной
диагонали квадратной матрицы и минимального элемента
побочной диагонали
cout << "Позиция максимального элемента главноей д.
" << pos_i_max+1 << " строка " << pos_j_max+1 << " столбец
";
cout << "\n";
cout << "Позиция минимального элемента побочной д.
" << pos_i_min+1 << " строка " << pos_j_min+1 << " столбец
";
cout << "\n";
x1[pos_i_max][pos_j_max] = min;
x1[pos_i_min][pos_j_min] = max;
// обмен местами максимального элемента главной
диагонали квадратной матрицы и минимального элемента
побочной диагонали
cout << "\n" << "Матрица после обмена местами
максимального элемента главной д. и минимального элемента
побочной д.";
cout << "\n";
// Вывод матрици после обмена местами элементов
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++) {
cout << x1[i][j] << "\t";
}
cout << "\n";
}
31
ВГПК.2-400101. К20. 015 ПЗ
C++
// Вывод матрици после обмена местами элементов
int number2;
cout << "Записывать изменённую матрицу и не
изменённую минимальную строку матрици ? 0 - Да; 1 - Нет: ";
cin >> number2;
if (number2 == 0) {
ofstream os("output.txt"); // текстовый файл
для вывода
// проверка, открыт ли файл
if (!os)
{
cout << "Cannot open the file to output.
\n";
}
else {
cout << "Запись прошла успешно. \n";
}
os << "Изменённая матрица: ";
os << "\n";
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++) {
os << x1[i][j] << "\t";
}
os << "\n";
}
os << "\n";
os << "Строка минимальной суммы: ";
os << "\n";
x1[pos_i_max][pos_j_max] = max;
x1[pos_i_min][pos_j_min] = min;
for (int j = 0; j < n; j++) {
os << x1[num_str_min_sum][j] << "\t";
}
32
ВГПК.2-400101. К20. 015 ПЗ
C++
os.close(); // закрыть файл
}
cout << "\n";
}
break;
default:
cout << "Вы ввели не допустимое значение.
Перепроверьте входные данные!";
break;
}
system("pause");
return 0;
}
Download