- •Лекция 3 Базовые и производные типы
- •Представление данных
- •Атрибуты данных
- •Типы данных
- •Базовые типы
- •Производные типы
- •Скалярные типы
- •Структурированные типы
- •Описание информационного объекта в программе Определение и объявление объекта
- •Примеры описаний программных объектов
- •Определение и инициализация переменных целых типов
- •Определение и инициализация переменных вещественных типов
- •Определение и инициализация переменных булевского типа
- •Определение и инициализация переменных символьного типа
- •Определение и инициализация переменных-указателей
- •Определение и инициализация переменных-ссылок
- •Форматы некоторых производных типов и их интерпретация
- •Класс памяти информационного объекта
- •Область действия идентификатора информационного объекта программы
- •Примеры использования переменных разных классов памяти
- •Пространство имен
- •Основные правила написания и оформления программ
Структурированные типы
Новые типы данных можно определить на основе ранее определенных типов. Если значения нового типа данных представляют собой совокупность значений компонент, принадлежащих к определенным ранее типам компонент, то новый тип называется структурированным (составным).
Структурированный (агрегатный) тип данных – это тип, характеристиками которого являются: множественность элементов, его структура, способ доступа к элементам, тип элементов и операции с данными этого типа (массивы, структуры, объединения, классы). Множество значений такого типа определяется множеством значений его элементов и их количеством.
Наборы данных не всегда нужно сохранять в памяти исполняемой программы. Нередко обработку набора данных можно выполнить по мере получения элементов этого набора – при вводе, чтении из файла или вычислении элементов. Нередко излишне хранение набора промежуточных данных программы. Например, вычисление минимального элемента матрицы из элементов, максимальных в ее строках, не требует сохранения этих максимальных элементов. Вычисление минимального элемента делается попутно с вычислением максимальных элементов.
Практически невозможно дать рекомендации выбора представления наборов данных в общем случае – этому вопросу необходимо уделять внимание при рассмотрении каждой конкретной задачи.
Описание информационного объекта в программе Определение и объявление объекта
Перед тем, как использовать информационный объект, его нужно описать (определить или объявить):
-
Определения связывают информационные объекты программы с их идентификаторами, резервируют для объектов память и устанавливают их атрибуты.
-
Объявления делают идентификаторы информационных объектов известными компилятору.
-
В программе определение информационного объекта всегда одно, объявлений может быть несколько.
Описание является определением, если:
-
содержит инициализатор;
-
полностью описывает функцию (включает тело функции);
-
описывает объединение или структуру (включая компоненты);
-
описывает класс (включая его компоненты);
Описание является объявлением, если:
-
описывает прототип функции;
-
содержит спецификатор extern;
-
описывает статический компонент класса;
-
описывает имя класса;
-
описывает имя типа, вводимого пользователем (typedef).
Примеры описаний программных объектов
char1 c; //определение символьной переменной
int a; //определение целочисленной переменной
float x, y; //определение вещественных переменных
char* str = "aaaa"; //определение указателя и инициализация его адресом //строкового литерала
struct complex { float re, im; }; //определение структурного типа (структуры)
struct complex1 { int re, im; }; //определение структурного типа (структуры)
complex1 var; //и переменной этого типа
extern complex funt(complex); //объявление функции, которая принимает // в качестве аргумента и возвращает структуру
typedef complex point; //объявление типа point как синонима типа complex
extern int error_number; //объявление переменной типа int
int extern c; //верное !!! объявление переменной типа int
static int a; //определение статической переменной типа int
int static b; // верное !!! определение статической переменной типа int
Но аналогичная запись в классе (если static int а является компонентом класса) только объявляет переменную а как статический компонент класса.
float real(complex* p) { return p->re; }; //определение функции
const double pi = 3.1415926535897932385; //определение и инициализация переменной
double const pi1= 3.141592; //верное !!! определение и инициализация переменной
struct user; //объявление структурного типа user
template<class T> abs(T x) { return х>0 ? -x : x; } //определение шаблона семейства функций
enum beer { Carlsberg, Tuborg, Thor }; //определение перечислимого типа beer и //именованных констант
enum color {red, green=5, blue, black, white}; //определение перечислимого типа color и //именованных констант