Курсовая работа: Разработка программы для решения систем линейных уравнений
Название: Разработка программы для решения систем линейных уравнений Раздел: Рефераты по информатике, программированию Тип: курсовая работа |
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ ВЯТСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ФАВТ РАЗРАБОТКА ПРОГРАММЫ ДЛЯ РЕШЕНИЯ СИСТЕМ ЛИНЕЙНЫХ УРАВНЕНИЙ Пояснительная записка Курсовая работа по дисциплине "Информатика" ТПЖА.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) где матрицы С, В и вектор в определяются по матрицы А и вектору 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 с. |