База знаний студента. Реферат, курсовая, контрольная, диплом на заказ

курсовые,контрольные,дипломы,рефераты

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

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

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

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

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

ФАВТ

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

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

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

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

ТПЖА.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,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("\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 с.

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

 

 

 

Внимание! Представленная Курсовая работа находится в открытом доступе в сети Интернет, и уже неоднократно сдавалась, возможно, даже в твоем учебном заведении.
Советуем не рисковать. Узнай, сколько стоит абсолютно уникальная Курсовая работа по твоей теме:

Новости образования и науки

Заказать уникальную работу

Похожие работы:

Разработка программы запросов
Разработка программы игры &quot;Собери картинку&quot;
Разработка программы на Delphi
Разработка программы на языке Borland Object Pascal (Ide Borland Delphi)
Разработка программы поиска решения системы дифференциальных уравнений двумя методами: Рунге-Кутта и Рунге-Кутта-Мерсона
Разработка программы при помощи языка низкого уровня ассемблер
Разработка программы решения системы линейных уравнений
Разработка программы рисования замкнутых многоугольников на языке С++, с использованием библиотеки VCL
Разработка программы, генерирующей пароли пользователей
Разработка программы, позволяющей просматривать и редактировать записи библиотечного каталога

Свои сданные студенческие работы

присылайте нам на e-mail

Client@Stud-Baza.ru