- •Н. А. Аленский основы программирования
- •§ 1. Структура простой программы. Ввод, вывод
- •1.1. Пример первой программы
- •1.2. Директива препроцессора #include
- •1.3. Структура программы
- •1.4. Комментарии
- •1.5. Ключевые слова и идентификаторы
- •1.6. Простой ввод, вывод
- •§ 2. Оператор if
- •2.1. Полная форма
- •2.2. Сокращённая форма
- •2.3. Особенности оператора
- •Задачи и упражнения
- •§ 3. Выражения
- •3.1. Константы
- •Непосредственно записать в выражении;
- •3.2. Операции и их приоритет
- •3.3. Операции отношения и логические операции
- •3.4. Особенности операции присваивания
- •3.5. Тернарная операция (?)
- •Задачи и упражнения
- •§ 4. Оператор выбора switch
- •Задачи и упражнения
- •§ 5. Операторы цикла
- •5.1. Оператор while c предусловием
- •Правила использования и особенности оператора while
- •5.2. Оператор цикла do … while c постусловием
- •5.3. Оператор for
- •5.4. Операторы continue и break
- •Задачи и упражнения
- •§ 6. Введение в одномерные массивы
- •6.1. Что такое массив. Объявление одномерного массива
- •6.2. Способы определения массивов
- •6.3. Вывод одномерного массива. Функции printf и сprintf
- •6.4. Некоторые типы простых задач при работе с массивами
- •Задачи и упражнения
- •§ 1. Функции без результатов. Передача параметров по значению
- •1.1. Примеры. Правила оформления и вызова функций
- •Void line2(int Len, y, char ch) // ошибка,
- •1.2. Формальные и фактические параметры
- •1.3. Передача параметров по значению
- •§ 2. Функции типа void с несколькими результатами
- •2.1. Пример
- •2.2. Что такое ссылочный тип
- •2.3. Возврат значений из функции с помощью ссылочного типа
- •Задачи и упражнения
- •§ 3. Функции с одним результатом. Оператор return
- •Задачи и упражнения
- •§ 4. Одномерные массивы в функциях. Сортировка массива
- •Задачи и упражнения.
- •§ 5. Область действия имён. Локальные и глобальные имена
- •§ 6. Дополнительные возможности функций
- •Встраиваемые функции (inlineфункции)
- •6.2. Параметры по умолчанию
- •6.3. Перегрузка функций
- •§ 1. Примеры
- •§ 2. Класс. Поля и методы класса
- •§ 3. Создание объектов. Конструктор
- •Задачи и упражнения.
- •Глава 4 простые типы данных § 1. Целый тип
- •1.1. Битовые операции
- •1.2. Использование битовых операций
- •1.3. Упаковка и распаковка информации
- •Задачи и упражнения.
- •§ 2. Логический тип
- •§ 3. Символьный тип
- •Глава 5 матрицы (двухмерные массивы) § 1. Объявление, способы определения
- •§ 2. Вывод матриц
- •§ 3. Типы алгоритмов на обработку матриц
- •3.1. Построчная обработка
- •3.2. Обработка матрицы по столбцам
- •3.3. Обработка всей матрицы
- •3.4. Обработка части матрицы
- •3.5. Преобразование матрицы
- •Упражнения.
- •3.6. Построение матриц
- •§ 4. Передача матрицы в качестве параметра функции
- •Задачи и упражнения.
- •Б. Обработка матрицы по столбцам.
- •Даны две матрицы a и b одинаковой размерности. Построить матрицу с, каждый элемент которой определяется по правилу:
- •Список рекомендуемой литературы
- •Сборники задач по программированию
- •Оглавление
- •Задачи и упражнения …….……………………………………...12
- •3.1. Константы ………………………………………………...…14
§ 6. Дополнительные возможности функций
-
Встраиваемые функции (inlineфункции)
В первом примере § 4 такими функциями являются DIGIT и RR. Для встраиваемой функции не разделяется прототип и текст функции. На месте прототипа после заголовка сразу в фигурных скобках записываем и текст функции. Перед заголовком функции при этом можно писать ключевое слово inline, которое не является обязательным.
Обычные функции вызываются следующим образом. Если встречается обращение к ней, запоминается место (точка) вызова, управление передаётся на код функции, она выполняется и управление возвращается в место вызова. При этом функция может возвращать значения одного или нескольких параметров. При этом код функции хранится в единственном экземпляре. Поэтому преимущество таких функций в экономии памяти. Но генерация вызова функции, передача параметров и возвращение результатов занимает определённое время.
Главная особенность встраиваемых функций в том, что она не вызывается, а тело такой функции встраивается в программу в каждую точку вызова.
Например,
int InFun (int n, int k) // ‘;’ не пишется
{ return ! (n%k); }
Тогда если встретится, например, вызов
int N=15;
if ( InFun(N, 2)) cout<< N <<” -- чётное”;
else cout<<N <<” – нечётное”;
то на самом деле это функционально идентично
if (!(N% 2)) cout<< N <<” -- чётное”;
else cout<< N <<” – нечётное”;
Поэтому такие функции выполняются быстрее. Недостаток в том, что если встраиваемые функции часто вызываются и они большие, то возрастает объём наших программ. Поэтому встраиваемыми функциями имеет смысл оформлять небольшие относительно функции. Некоторые компиляторы запрещают оформлять функцию как встраиваемую, если, например, она содержит циклы, оператор switch и другие конструкции, увеличивающие объём кода.
6.2. Параметры по умолчанию
В прототипе или при описании функции в её заголовке одному или нескольким формальным параметрам может быть назначено значение по умолчанию по тем же правилам, что при инициализации. При вызове таких функций фактические параметры, соответствующие умалчиваемым, могут быть опущены, и тогда функция будет выполняться с теми значениями, которые указаны в заголовке. Значение по умолчанию можно изменить, записав при вызове фактический вместо умалчиваемого параметра. Остальные фактические параметры должны быть обязательно заданы. Например, функцию с заголовком void fun62 (float f, char ch=’*’, int i=2); можно вызвать одним из следующих способов:
а) fun62 (2.5, ‘-‘, 11); // параметры получат значения: f=2.5, ch=’-‘, i=11;
б) fun62 (2.5, 196); // f=2.5, ch — символ с кодом 196, i=2 по умолчанию;
в) fun62 (196); // f=196 как вещественное, сh=’*’ и i=2 по умолчанию;
г) fun62(0.01, ‘*’, 33); // f=0.01, ch=’*’, i=33;
При передаче параметров по умолчанию необходимо руководствоваться следующими правилами:
-
значение по умолчанию может быть задано либо в прототипе, либо при описании функции, но только в одном месте один раз;
-
в качестве умалчиваемых значений должны быть либо константы, либо глобальные переменные;
-
параметры со значениями по умолчанию должны быть последними в списке;
-
если при вызове функции опустили аргумент для параметра по умолчанию, то не надо писать аргумент и для всех оставшихся в списке. Например, если для функции fun62 надо изменить i на 196, то fun62 (0.11, 196); компилируется из-за совместимости целого и символьного типов, но неправильно выполняется, так как i останется по умолчанию (см. б)), а fun62(0.11 , , 196) не компилируется. Правильным будет следующий вызов: fun62(0.11 , ’*’ , 196);
Поэтому рекомендуется упорядочить умалчиваемые параметры по частоте их изменения. Например, если строка меняется чаще, чем символ, а вероятность изменения целого числа наименьшая, то задаём следующий порядок параметров:
int test=2;
void Out62(float f1, char str2[]="hello", char c3='*', int p4=test )
{ textcolor(12);
cprintf("%f %s %c %d\n\r", f1, str2, c3, p4);
}
int main(int argc, char* argv[])
{ Out62(11,"MMF",65);
Out62(11);
int q1=1111; Out62(q1,";",196 ,9);
// Целое число можно передать вместо вещественного f1
getch(); return 0;
}
Успешная компиляция и выполнение последней программы показывают, что в качестве параметра по умолчанию можно использовать и строку.
Упражнение. Определить результат выполнения последней программы.