
Необязательные аргументы функций
При объявлении функций в языке Си++ имеется возможность задать значения аргументов по умолчанию. Первый случай применения этой возможности языка - сокращение записи. Если функция вызывается с одним и тем же значением аргумента в 99% случаев, и это значение достаточно очевидно, можно задать его по умолчанию. Предположим, функция expnt возводит число в произвольную целую положительную степень. Чаще всего она используется для возведения в квадрат. Ее объявление можно записать так:
double expnt (double x, unsigned int e = 2);
Определение функции:
double expnt (double x, unsigned int e){
double result = 1;
for (int i = 0; i < e; i++) result *= x;
return result;
}
Int main(){
double y = expnt(3.14);
double x = expnt(2.9, 5);
return 1;
Использовать аргументы по умолчанию удобно при изменении функции. Если при изменении программы нужно добавить новый аргумент, то для того, чтобы не изменять все вызовы этой функции, можно новый аргумент объявить со значением по умолчанию. В таком случае старые вызовы будут использовать значение по умолчанию, а новые - значения, указанные при вызове.
Необязательных аргументов может быть несколько. Если указан один необязательный аргумент, то либо он должен быть последним в прототипе, либо все аргументы после него должны также иметь значение по умолчанию.
Если для функции задан необязательный аргумент, то фактически задано несколько подписей этой функции. Например, попытка определения двух функций приведет к ошибке компиляции - неоднозначности определения функции:
double expnt (double x, unsigned int e = 2);
double expnt (double x);
Это происходит потому, что вызов double x = expnt(4.1) подходит как для первой, так и для второй функции.
Рекурсия
Определения функций не могут быть вложенными, т.е. нельзя внутри тела одной функции определить тело другой. Разумеется, можно вызвать одну функцию из другой. В том числе функция может вызвать сама себя.
Рассмотрим функцию вычисления факториала целого числа. Ее можно реализовать двумя способами. Первый способ использует итерацию:
int fact(int n){
int result = 1;
for (int i = 1; i <= n; i++) result = result * i;
return result;
}
Второй способ:
int fact(int n) {
if (n == 1) return 1; // факториал 1 равен 1
else return n * fact(n -1); // факториал числа n равен факториалу n-1 умноженному на n
}
Функция fact вызывает сама себя с модифицированными аргументами. Такой способ вычислений называется рекурсией. Рекурсия - это очень мощный метод вычислений. Значительная часть математических функций определяется в рекурсивных терминах. В программировании алгоритмы обработки сложных структур данных также часто бывают рекурсивными.
Задача №1
Разработать
программу табулирования функции
функции
Блок-схема
ask_left_bound (a)
ask_step (h)
func(x)
x-2+sin(1/x)
a=
ask_left_bound
b=
ask_right_bound
h= ask_step
y=func(x)
ask_right_bound (b)
Код программы в C++:
#include "stdafx.h"
#include "stdio.h"
#include "math.h"
float ask_left_bound()
{
printf ("Imput a for [a, b]:\t");
float a;
scanf ("%f",&a);
return a;
}
float ask_right_bound()
{
printf ("Imput b for [a, b]:\t");
float b;
scanf ("%f",&b);
return b;
}
float ask_step()
{
printf ("Imput tabulate step h for [a, b]:\t");
float h;
scanf ("%f",&h);
return h;
}
float func(float x)
{
return x-2+sin(1/x);
}
int main()
{
float a = ask_left_bound();
float b = ask_right_bound();
float h = ask_step();
float y;
for (float x=a; x<=b; x+=h)
{
y=func(x);
printf ("(x, f(x))=(%f,%f)\n",x,y);
}
return 0;
}
Задача №2
Дана последовательность чисел a[i]. Выведите на экран отдельно все отрицательные элементы и их произведение и все положительные элементы и их произведение.
Блок схема