ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 11.04.2025
Просмотров: 163
Скачиваний: 1
Структурирование
программы
функциями
Курс «Технология программирования»
Кафедра управления и информатики НИУ «МЭИ»
осенний семестр 2014 г.
Определение функции
Тип возвращаемого значения. |
Имя функции. |
double area ( |
Параметры и их типы. |
double width, |
• Тип указывается каждому. |
double height ) |
Возврат значения |
{ |
и выход из функции. |
тело |
функции |
return width * height; |
}
double S = area(4, 5); |
// S == 20 |
area(3, 2); |
// 6 (игнорируется) |
Курс ТП, осень 2014 г. |
© Кафедра УиИ НИУ «МЭИ» |
2 |
Пример функции на Pascal
function Find(
Where: array of String; What: String): Integer; begin
Result := Length(Where) – 1;
while (Result >= 0) and (Where [ Result ] <> What) do
˽end; |
Dec(Result); |
|
Если это условие стало ложным, |
||
прекратить можно не только лишь цикл, но и работу функции.
Возвращаемое значение — то, чему в этой точке равна встроенная переменная Result.
Курс ТП, осень 2014 г. |
© Кафедра УиИ НИУ «МЭИ» |
3 |
Пример функции на C++
int find(vector<string> where, string what)
{
for (int i = 0; i < where . size(); ++i)
{
if (where[i] == what)
return i; |
|||
} |
Результат: значение i |
||
при выполнении return. |
|||
return -1;
}
Результат: –1.
Курс ТП, осень 2014 г. |
© Кафедра УиИ НИУ «МЭИ» |
4 |
Оператор return
•Оператор return X:
•указывает, что возвращаемое значение — X;
•производит выход из функции.
•Аналог в Pascal:
Result := X;
Exit;
•Процедура в Pascal = void-функция в C++
•возвращает специальный тип void;
•Возвращаемого значения нет:
return; // выход из void-функции
• Не-void функции обязаны вернуть значение.
Курс ТП, осень 2014 г. |
© Кафедра УиИ НИУ «МЭИ» |
5 |
Выходные переменные
Функция ничего не возвращает (как процедура).
& — амперсанд
void solve_square_equation( double a, double b, double c, double& x1, double& x2)
{
double const D = b*b – 4*a*c; x1 = (–b + sqrt(D)) / (2*a);
x2 = (–b – sqrt(D)) / (2*a);
}
double x1, x2;
solve_square_equation (1, 3, 2, x1, x2); // x1 == -1, x2 == -2
Курс ТП, осень 2014 г. |
© Кафедра УиИ НИУ «МЭИ» |
6 |
Передача по ссылке
•Удобно для возврата нескольких значений.
•Аналог var в Pascal.
•Проблема — читаемость:
double a = 1, b = 3, c = 2, x1 = 0, x2 = 0; solve_square_equation(a, b, c, x1, x2);
// Какие переменные изменились?
Курс ТП, осень 2014 г. |
© Кафедра УиИ НИУ «МЭИ» |
7 |
Параметр-ссылка
• Проблема — обязательность всех аргументов:
void get_statistics( vector<double> samples,
double & mean, double & variance)
{
// Расчет мат. ожидания и дисперсии.
}
vector<double> data { 1, 2, 3, 4, 5 };
double mean; |
Не нужна! |
double variance; get_statistics(data, mean, variance);
Курс ТП, осень 2014 г. |
© Кафедра УиИ НИУ «МЭИ» |
8 |
Параметр-указатель |
|||
void get_statistics( |
|||
vector<double> samples, |
Проверка, передана ли |
||
double* mean, double* variance) |
|||
переменная или nullptr. |
|||
{ |
|||
double mx = …; |
Вместо ненужной |
||
if (mean) |
выходной переменной. |
||
*mean = mx; |
|||
if (variance) { |
|||
// Расчет дисперсии. |
vector<double> data { … }; |
||
} |
|||
double mean; |
|||
} |
|||
get_statistics(data, &mean, nullptr); |
|||
Видно, что mean может измениться. |
|||
Курс ТП, осень 2014 г. |
© Кафедра УиИ НИУ «МЭИ» |
9 |
Что такое указатель?
Все данные хранятся в памяти.
Память — массив нумерованных ячеек-байт.
Номер
называется адресом.
Переменная — именованная область памяти.
У переменных есть адреса.
1)Как получить адрес?
2)Как хранить адрес?
Память: Адреса: 0
Можно считывать и записывать значения
переменных.
Имея адрес ячейки, можно работать с её значением.
Как?
…
8
Курс ТП, осень 2014 г. |
© Кафедра УиИ НИУ «МЭИ» |
10 |
Указатели
•Это переменные, содержащие адрес памяти.
•Указатель pointer:
•pointer — адрес;
•*pointer — значение по адресу (разыменование).
•Переменная mean (не указатель):
•mean — значение;
•&mean — адрес (взятие адреса).
•nullptr == NULL == 0:
•нулевой указатель;
•значение по нему получить нельзя.
Курс ТП, осень 2014 г. |
© Кафедра УиИ НИУ «МЭИ» |
11 |
Тип данных «указатель»
Звездочка перед переменной.
double x = 42; |
! |
double * unknown; |
До присваивания |
значения указывает |
|
double* pointer = &x; |
неизвестно, куда. |
Указатель на double: |
*pointer |
||||||||||
• может хранить адрес double |
|||||||||||
• и только double; |
|||||||||||
• разыменование дает double. |
… |
… |
|||||||||
x = *pointer; |
&x |
||||||||||
Курс ТП, осень 2014 г. |
© Кафедра УиИ НИУ «МЭИ» |
12 |