ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
ВЯТСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ФАВТ
РАЗРАБОТКА ПРОГРАММЫ ДЛЯ РЕШЕНИЯ СИСТЕМ ЛИНЕЙНЫХ УРАВНЕНИЙ
Пояснительная записка
Курсовая работа по дисциплине
"Информатика"
ТПЖА.12203-01 81 01 ПЗ
Разработал студент гр. СК-00 ____________ /А. И. Иванов/
Руководитель преподаватель
ФАВТ ____________ / К. И. Петров/
Курсовая работа защищена с оценкой“___________” “__”_____2002 г.
Киров 2002
Реферат
А. И. Иванов. Разработка программы для решения систем линейных уравнений: ТПЖА 12203-01 81 01 ПЗ. Курсовая работа/ВятГУ, ФАВТ, рук. К. И. Петров – Киров, 2002. ПЗ 7 с., 3 табл., 8 рис., 4 источника, 4 прил.; програм. докум. 18 л.
СИСТЕМА ЛИНЕЙНЫХ УРАВНЕНИЙ, МЕТОД ЗЕЙДЕЛЯ, МЕТОД ПРОСТЫХ ИТЕРАЦИЙ, МАТРИЦА КОЭФФИЦИЕНТОВ, ВЕКТОР СВОБОДНЫХ ЧЛЕНОВ, УСЛОВИЕ СХОДИМОСТИ
Объектом исследования являются итерационные методы решения систем линейных алгебраических уравнений (далее СЛАУ): метод простых итераций и метод Зейделя.
Цель работы – разработка программы для решения СЛАУ с произвольным количеством уравнений.
Для получения вектора решений СЛАУ реализованы методы Зейделя и простых итераций.
Недостатком исследуемого метода – невозможность нахождения решения за конечное число итераций даже при отсутствии вычислительной погрешности.
Результаты проведённой работы могут быть использованы при решении СЛАУ с произвольным количеством уравнений.
Среда программирования – Borland C.
Содержание
Введение 2
1 Анализ задания и выбор метода решения 3
1.1 Анализ задания 3
1.2 Выбор метода решения 3
1.2.1 Метод простых итераций 4
1.2.2 Метод Зейделя 4
2 Реализация метода решения задачи 5
2.1 Контроль входной информации 5
2.2 Формат вывода выходной информации 5
2.3 Выбор типов входных, рабочих и выходных переменных,
используемых в программе 6
2.4 Проектирование программы 6
2.5 Анализ результата 6
Заключение 7
Приложение А (обязательное) Разработка программы для решения систем линейных уравнений. Описание программы. ТПЖА.12203-01 13 01 8
Приложение Б (обязательное). Разработка программы для решения систем линейных уравнений. Руководство пользователя. ТПЖА.12203-01 34 01..
Приложение В (обязательное). Разработка программы для решения систем линейных уравнений. Текст программы. ТПЖА.12203-01 12 01 23
Приложение Г (справочное) 45
Введение
Решение СЛАУ является одной из важных вычислительных задач, часто встречающихся в прикладной математике. К решению систем линейных уравнений сводится ряд задач анализа, связанных с приближением функций, решение систем дифференциальных уравнений и интегральных уравнений и т.д.
В связи с использованием большого количества переменных в системе ручной расчёт СЛАУ довольно трудоёмкий и может занять много времени. Актуальность данной курсовой работы заключается в том, что вышеописанная проблема разрешается с помощью разработанной курсовой программы.
Курсовая работа носит учебный характер. В ходе её программист реализовал имеющиеся знания из курса линейной алгебры по решению СЛАУ в программной интерпретации на языке программирования С. А знание компьютера и наличие опыта в программировании в наше время особенно приветствуется в фирмах, работающих в сфере информационных технологий.
1 Анализ задания и выбор метода решения
1.1 Анализ задания
В соответствии с заданием на курсовую работу необходимо разработать программу для решения СЛАУ методом простых итераций и методом Зейделя. Предусмотреть ввод числа уравнений, матрицы коэффициентов и вектора свободных членов, а также вывод вектора решений на экран.
Для удобства тестирования программа должна обладать понятным и логичным интерфейсом, рассчитанным на неопытного пользователя.
1.2 Выбор метода решения
В соответствии с заданием на курсовую работу в программе реализованы итерационные методы: простых итераций и Зейделя.
Пусть ищется решение невырожденной системы уравнений[1]
.
(1)
Первым шагом в итерационном методе является преобразование исходной системы к виду[1]
,
(2)
где матрицы С, В и вектор d определяются по матрицы А и вектору b. Причём системы (1) и (2) являются эквивалентными, т.е. их решения совпадают, а построение обратной матрицы С-1 проще, чем А-1. [1]
Вторым шагом является расстановка индексов или номеров приближений в (2) и задание нулевого приближения. Например,
(3)
где - заданный вектор [1]
Третьим шагом итерационного метода является обоснование сходимости последовательных приближений , полученных из (3), к точному решению х системы и оценка погрешности k-го приближения[1]
(4)
Оценка (4) при заданном позволяет остановить итерационный про-цесс (3). [1]
Различные итерационные методы отличаются первыми двумя шагами, а выбор конкретного метода должен производиться на основании оценки(4). [1]
1.2.1 Метод простых итераций
В методе простых итераций матрица С (2) выбирается единичной: С=Е. Итерационный процесс описывается формулой
(5)
где - заданный вектор. [1]
1.2.2 Метод Зейделя
Отличие метода Зейделя от простой итерации состоит лишь в том, что при вычислении (k+1)-го приближения полученные компоненты вектора сразу же используются в вычислениях. В матричной записи это можно представить так:
где матрицы U и L получены разложением В в сумму:
матрица U – верхняя треугольная часть B, включая диагональ; L – нижняя поддиагональная часть В. [1]
Таким образом метод Зейделя можно записать в следующей форме
(6)
Заметим, что построение матрицы, обратной , не представляет труда, так как это нижняя треугольная матрица. [1]
2 Реализация метода решения задачи
2.1 Контроль входной информации
Метод контроля входной информации должен обеспечить максималь-ную защиту от некорректности вводимых данных, защиту от переполнения строки и минимальный перечень ограничений при вводе информации.
В программе входные данные, задаются пользователем в режиме диалогового окна. Это позволяет практически полностью контролировать входную информацию и избежать некорректности вводимых данных, так как далее эта информация используется в вычислениях. Функции float_input() и n_input() предназначены для защиты от некорректного ввода действительных и натуральных чисел соответственно (приложение В).
2.2 Формат вывода выходной информации
Вывод результатов расчёта производится в окне Output.
В окне выводится исходная СЛАУ, ниже вектор решений, а также число итераций, необходимых для нахождения решения.
2.3 Выбор типов входных, рабочих и выходных переменных, используемых в программе
В программе использованы следующие переменные:
char ch
int s
int n
double **A
double *B
double *X
bool inpflag=false
bool decflag=false
перемещение между окнами
число итераций
размерность матриц
матрица коэффициентов
вектор свободных членов
вектор решений
флажок выполнения операции ввода
флажок выполнения операции решения
2.4 Проектирование программы
Рабочий модуль программы – Zeidel.cpp.
Для корректной работы программы реализованы методы корректного ввода входной информации, решение СЛАУ с пояснением выполняемых действий, форматированный вывод выходной информации на экран и в файл. Для удобства тестирования разработан интерфейс, рассчитанный на неопытного пользователя.
2.5 Анализ результата
В результате проделанной программистом работы разработана программа, реализующая решение СЛАУ методами Зейделя и простых итераций и выполненная в удобном и понятном интерфейсе, понятном неопытному пользователю.
Пример расчета СЛАУ со следующими входными данными:
Исходная матрица А 45 8.6
7.3 8.1
Вектор свободных членов В 12
4.5
Результаты расчёта:
Вектор решений 0.1938
0.3809
Число итераций 5
Заключение
В ходе курсовой работы был разработан программный продукт, в рамках которого были реализованы:
метод простых итераций для решения СЛАУ;
метод Зейделя для решения СЛАУ;
удобный оконный интерфейс для неопытного оператора;
защита от неправильного ввода входной информации;
Приложение А
(обязательное)
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
ВЯТСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ФАВТ
РАЗРАБОТКА ПРОГРАММЫ ДЛЯ РЕШЕНИЯ СИСТЕМ ЛИНЕЙНЫХ УРАВНЕНИЙ
ОПИСАНИЕ ПРОГРАММЫ
Лист утверждения
ТПЖА.12203-01 13 01-ЛУ
Листов 2
Разработал студент гр. СК-00 ____________ / А. И. Иванов /
Руководитель преподаватель
ФАВТ ____________ / К. И. Петров/
Киров 2002
Приложение А
(обязательное)
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
ВЯТСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ФАВТ
Лист утверждения
ТПЖА.12203-01 13 01-ЛУ
РАЗРАБОТКА ПРОГРАММЫ ДЛЯ РЕШЕНИЯ СИСТЕМ ЛИНЕЙНЫХ УРАВНЕНИЙ
ОПИСАНИЕ ПРОГРАММЫ
ТПЖА.12203-01 13 01
Листов 8
Киров 2002
Аннотация
В разделе «Описание программы» рассмотрены функциональные характеристики программы. Перечислены требуемые технические средства для её нормальной работы, а также входные и выходные данные. Приведены необходимые схемы алгоритмов.
Содержание
1 Общие сведения 12
2 Состав и структура программного модуля 12
3 Описание логической структуры 13
4 Входные данные 14
5 Выходные данные 14
6 Схемы алгоритмов программы 15
1 Общие сведения
Исходный текст программы написан на языке С.
2 Состав и структура программного модуля
Программный код представлен в модуле Zeidel.cpp, состав которого представлен в таблице А.1.
Таблица А.1 – Состав программного модуля Zeidel.cpp
Функция Назначение
main Основная функция программы
input Ввод исходных данных
float_input Ввод действительных чисел
n_input Ввод натуральных чисел
decision Решение СЛАУ
output Вывод результата работы программы
menu Функция рисования пунктов меню
help Вывод на экран информации о программе и разработ-чике
cursor Навигация курсора
Данный программный продукт имеет структуру, представленную на рисунке А.1.
Рисунок А.1 – Структура программного модуля
3 Описание логической структуры
Функция main – основная функция программы, реализующая меню для выбора требуемой операции. Тело функции представляет собой цикл, в котором производится вывод строк меню, ожидание ввода символа с клавиатуры и последующий анализ введенного символа.
Навигация в меню осуществляется клавишами курсора. И в соответствии с выбранным пунктом открывается диалоговое окно.
Функция menu играет связующее звено в интерфейсе программы – вы-водит на экран меню программы.
Ввод данных производится функцией input, а проверка корректности вводимой информации функциями float_input, которая позволяет вводить действительные числа, и n_input, позволяющая вводить натуральные числа, а также ограничивает ввод цифр в числе и препятствует вводу иных символов.
Решение введенной СЛАУ реализовано в функции decision. При этом пользователю предлагается выбор метода решения СЛАУ (метод Зейделя или
метод простых итераций).
Вывод результатов производится функцией output на экран.
В случае выбора опций «Decision» и «Output» без выполнения опции «Input» и опции «Output» без «Decision» программа выдаст предупредительное сообщение с напоминанием выполнения требуемых действий.
3 Входные данные
Входные данные представлены в таблице A.2.
Таблица А.2 – Входные данные
Переменная Диапазон Назначение
int n 1…10 Размерность матриц
double **А -99.99…99.999 Матрица коэффициентов
double *В Вектор свободных членов
4 Выходные данные
Выходные данные представлены в таблице A.3.
Таблица А.3 – Входные данные
Переменная Диапазон Назначение
double *X -3.4Е-38…3.4Е+38 Вектор решений СЛАУ
5 Схемы алгоритмов программы
Схема алгоритма функции decision представлена на рисунке A.2.
Рисунок А.2 – Схема алгоритма функции
void decision(double **&A, double *&B, double *&X, int &n, int &s)
Приложение Б
(обязательное)
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
ВЯТСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ФАВТ
РАЗРАБОТКА ПРОГРАММЫ ДЛЯ РЕШЕНИЯ СИСТЕМ ЛИНЕЙНЫХ УРАВНЕНИЙ
РУКОВОДСТВО ОПЕРАТОРА
Лист утверждения
ТПЖА.12203-01 34 01-ЛУ
Листов 2
Разработал студент гр. СК-02 ____________ / А. И. Иванов /
Руководитель преподаватель
ФАВТ ____________ / К. И. Петров/
Киров 2002
Приложение Б
(обязательное)
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
ВЯТСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ФАВТ
Лист утверждения
ТПЖА.12203-01 34 01-ЛУ
РАЗРАБОТКА ПРОГРАММЫ ДЛЯ РЕШЕНИЯ СИСТЕМ ЛИНЕЙНЫХ УРАВНЕНИЙ
РУКОВОДСТВО ОПЕРАТОРА
ТПЖА.12203-01 34 01
Листов 7
Киров 2002
Аннотация
В приложении «Руководство оператора» указаны подробные инструкции по работе с программой. В этом приложении указаны условия, необходимые для запуска программы, а также с чего следует начинать работу. Также приложение содержит подробное описание пользовательского интерфейса программы.
Содержание
1 Условия выполнения программы 20
2 Запуск 20
3 Обработка критических ситуаций 20
4 Работа с программой 21
4.1 Ввод исходных данных 21
4.2 Решение СЛАУ 21
4.3 Вывод результата работы 21
1 Условия выполнения программы
Файл Zeidel.exe является главным модулем, и его присутствие гарантирует корректный запуск программы.
2 Запуск
Для начала работы с программой следует запустить файл Zeidel.exe. Экранная форма программы после запуска показана на рисунке Б.1.
Рисунок Б.1 – Экранная форма программы
3 Обработка критических ситуаций
Навигация в программе осуществляется клавишами курсора (зелёная полоска в меню).
Программа снабжена защитой от некорректных действий пользователя, в частности: выбор пунктов «Decision» и «Output» без ввода исходных данных в программу, выбор пункта «Output» не выполнив опцию «Decision». На рисунке Б.2 показан пример работы программы в критической ситуации.
Рисунок Б.2 – Пример работы программы в критической ситуации
4 Работа с программой
4.1 Ввод исходных данных
При выборе пункта меню «Input» экране появится диалоговое окно ввода данных, показанное на рисунке Б.3.
Рисунок Б.3 – Окно ввода исходных данных
4.2 Решение системы
Решение СЛАУ реализовано в опции «Decision» (см. рисунок Б.4).
Рисунок Б.4 – Окно решения СЛАУ
4.3 Вывод результата работы
Вывод полученного вектора решений СЛАУ предусмотрен на экран. Диалоговое окно, вызванное обращением пользователя «Output» представлено на рисунке Б.5.
Рисунок Б.5 – Окно вывода результата на экран
При вводе более 5 уравнений система полностью не помещается в окно вывода результата. В этом случае предусмотрена прокрутка матрицы влево, вправо, вниз и вверх. Диалоговое окно при скроллинге представлено на рисунке Б.6.
Рисунок Б.6 – Окно вывода результата на экран
Приложение В
(обязательное)
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
ВЯТСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ФАВТ
РАЗРАБОТКА ПРОГРАММЫ ДЛЯ РЕШЕНИЯ СИСТЕМ ЛИНЕЙНЫХ УРАВНЕНИЙ
ТЕКСТ ПРОГРАММЫ
Лист утверждения
ТПЖА.12203-01 12 01-ЛУ
Листов 2
Разработал студент гр. СК-00 ____________ /А. И. Иванов/
Руководитель преподаватель
ФАВТ ____________ / К. И. Петров/
Киров 2002
Приложение В
(обязательное)
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
ВЯТСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
Факультет прикладной математики и телекоммуникаций
Кафедра радиоэлектронных средств
Лист утверждения
ТПЖА.12203-01 12 01-ЛУ
РАЗРАБОТКА ПРОГРАММЫ ДЛЯ РЕШЕНИЯ СИСТЕМ ЛИНЕЙНЫХ УРАВНЕНИЙ
ТЕКСТ ПРОГРАММЫ
ТПЖА.12203-01 12 01
Листов 22
Киров 2002
Аннотация
Приложение «Текст программы» содержит полный код программы.
Содержание
1 menu 27
2 cursor 28
3 float_input 31
4 n_input 32
5 about 33
6 task 34
7 help 34
8 input 35
9 decision 37
10 output 39
11 42
/*
Разработать программу для решения систем линейных уравнений.
Реализовать методы а)простых итераций; б) Зейделя.
Предусмотреть ввод числа уравнений(до 10), матрицы коэффициентов
и вектора свободных членов.
Выполнил студент гр. СК-06 Мамаев С.В.
*/
#include
#include
#include
#include
#include
//функция отрисовки меню
//------------------------------------------------------------------------------
void menu()
{
window(1,1,80,25);
textbackground(BLACK);
clrscr();
window(1,1,80,1);
textbackground(LIGHTGRAY);
clrscr();
gotoxy(1,1);
textcolor(RED);
cprintf("%s","H");
textcolor(BLACK);
cprintf("%s","elp");
gotoxy(9,1);
textcolor(RED);
cprintf("%s","I");
textcolor(BLACK);
cprintf("%s","nput");
gotoxy(18,1);
textcolor(RED);
cprintf("%s","D");
textcolor(BLACK);
cprintf("%s","ecision");
gotoxy(29,1);
textcolor(RED);
cprintf("%s","O");
textcolor(BLACK);
cprintf("%s","utput");
window(1,25,80,25);
textbackground(LIGHTGRAY);
clrscr();
cprintf("Alt+X - exit");
gotoxy(70,1);
textcolor(BLACK);
}
//------------------------------------------------------------------------------
//курсор
//------------------------------------------------------------------------------
void cursor(int n)
{
if(n==1)
{
window(1,1,5,1);
textbackground(GREEN);
clrscr();
textcolor(RED);
cprintf("%s","H");
textcolor(BLACK);
cprintf("%s","elp");
window(5,1,5,1);
textbackground(LIGHTGRAY);
clrscr();
}
if(n==2)
{
window(9,1,14,1);
textbackground(GREEN);
clrscr();
textcolor(RED);
cprintf("%s","I");
textcolor(BLACK);
cprintf("%s","nput");
window(14,1,14,1);
textbackground(LIGHTGRAY);
clrscr();
}
if(n==3)
{
window(18,1,26,1);
textbackground(GREEN);
clrscr();
textcolor(RED);
cprintf("%s","D");
textcolor(BLACK);
cprintf("%s","ecision");
window(26,1,26,1);
textbackground(LIGHTGRAY);
clrscr();
}
if(n==4)
{
window(29,1,35,1);
textbackground(GREEN);
clrscr();
textcolor(RED);
cprintf("%s","O");
textcolor(BLACK);
cprintf("%s","utput");
window(35,1,35,1);
textbackground(LIGHTGRAY);
clrscr();
}
if(n==6)
{
window(3,3,8,3);
textbackground(GREEN);
clrscr();
textcolor(RED);
cprintf("%s","A");
textcolor(BLACK);
cprintf("%s","bout");
window(8,3,8,3);
textbackground(LIGHTGRAY);
clrscr();
}
if(n==7)
{
window(3,4,7,4);
textbackground(GREEN);
clrscr();
textcolor(RED);
cprintf("%s","T");
textcolor(BLACK);
cprintf("%s","ask");
window(7,4,7,4);
textbackground(LIGHTGRAY);
clrscr();
}
if(n==8)
{
window(10,3,18,3);
textbackground(GREEN);
clrscr();
textcolor(RED);
cprintf("%s","K");
textcolor(BLACK);
cprintf("%s","eyboard");
window(18,3,18,3);
textbackground(LIGHTGRAY);
clrscr();
}
if(n==9)
{
window(10,4,14,4);
textbackground(GREEN);
clrscr();
textcolor(RED);
cprintf("%s","F");
textcolor(BLACK);
cprintf("%s","ile");
window(14,4,14,4);
textbackground(LIGHTGRAY);
clrscr();
}
if(n==10)
{
window(30,3,37,3);
textbackground(GREEN);
clrscr();
textcolor(RED);
cprintf("%s","D");
textcolor(BLACK);
cprintf("%s","isplay");
window(37,3,37,3);
textbackground(LIGHTGRAY);
clrscr();
}
if(n==11)
{
window(30,4,34,4);
textbackground(GREEN);
clrscr();
textcolor(RED);
cprintf("%s","F");
textcolor(BLACK);
cprintf("%s","ile");
window(34,4,34,4);
textbackground(LIGHTGRAY);
clrscr();
}
}
//------------------------------------------------------------------------------
//функция ввода натурального числа
//------------------------------------------------------------------------------
int n_input(int max)
{
char ch;
char str[100];
int i=0;
do
{
ch = (char)getch();
if (i==0)
{
if ((ch>"0")&&(ch<="9"))
{
str[i++]=ch;
putch(ch);
}
}
else
{
if ((ch>="0")&&(ch<="9"))
{
str[i++]=ch;
putch(ch);
}
}
if((ch==" ")&&(i==0)) //если нажата клавиша ENTER и ничего не введено
{
ch="x";
printf(" "); //backspace
}
if ((ch=="")&&(i>0)) //если нажата клавиша BACKSPACE
{
i--;
printf(" ");
}
if(i==(max+1)) //если достигли max количества цифр
{
i--;
printf(" ");
}
}
while (ch!=" ");
str[i]=" ";
for (int j=i;j>0;j--)
printf(" ");
printf("%d",atoi(str));
return atoi(str); //преобразуем в число
}
//------------------------------------------------------------------------------
//функция ввода действительного числа
//------------------------------------------------------------------------------
double float_input()
{
const max=6; //максимальное количество цифр в числе
int i=0; //счётчик ввода символа
char ch,buffer[max];
bool flp=0; //флажок ввода символа "."
bool fle=0; //флажок ввода "е"
do
{
ch = (char)getch();
if ((ch=="-")&&((i==0)||(buffer[i-1]=="e"))) //ввод "-"
{ //в начале строки
buffer[i++]=ch; //и после "е"
putch(ch);
}
if ((ch>="0")&&(ch<="9")) //ввод цифр
{
buffer[i++]=ch;
putch(ch);
}
if (((ch==".")||(ch==","))&&(flp==0)) //ввод плавающей
{ //точки
buffer[i++]=".";
putch(".");
flp=1;
}
if ((ch=="e" || ch=="E") && i>0 && fle==0)
{ //ввод "е"
buffer[i++]="e";
putch("e");
fle=1;
}
if ((ch=="")&&(i>0)) //ввод кода
{ //клавиши
i--; //BACKSPACE
cprintf(" ");
if (buffer[i]==".") flp=0;
if (buffer[i]=="E") fle=0;
}
if ((ch==" ")&&(i==0)) ch=" ";
if(i==(max+1))
{
i--;
cprintf(" ");
}
} while (ch!=" ");
buffer[i]=" "; //"закрытие" строки
for (int j=i;j>0;j--)
cprintf(" ");
cprintf("%2.2e",strtod(buffer,0));
return strtod(buffer,0); //преобразование к веществ. значению
}
//------------------------------------------------------------------------------
//О программе
//------------------------------------------------------------------------------
void about()
{
char ch;
window(25,8,59,18);
textbackground(BLACK);
clrscr();
window(24,7,58,17);
textbackground(LIGHTGRAY);
textcolor(BLACK);
clrscr();
cprintf(" ђ §а Ў®вЄ Їа®Ја ¬¬л ¤«п аҐиҐЁп ");
cprintf(" бЁб⥬ «ЁҐ©ле га ўҐЁ©");
cprintf(" ‚ҐабЁп 1.0 2007Ј.");
cprintf(" ‚лЇ®«Ё« бв㤥⠣а. ‘Љ-06");
cprintf(" Њ ¬ Ґў ‘.‚.");
cprintf("
„«п
Їа®¤®«¦ҐЁп
¦¬ЁвҐ
do
{
ch=(char)getch();
}
while(ch!=13); //пока не нажат ENTER
}
//------------------------------------------------------------------------------
//текст задания
//------------------------------------------------------------------------------
void task()
{
char ch;
window(21,6,62,20);
textbackground(BLACK);
clrscr();
window(20,5,61,19);
textbackground(LIGHTGRAY);
textcolor(BLACK);
clrscr();
cprintf(" ђ §а Ў®в вм Їа®Ја ¬¬г ¤«п аҐиҐЁп бЁб⥬");
cprintf(" «ЁҐ©ле га ўҐЁ©. ђҐ «Ё§®ў вм ¬Ґв®¤л: ");
cprintf(" )Їа®бвле ЁвҐа жЁ©; Ў)‡Ґ©¤Ґ«п. ЏаҐ¤гᬮ-");
cprintf(" ваҐвм ўў®¤ зЁб« га ўҐЁ©(¤® 10), ¬ в-");
cprintf(" аЁжл Є®нддЁжЁҐв®ў Ё ўҐЄв®а бў®Ў®¤ле ");
cprintf(" з«Ґ®ў.");
cprintf("
„«п
Їа®¤®«¦ҐЁп
¦¬ЁвҐ
do
{
ch=(char)getch();
}
while(ch!=13); //пока не нажат ENTER
}
//------------------------------------------------------------------------------
//окно help
//------------------------------------------------------------------------------
void help()
{
char ans;
int h_num=1;
do
{
menu(); //отрисовка меню
window(3,4,12,5);
textbackground(BLACK);
clrscr();
window(2,3,11,4);
textbackground(LIGHTGRAY);
clrscr();
textcolor(RED);
cprintf("%s"," A");
textcolor(BLACK);
cprintf("%s","bout");
textcolor(RED);
cprintf("%s"," T");
textcolor(BLACK);
cprintf("%s","ask");
cursor(h_num+5);
ans=(char)getch();
if(ans==80) {if(h_num!=2) h_num++;} //если нажали "стрелку вниз"
if(ans==72) {if(h_num!=1) h_num--;} //если нажали "стрелку вверх"
}
while((ans!=27)&&(ans!="a")&&(ans!="A")&&(ans!="t")&&(ans!="T")&&(ans!=13));
if((ans=="t")||(ans=="T")||((h_num==2)&&(ans==13)))
{
window(2,3,14,6);
textbackground(BLACK);
clrscr();
task(); //окно вывода текста задания
}
if((ans=="a")||(ans=="A")||((h_num==1)&&(ans==13)))
{
window(2,3,14,6);
textbackground(BLACK);
clrscr();
about(); //окно вывода информации о разработчике
}
}
//------------------------------------------------------------------------------
//функция ввода данных
//------------------------------------------------------------------------------
void input(double **&A,double *&B,int &n)
{
char ch;
window(8,3,20,6);
textbackground(BLACK);
clrscr();
window(15,6,64,18);
textbackground(LIGHTGRAY);
clrscr();
textcolor(BLACK);
cprintf("%s"," ‚ўҐ¤ЁвҐ зЁб«® га ўҐЁ© (1..10)");
window(48,8,51,8);
textbackground(BLACK);
textcolor(LIGHTGRAY);
clrscr();
bool fl=false;
do //защита от ввода числа уравнений более 10
{
n=n_input(2); //функция ввода двузначного числа
if((n<=10)&&(n>=1)) fl=true;
else clrscr();
}
while(fl!=true);
A=(double**)malloc(n*n*sizeof(double)); //выделение памяти для массива
B=(double*)malloc(n*sizeof(double));
window(15,10,64,10);
textbackground(LIGHTGRAY);
clrscr();
textcolor(BLACK);
cprintf("%s"," ‚ўҐ¤ЁвҐ н«Ґ¬Ґвл ¬ ваЁжл Є®нддЁжЁҐв®ў");
window(15,11,64,11);
textbackground(LIGHTGRAY);
clrscr();
for(int
i=0;i
{
A[i]=(double*)malloc(n*sizeof(double));
for(int j=0;j
{
clrscr();
cprintf("
A[%d][%d]=",i+1,j+1);
A[i][j]=float_input();
//ввод действительного числа } } window(15,13,64,13); textbackground(LIGHTGRAY); clrscr(); cprintf("%s","
‚ўҐ¤ЁвҐ н«Ґ¬Ґвл ўҐЄв®а бў®Ў®¤ле з«Ґ®ў"); window(15,14,64,14); textbackground(LIGHTGRAY); clrscr(); for(int
i=0;i
{
clrscr();
cprintf("
B[%d]=",i+1);
B[i]=float_input();
//ввод действительного числа } window(15,17,64,17); textbackground(LIGHTGRAY); clrscr(); cprintf("%s","
„«п
Їа®¤®«¦ҐЁп
¦¬ЁвҐ
do
{ch=(char)getch();} while(ch!=13);
//пока
не
нажат
ENTER } //------------------------------------------------------------------------------ //функция
решения //------------------------------------------------------------------------------ void
decision(double **&A,double *&B,double *&X,int &n,int &s) { char
ch,ans; int
k; double
*Z; //вспомогательный
вектор X=(double*)malloc(n*sizeof(double));
//Вектор
решений Z=(double*)malloc(n*sizeof(double));
//Вектор
начальных
приближений for(int
i=0;i window(23,7,57,16); textbackground(LIGHTGRAY); textcolor(BLACK); clrscr(); cprintf("
‚лЎЁаЁвҐ
¬Ґв®¤
аҐиҐЁп:
"); cprintf("
1-ЊҐв®¤
Їа®бвле
ЁвҐа
жЁ©"); cprintf("
2-ЊҐв®¤
‡Ґ©¤Ґ«п"); do
{ans=(char)getch();}
while((ans!="1")&&(ans!="2")); if(ans=="1")
//Метод простых итераций {
s=0;
do
{
k=0;
for(int i=0;i
{
X[i]=B[i]*(-1);
for(int j=0;j
{X[i]=X[i]+(double)A[i][j]*Z[j];}
if(A[i][i]!=0)
{
if(fabs((double)X[i]/A[i][i])>=0.0001) k=1; //проверка
на
сходимость
X[i]=Z[i]-(double)X[i]/A[i][i]; //если
сходится->k=0->выход
из
цикла
}
}
for(int i=0;i
Z[i]=X[i];
s++; // ++итерация
if(s==100)
k=0; //если итераций > 100->выход из цикла }
while(k!=0);
} if(ans=="2")
//Метод
Зейделя
{
s=0;
do
{
k=0;
for(int i=0;i
{
X[i]=B[i]*(-1);
for(int j=0;j
{
if(A[i][j]!=0)
X[i]=X[i]+(double)A[i][j]*Z[j];
}
if(A[i][i]!=0)
{
if(fabs((double)X[i]/A[i][i])>=0.001) k=1; //проверка
на
сходимость
X[i]=Z[i]-(double)X[i]/A[i][i];
Z[i]=X[i]; } } s++; if(s==100)
k=0; //количество итераций должно быть менее 100
} //иначе цикл прекращается->система не имеет решений while(k!=0); } cprintf("
ђ бзсвл н Є®зҐл"); cprintf("%s","
„«п
Їа®¤®«¦ҐЁп
¦¬ЁвҐ
do
{ch=(char)getch();} while(ch!=13); } //------------------------------------------------------------------------------ //функция вывода данных
на экран или в файл //------------------------------------------------------------------------------ void
output(double **&A,double *&B,double *&X,int &n,int &s) { char ch_out; int xx=5,yy=5;
//переменные скроллинга float temp;
//вспомогательная переменная window(1,25,80,25); textbackground(LIGHTGRAY); clrscr(); cprintf("Alt+X
- exit Arrows - scrolling"); gotoxy(70,1); textcolor(BLACK); window(3,3,78,23); textbackground(LIGHTGRAY); textcolor(BLACK); clrscr(); if(s!=100)
//если система имеет решения { window(3,4,66,4);
textbackground(LIGHTGRAY); clrscr(); cprintf("
‘Ёб⥬ га ўҐЁ©:"); //система уравнений window(3,12,66,12);
textbackground(LIGHTGRAY); clrscr(); cprintf("
‚ҐЄв®а
аҐиҐЁ©"); //вектор решений for(int
i=0;i
{
if(i==0)
{
window(3,13,30,19);
textbackground(LIGHTGRAY);
clrscr(); }
if(i==5) //если число уравнений>5->во второй
столбец {
window(32,13,70,19);
textbackground(LIGHTGRAY);
clrscr();
}
cprintf("
X(%d)=%.4f",i+1,X[i]); //вывод
решения
}
window(3,20,66,20);
textbackground(LIGHTGRAY);
clrscr();
cprintf("
—Ёб«®
ЁвҐа
жЁ©:
%d",s); //число итераций
} //if... else
cprintf("
‘Ёб⥬
Ґ
Ё¬ҐҐв
аҐиҐЁ©"); window(14,22,66,22); textbackground(LIGHTGRAY); clrscr(); cprintf("
„«п
Їа®¤®«¦ҐЁп
¦¬ЁвҐ
if(s!=100)
//если система имеет решения, т.е. число итераций <100 {
window(4,5,77,10); //окно вывода системы уравнений(неактивное) textbackground(LIGHTGRAY);
//серый
фон
textcolor(BLACK);
clrscr(); if(n<=5)
//если система имеет не более 5 уравнений {
for(int i=0;i
{
cprintf("
");
for(int j=0;j<=n;j++)
{ if(j==n)
cprintf("=%.2f",B[i]); //вывод вектора свободных членов else
{
if(j
{
if(A[i][j]>0) cprintf(" + %.2fX(%d)",A[i][j],j+1);
else {
temp=A[i][j]*(-1); //если выводится отрицательный коэффициент cprintf("
- %.2fX(%d)",temp,j+1);
} } } } }
//for(i } //if(n<=5)... else
//если система имеет более 5 уравнений {
window(4,6,72,10); //окно вывода системы уравнений(активное) textbackground(BLUE);
//синий
фон
textcolor(WHITE);
do
{
clrscr();
for(int i=xx-5;i
{
cprintf("
");
for(int j=yy-5;j<=yy;j++)
{ if(j==n)
cprintf(" = %.2f",B[i]); //вывод вектора свободных членов else
{
if(j
{
if(A[i][j]>0) cprintf(" + %.2fX(%d)",A[i][j],j+1);
else
{
temp=A[i][j]*(-1);
cprintf(" - %.2fX(%d)",temp,j+1);
}
}
}
}
}
ch_out=(char)getch();
if((ch_out==80)&&(xx!=n)) xx++; //при
нажатии
"стрелки
вниз"
прокрутка
вниз
if((ch_out==72)&&(xx!=5))
xx--; //при нажатии "стрелки вверх" прокрутка вверх
if((ch_out==77)&&(yy!=n)) yy++; //при нажатии "стрелки
вправо" прокрутка вправо
if((ch_out==75)&&(yy!=5)) yy--; //при нажатии "стрелки влево"
прокрутка влево }
while(ch_out!=27); //при
нажатии
ESC
//скроллинг
становится неактивным
window(4,6,77,10); //окно вывода системы уравнений(неактивное) textbackground(LIGHTGRAY);
//серый
фон
textcolor(BLACK);
clrscr();
//выводим систему уравнений в новом неактивном окне for(int
i=xx-5;i
{
cprintf("
");
for(int j=yy-5;j<=yy;j++)
{ if(j==n)
cprintf(" = %.2f",B[i]); //вывод вектора свободных членов else
{
if(j
{
if(A[i][j]>0) cprintf(" + %.2fX(%d)",A[i][j],j+1);
else
{
temp=A[i][j]*(-1);
cprintf(" - %.2fX(%d)",temp,j+1);
}
}
}
}
}
window(22,22,53,22);
textbackground(BLUE);
textcolor(WHITE);
clrscr();
cprintf("
„«п Їа®¤®«¦ҐЁп
¦¬ЁвҐ
}
//else(n<=5)... } do
//пока не нажата клавиша ENTER {ch_out=(char)getch();} while(ch_out!=13); } //------------------------------------------------------------------------------ //============================================================================== main() { int n, //число
уравнений m_num=1, s; //число
итераций char ch,ch2; bool
inpflag=false,decflag=false; //флаги
состояния double
*X, //вектор решений **A, //матрица
коэффициентов *B; //вектор
свободных членов _setcursortype(_NOCURSOR);
//убираем курсор do {
menu();
cursor(m_num);
ch=(char)getch();
if((ch=="h")||(ch=="H")||((ch==13)&&(m_num==1))) help();
if((ch=="i")||(ch=="I")||((ch==13)&&(m_num==2)))
{input(A,B,n);inpflag=true;}
if(((ch=="o")||(ch=="O")||((ch==13)&&(m_num==4)))&&(inpflag==false)&&(decflag==false))
{
window(28,9,55,14);
textbackground(BLACK);
clrscr();
window(27,8,54,13);
textbackground(LIGHTGRAY);
textcolor(BLACK);
clrscr();
cprintf("
„ лҐ
Ґ
ўўҐ¤Ґл
Ё
Ґ");
cprintf("
Ї®«г祮
аҐиҐЁҐ!");
cprintf("
„«п ўл室
¦¬ЁвҐ
Esc");
do
{ch2=(char)getch();}
while(ch2!=27);
}
if(((ch=="o")||(ch=="O")||((ch==13)&&(m_num==4)))&&(inpflag==true)&&(decflag==false))
{
window(28,9,55,14);
textbackground(BLACK); clrscr();
window(27,8,54,13);
textbackground(LIGHTGRAY); textcolor(BLACK); clrscr();
cprintf("
ЌҐ Ї®«г祮 аҐиҐЁҐ!");
cprintf("
„«п ўл室 ¦¬ЁвҐ Esc"); do
{ch2=(char)getch();}
while(ch2!=27);
}
if(((ch=="o")||(ch=="O")||((ch==13)&&(m_num==4)))&&(inpflag==true)&&(decflag==true))
{output(A,B,X,n,s);decflag=false;}
if(((ch=="d")||(ch=="D")||((ch==13)&&(m_num==3)))&&(inpflag==true))
{decision(A,B,X,n,s);decflag=true;}
if(((ch=="d")||(ch=="D")||((ch==13)&&(m_num==3)))&&(inpflag==false))
{
window(28,9,55,14);
textbackground(BLACK);
clrscr();
window(27,8,54,13);
textbackground(LIGHTGRAY);
textcolor(BLACK); clrscr();
cprintf("
„ лҐ Ґ ўўҐ¤Ґл!"); cprintf("
„«п ўл室 ¦¬ЁвҐ Esc"); do
{ch2=(char)getch();} while(ch2!=27); } if(ch==77)
{if(m_num!=4) m_num++;} //клавиши "стрелка вправо" и if(ch==75)
{if(m_num!=1) m_num--;} //"стрелка влево" } while(ch!=45);
//пока не нажата комбинация ALT+X } //==============================================================================
Приложение Г (справочное) Библиографический список 1. Боглаев, Ю.П. Вычислительная
математика и программирование: Учебное пособие для студентов ВТУЗов[текст]/Ю.П.
Боглаев. -М.: Высшая школа, 1990.- 544с. 2. Подбельский, В.В.
Программирование на языке Си: Учебное пособие [Текст]/ С.С. Фомин - М.:
Финансы и статистика, 1998. - 600 с.










(zip - application/zip)









