Программирование на C# для школьников

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

Показывать лекцию целиком

Основная цель нашего курса – научиться программированию в процедурах и функциях.

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

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

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

    Вернуться к учебному плану