Мегаобучалка Главная | О нас | Обратная связь


подпись, дата инициалы, фамилия



2016-01-05 4714 Обсуждений (0)
подпись, дата инициалы, фамилия 0.00 из 5.00 0 оценок




Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования

«Тамбовский государственный технический университет»

 

Кафедра «Конструирования радиоэлектронных и микропроцессорных систем»

 

УТВЕРЖДАЮ

Зав. кафедрой

___д.т.н.,проф. Д.Ю. Муромцев

подпись, фамилия, инициалы

” ___ ’’ июня _2013 г

 

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

 

к курсовому проекту (работе) по Информатике

наименование учебной дисциплины

 

На тему: Использование принципов объектно-ориентированного
программирования на примере численных методов (вычисление алгебраического
уравнения методом хорда, интегрирование по общей формуле
трапеции, решение дифференциального уравнения методом Эйлера).
 

 

Автор проекта (работы) Х.С. Нурназаров Группа БИТ-11

подпись, дата, инициалы, фамилия

 

Специальность 210700 – « Инфокоммуникационные технологии и системы
связи»

номер, наименование

 

Обозначение курсового проекта (работы) ТГТУ.210700.008
Руководитель проекта (работы) к.т.н.,доц., С.В.Артемова.
     

подпись, дата инициалы, фамилия

Проект (работа) защищен (а) Оценка
Члены комиссии
подпись. дата инициалы, фамилия
подпись. дата инициалы, фамилия
подпись. дата инициалы, фамилия
Нормоконтролер к.т.н., доц., С.В. Артемова
подпись. дата инициалы, фамилия

 

Тамбов 2013 г


АННОТАЦИЯ

 

 

Курсовой проект по информатике на тему «Использование методов объектно-ориентированного программирования на примере численных методов выполнен по заданию № 12 (вычисление алгебраического уравнения методом хорд, интегрирование по общей формуле трапеции, решение дифференциального уравнения методом Эйлера) выполнил студент группы БИТ-11 Нурназаров Х.С. Проверил Артёмова С.В.

 


Изм.
Лист
№ докум.
Подпись
Дата
Лист
ТГТУ. 210700 012 ПЗ  
Разраб.
Нурназаров Х.С.
Провер.
Артемова С.В.
Реценз.
 
Н. Контр.
 
Утверд.
 
Использование методов объектно-ориентированного программирования на примере численных методов
Лит.
Листов
КРЭМС гр. БИТ-11
СОДЕРЖАНИЕ

ВВЕДЕНИЕ …………………….……………………………………...…………......6

1 Постановка задачи …………...………..……………………..………………..7

2 Математическое описание методов …..……………..…………..…...…8

2.1 Метод хорд при приближенном вычислении алгебраических и трансцендентных уравнений …………………………………………………….……8

2.2 Вычисление общей формулы трапеции……………………….…......…………...9

2.3 Решение дифференциального уравнения методом Эйлера……………...............9

3 Блок-схема программы MAIN………………...…….....…………….......11

3.1 Блок-схема метода хорда объекта Thord..………………………...……………..12

3.2 Блок-схема метода трапеции объекта Tmettrap……………………….…….......13

3.3 Блок-схема метода Эйлера объекта Teyler……………………...……..…….......14

3.4 Диаграмма классов главной программы………………………………………...15

3.5 Диаграмма взаимодействий главной программы ……………………………….15

4 Описание стандартных модулей….…….…..…………………...............16

5 Описание не стандартных модулей….…………..…………………….18

5.1 Метод hord... ………..……...………………….………………...………………...18

5.2 Метод mettrap ……..………………………..…...………………...........................19

5.3 Метод eyler ……………………………….……..……………....………………...19

6 Описание интерфейса…….…………………………………..……………..20

7 Численные примеры …..………….…...………………………………….....21

Заключение…………………………….......………………………..…………......25

Список используемой литературы…..………………………..…..............26

Приложение…………………………………………..………….…………..…....27

 

 

Изм.
Лист
№ докум.
Подпись
Дата
Лист
ТГТУ. 210700.012 ПЗ  
ВВЕДЕНИЕ

 

 

