Контрольные вопросы и задания
1) Перечислите этапы жизненного цикла, характерные для любой программы.
2) Что происходит при выполнении этапа «Анализ исходных данных и выбор методов решения, моделирование»?
3) Дайте определение понятию «алгоритм».
4) В каком виде можно представлять алгоритм решении некоторой задачи?
5) Поясните, что происходит на этапе компиляции и поиска синтаксических ошибок жизненного цикла программы.
6) Охарактеризуйте файл объектного кода.
7) Какова схема взаимодействия компонентов M S VS 2008 при создании исполняемой программы?
8) Для чего необходим компоновщик?
9) Перечислите основные элементы интерфейса M S VS 2008.
10) Что подразумевается под проектом в M S VS 2008 и как он создается?
11) Что понимается под решением в M S VS 2008? Дайте краткую характеристику работы с решениями.
12) Дайте определение директивам препроцессора.
ГЛАВА 3
ДАННЫЕ И ИХ ТИПЫ
Переменные
Фундаментальное назначение всех компьютерных программ – манипулируя одними данными, получать некоторые другие данные. Существенным условием для этого процесса является наличие в распоряжении фрагмента памяти, к которому можно обращаться по некоторому осмысленному имени, где можно хранить элемент данных. Каждый фрагмент памяти, специфицированный таким образом, называется переменной.
Каждая переменная хранит данные определенного вида, при этом тип сохраняемых данных фиксируется в программе при объявлении переменной. Конкретное значение, хранимое в переменной в каждый отдельный момент времени, определяется операторами выполняемой программы, и, как правило, значение переменной в процессе вычислений в программе меняется многократно.
Таким образом, можно сформулировать следующее определение для переменной.
Переменная – это поименованная область оперативной памяти определённого размера, которая содержит значение определённого типа, изменяемое в течение работы программы.
Чтобы иметь возможность работать с переменной, её необходимо объявить (описать), то есть сообщить компилятору имя и тип переменной. В этом случае компилятор выделит часть оперативной памяти необходимого размера и логически соединит её с именем для использования. Тип переменной – это служебное (ключевое) слово.
Служебное слово – это зарезервированное словосочетание, имеющее в языке определённый смысл.
Редактор M S VS 2008 подсвечивает все служебные слова определенным цветом при вводе текста программы. Если ключевое (служебное) слово при завершении его ввода не окрашивается соответствующим образом, значит оно введено неправильно. Необходимо помнить, что при вводе ключевых слов, как и в целом программы на языке C++, следует учитывать регистр.
Имя переменной задаётся пользователем, при этом в языке С существуют правила именования переменных, констант и функций. Если им не следовать, компилятор не будет воспринимать заданное имя как имя переменной.
Правила именования переменных и констант:
- имя не должно совпадать со служебным словом;
- имя может содержать только английские буквы, цифры и знак подчёркивания _;
- на первом месте не должна стоять цифра, то есть может стоять буква или знак подчеркивания _;
- строчные и прописные буквы имеют значение.
Все остальные правила, к примеру, венгерская нотация, с которой также можно ознакомиться и при желании использовать, разрабатываются лишь для удобства программистов и не являются обязательными для компилятора. Однако в ряде случаев программисту приходится работать в рамках дополнительных правил, когда это является внутренним требованием компании, на которую он работает.
Объявление переменной – это оператор, имеющий следующую конструкцию:
тип V<список имен>;
При этом пробел будем обозначать знаком V, а <список имен> – это имена переменных, разделённые запятыми.
Значение переменной может быть установлено несколькими способами: инициализацией, присваиванием и вводом с клавиатуры или другого входного потока. Наиболее часто используемым оператором в этом случае является оператор присваивания. Оператор присваивания имеет вид:
имя переменной = <вычисляемое выражение>;
Вычисляемое выражение может быть математическим выражением, вызовом функции, другой переменной или константой. Таким образом, справа от знака = можно использовать знаки операций, парные круглые скобки (), то есть писать выражение по правилам математических выражений из школьного курса математики. Слева можно использовать только имя переменной, так как этот оператор выполняется справа-налево: выражение справа вычисляется и результат помещается в переменную, стоящую слева. Нельзя интерпретировать оператор присваивания как математическое равно (=), они не эквивалентны. С точки зрения математики уравнение написано верно, а с точки зрения программирования нет.
Если одновременно с объявлением переменной ей присваивается значение, то такое действие носит название инициализации.
Чтобы инициализировать переменную, при ее объявлении после имени нужно написать знак равенства, за которым следует инициализирующее значение. Например, можно написать следующие операторы, чтобы присвоить каждой из трех объявляемых переменных начальные значения:
double value = 0.6;
int count = 10;
В данном случае value получает значение 0.6, а count – значение 10.
Существует и другой способ задания начальных значений переменных C++, который называется функциональной нотацией, когда значение задается не через знак равенства, а просто указывается в круглых скобках, следующих за именем переменной. То есть предыдущие объявления для этой нотации можно переписать следующим образом:
double value (0.6);
int count (10);
Типы данных
Диапазон значений, которые может содержать переменная, называется ее типом данных. Все данные и переменные в программе должны относиться к определенному типу данных. Стандарт C++ ISO/ANSI предоставляет набор фундаментальных типов данных, специфицированных определенными ключевыми словами. Фундаментальные типы данных называются так потому, что они хранят значения типов, представляющих основные данные на компьютере – по сути, числовые значения, в которые входят и символы, т.к. они представлены числовыми кодами.
Кроме фундаментальных или стандартных типов данных язык С предоставляет программисту возможность определения собственных типов данных. Разнообразные библиотеки, дополнительно поставляемые с M S VS 2008, также определяют свои типы данных. Но в рамках данного учебного пособия достаточно будет рассмотреть типы данных, представленные в стандарте ISO/ANSI C++.
Фундаментальные типы подразделяются на три основные категории: типы, содержащие целые числа, типы, содержащие нецелочисленные значения, и тип void, указывающий на пустое множество значений или отсутствие типа.
Второе разделение типов данных можно рассматривать с точки зрения сложности организации переменной. По этому признаку типы данных делятся на простые и сложные.
К простому типу данных переменную можно отнести в том случае, если для манипуляций со значением, содержащимся в переменной, достаточно знать лишь ее имя. Если помимо имени необходимы еще какие-то дополнительные сведения, то переменная называется сложной. К простым типам данных можно отнести все фундаментальные типы. К сложным типам относят структуры и массивы.
Тип данных считается определенным, если для него определены: размер памяти, занимаемый переменной, правило интерпретации двоичных значений в значения типа, ограничения, задаваемые разрядной сеткой компьютера и идентификатор типа (служебное слово). Например, если рассматривать тип int, определяющий целые числа, то для него при помощи операции sizeof(int) можно узнать сколько байт выделяется системой для этого типа данных. Так как тип целочисленный, то из 32 бит (8 бит × 4 байта = 32 бита) 1 бит выделяется на знак, а остальные служат для распределения 231 значений от -147483648 до 2147483647.
Тип символьных значений char, занимающий в памяти ПК 1 байт (8 бит), можно интерпретировать как целые значения в диапазоне от 0 до 255. Символы определяются по соответствующим кодам кодировочных таблиц, поэтому в разных кодировках одни и те же числовые коды символов имеют разные символьные значения. Для компьютера первичны коды, хранящиеся в памяти, а для пользователя важны символы, отображаемые при выводе.
Тип float служит для представления вещественных чисел в нормальном виде (с плавающей точкой). Представление числа с плавающей запятой в общем виде определяется выражением
,
где М – мантисса числа; – характеристика числа; р – порядок числа. Мантисса и порядок задаются в системе счисления с основанием s. Знак числа совпадает со знаком мантиссы. По формату IEEE (Institute of Electrical and Electronics Engineers) для того чтобы сохранить максимальную точность, вычислительные машины почти всегда хранят мантиссу в нормализованном виде, что означает, что мантисса в данном случае есть число, лежащее между 1(10) и 2(10) (1£M<2). Основание системы счисления здесь, как уже отмечалось выше,— число 2. Способ хранения мантиссы с плавающей точкой подразумевает, что двоичная запятая находится на фиксированном месте. Фактически подразумевается, что двоичная запятая следует после первой двоичной цифры, т.е. нормализация мантиссы делает единичным первый бит, помещая тем самым значение между единицей и двойкой. Место, отводимое для числа с плавающей точкой, делится на два поля. Одно поле содержит знак и значение мантиссы, а другое содержит знак и значение порядка. Таким образом, на переменную типа float выделяется 4 байта памяти, которые распределяются следующим образом: из 32 бит 1 бит – на знак для мантиссы, 24 бита – для мантиссы, 1 бит – для знака порядка и оставшиеся 6 бит – для порядка. Так, например, типы float и int занимают по 4 байта, но если интерпретировать один и тот же набор нолей и единиц, получим для типа float = 100.1 и для типа int =1120416563 в той же самой ячейке памяти.
Таким образом, любая часть оперативной памяти, содержащая остаточные значения 0 и 1, может быть всегда интерпретирована в зависимости от типа представляемой переменной. Пока переменной не присвоено значение, в ней находится «мусор». То есть в переменной после ее объявления до присвоения ей начального значения всегда находится какое-то «мусорное» значение, поэтому такую переменную нельзя использовать в расчётах, её можно использовать только как результат. Язык С не следит за чистотой содержания переменных, но если попытаться использовать неинициализированную переменную в расчётах, отладчик сообщит об ошибке в процессе выполнения программы под управлением MS VS 2008 (рис. 13).
Рис. 13. Сообщение об ошибке в случае использования
неинициализированной переменной
Основные характеристики фундаментальных типов данных языка С зависят от версии и разрядности операционной системы, установленной на компьютере, а также от используемой программистом интегрированной среды разработки программ. В связи с этим основные характеристики фундаментальных типов данных желательно получать при помощи следующих инструментов: константы граничных значений можно посмотреть в заголовочных в файлах limits.h и float.h, а объем занимаемой типом оперативной памяти можно получить при помощи операции sizeof(операнд), где под операндом понимается тип или имя переменной нужного типа. Для 32-разрядных Windows XP и Windows 7 и M S VS 2008 фундаментальные типы имеют характеристики, сведенные в табл. 1.
Таблица 1
Основные характеристики стандартных типов данных
Спецификатор | Название типа | Объём памяти, байт | Максимально возможное | Минимально возможное | Точность | |||
константа | значение | Константа | значение | константа | значение | |||
int | целый | 4 | INT_MAX | 2147483647 | INT_MIN | -2147483648 | 1 | |
long | 4 | LONG_MAX | 2147483647 | LONG_MIN | -2147483648 | 1 | ||
short | 2 | SHRT_MAX | 32767 | SHRT_MIN | -32768 | 1 | ||
unsigned int | целый положительный | 4 | UINT_MAX | 4294967295 | 0 | 1 | ||
unsigned long | 4 | ULONG_MAX | 4294967295 | 0 | 1 | |||
unsigned short | 2 | USHRT_MAX | 65535 | 0 | 1 | |||
float | вещественный | 4 | FLT_MAX | 3.40282e+038 | FLT_MIN | 1.17549e-038 | FLT_EPSILON | 1.19209e-007 |
double | 8 | DBL_MAX | 1.79769e+308 | DBL_MIN | 2.22507e-308 | DBL_EPSILON | 2.22045e-016 | |
char | символьный | 1 | SCHAR_MAX | 127 | SCHAR_MIN | -128 | 1 | |
unsigned char | 1 | UCHAR_MAX | 255 | 0 | 1 | |||
wchar_t | 2 | 65 535 | 0 | 1 | ||||
bool | логический | 1 | 1 | 0 | 1 |
Константы
Кроме переменных данные могут храниться в константах. Константы бывают двух различных видов: именованные и литералы (неименованные).