Лекция 3
Базовые и производные типы
Представление данных. 1
Типы данных. 2
Базовые типы.. 3
Производные типы.. 4
Скалярные типы.. 4
Структурированные типы.. 4
Описание информационного объекта в программе. 5
Определение и объявление объекта. 5
Примеры описаний программных объектов. 5
Определение и инициализация переменных целых типов. 6
Определение и инициализация переменных вещественных типов. 7
Определение и инициализация переменных булевского типа. 7
Определение и инициализация переменных символьного типа. 7
Определение и инициализация переменных-указателей.. 7
Определение и инициализация переменных-ссылок. 8
Форматы некоторых производных типов и их интерпретация. 9
Атрибуты информационного объекта. 12
Класс памяти информационного объекта. 12
Область действия идентификатора информационного объекта программы 14
Примеры использования переменных разных классов памяти.. 14
Пространство имен.. 17
Основные правила написания и оформления программ.. 18
Представление данных
Данные представляются в программе в виде констант (мы их рассматривали) и переменных.
Переменная:
• абстракция, представляемая в программе идентификатором и связанной с ним ссылкой на начальный байт некоторой области памяти,в которой хранится значение переменной и по которому в программе осуществляется доступ к нему (в результате трансляции имя переменной превращается в адрес некоторого участка памяти и во время выполнения программы оно указывает, или ссылается, на этот участок памяти);
• в каждый конкретный момент времени может иметь только одно значение, которое может изменять в процессе работы программы;
• характеризуется набором некоторых характеристик, называемых атрибутом, и состоянием (значением);
Например, определения переменных:
char symbol;
unsigned short counter;
обеспечивают выделение, соответственно, одного и двух байтов памяти:
Память программы – совокупность переменных, имена которых заданы в программе;
Состояние памяти программы – совокупность состояний (значений) переменных программы.
Память процесса выполнения программы – представляет собой совокупность участков памяти, которые поставлены в соответствие именам переменных, и не равна «памяти программы» (это происходит, например, из-за того, что в процессе выполнения программы дополнительно выделяется, а затем освобождается, память для динамических переменных).
Выбор подходящего представления данных – один из основных вопросов при проектировании программы. При этом под представлением данных понимается их описание на языке программирования в виде констант и переменных разной структуры. Неправильное представление данных может сделать программу ненадежной, неэкономичной, сложной и даже вообще неадекватной задаче. Поэтому при анализе задачи, ее исходных данных и результата, необходимо выбирать экономичный алгоритм ее решения, который и определит представление исходных, промежуточных и конечных данных.
Атрибуты данных
Информационный объект в программе характеризуют его атрибуты:
• имя (идентификатор)
• адрес
• значениев конкретный момент времени
• тип
• класс памяти(определяет местонахождение и время существования памяти, сопоставленной с именемобъекта):
— место размещения (регистр, стек, сегмент данных, динамическая память и т.п.);
— время жизни (постоянное, в течение выполнения программы или временное,
в течение выполнения блока);
— область видимости объекта – часть программы, из которой
допустим обычный доступ к области памяти, связанной с
идентификатором переменной;
• область действия идентификатора-часть программы, в которой идентификатор объекта можно использовать для доступа к связанной с ним области памяти:
Типы данных
Представление данных связано сихтипом. Концепция типа данных основывается на следующих положениях:
l Все данные, а также результаты вычисления выражений или значения, возвращаемые функциями, должны иметь определенный тип.
l Каждая операция или функция требуют аргументов фиксированного типа и выдают результат фиксированного типа. Если операция допускает аргументы нескольких типов, то тип результата можно определить по специальным правилам языка.
Статическая типизация(C, C++, Java) предполагает, что тип значения информационного объекта можно определить по его виду или описанию и для переменных он остается неизменным.
Динамическая типизация(РНР, Perl) предполагает, что тип значения информационного объекта определяется присвоенным или выработанным им значением в момент присваивания (выработки), может быть определен по его значению и для переменных изменен в процессе выполнения программы.
Язык программирования должен:
l иметь стандартные (предопределенные) типы данных;
l иметь возможность описания новых (пользовательских) типов данных:
— простых неструктурированных (путем перечисления значений,
указания интервалов значений и т.п.)
— структурированных (обладать средствами, позволяющими
строить последовательности и наборы: массивы, структуры, файлы и т.д.).
В большинстве случаев новые типы данных определяются
с помощью ранее определенных типов данных.
Тип информационного объекта:
определяет:
• внешнее представлениеобъекта на языке программирования;
• внутреннее представлениеобъекта в памяти компьютера;
• требуемоедля объектаколичество памяти при ее начальном распределении;
• множество значений, которые могут принимать величины этого типа;
• способ доступа к элементамсоставных данных;
• совокупность операций и функций, которые можно применять к величинам этого типа;
• интерпретирует двоичные коды значений при последующих обращениях к информационному объекту;
• используется для контроля типов с целью обнаружения возможных случаев недопустимого присваивания.
С++ обладает средствами, которые позволяют:
l использовать базовые (простые, встроенные, фундаментальные, стандартные) типы данных;
l описывать новые (производные) типы данных.
Базовые типы
К базовым типам относятся:
- арифметические типы
o обобщенные целые (интегральные) типы:
o целые
§ short – короткий целый
§ int –целый
§ long – длинный целый
o символьный
§ char– символьный
§ wchar_t – широкосимвольный
o логический
§ bool
o вещественные типы:
o float – вещественный
o double – вещественный с удвоенной точностью
Таблица 1.6 Базовые типы С++:
название типа | нижняя граница диапазона | верхняя граница диапазона | точность десятичн . разрядов | размер в байтах | |||
bool | false | true | |||||
charsigned char | -128 | ||||||
unsigned char | |||||||
short short intsigned short | -32 768 | 32 767 | |||||
unsigned short | 65 535 | ||||||
intsigned int | -2 147 483 648 | 2 147 483 647 | |||||
unsigned int | 4 294 067 295 | ||||||
longsigned longlong int | 2 147 483 648 | 2 147 483 647 | |||||
unsigned long | 4 294 067 295 | ||||||
float | -3.4*1038 | 3.4*1038 | |||||
double | -1.7*10308 | -1.7*10308 | |||||
void | |||||||
void * | |||||||
Б.Страуструп отмечает, что в большинстве приложений можно обойтись выделенными типами (int, char, bool, double); остальные базовые типы являются вариациями и предназначены для оптимизации и решения специальных задач.
Производные типы
Из базовых типов и типа void, с помощью знаков операций и разделителей *, , [ ], ( ) и механизмов определения типов структурированных данных, можно конструировать множество производных типов.
Производные типы:
- скалярные;
- структурированные;
- функции;
Скалярные типы
К скалярным типам относятся:
- арифметические типы,
- «пустой» тип void,
- указатели,
- ссылки,
- перечисляемый типenum
Перечисляемый тип – это упорядоченный набор именованных элементов, каждый из которых имеет уникальный идентификатор и является константой данного типа. Каждому элементу списка перечисления соответствует значение типа int (начиная с нуля, с последующим увеличением значения (по умолчанию) на единицу).
Объявление перечисляемого типа:
enum имя_типа {значение_1, значение_2, …, значение_n};
Например:
enum color {red, green, blue, black, white}; // определение типа-перечисления
или
enum color {red, green=2, blue, black=7, white}; // определение типа-перечисления
color my_color = red; // определение переменной типа color с инициализацией
Структурированные типы
Новые типы данных можно определить на основе ранее определенных типов. Если значения нового типа данных представляют собой совокупность значений компонент, принадлежащих к определенным ранее типам компонент, то новый тип называется структурированным (составным).
Структурированный (агрегатный) тип данных – это тип, характеристиками которого являются: множественность элементов, его структура, способ доступа к элементам, тип элементов и операции с данными этого типа (массивы, структуры, объединения, классы). Множество значений такого типа определяется множеством значений его элементов и их количеством.
Наборы данных не всегда нужно сохранять в памяти исполняемой программы. Нередко обработку набора данных можно выполнить по мере получения элементов этого набора – при вводе, чтении из файла или вычислении элементов. Нередко излишне хранение набора промежуточных данных программы. Например, вычисление минимального элемента матрицы из элементов, максимальных в ее строках, не требует сохранения этих максимальных элементов. Вычисление минимального элемента делается попутно с вычислением максимальных элементов.
Практически невозможно дать рекомендации выбора представления наборов данных в общем случае – этому вопросу необходимо уделять внимание при рассмотрении каждой конкретной задачи.