Курсовая работа посвящена программной реализации трёх численных методов. В качестве языка программ курсовой работы выбран язык Паскаль. Выше упомянутый язык программирования предельно прост, логичен и эффективен. В Паскале сконцентрированы многие лучшие черты языков - предшественников. Сравнение этого языка с более простыми языками вроде Бейсика показывает, что текст алгоритма в виде программы на Бейсике содержит больше подробностей о действиях ПЭВМ, текст на Паскале яснее выражает математическую сущность алгоритма. Язык предоставляет пользователю большие возможности для решения широкого круга задач. Он содержит полный набор структур данных: простые переменные (целые, действительные, символьные, логические), массивы, строки, множества, записи и файлы.

Хотелось бы отметить, что методы объектно-ориентированного программирования позволяют создавать расширяемые системы (extensible systems). Это одно из самых значительных достоинств ООП и именно оно отличает данный подход от традиционных методов программирования. Расширяемость extensibility означает, что существующую систему можно заставить работать с новыми компонентами, причем без внесения в нее каких-либо изменений. Компоненты могут быть добавлены на этапе выполнения. Расширение типа type extension и вытекающий из него полиморфизм переменных оказываются полезными преимущественно в обработке разнородных структур данных, в изменении поведения во время выполнения, в реализация родовых компонентов.

Все выше перечисленное позволяет сделать вывод, что объектно-ориентированное программирование открывает не объятые просторы в развитии современной техники, и будущее, а вернее сказать уже настоящее именно за ним. Вместе с структурным программированием оно уже составляет авангард современной науки.

 

ПОСТАНОВКА ЗАДАЧ

 

 

Изм.
Лист
№ докум.
Подпись
Дата
Лист
ТГТУ. 210700.012 ПЗ  
Цель данного курсового проекта – научиться использовать методы объектно-ориентированного программирования на примере численных методов, в частности написание нескольких модулей и связь их в одну общую программу.

1.1Составить программу приближенного вычисления методом хорд следующего уравнения: и описать выше указанный метод, составить блок-схему программы, описать стандартные и не стандартные функции, применяемые в задаче, описать интерфейс и привести пример.

1.2 Составить программу для вычисления общей формулы трапеции и описать выше указанный метод, составить блок-схему, описать стандартные и не стандартные функции, а так же интерфейс задачи.

1.3 Составить программу для вычисления дифференциального уравнения методом Эйлера , y(1)=1 [1;5] h=0,4 и описать выше указанный метод, составить блок-схему программы, описать стандартные и не стандартные функции, применяемые в задаче, описать интерфейс и привести пример.

 

2

Изм.
Лист
№ докум.
Подпись
Дата
Лист
ТГТУ. 210700.012 ПЗ  
МАТЕМАТИЧЕСКОЕ ОПИСАНИЕ МЕТОДОВ

 

2.1 Метод половинного деления при приближенном вычислении алгебраических и трансцендентных уравнений

 

Пусть корень уравнения f(x)=0отделен на отрезке [a, b], т.е. f(a)f(b)<0 и f (x) сохраняет знак (рис. 1).

Рисунок 1 – График функции y=f(x).

В качестве начального приближения корня возьмем точку c0 – середину отрезка:

Если , то – искомый корень уравнения, если ,

то из двух отрезков [a, ] и [ , b] выбираем тот, на концах которого функция принимает значение разных знаков.

Новый отрезок опять делим пополам и далее поступаем аналогично вышеизложенному. Длина каждого нового отрезка вдвое меньше длины предыдущего отрезка, т.е. за n шагов сократится в раз.

Вычисления прекращаем, если длина отрезка [ , ], станет меньше заданной погрешности , т.е.:

Достоинство метода половинного деления : более быстрая сходимость к заданной точности, чем у шагового. Недостаток: если на отрезке [а, b] содержится более одного корня, то метод не работает [1].

 

 

2.2 Вычисление определенного интеграла по формуле трапеции

 

Изм.
Лист
№ докум.
Подпись
Дата
Лист
ТГТУ. 210700.012 ПЗ  
Пусть требуется вычислить интеграл , где f(x) - непрерывная функция. Для простоты рассуждений ограничимся случаем, когда . Разобьем отрезок [a, b] на n отрезков точками и с помощью прямых построим n прямолинейных трапеций. Сумма площадей трапеций приближенно равна площади криволинейной трапеции, где и - соответственно основания трапеций; - их высоты. Таким образом, получена приближенная формула:

