Разработка программы для решения систем линейных уравнений

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ

ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

ВЯТСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

ФАВТ

РАЗРАБОТКА ПРОГРАММЫ ДЛЯ РЕШЕНИЯ СИСТЕМ ЛИНЕЙНЫХ УРАВНЕНИЙ

Пояснительная записка

Курсовая работа по дисциплине

"Информатика"

ТПЖА.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 <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <math.h>

#include <string.h>

//функция отрисовки меню

//------------------------------------------------------------------------------

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=='\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));

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=='\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));

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("\n\r ђ §а Ў®вЄ Їа®Ја ¬¬л ¤«п аҐиҐ­Ёп ");

cprintf("\n\r бЁб⥬ «Ё­Ґ©­ле га ў­Ґ­Ё©");

cprintf("\n\n\r ‚ҐабЁп 1.0 2007Ј.");

cprintf("\n\n\r ‚лЇ®«­Ё« бв㤥­в Ја. ‘Љ-06");

cprintf("\n\r Њ ¬ Ґў ‘.‚.");

cprintf("\n\n\r „«п Їа®¤®«¦Ґ­Ёп ­ ¦¬ЁвҐ <Enter>");

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("\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 „«п Їа®¤®«¦Ґ­Ёп ­ ¦¬ЁвҐ <Enter>");

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","\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(); //окно вывода информации о разработчике

}

}

//------------------------------------------------------------------------------

//функция ввода данных

//------------------------------------------------------------------------------

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","\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<=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","\r ‚ўҐ¤ЁвҐ н«Ґ¬Ґ­вл ¬ ваЁжл Є®нддЁжЁҐ­в®ў");

window(15,11,64,11);

textbackground(LIGHTGRAY);

clrscr();

for(int i=0;i<n;i++)

{

A[i]=(double*)malloc(n*sizeof(double));

for(int j=0;j<n;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(int i=0;i<n;i++)

{

clrscr();

cprintf("\r B[%d]=",i+1);

B[i]=float_input(); //ввод действительного числа

}

window(15,17,64,17);

textbackground(LIGHTGRAY);

clrscr();

cprintf("%s","\r „«п Їа®¤®«¦Ґ­Ёп ­ ¦¬ЁвҐ <Enter>");

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<n;i++) Z[i]=1;

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<n;i++)

{

X[i]=B[i]*(-1);

for(int j=0;j<n;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<n;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<n;i++)

{

X[i]=B[i]*(-1);

for(int j=0;j<n;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 „«п Їа®¤®«¦Ґ­Ёп ­ ¦¬ЁвҐ <Enter>");

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("\r ‘Ёб⥬ га ў­Ґ­Ё©:"); //система уравнений

window(3,12,66,12);

textbackground(LIGHTGRAY);

clrscr();

cprintf("\r ‚ҐЄв®а аҐиҐ­Ё©"); //вектор решений

for(int i=0;i<n;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...

else cprintf("\n\n ‘Ёб⥬ ­Ґ Ё¬ҐҐв аҐиҐ­Ё©");

window(14,22,66,22);

textbackground(LIGHTGRAY);

clrscr();

cprintf("\n\n\r „«п Їа®¤®«¦Ґ­Ёп ­ ¦¬ЁвҐ <Enter>");

if(s!=100) //если система имеет решения, т.е. число итераций <100

{

window(4,5,77,10); //окно вывода системы уравнений(неактивное)

textbackground(LIGHTGRAY); //серый фон

textcolor(BLACK);

clrscr();

if(n<=5) //если система имеет не более 5 уравнений

{

for(int i=0;i<n;i++)

{

cprintf("\n\r ");

for(int j=0;j<=n;j++)

{

if(j==n) cprintf("=%.2f",B[i]); //вывод вектора свободных членов

else

{

if(j<n)

{

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<n)...

} //if(n<=5)...

else //если система имеет более 5 уравнений

{

window(4,6,72,10); //окно вывода системы уравнений(активное)

textbackground(BLUE); //синий фон

textcolor(WHITE);

do

{

clrscr();

for(int i=xx-5;i<xx;i++)

{

cprintf("\n\r ");

for(int j=yy-5;j<=yy;j++)

{

if(j==n) cprintf(" = %.2f",B[i]); //вывод вектора свободных членов

else

{

if(j<n)

{

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<xx;i++)

{

cprintf("\n\r ");

for(int j=yy-5;j<=yy;j++)

{

if(j==n) cprintf(" = %.2f",B[i]); //вывод вектора свободных членов

else

{

if(j<n)

{

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„«п Їа®¤®«¦Ґ­Ёп ­ ¦¬ЁвҐ <Enter>"); //подсвечиваем строку синим фоном

} //else(n<=5)...

}

do //пока не нажата клавиша ENTER

{ch_out=(char)getch();}

while(ch_out!=13);

}

//------------------------------------------------------------------------------

//==============================================================================

main()

{

int n, //число уравнений

m_num=1,

s; //число итераций

char ch,cH3;

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("\r\n „ ­­лҐ ­Ґ ўўҐ¤Ґ­л Ё ­Ґ");

cprintf("\r\n Ї®«г祭® аҐиҐ­ЁҐ!");

cprintf("\n\n\r „«п ўл室 ­ ¦¬ЁвҐ Esc");

do

{cH3=(char)getch();}

while(cH3!=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

{cH3=(char)getch();}

while(cH3!=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

{cH3=(char)getch();}

while(cH3!=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 с.