Опубликован: 28.04.2014 | Доступ: свободный | Студентов: 989 / 89 | Длительность: 01:30:00
Специальности: Программист
Лекция 8:

Процедуры и функции. Процедуры

< Лекция 1 || Лекция 8: 12

Отличия в синтаксисе тела процедуры

В теле функции обязательно присутствие оператора 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 проект для решения следующей задачи:

Известна зарплата трех сотрудников фирмы. Необходимо написать четыре функции, вычисляющие:

  • Среднюю зарплату сотрудников;
  • Максимальную зарплату;
  • Минимальную зарплату;
  • Разность между максимальной и минимальной зарплатой.

Необходимо также написать процедуру, четыре выходных параметра которой вычисляют эти характеристики.

< Лекция 1 || Лекция 8: 12
Дмитрий Лубченков
Дмитрий Лубченков
Николай Молдован
Николай Молдован