которая и называется формулой трапеций. Эта формула тем точнее, чем больше n [1].

2.3 Метод Эйлера для вычисления дифференциального уравнения

Решить дифференциальное уравнение у/=f(x,y) численным методом - это значит для заданной последовательности аргументов , …, и числа , не определяя функцию у=f(x), найти такие значения , ,…, , что и F( )= . Таким образом, численные методы позволяют вместо нахождения функции У=f(x) получить таблицу значений этой функции для заданной последовательности аргументов. Величина называется шагом интегрирования. Метод Эйлера относиться к численным методам, дающим решение в виде таблицы приближенных значений искомой функции у(х). Он является сравнительно грубым и применяется в основном для ориентировочных расчетов. Однако идеи, положенные в основу метода Эйлера, являются исходными для ряда других методов. Рассмотрим дифференциальное уравнение первого порядка с начальным условием x= , y( )= Требуется найти решение уравнения на отрезке [а,b]. Разобьем отрезок [a, b] на n равных частей и получим последовательность , , ,…, , где = +ih (i=0,1,…, n), а -шаг интегрирования. В методе Эйлера приближенные значения у( )( ) вычисляютсяпоследовательно по формулам +hf( , ) (i=0,1,2…). При этом искомая интегральная кривая у=у(х), проходящая через точку ( , ), заменяется ломаной … с вершинами ( , ) (i=0,1,2,…); каждое звено этой ломаной, называемой ломаной Эйлера, имеет направление,совпадающее с направлением той интегральной кривой уравнения, которая проходит через точку . Если правая часть уравнения внекотором прямоугольнике удовлетворяет условиям: (N=const), (M=const), то имеет место следующая оценка погрешности:
Изм.
Лист
№ докум.
Подпись
Дата
Лист
ТГТУ. 210700.012 ПЗ  
|y( )- |, где у( )-значение точного решения уравнения при х= , а -приближенное значение, полученное на n-ом шаге. Метод Эйлера легко распространяется на системы дифференциальных уравнений и на дифференциальные уравнения высших порядков. Последние должны быть предварительно приведены к системе дифференциальных уравнений первого порядка [1].

 

3

Изм.
Лист
№ докум.
Подпись
Дата
Лист
ТГТУ. 210700.012 ПЗ  
БЛОК-СХЕМА ПРОГРАММЫ MAIN

 

Рисунок 2 – Блок-схема главной программы.

 

3.1 Блок-схема метода половинного деления объекта Tpoldel

 

Изм.
Лист
№ докум.
Подпись
Дата
Лист
ТГТУ. 210700.012 ПЗ  

Рисунок 3 – Блок-схема метода половинного деления.

 

 

3.2 Блок-схема метода трапеции объекта Tmettrap

Рисунок 4 – Блок-схема метода трапеции.

 

Изм.
Лист
№ докум.
Подпись
Дата
Лист
ТГТУ. 210700.012 ПЗ  


3.3 Блок-схема метода Эйлера объекта Teyler

Начало  
clrscr
h:=1
b:=1
x:=1
y:=5
X<=b
Нет
 
Да
(‘x=’,x:0:9,’y=’,y:0:9)
y:=y+F(x,y)*h
x:=x+h
readln
Конец

 


Рисунок 5 – Блок-схема метода Эйлера.

Изм.
Лист
№ докум.
Подпись
Дата
Лист
ТГТУ. 210700.012 ПЗ  

 

 


3.4 Диаграмма классов главной программы

MAIN
Tmettrap  
+ a,b,k,s,e:real  
+ F(x:real):real  
+ mettrap  
Thord  
+ eps,a,b,c:real  
+ F(x:real):real  
+Hord  
Teyler  
+ h,x,y,a,b,k, s,e:real  
+F(x,y:real):real  
+ eyler  
Изм.
Лист
№ докум.
Подпись
Дата
Лист
ТГТУ. 210700.012 ПЗ  

 

 

