Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Програмиррование по СИ мои ответы на вопросы.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
306.31 Кб
Скачать

Вызов функции

Для обращения к функции используется имя функции.

Формат вызова:

Имя_функции (список),

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

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

Выполнение вызова функции происходит следующим образом.

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

Пример программы

Найти корни уравнения  x = sin2 x / 4 + 0,27 методом итераций с точностью .

Расчетная формула x1 = sin2 x0 / 4 + 0,27, где условие нахождения искомого корня |x1 – x0| <  – x0  начальное значение корня уравнения (обычно принимается равным нулю), x1  значение корня уравнения на следующей итерации,  заданная точность вычисления корня (например, 0.001).

В программе используется старый стиль определения функции:

#include <stdio.h>

#include <math.h> /*Подключение стандартных библиотек*/

#define EPS 0.001 /*Задание точности вычисления корня*/

float root(x, E) /*Заголовок функции с именем root*/

float x,E; /*Описание аргументов функции*/

{          /*Тело функции*/

float x1;

for (x1=pow(sin(x),2)*.25+.27;

fabs (x1−x)>E;

x=x1,

x1=pow(sin(x),2)*.25+.27);

return (x1);

}          /*Завершение описания функции root*/

int main()

{

float x0;

printf ("\n Введите значение x0");

scanf ("%f",&x0);

printf ("\n Корень уравнения %f", root(x0,EPS));

//Вызов функции root()

return 0;

}

20Передача данных в функцию по значению, по указателю, по ссылке.

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

Передача данных по значению

Этот способ передачи данных в подпрограмму является основным и действует по-умолчанию. Фактический параметр вычисляется в вызывающей функции и его значение передаётся на место формального параметра в вызываемой функции. На этом связь между фактическим и формальным параметрами прекращается.

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

Пример 1. Вычислить сумму ряда с заданной точностью ε=10-5:

Для вычисления суммы ряда используем функцию. В неё передадим по значению x и eps. Результат вернём через имя функции оператором return.

Возможный вариант реализации программы:

#include <iostream>

using namespace std;

#include <cmath>

double fsum(double x, double eps);

int main()

{

   double x, s, eps = 1.0e-5;

   cout << "x = ";

   cin >> x;

   s = fsum(x, eps);

   cout << "s = " << s << endl;

   return 0;

}

double fsum(double x, double eps)

{

   double s = x, p = x, i, t = x * x;

   for(i = 3; fabs(p) > eps; i += 2)

   {

      p = -p * t / (i * (i - 1));

      s += p;

   }

   return s;

}

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

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

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

Возможный вариант реализации программы:

#include <iostream>

using namespace std;

void Obmen(double x, double y);

int main()

{

   double a = 2.5, b = 3.1;

   cout << "Do Obmen: a=" << a << " b=" << b << endl;

   Obmen(a, b);

   cout << "Posle Obmen: a=" << a << " b=" << b << endl;

   return 0;

}

void Obmen(double x, double y)

{

   double c;

   cout << "Function Obmen start:\n x=" << x << " y=" << y << endl;

   c = x;

   x = y;

   y = c;

   cout << "Function Obmen end:\n x=" << x << " y=" << y << endl;

}

Результаты выполнения программы:

Do Obmen: a=2.5 b=3.1

Function Obmen start:

x=2.5 y=3.1

Function Obmen end:

x=3.1 y=2.5

Posle Obmen: a=2.5 b=3.1

Вывод на экран значений переменных показывает, что данные в функцию переданы правильно, перестановка в функции произведена, но это ни как не отразилось на значениях исходных переменных a и b после выхода из функции Obmen().

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