Лекция № 2 (слайды)
.pdfСтруктурирование
программы
функциями
Курс «Технология программирования»
Кафедра управления и информатики НИУ «МЭИ»
осенний семестр 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 |