Процедуры и функции. Процедуры
Отличия в синтаксисе тела процедуры
В теле функции обязательно присутствие оператора 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 проект для решения следующей задачи:
Известна зарплата трех сотрудников фирмы. Необходимо написать четыре функции, вычисляющие:
- Среднюю зарплату сотрудников;
- Максимальную зарплату;
- Минимальную зарплату;
- Разность между максимальной и минимальной зарплатой.
Необходимо также написать процедуру, четыре выходных параметра которой вычисляют эти характеристики.