Диаграмма 1 – Диаграмма классов главной программы.

 

3.5 Диаграмма взаимодействий главной программы

MAIN
Thord  
Tmettrap  
Teyler  

 

1 hord

 

2 mettrap

 

3 eyler

 

 

Диаграмма 2 – Диаграмма взаимодействий главной программы.

 

 

4 ОПИСАНИЕ СТАНДАРТНЫХ ФУНКЦИЙ

 

 

Все создаваемые модули используют процедуру Clrscr стандартного модуля Crt [4]. Указанная процедура очищает экран и помещает курсор в его верхний левый угол. Действует процедура следующим образом: все символы заменяются на пробел с

Изм.
Лист
№ докум.
Подпись
Дата
Лист
ТГТУ. 210700.012 ПЗ  
атрибутами, установленными в данный момент. Например, если цвет фона TextBackground не черный, то экран будет иметь цвет фона. Процедура выполняется в том окне, в котором она вызвана. Например, в случае

Window (1,1,60,20);

Clrscr;

Будет очищен прямоугольник 60*20, начинающийся в (1,1).

Следующие задействованные всеми создаваемыми модулями процедуры: Write (), Writeln (), Read (), Readln () стандартного модуля System [5]. Объявление этого модуля утилитой Uses не обязательно, он автоматически подключается программными средствами Pascal. Перечисленные операторы являются операторами ввода, вывода. Привлечение этих процедур открывает возможность многократного использования одной и той же программы для вычисления с различными исходными данными [2].

При выполнении оператора ввода Read() переменным присваиваются значения исходных данных [2].

Процедура Readln() выполняет процедуру Read(), после чего переходит на следующую строку. Readln() без параметров осуществляет переход на начало следующей строки без предварительного считывания [2].

С помощью процедур вывода Write() строится последовательность значений, которая является результатом выполнения программы. Параметр, заключенный в круглые скобки может содержать указания ширины поля и количества десятичных знаков. Выражения вывода могут быть следующих типов: char, integer, real, string, packet string или boolean. Процедура вывода, таким образом, позволяет выделить из всего набора вычисленных значений те, которые служат ответом к решавшейся при выполнении программой задаче [2].

Процедура Writeln() выполняет процедуру Write(), а затем осуществляет переход в начало следующей строки. Процедуры ввода и вывода часто применяют вместе. Например, для ввода трех чисел и вывода их суммы

Read (a,b,c);

х:= a+b+c;

Write(x);

Последней общей для всех модулей функцией является функция ReadKey, которая считывает символ с клавиатуры [5]. Она описана в стандартном модуле Crt. Возвращаемый тип данных – тип char. Функция ReadKey принимает значение считываемого символа, при этом символ не выводится на экран. Если до обращения к ReadKey значение KeyPressed было равно True, то считывание происходит незамедлительно. В противном случае программа ожидает ввода с клавиатуры. Для считывания кода, соответствующего специальным клавишам, к функции ReadKey необходимо обратиться два раза. (Под специальными, подразумеваются функциональные клавиши, клавиши управления курсором, клавиши, нажатые одновременно с Alt и т.д.). Первый раз функция ReadKey принимает значения #0, а во второй раз – значение расширенного кода, соответствующего данной специальной клавише. Значение #0 не может быть присвоено ReadKey никаким другим способом. Поэтому если ReadKey = #0, то следующее значение ReadKey обязательно должно трактоваться как расширенный код. Не смотря на то, что применение функции очень широко, однако чаще всего она используется для задержки программы при отладке. Пример применения функции

Ch: = ReadKey - возвращает считанный символ.

И, наконец, последняя, стандартная функция, используемая только в модуле myiter1. Это функция Abs() – возвращающая абсолютное значение

Изм.
Лист
№ докум.
Подпись
Дата
Лист
ТГТУ. 210700.012 ПЗ  
аргумента. Она входит в состав стандартного модуля System. Возвращаемый тип данных тот же, что и у аргумента (real, integer).Abs(x) - возвращает абсолютное значение х [2].

 

5 ОПИСАНИЕ НЕСТАНДАРТНЫХ ФУНКЦИЙ

 

 

