Основная цель нашего курса – научиться программированию в процедурах и функциях.
Проект для лекции Lesson4.zip
Процедура является обобщением понятия функции. Функция задает отображение входных аргументов в единственное значение, которое возвращается как результат работы функции. Процедура, также как функция, задает отображение входных аргументов в значения выходных аргументов, которых может быть несколько, представляющих результаты работы процедуры.
Всякую функцию можно записать в виде процедуры с одним выходным параметром.
В чем отличие процедуры от функции?
Рассмотрим отличия в синтаксисе записи процедур и функций. Также, как и у функции, в описании процедуры выделяются две части – заголовок и тело. Тело описывает отображение, преобразующее выходные параметры в результаты, заголовок описывает, что же является входом и выходом, имена и типы формальных параметров.
Синтаксис заголовка:
Void <имя процедуры> (<список формальных параметров>)
Ключевое слово void указывает на отсутствие возвращаемого значения.
<формальный параметр> ::= [ref | out]<тип параметра> <имя параметра>
Ключевое слово ref указывается для обновляемых параметров.
Ключевое слово out указывается для выходных параметров.
Для входных параметров ключевое слово не задается.
При описании синтаксиса языков программирования принято использовать синтаксические формулы. В этих формулах используются:
<Заголовок процедуры>
.
<имя процедуры> (<список формальных параметров>). Здесь терминальными символами являются круглые скобки, окружающие понятие списка формальных параметров. Формула говорит, что синтаксис требует, чтобы список был заключен в круглые скобки.|. Совпадает со знаком логической операции "Или" и имеет тот же смысл. Например, формула: + | - | * | / означает, что в этом месте может использоваться знак арифметической операции сложения или вычитания, или умножения, или деления.[ ]. Понятие, заключенное в эти скобки, может присутствовать или быть опущенным. Например, формула [ + | - ] <число>
говорит, что число может быть со знаком, но знак не обязателен и может быть опущен.:: = определения понятия – "это есть" или "по определению". Этот знак используется для определения некоторого понятия синтаксической формулой. Такая формула похожа на оператор присваивания. В левой части формулы стоит определяемое понятия, а справа от знака стоит синтаксическая формула, определяющая это понятие. Рассмотрим выше приведенную формулу:> ::= [ref | out]<тип параметра>
<имя параметра>
.Эта формула говорит, что формальный параметр по определению начинается с одного из ключевых слов ref или out, которые могут быть опущены. Обязательно должен быть задан тип параметра и его имя.В теле функции обязательно присутствие оператора return, который должен быть последним выполняемым оператором, возвращающим значение функции. В теле процедуры оператора return может не быть. Но обязательно должны быть операторы, присваивающие значение каждому выходному параметру.
Синтаксически оператор вызова процедуры подобен вызову функции:
<имя процедуры>(<список фактических параметров>);
Отличие в том, что оператор вызова заканчивается точкой с запятой, как и любой оператор языка.
<фактический параметр> ::= <выражение> | [ref | out ] <имя>
Входной параметр в момент вызова может быть выражением, выходной и обновляемый параметр в момент вызова может быть только именем (не обязательно совпадающим с именем формального параметра, но должен иметь тип, заданный формальным параметром.
Пример
Приведем объявление функции Sum2, вычисляющей сумму двух ее аргументов:
int Sum2(int A, int B) { return A + B; }
Функцию Sum2 можно записать как процедуру, выполняющую те же действия:
void Sum2_Proc(int A, int B, out int result) { result = A + B; }
В заголовке процедуры тип возвращаемого значения изменился на void и добавился выходной параметр с именем result. В теле процедуры оператор return заменен оператором присваивания.
Процедуры и функции по-разному вызываются. Вот как выглядит в Windows проекте, обработчик события, вызывающий функцию Sum2:
private void buttonSum_Click(object sender, EventArgs e) { int A = int.Parse(textBoxA.Text); int B = int.Parse(textBoxB.Text); int result = Sum2(A, B); //Вызов функции - выражение textBoxResult.Text = result.ToString(); }
Обработчик события другой командной кнопки, вызывающий процедуру, устроен так:
private void buttonSumProc_Click(object sender, EventArgs e) { int A = int.Parse(textBoxA.Text); int B = int.Parse(textBoxB.Text); int result; Sum2_Proc(A, B, out result); //Вызов процедуры - оператор textBoxResult.Text = result.ToString(); }
Вызов функции представляет собой выражение, процедуры – оператор.
Давайте построим Windows проект для решения более сложной задачи – задачи 10 из архива задач сайта acmp.ru. В этой задаче методом перебора требуется найти целочисленные корни кубического уравнения: Ax3 + Bx2 + Cx + D = 0.
По ходу решения этой задачи написана процедура:
void FoundRoots(int A, int B, int C, int D, int x, out bool found) { int y = A * x * x * x + B * x * x + C * x + D; found = y == 0; }
Выходной параметр found этой процедуры принимает значение true, если x является корнем уравнения.
Поскольку у этой процедуры только один выходной параметр, то вместо процедуры можно было бы написать соответствующую функцию, возвращающую результат булевского типа.
Основные действия по перебору возможных целочисленных значений параметра x вынесены в обработчик события командной кнопки. Вот его код:
private void buttonRoots_Click(object sender, EventArgs e) { int A = int.Parse(textBoxA.Text); int B = int.Parse(textBoxB.Text); int C = int.Parse(textBoxC.Text); int D = int.Parse(textBoxD.Text); int min = int.Parse(textBoxMin.Text); int max = int.Parse(textBoxMax.Text); bool found; richTextBoxResult.Text = ""; for(int x = min; x <= max; x++) { FoundRoots(A, B, C, D, x, out found); if (found) richTextBoxResult.AppendText("Корень = " + x + "\r\n"); } if (richTextBoxResult.Text == "") richTextBoxResult.Text = "Уравнение не имеет целочисленных корней в данном интервале"; }
Подробное объяснение алгоритма решения этой задачи дано в видео лекции этого урока. Заметим, что приведенное решение подходит для уравнений, имеющих целочисленные корни. При задании коэффициентов уравнения случайным образом корни, скорее всего, не будут целочисленными и данным алгоритмом не будут найдены, о чем и появится соответствующее сообщение. Но целочисленные корни, если они имеются у кубического уравнения, данный алгоритм обнаруживает.
Задание 1
Построить Windows проект для решения следующей задачи:
Известна зарплата трех сотрудников фирмы. Необходимо написать четыре функции, вычисляющие:
Необходимо также написать процедуру, четыре выходных параметра которой вычисляют эти характеристики.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.