Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
инфа 2 семестр.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.12 Mб
Скачать

4. Понятие подпрограммы, функции, не возвращающие значения, описание и использование

Смотри пункт 3 +

Если же подпрограмма выдает несколько результатов, то обращение к функции – самостоятельный оператор. Это функции, невозвращающие значение – процедуры. C=n!*(m!*(n-m)!): #include <stdio.h> void pfakt (int k, int *f)

{int j; *f=1; for (j=2; j<=k; j++)

*f=*f*j; return;} void main (void)

{int n, m, c; int f1, f2, f3;

print (“\n введите два исходных целых числа”); scanf (“%d%d”, &n, &m); pfact (n, &f1); pfact (n, &f2); pfact (n-m, &f3); c=f1/f2/f3; print (“\nc=%d”, c);}

5. Передача параметров в подпрограмму, параметры входные и выходные, параметры, передаваемые по значению и по адресу

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

Передача параметров – подстановка фактических параметров вместо формальных при обращении к подпрограмме.

При вызове подпрограммы (обращении к ней) в начале вычисляется выражения, являющиеся формальными параметрами, затем в стеке выделяется память для хранения формальных параметров в соответствии с их типом и каждому из них присваивается значение фактического параметра.

Существует 2 способа передачи параметров – по значению и по адресу.

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

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

В С/С++ параметры по адресу могут передаваться с помощью указателей и с помощью ссылок.

Формальные параметры делятся на входные и выходные.

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

6. Использование подпрограмм, параметры формальные, локальные, глобальные, обращения к подпрограммам, фактические параметры

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

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

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

Если значение какого-то локального параметра необходимо сохранить между вызовами, то этот параметр нужно описать статически (static int n=0). Такая статическая переменная сохраняется не в стеке, а в сегменте данных и инициализируется один раз при первом обращении к подпрограмме.

Глобальные параметры описываются вне функций, в том числе и вне main, поэтому они видны во всех функциях программы и могут использоваться для передачи данных между всеми функциями. Если имена глобальных и локальных параметров совпадают, то внутри функций локальные переменные «заменяют» глобальные, а после выхода из функции значение глобальной переменной восстанавливается. Однако с помощью операции доступа к области видимости (::) можно получить доступ к одноименной глобальной переменной.

7. Рекурсивные подпрограммы, примеры рекурсивных функций в С/С++

Рекурсия (от recursion – возвращение) – самовложение, определяющее объект или явление, внутри которого содержится подобный ему объект или явление. Функцию называют рекурсивной, если она вызывает сама себя в качестве вспомогательной

n!=1 при n=0 и n!=1*2*3*...*n при n>0 это итерационное (итеративное) определение n!=1

при n=0 n!=(n-1)!*n при n>0 – определение рекурсивное

Если подпрограмма обращается сама к себе, то такая рекурсия называется прямой. Если несколько подпрограмм обращаются друг к другу, то такое обращение называется косвенной рекурсией

long fact (long n) { if (n==0 || n==1) return 1; return n*fact (n-1); } long fact (long n) {

return (n>1) ? n*fact(n-1) : 1; }