Лабораторная
работа № 15.
Создание и
использование процедур в программах
Цели
занятия:
•
Формирование
представления о назначении процедур.
•
Формирование
навыков разработки пользовательских процедур.
•
Формирование
навыков использования процедур в программах.
При создании проекта особое
внимание уделяется разработке такого программного кода, который не только
управляет действиями пользователя, но и обрабатывает исключительные ситуации,
связанные с неверными действиями пользователя, не прерывая работу программы.
Упражнение
1.
В упражнении 1 создается
Windows-приложение для вычисления функции sin(х) для любого аргумента с
заданной точностью. Для вычисления sin(х) используется пользовательская
процедура.
Чтобы
начать работу над новым проектом, надо:
§
В меню File выбрать команду New Project.
§
В открывшемся окне New Project выбрать тип приложения — Windows
Forms Application - Visual С#.
§
В поле Name ввести имя проекта — и нажать кнопку ОК.
В результате описанных действий в
папке временных проектов (по умолчанию C:\Users\User\Документы\Visual Studio
2008\Projects) будет создана папка с именем проекта, а в ней — в ней вы
найдете сам проект.
: Разработка пользовательского интерфейса проекта.
Настроим стартовую форму нашего
приложения согласно рис. 1.
Аргумент и точность вводятся в
компонентах TextBox, для надписей используем компоненты Label. Запуск процесса
вычисления функции будет осуществляться с помощью кнопки Button. Результат
отображается на форме в компоненте Label.
Рис. 1. Окно
программы
: Разработка функционала
проекта.
1.Процесс разработки функционала проекта начнем с
создания кода, вычисляющего значение функции sin(х) (синус) с точностью Ɛ = 10-6
с помощью бесконечного ряда Тейлора по формуле
+…
Рассмотрим алгоритм решения.
Данный ряд является сходящимся,
т.е. каждое его слагаемое становится все меньше с возрастанием n. В результате,
при больших n слагаемые становятся очень маленькими, сравнимыми с точностью Ɛ,
и общая сумма при добавлении их практически не меняется.
Для достижения заданной точности
требуется суммировать члены ряда, абсолютная величина которых больше Ɛ. Как
только модуль члена ряда становится меньше Ɛ, вычисления прекращаются.
Алгоритм решения задачи выглядит
так: задать начальное значение суммы ряда, а затем многократно вычислять
очередной член ряда и добавлять его к ранее найденной сумме. Вычисления
заканчиваются, когда абсолютная величина очередного члена ряда станет меньше
заданной точности.
Прямое вычисление члена ряда по
приведенной общей формуле, когда х возводится в степень, вычисляется факториал,
а затем числитель делится на знаменатель, неэффективно. Как легко заметить, при
вычислении очередного члена ряда нам уже известен предыдущий, поэтому вычислять
каждый член ряда «от печки» нерационально.
Для уменьшения количества
выполняемых действий следует воспользоваться рекуррентной формулой получения
последующего члена ряда через предыдущий:
Cn+1 = Cn*
T ,где Т — некоторый множитель. Из нашей формулы ряда видно, что Т=
Перед разработкой кода, сделаем
следующие важные замечания:
§
Для реализации кода будем использовать процедуру.
Для оптимизации кода воспользуемся таким средством языка,
как процедура или функция, которое позволяет написать код единожды, а
выполнить его множество раз.
§
Каковы будут параметры нашей процедуры?
Кроме входных параметров: аргумент
и точность, необходимо определить выходной параметр для результата (значения
функции). Выходной параметр объявляется с ключевым словом out. Для каждого
параметра обязательно указывать тип и имя. Для нашей процедуры подойдет тип
Double § Необходим ли нашей процедуре модификатор
доступа?
Из четырех его возможных
значений, нам пока интересны только два - public и private. Модификатор public
показывает, что данный код открыт и доступен для вызова всеми клиентами и
потомками класса, где он расположен. Модификатор private говорит, что код
предназначен для внутреннего использования в классе и доступен для вызова
только в теле методов самого класса. Заметьте, если модификатор доступа опущен,
то по умолчанию предполагается, что он имеет значение private и код является
закрытым.
В нашем случае, сделаем наш код открытым для вызова, т.е.
укажем его с модификатором public.
§
Каковы основные особенности написания процедуры?
Основное на что следует обратить внимание при написании
процедуры – это обязательное присвоение результата вычислений выходному
параметру, объявленному со словом out.
§
Где разместить код процедуры?
Напомним, что в C# процедуры и функции существуют
только как методы некоторого класса, они не существуют вне класса. Поэтому,
размещайте код процедуры внутри кода класса формы Form1 (Windows Forms
приложение) или класса Program (консольное приложение)
Учитывая все эти замечания, синтаксис объявления нашей
процедуры, вычисляющей функцию sin(x), приведен в листинге 1.
Листинг 1. Пользовательская процедура sinus()
public
void sinus(double x, double e, out double res)
{ double slag = x, sum=x;
for (int n=1;
Math.Abs(slag)>e; n++) { slag=slag*(x*x/(2*n*(2*n+1)));
slag = -1 * slag;
sum+=slag;
}
res=sum;
}
2. Продолжим разработку функционала
проекта созданием стандартной функции обработки события Click для кнопки
Вычислить функцию (buttonl).
Функция button1_ciick вызывает
пользовательскую процедуру sinus(),результат расчета выводится в поле
компонента label5.
Обратите внимание, что вызов
процедуры является отдельным оператором. При вызове перед выходным параметром r
обязательно указывать слово out! Исходные данные координат (x и y) вводятся
из полей редактирования TextBox путем обращения к свойству Text.
Код процедуры приведен в листинге 2.
Листинг
2. Обработки события Click для кнопки Вычисление функции
private void button1_Click(object sender,
EventArgs e)
{ double r; try
{
double x = Convert.ToDouble(textBox1.Text);
double eps =
Convert.ToDouble(textBox2.Text); sinus(x, eps, out r);
label3.Text = r.ToString("n2");
}
catch (Exception exc)
{ MessageBox.Show("Неверно введены
данные"); }
}
В приведенном коде предусмотрена обработка исключительных
ситуаций, возникающих при неверном вводе исходных данных. Обработка
осуществляется с помощью оператора Try – Catch, который в случае возникновения
исключительной ситуации перехватывает управление и выдает сообщение «Неверно
введены данные».
Замечание.
Вы можете самостоятельно добавить процедуры обработки событий
TextChanged и KeyPress для компонентов TextBox, чтобы исключить неправильный
ввод исходных данных.
& Компиляция и отладка проекта. Тестирование
проекта.
Запустите на выполнение проект.
Выполните его отладку. Протестируйте работу приложения при различных исходных
данных.
:þ Упражнения для самостоятельной
работы.
В
приложении вычисляется математическая функция от заданного аргумента с заданной
точностью Ɛ с помощью бесконечного ряда Тейлора по формуле. Вычисление самой
функции реализуйте с помощью процедуры.
Вариант 1
x1 1 1 1 1
ln x1
2n0 (2т1)x2n1
(x
3x3
5x5 ...), |
x |1.
Вариант 2 ex n0 (1)nn xn 1x
x22! x3!3
x44 ..., | x
|.
Вариант 3
x
xn 1x
x2
x3
x4 ...,
e n0 n! 2! 3! 4! | x
|.
Вариант 4
ln(x1)
n0 (1n)n x1n1 x
x22
x33 x44 ..., 1x1.
Вариант 5
ln1x
2
x2n1
2(x
x3
x5 ....)
1x n0 2n1 3 5 |
x |1
Вариант
6
xn x2 x4
ln(1x) (x ...)
n1 n 2 4 1x1|
Вариант 7
(1)n1x2n1 x3 x5
arcctgx
x
....,
2 n0 2n1 2 3 5 |x|<=1
Вариант 8
(1)n0
1 1 1
arctgx
2
n0 (2n1)x2n1
2
x
3x3
5x5 ...,
x 0
Вариант
9
(1)n x2n1 x3 x5 x7
arctgx
x ..., n0 (2n1) 3 5 7 | x |1
Вариант 10
x2n1 x3 x5 x7
Arthx
x
...,
n0 2n1
3 5 7
|
x |1
Вариант 11
1 1 1 1
Arthx
(2n1)x2n1
x
3x3
5x5 ..., |
x |1
n0
Вариант 12
(1)n1
1 1 1
arctgx
2
(2n1)x2n1
2
x
3x3
5x5 ...,
x1 n 0
Вариант 13
ex2 (1)nn!x2n
1x2
x24! x3!6
x48! ...,
x
n0
Вариант
14
(1)n x2n x2 x4 x6
cos
xn0 (2n)! 1 2! 4! 6! K, | x |
Вариант 15
(x1)2n1
x1 (x1)3 (x1)
ln x
2
(2n1)(x1)2n1
2x
2
3(x1)3
5(x1)5 K,
x
0 n 0
Оставьте свой комментарий
Авторизуйтесь, чтобы задавать вопросы.