Разработка программы проверки свойств квадратной матрицы
Нахождение обратной матрицы с помощью метода алгебраических дополнений. Схемы алгоритмов, процедур FreeMem, PrintMtx, SetMtx, TransponMtx, Getmatr, Multiplication и Cid, функции Det. Отладка оптимизация и тестирование программы в различных условиях.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 19.01.2019 |
Размер файла | 2,5 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Министерство образования и науки Российской Федерации
Федерального государственного бюджетного образовательного учреждения высшего образования
«Московский государственный технический университет имени Н.Э. Баумана» (национальный исследовательский университет)
Московский техникум космического приборостроения
Специальность 09.02.03 Программирование в компьютерных системах
пояснительная записка
к курсовому проекту на тему:
Разработка программы проверки свойств квадратной матрицы
Студент Е.А. Панарин
Москва 2018
Содержание
- Введение
- 1. Постановка задачи
- 1.1 Метод алгебраических дополнений
- 2. Структура программы
- 3. Схемы алгоритма программы
- 4. Отладка программы
- 5. Оптимизация программы
- 6. Тестирование программы
- 6.1 Тестирование в нормальных условиях
- 6.2 Тестирование в экстремальных условиях
- 6.3 Тестирование в исключительных ситуациях
- 7. Руководство пользователя
- Заключение
- Список использованных источников
- Приложение
Введение
Матрица -- математический объект, записываемый в виде прямоугольной таблицы элементов кольца или поля (например, целых, действительных или комплексных чисел), которая представляет собой совокупность строк и столбцов, на пересечении которых находятся её элементы. Количество строк и столбцов задает размер матрицы. Хотя исторически рассматривались, например, треугольные матрицы[1], в настоящее время говорят исключительно о матрицах прямоугольной формы, так как они являются наиболее удобными и общими.
Единичная матрица -- квадратная матрица, элементы главной диагонали которой равны единице поля, а остальные равны нулю.
Обратная матрица -- такая матрица A?1, при умножении на которую исходная матрица A даёт в результате единичную матрицу E: A x A-1=A-1xA=E
Квадратная матрица обратима тогда и только тогда, когда она невырожденная, то есть её определитель не равен нулю. Для неквадратных матриц и вырожденных матриц обратных матриц не существует. Однако, возможно обобщить это понятие и ввести псевдо-обратные матрицы, похожие на обратные по многим свойствам.
Понятие обратной матрицы вводится для квадратных матриц, определитель которых отличен от нуля, то есть для невырожденных квадратных матриц.
Матрица A?1 называется обратной для A = ||aij || I = 1,2,…,n, j = 1,2,…,n матрицы , определитель которой отличен от нуля , если справедливы равенства A x A-1=A-1xA=E , где E - единичная матрица порядка n х n.
Существуют методы нахождения обратной матрицы:
Нахождение обратной матрицы в данном проекте производится с помощью метода алгебраических дополнений.
Алгебраическое дополнение элемента -- это коэффициент, с которым этот самый элемент входит в определитель матрицы. Это утверждается следующей теоремой:
Теорема (о разложении определителя по строке/столбцу). Определитель матрицы, может быть представлен в виде суммы
Существуют альтернативные методы нахождения обратной матрицы:
Метод Жордана - Гасусса. Суть метода Жордана - Гасусса заключается в том, что если с единичной матрицей Епровести элементарные преобразованиия, которыми невырожденная квадратная матрица А приводится к Е, то получится обратная матрица.
Так же существует метод Нахождение обратной матрицы для квадратной матрицы А порядка n х n с помощью решения соответствующих систем линейных алгебраических уравнений. Этот метод основан на решении n систем линейных неоднородных алгебраических уравнений с n неизвестными. Неизвестными переменными в этих системах уравнений являются элементы обратной матрицы. В данном курсовом проекте для проверки свойств квадратной матрицы будет использован метод алгебраических дополнений, который будет описан в постановке задачи.
1. Постановка задачи
Целью разработки курсового проекта является написание программы по теме: «Проверка свойств квадратной матрицы», с помощью матрицы из алгебраических дополнений; A x A-1=E, где E - единичная матрица.
1.1 Метод алгебраических дополнений
Для нахождения обратной матрицы с помощью матрицы из алгебраических дополнений, следует ввести понятия транспонированной матрицы, минора матрицы и алгебраического дополнения элемента матрицы.
Минор k-ого порядка матрицы A порядка m х n - это определитель матрицы порядка k х k, которая получается из элементов матрицы А, находящихся в выбранных k строках и k столбцах. (k не превосходит наименьшего из чисел m или n).
Минор (n-1)-ого порядка, который составляется из элементов всех строк, кроме i-ой, и всех столбцов, кроме j-ого, квадратной матрицы А порядка n на n обозначим как Mij. Иными словами, минор Mij получается из квадратной матрицы А порядка n на n вычеркиванием элементов i-ой строки и j-ого столбца.
Для примера запишем, минор 2-ого порядка, который получается из матрицы выбором элементов ее второй, третьей строк и первого, третьего столбцов . Также покажем минор, который получается из матрицы вычеркиванием второй строки и третьего столбца
Проиллюстрируем построение этих миноров: и .
Программа должна быть написана на C++.
C++ - чрезвычайно мощный язык, содержащий средства создания эффективных программ практически любого назначения, от низкоуровневых утилит и драйверов до сложных программных комплексов самого различного назначения.
Преимущества языка C++:
- Высокая совместимость с языком С, позволяющая использовать весь существующий С - код (код С может быть с минимальными переделками скомпилирован компилятором С++; библиотеки, написанные на С, обычно могут быть вызваны из С++ непосредственно без каких-либо дополнительных затрат, в том числе и на уровне функций обратного вызова, позволяя библиотекам, написанным на С, вызывать код, написанный на С++).
- Поддерживаются различные стили и технологии программирования, включая традиционное директивное программирование, ООП, обобщенное программирование (шаблоны, макросы).
- Имеется возможность работы на низком уровне с памятью, адресами, портами.
- Возможность создания обобщённых контейнеров и алгоритмов для разных типов данных, их специализация и вычисления на этапе компиляции, используя шаблоны.
- Кроссплатформенность. Доступны компиляторы для большого количества платформ, на языке C++ разрабатывают программы для самых различных платформ и систем.
- Эффективность. Язык спроектирован так, чтобы дать программисту максимальный контроль над всеми аспектами структуры и порядка исполнения программы.
Ввиду выше перечисленных фактов о языке C++, играющих важную роль при разработке любого ПО, а также благодаря множеству надежных и проверенных временем библиотек, которые имеются в наличие у данного языка, для решения поставленной задачи был выбран С++.
2. Структура программы
На рисунке 2.1 представлена структура программы.
Рисунок 2.1 - Структура программы
Подпрограммы, используемые в основной программе, приведены в таблице 2.1.
Таблица 2.1
Функция |
Назначение |
|
FreeMem |
Очистка памяти после выполнения программы |
|
PrintMtx |
Печать матриц получаемых в ходе работы программы |
|
SetMtx |
Заполнения матрицы |
|
TransponMtx |
Транспонирование матрицы |
|
Get_matr |
Получение обратной матрицы |
|
Det |
Вычисление определителя вводимой матрицы |
|
multiplication |
Умножение изначальной матрицы на обратную с целью получения единичной матрицы |
|
cid |
Проверка любых вводимых значений в программе с целью избежать ошибок или непредвиденной остановки работы программы |
|
setcolor |
Выделение выделения цветом важных сообщений программы |
Переменные, используемые в основной программе, приведены в таблице 2.2
Таблица 2.2
Переменная |
Назначение |
|
n |
Размерность матриц |
|
check |
Определения условий проверки вводимых значений |
|
det |
Хранение определителя матрицы |
|
nn |
Проверочное значение для размерности матриц |
|
Position.x |
Положение курсора на оси Х |
|
Position.y |
Положение курсора на оси У |
|
matr |
Вводимая пользователем матрица |
|
Obr_matr |
Обратная матрицы |
|
Tobr_matr |
Транспонированная обратная матрицы |
|
c |
Конечная матрица поле умножения изначальной матрицы на обратную |
3. Схемы алгоритма программы
Рис. 3.1 Схема алгоритма основной программы
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Рис. 3.2 Схема алгоритма функции Freemem
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Рис. 3.3 Схема алгоритма процедуры PrintMtx
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Рис. 3.4 Схема алгоритма функции SetMtx
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Рис. 3.5 Схема алгоритма функции TransponMtx
3.6 Схема алгоритма функции Get_Matr
Рис. 3.7 Схема алгоритма функции Det
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Рис. 3.8 Схема алгоритма функции Multiplication
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Рис. 3.9 Схема алгоритма функции cid
4. Отладка программы
Отладка - это процесс локализации ошибок в программном коде. Этот процесс занимает значительную часть разработки. Практически в любой программе перед началом отладки имеются ошибки.
Локализацией называется процесс определения оператора программы, выполнения которого вызвало нарушение нормального вычислительного процесса. Для исправления ошибки необходимо определить причину её возникновения, т.е. определить оператор или фрагмент содержащий ошибку.
Во время отладки программы, возможно, обнаружить ошибки следующих типов:
1) синтаксические;
2) ошибки компоновки;
3) ошибки выполнения.
Синтаксическая ошибка - ошибки, фиксируемые компилятором при выполнении синтаксического анализа. Заключается в несовпадении кода с синтаксисом языка программирования.
Ошибка компоновки - ошибки, обнаруженные компоновщиком при объединении модулей программы. Заключается в несовпадении каких-либо связей при подключении модулей и подпрограмм.
Ошибки выполнения - происходящие во время вычислений и чаще всего приводят к завершению работы программы.
В процессе разработки программы были обнаружены ошибки выполнения, ошибки компоновки и синтаксические ошибки.
1) Ошибки выполнения, обнаруженные в программе: ошибка выполнения, связанная с отсутствием выделения памяти под двумерный массив double **temp_matr = =new double *[m];
if (det){
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
int m = n - 1;
double **temp_matr = new double *[m];
Get_matr(matr, n, temp_matr, i, j);
obr_matr[i][j] = pow(-1.0, i + j + 2) * Det(temp_matr, m) / det;
FreeMem(temp_matr, m);
}
}
При отсутствии выделения памяти, происходит следующая ошибка, связанная с доступом к потоку данных. На рисунке 4.1 показано сообщение компилятора об ошибке выполнения, связанной с нарушением доступа к потоку данных.
Рисунок 4.1 Сообщение об ошибке выполнения
Исправленный фрагмент кода:
массив double **temp_matr = new double *[m];
if (det){
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
int m = n - 1;
double **temp_matr = new double *[m];
for (int k = 0; k < m; k++)
temp_matr[k] = new double[m];
Get_matr(matr, n, temp_matr, i, j);
obr_matr[i][j] = pow(-1.0, i + j + 2) * Det(temp_matr, m) / det;
FreeMem(temp_matr, m);
}
}
2) Синтаксические ошибки, обнаруженные в программе:
не поставлена “ ; ”;
n = static_cast< int >( cid(check,nn,0,0) );
На рисунке 4.1 показано сообщение компилятора о синтаксической ошибке в программе.
Рисунок 4.1 - Сообщение о синтаксической ошибке
не поставлена закрывающая скобка “ ) ”;
*(c + i) = new double[n];
На рисунке 4.3 показано сообщение компилятора о синтаксической ошибке в программе, и последующей проблеме преобразования данных.
Рисунок 4.3 - Сообщение о синтаксической ошибке
Синтаксическая ошибка, которая спровоцировала ошибку выполнения, было невозможно преобразовать разные типы данных.
3) Ошибки компоновки, обнаруженные в программе. Ошибка компоновки, вызванная из-за различия типов формальных параметров в описании функции в заголовке программы и в коде самой функции:
описание функции:
void multiplication(int **matr1, double **matr2,double **c, int n);
Код функции:
void multiplication(double **matr1, double **matr2,double **c, int n) {
double s;
for(int i=0; i<n; i++) {
for(int l=0; l<n; l++) {
s = 0.0;
for(int j=0; j<n; j++) {
s += matr1[i][j]*matr2[j][l];
}
if (s < 0.0000000001)
c[i][l] = 0;
else
c[i][l] = s;;
}
}
}
На рисунке 4.4 - показано сообщение компилятора об ошибке компоновки в программе.
Рисунок 4.4 - Сообщение о синтаксической ошибке
Исправленный фрагмент кода:
void multiplication(double **matr1, double **matr2,double **c, int n);
Все ошибки были исправлены, программа была приведена в рабочее состояние, для подтверждения, далее проведено тестирование программы в различных условиях и результаты тестирования соответственно.
5. Оптимизация программы
Основной задачей программирования является создание правильных, а не эффективных программ. Зачастую для повышения производительности программ большую значимость имеют такие факторы как:
– четко выработанные требования к программе до начала её разработки;
– избежание обработки неправильных значений, благодаря фильтрации ввода;
– Очистка памяти ЭВМ после завершения работы программы.
Ввиду данных факторов основной целью разработки являлось создание правильной, хорошо спроектированной программы.
В большинстве случаев к оптимизации следует приступать только после того, как программа создана и выдает требуемые результаты. В противном случае можно получить не просто неудобочитаемый код и неработающую программу, но еще и неоптимизированное решение. Однако неизвестно, насколько эффективной будет программа, оптимизированная после её разработки, поэтому определять требования к эффективности следует на стадии проектирования.
Несмотря на вышеперечисленные факты, оптимизация оказывается очень полезной, когда программа работает правильно. Производя небольшие изменения в некоторых фрагментах кода, называемых критическими областями, оптимизация помогает повысить эффективность программы в несколько раз.
Программа, разрабатываемая в рамках курсового проекта, была оптимизирована как по памяти, так и по времени. Для оптимизации по памяти программа была разделена на подпрограммы и организованна таким образом, чтобы исключалось дублирование исходных данных. Например, часто используемый алгоритм функции PrintMtx, был сделан в виде отдельной подпрограммы, экономит память. Соответствующие фрагменты программы приведены ниже.
Описание функции в заголовке программы:
template <typename T> void PrintMtx(T **matr, int n);
Тело функции PrintMtx:
template <typename T> void PrintMtx(T **matr, int n){
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++)
cout << setprecision(3)<< setw(4)<< matr[i][j] << "\t";
cout <<endl;
}
}
Для оптимизации программы по времени были произведены следующие действия:
– исключены необоснованные, многократные преобразования из типа integer в тип double, благодаря указанию изначальных значений переменных в соответствии с типом double:
double temp = 0.0;
double s = 0.0;
double element=0.0;
double nn = 0.0;
– освобождение памяти ЭВМ реализованное посредством функции FreeMem:
Использование функции FreeMem в программе:
FreeMem(tobr_matr, n);
FreeMem(matr, n);
FreeMem(obr_matr, n);
Тело функции FreeMem:
template <typename T> void FreeMem(T **matr, int n)
{
for (int i = 0; i < n; i++)
delete[] matr[i];
delete[] matr;
}
– это исключает переполнение памяти, и гарантирует стабильную работу программы.
матрица алгоритм программа
6. Тестирование программы
Тестирование - это набор процедур и действий, предназначенных для демонстрации правильности работы программы в заданных режимах и внешних условиях. Цель тестирования - выявить наличие ошибок или убедительно продемонстрировать их отсутствие.
Процесс тестирования проходит в три этапа:
– проверка поведения программы в нормальных условиях;
– проверка поведения программы в экстремальных условиях;
– проверка поведения программы в исключительных ситуациях.
Каждый из этапов предполагает задание определенного, характерного для данного этапа набора входных данных.
Методы тестирования
1) Тестирование снизу-вверх. Этот метод предполагает первоначальное написание и проверку модулей с самого нижнего уровня. Затем программируются и тестируются элементы более высокого уровня и т.д. пор, пока не будет завершено написание всей программы.
2) Тестирование сверху-вниз. Этот метод тестирования является дополнительным этапом проектирования сквозного контроля и кодирования сверху-вниз. При таком методе разработки ПО вначале пишется основная программа, а не модули более низкого уровня заменяются более заглушками. Следующий шаг состоит в добавлении модуля, генерирующего входные данные - это может быть либо модуль ввода, либо некоторый вспомогательный модуль, заменяющий его до момента окончания программирования последнего. Вслед за этим испытания проводятся с использованием каких-либо простых данных.
Этапы тестирования
Процесс тестирования программы можно разделить на три этапа:
1) проверка в нормальных условиях;
2) проверка в экстремальных условиях;
3) проверка в исключительных ситуациях.
6.1 Тестирование в нормальных условиях
Для тестирования программы в нормальных условиях достаточно ввести допустимые значения, указанные в сообщениях программы, при которых подразумевается безотказное выполнение программы. На рисунках 6.1, 6.2 и 6.3 продемонстрировано тестирование в нормальных условиях.
Рисунок 6.1 - Ввод размерности матрицы
Рисунок 6.2 - Ввод значений элементов матрицы и ее вывод
Рисунок 6.3 - Результаты вычислений с использованием исходной и обратной матриц
Ручной просчет к результатам, отображенным на рисунке 6.3:
=4
=8
=0
=-2
=-10
=-6
=-8
=-22
=-12
С=
Вывод: тестирование программы в нормальных условиях и сверка полученных результатов с ручным расчетом показали, что программа работает правильно в нормальных условиях.
6.2 Тестирование в экстремальных условиях
При тестировании в экстремальных условиях совокупность исходных данных - это данные, лежащие на концах интервала допустимых значений. На рисунках 6.4, 6.5, 6.6, 6.7, 6.8, 6.9, 6.10, 6.11 и 6.12 иллюстрируется тестирование программы в экстремальных условиях с использованием максимально возможной размерностью матрицы и максимально возможным значением элемента матрицы в данной программе.
Рисунок 6.4 - Матрица 5х5
Рисунок 6.5 - Результаты работы программы с матрицей 5х5
Ручной просчет к результатам, отображенным на рисунках 6.5, 6.6, 6.7, 6.8, 6.9, 6.10, 6.11, 6.12:
Ручной просчет к результатам, отображенным на рисунке 6.14.
Рисунок 6.6. - Расчёт первой строки
Рисунок 6.7 - Расчёт второй строки
Рисунок 6.8. - Расчёт третьей строки
Рисунок 6.9. - Расчёт четвертой строки
Рисунок 6.10. - Расчёт пятой строки
Рисунок 6.11. - Расчёт первой строки
Рисунок 6.12. - Результат умножения изначальной матрицы на ее обратную
Рисунок 6.13 - Ввод вывод максимально и минимально возможных значений элементов матрицы
Рисунок 6.14 - Результаты работы программы с минимально возможных значений элементов матрицы
Рисунок 6.14. - Расчёт первой строки
Вывод: тестирование программы в экстремальных условиях и сверка полученных результатов с ручным расчетом показали, что программа работает правильно в экстремальных условиях.
6.3 Тестирование в исключительных ситуациях
Тестирование в исключительных ситуациях предполагает формирование набора данных, значения которых лежат за пределами допустимой области изменения. Программа, тестируемая в исключительных ситуациях, должна отвергать любые значения, которые она не в состоянии обрабатывать правильно.
Рисунки 6.15, 6.16 иллюстрируют поведение программы при вводе данных, выходящих за пределы области изменения, а также при вводе некорректных данных. Видно, что программа отбрасывает бессмысленные данные, и, либо прекращает свою работу, либо предлагает ввести данные повторно.
Рисунок 6.15 - Сообщение об ошибочно введенном размере матрицы
Рисунок 6.16 - Вывод сообщения об ошибке при ошибочном вводе значения элемента матрицы
Вывод: просмотр результатов тестирования в исключительных ситуациях показал, что программа устойчива к бессмысленным и неправильным данным. Она отвергает такие данные и корректно продолжает свою работу.
Вывод по тестированию: программа успешно прошла тестирование в нормальных и экстремальных условиях, а также в исключительных ситуациях, следовательно, она работает правильно.
Листинг программы приведен в приложении А, а результаты выполнения - в приложении Б.
7. Руководство пользователя
7.1 Системные требования, предъявляемые к программе
Программа должна быть разработана для компьютеров со следующей конфигурацией:
- процессор Intel Core i3 2-го поколения и выше, AMD Athlon x64 и выше;
- количество ОЗУ от 2гб;
- место на жёстком диске от 40 мб;
- встроенная или дискретная видеокарта год выпуска от 2005.
Для работы с программой следуйте пошаговому руководству, представленному ниже.
7.2 Инструкция по запуску и использованию
1) запустите исполняемый файл MatrixE.exe, находящийся в папке C:\Users\»Имя_пользователя»\Desktop (рисунок 7.1);
Рисунок 7.1 - Запуск программы
2) после запуска программы откроется консоль, на которой будет представлена строка для ввода размерности матрицы (рисунок 7.2);
Рисунок 7.2 - Ввод размерности матрицы
3) за вводом размерности матрицы, если он указан корректно, программа уведомит пользователя о верно введенном значении, затем следует поэлементный ввод элементов матрицы (любое число вещественное число) (рисунок 7.3);
Рисунок 7.3 - Ввод элементов матрицы
4) в случае неверного ввода размерности матрицы (значение не удовлетворяющее условию 1 < «Размерность матрицы» <= 10), программа уведомит пользователя об ошибке, и нужно будет ввести другое значение, удовлетворяющее условию выше (рисунок 7.4);
Рисунок 7.4 - Сообщение об ошибке при введении неверной размерности матрицы.
5) при соблюдении всех шагов инструкции программа должна успешно выполнить вычисления. После нажатия любой клавиши программа выведет на экран: матрицу которую ввел пользователь, затем - обратную матрицу той, которую ввел пользователь, если таковая имеется, определитель матрицы, и результат умножения изначальной матрицы на ее обратную (рисунок 7.5).
Рисунок 7.5 - Консоль с результатами работы программы
Если пользователь вводит недопустимые значения элементов матрицы, программа сообщит об ошибке, покажет соответствующее сообщение, требуется нажать любую кнопку и продолжить ввод верных значений (рис. 7.6).
6) Завершение работы с программой производится 2 способами:
1- Нажатие кнопки «Крестик» в верхнем правом углу окна программы;
2- Нажатие любой клавиши, по завершению вычислительных действий программы.
Рисунок 7.6 - Реакция программы на недопустимые значения для элементов матрицы
Заключение
Целью данного курсового проекта являлось написание программы по теме: «Проверка свойств квадратной матрицы», которая была достигнута в ходе выполненной работы.
В ходе написания курсового проекта были получены практические навыки в области проектирования программы. Программа разрабатывалась с использованием стратегии анализа сообщений, реализующей метод нисходящей разработки. Анализ основывался на изучении потоков данных, обрабатываемых программой. Опыт, полученный при написании работы, подтвердил необходимость в первую очередь правильной выработки требований к программе и грамотного подхода к её проектированию перед началом написания кода.
Так же были получены практические навыки при оптимизации и тестировании программы. Появилось понимание важности и сложности отладки, её ресурсоемкости по времени относительно всего процесса разработки, необходимости знания аспектов из разных областей IT-технологий, как, например, знание аппаратной части, операционных систем, самих реализуемых процессов, природы и специфики различных ошибок и т.д.
Результатом проведенной работы является правильно спроектированное приложение, а также работающий, эффективный, отлаженный и корректно отвечающий тестам соответствующих условий тестирования проект.
При разработке программы были изучен и применен метод нахождения обратной матрицы - метод алгебраический дополнений.
Программа имеет надлежащую структуру, схемы алгоритма и необходимые комментарии.
Список использованных источников
1. Белоусов И.В. Матрицы и определители: учебное пособие по линейной алгебре. / Кишинев: 2006/. Изд-во Масонский Заговор 1888, 2011 год.
2. Бугров Я.С. Никольский С.М. Издательство Бугурт Батхерт Р.Ав., 1999 год.
3. Высшая математика: Учебник для вузов. В 3 томах. Т. 1. Элементы линейной алгебры и аналитической геометрии.
4. Киркинский А.С. Математический анализ. «Академический Проект», 2006.
5. Лафоре Роберт. Объектно-ориентированное программирование в C++. «Питер», 2015.
6. Макконнелл Стив. Совершенный код. «БХВ-Петербург», 2017.
7. Матрицы и определители, Белоусов И.В., 2006.
8. Письменный Д.Т. Конспект лекций по высшей математике. «Айрис-Пресс», 2017.
9. Сборник задач по математике для втузов. Часть 1
10. Страуструп Бьярне. Программирование, принципы и практика использования С++. «Вильямс», 2011.
Приложение А
Листинг программы
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//####Лабораторная работа
//#### по предмету МДК 03.01 Технология разработки программного обеспечения,
//#### по теме "Описание программы".
//#### Язык: C++
//#### Разработал: Панарин Е.А.
//#### Дата: 27.11.2018.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//#### Задание:
//#### Разработка программы проверки свойств квадратной матрицы:
//#### Методом алгебраических дополнений.
//#### Основные переменные, используемые в программе:
//#### n - размерность матриц;
//#### i - счётчик цикла;
//#### j - счётчик цикла;
//#### check - определение условий проверки вводимых значений;
//#### det - хранение определителя матрицы;
//#### nn - проверочное значение для размерности матрицы;
//#### Position.X - положение курсора на оси х;
//#### Position.Y - положение курсора на оси у;
//#### matr - вводимая пользователем матрица;
//#### Obr_matr - обратная матрица;
//#### Tobr_matr - транспонированная обратная матрица;
//#### c - конечная матрица после умножения изначальной на ее //обратную;
//#### Вызываемые подпрограммы:
//#### FreeMem - функция освобождения памяти после выполнения //программы;
//#### SetMtx - функция заполнения матрицы;
//#### TransponMtx - функция транспонирования матрицы;
//#### Get_mtx - функция получения обратной матрицы;
//#### Det - функция для вычисления определителя матрицы;
//#### multiplication - функция для умножения изначальной матрицы на //ее обратную, с целью получить единичную матрицу;
//#### cid - функция для проверки любых вводимых значений в программе //с целью избежать ошибок или непредвиденной остановки программы;
//#### Setcolor - функция для выделения цветом важных сообщений //программы;
//#### PrintMtx - функция печати матриц.
#include "stdafx.h"
#include "stdio.h"
#include "iomanip"
#include <iostream>
#include <ctime>
#include <cmath>
#include <fstream>
#include <iostream>
#include <conio.h>
#include <windows.h>
using namespace std;
template <typename T> void FreeMem(T **matr, int n);
template <typename T> void PrintMtx(T **matr, int n);
template <typename T> void SetMtx(T **matr, int n, int chs);
template <typename T> void TransponMtx(T **matr, T **tMatr, int n);
void Get_matr(double **matr, int n, double **temp_matr, int indRow, int indCol);
double Det(double **matr, int n);
void multiplication(double **matr1, double **matr2,double **c, int n);
double cid(int chs,double ele, int x, int y);
enum ConsoleColor
{ Black,
Green,
Red,
White,
yellow
};
void SetColor(int text, int background)
{ HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hStdOut, (WORD)((background << 4) | text));
}
void main()
{srand((unsigned)time(NULL));
setlocale(0, "");
int n,check = 1;
double det,nn = 0;
COORD position;
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
position.X=0;
position.Y=1;//Ввод размерности матрцы;
cout << "Enter the size of matrix (1>[element]<=10):> ";
n = static_cast< int >( cid(check,nn,0,0) );
SetConsoleCursorPosition(hConsole, position);
cout <<" ";
SetColor(2,0);SetConsoleCursorPosition(hConsole, position);
cout <<"Correct! :) Now enter elements of matrix:>>";
SetColor(7,0);
double **matr = new double *[n];
double **obr_matr = new double *[n];
double **tobr_matr = new double *[n];
double **c = new double*[n];
//Выделение памяти для двумерных массивов;
for (int i = 0; i < n; i++){
matr[i] = new double[n];
obr_matr[i] = new double[n];
tobr_matr[i] = new double[n];
*(c + i) = new double[n];
}
check = 2;
SetMtx(matr, n,check);
cout << endl;
SetColor(14,0);
PrintMtx(matr, n);
cout << endl;
det = Det(matr, n); SetColor(7,0);
cout << "Determinant of matrix = " << det << endl;
if (det){
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
int m = n - 1;
double **temp_matr = new double *[m];
for (int k = 0; k < m; k++)
temp_matr[k] = new double[m];
Get_matr(matr, n, temp_matr, i, j);
obr_matr[i][j] = pow(-1.0, i + j + 2) * Det(temp_matr, m) / det;
FreeMem(temp_matr, m);
}
}
}
else{ SetColor(4,0);
cout << "Since the determinant of the matrix = 0,\n then the matrix is degenerate and has no inverse!!!" << endl;
}
//Транспонирование матрицы
TransponMtx(obr_matr, tobr_matr, n);
//Печать обратной матрицы после транспонирования
SetColor(7,0);
cout<<"Inverse matrix:"<<endl;
SetColor(14,0);
PrintMtx(tobr_matr, n);
multiplication(matr, tobr_matr,c,n); SetColor(7,0);
cout<<endl<<"rezult (unit matrix):"<<endl; SetColor(14,0);
PrintMtx(c,n);
SetColor(7,0);
FreeMem(tobr_matr, n);
FreeMem(matr, n);
FreeMem(obr_matr, n);
system("pause");
//#### функция FreeMem:
//#### Формальные параметры:
//#### matr - параметр для передачи матрицы;
//#### n - параметр для передачи длины строк и столбцов матрицы.
//Функция освобождения памяти
template <typename T> void FreeMem(T **matr, int n)
{for (int i = 0; i < n; i++)
delete[] matr[i];
delete[] matr;
}
//#### функция PrintMtx:
//#### Формальные параметры:
//#### n - параметр для передачи длины строк и столбцов матрицы;
//#### matr - параметр для передачи матрицы в функцию.
//#### Локальные переменные:
//#### j - счётчик цикла;
//#### i - счётчик цикла.
template <typename T> void PrintMtx(T **matr, int n)
{for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++)
cout << setprecision(3)<< setw(4)<< matr[i][j] << "\t";
cout <<endl;
}
}
//#### функция SetMtx:
//#### Формальные параметры:
//#### matr - параметр для передачи матрицы;
//#### chs - параметр для фильтрации ввода;
//#### n - параметр для передачи длины строк и столбцов матрицы.
//#### Локальные переменные:
//#### element - возвращаемое значение для записи в матрицу;
//#### position.X - указатель на позицию курсора;
//#### position.Y - указатель на позицию курсора;
//#### g - переменная для указателя на позицию курсора;
//#### h - переменная для указателя на позицию курсора.
template <typename T> void SetMtx(T **matr, int n, int chs)
{
COORD position;
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
int g = 0,h = 4;
double element=0;
position.X=1;
position.Y=2;
//Цикл ввода элементов матрицы;
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
SetConsoleCursorPosition(hConsole, position);
matr[i][j] = cid(chs,element,position.X,position.Y);
g+=6;
position.X+=g;
g=0;
}
position.Y=h;
h+=2;
g=0;
position.X=1;
}
cout<<endl;
}
//#### функция PrintMtx:
//#### Формальные параметры:
//#### n - параметр для передачи длины строк и столбцов матрицы;
//#### matr - параметр для передачи матрицы в функцию.
template <typename T> void PrintMtx(T **matr, int n)
{
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++)
cout << setprecision(3)<< setw(4)<< matr[i][j] << "\t";
cout <<endl;
}
}
//#### функция SetMtx:
//#### Формальные параметры:
//#### matr - параметр для передачи матрицы;
//#### chs - параметр для фильтрации ввода;
//#### n - параметр для передачи длины строк и столбцов матрицы.
//#### Локальные переменные:
//#### i - счётчик цикла;
//#### j - счётчик цикла;
//#### element - возвращаемое значение для записи в матрицу;
//#### position.X - указатель на позицию курсора;
//#### position.Y - указатель на позицию курсора;
//#### g - переменная для указателя на позицию курсора;
//#### h - переменная для указателя на позицию курсора.
template <typename T> void SetMtx(T **matr, int n, int chs)
{
COORD position;
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
int g = 0,h = 4;
double element=0;
position.X=1;
position.Y=2;
//Цикл ввода элементов матрицы;
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
SetConsoleCursorPosition(hConsole, position);
matr[i][j] = cid(chs,element,position.X,position.Y);
g+=6;
position.X+=g;
g=0;
}
position.Y=h;
h+=2;
g=0;
position.X=1;
}
cout<<endl;
}
//#### функция transponMtx:
//#### Формальные параметры:
//#### n - параметр для передачи длины строк и столбцов матрицы;
//#### matr - параметр для передачи матрицы в функцию$
//#### tmatr - параметр для записи транспонированной матрицы.
//#### Локальные переменные:
//#### i - счётчик цикла;
//#### j - счётчик цикла.
//Функция транспонирования матрицы
template <typename T> void TransponMtx(T **matr, T **tMatr, int n)
{
for (int i = 0; i < n; i++)
{for (int j = 0; j < n; j++)
tMatr[j][i] = matr[i][j];
}
}
//#### функция Get_matr:
//#### Формальные параметры:
//#### matr - параметр для передачи введенной матрицы;
//#### Temp_matr - параметр для передачи второй матрицы;
//#### int indRow - указание на строку для вычёркивания из матрицы;
//#### int indCol - указание на столбец для вычёркивания из матрицы;
//#### n - параметр для передачи длинны строк и столбцов матрицы.
//#### Локальные переменные:
//#### i - счётчик цикла;
//#### j - счётчик цикла;
//#### ki - указатель на строку для вычёркивания;
//#### kj - указатель на столбец для вычёркивания.
//функция вычеркивания строки и столбца
void Get_matr(double **matr, int n, double **temp_matr, int indRow, int indCol)
{
int ki = 0;
for (int i = 0; i < n; i++){
if (i != indRow){
for (int j = 0, kj = 0; j < n; j++){
if (j != indCol){
temp_matr[ki][kj] = matr[i][j];
kj++;
}
}
ki++;
}
}
}
//#### функция Det:
//#### Формальные параметры:
//#### matr - параметр для передачи первой матрицы;
//#### n - параметр для передачи длинны строк и столбцов матрицы.
//#### Локальные переменные:
//#### temp - переменная для передачи в основную программу значения //определителя матрицы.
//Функция вычисления определителя матрицы
double Det(double **matr, int n)
{
double temp = 0; //Временная переменная для хранения определителя
int k = 1;//степень
if (n < 1){
cout << "Не вернaя матрицa!!!" << endl;
return 0;
}
else if (n == 1)
temp = matr[0][0];
else if (n == 2)
temp = matr[0][0] * matr[1][1] - matr[1][0] * matr[0][1];
else{
for (int i = 0; i < n; i++){
int m = n - 1;
double **temp_matr = new double *[m];
for (int j = 0; j < m; j++)
temp_matr[j] = new double[m];
Get_matr(matr, n, temp_matr, 0, i);
temp = temp + k * matr[0][i] * Det(temp_matr, m);
k = -k;
FreeMem(temp_matr, m);
}
}
return temp;
}
//#### функция multiplication:
//#### Формальные параметры:
//#### matr1 - параметр для передачи первой матрицы;
//#### matr2 - параметр для передачи второй матрицы;
//#### n - параметр для передачи длинны строк и столбцов матрицы.
//#### Локальные переменные:
//#### i - счётчик цикла;
//#### j - счётчик цикла;
//#### s - временная переменная для записи результата умножения элементов матриц;
//#### с - матрица для записи результата умножения матриц.
void multiplication(double **matr1, double **matr2,double **c, int n) {
double s;
for(int i=0; i<n; i++) {
for(int l=0; l<n; l++) {
s = 0;
for(int j=0; j<n; j++) {
s += matr1[i][j]*matr2[j][l];
}
if (s < 0.0000000001)
c[i][l] = 0;
else
c[i][l] = s;;
}
}
//#### функция Cid:
//#### Формальные параметры:
//#### chs - параметр для указания типа проверки;
//#### ele - параметр для передачи вводимого значения для проверки;
//#### x - параметр для указания позиции курсора:
//#### y - параметр для указания позиции курсора.
//#### Локальные переменные:
//#### position.X - указание позиции курсора на оси х;
//#### position.y - указание позиции курсора на оси y.
//Функция проверки вводимых значений
double cid(int chs, double ele, int x, int y)
{
COORD position;
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
position.X=45;
position.Y=0;
if (chs ==1){
SetConsoleCursorPosition(hConsole, position);
while ( !((cin >> ele)) || (cin.peek() != '\n') || (ele-int(ele)!=0) || ele<=0 || ele >5)
{ cin.clear();
while (cin.get() != '\n'); SetColor(4,0);
cout << "Error!";
SetConsoleCursorPosition(hConsole, position);
cout<<" ";
SetConsoleCursorPosition(hConsole, position); SetColor(7,0);
}
return ele;
}
else {position.X=x;
position.Y=y;
SetConsoleCursorPosition(hConsole, position);
while ( !(cin >> ele) || (cin.peek() != '\n' ) || (ele >= 1001) || (ele <= -1001))
{
cin.clear();
while (cin.get() != '\n' );
SetConsoleCursorPosition(hConsole, position);
SetColor(4,0);
cout << "Error! Please enter the correct element -1000.999<[element]<1000.999 ";
system("pause");
SetConsoleCursorPosition(hConsole, position);
cout<<" "<<endl;
SetConsoleCursorPosition(hConsole, position); SetColor(7,0);
}
return ele;
}
}
Приложение Б
Результаты выполнения программы
На рисунках Б.1, Б.2 продемонстрированы результаты работы программы (ввод значений, и вывод полученной матрицы после умножения введенной пользователем на ее обратную матрицу).
Рисунок Б.1 - Ввод размера матрицы, элементов матрицы и вывод заполненной матрицы
Рисунок Б.2 - Вывод результатов вычисления определителя матрицы и умножения введенной матрицы на ее обратную
Размещено на Allbest.ru
Подобные документы
Разработка эскизного и технического проектов программы преобразования заданной матрицы в ортогональную матрицу. Сравнивание транспонированной матрицы с обратной с целью проверки ортогональности. Выбор состава технических и программных средств реализации.
курсовая работа [52,1 K], добавлен 09.12.2014Применение численного метода решения систем линейных алгебраических уравнений, используемых в прикладных задачах. Составление на базе метода матрицы Гаусса вычислительной схемы алгоритма и разработка интерфейса программы на алгоритмическом языке.
курсовая работа [823,9 K], добавлен 19.06.2023Решение систем алгебраических линейных уравнений методом Гаусса. Вычисление обратной матрицы и определителя. Декомпозиция задачи. Схема взаимодействия интерфейсных форм. Описание процедур и функций. Тестирование разработанного программного продукта.
курсовая работа [1,1 M], добавлен 05.06.2012Анализ технического задания. Разработка интерфейса программы и ее алгоритмов. Кодирование и тестирование разработанного программного обеспечения, оценка его практической эффективности и функциональности. Формирование, содержание руководства пользователя.
курсовая работа [2,0 M], добавлен 31.07.2012GetMatrDop как процедура определяет значение элемента транспонированной матрицы дополнений. Знакомство с этапами разработки в среде Turbo Pascal программы сортировки элементов, находящихся на главной диагонали матрицы. Особенности тестирования программы.
курсовая работа [780,4 K], добавлен 20.11.2014Разработка блок-схемы и программы обработки одномерного массива с доступом к элементам с помощью индексов и с помощью указателей. Словесное описание алгоритма и пользовательского интерфейса, листинг программы обработки матрицы и результат её выполнения.
курсовая работа [391,1 K], добавлен 30.09.2013Составление процедуры для матрицы, разложения матрицы на множители, решения системы линейных уравнений, нахождения определителя матрицы и матрицы с транспонированием. Суть метода квадратного корня. Разложение матрицы на множители. Листинг программы.
лабораторная работа [39,4 K], добавлен 18.09.2012Разработка программы построения графика экспериментальных точек и полинома регрессии второй степени в среде Turbo Pascal. Блок-схемы алгоритмов используемых процедур. Листинг программы. Составление вектора свободных членов и матрицы коэффициентов.
курсовая работа [46,6 K], добавлен 24.11.2013Разработка программы для решения системы линейных уравнений методом Крамера и с помощью расширенной матрицы на языке С++. Описание метода Крамера. Структура программы: заголовочные файлы, типы данных, переменные, идентификаторы, операторы, массивы.
курсовая работа [32,3 K], добавлен 19.01.2009Понятие определителя матрицы, математические и алгоритмические основы его расчета, функциональные модели, блок-схемы и программная реализация. Сущность метода Гаусса для решения систем линейных алгебраических уравнений и вычисления определителя матрицы.
контрольная работа [455,2 K], добавлен 18.01.2010