Разработка программного комплекса решения математической задачи численными методами
Используемые технические средства: при разработке и минимальные требования. Технические программные средства, используемые при вводе. Проверка правильности решения системы линейных уравнений. Блок-схема события Click кнопки "Решить систему" и пр.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 26.09.2017 |
Размер файла | 558,4 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
Государственное образовательное учреждение высшего профессионального образования
«ЛИПЕЦКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
Кафедра АСУ
Расчетно-пояснительная записка
«Разработка программного комплекса решения математической задачи численными методами»
Липецк 2008
Задание кафедры
Разработать программный комплекс решения математической задачи численным методом.
Вариант № 32. Решение системы линейных уравнений методом Гаусса.
программный линейный уравнение click
Аннотация
С.49.Ил.5.Библиогр.: 3назв.
Настоящий отчет является расчетно-пояснительной запиской по проделанной работе «Разработка программного комплекса решения математической задачи численными методами». Программный продукт реализует процесс решения системы линейных уравнений методом Гаусса.
Документ включает описание программы, описание применения, руководство программиста, описание контрольного примера, текст программы, а также блок-схему алгоритма. Содержание указанных разделов соответствует стандартам ЕСПД и СТД АСУ соответствующих наименований.
Оглавление
- Введение
- 1. Описание программы
- 1.1 Общие сведения
- 1.2 Функциональное назначение
- 1.2.1 Классы решаемых задач
- 1.2.2 Функциональные ограничения
- 1.3 Описание логической структуры
- 1.3.1 Алгоритм используемого метода
- 1.3.2 Структура программы
- 1.4 Используемые технические средства
- 1.4.1 При разработке
- 1.4.2 Минимальные требования
- 1.5 Вызов и загрузка
- 1.6 Входные данные
- 1.7 Выходные данные
- 2. Описание применения
- 2.1 Назначение программы
- 2.1.1 Назначение и возможности программы
- 2.1.2 Ограничения программы
- 2.2 Условия применения
- 2.3 Описание задачи
- 2.4 Входные данные
- 2.5 Выходные данные
- 3. Руководство программиста
- 3.1 Назначение и условия применения
- 3.1.1 Назначение программы
- 3.1.2 Условия применения программы
- 3.2 Характеристики программы
- 3.3 Обращение к программе
- 3.4 Входные и выходные данные
- 3.4.1 Входные данные
- 3.4.2 Выходные данные
- 3.5 Сообщения
- 4. Описание контрольного примера
- 4.1 Назначение программы
- 4.2 Целью проведения испытаний
- 4.3 Требования, подлежащие проверке
- 4.4 Технические программные средства, используемые при вводе
- 4.5 Порядок проведения тестирования
- 4.6 Используемые методы тестирования
- 4.6.1 Проверка правильности решения системы линейных уравнений
- 4.6.2 Проверка поведения программы при заведомо неправильных входных данных
- 5. Текст программы
- 6. Блок-схема программы
- 6.1 Блок-схема события Click кнопки «Решить систему»
- 6.2 Блок-схема функции int proverka_zapoln()
- 6.3 Блок-схема функции double opredelitel(double **Matr1, int size)
- 6.4 Блок-схема функции int metod_Gaussa()
- 6.5 Блок-схема функции void pogreshnost()
- 6.6 Блок-схема функции void na_shag_vverh (double **M, int row)
- 6.7 Блок-схема функции int perepoln_pri_umnosh(double x1, double x2)
- 6.8 Блок-схема функции int perepoln_pri_slosh(double x1, double x2)
- Заключение
- Библиографический список
- Введение
- Большинство вычислений в современном мире производится с помощью ПК. Существует большое количество численных методов и разнообразие их программной реализации в той или иной среде, начиная от специализированных математических пакетов, заканчивая многочисленными алгоритмическими языками.
- Разработка таких программ на современных системах не представляет никаких сложностей в силу таковой направленности при разработке этих систем. Ключевое значение здесь принимает опыт и квалификация программиста.
- Целью данной работы является освоение навыков программирования в визуальной среде, а также оформления документации к разработанному программному продукту в соответствии со стандартами ЕСПД и СТД АСУ.
- 1. Описание программы
- 1.1 Общие сведения
- Наименование программы: решение системы линейных уравнений методом Гаусса (Gauss.exe). Программа написана на объектно-ориентированном языке С++ в среде разработки Borland C++ Builder версии 6.0 Enterprise. Программа выполнима в 32-битных версиях операционной системы Microsoft Windows, или, при наличии эмулятора в другой системе. Рекомендуемая операционная система - Windows XP.
1.2 Функциональное назначение
Настоящая программа предназначена для решения системы линейных уравнений, записанной в виде матрицы коэффициентов, стоящих при соответствующих переменных. Используется метод решения системы линейных уравнений методом Гаусса.
1.2.1 Классы решаемых задач
Нахождение решения системы линейных уравнений методом Гаусса.
1.2.2 Функциональные ограничения
Программа корректно работает только для системы линейных линейно независимых уравнений без свободных переменных, т.е. количество различных переменных в уравнениях должно быть не больше числа самих уравнений. Количество уравнений не может быть большим 9.
1.3 Описание логической структуры
1.3.1 Алгоритм используемого метода
заключается в сведении системы уравнений вида:
a11x1 + a12x2 + … + a1nxn = b1
……………………………….
an1x1 + an2x2 + … + annxn = bn
к системе уравнений вида:
х1 = b1'
………………………………
xn = bn'
Это достигается путем элементарных преобразований по алгоритму Гаусса:
1) Переставить строки и столбцы (при необходимости) так, чтобы в левом верхнем углу стоял наибольший по модулю элемент;
2) Разделить первую строку на элемент а11;
3) Умножая первую строку на элементы первого столбца и вычитая полученное из второй, третьей и т.д. строк, получаем столбец из единиц и нулей;
4) Делим вторую строку на новый элемент а22 и повторяем предыдущий пункт;
5) Так далее, пока не получим единицы по диагонали;
6) Числа, стоящие справа от знака равно, составят приблизительное решение системы;
7) Погрешность считается путем подстановки решения в исходную систему и сравнения между полученной левой и правой частями.
1.3.2 Структура программы
Сразу после загрузки главного окна программы возможно несколько действий:
1) Редактирование таблицы для ввода исходных данных (увеличение или уменьшение строк и столбцов в ней);
2) Вызов справки о программе;
3) Непосредственных ввод данных.
После нажатия на кнопку поиска решения программа проверяет исходные данные и, если они не допустимы, выдает диагностическое сообщение об ошибке.
Программа имеет связь с внешними программами. Так, для открытия справки о программе, она вызывает внешнюю программу IEXPLORE.exe и открывает справку в среде этой программы.
1.4 Используемые технические средства
1.4.1 При разработке
При написании программы был использован компьютер следующей конфигурации:
- процессор INTEL Pentium4 2Duo 1800 MHz 512k 533 MHz;
- оперативная память DDR2 512 Mb;
- SVGA - графический адаптер;
- минимальный набор периферийного оборудования.
1.4.2 Минимальные требования
Для работы программы необходимо:
- IBM PC совместимый компьютер;
- 32-разрядная среда операционной системы;
- графическая оболочка ОС;
- обработчик hlp-файлов в системе;
- достаточный объем свободной оперативной памяти (около 11Мб при работе в Windows XP с улучшенным оформлением окна);
- достаточное место на жестком, гибком, сетевом, оптическом или RAM-диске объемом около 800 Кб;
- устройства ввода информации (клавиатура и мышь);
- устройство вывода графической информации с видеоадаптера (монитор, проектор).
1.5 Вызов и загрузка
Для вызова программы необходимо запустить с помощью ОС файл Gauss.exe из текущей папки программы, в которой также должен находиться файл Gauss_help.mht.
1.6 Входные данные
Коэффициенты при переменных в уравнениях. Данные быть введены в виде десятичной дроби со знаком или без (для отделения дробной части используется знак «,»), с экспонентой (Е или е) или без нее, а также в виде целого числа, которое в ходе программы преобразуется в вещественное.
1.7 Выходные данные
Коэффициенты при соответствующих переменных, а также погрешность на эти коэффициенты, которые могут быть выведены в виде десятичной дроби со знаком (выводится только знак «-», если он есть, знак «+» опускается) (для отделения дробной части используется знак «,»), с экспонентой (Е) или без нее, а также в виде целого числа.
2. Описание применения
2.1 Назначение программы
2.1.1 Назначение и возможности программы
Данная программа предназначена для решения системы линейных уравнений методом Гаусса.
В условиях данной конфигурации скорость выполнения программы составляет не более 1 с, объем занимаемой памяти - не более 45 Мб.
2.1.2 Ограничения программы
Программа корректно выполняется только в случае, если задана система линейных линейно независимых уравнений без свободных переменных. Число уравнений не превышает 9.
2.2 Условия применения
Требования к необходимым для данной программы техническим средствам:
- IBM PC совместимый компьютер;
- 32-разрядная среда операционной системы;
- графическая оболочка ОС;
- обработчик hlp-файлов в системе;
- достаточный объем свободной оперативной памяти (около 11Мб при работе в Windows XP с улучшенным оформлением окна);
- достаточное место на жестком, гибком, сетевом, оптическом или RAM-диске объемом около 700 Кб;
- устройства ввода информации (клавиатура и мышь);
- устройство вывода графической информации с видеоадаптера (монитор, проектор).
Работа программы происходит в однопользовательском режиме. Параметры, необходимые для выполнения программы, вводит пользователь в соответствующие поля главного окна программы. Результаты выводятся в отведенные для них ячейки главного окна.
2.3 Описание задачи
Процесс разработки интерактивной прикладной программы, осуществляет решение определенной (без свободных переменных) системы линейных линейно независимых уравнений методом Гаусса.
Определение: линейным уравнением называется линейная комбинация вида:
C1x1 + C2x2 + … + Cnxn = b;
где Ci - некоторые коэффициенты при переменных;
xi - переменные первой степени;
b - свободный член.
Определение: линейно независимой системой уравнений называется система уравнений, в которой какое-либо уравнение не может быть линейной комбинацией других уравнений этой же системы.
Определение: определенной системой уравнений называется система уравнений, имеющая строго одно решение.
Метод Гаусса заключается в сведении системы уравнений вида:
a11x1 + a12x2 + … + a1nxn = b1
……………………………….
an1x1 + an2x2 + … + annxn = bn
к системе уравнений вида:
х1 = b1'
………………………………
xn = bn'
Это достигается путем элементарных преобразований по алгоритму Гаусса:
1) Переставить строки и столбцы (при необходимости) так, чтобы в левом верхнем углу стоял наибольший по модулю элемент;
2) Разделить первую строку на элемент а11;
3) Умножая первую строку на элементы первого столбца и вычитая полученное из второй, третьей и т.д. строк, получаем столбец из единиц и нулей;
4) Делим вторую строку на новый элемент а22 и повторяем предыдущий пункт;
5) Так далее, пока не получим единицы по диагонали;
6) Числа, стоящие справа от знака равно, составят приблизительное решение системы;
7) Погрешность считается путем подстановки решения в исходную систему и сравнения между полученной левой и правой частями.
2.4 Входные данные
Коэффициенты при соответствующих переменных в соответствующих уравнениях. Данные быть введены в виде десятичной дроби со знаком или без (для отделения дробной части используется знак «,»), с экспонентой (Е или е) или без нее, а также в виде целого числа, которое в ходе программы преобразуется в вещественное.
2.5 Выходные данные
Решение - коэффициенты при соответствующих переменных, а также погрешность на эти коэффициенты, которые могут быть выведены в виде десятичной дроби со знаком (выводится только знак «-», если он есть, знак «+» опускается) (для отделения дробной части используется знак «,»), с экспонентой (Е) или без нее, а также в виде целого числа.
3. Руководство программиста
3.1 Назначение и условия применения
3.1.1 Назначение программы
Программа предназначена для нахождения решения системы линейных уравнений, задаваемых коэффициентами при соответствующих переменных. Программа имеет некоторые ограничения, которые необходимо учитывать пользователю при вводе тех или иных параметров. В любом случае параметры проверяются перед расчетом.
Работу облегчает простой, элегантный и интуитивно понятный интерфейс. Автор стремился сделать программу дружественной к пользователю. Окна не насыщены графикой и ненужными элементами.
3.1.2 Условия применения программы
- IBM PC совместимый компьютер;
- 32-разрядная среда операционной системы;
- графическая оболочка ОС;
- обработчик hlp-файлов в системе;
- достаточный объем свободной оперативной памяти (около 11Мб при работе в Windows XP с улучшенным оформлением окна);
- достаточное место на жестком, гибком, сетевом, оптическом или RAM-диске объемом около 700 Кб;
- устройства ввода информации (клавиатура и мышь);
- устройство вывода графической информации с видеоадаптера (монитор, проектор) с разрешением не менее 600х800 точек.
3.2 Характеристики программы
При тактовой частоте процессора 1800 МГц и оперативной памяти DDR2 время работы программы составляет не более 1 с.
При работе пользователя с программой в случае создания им неправильной ситуации выдается сообщение, поясняющее его действия. Проверка данных перед их использованием позволяет не допустить серьезных ошибок в программе.
3.3 Обращение к программе
Работа программы начинается с подачи пользователем ее двоичного кода операционной системе на выполнение (запуска файла Gauss.exe).
Данные в программе вводятся с клавиатуры, доступ к элементам управления возможен с помощью клавиатуры и мыши.
3.4 Входные и выходные данные
3.4.1 Входные данные
- коэффициенты при соответствующих переменных в соответствующих
уравнениях,
числа вещественные в коде стандарта IBN PC для формата типа double.
3.4.2 Выходные данные
- решение в виде коэффициентов при соответствующих переменных,
числа вещественные в коде стандарта IBN PC для формата типа double;
- погрешность в виде степени десяти, может использоваться:
1) число вещественное в коде стандарта IBN PC для формата типа double;
2) символьная информация в коде ASCI.
3.5 Сообщения
Сообщения, возникают на экране во время выполнения данной программы в случае пяти возможных ошибок:
1.Пользователь не ввел в какую-либо ячейку коэффициент при переменной:
«Не все ячейки заполнены»;
2. Пользователь ввел в какую-либо ячейку данные, которые нельзя преобразовать в число: «Не во всех ячейках числовые данные»;
3.В ходе выполнения программы возникло переполнение: «Программа не может продолжить выполнение программы, так как аппаратура не настолько мощна»;
4.Введена система линейно зависимых уравнений: «Эта система содержит линейно зависимые уравнения»;
5.Файл со справкой отсутствует в одной папке с программой: «Не найден файл со справкой»
4. Описание контрольного примера
4.1 Назначение программы
Программа предназначена для решения системы линейных уравнений методом Гаусса. Программа имеет некоторые ограничения, которые необходимо учитывать пользователю при вводе тех или иных параметров. В любом случае параметры проверяются перед расчетом.
4.2 Целью проведения испытаний
Проверить правильность нахождения решения системы линейных уравнений методом Гаусса.
4.3 Требования, подлежащие проверке
- Правильность нахождения решения системы линейных уравнений;
- Верность выдаваемых сообщений об ошибке или предупредительных сообщений при наличии данных, некорректно введенных пользователем.
4.4 Технические программные средства, используемые при вводе
Технические средства: компьютер типа IBM PC, монитор, мышь и клавиатура.
Программные средства: операционная система Microsoft Windows XP Professional и тестируемая программа.
4.5 Порядок проведения тестирования
- Вести значения, соответствующие проверяемым требованиям;
- Отследить результаты работы программы;
- Сравнить полученные значения с ожидаемыми результатами.
4.6 Используемые методы тестирования
4.6.1 Проверка правильности решения системы линейных уравнений
1) Построим таблицу для ввода исходных данных 2х3:
2) Введем коэффициенты:
2 4 6
-4 2 7
3) Ожидаемое решение:
x1 = -0,8;
x2 = 1,9.
Рассчитаем:
4.6.2 Проверка поведения программы при заведомо неправильных входных данных
Ошибки
1. Пользователь не ввел в ячейку (2,2) коэффициент при переменной
2. Пользователь ввел в ячейку (1,2) данные, которые нельзя преобразовать в число:
3. Введена система линейно зависимых уравнений:
4. Файл со справкой отсутствует в одной папке с программой:
5. Текст программы
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <Math.h>
#include <ShellAPI.h>
#include <stdio.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
double opredelitel(double **Matr1, int size);
int proverka_zapoln (void);
void na_shag_vverh (double **M, int row); // перемещение строк при возникновении стуации деления на ноль
int metod_Gaussa(void);
int perepoln_pri_umnosh(double x1, double x2);
int perepoln_pri_slosh(double x1, double x2);
void pogreshnost(void);
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
StringGrid1->ColCount = 3;
StringGrid1->RowCount = 2;
StringGrid1->Cells[2][0] = "b";
StringGrid1->Cells[1][0] = "x1";
StringGrid1->Cells[0][1] = "y1";
StringGrid2->Cells[0][0] = "x1";
Button1->Caption = "Добавить строку и столбец";
Button2->Caption = "Решить систему";
Button3->Caption = "Удалить строку и столбец";
Button4->Caption = "Справка";
Label1->Caption = "Погрешность = 10";
Label1->Visible = false;
Edit1->Visible = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//добавление строки и столбца
if (StringGrid1->RowCount > 9)
return;
if (StringGrid1->DefaultRowHeight > 30)
{
int razmer;
if (Form1->Height * 1.3 > Form1->Width)
razmer = Form1->Width;
else
razmer = Form1->Height * 1.3;
StringGrid1->Height = 0.2 * razmer;
StringGrid1->Width = 0.9 * razmer;
StringGrid1->ColCount += 1;
StringGrid1->RowCount += 1;
StringGrid1->DefaultRowHeight = (StringGrid1->Height - StringGrid1->RowCount - 1)/StringGrid1->RowCount;
StringGrid1->DefaultColWidth = (StringGrid1->Width - StringGrid1->ColCount - 1)/StringGrid1->ColCount;
StringGrid1->Width = StringGrid1->DefaultColWidth * StringGrid1->ColCount + (StringGrid1->ColCount + 3);
StringGrid1->Height = StringGrid1->DefaultRowHeight * StringGrid1->RowCount + (StringGrid1->ColCount + 3);
StringGrid1->Font->Size = floor(StringGrid1->DefaultColWidth / 14);
StringGrid2->Font->Size = StringGrid1->Font->Size;
StringGrid2->DefaultRowHeight = StringGrid1->DefaultRowHeight;
StringGrid2->DefaultColWidth = StringGrid1->DefaultColWidth;
StringGrid2->Width = StringGrid1->Width - StringGrid1->DefaultColWidth * 2;
StringGrid2->Height = StringGrid2->DefaultRowHeight * 2 + 3;
StringGrid2->ColCount += 1;
StringGrid1->Cells[StringGrid1->ColCount - 1][0] = StringGrid1->Cells[StringGrid1->ColCount - 2][0];
StringGrid1->Cells[StringGrid1->ColCount - 2][0] = "x" + IntToStr(StringGrid1->ColCount - 2);
StringGrid1->Cells[0][StringGrid1->RowCount - 1] = "y" + IntToStr(StringGrid1->RowCount - 1);
StringGrid2->Cells[StringGrid1->ColCount - 3][0] = StringGrid1->Cells[StringGrid1->ColCount - 2][0];
for (int i = 1; i < StringGrid1->ColCount; i++)
{
StringGrid1->Cells[StringGrid1->ColCount - 1][i] = StringGrid1->Cells[StringGrid1->ColCount - 2][i];
StringGrid1->Cells[StringGrid1->ColCount - 2][i] = "";
}
}
else
{
StringGrid1->ColCount += 1;
StringGrid1->RowCount += 1;
StringGrid1->Cells[StringGrid1->ColCount - 1][0] = StringGrid1->Cells[StringGrid1->ColCount - 2][0];
StringGrid1->Cells[StringGrid1->ColCount - 2][0] = "x" + IntToStr(StringGrid1->ColCount - 2);
StringGrid1->Cells[0][StringGrid1->RowCount - 1] = "y" + IntToStr(StringGrid1->RowCount - 1);
StringGrid2->ColCount += 1;
StringGrid2->Cells[StringGrid1->ColCount - 3][0] = StringGrid1->Cells[StringGrid1->ColCount - 2][0];
for (int i = 1; i < StringGrid1->ColCount; i++)
{
StringGrid1->Cells[StringGrid1->ColCount - 1][i] = StringGrid1->Cells[StringGrid1->ColCount - 2][i];
StringGrid1->Cells[StringGrid1->ColCount - 2][i] = "";
}
if ((StringGrid2->DefaultColWidth + 1) * StringGrid2->ColCount + 3 <= StringGrid1->Width)
{
StringGrid2->Width = (StringGrid2->DefaultColWidth + 1) * StringGrid2->ColCount + 5;
}
else
{
StringGrid2->Width = StringGrid1->Width;
StringGrid2->Height = StringGrid2->DefaultRowHeight * 2 + 20;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
//удаление строки и столбца
if (StringGrid1->ColCount > 3)
{
if (StringGrid1->DefaultColWidth * (StringGrid1->ColCount - 1) + StringGrid1->ColCount < StringGrid1->Width)
{
int razmer;
if (Form1->Height * 1.3 > Form1->Width)
razmer = Form1->Width;
else
razmer = Form1->Height * 1.3;
StringGrid1->Height = 0.2 * razmer;
StringGrid1->Width = 0.9 * razmer;
for (int i = 0; i < StringGrid1->RowCount - 1; i++)
{
StringGrid1->Cells[StringGrid1->ColCount - 2][i] = StringGrid1->Cells[StringGrid1->ColCount - 1][i];
}
StringGrid1->ColCount--;
StringGrid1->RowCount--;
StringGrid2->ColCount--;
StringGrid1->DefaultRowHeight = (StringGrid1->Height - StringGrid1->RowCount - 1)/StringGrid1->RowCount;
StringGrid1->DefaultColWidth = (StringGrid1->Width - StringGrid1->ColCount - 1)/StringGrid1->ColCount;
StringGrid1->Width = StringGrid1->DefaultColWidth * StringGrid1->ColCount + (StringGrid1->ColCount + 3);
StringGrid1->Height = StringGrid1->DefaultRowHeight * StringGrid1->RowCount + (StringGrid1->ColCount + 3);
StringGrid1->Font->Size = floor(StringGrid1->DefaultColWidth / 14);
StringGrid2->Font->Size = StringGrid1->Font->Size;
StringGrid2->DefaultRowHeight = StringGrid1->DefaultRowHeight;
StringGrid2->DefaultColWidth = StringGrid1->DefaultColWidth;
StringGrid2->Width = StringGrid1->Width - StringGrid1->DefaultColWidth * 2;
StringGrid2->Height = StringGrid2->DefaultRowHeight * 2 + 3;
}
else
{
for (int i = 0; i < StringGrid1->RowCount - 1; i++)
{
StringGrid1->Cells[StringGrid1->ColCount - 2][i] = StringGrid1->Cells[StringGrid1->ColCount - 1][i];
}
StringGrid1->ColCount--;
StringGrid1->RowCount--;
StringGrid2->ColCount--;
if ((StringGrid2->DefaultColWidth + 1) * StringGrid2->ColCount + 3 < StringGrid1->Width)
{
StringGrid2->Width = (StringGrid2->DefaultColWidth + 1) * StringGrid2->ColCount + 5;
}
else
{
StringGrid2->Width = StringGrid1->Width;
StringGrid2->Height = StringGrid2->DefaultRowHeight * 2 + 20;
}
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
double op = 1;
int a = proverka_zapoln();
if (a == 1)
{
return;
}
double **M;
int n = StringGrid1->ColCount - 2;
M = new double* [n];
for (int i = 0; i < n; i++)
{
M[i] = new double [n];
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
M[i][j] = StringGrid1->Cells[j+1][i+1].ToDouble();
}
}
if (n > 1)
op = opredelitel(M, n);
if (op)
{
metod_Gaussa();
pogreshnost();
}
else
Application->MessageBoxA("Это система содержит линейно зависимые уравнения","Ошибка",0);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormResize(TObject *Sender)
{
int razmer;
if (Form1->Height * 1.3 > Form1->Width)
razmer = Form1->Width;
else
razmer = Form1->Height * 1.3;
if (StringGrid1->Top == 0.14 * razmer)
return;
StringGrid1->Top = 0.24 * razmer;
StringGrid2->Top = 0.47 * razmer;
Button1->Top = 0.06 * razmer;
Button2->Top = 0.06 * razmer;
Button3->Top = 0.14 * razmer;
Button4->Top = 0.06 * razmer;
Label1->Top = 0.16 * razmer;
Edit1->Top = 0.14 * razmer;
StringGrid1->Left = 0.05 * razmer;
StringGrid2->Left = 0.05 * razmer;
Button1->Left = 0.05 * razmer;
Button2->Left = 0.4 * razmer;
Button3->Left = 0.05 * razmer;
Button4->Left = 0.82 * razmer;
Label1->Left = 0.4 * razmer;
Edit1->Left = 0.57 * razmer;
StringGrid1->Width = 0.9 * razmer;
StringGrid1->Height = 0.2 * razmer;
if ((StringGrid1->Height - StringGrid1->RowCount)/StringGrid1->RowCount > 30)
{
StringGrid1->DefaultRowHeight = (StringGrid1->Height - StringGrid1->RowCount)/StringGrid1->RowCount;
StringGrid1->DefaultColWidth = (StringGrid1->Width - StringGrid1->ColCount)/StringGrid1->ColCount;
StringGrid1->Width = StringGrid1->DefaultColWidth * StringGrid1->ColCount + (StringGrid1->ColCount + 3);
StringGrid1->Height = StringGrid1->DefaultRowHeight * StringGrid1->RowCount + (StringGrid1->ColCount + 3);
StringGrid1->Font->Size = floor(StringGrid1->DefaultColWidth * 1 / 14);
StringGrid2->Font->Size = StringGrid1->Font->Size;
StringGrid2->DefaultRowHeight = StringGrid1->DefaultRowHeight;
StringGrid2->DefaultColWidth = StringGrid1->DefaultColWidth;
StringGrid2->Width = StringGrid1->Width - StringGrid1->DefaultColWidth * 2;
StringGrid2->Height = StringGrid2->DefaultRowHeight * 2 + 3;
}
else
{
StringGrid1->DefaultColWidth = 116;
StringGrid2->DefaultColWidth = 116;
StringGrid1->DefaultRowHeight = 30;
StringGrid1->DefaultRowHeight = 30;
StringGrid2->Font->Size = StringGrid1->Font->Size;
StringGrid1->Font->Size = floor(StringGrid1->DefaultColWidth * 1 / 14);
StringGrid2->Font->Size = StringGrid1->Font->Size;
if ((StringGrid2->DefaultColWidth + 1) * StringGrid2->ColCount + 3 <= StringGrid1->Width)
{
StringGrid2->Width = (StringGrid2->DefaultColWidth + 1) * StringGrid2->ColCount + 5;
StringGrid2->Height = StringGrid2->DefaultRowHeight * 2 + 5;
}
else
{
StringGrid2->Width = StringGrid1->Width;
StringGrid2->Height = StringGrid2->DefaultRowHeight * 2 + 20;
}
}
Button1->Height = 0.06 * razmer;
Button1->Width = 0.3 * razmer;
Button1->Font->Size = 0.017 * razmer;
Button2->Height = 0.06 * razmer;
Button2->Font->Size = 0.017 * razmer;
Button2->Width = 0.37 * razmer;
Button3->Height = 0.06 * razmer;
Button3->Font->Size = 0.017 * razmer;
Button3->Width = 0.3 * razmer;
Button4->Height = 0.06 * razmer;
Button4->Font->Size = 0.017 * razmer;
Button4->Width = 0.12 * razmer;
Label1->Font->Size = 0.017 * razmer;
Edit1->Height = 0.04 * razmer;
Edit1->Font->Size = 0.017 * razmer;
Edit1->Width = 0.06 * razmer;
}
//---------------------------------------------------------------------------
int metod_Gaussa (void)
{
int size = Form1->StringGrid1->RowCount - 1;
double **M;
M = new double* [size];
for (int i = 0; i < size; i++)
{
M[i] = new double[size + 1];
}
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size + 1; j++)
{
M[i][j] = Form1->StringGrid1->Cells[j + 1][i + 1].ToDouble();
}
}
for (int i = 0; i < size; i++)
{
for (int p = i; p < size + 1; p++)
{
if (M[i][i] == 0)
{
na_shag_vverh(M, i);
}
else
break;
if (p == size)
return 1;
}
for (int j = 0; j < size; j++)
{
for (int k = size; k > i - 1; k--)
{
M[i][k] /= M[i][i];
}
if (i != j)
{
if (M[j][i] != 0)
{
for (int k = i; k < size + 1; k++)
{
M[i][k] *= M[j][i];
}
for (int k = i; k < size + 1; k++)
{
M[j][k] -= M[i][k];
}
}
for (int k = size; k > i - 1; k--)
{
M[i][k] /= M[i][i];
}
}
}
}
for (int i = 0; i < size; i++)
{
Form1->StringGrid2->Cells[i][1] = M[i][size];
}
return 0;
}
//----------------------------------------------------------------------------
int proverka_zapoln(void)
{
// Проверка заполненности всех ячеек
for (int i = 0; i < Form1->StringGrid1->ColCount - 1; i++)
{
for (int j = 0; j < Form1->StringGrid1->ColCount - 2; j++)
{
if (Form1->StringGrid1->Cells[i + 1][j + 1] == "")
{
Application->MessageBoxA("Не все ячейки заполнены","Ошибка",0);
return 1;
}
try
{
Form1->StringGrid1->Cells[i + 1][j + 1].ToDouble();
}
catch(EConvertError&)
{
Application->MessageBoxA("Не во всех ячейках числовые данные","Ошибка",0);
return 1;
}
catch(...)
{
}
}
}
return 0;
}
//---------------------------------------------------------------------------
double opredelitel(double **Matr1, int size)
{
double znach, znach1, **Matr, element;
int error;
if (size == 2)
{
error = perepoln_pri_umnosh(Matr1[0][0], Matr1[1][1]);
if (error == 1)
return 3 * pow(10, 308);
error = perepoln_pri_umnosh(Matr1[1][0], Matr1[0][1]);
if (error == 1)
return 3 * pow(10, 308);
error = perepoln_pri_slosh(Matr1[0][0]*Matr1[1][1], -Matr1[1][0]*Matr1[0][1]);
if (error == 1)
return 3 * pow(10, 308);
znach = Matr1[0][0]*Matr1[1][1] - Matr1[1][0]*Matr1[0][1];
}
else
{
znach = 0;
Matr = new double* [size - 1];
for (int i = 0; i < size - 1; i++)
{
Matr[i] = new double [size - 1];
}
for (int i = 0; i < size; i++)
{
element = Matr1[i][0];
if (i%2 == 1)
element *= -1;
for (int j = 0, j1 = 0; j < size - 1; j++, j1++)
{
if (j1 == i)
j1++;
if (j1 > size)
break;
for (int k = 0; k < size - 1; k++)
{
Matr[j][k] = Matr1[j1][k + 1];
}
}
znach1 = opredelitel(Matr,size - 1);
if (znach1 == 3 * pow(10, 308))
return 3 * pow(10, 308);
error = perepoln_pri_umnosh(znach1, element);
if (error == 1)
return 3 * pow(10, 308);
znach1 *= element;
error = perepoln_pri_slosh(znach, znach1);
if (error == 1)
return 3 * pow(10, 308);
znach += znach1;
}
}
return znach;
}
//----------------------------------------------------------------------------
void na_shag_vverh (double **M, int row)
{
int size = Form1->StringGrid1->RowCount;
double *str = new double[size];
for (int i = 0; i < size; i++)
{
str[i] = M[row][i];
}
for (int i = row; i < size - 2; i++)
{
for (int j = 0; j < size; j++)
{
M[i][j] = M[i + 1][j];
}
}
for (int i = 0; i < size; i++)
{
M[size - 2][i] = str[i];
}
delete str;
return;
}
//----------------------------------------------------------------------------
int perepoln_pri_umnosh(double x1, double x2)
{
try
{
x1 * x2;
}
catch (EOverflow&)
{
Application->MessageBoxA("Программа не может продолжить выполнение программы, так как аппаратура не настоько мощна","Ошибка",0);
return 1;
}
return 0;
}
//---------------------------------------------------------------------------
int perepoln_pri_slosh(double x1, double x2)
{
try
{
x1 * x2;
}
catch (EOverflow&)
{
Application->MessageBoxA("Программа не может продолжить выполнение программы, так как аппаратура не настоько мощна","Ошибка",0);
return 1;
}
return 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
FILE* stream;
stream = fopen("Gauss_help.mht","rt");
if (!stream)
{
Application->MessageBoxA("Не найден файл со справкой","Ошибка",0);
return;
}
ShellExecute(Handle,NULL,"Gauss_help.mht",NULL,NULL,SW_RESTORE);
}
//--------------------------------------------------------------------------
void pogreshnost(void)
{
double max = 0, promegut, b;
for (int i = 1; i < Form1->StringGrid1->RowCount; i++)
{
promegut = 0;
for (int j = 1; j < Form1->StringGrid1->RowCount; j++)
{
promegut += Form1->StringGrid1->Cells[j][i].ToDouble() * Form1->StringGrid2->Cells[j-1][1].ToDouble();
}
if (promegut < 0)
promegut *= -1;
b = Form1->StringGrid1->Cells[Form1->StringGrid1->RowCount][i].ToDouble();
if (b < 0)
b *= -1;
promegut = promegut - b;
if (promegut < 0)
promegut *= -1;
if (promegut > max)
max = promegut;
}
if (max)
Form1->Edit1->Text = floor(log10(max));
else
Form1->Edit1->Text = "-oo";
Form1->Label1->Visible = true;
Form1->Edit1->Visible = true;
}
6. Блок-схема программы
6.1 Блок-схема события Click кнопки «Решить систему»
6.2 Блок-схема функции int proverka_zapoln()
6.3 Блок-схема функции double opredelitel(double **Matr1, int size)
6.4 Блок-схема функции int metod_Gaussa()
6.5 Блок-схема функции void pogreshnost()
6.6 Блок-схема функции void na_shag_vverh (double **M, int row)
6.7 Блок-схема функции int perepoln_pri_umnosh(double x1, double x2)
6.8 Блок-схема функции int perepoln_pri_slosh(double x1, double x2)
Заключение
Результатом выполнения курсовой работы является программа, позволяющая находить решение системы линейных линейно независимых уравнений без свободных переменных методом Гаусса.
Программный продукт обладает интерфейсом пользователя эстетичного внешнего вида с эргономичным расположением управляющих элементов, содержит систему меню, строго определяющую диалог пользователя с программой, систему помощи, позволяющую пользователю получить справку о текущем состоянии программы, вариантах продолжения работы и о математической основе происходящего. Также имеет место обработчик ошибок пользователя и выполнения с выдачей диагностического сообщения.
Автор стремился сделать программу дружественной к пользователю. Окна не насыщены графикой и ненужными элементами.
Также были написаны некоторые документы, соответствующие заданию кафедры, прилагающиеся к программному обеспечению в соответствии с ЕСПД и СТД АСУ.
Библиографический список
1) Глушаков С. В. Программирование в среде Borland C++ Builder 6.0 /
С. В. Глушаков, К. Н. Зорянский, С. Н. Хомяков.-М: Фолио,2003.-508с.
2) Архангельский А.Я. Программирование в C++Builder 6./ А.Я. Архангельский. - М.: Бином - Пресс, 2003. - 1152с.
3) Брайан О. С++ без страха / Брайан О. -М.: Триумф, 2005. - 432 с.
Размещено на Allbest.ru
...Подобные документы
Составление математической модели решения транспортной задачи. Описание входной и выходной информации. Программно-технические средства, используемые при разработке программы. Общее описание программы, ее назначение, информационная совместимость.
курсовая работа [49,1 K], добавлен 24.05.2013Системы линейных алгебраических уравнений. Матричный метод решения систем линейных уравнений. Решение задачи математическим методом. Блок-схема алгоритма и листинг программы. Расчет трудоемкости разработки программы. Расчет себестоимости и цены программы.
дипломная работа [144,8 K], добавлен 25.04.2012Сущность матричного метода. Разработка программы решения системы уравнений линейных алгебраических уравнений методом решения через обратную матрицу на языке программирования Delphi. Представление блок-схемы и графического интерфейса программного продукта.
курсовая работа [1,0 M], добавлен 27.09.2014Метод Гаусса-Зейделя как модификация метода Якоби, его сущность и применение. Разработка программы решения системы линейных алгебраических уравнений на языке VB, проверка правильности работы программы в MS Excel и математических пакетах MathCad и MatLab.
курсовая работа [325,5 K], добавлен 27.10.2013Применение итерационных методов численного решения системы линейных алгебраических уравнений при вычислении на ЭВМ. Математические и алгоритмические основы решения задачи, метод Гаусса. Функциональные модели и блок-схемы, программная реализация решения.
курсовая работа [527,5 K], добавлен 25.01.2010Описание математической модели определения тока в электрической цепи с помощью решения системы алгебраических уравнений методом Гаусса. Описание и разработка блок-схемы программы. Ввод данных задачи, составление программы и анализ результатов решения.
контрольная работа [231,8 K], добавлен 15.08.2012Разработка программы для решения нелинейных уравнений различными численными методами: с помощью дискриминанта и таблицы Горнера, теоремой Виетта. Требования к интерфейсу. Компоненты среды Delphi, использованные в программе. Реализация и тестирование.
курсовая работа [1,3 M], добавлен 20.04.2011Решение систем алгебраических линейных уравнений методом Крамера. Сущность метода прогонки. Программная реализация метода: блок-схема алгоритма, листинг программы. Проверка применимости данного способа решения для конкретной системы линейных уравнений.
курсовая работа [581,0 K], добавлен 15.06.2013Средства программирования, описание языка С++. Назначение программы, требования к документации. Стадии разработки, виды испытаний. Используемые технические, программные средства. Вызов и загрузка, входные и выходные данные. Программа и методика испытаний.
контрольная работа [205,3 K], добавлен 23.07.2013Системы линейных алгебраических уравнений. Код программы для решения систем линейных алгебраических уравнений. Математические и алгоритмические основы решения задачи методом Гаусса. Программная реализация решения. Алгоритмы запоминания коэффициентов.
лабораторная работа [23,5 K], добавлен 23.09.2014Постановка задачи, математические и алгоритмические основы решения системы линейных алгебраических уравнений. Решение системы данных уравнений методом Гаусса с выбором главного элемента по столбцу. Функциональные модели и блок-схемы решения задачи.
курсовая работа [428,9 K], добавлен 25.01.2010Основы классификации объектов, их типы и подходы к моделированию. Программные и технические средства, используемые в данном процессе. Этапы моделирования, их общее описание и значение: постановка задачи, разработка модели, компьютерный эксперимент.
реферат [36,3 K], добавлен 23.12.2014Автоматизация решения системы уравнения методом Гаусса (классического метода решения системы линейных алгебраических уравнений, остоящего в постепенном понижении порядка системы и исключении неизвестных) и решения уравнения методами хорд и Ньютона.
курсовая работа [578,2 K], добавлен 10.02.2011Использование MS Excel для математических расчетов. Описание численных методов решения системы линейных алгебраических уравнений. Решение систем линейных алгебраических уравнений с методами Крамера и Зейделя и с помощью табличного процессора MS Excel.
курсовая работа [1,6 M], добавлен 14.02.2021Назначение и область применения, технические характеристики, постановка задачи, описание алгоритма и организация входных и выходных данных для программы. Разработка, описание логической структуры, используемые технические средства и условия выполнения.
курсовая работа [969,3 K], добавлен 26.03.2009Автоматизация расчетов выполнения весенне-полевых работ в сельском хозяйстве средствами Системы управления базы данных. Структура входной и выходной информации. Блок-схема алгоритма решения задачи. Краткое описание программного средства обработки данных.
контрольная работа [58,8 K], добавлен 07.04.2014Метод Гаусса как прямой метод нахождения решений для систем системы линейных уравнений маленькой и средней размерности с помощью компьютерной техники. Редактор кода и исходный код основной программы в Delphi, блок-схема и графическое решение задачи.
контрольная работа [460,8 K], добавлен 15.06.2015Обзор существующих методов по решению нелинейных уравнений. Решение нелинейных уравнений комбинированным методом и методом хорд на конкретных примерах. Разработка программы для решения нелинейных уравнений, блок-схемы алгоритма и листинг программы.
курсовая работа [435,8 K], добавлен 15.06.2013Решение линейных дифференциальных уравнений численными и символьными методами в рамках пакета компьютерной математики MathCAD. Сравнения результов решений и применение их при исследовании функционирования автоматических систем и электрических агрегатов.
контрольная работа [51,5 K], добавлен 07.05.2009Определение системы m линейных уравнений с n неизвестными. Математическая модель задачи. Анализ входных и выходных данных. Требования к надежности разрабатываемой программы. Структурная диаграмма программного модуля. Разработка блок-схем и тестирование.
курсовая работа [162,0 K], добавлен 28.08.2012