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

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

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

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

ФАВТ

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

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

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

«Информатика»

ТПЖА.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]=’’;

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=’’;

if(i==(max+1))

{

i—;

cprintf(«b b»);

}

} while (ch!=’r’);

buffer[i]=’’; //»закрытие» строки

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

cprintf(«nr бЁб⥬ «Ё­Ґ©­ле га ў­Ґ­Ё©»);

cprintf(«nnr ‚ҐабЁп 1.0 2007Ј.»);

cprintf(«nnr ‚лЇ®«­Ё« бв㤥­в Ја. ‘Љ-06»);

cprintf(«nr Њ ¬ Ґў ‘.‚.»);

cprintf(«nnr „«п Їа®¤®«¦Ґ­Ёп ­ ¦¬ЁвҐ <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(«nnnr ђ §а Ў®в вм Їа®Ја ¬¬г ¤«п аҐиҐ­Ёп бЁб⥬»);

cprintf(«nr «Ё­Ґ©­ле га ў­Ґ­Ё©. ђҐ «Ё§®ў вм ¬Ґв®¤л: «);

cprintf(«nr )Їа®бвле ЁвҐа жЁ©; Ў)‡Ґ©¤Ґ«п. ЏаҐ¤гᬮ-«);

cprintf(«nr ваҐвм ўў®¤ зЁб« га ў­Ґ­Ё©(¤® 10), ¬ в-«);

cprintf(«nr аЁжл Є®нддЁжЁҐ­в®ў Ё ўҐЄв®а бў®Ў®¤­ле «);

cprintf(«nr з«Ґ­®ў.»);

cprintf(«nnnnnr „«п Їа®¤®«¦Ґ­Ёп ­ ¦¬ЁвҐ <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»,»nr 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»,»nnr ‚ўҐ¤ЁвҐ зЁб«® га ў­Ґ­Ё© (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»,»nnr ‚ўҐ¤ЁвҐ н«Ґ¬Ґ­вл ўҐЄв®а бў®Ў®¤­ле з«Ґ­®ў»);

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(«nr ‚лЎЁаЁвҐ ¬Ґв®¤ аҐиҐ­Ёп: «);

cprintf(«nr 1-ЊҐв®¤ Їа®бвле ЁвҐа жЁ©»);

cprintf(«nr 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(«nnr ђ бзсвл н Є®­зҐ­л»);

cprintf(«%s»,»nnnr „«п Їа®¤®«¦Ґ­Ёп ­ ¦¬ЁвҐ <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(«nr X(%d)=%.4f»,i+1,X[i]); //вывод решения

}

window(3,20,66,20);

textbackground(LIGHTGRAY);

clrscr();

cprintf(«nnr —Ёб«® ЁвҐа жЁ©: %d»,s); //число итераций

} //if…

else cprintf(«nn ‘Ёб⥬ ­Ґ Ё¬ҐҐв аҐиҐ­Ё©»);

window(14,22,66,22);

textbackground(LIGHTGRAY);

clrscr();

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

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(«nr «);

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(«nr «);

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,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(«rn „ ­­лҐ ­Ґ ўўҐ¤Ґ­л Ё ­Ґ»);

cprintf(«rn Ї®«г祭® аҐиҐ­ЁҐ!»);

cprintf(«nnr „«п ўл室 ­ ¦¬ЁвҐ 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(«rn ЌҐ Ї®«г祭® аҐиҐ­ЁҐ!»);

cprintf(«nnnr „«п ўл室 ­ ¦¬ЁвҐ 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(«rn „ ­­лҐ ­Ґ ўўҐ¤Ґ­л!»);

cprintf(«nnnr „«п ўл室 ­ ¦¬ЁвҐ 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 с.