ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 11.04.2025

Просмотров: 162

Скачиваний: 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