close

Вход

Забыли?

вход по аккаунту

?

Chuev

код для вставкиСкачать
 ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
Государственное образовательное учреждение
высшего профессионального образования
Тульский государственный университет
Кафедра электронных вычислительных машин
ИССЛЕДОВАНИЕ ВЫЧИСЛИТЕЛЬНОЙ ЭФФЕКТИВНОСТИ WEB-ТЕХНОЛОГИЙ
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к курсовой работе по дисциплине "Технологии программирования"
Автор работы: студент гр. 220272 Чуев А.С.
Обозначение КР: К2.001.211.ПЗ
Руководитель работы: канд. тех. наук доц. кафедры ЭВМ Берсенев Г.Б.
Работа защищена: ______________ оценка ________________
Члены комиссии: ______________________________________
______________________________________
Тула 2010
УТВЕРЖДАЮ
Заведующий кафедрой
______________________________
"_____"__________________ 2009г.
З А Д А Н И Е
на курсовую работу по дисциплине "Технологии программирования" студенту группы 220272 Чуеву Александру Сергеевичу Тема проекта Исследование вычислительной эффективности Web-технологий Входные данные Вариант №23: задача - определение площади четырехугольника методом Монте-Карло;
четырехугольник - bcde;
приложение №1: настольное приложение, имеющее консольный интерфейс пользователя, язык реализации - С#;
приложение №2: Web-приложение на базе ASP (язык скриптов - JScript, JavaScript);
приложение №3: Web-приложение на базе технологии ASP.NET (тип клиента - WebForm, тип Web-сервиса - асинхронный, язык C#. Задание получил " 10" сентября 2009г.
График выполнения проекта
выдача задания " 10" сентября 2009г.
срок представления готового задания " 10" декабря2009г.
Замечания консультанта К защите. Консультант (руководитель) " "2009г.
Графические материалы прикладываются к заданию.
При защите курсовой работы наличие рецензии обязательно.
Содержание
Введение5
1Постановка задачи7
2Разработка технического задания9
2.1Анализ вариантов использования программы9
2.2Требования к приложениям12
3Анализ алгоритма решения задачи14
3.1Метод Монте-Карло14
3.2Определение попадания точки в трапецию14
4Консольное приложение16
4.1Программные средства реализации приложения16
4.2Логическое проектирование приложения18
4.3Руководство системного программиста20
4.3.1Общие сведения о приложении20
4.3.2Системные требования20
4.4Руководство программиста20
4.4.1Структура приложения20
4.4.2Общие сведения о приложении21
4.4.3Характеристики приложения21
4.5Руководство оператора23
4.6Результаты работы приложения24
5Приложение на базе ASP26
5.1Программные средства реализации приложения26
5.2Разработка активных страниц ASP26
5.2.1 Страница startpage.html26
5.2.2 Страница results.asp28
5.3Руководство системного программиста29
5.3.1Общие сведения о приложении29
5.3.2Системные требования29
5.3.3Настройка приложения30
5.4Руководство программиста31
5.4.1Структура приложения31
5.4.2Назначение и условия применения приложения31
5.5Руководство пользователя32
5.6Результаты выполнения приложения32
6Приложение на базе Web-сервисов ASP.NET34
6.1Программные средства реализации приложения34
6.2Логическое проектирование Web-сервиса35
6.3Логическое проектирование клиентского Web-приложения38
6.4Генерация прокси-класса40
6.5Руководство системного программиста41
6.5.1Общие сведения о приложении41
6.5.2Системные требования41
6.5.3Настройка приложения41
6.6Руководство программиста42
6.6.1Структура приложения42
6.6.2Назначение и условия применения приложения43
6.6.1Общие сведения о приложении43
6.7Руководство пользователя44
6.8Результаты работы приложения44
7Приложение на базе AJAX46
7.1Программные средства реализации приложения46
7.2Логическое проектирование Web-сервиса47
7.3Логическое проектирование клиентского Web-приложения48
7.4AJAX-расширения52
7.4.1Менеджер скриптов52
7.4.2Панель обновления53
7.4.3Таймер54
7.4.4Триггеры54
7.4.5Прогресс обновления55
7.5Генерация прокси-класса55
7.6Руководство системного программиста56
7.6.1Общие сведения о приложении56
7.6.2Системные требования56
7.6.3Настройка приложения57
7.7Руководство программиста58
7.7.1Структура приложения58
7.7.2Назначение и условия применения приложения58
7.7.3Общие сведения о приложении58
7.8Руководство пользователя59
7.9Результаты работы приложения60
8Анализ вычислительной эффективности приложений61
Заключение63
Список литературы64
Приложение 1. Листинг консольного приложения65
Файл Program.cs65
Приложение 2. Листинг приложения на базе ASP72
Файл startpage.html72
Файл results.asp73
Приложение 3. Листинг Web-сервиса76
Файл Service.asmx76
Файл Service.cs76
Приложение 4. Листинг Web-приложения на базе ASP.NET79
Файл Default.aspx79
Файл Default.aspx.cs80
Приложение 5. Листинг приложения на базе AJAX83
Файл Default.aspx83
Файл Default.aspx.cs85
Введение
В настоящее время разработка программного обеспечения ведется в рамках корпоративных сетей ЭВМ, среди которых все большее распространение получают Интранет/Интернет сети. Для работы в таких сетях используется совершенно новый вид программных продуктов - Web-приложения, в которых тем или иным способом реализуются клиентская и серверная активности, широко применяются СОМ объекты и Web сервисы для осуществления основной функциональности приложения. В Web приложениях иначе, чем в локальных приложениях MS Windows, реализуются и графический интерфейс пользователя, и вообще организация всего приложения. Появилась и объектно-ориентированная платформа .NET фирмы Microsoft с удобной средой разработки Web приложений - MS Visual Studio .NET.
Известно, что серверы Web хранят информацию в виде текстовых файлов, называемых также страницами сервера Web. Помимо текста, такие страницы могут содержать ссылки на другие страницы (расположенные на том же самом или другом сервере), ссылки на графические изображения, аудио- и видеоинформацию, различные объекты ввода данных (поля, кнопки, формы и т. д.), а также другие объекты. Фактически страницы Web представляют собой некоторое связующее звено между объектами различных типов.
Для доступа к информации, расположенной на серверах Web, пользователи применяют специальные клиентские программы - браузеры. Наибольшей популярностью пользуются браузеры Microsoft Internet Explorer и Opera.
Существуют различные способы реализации серверной активности. Традиционный (классический) способ создания активных серверных страниц (Active Server Pages, ASP) заключается в добавлении скриптов на языках JavaScript и VBScript в HTML код. Однако применение скрипов для выполнения больших объемов вычислительной работы на сервере нецелесообразно из-за медленной работы скриптов, поскольку при выполнении активных страниц большая часть времени расходуется на процесс интерпретации скрипов.
Современные технологии, такие как ASP.NET и Java, позволяют создавать активные серверные страницы практически без скриптов, а код таких страниц, написанный на объектно-ориентированных языках C# и Java, хранится в двоичном (откомпилированном) виде. При этом автоматизируется процесс создания кода страниц и значительно упрощается его отладка.
Целью курсовой работы является исследование вычислительной эффективности технологий программирования, включая Web-технологии, а также закрепление знаний, полученных в курсе "Технологии программирования".
1 Постановка задачи
В результате выполнения курсовой работы необходимо создать и сравнить по вычислительной эффективности следующие три приложения, решающие одну и ту же задачу приближенного вычисления площади четырехугольника методом Монте-Карло: * настольное приложение на языке C# платформы .NET, имеющее консольный интерфейс пользователя;
* Web-приложение на базе скриптов (на языке JScript); * Web-приложение на базе технологии ASP.NET (тип клиента - WebForm, тип Web-сервиса - асинхронный, язык C#).
Для реализации в виде приложения Web выбрана задача по нахождению площади четырёхугольника (трапеции) bcde, представленной на рис. 1, методом Монте-Карло.
Рис. 1. Трапеция bcde внутри прямоугольника
Исходными данными для каждого приложения являются координаты угловых точек трапеции, причем координата x точки e может быть произвольной в диапазоне от 0 до координаты x точки d (e, e', e'' на рис. 1). Для вычисления площади трапеции необходимо вначале вычислить площадь прямоугольника, описывающего трапецию, а затем N раз сгенерировать случайную точку внутри прямоугольника. Генерируемые случайным образом точки должны равномерно заполнять площадь прямоугольника. Для этого случайные числа должны иметь равномерное распределение (по ширине и высоте прямоугольника соответственно). Для каждой точки выполняется проверка, попала ли она внутрь трапеции. Если из N точек M точек оказалось внутри четырехугольника, а площадь прямоугольника равна S, то площадь трапеции будет приближенно равна . Поскольку площадь трапеции легко вычисляется по правилам геометрии, мы можем определить относительную погрешность приближенного вычисления этой площади методом Монте-Карло. Естественно, чем больше N, тем меньше погрешность такого вычисления (при наличии хорошего генератора случайных чисел).
Каждое приложение пять раз повторяет эксперимент и вычисляет площадь трапеции методом Монте-Карло для точек соответственно. В каждом эксперименте определяется относительная погрешность вычисления площади (в процентах) и его длительность (в миллисекундах). В клиент-серверных приложениях клиент перед каждым экспериментом передает на сервер координаты точек четырехугольника и значение N, а после завершения эксперимента получает от сервера значения относительной погрешности и длительности эксперимента.
По результатам экспериментов каждое приложение выдает на экран таблицу, показывающую зависимости значений относительной погрешности и длительности эксперимента от величины N, площадь трапеции и количество попавших точек M. 2 Разработка технического задания
2.1 Анализ вариантов использования программы
Необходимо разработать программу, позволяющую вычислить площадь трапеции методом Монте-Карло, оценить погрешность метода и ее зависимость от количества точек, произвести запись времени, потраченного на каждый расчет и вывести все это на экран. Кроме этого, программа будет позволять пользователю ознакомиться со схематичными рисунками (для того, чтобы пользователь понял, какие именно координаты ему требуется ввести) и вычислять площадь по заданным координатам (для демонстрации пользователю) с выводом соответствующих рисунков.
Для визуального моделирования проекта воспользуемся интегрированной средой разработки Rational Rose. На данном этапе проектирования нам понадобится уровень прецедентов (Use Case View), в котором можно изобразить диаграммы действий и вариантов использования, а также определить актеров.
На рис. 2 изображена основная диаграмма вариантов использования, которая определяет основные действия пользователя в программе:
* быстрый расчет - используются координаты по умолчанию, производится расчет и выводится таблица;
* расчет с вводом с клавиатуры - пользователь вводит координаты и, если они правильные, производится расчет и выводится таблица;
* расчет со стандартными параметрами, xe < xb - используются стандартные координаты, такие, чтобы точка e располагалась левее точки b, выводится соответствующий рисунок и таблица;
* расчет со стандартными параметрами, xe = xb - используются стандартные координаты, такие, чтобы точка e располагалась под точкой b, выводится соответствующий рисунок и таблица;
* расчет со стандартными параметрами, xe > xb - используются стандартные координаты, такие, чтобы точка e располагалась правее точки b (но левее точки d), выводится соответствующий рисунок и таблица;
* перерасчет - производится перерасчет со значениями, использованными в предыдущем расчете;
* вывод информации - выводится информация о приложении, объясняющая пользователю назначение программы и указывающая автора.
Для удобства и лучшего понимания пять опций, связанных с расчетом площади, объединены в один вариант использования с помощью отношения обобщения. Отдельно стоит вариант "Перерасчет", выполняющийся при условии, описанном в диаграмме действий на рис. 4. Он соединяется отношением расширения, так как вариант "Расчет площади методом Монте-Карло" неявно включает поведение элемента "Перерасчет".
Единственный актер "Пользователь" (так как все, кто запустит программу, равны по возможностям) соединяется с элементами "Вывод информации" и "Расчет площади методом Монте-Карло" отношением ассоциации, а мощности 1 и * означают, что актер может обратиться к этим вариантам многократно.
Рис. 2. Основная диаграмма вариантов использования
На рис. 3, как было сказано выше, описана проверка для перерасчета: если расчеты до этого не проводились, действие будет отклонено.
Рис. 3. Диаграмма действий для перерасчета
2.2 Требования к приложениям
По заданию курсовой работе требуется разработать три различных приложения. Все программы должны удовлетворять вышеперечисленным требованиям, но реализации приложений различны.
Приложение 1 (приложение Windows Console):
* интерфейс: Windows Console;
* язык: С#.
Приложение 2 (приложение на языке JScript):
* интерфейс: HTML;
* язык скрипта - Jscript.
Приложение 3 (приложение с использованием ASP.NET):
* язык: С#;
* клиент Web-сервиса - Win32 Application;
* тип вызова Web-сервиса: асинхронный.
Входными данными при разработке данных приложений являются координаты вершин четырехугольника.
Во всех приложениях выходными данными являются: * площадь четырехугольника, вычисленная по правилам геометрии;
* таблица с информацией о работе метода Монте-Карло:
* количество точек для данного опыта;
* количество попавших в треугольник точек;
* площадь треугольника, вычисленная методом Монте-Карло;
* погрешность вычислений;
* время вычислений.
3 Анализ алгоритма решения задачи
3.1 Метод Монте-Карло
В общем случае метод Монте-Карло - общее название численных методов, основанных на получении большого числа реализаций случайного процесса, который формируется таким образом, чтобы его вероятностные характеристики совпадали с аналогичными величинами решаемой задачи. Метод был окончательно сформулирован в 1949 году и носит название города, где расположена рулетка, которую можно рассматривать как генератор случайных чисел.
В данном курсовом проекте метод Монте-Карло используется для нахождения фигуры (трапеции), которую описывает прямоугольник.
Суть метода в том, что если произвольным образом "бросать" точки в прямоугольник и определять, сколько из них попало в трапецию, то можно легко посчитать отношение площади трапеции к площади прямоугольника. А если известны площадь прямоугольника и отношение, площадь трапеции найти не составит труда:
,
где M и N - количество попавших точек и их общее количество, S - площадь прямоугольника, T - площадь трапеции.
Точность подобного нахождения площади зависит от количества "брошенных" точек и генератора случайных чисел.
3.2 Определение попадания точки в трапецию
Существует много способов определения попадания точки в трапецию: через уравнения прямых (лежит ли точка выше или ниже прямой), с помощью сравнения углов, определения пересечений и т.д. Самым распространенным является способ определения попадания с помощью уравнений прямых - при использовании этого способа можно наиболее успешно минимизировать количество вычислений в цикле.
Однако в данной работе воспользуемся методом сравнения тангенсов углов - это весьма интересный и куда реже использующийся метод, реализовать который представляется весьма интересным. Рис. 6. Определение попадания точки в трапецию
Известно, что в прямоугольном треугольнике тангенс угла равен отношению противолежащего катета к прилежащему. Исходя из этого положения, мы можем вычислить угол в прямоугольном треугольнике, зная две стороны. А зная углы можно сделать утверждение: если и , то точка попала в трапецию. Тангенсы углов вычисляются по формулам:
, , , .
Таким образом, формулы по определению попадания точки будут выглядеть так:
, .
То же самое можно записать и для координат точек:
, .
4 Консольное приложение
4.1 Программные средства реализации приложения
Платформа .NET Framework - это интегрированный компонент Windows, который поддерживает создание и выполнение нового поколения приложений и веб-служб XML. При разработке платформы .NET Framework учитывались следующие цели:
* обеспечение согласованной объектно-ориентированной среды программирования для локального сохранения и выполнения объектного кода, для локального выполнения кода, распределенного в Интернете, либо для удаленного выполнения;
* обеспечение среды выполнения кода, минимизирующей конфликты при развертывании программного обеспечения и управлении версиями.
* обеспечение среды выполнения кода, гарантирующей безопасное выполнение кода, включая код, созданный неизвестным или не полностью доверенным сторонним изготовителем;
* обеспечение среды выполнения кода, исключающей проблемы с производительностью сред выполнения сценариев или интерпретируемого кода;
* обеспечение единых принципов работы разработчиков для разных типов приложений, таких как приложения Windows и веб-приложения;
* разработка взаимодействия на основе промышленных стандартов, которое обеспечит интеграцию кода платформы .NET Framework с любым другим кодом.
Двумя основными компонентами платформы .NET Framework являются общеязыковая среда выполнения (CLR) и библиотека классов .NET Framework. Основой платформы .NET Framework является среда CLR. Среду выполнения можно считать агентом, который управляет кодом во время выполнения и предоставляет основные службы, такие как управление памятью, управление потоками и удаленное взаимодействие. При этом накладываются условия строгой типизации и другие виды проверки точности кода, обеспечивающие безопасность и надежность.
Благодаря тому, что промежуточное представление .NET не привязано к какой-либо платформе, приложения, созданные в архитектуре .NET, являются кроссплатформенными. Платформа .NET предоставляет автоматическое управление ресурсами.
Так как в основе .NET лежит единая объектно-ориентированная модель классов, в которой все классы унаследованы от базового класса Object. Классы разбиты на пространства имен для избегания накладок при совпадении имен. Основные сервисы .NET сосредоточены в пространстве имен System. Пространства имен имеют много уровней вложенности (например, System.WinForms или System.Web.UI.WebControls). Программисты могут создавать собственные пространства имен для своих классов или пользоваться уже существующими классами, расширяя их функциональность путем наследования и переопределения методов. Модель платформы .NET может существенно упростить разработку приложений по сравнению с программированием для Windows-платформ, где практически вся функциональность предоставлялась разработчику как неструктурированный набор функций в Windows API.
Для создания консольного приложения была выбрана интегрированная среда разработки MS Visual Studio.NET 2005, так как в данной среде разработки поддерживается разработка консольных приложений с использованием языка программирования высокого уровня C#.
Классические консольные приложения являются самыми простыми с точки зрения пользовательского интерфейса. Отличительная черта консольных приложений состоит в том, что для вывода и ввода информации используется дисплей консоли, работающий в текстовом режиме. Так же стоит отметить, что в консольных приложениях отсутствует GUI-интерфейс (GUI - Graphic User Interface), что делает консольные приложения наименее требовательными к ресурсам системы, в отличие от приложений MS Windows.
4.2 Логическое проектирование приложения
В консольном приложении, использующем пространство имен Program_1, определим следующие классы:
* класс точки MyPoint;
* класс четырехугольника, состоящий из четырех точек MyRectangle;
* класс Result, хранящий и обрабатывающий результаты вычислений;
* класс основной программы Program.
При этом, так как метод main() находится в классе Program, все поля и методы этого класса должны быть объявлены как статические (static). Диаграмма классов ClassDiagram1.cd, созданная с помощью Visual Studio, показана на рис. 7.
Рис. 7. Диаграмма классов
В классе Program определены следующие поля и методы:
static Result res = new Result() - объект класса Result, содержит данные, выводимые на таблицу;
static double S_pr - площадь прямоугольника, описывающего трапецию;
static double length, height - длина и высота прямоугольника (и, соответственно, трапеции);
static int choice = 0 переменная выбора в меню;
static int Time - время расчета;
static double x1, x2, x3 - прилежащие катеты;
static MyRectangle MyRec = new MyRectangle() - объект класса MyRectangle, содержит координаты точек введенного прямоугольника (и, соответственно, трапеции);
static void EnterPoints() - метод, отвечающий за ввод точек и проверку правильности ввода и соответствия координат условию;
static double Gogogo(double N) - метод для расчета, вызываемый пять раз - для точек;
static void TableBuild() - построение таблицы по рассчитанным значениям res, объекта класса Result.
В классе MyPoint определены следующие поля и методы:
public double X, Y - координаты точки;
public MyPoint() - конструктор по умолчанию;
public MyPoint(int x, int y) - конструктор с определением;
public override string ToString() - переопределение метода ToString;
public MyPoint EnterPoint(MyPoint point) - метод для ввода координат точки и проверки их соответствия условию;
private double EnterX(double X) - ввод и проверка координаты X точки, вызывается из EnterPoint;
private double EnterY(double Y) - ввод и проверка координаты Y точки, вызывается из EnterPoint.
В классе MyRectangle определены следующие поля и методы:
public MyPoint b = new MyPoint(), c = new MyPoint(), d = new MyPoint(), e = new MyPoint() - точки четырехугольника;
public MyRectangle() - конструктор по умолчанию;
public MyRectangle(MyPoint b, MyPoint c, MyPoint d, MyPoint e) - конструктор с определением;
public double ReturnHeight() - определение высоты четырехугольника.
Список полей и методов класса MyRectangle:
public double S_tr, S_tr1, S_tr2, S_tr3, S_tr4, S_tr5 - полученные площади;
public int time1, time2, time3, time4, time5 - время расчета;
public double imprecision1, imprecision2, imprecision3, imprecision4, imprecision5 - погрешности;
public double M1, M2, M3, M4, M5 - количество попавших точек;
public int counting_counter - счетчик расчетов;
public Result() - конструктор по умолчанию.
Полный листинг программы можно посмотреть в Приложении 1.
4.3 Руководство системного программиста
4.3.1 Общие сведения о приложении
Приложение предназначено для вычисления площади четырехугольника методом Монте-Карло, оценки вычислительной мощности компьютера и вычислительной эффективности языка C#.
4.3.2 Системные требования
Для выполнения настольного приложения необходимы:
* операционная система MS Windows XP/Vista/Seven;
* наличие Microsoft .NET Framework версии 3.5 или выше;
* 32 Мб оперативной памяти;
* наличие 1 Мб свободного места на жестком диске.
4.4 Руководство программиста
4.4.1 Структура приложения
Программа состоит из единственного модуля - Program.cs.
4.4.2 Общие сведения о приложении
В проекте используются некоторые пространства имен.
System - самое важное пространство имен в С#. В нем определены классы, которые обеспечивают самые важные функции С#. Не удастся создать ни одно работоспособное приложение С# без использования этого пространства имен;
System.Data - главное пространство имен ADO.NET. в нем определены типы, представляющие таблицы, столбцы, записи, ограничения и, конечно же, самый важный тип - DataSet. В этом пространстве имен нет типов для подключения к источнику данных - только типы, представляющие сами данные;
System.Drawing - важнейшее пространство имен GDI+, которое содержит основный типы для вывода графики (для работы со шрифтами, перьями, кистью и т. п.), а также исключительно важный тип Graphics;
System.Windows.Forms - это пространство имен предназначено для создания обычных приложений .NET с графическим интерфейсом. 4.4.3 Характеристики приложения
Рассмотрим характеристики программы с помощью среды Rational Rose.
На рис. 8 изображена диаграмма последовательностей, показывающая часть работы программы после выбора пункта "расчет с параметрами, вводимыми с клавиатуры".
Рис. 8. Диаграмма последовательностей
На этой диаграмме хорошо показаны упорядоченные по времени действия программы, однако для лучшего отображения взаимодействия объектов и классов приведем еще и диаграмму сотрудничества этой же части (рис. 9).
Рис. 9. Диаграмма сотрудничества
4.5 Руководство оператора
Приложение предназначено для вычисления площади четырехугольника методом Монте-Карло, оценки вычислительной мощности компьютера и вычислительной эффективности языка C#.
Программа выполнится успешно, если компьютер удовлетворяет описанным в пункте 4.3 требованиям и находится в стабильном состоянии.
Для работы программы необходимо запустить исполняемый модуль Prog1.exe и в появившемся меню выбрать один из следующих пунктов:
* быстрый расчет;
* расчет с параметрами, вводимыми с клавиатуры;
* расчет со стандартными параметрами, xe < xb;
* расчет со стандартными параметрами, xe = xb;
* расчет со стандартными параметрами, xe > xb;
* перерасчет с текущими значениями;
* информация;
* выход.
После выбора пункта меню "расчет с параметрами, вводимыми с клавиатуры" и ввода координат одной из точек программа может выдать одну из ошибок: "Вам не удалось ввести координату, попробуйте ещё раз:" или "С такими координатами не построишь нужную трапецию, пожалуйста, попробуйте ещё раз:". Первая ошибка означает, что введенная информация не является числом, а вторая - что координаты точки не удовлетворяют условию. В обоих случаях пользователю необходимо ввести другие координаты для продолжения расчета.
4.6 Результаты работы приложения
Результаты работы приложения продемонстрированы на рис. 10.
Рис. 10. Результат работы консольного приложения
5 Приложение на базе ASP
5.1 Программные средства реализации приложения
ASP (Active Server Pages, активные серверные страницы) - это среда выполнения приложений, встроенная в Web сервер IIS (Internet Information Server, информационный сервер Интернета). В активных серверных страницах (файлах с расширением .asp) обычно имеются сценарии на скриптовых языках (например,VBScript или JScript), которые выполняются на сервере (в контексте IIS) до передачи HTML кода клиенту. Для обозначения сценариев, исполняющихся на стороне сервера, применяются специальные теги <% %>.
Данное приложение реализуется с помощью языков скриптов - JScript и JavaScript. В качестве интерпретатора скриптов использовался IIS и встроенный в Microsoft Visual Studio сервер. Разработка приложения велась в Microsoft FrontPage и частично отлаживалась в Visual Studio. Приложение состоит из двух страниц: startpage.html и results.asp.
5.2 Разработка активных страниц ASP
5.2.1 Страница startpage.html
Startpage.html - начальная страница, является точкой входа и не содержит серверных скриптов (поэтому имеет расширение .html). На этой странице производится ввод пользователем координат точек трапеции. Для лучшего понимания на страницу помещен рисунок с трапецией, позволяющий лучше понять расположение точек и диапазон требуемых значений координат.
На странице находится единственная форма с именем Form, описываемая в теге <form action="results.asp" name ="Form" method="POST">. Параметр action указывает имя серверной страницы, которой посылаются данные для обработки, а параметр method определяет способ отсылки данных на сервер. Имя формы используется для доступа к ее элементам.
На форме расположены восемь полей для ввода текста - по одному на координату каждой точки. Пример тега для помещения поля для ввода текста: <input name="bx" type="edit" style="width: 50px; vertical-align: middle; text-align: center;" value="500">. При вводе значений координат y производится ввод этих же координат в поле ввода такой же по высоте точки. Это реализуется с помощью клиентских скриптов на языке JavaScript. И язык, и сами скрипты объявляются в теге <script> следующим образом: <script language="JavaScript"><!--...--></script>, где <!-- и --> - комментарии для пользователей, у которых по каким-либо причинам отсутствует обработка скриптов. Приведем функции для ввода координат в двух полях одновременно:
function BtoC()
{
document.Form.cy.value = document.Form.by.value;
}
function CtoB()
{
document.Form.by.value = document.Form.cy.value;
}
function DtoE()
{
document.Form.ey.value = document.Form.dy.value;
}
function EtoD()
{
document.Form.dy.value = document.Form.ey.value;
}
Вызов функции прописывается в теге поля ввода, например: onchange="BtoC();"
Кроме полей ввода и текста, описывать который не представляется нужным, в форме есть кнопка перехода на следующую страницу: <input name="run" style="width: 118px" type="button" onclick="check_correctness();" value="Вычислить">. В этом теге value - текст, отображаемый на кнопке, а onclick="check_correctness();" - вызов функции проверки координат, написанной на языке JavaScript.
function check_correctness()
{
if (document.Form.bx.value <= document.Form.zero.value || document.Form.by.value <= document.Form.zero.value || document.Form.cx.value <= document.Form.bx.value || document.Form.cy.value != document.Form.by.value || document.Form.dy.value >= document.Form.cy.value || document.Form.ex.value >= document.Form.dx.value || document.Form.ey.value != document.Form.dy.value)
{
alert ('Координаты введены неверно, внимательнее смотрите на рисунок.');
return;
}
else
document.Form.submit();
}
Эта функция проверяет координаты, и, если они правильные, переходит на следующую страницу с помощью метода submit. В противном случае выводится сообщение об ошибке.
Рисунок с трапецией помещен в тот же каталог, что и страницы приложения, и отображается на экране с помощью тега <img src="img_3.gif" alt="" width="302" height="165">.
5.2.2 Страница results.asp
Results.asp - вторая и последняя страница приложения, на ней производятся расчеты и выводится таблица с результатами (количеством точек, в целом и попавших, площадь методом Монте-Карло, погрешность и потраченное время) и площадь трапеции по правилам геометрии. С этой страницы можно перейти обратно на первую страницу или же произвести перерасчет площади с этими же координатами.
На странице используются только серверные скрипты Jscript. Язык скриптов задается так: <%@ LANGUAGE = "JScript"%>. Весь код скриптов должен помещаться в специальные теги <%%>, например, клиентский скрипт на абстрактном языке может выглядеть так: <%защитить_курсовую_работу;%>, где защитить_курсовую_работу - какое-либо действие на абстрактном языке скриптов. Для вывода значений переменных, описанных в скриптах, используется такой синтаксис: <%=some_variable%>.
Алгоритм работы страницы:
1. В переменные координат точек и в cookies записываются значения из соответствующих полей предыдущей страницы, если же в полях на предыдущей странице нет данных (была нажата кнопка перерасчета), эти значения считываются из cookies. Пример для координаты x точки b:
if(Request.Form("bx").Count != 0)
{
b_X=Request.Form("bx")(1);
Response.Cookies("sessbx")=b_X;
}
else
b_X=Request.Cookies("sessbx");
2. Вычисляются некоторые промежуточные значения, такие как высота трапеции и отношение сторон, формируются открывающие теги тела html кода (построение заголовков, таблиц и прочих элементов управления);
3. Запускатеся цикл, в котором построчно строится таблица, производится расчет соответствующих значений и замер времени для каждого шага;
4. Создаются кнопки типа submit - для перехода на предыдущую страницу и для перерасчета. Так как эти кнопки указывают на разные страницы, они находятся в разных формах - back_to_the_future и i_wanna_replay;
5. Формируются закрывающие теги.
Опишем используемые на этой странице переменные:
b_X, b_Y, c_X, c_Y, d_X, d_Y, e_X, e_Y - координаты точек;
S_pr, S_tr - площади прямоугольника и трапеции, найденные по формулам геометрии.
N, M - количество общих и попавших точек.
length, height - высота и длина прямоугольника (и трапеции).
tana, tanb, tang - тангенсы углов (они же соотношении сторон).
i - счетчик цикла.
time, timer, StartTime, StopTime - переменные, определяющие время;
RandomPoint_X, RandomPoint_Y - координаты случайной точки.
Полный листинг страниц можно посмотреть в Приложении 2.
5.3 Руководство системного программиста
5.3.1 Общие сведения о приложении
Приложение предназначено для вычисления площади четырехугольника методом Монте-Карло, оценки вычислительной мощности компьютера и вычислительной эффективности активных серверных страниц.
5.3.2 Системные требования
Для выполнения приложения необходимы:
* операционная система MS Windows 2000 или более поздняя версия;
* установленный информационный сервер Интернета (Internet Information Server, IIS);
* наличие обозревателя MS Internet Explorer 5.0 и выше, или его аналогов;
* 32 Мб оперативной памяти;
* наличие 1 Мб свободного места на жестком диске.
5.3.3 Настройка приложения
Для обеспечения работоспособности приложения требуется выполнить установку IIS-сервера и создать виртуальный каталог, в который необходимо поместить работающее приложение.
IIS обычно входит в дистрибутивы операционных систем MS Windows 2000/XP. Он устанавливается либо в процессе установки этих операционных систем, либо позже, во время их эксплуатации (запускается команда добавления новых компонентов операционной системы).
Для того, чтобы время ожидания сценария ASP не ограничивалось маленьким промежутком времени (установленным по умолчанию), необходимо произвести соответствующие настройки: * запустить диспетчер служб Интернета (Панель управления  Администрирование  Internet Information Server);
* раскрыть список с названием компьютера в левой части окна приложения;
* на пункте "Web - узел по умолчанию" щелкнуть правой кнопкой мыши для вызова контекстного меню, выбрать "Свойства";
* в появившемся окне выбрать вкладку "Домашний каталог", в котором нажать кнопку "Настройка";
* в появившемся окне "Настройка приложения" выбрать вкладку "Параметры" и в поле "Время ожидания сценария ASP" увеличить значение времени в секундах.
Все файлы ASP необходимо разместить в виртуальном каталоге. Для того чтобы каталог стал виртуальным каталогом сервера IIS, то есть стал видимым в Web-сети, необходимо выполнить следующую последовательность действий:
* запустить диспетчер служб Интернета (Панель управления  Администрирование  Internet Information Server);
* раскрыть список с названием компьютера в левой части окна приложения;
* на пункте "Web - узел по умолчанию" щелкнуть правой кнопкой мыши для вызова контекстного меню, выбрать "Создать  Виртуальный каталог";
* следуя подсказкам мастера создать виртуальный каталог (устанавливаем имя, по которому будет осуществляться доступ в сети к виртуальному каталогу, и местонахождение на диске фактического каталога).
Имя для виртуального каталога лучше выбирать осмысленно, так, чтобы не было стыдно показать его сторонним лицам.
5.4 Руководство программиста
5.4.1 Структура приложения
Приложение состоит из двух частей - html-страницы startpage.html, которая является отправной точкой работы приложения, и asp-страницы results.asp, на которой производятся расчеты и вывод результатов. Также в папке содержится рисунок img_3.gif, который загружается на первую страницу.
5.4.2 Назначение и условия применения приложения
Приложение предназначено для вычисления площади четырехугольника методом Монте-Карло, оценки вычислительной мощности компьютера и вычислительной эффективности активных серверных страниц.
Для использования приложения необходимо поместить папку Prog2 в виртуальный каталог, ввести в браузере адрес виртуального каталога, прибавить к нему строку "Prog2/startpage.html" и нажать на клавиатуре клавишу "Ввод".
5.5 Руководство пользователя
Приложение предназначено для вычисления площади четырехугольника методом Монте-Карло, оценки вычислительной мощности компьютера и вычислительной эффективности активных серверных страниц.
Программа выполнится успешно, если будет удовлетворять требованиям, описанным в пункте 5.3.3.
После открытия страницы пользователю необходимо ввести координаты точек в текстовые поля и нажать кнопку "Рассчитать". Если вместо расчета появится окошко с ошибкой (рис. 11), пользователю придется исправить координаты на удовлетворяющие условию.
Рис. 11. Сообщение об ошибке
Если же окошка не появится, то координаты введены правильно и пользователь может идти пить чай - вычисление площади методом Монте-Карло - процесс небыстрый.
5.6 Результаты выполнения приложения
Результаты работы приложения продемонстрированы на рис. 12 и 13.
Рис. 12. Стартовая страница
Рис. 13. Результат работы приложения на базе ASP
6 Приложение на базе Web-сервисов ASP.NET
6.1 Программные средства реализации приложения
Данное приложение состоит из двух частей: клиентского приложения WebForm и Web-сервиса, обеспечивающего функциональность клиентского приложения. Обе части реализованы в интегрированной среде разработки Visual Studio, которая представляет собой полный набор инструментов для создания как Web-приложений, так и Web-сервисов. Используя инструменты разработки Visual Studio, основанные на использовании компонентов, и другие технологии, можно не только создавать эффективно работающие Web-сервисы и Web-приложения, но и упрощать совместное проектирование, разработку и развертывание корпоративных решений.
Информационный сервер Internet компании Microsoft (Internet Information Server - IIS) взаимодействует как со страницами ASP.NET так и с Web-службами, которые отсылают ему запросы по протоколу передачи гипертекстовых файлов HTTP. Запросы кодируются как часть унифицированного указателя информационного ресурса (URL) или представляются в виде XML-текста. В ответ на запрос Web-службы информационный сервер Internet (IIS) создает запрошенный объект. Затем информационный сервер вызывает метод объекта, который обрабатывает соответствующий запрос. Любые возвращаемые данные преобразуются в XML-формат и возвращаются клиенту как ответ по протоколу передачи гипертекстовых файлов HTTP.
Прежде чем клиент сможет использовать Web-службу, он должен быть способен создавать, отправлять, получать и понимать XML-сообщения. Платформа .NET предоставляет решение в виде специального компонента, который называется прокси-классом (proxy class) и который выполняет наиболее трудную часть работы для клиентского приложения. Прокси-класс скрывает вызовы методов Web-службы. Он отвечает за генерацию SOAP-сообщений в корректном формате и управление сообщениями в сети (с помощью протокола HTTP). Когда прокси-класс получает ответное сообщение, он еще и преобразует результаты обратно в соответствующие типы данных .NET.
Благодаря прокси-классу, вызывать Web-метод в Web-службе можно так же легко, как и в локальном компоненте. Однако эта прозрачность не всегда приносит пользу, поскольку Web-службы имеют характеристики, отличающиеся от локальных компонентов. Например, вызов Web-метода занимает неизвестное заранее количество времени, поскольку каждый такой вызов должен преобразовываться в XML и пересылаться через сеть. Чтобы к Web-службе можно было получить доступ с другого компьютера, эта Web-служба должна быть доступной. Это означает, что нельзя полагаться на встроенный Web-сервер Visual Studio (который динамически выбирает новый порт каждый раз, когда его запускают). Вместо этого необходимо создать виртуальный каталог для Web-службы. Затем, уже создав Web-сервис, осуществляющий функциональную полноту клиентского приложения, мы можем из данного приложения вызывать эту службу.
6.2 Логическое проектирование Web-сервиса
Создадим web-сервис Service, который будет осуществлять расчет площади четырехугольника по методу Монте-Карло. Web-сервис Service реализуется с помощью класса Service. Класс Service наследуется от класса System.Web.Services.WebService.
Класс Service изображен на рис. 14, а структуры Point и Result - на рис. 15 и рис. 16.
Рис. 14. Класс Service Web-сервиса
Рис. 15. Диаграмма структуры Point
Рис. 16. Диаграмма структуры Result
В классе Service определены следующие поля и методы:
public struct Point - структура, содержащая координаты точки;
public struct Result - структура, содержащая поля со значениями погрешности, площади, количества попавших точек, и время расчетов;
private int Time - время расчета;
private double length, height - длина и высота прямоугольника (и трапеции);
private double x1, x2, x3 - прилежащие катеты;
public Result S = new Result() - структура с результатами;
public Service() - конструктор класса;
[WebMethod]
public Result MegaFunction(Point b, Point c, Point d, Point e) - метод, вызываемый из сервиса, принимает координаты точек и возвращает заполненную структуру с результатами;
private double Gogogo() - метод для расчета, вызываемый пять раз - для точек.
6.3 Логическое проектирование клиентского Web-приложения
Реализуем клиентское WebForm приложение, которое будет обращаться к созданному ранее Web-сервису. Для этого добавим в решение новый Web-сайт и создадим Web-ссылку на Web-метод.
Web-приложение состоит из активной страницы с разделяемым кодом (разметка находится в файле Default.aspx, а код - в файле Default.aspx.cs) и прокси-класса (генерируется при выполнении).
На рис. 17 приведена диаграмма классов Web-приложения, а на рис. 18 - отображение структур Result и Point в клиентском приложении.
Рис. 17. Диаграмма классов Web-приложения
Рис. 18. Структуры Result и Point в клиентском приложении
Класс Point и структура Result, объявленные в Web-сервисе, доступны в клиентском приложении благодаря подключенному пространству имен localhost, в котором и находится созданный ранее Web-сервис.
Класс Default, описываемый в файле Default.aspx.cs, наследуется от класса System.Web.UI.Page и содержит следующие поля и методы:
private Service proxy - объект класса сервиса;
public localhost.Result S - структура выходных данных
public localhost.Point b, c, d, e - точки четырехугольника;
public delegate Result Delegizer(Point b, Point c, Point d, Point e) - делегат, через который осуществляется асинхронный доступ к методам класса сервиса;
protected void Page_Load(object sender, EventArgs bl) - обработчик события загрузки страницы;
protected void ButtonCalculate_Click(object sender, EventArgs bl) - обработчик нажатия на кнопку расчета;
private void Chucky(Result S) - функция, производящая создание таблицы и запись в нее значений структуры S;
protected void ButtonI_wanna_replay_Click(object sender, EventArgs bl) - обработчик нажатия на кнопку перерасчета.
6.4 Генерация прокси-класса
После создания клиентского приложения, к нему необходимо добавить прокси-класс для доступа к Web-сервису. Прокси-класс - это класс, созданный из файла WSDL Web-службы, позволяющий клиентскому приложению вызывать методы Web-службы. Клиентскому приложению не обязательно просматривать прокси-класс или выполнять с ним какие-либо операции.
После тестирования работы Web-службы, мы можем добавить ссылку на нее в клиентское приложение, т.е. создать прокси-класс.
Существуют два способа создания прокси-класса в .NET -воспользоваться утилитой командной строки wsdl.ехе или воспользоваться предлагаемой Visual Studio возможностью для добавления Web-ссылок.
Оба эти подхода, по сути, дают один и тот же результат, поскольку они предполагают использование одних и тех же классов в .NET Framework для выполнения фактической работы. Отличием подхода, предполагающего использование утилиты wsdl.exe, от подхода, предполагающего использование функции для добавления Web-ссылок в приложение ASP.NET, является то, что в случае применения встроенного инструментария Visual Studio для добавления Web-ссылок увидеть фактический код прокси-класса будет невозможно (т.к. он генерируется позже, во время компиляции). Это ограничение не распространяется на клиентов других типов, например, приложений Windows Form или консольного типа. Они не используют модель компиляции ASP.NET, поэтому код прокси-класса добавляется прямо в проект.
6.5 Руководство системного программиста
6.5.1 Общие сведения о приложении
Приложение предназначено для вычисления площади четырехугольника методом Монте-Карло. Приложение состоит из двух частей (клиентской и серверной) и реализовано на языке программирования высокого уровня C#.
6.5.2 Системные требования
Для работы третьего приложения требуется наличие следующих программных пакетов:
* операционная система MS Windows XP(SP2)/XP(SP3)/Vista;
* информационный сервер Интернета (Internet Information Server, IIS 5.1 или выше);
* наличие виртуального каталога, содержащего непосредственно Web-сервис;
* наличие Microsoft .NET Framework версии 2.0 или выше.
6.5.3 Настройка приложения
Для обеспечения работоспособности приложения требуется выполнить установку IIS-сервера и создать виртуальный каталог, в который необходимо поместить работающее приложение.
IIS обычно входит в дистрибутивы операционных систем MS Windows 2000/XP. Он устанавливается либо в процессе установки этих операционных систем, либо позже, во время их эксплуатации (запускается команда добавления новых компонентов операционной системы).
Для того чтобы опубликовать web-сервис на сервере IIS необходимо выполнить следующую последовательность действий:
* запустить диспетчер служб Интернета (Панель управления  Администрирование  Internet Information Server);
* раскрыть список с названием компьютера в левой части окна приложения;
* на пункте "Web - узел по умолчанию" щелкнуть правой кнопкой мыши для вызова контекстного меню, выбрать "Создать  Виртуальный каталог";
* следуя подсказкам мастера создать виртуальный каталог (устанавливаем имя, по которому будет осуществляться доступ в сети к виртуальному каталогу, и местонахождение на диске фактического каталога).
Имя для виртуального каталога лучше выбирать осмысленно. В качестве имени рекомендуется ввести Service.
Клиентское приложение дополнительной настройки не требует.
6.6 Руководство программиста
6.6.1 Структура приложения
Данное приложение состоит из двух частей (клиентской и серверной). В клиентской части реализован интерфейс WebForm. Серверным приложением является Web-служба XML.
В состав проекта клиентского приложения ASP.NET (WebForm) входят следующие файлы:
* Default.aspx - является точкой входа в программу;
* Default.aspx.cs - содержит обработчики событий, вызываемые пользователем действиями на клиентском приложении;
* Service.disco - содержит ссылки и адреса на механизмы, используемые для доступа к web-сервису;
* Service.wsdl - описание web-сервиса;
Проект Web-сервиса содержит следующие файлы:
* Service.asmx - точка входа в web-сервис;
* Service.cs - содержит реализацию web-сервиса;
* web.config - содержит настройки web-сервиса.
6.6.2 Назначение и условия применения приложения
Приложение предназначено для вычисления площади четырехугольника методом Монте-Карло. Приложение состоит из двух частей (клиентской и серверной) и реализовано на языке программирования высокого уровня C#.
Для запуска программы необходимо запустить браузер, ввести в адресную строку "http://localhost/П3/" (без кавычек).
6.6.1 Общие сведения о приложении
В проекты включены следующие пространства имен.
System - основное пространство имен, содержит фундаментальные и базовые классы, которые определяют распространенные типы значений и ссылочные типы данных, события и обработчики событий, интерфейсы, атрибуты и исключения обработки. Также содержит классы, обеспечивающие поддержку преобразования типов данных, операций с параметрами методов, математических операций, удаленного и локального вызова программ, управления средой приложений и контроля управляемых и неуправляемых приложений;
System.Web - пространство имен, осуществляет поддержку классов и интерфейсов, которые обеспечивают взаимодействие между Web-обозревателем и сервером. Данное пространство имен включает класс HttpRequest, предоставляющий развернутые сведения о текущем HTTP-запросе, класс HttpResponse, управляющий HTTP-выводом данных для клиента, и класс HttpServerUtility, с помощью которого можно получить доступ к серверным служебным программам и процессам. Также пространство имен System.Web содержит классы для работы с файлами Cookie, передачи файлов, получения сведений об исключениях и управления кэшем вывода;
System.Web.Services - пространство имен содержит классы, позволяющие создавать Web-службы XML с помощью ASP.NET и клиентов Web-служб XML. Web-службы XML представляют собой приложения, обеспечивающие возможность обмена сообщениями в слабосвязанной среде с помощью стандартных протоколов, таких как HTTP, XML, XSD, SOAP и WSDL. Web-службы XML делают возможным создание в неоднородной внутрифирменной или межфирменной среде модульных приложений, совместимых с широким диапазоном реализаций, платформ и устройств. Сообщения XML на базе протокола SOAP, используемые этими приложениями, могут содержать четко определенные (структурированные или типизированные) или свободно определенные с помощью произвольного содержимого XML части. Способность этих сообщений к дальнейшему развитию без нарушения протокола является основой гибкости и надежности Web-служб XML как структурного элемента будущей Web-сети.
6.7 Руководство пользователя
Приложение предназначено для вычисления площади четырехугольника методом Монте-Карло.
Для успешной работы программы необходимо иметь компьютер, удовлетворяющий системным требованиям, приведенным в пункте 6.5.2. Наличие опубликованных на сервере IIS и корректно работающих Web-сервиса и клиентского приложения.
Для работы с приложением необходимо открыть клиентскую страницу в браузере, ввести координаты и нажать кнопку "вычислить".
В случае если пользователь ввел некорректные координаты, ему будет показано сообщение об ошибке и о причинах ее возникновения. Чтобы устранить данную ошибку необходимо ввести корректное значение координат.
6.8 Результаты работы приложения
Результаты работы приложения представлены на рис. 20.
Рис. 20. Результат работы клиентского приложения на базе ASP.NET
7 Приложение на базе AJAX
7.1 Программные средства реализации приложения
AJAX представляет собой комплекс современных технологий, позволяющих создавать интерактивные веб-приложения нового уровня. Использование AJAX приводит к возможности динамического изменения контента веб-страницы: страница сама будет догружать нужные пользователю данные, при этом полностью не перегружаясь, а загружая лишь изменившиеся данные.
Сам термин AJAX является сокращением и расшифровывается как "Asynchronous JavaScript And XML" (Aсинхронный JavaScript и XML). AJAX - это не самостоятельная технология, а синтез технологий, которые сами по себе существовали еще за несколько лет до появления термина AJAX. Так еще в 1996 году в браузере Internet Explorer была реализована поддержка тэга IFRAME, позволяющего загружать контент во фрейм без необходимости перезагрузки всей страницы. Поскольку тэг IFRAME и его аттрибут SRC позволяют осуществлять загрузку любого URL во фрейме, то при использовании JavaScript это в принципе позволяет добиться характерных для AJAX эффектов.
Ajax базируется на двух основных принципах:
* Использование DHTML для динамичного изменения содержания страницы;
* Использование XMLHttpRequest для обращения к серверу "на лету".
Использование этих двух подходов позволяет создавать намного более удобные WEB-интерфейсы пользователя на тех страницах сайтов, где необходимо активное взаимодействие с пользователем. Использование Ajax стало наиболее популярно после того, как компания Google начала активно использовать его при создании своих сайтов, таких как Gmail, Google maps и Google suggest. Создание этих сайтов подтвердило эффективность использования данного подхода.
7.2 Логическое проектирование Web-сервиса
Создадим web-сервис Service, который будет осуществлять расчет площади четырехугольника по методу Монте-Карло. Web-сервис Service реализуется с помощью класса Service. Класс Service наследуется от класса System.Web.Services.WebService.
Класс Service и структуры Point и Result изображены на рис. 21.
Рис. 21. Класс Service и структуры Point и Result Web-сервиса
В классе Service определены следующие поля и методы:
public struct Point - структура, содержащая координаты точки;
public struct Result - структура, содержащая поля со значениями погрешности, площади, количества попавших точек, и время расчетов;
private int Time - время расчета;
private double length, height - длина и высота прямоугольника (и трапеции);
private double x1, x2, x3 - прилежащие катеты;
public Result S = new Result() - структура с результатами;
public Service() - конструктор класса;
[WebMethod]
public Result MegaFunction(Point b, Point c, Point d, Point e) - метод, вызываемый из сервиса, принимает координаты точек и возвращает заполненную структуру с результатами;
private double Gogogo() - метод для расчета, вызываемый пять раз - для точек.
7.3 Логическое проектирование клиентского Web-приложения
Реализуем клиентское WebForm приложение, которое будет обращаться к созданному ранее Web-сервису. Для этого добавим в решение новый Web-сайт и создадим Web-ссылку на Web-метод.
Web-приложение состоит из активной страницы с разделяемым кодом (разметка находится в файле Default.aspx, а код - в файле Default.aspx.cs) и прокси-класса (генерируется при выполнении).
На рис. 24 приведена диаграмма классов Web-приложения, а на рис. 25 - отображение структур Result и Point в клиентском приложении.
Рис. 24. Диаграмма классов Web-приложения
Рис. 25. Структуры Result и Point в клиентском приложении
Класс Point и структура Result, объявленные в Web-сервисе, доступны в клиентском приложении благодаря подключенному пространству имен localhost, в котором и находится созданный ранее Web-сервис.
Класс Default, описываемый в файле Default.aspx.cs, наследуется от класса System.Web.UI.Page и содержит следующие поля и методы:
private Service proxy - объект класса сервиса;
public localhost.Result S - структура выходных данных;
public static int session_count - счетчик номера вычислений в сессии;
public static localhost.Result[] S_sess - массив структур средних выходных данных;
public static localhost.Result S_min - структура минимальных выходных данных;
public static localhost.Result S_max - структура максимальных выходных данных;
public static bool first - флаг первого расчета - принимает значение истины в начале сессии;
public localhost.Point b, c, d, e - точки четырехугольника;
public delegate Result Delegizer(Point b, Point c, Point d, Point e) - делегат, через который осуществляется асинхронный доступ к методам класса сервиса;
protected void Page_Load(object sender, EventArgs bl) - обработчик события загрузки страницы;
protected void One_calc(object sender, EventArgs bl) - обработчик нажатия на кнопку расчета;
private void Chucky(Result S) - функция, производящая создание таблицы и запись в нее значений структуры S;
private void Eq(Result S_new, Result S) - приравнивание двух структур данных;
private void S_round(Result S) - округление данных в массиве структур S_sess и запись округленных значений в последнюю структуру в массиве;
private void S_findmax(Result S) - запись в структуру максимальных данных;
private void S_findmin(Result S) - запись в структуру минимальных данных;
protected void StartSession(object sender, EventArgs bl) - начало сессии расчетов;
protected void ButtonCalculate_Click (object sender, EventArgs bl) - один расчет;
protected void StopSession(object sender, EventArgs bl) - конец сессии расчетов, наступает при обнулении счетчика или нажатии кнопки "Стоп";
protected void Avg(object sender, EventArgs bl) - вывод средних значений;
protected void Min(object sender, EventArgs bl) - вывод минимальных значений;
protected void Max(object sender, EventArgs bl) - вывод максимальных значений.
7.4 AJAX-расширения
7.4.1 Менеджер скриптов
Менеджер скриптов, управляет библиотекой сценариев AJAX и необходим для использования элементов UpdatePanel, UpdateProgress и Timer:
<asp:ScriptManager ID="scriptMgr" runat="server" />
Менеджер скриптов может выполнять также многие другие функции - с его помощью можно асинхронно взаимодействовать с Web-сервисами, регистрировать собственную аутентикацию и персонализацию, декларативно добавлять ссылки на сценарии и сервисы и многое другое. В данной курсовой работе эти функции не понадобятся, но для примера разберем некоторые из них.
Чтобы добавить ссылку на сервис в элемент управления ScriptManager, нужно развернуть набор Services в свойствах и добавить ссылку, как показано на рис. 26.
Рис. 26. Добавление ссылки на веб-сервис
Можно также добавить ссылку и без конструктора, для этого нужно добавить ссылку ServiceReference в теге Service внутри ScriptManager:
<asp:ScriptManager ID="scriptMgr" runat="server" > <Services>
<asp:ServiceReference Path="Service.asmx" />
</Services>
</asp:ScriptManager>
В обоих случаях ссылка создастся и в коде страницы появится строчка:
<script src="Service.asmx/jsdebug" type="text/javascript">
Эта внешняя ссылка добавлена ScriptManager в вывод страницы, поскольку с ее помощью зарегистрирован веб-сервис. К имени веб-сервиса добавлен префикс /jsdebug - если бы это была рабочая сборка, к имени был бы добавлен лишь префикс /js. Когда конвейер ASP.NET AJAX видит запрос к данному сервису с добавленным /js, он возвращает класс сценария, обертывающий методы веб-сервиса (прокси-сценарий). Тело каждого метода в этом классе прокси-сценария выполняет асинхронный вызов соответствующего метода веб-сервиса. Следовательно, для вызова методов веб-сервиса достаточно вызвать соответствующий метод в классе сценария, созданном инфраструктурой веб-сервисов в ASP.NET AJAX. Однако в данной курсовой работе взаимодействие с сервисом уже организовано (см. пункт 7.5), поэтому использовать ServiceReference не представляется нужным.
7.4.2 Панель обновления
Панель обновления позволяет частичное обновление страницы:
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
Если свойство UpdateMode установлено в Always, содержимое элемента управления UpdatePanel изменяется при каждой обратной передаче, исходящей от страницы. Это включает асинхронные обратные передачи из элементов управления, находящихся внутри других элементов управления UpdatePanel, и обратные передачи от элементов управления, не находящихся внутри элементов управления UpdatePanel.
Если свойство UpdateMode установлено в Conditional, содержимое элемента управления UpdatePanel изменяется в следующих случаях:
* При прямом вызове метода Update элемента управления UpdatePanel;
* Когда элемент управления UpdatePanel вложен в другой элемент управления UpdatePanel и обновляется родительская панель;
* Когда обратная передача вызвана элементом управления, определенным как триггер;
* Когда свойство ChildrenAsTriggers установлено в true, дочерний элемент управления UpdatePanel вызывает обратную передачу.
В данной курсовой работе для обновления содержимого UpdatePanel используются триггеры и дочерний элемент - таймер.
7.4.3 Таймер
Когда таймер включен в элемент правления UpdatePanel, он автоматически действует как триггер для элемента управления UpdatePanel, являющегося "отцом" таймера.
<asp:Timer ID="Timer1" runat="server" Interval="2000" OnTick="ButtonCalculate_Click" Enabled="False" />
Для элементов управления Timer внутри UpdatePanel временной компонент JavaScript заново создается только тогда, когда заканчивается текущая обратная передача. Таким образом, временной интервал не начинается, пока страница не выполнит обратную передачу полностью. Например, если для свойства Interval задано значение в 60 000 миллисекунд (60 секунд), но выполнение текущей обратной передачи занимает 3 секунды, то следующая обратная передача произойдет через 63 секунды.
7.4.4 Триггеры
Триггеры записываются внутри элемента UpdatePanel, после тега ContentTemplate. Несколько триггеров можно объединять в тег Triggers:
<Triggers>
<asp:AsyncPostBackTrigger ControlID="ButtonCalculate" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="ButtonSession" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="ButtonStop" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="ButtonAvg" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="ButtonMin" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="ButtonMax" EventName="Click" />
</Triggers>
Триггеры инициируют обновление части страницы внутри элемента UpdatePanel, являющегося "отцом" этих триггеров по событию, тип которого описан в свойстве EventName. ID элемента, к которому относится событие, записывается в свойство ControlID.
7.4.5 Прогресс обновления
Элемент прогресс обновления позволяет визуально отобразить для пользователя процесс частичной загрузки страницы:
<asp:UpdateProgress ID="UpdateProgress1" runat="server" AssociatedUpdatePanelID="UpdatePanel1" DisplayAfter="0">
<ProgressTemplate>
Ожидание ответа от сервера...
</ProgressTemplate>
</asp:UpdateProgress>
Есть два способа использования UpdateProgress: использование одного элемента UpdateProgress для индикации всех частичных обновлений страницы (свойство AssociatedUpdatePanelID не определено) и использование UpdateProgress для конкретного элемента UpdatePanel (ID элемента UpdatePanel указано в свойстве AssociatedUpdatePanelID).
Элементы, отображаемые во время загрузки, объединяются в тег ProgressTemplate.
В свойстве DisplayAfter указывается время, после которого отображается содержимое ProgressTemplate (по умолчанию 500 милисекунд).
7.5 Генерация прокси-класса
После создания клиентского приложения, к нему необходимо добавить прокси-класс для доступа к Web-сервису. Прокси-класс - это класс, созданный из файла WSDL Web-службы, позволяющий клиентскому приложению вызывать методы Web-службы. Клиентскому приложению не обязательно просматривать прокси-класс или выполнять с ним какие-либо операции.
После тестирования работы Web-службы, мы можем добавить ссылку на нее в клиентское приложение, т.е. создать прокси-класс.
Существуют два способа создания прокси-класса в .NET -воспользоваться утилитой командной строки wsdl.ехе или воспользоваться предлагаемой Visual Studio возможностью для добавления Web-ссылок.
Оба эти подхода, по сути, дают один и тот же результат, поскольку они предполагают использование одних и тех же классов в .NET Framework для выполнения фактической работы. Отличием подхода, предполагающего использование утилиты wsdl.exe, от подхода, предполагающего использование функции для добавления Web-ссылок в приложение ASP.NET, является то, что в случае применения встроенного инструментария Visual Studio для добавления Web-ссылок увидеть фактический код прокси-класса будет невозможно (т.к. он генерируется позже, во время компиляции). Это ограничение не распространяется на клиентов других типов, например, приложений Windows Form или консольного типа. Они не используют модель компиляции ASP.NET, поэтому код прокси-класса добавляется прямо в проект.
7.6 Руководство системного программиста
7.6.1 Общие сведения о приложении
Приложение предназначено для вычисления площади четырехугольника методом Монте-Карло. Приложение состоит из двух частей (клиентской и серверной) и реализовано на языке программирования высокого уровня C#. Клиентское приложение написано с использованием технологии AJAX.
7.6.2 Системные требования
Для работы третьего приложения требуется наличие следующих программных пакетов:
* операционная система MS Windows XP(SP2)/XP(SP3)/Vista;
* информационный сервер Интернета (Internet Information Server, IIS 5.1 или выше);
* наличие виртуального каталога, содержащего непосредственно Web-сервис;
* наличие Microsoft .NET Framework версии 2.0 или выше.
7.6.3 Настройка приложения
Для обеспечения работоспособности приложения требуется выполнить установку IIS-сервера и создать виртуальный каталог, в который необходимо поместить работающее приложение.
IIS обычно входит в дистрибутивы операционных систем MS Windows 2000/XP. Он устанавливается либо в процессе установки этих операционных систем, либо позже, во время их эксплуатации (запускается команда добавления новых компонентов операционной системы).
Для того чтобы опубликовать web-сервис на сервере IIS необходимо выполнить следующую последовательность действий:
* запустить диспетчер служб Интернета (Панель управления  Администрирование  Internet Information Server);
* раскрыть список с названием компьютера в левой части окна приложения;
* на пункте "Web - узел по умолчанию" щелкнуть правой кнопкой мыши для вызова контекстного меню, выбрать "Создать  Виртуальный каталог";
* следуя подсказкам мастера создать виртуальный каталог (устанавливаем имя, по которому будет осуществляться доступ в сети к виртуальному каталогу, и местонахождение на диске фактического каталога).
Имя для виртуального каталога лучше выбирать осмысленно. В качестве имени рекомендуется ввести Service.
Клиентское приложение дополнительной настройки не требует.
7.7 Руководство программиста
7.7.1 Структура приложения
Данное приложение состоит из двух частей (клиентской и серверной). В клиентской части реализован интерфейс WebForm. Серверным приложением является Web-служба XML.
В состав проекта клиентского приложения ASP.NET (WebForm) входят следующие файлы:
* Default.aspx - является точкой входа в программу;
* Default.aspx.cs - содержит обработчики событий, вызываемые пользователем действиями на клиентском приложении;
* Service.disco - содержит ссылки и адреса на механизмы, используемые для доступа к web-сервису;
* Service.wsdl - описание web-сервиса;
Проект Web-сервиса содержит следующие файлы:
* Service.asmx - точка входа в web-сервис;
* Service.cs - содержит реализацию web-сервиса;
* web.config - содержит настройки web-сервиса.
7.7.2 Назначение и условия применения приложения
Приложение предназначено для вычисления площади четырехугольника методом Монте-Карло. Приложение состоит из двух частей (клиентской и серверной) и реализовано на языке программирования высокого уровня C#.
Для запуска программы необходимо запустить браузер, ввести в адресную строку "http://localhost/П3/" (без кавычек).
7.7.3 Общие сведения о приложении
В проекты включены следующие пространства имен.
System - основное пространство имен, содержит фундаментальные и базовые классы, которые определяют распространенные типы значений и ссылочные типы данных, события и обработчики событий, интерфейсы, атрибуты и исключения обработки. Также содержит классы, обеспечивающие поддержку преобразования типов данных, операций с параметрами методов, математических операций, удаленного и локального вызова программ, управления средой приложений и контроля управляемых и неуправляемых приложений;
System.Web - пространство имен, осуществляет поддержку классов и интерфейсов, которые обеспечивают взаимодействие между Web-обозревателем и сервером. Данное пространство имен включает класс HttpRequest, предоставляющий развернутые сведения о текущем HTTP-запросе, класс HttpResponse, управляющий HTTP-выводом данных для клиента, и класс HttpServerUtility, с помощью которого можно получить доступ к серверным служебным программам и процессам. Также пространство имен System.Web содержит классы для работы с файлами Cookie, передачи файлов, получения сведений об исключениях и управления кэшем вывода;
System.Web.Services - пространство имен содержит классы, позволяющие создавать Web-службы XML с помощью ASP.NET и клиентов Web-служб XML. Web-службы XML представляют собой приложения, обеспечивающие возможность обмена сообщениями в слабосвязанной среде с помощью стандартных протоколов, таких как HTTP, XML, XSD, SOAP и WSDL. Web-службы XML делают возможным создание в неоднородной внутрифирменной или межфирменной среде модульных приложений, совместимых с широким диапазоном реализаций, платформ и устройств. Сообщения XML на базе протокола SOAP, используемые этими приложениями, могут содержать четко определенные (структурированные или типизированные) или свободно определенные с помощью произвольного содержимого XML части. Способность этих сообщений к дальнейшему развитию без нарушения протокола является основой гибкости и надежности Web-служб XML как структурного элемента будущей Web-сети.
7.8 Руководство пользователя
Приложение предназначено для вычисления площади четырехугольника методом Монте-Карло.
Для успешной работы программы необходимо иметь компьютер, удовлетворяющий системным требованиям, приведенным в пункте 6.5.2. Наличие опубликованных на сервере IIS и корректно работающих Web-сервиса и клиентского приложения.
Для работы с приложением необходимо открыть клиентскую страницу в браузере, ввести координаты и нажать кнопку "вычислить".
Также можно выполнить несколько расчетов сразу при помощи кнопки "начать сессию".
В случае если пользователь ввел некорректные координаты, ему будет показано сообщение об ошибке и о причинах ее возникновения. Чтобы устранить данную ошибку необходимо ввести корректное значение координат.
7.9 Результаты работы приложения
Результаты работы приложения представлены на рис. 27.
Рис. 27. Результат работы клиентского приложения на базе ASP.NET
8 Анализ вычислительной эффективности приложений
Исследование вычислительной сложности алгоритма производится путем определения зависимости времени вычисления площади четырехугольника от количества генерируемых точек для метода Монте-Карло. В результате выполнения данной курсовой работы были разработаны три приложения (настольное приложение, приложения на базе ASP и на базе ASP.NET), которые выполняют одну и ту же задачу (вычисление площади четырехугольника методом Монте-Карло).
Характеристики ЭВМ, на которой проводились исследования:
* операционная система - Windows XP Professional 32-bit;
* процессор - AMD Athlon 3000+;
* оперативная память - 1 GB.
Для сравнения вычислительной эффективности этих приложений были использованы одинаковые входные данные (координаты вершин четырехугольника, площадь которого находилась, и количество генерируемых точек для метода Монте-Карло). В каждом приложении выдавалось время вычислений в каждом опыте. Результаты представлены в таблице.
Таблица. Сравнение вычислительной эффективности приложений
Количество точекВремя выполнения приложения, мсКонсольное приложениеПриложение на базе ASPПриложение на базе ASP.NET1000090100000540100000167301510000001258020219100000001172793501359 Из таблицы видно, что Web-приложение на базе ASP.NET и настольное приложение имеют приблизительно одинаковый результат по времени (консольное приложение работает немного быстрее из-за выставления в настройках конфигурации опции Release). Самым медленным по времени выполнения является Web-приложение на базе ASP (на JScript). Это связано с тем, что при выполнении данного приложения оно не компилируется, а интерпретируется, обрабатывая исходный код построчно.
Приложение с использованием AJAX не указано в таблице, поскольку его быстродействие не отличается от быстродействия приложения на базе ASP.NET, поскольку сервис обоих приложений не различается. Отличие в быстродействии может наблюдаться с клиентской стороны из-за отсутствия необходимости обновлять страницу целиком, но в цели данной курсовой работы подсчет этого времени не входит.
Заключение
В ходе работы были разработаны настольное приложение, приложение на базе технологии ASP и приложение на базе технологии ASP.NET , решающие одну и ту же задачу приближенного вычисления площади четырехугольника методом Монте-Карло. По полученным результатам была исследована вычислительная эффективность различных технологий программирования.
В результате выполнении данной курсовой работы были закреплены знания по курсу "Технологии программирования" и приобретены навыки клиент-серверной реализации прикладной задачи (задачи вычисления площади геометрической фигуры методом Монте-Карло) в виде Web приложения с использованием Web сервера IIS и Web сервисов XML, технологий ASP, ASP.NET и AJAX, языков C#, JScript, а также различных инструментальных систем и библиотек, автоматизирующих проектирование и программирование создаваемого приложения.
Список литературы
1. Г. Шилдт П. Полный справочник по C#. - ООО "И.Д. Вильямс", 2007г. - 752с.
2. Мак-Дональд М., Шпушта М. Microsoft ASP.NET 2.0 с примерами на C# 2005 для профессионалов. - М.: ООО "И.Д. Вильямс", 2006. - 1408с.
3. Троелсен Э. Язык программирования С# и платформа .NET 2.0 М.: Вильямс, 2007. -1167с
4. Матикашвили Т.И., Методические указания. ЕСПД. - ТулГУ, 2007г.
5. ГОСТ 19.106 - 78 ЕСПД. Требования к программным документам, выполненным печатным способом.
6. ГОСТ 19.401 - 78 ЕСПД. Текст программы. Требования к содержанию и оформлению.
7. ГОСТ 19.402 - 78 ЕСПД. Описание программы. 8. ГОСТ 19.404 - 79 ЕСПД. Пояснительная записка. Требования к содержанию и оформлению.
9. ГОСТ 19.701 - 90 (ИСО 5807-85). ЕСПД. Схемы алгоритмов, программ, данных и систем.
Приложение 1. Листинг консольного приложения
Файл Program.cs
// Программа вычисления площади трапеции методом Монте-Карло. Приятного просмотра!
using System;
using System.Collections.Generic;
using System.Text;
using System.Timers;
namespace Program_1
{
class Result
{
public double S_tr, S_tr1, S_tr2, S_tr3, S_tr4, S_tr5;
public int time1, time2, time3, time4, time5;
public double imprecision1, imprecision2, imprecision3, imprecision4, imprecision5;
public double M1, M2, M3, M4, M5;
public int counting_counter;
public Result()
{
counting_counter = 0;
S_tr = 0;
S_tr1 = 0;
S_tr2 = 0;
S_tr3 = 0;
S_tr4 = 0;
S_tr5 = 0;
time1 = 0;
time2 = 0;
time3 = 0;
time4 = 0;
time5 = 0;
imprecision1 = 0;
imprecision2 = 0;
imprecision3 = 0;
imprecision4 = 0;
imprecision5 = 0;
M1 = 0;
M2 = 0;
M3 = 0;
M4 = 0;
M5 = 0;
}
}
class MyPoint
{
public double X;//координаты
public double Y;
//конструктор по умолчанию
public MyPoint()
{
X = 0;
Y = 0;
}
//конструктор с двумя аргументами
public MyPoint(int x, int y)
{
this.X = X;
this.Y = Y;
}
//переопределение метода ToString
public override string ToString()
{
return (String.Format("({0},{1})", X, Y));
}
public MyPoint EnterPoint(MyPoint point)
{
point.X = EnterX(point.X);
point.Y = EnterY(point.Y);
return point;
}
private double EnterX(double X)
{
Console.Write("\t\t\t\t x = ");
try
{
X = double.Parse(Console.ReadLine());
}
catch
{
Console.Write("\tВам не удалось ввести координату, попробуйте ещё раз:\n");
EnterX(X);
}
return X;
}
private double EnterY(double Y)
{
Console.Write("\t\t\t\t y = ");
try
{
Y = double.Parse(Console.ReadLine());
}
catch
{
Console.Write("\tВам не удалось ввести координату, попробуйте ещё раз:\n");
EnterY(Y);
}
return Y;
}
}
class MyRectangle : MyPoint
{
public MyPoint b = new MyPoint();
public MyPoint c = new MyPoint();
public MyPoint d = new MyPoint();
public MyPoint e = new MyPoint();
//конструктор по умолчанию
public MyRectangle()
{
b.X = 0;
b.Y = 0;
c.X = 0;
c.Y = 0;
d.X = 0;
d.Y = 0;
e.X = 0;
e.Y = 0;
}
//конструктор с заданными аргументами
public MyRectangle(MyPoint b, MyPoint c, MyPoint d, MyPoint e)
{
this.b.X = b.X;
this.b.Y = b.Y;
this.c.X = c.X;
this.c.Y = c.Y;
this.d.X = d.X;
this.d.Y = d.Y;
this.e.X = e.X;
this.e.Y = e.Y;
}
public double ReturnHeight()
{
return this.b.Y - this.d.Y;
}
}
class Program
{
static Result res = new Result();
static double S_pr; //площадь прямоугольника
static double length;//длина и высота прямоугольника
static double height;
static int choice = 0;//переменная выбора в меню
static int Time; //время расчета
static double x1;//прилежащие катеты
static double x2;
static double x3;
static MyRectangle MyRec = new MyRectangle();
static void Main(string[] args)
{
Console.Write("Добро пожаловать в программу подсчета площади\n");
Console.Write("заданной фигуры методом Монте-Карло\n");
Console.Write("Меню:\n");
do
{
// собственно меню
Console.Write("0 - выход;\n");
Console.Write("1 - быстрый расчет;\n");
Console.Write("2 - расчет с параметрами, вводимыми с клавиатуры;\n");
Console.Write("3 - расчет со стандартными параметрами, e.X < b.X;\n");
Console.Write("4 - расчет со стандартными параметрами, e.X = b.X;\n");
Console.Write("5 - расчет со стандартными параметрами, e.X > b.X;\n");
Console.Write("6 - информация;\n");
Console.Write("7 - перерасчет с текущими значениями;\n");
Console.Write("Ваш выбор:\n");
try { choice = int.Parse(Console.ReadLine()); }
catch
{
Console.Write("Вам необходимо сделать выбор!\n\n");
choice = 100500;
continue;
}
switch (choice)
{
case 0: break;//выход
case 1: //расчёт со стандартными параметрами
MyRec.b.X = 500;
MyRec.b.Y = 500;
MyRec.c.X = 800;
MyRec.c.Y = 500;
MyRec.d.X = 1000;
MyRec.d.Y = 0;
MyRec.e.X = 0;
MyRec.e.Y = 0;
TableBuild();
break;
case 2: //расчёт с вводом с клавиатуры
EnterPoints();
TableBuild();
break;
case 3: //вывод графиков
Console.Write("┌─────────────────────────────────────────────────────────┐\n");
Console.Write("│ ▲ y │\n");
Console.Write("│ │ b c │\n");
Console.Write("│ │ ┌─────────o───────────────o─────────┐ │\n");
Console.Write("│ │ │ ((((((((()))))))) │ │\n");
Console.Write("│ │ │ (((((((((())))))))) │ │\n");
Console.Write("│ │ │ ((((((((((()))))))))) │ │\n");
Console.Write("│ │ │ (((((((((((())))))))))) │ │\n");
Console.Write("│ │ │ ((((((((((((()))))))))))) │ │\n");
Console.Write("│ │ │ (((((((((((((())))))))))))) │ │\n");
Console.Write("│ │ │ ((((((((((((((()))))))))))))) │ │\n");
Console.Write("│ │ │ (((((((((((((((())))))))))))))) │ │\n");
Console.Write("│ │ │ ((((((((((((((((()))))))))))))))) │ │\n");
Console.Write("│ │ │(((((((((((((((((()))))))))))))))))│ x │\n");
Console.Write("│ ┼─────o───────────────────────────────────o────────► │\n");
Console.Write("│ 0 e d │\n");
Console.Write("└─────────────────────────────────────────────────────────┘\n");
MyRec.b.X = 500;
MyRec.b.Y = 500;
MyRec.c.X = 800;
MyRec.c.Y = 500;
MyRec.d.X = 1000;
MyRec.d.Y = 0;
MyRec.e.X = 0;
MyRec.e.Y = 0;
TableBuild();
break;
case 4:
Console.Write("┌─────────────────────────────────────────────────────────┐\n");
Console.Write("│ ▲ y │\n");
Console.Write("│ │ b c │\n");
Console.Write("│ │ o─────────────────────────o─────────┐ │\n");
Console.Write("│ │ │(((((((((((((((((()))))))) │ │\n");
Console.Write("│ │ │(((((((((((((((((())))))))) │ │\n");
Console.Write("│ │ │(((((((((((((((((()))))))))) │ │\n");
Console.Write("│ │ │(((((((((((((((((())))))))))) │ │\n");
Console.Write("│ │ │(((((((((((((((((()))))))))))) │ │\n");
Console.Write("│ │ │(((((((((((((((((())))))))))))) │ │\n");
Console.Write("│ │ │(((((((((((((((((()))))))))))))) │ │\n");
Console.Write("│ │ │(((((((((((((((((())))))))))))))) │ │\n");
Console.Write("│ │ │(((((((((((((((((()))))))))))))))) │ │\n");
Console.Write("│ │ │(((((((((((((((((()))))))))))))))))│ x │\n");
Console.Write("│ ┼─────o───────────────────────────────────o────────► │\n");
Console.Write("│ 0 e d │\n");
Console.Write("└─────────────────────────────────────────────────────────┘\n");
MyRec.b.X = 500;
MyRec.b.Y = 500;
MyRec.c.X = 800;
MyRec.c.Y = 500;
MyRec.d.X = 1000;
MyRec.d.Y = 0;
MyRec.e.X = 500;
MyRec.e.Y = 0;
TableBuild();
break;
case 5:
Console.Write("┌─────────────────────────────────────────────────────────┐\n");
Console.Write("│ ▲ y │\n");
Console.Write("│ │ b c │\n");
Console.Write("│ │ o─────────────────────────o─────────┐ │\n");
Console.Write("│ │ │(((((((((((((((((()))))))) │ │\n");
Console.Write("│ │ │ (((((((((((((((())))))))) │ │\n");
Console.Write("│ │ │ (((((((((((((()))))))))) │ │\n");
Console.Write("│ │ │ ((((((((((())))))))))) │ │\n");
Console.Write("│ │ │ (((((((()))))))))))) │ │\n");
Console.Write("│ │ │ ((((())))))))))))) │ │\n");
Console.Write("│ │ │ (()))))))))))))) │ │\n");
Console.Write("│ │ │ )))))))))))))) │ │\n");
Console.Write("│ │ │ )))))))))))) │ │\n");
Console.Write("│ │ │ ))))))))))│ x │\n");
Console.Write("│ ┼─────┴───────────────────────────o───────o────────► │\n");
Console.Write("│ 0 e d │\n");
Console.Write("└─────────────────────────────────────────────────────────┘\n");
MyRec.b.X = 500;
MyRec.b.Y = 500;
MyRec.c.X = 800;
MyRec.c.Y = 500;
MyRec.d.X = 1000;
MyRec.d.Y = 0;
MyRec.e.X = 900;
MyRec.e.Y = 0;
TableBuild();
break;
case 6:
Console.Write(" Программа подсчитывает площадь трапеции BCDE методом Монте-Карло\n");
Console.Write("В качестве входных данных используются координаты четырех точек\n");
Console.Write("Для подсчета площади используйте стандартные значения или вводите\n");
Console.Write("данные с клавиатуры, но обратите внимание на условия. Также вы\n");
Console.Write("можете отобразить на экране рисунок, показывающий трапецию и опи-\n");
Console.Write("сывающий её прямоугольник.\n");
Console.Write(" Выполнил: студент группы 220272 Чуев Александр.\n");
break;
case 7:
if (res.imprecision1 == 100500)
{
Console.Write("Текущих значений нет, сначала введите их с клавиатуры;\n");
break;
}
TableBuild();
break;
default: break;
}
} while (choice != 0);
}
static void EnterPoints()
{
//ввод В
Console.Write("Введите координаты b.x и b.y точки b:\n");
do
{
MyRec.b = MyRec.EnterPoint(MyRec.b);
if (MyRec.b.X <= 0 || MyRec.b.Y <= 0)
{
Console.WriteLine("С такими координатами не построишь нужную трапецию,");
Console.WriteLine("пожалуйста, попробуйте ещё раз:");
continue;
}
break;
} while (true);
//ввод С
Console.Write("Введите координаты с.x и с.y точки с, c.x>b.x, c.y=b.y:\n");
do
{
MyRec.c = MyRec.EnterPoint(MyRec.c);
if (MyRec.c.X <= MyRec.b.X || MyRec.c.Y != MyRec.b.Y)
{
Console.WriteLine("С такими координатами не построишь нужную трапецию,");
Console.WriteLine("пожалуйста, попробуйте ещё раз:");
continue;
}
break;
} while (true);
//ввод D
Console.Write("Введите координаты d.x и d.y точки d, d.x>c.x, d.y<c.y:\n");
do
{
MyRec.d = MyRec.EnterPoint(MyRec.d);
if (MyRec.d.X <= MyRec.c.X || MyRec.d.Y >= MyRec.c.Y)
{
Console.WriteLine("С такими координатами не построишь нужную трапецию,");
Console.WriteLine("пожалуйста, попробуйте ещё раз:");
continue;
}
break;
} while (true);
//ввод Е
Console.Write("Введите координаты e.x и e.y точки e, e.x<d.x, e.y=d.y:\n");
do
{
MyRec.e = MyRec.EnterPoint(MyRec.e);
if (MyRec.e.X >= MyRec.d.X || MyRec.e.Y != MyRec.d.Y)
{
Console.WriteLine("С такими координатами не построишь нужную трапецию,");
Console.WriteLine("пожалуйста, попробуйте ещё раз:");
continue;
}
break;
} while (true);
}
static void TableBuild()
{
x1 = MyRec.b.X - MyRec.e.X;//расчёт промежуточных значений из полученных координат
x2 = MyRec.d.X - MyRec.c.X;
x3 = MyRec.e.X - MyRec.b.X;
height = MyRec.ReturnHeight();
//различные способы подсчёта в зависивости от положения точки Е
if (MyRec.e.X < MyRec.b.X)
{
x3 = 1; //присваивание переменной единичного значения для предотвращения деления на ноль
length = MyRec.d.X - MyRec.e.X;
//расчёт площадей через длины сторон
res.S_tr = (0.5 * (height) * ((MyRec.c.X - MyRec.b.X) + (length)));//S = 1/2 * H * (BC + DE)
S_pr = (length) * (height); //S = AB * CD
}
else if (MyRec.e.X == MyRec.b.X)
{
x1 = 1;//присваивание переменным единичного значения для предотвращения деления на ноль
x3 = 1;
length = MyRec.d.X - MyRec.e.X;
//расчёт площадей через длины сторон
res.S_tr = 0.5 * height * (MyRec.c.X - MyRec.b.X + length);//S = 1/2 * H * (BC + DE)
S_pr = length * height; //S = AB * CD
}
else
{
x1 = 1;//присваивание переменной единичного значения для предотвращения деления на ноль
length = MyRec.d.X - MyRec.b.X;
//расчёт площадей через длины сторон
res.S_tr = 0.5 * height * (length - MyRec.e.X + MyRec.c.X);//S = 1/2 * H * (BC + DE)
S_pr = length * height; //S = AB * CD }
//расчёт площадей методом Монте-Карло
res.M1 = Gogogo(1000);
res.S_tr1 = S_pr * res.M1 / 1000;
res.imprecision1 = Math.Abs((res.S_tr1 - res.S_tr) / res.S_tr) * 100;
res.time1 = Time;
res.M2 = Gogogo(10000);
res.S_tr2 = S_pr * res.M2 / 10000;
res.imprecision2 = Math.Abs((res.S_tr2 - res.S_tr) / res.S_tr) * 100;
res.time2 = Time;
res.M3 = Gogogo(100000);
res.S_tr3 = S_pr * res.M3 / 100000;
res.imprecision3 = Math.Abs((res.S_tr3 - res.S_tr) / res.S_tr) * 100;
res.time3 = Time;
res.M4 = Gogogo(1000000);
res.S_tr4 = S_pr * res.M4 / 1000000;
res.imprecision4 = Math.Abs((res.S_tr4 - res.S_tr) / res.S_tr) * 100;
res.time4 = Time;
res.M5 = Gogogo(10000000);
res.S_tr5 = S_pr * res.M5 / 10000000;
res.imprecision5 = Math.Abs((res.S_tr5 - res.S_tr) / res.S_tr) * 100;
res.time5 = Time;
//вывод таблицы
Console.WriteLine("B = ({0},{1})", MyRec.b.X, MyRec.b.Y);
Console.WriteLine("C = ({0},{1})", MyRec.c.X, MyRec.c.Y);
Console.WriteLine("D = ({0},{1})", MyRec.d.X, MyRec.d.Y);
Console.WriteLine("E = ({0},{1})", MyRec.e.X, MyRec.e.Y);
Console.WriteLine("┌─┬────────┬──────────┬─────────────────┬───────────────┬──────────────────┐");
Console.WriteLine("│№│N точек │N попавших│ Площадь трапеции│ Погрешность,% │ Время расчёта,ms │");
Console.WriteLine("├─┼────────┼──────────┼─────────────────┼───────────────┼──────────────────┤");
Console.WriteLine("│1│ 1000│{0} │\t{1}\t │ \t{2}\t│\t{3}\t │", res.M1, (int)res.S_tr1, Math.Round(res.imprecision1, 4), res.time1);
Console.WriteLine("├─┼────────┼──────────┼─────────────────┼───────────────┼──────────────────┤");
Console.WriteLine("│2│ 10000│{0} │\t{1}\t │ \t{2}\t│\t{3}\t │", res.M2, (int)res.S_tr2, Math.Round(res.imprecision2, 4), res.time2);
Console.WriteLine("├─┼────────┼──────────┼─────────────────┼───────────────┼──────────────────┤");
Console.WriteLine("│3│ 100000│{0} │\t{1}\t │ \t{2}\t│\t{3}\t │", res.M3, (int)res.S_tr3, Math.Round(res.imprecision3, 4), res.time3);
Console.WriteLine("├─┼────────┼──────────┼─────────────────┼───────────────┼──────────────────┤");
Console.WriteLine("│4│ 1000000│{0} │\t{1}\t │ \t{2}\t│\t{3}\t │", res.M4, (int)res.S_tr4, Math.Round(res.imprecision4, 4), res.time4);
Console.WriteLine("├─┼────────┼──────────┼─────────────────┼───────────────┼──────────────────┤");
Console.WriteLine("│5│10000000│{0} │\t{1}\t │ \t{2}\t│\t{3}\t │", res.M5, (int)res.S_tr5, Math.Round(res.imprecision5, 4), res.time5);
Console.WriteLine("└─┴────────┴──────────┴─────────────────┴───────────────┴──────────────────┘");
Console.WriteLine("Площадь трапеции bcde = {0}", res.S_tr);
}
//функция, возвращающая количество попавших в трапецию точек
static double Gogogo(double N)
{
double M = 0; //количество "попавших" точек
double tana = height / x1;//расчет тангенсов углов
double tanb = height / x2;
double tang = height / x3;
MyPoint RandomPoint = new MyPoint();//"случайная" точка
Random Randomator = new Random();
DateTime StartTime, EndTime;//время
StartTime = DateTime.Now;
if (MyRec.e.X < MyRec.b.X)//проверка положения точки Е
{
for (int i = 0; i < N; i++)
{
RandomPoint.X = MyRec.e.X + (Randomator.NextDouble() * length);//получение координат "случайной" точки
RandomPoint.Y = MyRec.d.Y + (Randomator.NextDouble() * height);
//проверка на попадание точки в трапецию методом сравнения стандартных углов
//с углами между нижним основанием и линией к "случайной" точке из точек E и D
if ((((RandomPoint.Y - MyRec.e.Y) / (RandomPoint.X - MyRec.e.X)) <= tana) &&
(((RandomPoint.Y - MyRec.e.Y) / (MyRec.d.X - RandomPoint.X)) <= tanb))
M++;
}
}
else if (MyRec.e.X == MyRec.b.X)
{
for (int i = 0; i < N; i++)
{
RandomPoint.X = MyRec.e.X + (Randomator.NextDouble() * length);//получение координат "случайной" точки
RandomPoint.Y = MyRec.d.Y + (Randomator.NextDouble() * height);
//проверка на попадание точки в трапецию методом сравнения стандартного угла
//с углом между нижним основанием и линией к "случайной" точке из точки D
if ((((RandomPoint.Y - MyRec.e.Y) / (MyRec.d.X - RandomPoint.X)) <= tanb))
M++;
}
}
else
{
for (int i = 0; i < N; i++)
{
RandomPoint.X = MyRec.b.X + (Randomator.NextDouble() * length);//получение координат "случайной" точки
RandomPoint.Y = MyRec.d.Y + (Randomator.NextDouble() * height);
//проверка на попадание точки в трапецию методом сравнения стандартных углов
//с углами между верхним и нижним основанием и линией к "случайной" точке из точек
//B и D соотвеетственно
if ((((MyRec.b.Y - RandomPoint.Y) / (RandomPoint.X - MyRec.b.X)) <= tang) &&
(((RandomPoint.Y - MyRec.e.Y) / (MyRec.d.X - RandomPoint.X)) <= tanb))
M++;
}
}
EndTime = DateTime.Now;
//подсчёт затраченного времени
Time = (EndTime.Minute - StartTime.Minute) * 60000 + (EndTime.Second - StartTime.Second)
* 1000 + (EndTime.Millisecond - StartTime.Millisecond);
return (double)M;
}
}
}
Приложение 2. Листинг приложения на базе ASP
Файл startpage.html
<html>
<script language="JavaScript">
<!--
function check_correctness()
{/*document.Form.dx.value <= document.Form.cx.value || эт пиздец*/
if (document.Form.bx.value <= document.Form.zero.value || document.Form.by.value <= document.Form.zero.value || document.Form.cx.value <= document.Form.bx.value || document.Form.cy.value != document.Form.by.value ||
document.Form.dy.value >= document.Form.cy.value || document.Form.ex.value >= document.Form.dx.value || document.Form.ey.value != document.Form.dy.value)
{
alert ('Координаты введены неверно, внимательнее смотрите на рисунок.');
return;
}
else
document.Form.submit();
}
function BtoC()
{
document.Form.cy.value = document.Form.by.value;
}
function CtoB()
{
document.Form.by.value = document.Form.cy.value;
}
function DtoE()
{
document.Form.ey.value = document.Form.dy.value;
}
function EtoD()
{
document.Form.dy.value = document.Form.ey.value;
}
--></script>
<head>
<title>Вычисление площади трапеции методом Монте-Карло</title>
</head>
<body style="text-align: left">
<form action="results.asp" name ="Form" method="POST">
<input name="zero" type="hidden" value="0">
<center><strong>
<h2>Вычисление площади трапеции методом Монте-Карло</h2>
<table width="689" border="0">
<tr>
<th width="458" height="279" scope="col"><img src="img_3.gif" alt="" width="302" height="165"></th>
<th width="221" scope="col"><p>Введите координаты:</p>
<table width="134" border="0" align="center">
<tr>
<th width="12" scope="col"> </th>
<th width="50" scope="col">x</th>
<th width="50" scope="col">y</th>
</tr>
<tr>
<th scope="row">B: </th>
<td><div align="center">
<input name="bx" type="edit" style="width: 50px; vertical-align: middle; text-align: center;" value="500">
</div></td>
<td><div align="center">
<input name="by" type="edit" style="width: 50px; vertical-align: middle; text-align: center;" value="500" onchange="BtoC();">
</div></td>
</tr>
<tr>
<th scope="row">C: </th>
<td><div align="center">
<input name="cx" type="edit" style="width: 50px; vertical-align: middle; text-align: center;" value="800" onchange="">
</div></td>
<td><div align="center">
<input name="cy" type="edit" style="width: 50px; vertical-align: middle; text-align: center;" value="500" onchange="CtoB();">
</div></td>
</tr>
<tr>
<th scope="row">D: </th>
<td><div align="center"><strong><span style="font-size: 16pt">
<input name="dx" type="edit" style="width: 50px; vertical-align: middle; text-align: center;" value="1000">
</span></strong></div></td>
<td><div align="center"><strong><span style="font-size: 16pt">
<input name="dy" type="edit" style="width: 50px; vertical-align: middle; text-align: center;" value="0" onchange="DtoE();">
</span></strong></div></td>
</tr>
<tr>
<th scope="row">E: </th>
<td><div align="center">
<input name="ex" type="edit" style="width: 50px; vertical-align: middle; text-align: center;" value="0">
</div></td>
<td><div align="center">
<input name="ey" type="edit" style="width: 50px; vertical-align: middle; text-align: center;" value="0" onchange="EtoD();">
</div></td>
</tr>
</table> <p><input name="run" style="width: 118px" type="button" onclick="check_correctness();" value="Вычислить"></p>
</th>
</tr>
</table>
</center></strong>
</form>
</body>
</html>
Файл results.asp
<%@ LANGUAGE = "JScript"%>
<%Response.Expires=0
Server.ScriptTimeout = 5000
var b_X, b_Y, c_X, c_Y, d_X, d_Y, e_X, e_Y, S_pr, S_tr, M, length, N, tana, tanb, tang, i;
var timer, Str, imprecision, time, StartTime, StopTime, height, RandomPoint_X, RandomPoint_Y;
if(Request.Form("bx").Count != 0)
{
b_X=Request.Form("bx")(1);
Response.Cookies("sessbx")=b_X;
}
else
b_X=Request.Cookies("sessbx");
if(Request.Form("by").Count != 0)
{
b_Y=Request.Form("by")(1);
Response.Cookies("sessby")=b_Y;
}
else
b_Y=Request.Cookies("sessby");
if(Request.Form("cx").Count != 0)
{
c_X=Request.Form("cx")(1);
Response.Cookies("sesscx")=c_X;
}
else
c_X=Request.Cookies("sesscx");
if(Request.Form("cy").Count != 0)
{
c_Y=Request.Form("cy")(1);
Response.Cookies("sesscy")=c_Y;
}
else
c_Y=Request.Cookies("sesscy");
if(Request.Form("dx").Count != 0)
{
d_X=Request.Form("dx")(1);
Response.Cookies("sessdx")=d_X;
}
else
d_X=Request.Cookies("sessdx");
if(Request.Form("dy").Count != 0)
{
d_Y=Request.Form("dy")(1);
Response.Cookies("sessdy")=d_Y;
}
else
d_Y=Request.Cookies("sessdy");
if(Request.Form("ex").Count != 0)
{
e_X=Request.Form("ex")(1);
Response.Cookies("sessex")=e_X;
}
else
e_X=Request.Cookies("sessex");
if(Request.Form("ey").Count != 0)
{
e_Y=Request.Form("ey")(1);
Response.Cookies("sessey")=e_Y;
}
else
e_Y=Request.Cookies("sessey");
height = b_Y - d_Y;
tana = height / (b_X - e_X);
tanb = height / (d_X - c_X);
tanc = height / (e_X - b_X);
if(e_X < b_X)
{
x3 = 1;
length = d_X - e_X;
S_tr = 0.5 * height * (c_X - b_X + length);
S_pr = length * height;
}
else if(e_X == b_X)
{
x1 = 1;
x3 = 1; length = d_X - e_X;
S_tr = 0.5 * height * (c_X - b_X + length);
S_pr = length * height;
}
else
{
x1 = 1; length = d_X - b_X;
S_tr = 0.5 * height * (c_X - e_X + length);
S_pr = length * height;
}
%>
<html><head>
<title>Таблица результатов</title>
</head>
<body>
<div align="center">
<h3>Площадь трапеции = <%=S_tr%></h3>
</div>
<table width="581" border="1" align="center">
<tr>
<th width="102" scope="col">Кол-во точек</th>
<th width="102" scope="col">Точек попало</th>
<th width="169" scope="col"><strong>Площадь трапеции методом Монте-Карло</strong></th>
<th width="133" scope="col">Погрешность<strong>, % </strong></th>
<th width="149" scope="col">Время расчета<strong>, ms </strong></th>
<%
for(N = 1000; N <= 1000000; N *= 10)
{
%>
</tr>
<tr> <th scope="row"><div align="right"><%=N%></div></th> <%
timer = new Date();
StartTime = timer.getTime();
if(e_X < b_X)
{
for (i = 0, M = 0; i < N; i++)
{
RandomPoint_X = e_X + Math.random() * length;
RandomPoint_Y = d_Y + Math.random() * height;
if ((RandomPoint_Y - e_Y)/(RandomPoint_X - e_X) <= tana &&
(RandomPoint_Y - e_Y)/(d_X - RandomPoint_X) <= tanb)
M++;
}
}
else if(e_X == b_X)
{
for (i = 0; i < N; i++)
{
RandomPoint_X = Number(e_X) + Math.random() * length;
RandomPoint_Y = Number(d_Y) + Math.random() * height;
if ((RandomPoint_Y - e_Y)/(d_X - RandomPoint_X) <= tanb)
M++;
}
}
else
{
for (i = 0; i < N; i++)
{
RandomPoint_X = Number(b_X) + Math.random() * length;
RandomPoint_Y = Number(d_Y) + Math.random() * height;
if ((b_Y - RandomPoint_Y)/(RandomPoint_X - b_X) <= tang &&
(RandomPoint_Y - e_Y)/(d_X - RandomPoint_X) <= tanb)
M++;
}
}
timer = new Date();
StopTime = timer.getTime(); Str = (S_pr * M/N).toFixed(2);
imprecision = (Math.abs((Str - S_tr) / S_tr) * 100).toFixed(4);
time = StopTime-StartTime;
%>
<td><div align="right"><%=M%></div></td>
<td><div align="right"><%=Str%></div></td>
<td><div align="right"><%=imprecision%></div></td>
<td><div align="right"><%=time%></div></td>
<%
}
%>
</tr>
</table>
<table align="center">
<tr>
<td><form name="form_back_to_the_fufure" action="startpage.html">
<table border="0" width="100" cellpadding="2">
<tr>
<td width="1" align="left"><input type="submit" value="<< Назад" name="button_back_to_the_fufure"></td>
</tr>
</table>
</form>
</td>
<td><form name="form_i_wanna_replay" action="results.asp" method="POST">
<table border="0" width="102" cellpadding="2">
<tr>
<td width="1" align="left"><input type="submit" value="Пересчитать" name="button_i_wanna_replay"></td>
</tr>
</table>
</form>
</td>
</tr>
</table>
</body>
</html>
Приложение 3. Листинг Web-сервиса
Файл Service.asmx
<%@ WebService Language="C#" CodeBehind="~/App_Code/Service.cs" Class="Service" %>
Файл Service.cs
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService
{
public struct Result
{
public double S_tr, S_tr1, S_tr2, S_tr3, S_tr4, S_tr5;
public int time1, time2, time3, time4, time5;
public double imprecision1, imprecision2, imprecision3, imprecision4, imprecision5;
public double M1, M2, M3, M4, M5;
}
public struct Point
{
public double X, Y;
}
public int Time; //время расчета
public double length, height;//длина и высота прямоугольника
public double x1, x2, x3;//прилежащие катеты
public Point b = new Point();//координаты трапеции public Point c = new Point();
public Point d = new Point();
public Point e = new Point();
public Result S = new Result();
public Service()
{
}
[WebMethod]
public Result MegaFunction(Point b, Point c, Point d, Point e)
{
double S_pr; //площадь прямоугольника
double M = 0; //количество "попавших" точек
x1 = b.X - e.X;//расчёт промежуточных значений из полученных координат
x2 = d.X - c.X;
x3 = e.X - b.X;
height = b.Y - d.Y;
//различные способы подсчёта в зависивости от положения точки Е
if (e.X < b.X)
{
x3 = 1; //присваивание переменной единичного значения для предотвращения деления на ноль
length = d.X - e.X;
//расчёт площадей через длины сторон
S.S_tr = (0.5 * (height) * ((c.X - b.X) + (length)));//S = 1/2 * H * (BC + DE)
S_pr = (length) * (height); //S = AB * CD
}
else if (e.X == b.X)
{
x1 = 1;//присваивание переменным единичного значения для предотвращения деления на ноль
x3 = 1;
length = d.X - e.X;
//расчёт площадей через длины сторон
S.S_tr = 0.5 * height * (c.X - b.X + length);//S = 1/2 * H * (BC + DE)
S_pr = length * height; //S = AB * CD
}
else
{
x1 = 1;//присваивание переменной единичного значения для предотвращения деления на ноль
length = d.X - b.X;
//расчёт площадей через длины сторон
S.S_tr = 0.5 * height * (length - e.X + c.X);//S = 1/2 * H * (BC + DE)
S_pr = length * height; //S = AB * CD }
//расчёт площадей методом Монте-Карло
S.M1 = Gogogo(1000, height, x1, x2, x3, length, b, c, d, e);
S.S_tr1 = S_pr * S.M1 / 1000;
S.imprecision1 = Math.Abs((S.S_tr1 - S.S_tr) / S.S_tr) * 100;
S.time1 = Time;
S.M2 = Gogogo(10000, height, x1, x2, x3, length, b, c, d, e);
S.S_tr2 = S_pr * S.M2 / 10000;
S.imprecision2 = Math.Abs((S.S_tr2 - S.S_tr) / S.S_tr) * 100;
S.time2 = Time;
S.M3 = Gogogo(100000, height, x1, x2, x3, length, b, c, d, e);
S.S_tr3 = S_pr * S.M3 / 100000;
S.imprecision3 = Math.Abs((S.S_tr3 - S.S_tr) / S.S_tr) * 100;
S.time3 = Time;
S.M4 = Gogogo(1000000, height, x1, x2, x3, length, b, c, d, e);
S.S_tr4 = S_pr * S.M4 / 1000000;
S.imprecision4 = Math.Abs((S.S_tr4 - S.S_tr) / S.S_tr) * 100;
S.time4 = Time;
S.M5 = Gogogo(10000000, height, x1, x2, x3, length, b, c, d, e);
S.S_tr5 = S_pr * S.M5 / 10000000;
S.imprecision5 = Math.Abs((S.S_tr5 - S.S_tr) / S.S_tr) * 100;
S.time5 = Time;
return S;
}
public double Gogogo(double N, double height, double x1, double x2, double x3, double length,
Point b, Point c, Point d, Point e)
{
double M = 0; //количество "попавших" точек
double tana = height / x1;//расчет тангенсов углов
double tanb = height / x2;
double tang = height / x3;
Point RandomPoint = new Point();//"случайная" точка
Random Randomator = new Random();
DateTime StartTime, EndTime;//время
StartTime = DateTime.Now;
if (e.X < b.X)//проверка положения точки Е
{
for (int i = 0; i < N; i++)
{
RandomPoint.X = e.X + Randomator.NextDouble() * length;//получение координат "случайной" точки
RandomPoint.Y = d.Y + Randomator.NextDouble() * height;
//проверка на попадание точки в трапецию методом сравнения стандартных углов
//с углами между нижним основанием и линией к "случайной" точке из точек E и D
if ((((RandomPoint.Y - e.Y) / (RandomPoint.X - e.X)) <= tana) &&
(((RandomPoint.Y - e.Y) / (d.X - RandomPoint.X)) <= tanb))
M++;
}
}
else if (e.X == b.X)
{
for (int i = 0; i < N; i++)
{
RandomPoint.X = e.X + (Randomator.NextDouble() * length);//получение координат "случайной" точки
RandomPoint.Y = d.Y + (Randomator.NextDouble() * height);
//проверка на попадание точки в трапецию методом сравнения стандартного угла
//с углом между нижним основанием и линией к "случайной" точке из точки D
if ((((RandomPoint.Y - e.Y) / (d.X - RandomPoint.X)) <= tanb))
M++;
}
}
else
{
for (int i = 0; i < N; i++)
{
RandomPoint.X = b.X + (Randomator.NextDouble() * length);//получение координат "случайной" точки
RandomPoint.Y = d.Y + (Randomator.NextDouble() * height);
//проверка на попадание точки в трапецию методом сравнения стандартных углов
//с углами между верхним и нижним основанием и линией к "случайной" точке из точек
//B и D соотвеетственно
if ((((b.Y - RandomPoint.Y) / (RandomPoint.X - b.X)) <= tang) &&
(((RandomPoint.Y - e.Y) / (d.X - RandomPoint.X)) <= tanb))
M++;
}
}
EndTime = DateTime.Now;
//подсчёт затраченного времени
Time = (EndTime.Minute - StartTime.Minute) * 60000 + (EndTime.Second - StartTime.Second) * 1000
+ (EndTime.Millisecond - StartTime.Millisecond);
return M;
}
}
Приложение 4. Листинг Web-приложения на базе ASP.NET
Файл Default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Вычисление площади трапеции методом Монте-Карло</title>
</head>
<body style="text-align: left" runat="server">
<form name ="Form" runat="server">
<h2>Вычисление площади трапеции методом Монте-Карло</h2>
<table width="689" border="0" runat="server">
<tr>
<th width="458" height="279" scope="col"><img src="img_3.gif" alt="" width="302" height="165" runat="server"></th>
<th width="221" scope="col"><p>Введите координаты:</p>
<table width="134" border="0" align="center" runat="server">
<tr>
<th width="12" scope="col"> </th>
<th width="50" scope="col">x</th>
<th width="50" scope="col">y</th>
</tr>
<tr>
<th scope="row">B: </th>
<td><div align="center">
<asp:TextBox ID="bx" runat="server" Columns="7" MaxLength="5">500</asp:TextBox>
</div></td>
<td><div align="center">
<asp:TextBox ID="by" runat="server" Columns="7" MaxLength="5">500</asp:TextBox>
</div></td>
</tr>
<tr>
<th scope="row">C: </th>
<td><div align="center">
<asp:TextBox ID="cx" runat="server" Columns="7" MaxLength="5">800</asp:TextBox>
</div></td>
<td><div align="center">
<asp:TextBox ID="cy" runat="server" Columns="7" MaxLength="5">500</asp:TextBox>
</div></td>
</tr>
<tr>
<th scope="row">D: </th>
<td><div align="center"><strong><span style="font-size: 16pt">
<asp:TextBox ID="dx" runat="server" Columns="7" MaxLength="5">1000</asp:TextBox>
</span></strong></div></td>
<td><div align="center"><strong><span style="font-size: 16pt">
<asp:TextBox ID="dy" runat="server" Columns="7" MaxLength="5">0</asp:TextBox>
</span></strong></div></td>
</tr>
<tr>
<th scope="row">E: </th>
<td><div align="center">
<asp:TextBox ID="ex" runat="server" Columns="7" MaxLength="5">0</asp:TextBox>
</div></td>
<td><div align="center">
<asp:TextBox ID="ey" runat="server" Columns="7" MaxLength="5">0</asp:TextBox>
</div></td>
</tr>
</table> <p><asp:Button ID="ButtonCalculate" runat="server" Text="Вычислить"
onclick="ButtonCalculate_Click" /></p>
</th>
</tr>
</table>
<div align="center">
<asp:Label ID="LabelResults" runat="server"></asp:Label>
</div>
<asp:Table ID="TableResults" runat="server" CaptionAlign="Bottom" GridLines="Both" Visible="False">
<asp:TableHeaderRow BorderStyle="Double">
<asp:TableHeaderCell>Кол-во точек</asp:TableHeaderCell>
<asp:TableHeaderCell>Точек попало</asp:TableHeaderCell>
<asp:TableHeaderCell>Площадь трапеции методом Монте-Карло</asp:TableHeaderCell>
<asp:TableHeaderCell>Погрешность, %</asp:TableHeaderCell>
<asp:TableHeaderCell>Время расчета, ms</asp:TableHeaderCell>
</asp:TableHeaderRow>
</asp:Table>
<table align="center" runat="server">
<tr>
<td>
<table border="0" width="102" cellpadding="2" runat="server">
<tr>
<td width="1" align="left"><asp:Button ID="ButtonI_wanna_replay" runat="server" Text="Перерасчет"
onclick="ButtonI_wanna_replay_Click" Visible="False" /></td>
</tr>
</table>
</td>
</tr>
</table>
</form>
</body>
</html>
Файл Default.aspx.cs
using System;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using localhost;
public partial class Default : System.Web.UI.Page {
private Service proxy = new Service();
public localhost.Result S = new localhost.Result();
public localhost.Point b = new localhost.Point();
public localhost.Point c = new localhost.Point();
public localhost.Point d = new localhost.Point();
public localhost.Point e = new localhost.Point();
public delegate Result Delegizer(Point b, Point c, Point d, Point e);
protected void Page_Load(object sender, EventArgs bl)
{
Response.Buffer = false;
}
protected void ButtonCalculate_Click(object sender, EventArgs bl)
{
TableResults.Visible = false;
LabelResults.Text = "";
ButtonI_wanna_replay.Visible = false;
try
{
b.X = double.Parse(bx.Text);
}
catch
{
LabelResults.Text = "То, что вы ввели, числом не является";
return;
}
try
{
b.Y = double.Parse(by.Text);
}
catch
{
LabelResults.Text = "То, что вы ввели, числом не является";
return;
}
try
{
c.X = double.Parse(cx.Text);
}
catch
{
LabelResults.Text = "То, что вы ввели, числом не является";
return;
}
try
{
c.Y = double.Parse(cy.Text);
}
catch
{
LabelResults.Text = "То, что вы ввели, числом не является";
return;
}
try
{
d.X = double.Parse(dx.Text);
}
catch
{
LabelResults.Text = "То, что вы ввели, числом не является";
return;
}
try
{
d.Y = double.Parse(dy.Text);
}
catch
{
LabelResults.Text = "То, что вы ввели, числом не является";
return;
}
try
{
e.X = double.Parse(ex.Text);
}
catch
{
LabelResults.Text = "То, что вы ввели, числом не является";
return;
}
try
{
e.Y = double.Parse(ey.Text);
}
catch
{
LabelResults.Text = "То, что вы ввели, числом не является";
return;
}
if (b.X <= 0 | b.Y <= 0 | c.X <= b.X | c.Y != b.Y | d.X <= c.X |
d.Y >= c.Y | e.X >= d.X | e.Y != d.Y)
{
LabelResults.Text = "Вы ввели неверные координаты, посмотрите повнимательнее на рисунок";
return;
}
Delegizer Delegator = new Delegizer(proxy.MegaFunction);
IAsyncResult async = Delegator.BeginInvoke(b, c, d, e, null, null);
S = Delegator.EndInvoke(async);
Chucky(S);
}
private void Chucky(Result S)
{
TableResults.Visible = true;
ButtonI_wanna_replay.Visible = true;
LabelResults.Text = "Площадь трапеции вычисленная геометрически = "
+ Convert.ToString(S.S_tr) + " кв. ед.";
for (int row = 1; row <= 5; row++)
{
TableResults.Rows.Add(new TableRow());
for (int col = 0; col < 5; col++)
TableResults.Rows[row].Cells.Add(new TableCell());
}
TableResults.Rows[1].Cells[0].Text = Convert.ToString(1000);
TableResults.Rows[1].Cells[1].Text = Convert.ToString(S.M1);
TableResults.Rows[1].Cells[2].Text = Convert.ToString(Math.Round(S.S_tr1, 3));
TableResults.Rows[1].Cells[3].Text = Convert.ToString(Math.Round(S.imprecision1, 3));
TableResults.Rows[1].Cells[4].Text = Convert.ToString(S.time1);
TableResults.Rows[2].Cells[0].Text = Convert.ToString(10000);
TableResults.Rows[2].Cells[1].Text = Convert.ToString(S.M2);
TableResults.Rows[2].Cells[2].Text = Convert.ToString(Math.Round(S.S_tr2, 3));
TableResults.Rows[2].Cells[3].Text = Convert.ToString(Math.Round(S.imprecision2, 3));
TableResults.Rows[2].Cells[4].Text = Convert.ToString(S.time2);
TableResults.Rows[3].Cells[0].Text = Convert.ToString(100000);
TableResults.Rows[3].Cells[1].Text = Convert.ToString(S.M3);
TableResults.Rows[3].Cells[2].Text = Convert.ToString(Math.Round(S.S_tr3, 3));
TableResults.Rows[3].Cells[3].Text = Convert.ToString(Math.Round(S.imprecision3, 3));
TableResults.Rows[3].Cells[4].Text = Convert.ToString(S.time3);
TableResults.Rows[4].Cells[0].Text = Convert.ToString(1000000);
TableResults.Rows[4].Cells[1].Text = Convert.ToString(S.M4);
TableResults.Rows[4].Cells[2].Text = Convert.ToString(Math.Round(S.S_tr4, 3));
TableResults.Rows[4].Cells[3].Text = Convert.ToString(Math.Round(S.imprecision4, 3));
TableResults.Rows[4].Cells[4].Text = Convert.ToString(S.time4);
TableResults.Rows[5].Cells[0].Text = Convert.ToString(10000000);
TableResults.Rows[5].Cells[1].Text = Convert.ToString(S.M5);
TableResults.Rows[5].Cells[2].Text = Convert.ToString(Math.Round(S.S_tr5, 3));
TableResults.Rows[5].Cells[3].Text = Convert.ToString(Math.Round(S.imprecision5, 3));
TableResults.Rows[5].Cells[4].Text = Convert.ToString(S.time5);
}
protected void ButtonI_wanna_replay_Click(object sender, EventArgs bl)
{
ButtonCalculate_Click(sender, bl); }
}
Приложение 5. Листинг приложения на базе AJAX
Файл Default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Вычисление площади трапеции методом Монте-Карло</title>
</head>
<body style="text-align: left" runat="server">
<form name="Form" runat="server">
<asp:ScriptManager ID="scriptMgr" runat="server" > <Services>
<asp:ServiceReference Path="C:\Sasha\Учёба\3.2 курс\ТП\prog4_AjaxNew\Server\Service.asmx" />
</Services>
</asp:ScriptManager>
<h2 align="center">
Вычисление площади трапеции методом Монте-Карло</h2>
<table width="689" border="0" runat="server" align="center">
<tr>
<th width="458" height="279" scope="col">
<img src="img_3.gif" alt="" width="302" height="165" runat="server" />
</th>
<th width="221" scope="col" align="center">
Введите координаты:
<table width="134" border="0" align="center" runat="server">
<tr>
<th width="12" scope="col">
</th>
<th width="50" scope="col">
x
</th>
<th width="50" scope="col">
y
</th>
</tr>
<tr>
<th scope="row">
B:
</th>
<td>
<div align="center">
<asp:TextBox ID="bx" runat="server" Columns="7" MaxLength="5">500</asp:TextBox>
</div>
</td>
<td>
<div align="center">
<asp:TextBox ID="by" runat="server" Columns="7" MaxLength="5">500</asp:TextBox>
</div>
</td>
</tr>
<tr>
<th scope="row">
C:
</th>
<td>
<div align="center">
<asp:TextBox ID="cx" runat="server" Columns="7" MaxLength="5">800</asp:TextBox>
</div>
</td>
<td>
<div align="center">
<asp:TextBox ID="cy" runat="server" Columns="7" MaxLength="5">500</asp:TextBox>
</div>
</td>
</tr>
<tr>
<th scope="row">
D:
</th>
<td>
<div align="center">
<strong><span style="font-size: 16pt">
<asp:TextBox ID="dx" runat="server" Columns="7" MaxLength="5">1000</asp:TextBox>
</span></strong>
</div>
</td>
<td>
<div align="center">
<strong><span style="font-size: 16pt">
<asp:TextBox ID="dy" runat="server" Columns="7" MaxLength="5">0</asp:TextBox>
</span></strong>
</div>
</td>
</tr>
<tr>
<th scope="row">
E:
</th>
<td>
<div align="center">
<asp:TextBox ID="ex" runat="server" Columns="7" MaxLength="5">0</asp:TextBox>
</div>
</td>
<td>
<div align="center">
<asp:TextBox ID="ey" runat="server" Columns="7" MaxLength="5">0</asp:TextBox>
</div>
</td>
</tr>
</table>
<p>
<asp:Button ID="ButtonCalculate" runat="server" Text="Вычислить" OnClick="ButtonCalculate_Click" /></p>
Расчетная сессия:
<p>
<table id="Table1" width="134" border="0" align="center" runat="server">
<tr>
<th scope="row">
Расчетов:
</th>
<td>
<asp:TextBox ID="numCalc" runat="server" Columns="7" MaxLength="2">5</asp:TextBox>
</td>
</tr>
</table> <p>
<asp:Button ID="ButtonSession" runat="server" Text="Начать сессию" OnClick="StartSession" />
</p> </th>
</tr>
<tr>
<th>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Timer ID="Timer1" runat="server" Interval="2000" OnTick="One_calc" Enabled="False" />
<div align="center">
<asp:Label ID="LabelResults" runat="server"></asp:Label>
</div>
<asp:Table ID="TableResults" runat="server" CaptionAlign="Bottom" GridLines="Both" Visible="False">
<asp:TableHeaderRow BorderStyle="Double">
<asp:TableHeaderCell>Кол-во точек</asp:TableHeaderCell>
<asp:TableHeaderCell>Точек попало</asp:TableHeaderCell>
<asp:TableHeaderCell>Площадь трапеции методом Монте-Карло</asp:TableHeaderCell>
<asp:TableHeaderCell>Погрешность, %</asp:TableHeaderCell>
<asp:TableHeaderCell>Время расчета, ms</asp:TableHeaderCell>
</asp:TableHeaderRow>
</asp:Table>
<table id="TableSessionOptions" align="center" runat="server" Visible="False">
<tr>
<td>
<table border="0" cellpadding="2" runat="server">
<tr>
<td width="500" align="center">
<asp:Label ID="LabelCount" runat="server" Visible="False" />
</td>
<td width="1000" align="center">
<asp:UpdateProgress ID="UpdateProgress1" runat="server" AssociatedUpdatePanelID="UpdatePanel1" DisplayAfter="0">
<ProgressTemplate>
Ожидание ответа от сервера...
</ProgressTemplate>
</asp:UpdateProgress>
</td>
</tr>
</table>
<table border="0" cellpadding="2" runat="server">
<tr>
<td width="1" align="center">
<asp:Button ID="ButtonStop" runat="server" OnClick="StopSession" Text="Стоп" />
<asp:Button ID="ButtonMin" runat="server" Text="Минимальные значения" OnClick="Min" /> </td>
<td width="1" align="center">
<asp:Button ID="ButtonAvg" runat="server" Text="Средние значения" OnClick="Avg" /> </td>
<td width="1" align="center">
<asp:Button ID="ButtonMax" runat="server" Text="Максимальные значения" OnClick="Max" /> </td>
</tr>
</table>
</td>
</tr>
</table>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="ButtonCalculate" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="ButtonSession" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="ButtonStop" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="ButtonAvg" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="ButtonMin" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="ButtonMax" EventName="Click" />
</Triggers>
</asp:UpdatePanel> </th>
</tr>
</table>
</form>
</body>
</html>
Файл Default.aspx.cs
using System;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using localhost;
public partial class Default : System.Web.UI.Page {
private Service proxy = new Service();
public localhost.Result S = new localhost.Result();
public static int session_count = 1, session = 1;
public static localhost.Result[] S_sess = new localhost.Result[99];
public static localhost.Result S_min = new localhost.Result();
public static localhost.Result S_max = new localhost.Result();
public static bool first = true;
public localhost.Point b = new localhost.Point();
public localhost.Point c = new localhost.Point();
public localhost.Point d = new localhost.Point();
public localhost.Point e = new localhost.Point();
public delegate Result Delegizer(Point b, Point c, Point d, Point e);
protected void Page_Load(object sender, EventArgs bl)
{
Response.Buffer = false;
}
protected void One_calc(object sender, EventArgs bl)
{
if (first)
{
S_sess[0] = new localhost.Result();
}
TableResults.Visible = false;
LabelResults.Text = "";
try
{
b.X = double.Parse(bx.Text);
}
catch
{
LabelResults.Text = "То, что вы ввели, числом не является";
return;
}
try
{
b.Y = double.Parse(by.Text);
}
catch
{
LabelResults.Text = "То, что вы ввели, числом не является";
return;
}
try
{
c.X = double.Parse(cx.Text);
}
catch
{
LabelResults.Text = "То, что вы ввели, числом не является";
return;
}
try
{
c.Y = double.Parse(cy.Text);
}
catch
{
LabelResults.Text = "То, что вы ввели, числом не является";
return;
}
try
{
d.X = double.Parse(dx.Text);
}
catch
{
LabelResults.Text = "То, что вы ввели, числом не является";
return;
}
try
{
d.Y = double.Parse(dy.Text);
}
catch
{
LabelResults.Text = "То, что вы ввели, числом не является";
return;
}
try
{
e.X = double.Parse(ex.Text);
}
catch
{
LabelResults.Text = "То, что вы ввели, числом не является";
return;
}
try
{
e.Y = double.Parse(ey.Text);
}
catch
{
LabelResults.Text = "То, что вы ввели, числом не является";
return;
}
if (b.X <= 0 | b.Y <= 0 | c.X <= b.X | c.Y != b.Y | d.X <= c.X |
d.Y >= c.Y | e.X >= d.X | e.Y != d.Y)
{
LabelResults.Text = "Вы ввели неверные координаты, посмотрите повнимательнее на рисунок";
return;
}
Delegizer Delegator = new Delegizer(proxy.MegaFunction);
IAsyncResult async = Delegator.BeginInvoke(b, c, d, e, null, null);
S = Delegator.EndInvoke(async);
Chucky(S);
if (first)
{
Eq(S_min, S);
Eq(S_max, S);
}
else
{
S_findmax(S);
S_findmin(S);
}
Eq(S_sess[session - session_count], S);
first = false;
session_count--;
LabelCount.Text = "Расчетов осталось: " + Convert.ToString(session_count);
if (session_count == 0)
{
StopSession(sender, bl);
return;
}
}
private void Eq(Result aSs, Result S)
{
aSs.imprecision1 = S.imprecision1;
aSs.imprecision2 = S.imprecision2;
aSs.imprecision3 = S.imprecision3;
aSs.imprecision4 = S.imprecision4;
aSs.imprecision5 = S.imprecision5;
aSs.M1 = S.M1;
aSs.M2 = S.M2;
aSs.M3 = S.M3;
aSs.M4 = S.M4;
aSs.M5 = S.M5;
aSs.S_tr1 = S.S_tr1;
aSs.S_tr2 = S.S_tr2;
aSs.S_tr3 = S.S_tr3;
aSs.S_tr4 = S.S_tr4;
aSs.S_tr5 = S.S_tr5;
aSs.time1 = S.time1;
aSs.time2 = S.time2;
aSs.time3 = S.time3;
aSs.time4 = S.time4;
aSs.time5 = S.time5;
aSs.S_tr = S.S_tr;
}
private void S_round()
{
for (int i = 0; i < session; i++)
{
S_sess[session].imprecision1 += S_sess[i].imprecision1;
S_sess[session].imprecision2 += S_sess[i].imprecision2;
S_sess[session].imprecision3 += S_sess[i].imprecision3;
S_sess[session].imprecision4 += S_sess[i].imprecision4;
S_sess[session].imprecision5 += S_sess[i].imprecision5;
S_sess[session].M1 += S_sess[i].M1;
S_sess[session].M2 += S_sess[i].M2;
S_sess[session].M3 += S_sess[i].M3;
S_sess[session].M4 += S_sess[i].M4;
S_sess[session].M5 += S_sess[i].M5;
S_sess[session].S_tr1 += S_sess[i].S_tr1;
S_sess[session].S_tr2 += S_sess[i].S_tr2;
S_sess[session].S_tr3 += S_sess[i].S_tr3;
S_sess[session].S_tr4 += S_sess[i].S_tr4;
S_sess[session].S_tr5 += S_sess[i].S_tr5;
S_sess[session].time1 += S_sess[i].time1;
S_sess[session].time2 += S_sess[i].time2;
S_sess[session].time3 += S_sess[i].time3;
S_sess[session].time4 += S_sess[i].time4;
S_sess[session].time5 += S_sess[i].time5;
}
S_sess[session].S_tr = S_sess[session - 1].S_tr;
S_sess[session].imprecision1 /= session;
S_sess[session].imprecision2 /= session;
S_sess[session].imprecision3 /= session;
S_sess[session].imprecision4 /= session;
S_sess[session].imprecision5 /= session;
S_sess[session].M1 /= session;
S_sess[session].M2 /= session;
S_sess[session].M3 /= session;
S_sess[session].M4 /= session;
S_sess[session].M5 /= session;
S_sess[session].S_tr1 /= session;
S_sess[session].S_tr2 /= session;
S_sess[session].S_tr3 /= session;
S_sess[session].S_tr4 /= session;
S_sess[session].S_tr5 /= session;
S_sess[session].time1 /= session;
S_sess[session].time2 /= session;
S_sess[session].time3 /= session;
S_sess[session].time4 /= session;
S_sess[session].time5 /= session;
}
private void S_findmax(Result S)
{
if (S_max.imprecision1 < S.imprecision1)
S_max.imprecision1 = S.imprecision1;
if (S_max.imprecision2 < S.imprecision2)
S_max.imprecision2 = S.imprecision2;
if (S_max.imprecision3 < S.imprecision3)
S_max.imprecision3 = S.imprecision3;
if (S_max.imprecision4 < S.imprecision4)
S_max.imprecision4 = S.imprecision4;
if (S_max.imprecision5 < S.imprecision5)
S_max.imprecision5 = S.imprecision5;
if (S_max.M1 < S.M1)
S_max.M1 = S.M1;
if (S_max.M2 < S.M2)
S_max.M2 = S.M2;
if (S_max.M3 < S.M3)
S_max.M3 = S.M3;
if (S_max.M4 < S.M4)
S_max.M4 = S.M4;
if (S_max.M5 < S.M5)
S_max.M5 = S.M5;
if (S_max.S_tr1 < S.S_tr1)
S_max.S_tr1 = S.S_tr1;
if (S_max.S_tr2 < S.S_tr2)
S_max.S_tr2 = S.S_tr2;
if (S_max.S_tr3 < S.S_tr3)
S_max.S_tr3 = S.S_tr3;
if (S_max.S_tr4 < S.S_tr4)
S_max.S_tr4 = S.S_tr4;
if (S_max.S_tr5 < S.S_tr5)
S_max.S_tr5 = S.S_tr5;
if (S_max.time1 < S.time1)
S_max.time1 = S.time1;
if (S_max.time2 < S.time2)
S_max.time2 = S.time2;
if (S_max.time3 < S.time3)
S_max.time3 = S.time3;
if (S_max.time4 < S.time4)
S_max.time4 = S.time4;
if (S_max.time5 < S.time5)
S_max.time5 = S.time5;
S_max.S_tr = S.S_tr;
}
private void S_findmin(Result S)
{
if (S_min.imprecision1 > S.imprecision1)
S_min.imprecision1 = S.imprecision1;
if (S_min.imprecision2 > S.imprecision2)
S_min.imprecision2 = S.imprecision2;
if (S_min.imprecision3 > S.imprecision3)
S_min.imprecision3 = S.imprecision3;
if (S_min.imprecision4 > S.imprecision4)
S_min.imprecision4 = S.imprecision4;
if (S_min.imprecision5 > S.imprecision5)
S_min.imprecision5 = S.imprecision5;
if (S_min.M1 > S.M1)
S_min.M1 = S.M1;
if (S_min.M2 > S.M2)
S_min.M2 = S.M2;
if (S_min.M3 > S.M3)
S_min.M3 = S.M3;
if (S_min.M4 > S.M4)
S_min.M4 = S.M4;
if (S_min.M5 > S.M5)
S_min.M5 = S.M5;
if (S_min.S_tr1 > S.S_tr1)
S_min.S_tr1 = S.S_tr1;
if (S_min.S_tr2 > S.S_tr2)
S_min.S_tr2 = S.S_tr2;
if (S_min.S_tr3 > S.S_tr3)
S_min.S_tr3 = S.S_tr3;
if (S_min.S_tr4 > S.S_tr4)
S_min.S_tr4 = S.S_tr4;
if (S_min.S_tr5 > S.S_tr5)
S_min.S_tr5 = S.S_tr5;
if (S_min.time1 > S.time1)
S_min.time1 = S.time1;
if (S_min.time2 > S.time2)
S_min.time2 = S.time2;
if (S_min.time3 > S.time3)
S_min.time3 = S.time3;
if (S_min.time4 > S.time4)
S_min.time4 = S.time4;
if (S_min.time5 > S.time5)
S_min.time5 = S.time5;
S_min.S_tr = S.S_tr;
}
private void Chucky(Result S)
{
TableResults.Visible = true;
LabelResults.Text = "Площадь трапеции, вычисленная геометрически = "
+ Convert.ToString(S.S_tr) + " кв. ед.";
for (int row = 1; row <= 5; row++)
{
TableResults.Rows.Add(new TableRow());
for (int col = 0; col < 5; col++)
TableResults.Rows[row].Cells.Add(new TableCell());
}
TableResults.Rows[1].Cells[0].Text = Convert.ToString(1000);
TableResults.Rows[1].Cells[1].Text = Convert.ToString(Math.Round(S.M1, 0));
TableResults.Rows[1].Cells[2].Text = Convert.ToString(Math.Round(S.S_tr1, 3));
TableResults.Rows[1].Cells[3].Text = Convert.ToString(Math.Round(S.imprecision1, 3));
TableResults.Rows[1].Cells[4].Text = Convert.ToString(S.time1);
TableResults.Rows[2].Cells[0].Text = Convert.ToString(10000);
TableResults.Rows[2].Cells[1].Text = Convert.ToString(Math.Round(S.M2, 0));
TableResults.Rows[2].Cells[2].Text = Convert.ToString(Math.Round(S.S_tr2, 3));
TableResults.Rows[2].Cells[3].Text = Convert.ToString(Math.Round(S.imprecision2, 3));
TableResults.Rows[2].Cells[4].Text = Convert.ToString(S.time2);
TableResults.Rows[3].Cells[0].Text = Convert.ToString(100000);
TableResults.Rows[3].Cells[1].Text = Convert.ToString(Math.Round(S.M3, 0));
TableResults.Rows[3].Cells[2].Text = Convert.ToString(Math.Round(S.S_tr3, 3));
TableResults.Rows[3].Cells[3].Text = Convert.ToString(Math.Round(S.imprecision3, 3));
TableResults.Rows[3].Cells[4].Text = Convert.ToString(S.time3);
TableResults.Rows[4].Cells[0].Text = Convert.ToString(1000000);
TableResults.Rows[4].Cells[1].Text = Convert.ToString(Math.Round(S.M4, 0));
TableResults.Rows[4].Cells[2].Text = Convert.ToString(Math.Round(S.S_tr4, 3));
TableResults.Rows[4].Cells[3].Text = Convert.ToString(Math.Round(S.imprecision4, 3));
TableResults.Rows[4].Cells[4].Text = Convert.ToString(S.time4);
TableResults.Rows[5].Cells[0].Text = Convert.ToString(10000000);
TableResults.Rows[5].Cells[1].Text = Convert.ToString(Math.Round(S.M5, 0));
TableResults.Rows[5].Cells[2].Text = Convert.ToString(Math.Round(S.S_tr5, 3));
TableResults.Rows[5].Cells[3].Text = Convert.ToString(Math.Round(S.imprecision5, 3));
TableResults.Rows[5].Cells[4].Text = Convert.ToString(S.time5);
}
protected void StartSession(object sender, EventArgs bl)
{
first = true;
try
{
session_count = int.Parse(numCalc.Text);
}
catch
{
LabelResults.Text = "То, что вы ввели, числом не является";
return;
}
session = session_count;
for (int i = 1; i < session + 1; i++)
{
S_sess[i] = new localhost.Result();
}
TableSessionOptions.Visible = true;
Timer1.Enabled = true;
ButtonStop.Visible = true;
ButtonAvg.Visible = false;
ButtonMin.Visible = false;
ButtonMax.Visible = false;
LabelCount.Visible = true;
One_calc(sender, bl);
}
protected void ButtonCalculate_Click(object sender, EventArgs bl)
{
session = -1;
session_count = -1;
One_calc(sender, bl);
}
protected void StopSession(object sender, EventArgs bl)
{
Timer1.Enabled = false;
ButtonStop.Visible = false;
ButtonAvg.Visible = true;
ButtonMin.Visible = true;
ButtonMax.Visible = true;
LabelCount.Visible = false;
S_round();
}
protected void Avg(object sender, EventArgs bl)
{
Chucky(S_sess[session]);
LabelCount.Visible = false;
}
protected void Min(object sender, EventArgs bl)
{
Chucky(S_min);
LabelCount.Visible = false;
}
protected void Max(object sender, EventArgs bl)
{
Chucky(S_max);
LabelCount.Visible = false;
}
}
2
К2.001.211.ПЗ
Документ
Категория
Рефераты
Просмотров
198
Размер файла
1 508 Кб
Теги
chuev
1/--страниц
Пожаловаться на содержимое документа