Главная страница
Навигация по странице:

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

  • Рекурсия

  • Не зависят от конкретного компьютера Язык Си


    Скачать 5.8 Mb.
    НазваниеНе зависят от конкретного компьютера Язык Си
    Дата24.10.2022
    Размер5.8 Mb.
    Формат файлаppt
    Имя файлаINFORMATIKA_lektsii_IB-1.ppt
    ТипПрограмма
    #751529
    страница16 из 16
    1   ...   8   9   10   11   12   13   14   15   16
    полиморфизмом.





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


    Набор параметров (сигнатура функции) играет самую важную роль в перегруженных функциях.
    Обратите внимание. Чтобы пользоваться перегруженными функциями их сигнатура обязательно должна быть разной. Иначе компилятор не сможет определить, какую именно функцию необходимо использовать в том или ином случае.
    То есть сигнатуры перегруженных функций должны отличаться количеством и (или) типом параметров, порядком их следования.





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


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





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


    Ограничения на возможность перегрузки функций:
    1. Функции не могут быть перегружены, если они отличаются только типом возвращаемого значения. Поскольку компилятор принимает во внимание только аргументы функций.
    Например, попытка перегрузить функцию таким образом:
    int OverloadFn (char *str);
    char OverloadFn (char *str);
    приведет к появлению ошибки компиляции «Type mismatch in redeclaration».





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


    2. Функции не могут быть перегружены, если их аргументы отличаются только использованием ссылок.
    Например, попытка перегрузить функцию таким образом:
    int OverloadFn (int param);
    int OverloadFn (int ¶m);
    приведет к появлению ошибки компиляции «'OverloadFn (int)' cannot be distingished from 'OverloadFn (int &)'».





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


    3. Функции не могут быть перегружены, если их аргументы отличаются только применением модификаторов const или volatile .
    Например,
    int OverloadFn (int param);
    int OverloadFn (const int param);
    int OverloadFn (volatile int param);
    Модификатор volatile сообщает компилятору, что значение переменной может изменяться периферийным устройством или фоновой процедурой volatile int vInt.





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


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

    int sum(int a, int b);
    float sum(float a, float b);
    int main ()
    {
    int m, n;
    float p, q;
    cout << "m = ";
    cin >> m;
    cout << "n = ";
    cin >> n;
    cout << endl;





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


    cout << "p = ";
    cin >> p;
    cout << "q = ";
    cin >> q;
    cout << endl;
    cout << "m + n = " << sum(m, n) << endl << endl;
    cout << "p + q = " << sum(p, q) << endl;

    }
    int sum(int a, int b)
    {
    return a + b;
    }





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


    float sum(float a, float b)
    {
    return a + b;
    }
    Результат работы программы:





    Рекурсия


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





    Рекурсия


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





    Рекурсия


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





    Рекурсия


    Пример рекурсивного вычисления факториала.
    Рекурсивное решение задачи заключается в многократном вызове функции вычисления факториала из самой этой функции.
    Вычисление 1! является базовой задачей, а также признаком завершения рекурсии.





    Рекурсия



    unsigned long int factorial(unsigned long int);
    int main ()
    {
    setlocale(LC_ALL,"Rus");
    int n; // переменная для передачи введенного числа
    cout << "Введите число: ";
    cin >> n;
    cout << endl;
    cout << n << "!" << " = " << factorial(n) << endl; // вызов рекурсивной функции

    }





    Рекурсия


    // рекурсивная функция для нахождения n!
    unsigned long int factorial(unsigned long int f)
    {
    if (f == 1 || f == 0) // базовая задача
    return 1; // 1!=1 и 0!=1
    else return f * factorial(f - 1); // функция вызывает саму себя, причем ее аргумент с каждым шагом на 1 меньше
    }
    Результат работы программы:

    1   ...   8   9   10   11   12   13   14   15   16


    написать администратору сайта