Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекция № 2 (слайды)

.pdf
Скачиваний:
8
Добавлен:
31.03.2015
Размер:
542.06 Кб
Скачать

Структурирование

программы

функциями

Курс «Технология программирования»

Кафедра управления и информатики НИУ «МЭИ»

осенний семестр 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