Программа MAIN использует нестандартные модули (modpoldel, modmettrap, modeyler), которые в свою очередь содержат не стандартные процедуры и функции, выполнение которых приводит к выполнению программы. Поэтому описание нестандартных процедур и функций, по сути, сводится к описанию процедур и функций, содержащихся в выше перечисленных модулях.

 

Изм.
Лист
№ докум.
Подпись
Дата
Лист
ТГТУ. 210700.012 ПЗ  


5.1 Метода половинного деления объект Tpoldel

 

Процедура poldel содержит пять внутренних переменных типа real, три из них имеют первоначальное значение, также этот объект использует внутреннюю функцию F( ) для расчёта значения функции в точке. Переменной с присваивается значение, численно равное полу сумме переменных а и b. Используя условный оператор if-then мы проверяем условие: значение функции F()в точке a, умноженное на значение функции F( ) в точке c- меньше или равно нулю. Если условие выполняется, используя стандартный модуль присвоения, мы точке b присваиваем значение точки c, иначе точке а присваивается значение точки с.ЦиклRepeat-Until позволяет нам добиться нужной точности ответа, так если условие ложно - тело цикла выполняется заново а если условие истинно - цикл завершается. Выше указанный метод использует стандартные процедуры и функции (clrscr, writeln, readln).

 

5.2 Метод трапеции объект Tmettrap

 

Изм.
Лист
№ докум.
Подпись
Дата
Лист
ТГТУ. 210700.012 ПЗ  
Данная процедура использует внутренние переменные a,b,k,s,e типа real и использует внутреннюю функцию F( ) для расчёта интеграла. Переменным a,b,e присваивается начальное значение. Переменной s присваивается значение, численно равное полу сумме значений функции в точке a и в точке b. Переменная k равна разности значений a и e. В ходе выполнения цикла while происходит проверка условия (значение переменной k должно быть меньше или равно сумме переменных b и e). Если условие выполняется, переменной k присваивается сумма переменных k (предыдущего) и e, а переменная s становится равна произведению предыдущего значения s на значение функции в точке k. Далее процедура выводит найденные значения на экран монитора. Выше указанный метод использует стандартные процедуры и функции ( clrscr, write, writeln, readln).

 

5.3 Метода Эйлера объекта Teyler

 

Эта процедура использует значительно большее количество внутренних переменных (a,b,e,h,k,s,x,y-real,). Кроме того, она использует внутреннюю функцию F() для расчета уравнения с двумя неизвестными. Начальное значение имеют переменные h,b,x,y , каждое последующее значение x и y заданы формулами. В ходе выполнения цикла while происходит проверка условия (значение переменной х должно входить в интервал от 1 до 5). Если условие выполняется, процедура выводит найденные значения на экран монитора. Выше указанный метод использует стандартные процедуры и функции ( clrscr, writeln, readln).

 

 

6 ОПИСАНИЕ ИНТЕРФЕЙСА

 

 

Основная программа MAIN (использующая методы объектно-ориентированного программирования) работает следующим образом. Используя способ запроса, определяет дальнейший ход развития. При получении любого результата отличного от 1,2,3 вновь возвращается на начало программы. Тем самым, исключая возможность ошибочного ввода. При получении ответа соответствующего цифрам 1,2,3 передает управление одному из не стандартных методов, описанных в не стандартных модулях пользователя. При этом выполнение главной программы практически заканчивается за исключением оператора выхода. Управление передается соответственно одному из модулей (modhord, modmettrap, modeyler) или другими словами методам пользователя (hord, mettrap, eyler). Каждый из перечисленных модулей по сути своей представляет отдельную программу, являющуюся составной частью другой. Это позволяет в зависимости от выбора пользователя выполнить тот или иной самостоятельный модуль, входящий в главную программу.

При выборе 1 управление передается модулю modhord (метод hord) выполнение которого приводит к выходу из программы.

Аналогично построены и два других модуля входящих в программу MAIN.

 

Изм.
Лист
№ докум.
Подпись
Дата
Лист
ТГТУ. 210700.012 ПЗ  

 

 


Изм.
Лист
№ докум.
Подпись
Дата
Лист
ТГТУ. 210700.012 ПЗ  
7 ЧИСЛЕННЫЕ ПРИМЕРЫ

 

 

