Лабораторная работа № 14. Структура и назначение функций
Функция – это совокупность объявлений и операторов, предназначенная для решения определенной задачи. Одно из главных преимуществ, предоставляемых функцией, состоит в том, что она может быть выполнена столько раз, сколько необходимо, в различных местах основной программы.
В любой программе С/C++ должна быть функция с именем main (главная функция или основная программа), именно с этой функции начинается выполнение программы. Другая функция (подпрограмма) может иметь любое имя, не совпадающее с ключевыми словами. После имени записываются формальные аргументы. Если надо передать результат из функции в основную программу, то завершается подпрограмма оператором return.
Чтобы обратиться к функции в основной программе записывается имя функции и фактические аргументы, которые должны соответствовать формальным по типу. При вызове функции управление передается первому оператору тела функции, и начинается выполнение функции, которое продолжается до тех пор, пока не встретится оператор return или последний оператор функции. Управление возвращается в точку основной программы, следующей за точкой вызова.
Задание
| Краткие теоретические сведения
| | 1. Изучить способы организации работы с функциями, выполнив программы, записанные в правой части.
Опробовать работу программы, содержащей функцию, с разными паролями.
| Пример программы, в которой происходит проверка пароля (например, qwerty123)в двух вариантах: без использования функции и с использованием функции check_pass.
Функция может быть записана как до основной программы, так и после. В последнем случае вызов функции следует предварять объявлением (прототипом) этой функции.
В том варианте программы, который содержит функцию, int main() -основная программа, а void check_pass (string password)- функция. Передint main()записан прототип, так как функция расположена после основной программы.
Поскольку в данном примере возвращать результат из функции не нужно, она не содержит оператора return.
include < iostream>
#include < string>
using namespace std;
int main()
{
setlocale (LC_CTYPE, " Russian");
string valid_pass = " qwerty123";
string user_pass;
cout < < " Введите пароль: ";
getline(cin, user_pass);
if (user_pass == valid_pass)
{ cout < < " Доступ разрешен" < < endl; }
else
{ cout < < " Неверный пароль! " < < endl; } return 0;
}
| #include < iostream>
#include < string>
using namespace std;
void check_pass (string password);
int main()
{ setlocale (LC_CTYPE, " Russian");
string user_pass;
cout < < " Введите пароль: ";
getline (cin, user_pass);
check_pass (user_pass); return 0; }
void check_pass (string password)
{ string valid_pass = " qwerty123";
if (password == valid_pass)
{ cout< < " Доступ разрешен" < < endl; }
else
{ cout< < " Неверный пароль" < < endl; } }
| | 2. Изучить использование рекурсий на примере программы, записанной в правой части.
|
Любая функция в программе может быть вызвана рекурсивно, т.е. она может вызывать саму себя.
Пример программы, в которой вычисляется степень числа xn с использованием простой рекурсии для функции power.
| 3. Выполнить программы, записанные в правой части и изучить использование указателей как формальных параметров функции.
| Если внутри функции изменить фактический параметр, переданный из основной программы в функцию, то это изменение в основной программе не будет отражено. Например, пусть надо вычислить несколько значений s = 1! / x + 2! / x +…+ n! / x для x = -2(0.5)0, при этом надо заменить значение х = 0на х = 1. В представленной программе значение s вычисляется с использованием функции ff. В основной программе осуществляется ввод данных, обращение к функции и вывод результатов.
#include < iostream>
using namespace std;
float ff (int n, float x)
{ int F =1; float s=0;
for (int i = 1; i < = n; i++)
{ if (x== 0.0)
{ x=1; cout< < " x =" < < x < < endl; }
F = F * i; s = s+F/x; }
return s;
}
int main()
{ int n;
cout< < " n="; cin> > n; float x=-2.0;
do
{ cout< < " x =" < < x < < " s=" < < ff(n, x)< < endl;
x=x+0.5; }
while (x< =0.0);
}
| #include < iostream>
using namespace std;
float ff (int n, float *x)
{ int F =1; float s=0;
for (int i = 1; i < = n; i++)
{ if (*x== 0.0)
{*x=1; cout< < " x =" < < *x < < endl; }
F = F * i; s = s+F/(*x); }
return s;
}
int main()
{ int n;
cout< < " n="; cin> > n; float x=-2.0;
do
{ cout< < " x =" < < x < < " s=" < < ff(n, & x)< < endl;
x=x+0.5; }
while (x< =0.0);
}
| При выводе результатов видно, что хотя функция считает s при x = 1, в основной программе по-прежнему х = 0.
Чтобы эту ошибку исправить, надо формальный параметр х определить как указатель. Тогда фактический параметр х должен быть явно передан в виде указателя с использованием операции &.
| 4. Выполнить программы, записанные в правой части.
Программа вычисления интеграла демонстрирует использование указателя на функцию, который используется для передачи функции f в качестве формального параметра функции integ.
| Программа вычисления корня уравнения exp(x) - 2 - x = 0методом дихотомии.
| Программа вычисления интеграла
методом правых прямоугольников
| #include < iostream>
#include < math.h>
#define EPS 1e-10
double f (double x)
{ return exp(x) - 2 - x; }
int main()
{
double l = 0, r = 2, c;
while(r - l > EPS)
{ c = (l + r) / 2;
if(f(c) * f(r) < 0) l = c; else r = c;
}
std:: cout< < c;
}
| #include < iostream>
float integ(float (*) (float), float, float, float);
float f(float); //прототипы
int main()
{ float z;
z = integ(f, (float)0.0, (float)10.0, (float)0.01);
std:: cout < < " Integral=" < < z; }
float integ (float (*f) (float), float a, float b, float h)
{ float x, s = 0.0; x = a + h/2.0;
while (x < = b)
{ s += h*f(x); x = x+h; }
return s; }
float f (float x)
{ return (2*x+5); }
| | 5. В соответствии со своим вариантом написать программу решения уравнения из лабораторной работы № 9 методом касательных с использованием функций.
6. Вычислить интеграл из лабораторной работы № 9 в соответствии со своим вариантом для n = 30 методом трапеций. Вычисление значения функции оформить в виде функции, вычисление интеграла – в виде функции. Использовать при этом указатель на функцию. Результат представить в виде таблицы (s, t – параметры, int – значение интеграла, k_iter – количество пересчетов значений интеграла для заданной точности):
s =... t =... int =... k_iter =...
В начало практикума
Вычисление основной дактилоскопической формулы Вычислением основной дактоформулы обычно занимается следователь. Для этого все десять пальцев разбиваются на пять пар...
|
Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...
|
Кардиналистский и ординалистский подходы Кардиналистский (количественный подход) к анализу полезности основан на представлении о возможности измерения различных благ в условных единицах полезности...
|
Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...
|
|
Репродуктивное здоровье, как составляющая часть здоровья человека и общества
Репродуктивное здоровье – это состояние полного физического, умственного и социального благополучия при отсутствии заболеваний репродуктивной системы на всех этапах жизни человека...
Случайной величины Плотностью распределения вероятностей непрерывной случайной величины Х называют функцию f(x) – первую производную от функции распределения F(x):
Понятие плотность распределения вероятностей случайной величины Х для дискретной величины неприменима...
Схема рефлекторной дуги условного слюноотделительного рефлекса При неоднократном сочетании действия предупреждающего сигнала и безусловного пищевого раздражителя формируются...
|
|
ФАКТОРЫ, ВЛИЯЮЩИЕ НА ИЗНОС ДЕТАЛЕЙ, И МЕТОДЫ СНИЖЕНИИ СКОРОСТИ ИЗНАШИВАНИЯ Кроме названных причин разрушений и износов, знание которых можно использовать в системе технического обслуживания и ремонта машин для повышения их долговечности, немаловажное значение имеют знания о причинах разрушения деталей в результате старения...
Различие эмпиризма и рационализма Родоначальником эмпиризма стал английский философ Ф. Бэкон. Основной тезис эмпиризма гласит: в разуме нет ничего такого...
Индекс гингивита (PMA) (Schour, Massler, 1948) Для оценки тяжести гингивита (а в последующем и регистрации динамики процесса) используют папиллярно-маргинально-альвеолярный индекс (РМА)...
|
|