Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
(это программирование 2й семестр).docx
Скачиваний:
39
Добавлен:
15.05.2015
Размер:
45.99 Кб
Скачать
  1. Передача в функцию одномерных массивов.

    1. Чтобы передать одномерный массив в функцию необходимо указать имя массива.

    2. int a[20];

    3. f(a, 20);

    4. С++ автоматически передает массив, используя моделируемые ссылки.

    5. Но они могут изменить исходный массив.

    6. Отдельные элементы массива передаются по значению. Для передачи элемента массива в функцию используется имя элемента массива с индексом: f(a[3]);

    7. Чтобы функция могла принять массив, через вызов функции, список параметров должен указывать на необходимость принятия массива.

    8. void f(int b[], int n);

    9. вызов f(b, n);

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

    11. int f(int *a, int n);

    12. вызов: f(a, n);

  2. Передача в функцию двумерных массивов.

    1. В списке параметров число строк не обязательно указывать, но размерность последних индексов указывать обязательно. Это используется компилятором для выделения памяти.

    2. int f(int a[][n], int m, int n);

    3. Вызов: f(a[m][n], m, n);

  3. Понятие рекурсивной функции. Пример рекурсивной функции.

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

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

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

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

Пример: вычислить факториал числа.

n!=n*(n-1)*(n-2)*(n-3)*…*2*1

1!=1 0!=1

#include <iostream>

using namespace std;

unsigned long f(unsigned long);

main()

{

unsigned long int n;

cin>>n;

fact(n);

}

unsigned long f(unsigned long n)

{

if(n==1)

return 1;

else

return n*f(n-1);

}

  1. Перегрузка функций.

    1. Перегрузкой наз-ся использование нескольких функций с одним и тем же именем, но с разными списками параметров.

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

    3. и тем и другим

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

когда одно и то же по смыслу действие реализуется по разному

для различных типов и структур данных.

Компилятор сам определяет какой вариант функции вызвать, определяет он это по списку параметров

    1. Небольшие перегруженные функции удобно применять например при отладке программы

    2. Допустим нам требуется промежуточная печать различного вида

В одном случае требуется выводить структуру

В другом пару целых чисел

В третьем элементы вещественного значения

Проще оформить печать в виде перегруженной функции

При написании перегруженных функций основное внимание

следует обращать на то , чтобы в процессе поиска не возникало какой либо неоднозначности

Неоднозначность может возникнуть по нескольким причинам

Во первых: из за преобразований типов, которые компилятор выполняет по умолчанию

Смысл преобразований сводится к тому, что более короткие типы преобразуются в более длинные

Если соответствие между формальными параметрами на одном и том же этапе

может быть получено более чем одним способом, вызов считается неоднозначным, и выдается сообщение об ошибке