- •Содержание
- •Предисловие
- •1. Общие методические указания
- •2. Рабочая программа и методические указания к темам курса
- •2.1 Типы данных
- •2.2.1 Операторы управления
- •If (выражание) оператор_1;
- •2.2.2 Операторы ввода-вывода
- •Контрольные вопросы
- •2.3 Массивы и указатели
- •2.3.1 Указатели
- •2.3.2 Массивы
- •Контрольные вопросы
- •2.4 Типы данных, определяемые пользователем
- •2.4.1 Структуры
- •2.4.2 Перечисления
- •2.4.3 Структуры с битовыми полями
- •2.4.4 Объединение (смесь)
- •Контрольные вопросы
- •2.5 Функции
- •2.5.1 Общие сведения о функциях
- •Способы передачи параметров функции
- •2.5.2 Рекурсивные функции
- •2.5.3 Перегрузка функций
- •2.5.4 Шаблоны функций
- •Контрольные вопросы
- •3. Перечень лабораторных работ
- •Список литературы
- •Давыдов, в.Г. Программирование и основы алгоритмизации [Текст]: учеб. Пособие/ в.Г. Давыдов – м: Высшая школа, 2003. – 447с.: ил.: 22 см. – Библиогр.: с. 442. – 3000 экз. - isbn 5-060-04432-7.
2.4.4 Объединение (смесь)
Объединение (смесь) представляет собой частный случай структуры, все поля которой располагаются по одному и тому же адресу. Формат описания такой же, как и у структуры, только вместо ключевого слова struct используется слово union. Длина объединения равна наибольшей из длин его полей. В каждый момент времени в переменной типа объединение хранится только одно значение, и ответственность за правильное его использование лежит на программисте.
union ind_un {
int i; // требуется 2 байта
double j; // требуется 8 байт
char k; // требуется 1 байт
} m, *mptr=&m;
// Для хранения переменной m типа union ind_un будет выделено // 8-байт (значения double)
Объединения применяют для экономии памяти в тех случаях, когда известно, что больше одного поля одновременно не понадобится:
#include <iostream.h>
int main(){
enum paytype {CARD, CHECK};
paytype ptype;
union payment {
char card[25];
long check;} info;
/* присваивание значений info и ptype */
switch (ptype){
case CARD: cout << “Оплата по карте”<<info.card; break;
case CHECK: cout<< “Оплата чеком”<<info.check; break;
}
return 0;
}
Объединение часто используется в качестве поля структуры, при этом в структуру удобно включать дополнительное поле, определяющее, какой именно элемент объединения используется в каждый момент.
По сравнению со структурами на объединения налагаются некоторые ограничения:
объединение может инициализироваться только значением его первого элемента;
объединение не может содержать битовые поля;
объединение не может содержать виртуальные методы, конструкторы, деструкторы и операцию присваивания;
объединение не может входить в иерархию классов.
Контрольные вопросы
1. Назовите основные отличительные характеристики типа данных «структура».
2. Какие типы полей может содержать структура?
3. Назовите способы обращения к элементам структуры.
4. Назовите способы описания переменных структурного типа.
5. Можно ли присваивать переменной структурного типа структуру?
6. Каковы отличия структуры от перечисления?
7. Каковы отличия структуры от смеси (объединения)?
8. Каковы отличия структуры от массива?
9. Чем отличаются указатели на массив и на структуру?
2.5 Функции
2.5.1 Общие сведения о функциях
Функция в C++ - это логически самостоятельная именованная часть программы, состоящая из нуля (в противном случае) или более операторов, объединённых в исполнимый модуль для решения определённой задачи.
Функции нужны для упрощения структуры программы. Разбив задачу на подзадачи и оформив каждую из них в виде функций, мы делаем программу более гибкой и компактной. Передача в функцию различных аргументов позволяет, записав ее один раз, использовать многократно для разных данных.
Неграмотно написанная функция наряду с аргументами использует и глобальные переменные, которые доступны из любого блока текущего файла.
Для использования функции требуется знать только ее интерфейс (правила обращения и общения). Интерфейс функции определяется ее заголовком, потому что в нем указывается все, что необходимо для ее вызова: имя функции, тип результата, который она возвращает, а также сколько аргументов и какого типа ей нужно передать.
Все, что передается в функцию и обратно, должно отражаться в заголовке (объявлении, прототипе). Это не требование синтаксиса, а хорошего стиля.
Формат простейшего заголовка функции:
тип имя ( [ список_параметров ] );
где спецификация тип - задаёт тип возвращаемого функцией значения. Если указание типа отсутствует, то считается, что функция возвращает значение int. Если вместо типа стоит ключевое слово void, то считается, что функция не возвращает в вызывающую программу никакого значения. Особый случай, когда используется тип void* - родовой указатель. В этом случае результат работы функции есть указатель.
Имя - идентификатор произвольного вида, являющийся указателем на функцию, значение которого равно адресу точки входа в функцию.
Список_параметров - это последовательность объявлений формальных параметров, разделённых запятыми. В C++ допускается использование функций без формальных параметров. Такой случай возникает, когда в функцию не передаются никакие аргументы. Тогда поле формальных параметров может быть пустым или содержать ключевое слово Void. Допускается определение формальных параметров по умолчанию (см. ниже.).
При вызове функции с формальными параметрами компилятор вставляет в код программы последовательность машинных команд, обеспечивающих запись, перечисленных в списке аргументов в стек.
Определение функции, кроме заголовка, включает ее тело, т.е. те операторы, которые выполняются при вызове функции.
В тексте программы может содержаться произвольное количество объявлений одной и той же функции и только одно определение. Тело функции представляет собой блок, заключенный в фигурные скобки. Для возврата результата, вычисленного функцией, служит оператор return.
Оператор return - необязательный оператор, обеспечивающий выход из функции. Если оператор return используется совместно с выражением, то выход из функции сопровождается передачей вычисленного значения в точку вызова. Тип результата должен совпадать или быть совместимым с типом функции. При отсутствии оператора return выход из функции происходит после выполнения последнего оператора в теле функции.
Для вызова функции надо указать ее имя, а также передать ей набор аргументов в соответствии с указанным в ее заголовке списком. Соответствие должно соблюдаться строго. В определении, в объявлении и при вызове одной и той же функции типы и порядок следования параметров должны совпадать. Для имен параметров никакого соответствия не требуется.
Вызов функции возвращающей значение определенного типа (не тип void), может быть записан в любом месте, где по синтаксису допустимо выражение – в правой части оператора присваивания, в составе выражения, в цепочке вывода и т.д