Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
15
Добавлен:
09.04.2015
Размер:
212.99 Кб
Скачать

2. Функции, передача параметров

2.1.Определение функции

Функция в Си –это минимально исполняемый модуль программы. Синонимами этого понятия являются процедуры, подпрограммы, подпрограммы-функции, процедуры-функции. Чтобы лучше усвоить основные понятия, связанные с функциями, познакомимся с ними на алгоритмическом уровне. Пусть нам требуется составить алгоритм решения следующей задачи:

Дано: массив вещественных чисел А(10) и массив вещественных чисел В(15). Определить:

(1)

(2)

Если внимательно посмотреть на эти формулы, то можно заметить, что каждая из них решает одну и ту же задачу. В обобщенном виде эту задачу можно выразить как типовую в виде формулы:

(3)

Посмотрим на эти формулы. Что нужно заменить в формуле (3), чтобы получить формулу(1). Очевидно, нужно произвести следующие замены:

Произведя эти замены, получим следующую формулу:

(4)

Совпадает эта формула с формулой (1)? Внимательный читатель может сказать, что эти формулы разные, поскольку в первой формуле используется индексi, а во второй – индексk. Однако, формально эти формулы абсолютно одинаковы, т. к. сумма элементов массива совершенно не зависит от того, какой индекс используется для суммирования. Более того, формально в выражении суммы в формуле(4)вообще нет буквы индекса, т. к. вместо индекса подставляются его значения (в данном случае 0, 1, 2, 3, 4, 5, 6, 7, 8, 9). Поэтому можно смело утверждать, что формулы(1)и(4) абсолютно одинаковы. А теперь посмотрим более внимательно на замены. Одинаковы ли они? Можно заметить, что замены эти разного типа: вместоNподставляетсязначение9 (т. е.N= 9), а вместоsиX подставляются другие обозначения (имена или наименования). Эти два разных способа замены будем называть “замена-по-значению” и “замена-по-наименованию”. Замену- по- наименованию будем обозначать стрелкой( AX), а замену-по-значению будем обозначать операцией присваивания (N= 9). После этого можно сказать: ”Для того, чтобы получить из формулы(4)формулу(2), нужно выполнить:s2s, BX, N = 14.В результате получается формула для решения задачи(1):

Итак, если “кто – то”может решать типовую задачу по формуле(3), то для того, чтобы с“его”помощью решить задачу(1), нужно попросить“его”решить типовую задачу. При этом следует попросить предварительно произвести соответствующие замены. Аналогично для задачи(2). Но кто же этот“кто – то”? Будем считать, что это типовой алгоритм, которому мы дадим имяSum. Но кроме имени нужно ведь как – то сообщить, какие параметры и как будут заменяться. Для этого придумаем заголовок алгоритма, который запишем в виде:

Sum (наим s, наим X, знач N)

где наим s, наим X, знач Nсписок формальных параметров,

наим sформальный параметрs, который заменятся по наименованию,наим Xформальный параметрX, который заменятся по наименованию,знач N - формальный параметрN, который заменятся по значению.

Итак, строка Sum (наим s, наим X, знач N) означает, что имеется алгоритм, реализующий формулу(3). Этот алгоритм с тремя формальными параметрами, которые будут заменяться указанными способами. Да, но как попросить алгоритм произвести решение задачи для конкретных объектов? Для этого вводится обращение к алгоритму, которое в нашем случае запишется в виде:

Sum ( s1,A,9) для формулы(1)Sum ( s2,B,14) для формулы(2),

где s1,A,9 – список фактических параметровдля формулы (1), s2,B,14 - список фактических параметровдля формулы (2).

Строка Sum ( s1,A,9) означает, что нужно выполнить алгоритмSum, предварительно произведя замены:s1s, AX, N=9, а строкаSum ( s2,B,14) означает, что нужно выполнить алгоритмSum, предварительно произведя замены:s2s, BX, N=14. Способы замены указаны в заголовке алгоритма, а кого кем заменять определяется последовательностью перечислений формальных параметров в заголовке алгоритма и в списке формальных параметров в обращении (вызове) к алгоритму. Важно также, чтобы типы формальных и фактических параметров были одинаковы (соответствовали друг другу). На рис.6 представлена блок – схема алгоритма выполнения функции (подпрограммы)Sum. На этом рисунке вместо блоков “Начало” и “Конец” привычного нам отображения алгоритма использованы блоки “Вход” и “Выход”, т. е. при вызове функции мы попадаем на вход функции, а по завершении действий алгоритма функции попадаем на выход.

Однако, как же использовать эту функцию при решении нашей задачи? Блок – схема процесса решения задачи с использованием функции показана на рис.7. На этом рисунке блоки 3 и 5 – блоки вызова функции Sum. При выполнении блока 3 действие основного (главного) алгоритма прекращается и осуществляется переход на вход функцииSum(линия(1)). При этом осуществляется замена формальных параметров фактическими (s1s, AX, N=9). Действие алгоритма функции осуществляется с фактическими параметрами, а при попадании на выход осуществляется переход к блоку, следующему после блока вызова функции (блоку4). Аналогично осуществляются действия при выполнении блока5. Осталось только выяснить, как же технически осуществляется передачапо-наименованиюи передачапо-значению.Передачапо-наименованиюреализуется присваиванием конкретного значения соответствующего формального параметра, который является локальным объектом функции( в нашем случаеN=9илиN=14).

Замена по-наименованиюреализуется присваиванием формальному параметру адреса фактического объекта. В этом случае действия функции выполняются над фактическим объектом. А теперь вернемся к языку Си. Какие объекты языка могут принимать значения адресов объектов? Вспомним предыдущий раздел, в котором мы рассмотрели указатели. Следовательно, формальный параметр, заменяемыйпо-наименованию, должен быть указателем. Этот указатель тоже принимает значение, но этозначение адресафактического объекта, т. е. функции этот фактический объект становится доступным (функция знает, где он находится и может внести в него необходимые изменения). При передаче же параметрапо-значению функция знает только значение параметра, но сам объект функции недоступен.

Итак, список формальных параметров – это набор формальных объектов, которые используются для описания алгоритма, реализуемого функцией. При выполнении функции формальные параметры заменяются фактическими.

Список фактических параметров – это набор реальных объектов, над которыми выполняются действия вызываемой функции. При выполнении функции фактические параметры заменяют формальные.

В Си используются два способа замены формальных параметров фактическими:

  • Замена по значению – передача формальному параметру значения фактического параметра;

  • Замена по наименованию – передача формальному параметру значения адреса фактического параметра.

Можно заметить, что сам механизм передачи одинаков для обоих способов: и в одном и другом способе передается значение, но в первом случае – это передача значения самого объекта, а во втором – передача значения адреса объекта. В обоих случаях при выполнении функции для каждого формального параметра выделяется своя локальная ячейка памяти, в которой на время выполнения функции будет храниться либо значение объекта, либо его адрес.

А теперь рассмотрим программу на Си, реализующую схему, представленную на рис.7:

#include<stdio.h>

#include<conio.h>

Соседние файлы в папке attachments_05-09-2012_18-55-54