Все выше перечисленное в данной курсовой работе проиллюстрировано на конкретных примерах.

1. Проверку правильности работы программы, реализующей метод половинного деления, проведем с использованием электронных таблиц Excel.

Microsoft Excel предназначен для быстрых расчетов. Он позволяет с использованием мастера функций получать значения функций, а с использованием мастера диаграмм строить графики функций.

Для отделения корней уравнения построим график заданной функции на интервале [1;2]. Таблица для построения графика и график функции приведены ниже.

Таблица 1 – Данные для построения графика в заданном интервале.

Х 1,1 1,2 1,3 1,4 1,5 1,6 1,7 1,8 1,9
У -8 -7,25 -6,39 -5,42 -4,34 -3,12 -1,78 -0,31 -1,31 -3,08

 

Рисунок 6 – График функции .

 

Изм.
Лист
№ докум.
Подпись
Дата
Лист
ТГТУ. 210700.012 ПЗ  
Для получения решения в Microsoft Excel спроектируем таблицу 2.

Таблица 2– Решение нелинейного уравнения методом

половинного деления.

 

a b (a+b)/2 f(a) f(b) F((a+b)/2) E|a-b|
1,5 -8 -1,5
1,5 1,75 -3,125 0,9375 0,5
1,5 1,75 1,625 -3,125 0,484375 -1,3203125 0,25
1,625 1,75 1,6875 -1,427734375 0,484375 -0,4716797 0,125
1,75 1,6875 1,71875 0,484375 -0,499267578 -0,0074463 0,0625
1,75 1,71875 1,734375 0,484375 -0,014434814 0,23497009 0,03125
1,734375 1,71875 1,726563 0,233211517 -0,014434814 0,10938835 0,015625
1,726563 1,71875 1,722656 0,108950138 -0,014434814 0,04725766 0,0078125
1,722656 1,71875 1,720703 0,047148287 -0,014434814 0,01635674 0,00390625
1,720703 1,71875 1,719727 0,016329415 -0,014434814 0,0009473 0,001953125
1,719727 1,71875 1,719238 0,000940473 -0,014434814 -0,0067472 0,000976563
1,719238 1,719727 1,719482 -0,006748877 0,000940473 -0,0029042 0,000488281
1,719482 1,719727 1,719604 -0,002904629 0,000940473 -0,0009821 0,000244141
1,719604 1,719727 1,719666 -0,000982185 0,000940473 -2,086E-05 0,00012207

 

 

Результатом расчетов по таблице получаем значение корня уравнения при заданной точности вычисления . Проведем проверку правильности результата:

5.08553+5,91454-11=0,00007.

Полученное значение показывает, что при заданной погрешности полученный корень уравнения дает результат не превышающий заданную погрешность.

Также в правильности полученного решения можно убедиться анализируя график функции. Как видно из графика функции решение находится где-то в районе 1,7.

 

Изм.
Лист
№ докум.
Подпись
Дата
Лист
ТГТУ. 210700.012 ПЗ  
2. Вычисление определенного интеграла на отрезке [-3;8] методом трапеции функции вида с использованием математического процессора Maple V. Maple - программный пакет, система компьютерной алгебры. Система Maple предназначена для символьных вычислений, хотя имеет ряд средств и для численного решения дифференциальных уравнений и нахождения интегралов. Численное интегрирование выполняется командой evalf(int(f, x=x1..x2), e) , где e - точность вычислений (число знаков после запятой).

Результатом расчетов в процессоре Maple V получаем определенный интеграл, который равен 179.6666667.

 

 

Рисунок 7 – Результат решения с использованием

математического процессора Maple V.

 

3

Изм.


2016-01-05 4714 Обсуждений (0)
подпись, дата инициалы, фамилия 0.00 из 5.00 0 оценок









Обсуждение в статье: подпись, дата инициалы, фамилия

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Как распознать напряжение: Говоря о мышечном напряжении, мы в первую очередь имеем в виду мускулы, прикрепленные к костям ...
Как построить свою речь (словесное оформление): При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою...
Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (4714)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.009 сек.)