ФЕДЕРАЛЬНОЕАГЕНТСТВО ПО ОБРАЗОВАНИЮ
ГОСУДАРСТВЕННОЕОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГОПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
ВЯТСКИЙГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ФАВТ
РАЗРАБОТКАПРОГРАММЫ ДЛЯ РЕШЕНИЯ СИСТЕМ ЛИНЕЙНЫХ УРАВНЕНИЙ
Пояснительнаязаписка
Курсовая работапо дисциплине
«Информатика»
ТПЖА.12203-01 8101 ПЗ
Разработал студент гр. СК-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-0112 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 Выбор типоввходных, рабочих и выходных переменных, используемых в программе
В программеиспользованы следующие переменные:
charch
ints
intn
double**A
double*B
double*X
boolinpflag=false
booldecflag=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– Схемаалгоритмафункции
voiddecision(double **&A, double *&B, double *&X, int &n, int&s)
Приложение Б
(обязательное)
ФЕДЕРАЛЬНОЕАГЕНТСТВО ПО ОБРАЗОВАНИЮ
ГОСУДАРСТВЕННОЕОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГОПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
ВЯТСКИЙГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ФАВТ
РАЗРАБОТКА ПРОГРАММЫДЛЯ РЕШЕНИЯ СИСТЕМ ЛИНЕЙНЫХ УРАВНЕНИЙ
РУКОВОДСТВООПЕРАТОРА
Лист утверждения
ТПЖА.12203-01 3401-ЛУ
Листов 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 1201-ЛУ
Листов 2
Разработал студентгр. СК-00 ____________ /А. И. Иванов/
Руководитель преподаватель
ФАВТ ____________ / К. И. Петров/
Киров 2002
Приложение В
(обязательное)
ФЕДЕРАЛЬНОЕАГЕНТСТВО ПО ОБРАЗОВАНИЮ
ГОСУДАРСТВЕННОЕОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГОПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
ВЯТСКИЙГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
Факультетприкладной математики и телекоммуникаций
Кафедрарадиоэлектронных средств
Лист утверждения
ТПЖА.12203-01 1201-ЛУ
РАЗРАБОТКАПРОГРАММЫ ДЛЯ РЕШЕНИЯ СИСТЕМ ЛИНЕЙНЫХ УРАВНЕНИЙ
ТЕКСТ ПРОГРАММЫ
ТПЖА.12203-01 1201
Листов 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);
}
//------------------------------------------------------------------------------
//курсор
//------------------------------------------------------------------------------
voidcursor(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();
}
}
//------------------------------------------------------------------------------
//функция вводанатурального числа
//------------------------------------------------------------------------------
intn_input(int max)
{
char ch;
char str[100];
int i=0;
do
{
ch = (char)getch();
if (i==0)
{
if ((ch>'0')&&(ch
{
str[i++]=ch;
putch(ch);
}
}
else
{
if ((ch>='0')&&(ch
{
str[i++]=ch;
putch(ch);
}
}
if((ch=='\r')&&(i==0)) //если нажата клавиша ENTER и ничего невведено
{
ch='x';
printf(" \b"); //backspace
}
if ((ch=='\b')&&(i>0)) //еслинажатаклавишаBACKSPACE
{
i--;
printf("\b \b");
}
if(i==(max+1)) //если достиглиmax количествацифр
{
i--;
printf("\b \b");
}
}
while (ch!='\r');
str[i]='\0';
for (int j=i;j>0;j--)
printf("\b \b");
printf("%d",atoi(str));
returnatoi(str); //преобразуем в число
}
//------------------------------------------------------------------------------
//функция вводадействительного числа
//------------------------------------------------------------------------------
double float_input()
{
constmax=6; //максимальное количество цифр в числе
inti=0; //счётчик вводасимвола
char ch,buffer[max];
boolflp=0; //флажок ввода символа "."
boolfle=0; //флажок ввода «е»
do
{
ch = (char)getch();
if ((ch=='-')&&((i==0)||(buffer[i-1]=='e'))) //ввод"-"
{ //в начале строки
buffer[i++]=ch; //и после «е»
putch(ch);
}
if ((ch>='0')&&(ch
{
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=='\b')&&(i>0)) //вводкода
{ //клавиши
i--; //BACKSPACE
cprintf("\b \b");
if (buffer[i]=='.') flp=0;
if (buffer[i]=='E') fle=0;
}
if ((ch=='\r')&&(i==0)) ch='\0';
if(i==(max+1))
{
i--;
cprintf("\b \b");
}
} while (ch!='\r');
buffer[i]='\0'; //«закрытие»строки
for (int j=i;j>0;j--)
cprintf("\b \b");
cprintf("%2.2e",strtod(buffer,0));
returnstrtod(buffer,0); //преобразование к веществ. значению
}
//------------------------------------------------------------------------------
//Опрограмме
//------------------------------------------------------------------------------
voidabout()
{
charch;
window(25,8,59,18);
textbackground(BLACK);
clrscr();
window(24,7,58,17);
textbackground(LIGHTGRAY);
textcolor(BLACK);
clrscr();
cprintf("\n\rђ§аЎ®вЄ Їа®Ја¬¬л¤«паҐиҐЁп");
cprintf("\n\r бЁб⥬«ЁҐ©легࢥЁ©");
cprintf("\n\n\r ‚ҐабЁп1.0 2007Ј.");
cprintf("\n\n\r ‚лЇ®«Ё«бв㤥вЈа.‘Љ-06");
cprintf("\n\r Њ¬ Ґў‘.‚.");
cprintf("\n\n\r „«пЇа®¤®«¦ҐЁп ¦¬ЁвҐ");
do
{
ch=(char)getch();
}
while(ch!=13); //поканенажатENTER
}
//------------------------------------------------------------------------------
//текстзадания
//------------------------------------------------------------------------------
voidtask()
{
charch;
window(21,6,62,20);
textbackground(BLACK);
clrscr();
window(20,5,61,19);
textbackground(LIGHTGRAY);
textcolor(BLACK);
clrscr();
cprintf("\n\n\n\rђ§аЎ®ввмЇа®Ја¬¬г¤«паҐиҐЁпбЁб⥬");
cprintf("\n\r«ЁҐ©легࢥЁ©.ђҐ«Ё§®ўв쬥⮤л:");
cprintf("\n\r )Їа®бвлеЁвҐажЁ©;Ў)‡Ґ©¤Ґ«п.ЏаҐ¤гᬮ-");
cprintf("\n\rваҐвмўў®¤зЁб« гࢥЁ©(¤®10), ¬ в-");
cprintf("\n\rаЁжлЄ®нддЁжЁҐв®ўЁўҐЄв®а бў®Ў®¤ле");
cprintf("\n\rз«Ґ®ў.");
cprintf("\n\n\n\n\n\r „«пЇа®¤®«¦ҐЁп ¦¬ЁвҐ");
do
{
ch=(char)getch();
}
while(ch!=13); //поканенажатENTER
}
//------------------------------------------------------------------------------
//окноhelp
//------------------------------------------------------------------------------
voidhelp()
{
charans;
inth_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","\n\r 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(); //окновыводаинформацииоразработчике
}
}
//------------------------------------------------------------------------------
//функциявводаданных
//------------------------------------------------------------------------------
voidinput(double **&A,double *&B,int &n)
{
charch;
window(8,3,20,6);
textbackground(BLACK);
clrscr();
window(15,6,64,18);
textbackground(LIGHTGRAY);
clrscr();
textcolor(BLACK);
cprintf("%s","\n\n\r‚ўҐ¤ЁвҐзЁб«®гࢥЁ©(1..10)");
window(48,8,51,8);
textbackground(BLACK);
textcolor(LIGHTGRAY);
clrscr();
bool fl=false;
do //защита от ввода числа уравнений более 10
{
n=n_input(2); //функция ввода двузначного числа
if((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","\r‚ўҐ¤ЁвҐн«Ґ¬Ґвл¬ ваЁжлЄ®нддЁжЁҐв®ў");
window(15,11,64,11);
textbackground(LIGHTGRAY);
clrscr();
for(inti=0;i
{
A[i]=(double*)malloc(n*sizeof(double));
for(int j=0;j
{
clrscr();
cprintf("\r A[%d][%d]=",i+1,j+1);
A[i][j]=float_input(); //ввод действительного числа
}
}
window(15,13,64,13);
textbackground(LIGHTGRAY);
clrscr();
cprintf("%s","\n\n\r‚ўҐ¤ЁвҐ н«Ґ¬Ґвл ўҐЄв®а бў®Ў®¤ле з«Ґ®ў");
window(15,14,64,14);
textbackground(LIGHTGRAY);
clrscr();
for(inti=0;i
{
clrscr();
cprintf("\r B[%d]=",i+1);
B[i]=float_input(); //ввод действительного числа
}
window(15,17,64,17);
textbackground(LIGHTGRAY);
clrscr();
cprintf("%s","\r „«пЇа®¤®«¦ҐЁп ¦¬ЁвҐ");
do
{ch=(char)getch();}
while(ch!=13); //поканенажатENTER
}
//------------------------------------------------------------------------------
//функциярешения
//------------------------------------------------------------------------------
voiddecision(double **&A,double *&B,double *&X,int &n,int &s)
{
charch,ans;
intk;
double*Z; //вспомогательныйвектор
X=(double*)malloc(n*sizeof(double)); //Векторрешений
Z=(double*)malloc(n*sizeof(double)); //Векторначальныхприближений
for(inti=0;i
window(23,7,57,16);
textbackground(LIGHTGRAY);
textcolor(BLACK);
clrscr();
cprintf("\n\r ‚лЎЁаЁвҐ¬Ґв®¤аҐиҐЁп:");
cprintf("\n\r 1-ЊҐв®¤Їа®бвлеЁвҐажЁ©");
cprintf("\n\r 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("\n\n\r ђ бзсвл н Є®зҐл");
cprintf("%s","\n\n\n\r „«пЇа®¤®«¦ҐЁп ¦¬ЁвҐ");
do
{ch=(char)getch();}
while(ch!=13);
}
//------------------------------------------------------------------------------
//функция вывода данныхна экран или в файл
//------------------------------------------------------------------------------
voidoutput(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("\r‘Ёб⥬ га ўҐЁ©:"); //система уравнений
window(3,12,66,12);
textbackground(LIGHTGRAY);
clrscr();
cprintf("\r ‚ҐЄв®ааҐиҐЁ©"); //вектор решений
for(inti=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("\n\r X(%d)=%.4f",i+1,X[i]); //выводрешения
}
window(3,20,66,20);
textbackground(LIGHTGRAY);
clrscr();
cprintf("\n\n\r —Ёб«®ЁвҐажЁ©:%d",s); //число итераций
} //if...
elsecprintf("\n\n ‘Ёб⥬ ҐЁ¬ҐҐваҐиҐЁ©");
window(14,22,66,22);
textbackground(LIGHTGRAY);
clrscr();
cprintf("\n\n\r „«пЇа®¤®«¦ҐЁп ¦¬ЁвҐ");
if(s!=100) //если система имеет решения, т.е. число итераций
{
window(4,5,77,10); //окно вывода системы уравнений(неактивное)
textbackground(LIGHTGRAY); //серыйфон
textcolor(BLACK);
clrscr();
if(n
{
for(int i=0;i
{
cprintf("\n\r ");
for(int j=0;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
else //если система имеет более 5 уравнений
{
window(4,6,72,10); //окно вывода системы уравнений(активное)
textbackground(BLUE); //синийфон
textcolor(WHITE);
do
{
clrscr();
for(int i=xx-5;i
{
cprintf("\n\r ");
for(int j=yy-5;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(inti=xx-5;i
{
cprintf("\n\r ");
for(int j=yy-5;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("\r„«п Їа®¤®«¦ҐЁп ¦¬ЁвҐ"); //подсвечиваемстрокусинимфоном
} //else(n
}
do //пока не нажата клавиша ENTER
{ch_out=(char)getch();}
while(ch_out!=13);
}
//------------------------------------------------------------------------------
//==============================================================================
main()
{
int n, //числоуравнений
m_num=1,
s; //числоитераций
char ch,ch2;
boolinpflag=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("\r\n „ 륥ўўҐ¤ҐлЁҐ");
cprintf("\r\n Ї®«г祮аҐиҐЁҐ!");
cprintf("\n\n\r „«п ўл室 ¦¬ЁвҐ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("\r\n ЌҐ Ї®«г祮 аҐиҐЁҐ!");
cprintf("\n\n\n\r „«п ўл室 ¦¬ЁвҐ 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("\r\n „ лҐ Ґ ўўҐ¤Ґл!");
cprintf("\n\n\n\r „«п ўл室 ¦¬ЁвҐ 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 с.