
Tipy_dannykh_S.ppt
- Количество слайдов: 32
Типы данных С++
Концепция типа данных Основная цель любой программы состоит в обработке данных. Данные различного типа хранятся и обрабатываются по-разному. В любом алгоритмическом языке каждая константа, переменная, результат вычисления выражения или функции должны иметь определенный тип. Тип данных определяет: • внутреннее представление данных в памяти компьютера; • множество значений, которые могут принимать величины этого типа; • операции и функции, которые можно применять к величинам этого типа. Исходя из этих характеристик, программист выбирает тип каждой величины, используемой в программе для представления реальных объектов. Обязательное описание типа позволяет компилятору производить проверку допустимости различных конструкций программы. От выбора типа величины зависит последовательность машинных команд, построенная компилятором.
Все типы языка С++ можно разделить на простые (скалярные), составные (агрегатные) и функциональные. Простые типы могут быть стандартными и определенными программистом. В языке С++ определено шесть стандартных простых типов данных для представления целых, вещественных, символьных и логических величин. На основе этих типов, а также массивов и указателей (указатель не является самостоятельным типом, он всегда связан с каким-либо другим конкретным типом), программист может вводить описание собственных простых или структурированных типов. К структурированным типам относятся перечисления, функции, структуры, объединения и классы.
Простые типы данных Простые типы делятся на целочисленные типы и типы с плавающей точкой. Для описания стандартных типов определены следующие ключевые слова: • int (целый); • char (символьный); • wchar_t (расширенный символьный); • bool (логический); • float (вещественный); • double (вещественный с двойной точностью).
Спецификаторы Существует четыре спецификатора типа, уточняющих внутреннее представление и диапазон значений стандартных типов: • • short (короткий); long (длинный); signed (со знаком); unsigned (без знака).
Целый тип (int) Размер типа int стандартом ANSI не определяется. Он зависит от реализации. Для 16 -разрядного процессора под величины этого типа отводится 2 байта, для 32 -разрядного — 4 байта. Спецификатор short перед именем типа указывает компилятору, что под число требуется отвести 2 байта. Спецификатор long означает, что целая величина будет занимать 4 байта. Внутреннее представление величины целого типа — целое число в двоичном коде. При использовании спецификатора signed старший бит числа интерпретируется как знаковый (0 — положительное число, 1 — отрицательное). Спецификатор unsigned позволяет представлять только положительные числа. Диапазоны значений величин целого типа с различными спецификаторами для IBM PC-совместимых компьютеров приведены в таблице 1. 4. • По умолчанию все целочисленные типы считаются знаковыми. Константам, встречающимся в программе, приписывается тип в соответствии с их видом. Программист может явно указать требуемый тип с помощью суффиксов L, l (long) и U, u (unsigned). Например, константа 32 L имеет тип long и занимает 4 байта. ПРИМЕЧАНИЕ Типы short int, long int, signed int и unsigned int можно сокращать до short, long, signed и unsigned соответственно.
Символьный тип (char) Под величину символьного типа отводится количество байт, достаточное для размещения любого символа из набора символов для данного компьютера. Как правило, это 1 байт. Тип char, как и другие целые типы, может быть со знаком или без знака. В величинах со знаком можно хранить значения в диапазоне от – 128 до 127. При использовании спецификатора unsigned значения могут находиться в пределах от 0 до 255. Величины типа char применяются также для хранения целых чисел, не превышающих границы указанных диапазонов.
Расширенный символьный тип (wchar_t) Тип wchar_t предназначен для работы с набором символов, для кодировки которых недостаточно 1 байта, например, Unicode. Размер этого типа зависит от реализации; как правило, он соответствует типу short.
Логический тип (bool) Величины логического типа могут принимать только значения true и false. Внутренняя форма представления значения false — 0 (нуль). Любое другое значение интерпретируется как true. При преобразовании к целому типу true имеет значение 1.
Типы с плавающей точкой (float, double и longdouble) Стандарт С++ определяет три типа данных для хранения вещественных значений: float, double и longdouble. Внутреннее представление вещественного числа состоит из мантиссы и порядка. Длина мантиссы определяет точность числа, а длина порядка — его диапазон.
ПРЕДСТАВЛЕНИЕ ЦЕЛЫХ ЧИСЕЛ В ФОРМАТЕ С ПЛАВАЮЩЕЙ ЗАПЯТОЙ Вещественные числа хранятся и обрабатываются в компьютере в формате с плавающей запятой (положение запятой в записи числа может изменяться). Формат чисел с плавающей запятой базируется на экспоненциальной форме записи: А = m qn, где m – мантисса числа, q – основание системы счисления, n – порядок числа. Для однозначности представления чисел с плавающей запятой используется нормализованная форма, при которой мантисса отвечает условию: 1/n ≤ |m| < 1, т. е. мантисса должна быть правильной дробью и иметь после запятой цифру, отличную от нуля.
ПРИВЕДЕНИЕ ЧИСЛА С ПЛАВАЮЩЕЙ ЗАПЯТОЙ К НОРМАЛИЗОВАННОЙ ФОРМЕ Преобразуем десятичное число 888, 888 в экспоненциальную форму с нормализованной мантиссой: 888, 888 = 0, 888888 103 Нормализованная мантисса m = 0, 888888, порядок n = 3. Число в форме с плавающей запятой занимает в памяти компьютера четыре байта (число обычной точности) или восемь байтов (число двойной точности). При записи числа с плавающей запятой выделяются разряды для хранения знака мантиссы, знака порядка, порядка и мантиссы. Диапазон изменения чисел определяется количеством разрядов, отведенных для хранения порядка числа, а точность (количество значащих цифр) определяется количеством разрядов, отведенных для хранения мантиссы.
ОПРЕДЕЛЕНИЕ МАКСИМАЛЬНОГО ЧИСЛА И ЕГО ТОЧНОСТИ Задача. Определить максимальное число и его точность для формата чисел обычной точности, если для хранения порядка и его знака отводится 8 разрядов, а для хранения мантиссы и ее знака – 24 разряда. 0 1 1 1 1 0 1 знак и порядок 1 1 1 1 1 1 знак и мантисса Максимальное значение порядка числа составит 11111112 = 12710, следовательно, максимальное число: 2127 = 1, 7014118346046923173168730371588 1038. Максимальное значение положительной мантиссы: 223 – 1 ≈ 223 = 2(10 2, 3) ≈ 10002, 3 = 10(3 2, 3) ≈ 107. Максимальное значение чисел обычной точности с учетом возможной точности вычислений составит 1, 701411 1038, т. к. количество значащих цифр десятичного числа ограничено 7 разрядами).
в старшем бите 1 -го байта хранится знак порядка числа 0 – обозначает плюс, 1 – минус; 7 бит содержат порядок; в следующих трех байтах, хранятся значащие цифры мантиссы и её знака (24 разряда).
Тип void используется для определения функций, которые не возвращают значения, для указания пустого списка аргументов функции, как базовый тип для указателей и в операции приведения типов.
Таблица 1. 3. Диапазоны значений простых типов данных для IBM PC Тип Диапазон значений Размер (байт) bool true и false 1 signed char – 128. . 127 1 unsigned char 0. . 255 1 signed short int – 32 768. . 32 767 2 unsigned short int 0. . 65 535 2 signed long int – 2 147 483 648. . 2 147 483 647 4 unsigned long int 0. . 4 294 967 295 4 float 3. 4 e– 38. . 3. 4 e+38 4 double 1. 7 e– 308. . 1. 7 e+308 8 long double 3. 4 e– 4932. . 3. 4 e+4932 10 Для вещественных типов в таблице приведены абсолютные величины минимальных и максимальных значений.
Структура программы, особенности, синтаксис языка С++
Программа на языке С++ состоит из директив препроцессора, указаний компилятору, объявлений переменных и/или констант, объявлений и определений функций. Одна из функций должна иметь имя main. Выполнение программы начинается с первого оператора этой функции. Простейшее определение функции имеет следующий формат: 1 2 3 тип возвращаемого значения имя ([ параметры ]) { операторы, составляющие тело функции } * если у функции параметров нет – просто пустые скобки () ** если функция не возвращает никакого значения – тип void
Структура простой программы: директивы препроцессора описания int main(){ операторы главной функции }
Первая строка этой программы — директива препроцессора, по которой в текст программы вставляется заголовочный файл, содержащий описание использованных в программе функций. Все директивы препроцессора начинаются со знака #. Например: #include
Далее идёт функция main. Она начинается с объявления int main() что значит: «функция с именем main, которая возвращает целое число (число типа int от англ. integer number) и у которой нет аргументов ().
Далее открываются фигурные скобки и идёт описание этой функции, в конце фигурные скобки закрываются. Функция main — эта главная функция вашей программы, именно она начинает выполняться, когда ваша программа запускается. Между фигурных скобок находится тело функции, в котором описана последовательность действий, производимых данной функцией — логика функции.
Макроподстановки реализуются директивой #define, которая имеет следующий синтаксис: #define <идентификатор> <текст> Директива #define заменяет все вхождения идентификатора в исходном файле на текст, следующий в директиве за идентификатором. Этот процесс называется макроподстановкой. Пример #define N 100
Объявление переменной имеет следующий формат: [модификаторы] спецификатор_типа идентификатор [, идентификатор]. . . Модификаторы - ключевые слова signed, unsigned, short, long. Спецификатор типа - ключевое слово char или int, определяющее тип объявляемой переменной. Идентификатор - имя переменной. Пример: char x; int a, b, c; unsigned long y; Таким образом, будут объявлены переменные x, a, b, c, y. В переменную x можно будет записывать значения от -128 до 127. В переменные a, b, c - от -32768 до +32767. В переменную y - от 0 до 18446744073709551615.
Инициализация значения переменной при объявлении При объявлении переменную можно проинициализировать, то есть присвоить ей начальное значение. Сделать это можно следующим образом. int x = 100; Таким образом, в переменную x при объявлении сразу же будет записано число 100.
Константы Переменная любого типа может быть объявлена как немодифицируемая. Это достигается добавлением ключевого слова const к спецификатору типа. Переменные с типом const представляют собой данные, используемые только для чтения, то есть этой переменной не может быть присвоено новое значение. Если после слова const отсутствует спецификатор типа, то константы рассматриваются как величины со знаком, и им присваивается тип int или long int в соответствии со значением константы: если константа меньше 32768, то ей присваивается тип int, в противном случае long int. Пример: const long int k = 25; const m = -50; // подразумевается const int m=-50 const n = 100000; // подразумевается const long int n=100000
Присваивание Для присваивания в С++ служит знак "=". Выражение, стоящее справа от знака присваивания, вычисляется, и полученное значение присваивается переменной, стоящей слева от знака присваивания. При этом предыдущее значение, хранящееся в переменной, стирается и заменяется на новое. Оператор "=" не следует понимать как равенство. Например, выражение a = 5; следует читать как "присвоить переменной a значение 5". Примеры: x = 5 + 3; b = a + 4; переменную b) b = b + 2; переменную b) // сложить значения 5 и 3, // результат присвоить переменной x (записать в переменную x) // прибавить 4 к значению, хранящемуся в переменной a, // полученный результат присвоить переменной b (записать в // прибавить 2 к значению, хранящемуся в переменной b, // полученный результат присвоить переменной b (записать в В правой части значение переменной может использоваться несколько раз: c = b * b + 3 * b;
Дополнительные способы присваивания Кроме простого оператора присваивания "=", в Си существует еще несколько комбинированных операторов присваивания: "+=", "-=", "*=", "/=", "%=". Примеры: x += y; // то же, что и x = x + y; - сложить x и y // и записать результат в переменную x x -= y; // то же, что и x = x - y; - отнять от x значение y // и записать результат в переменную x x *= y; // то же, что и x = x * y; - умножить x на y // и записать результат в переменную x x /= y; // то же, что и x = x / y; - разделить x на y // и записать результат в переменную x x %= y; // то же, что и x = x % y; // вычислить целочисленный остаток от деления x на y // и записать результат в переменную x
Инкремент и декремент Если необходимо изменить значение переменной на 1, то используют инкремент или декремент. Инкремент - операция увеличения значения, хранящегося в переменной, на 1. Пример: x++; // значение переменной x будет увеличено на 1 Декремент - операция уменьшения значения, хранящегося в переменной, на 1. Пример: x--; // значение переменной x будет уменьшено на 1 Инкремент и декремент относятся к операциям присваивания. При использовании декремента и инкремента совместно с оператором присваивания "=" применяют постфиксную (x++) или префиксную (++x) запись. Первой выполняется префиксная запись. Примеры: y = x++; Предположим, что в переменной x хранилось значение 5. Тогда в y будет записано значение 5, после чего значение переменной x будет увеличено на 1. Таким образом, в y будет 5, а в x - 6. y = --x; Если в x хранилось значение 5, то сначала будет выполнено уменьшение x до 4, а затем это значение будет присвоено переменной y. Таким образом, x и y будет присвоено значение 4.
Здравствуй, мир! Первая программа, которую мы рассмотрим, — это «Hello World» — программа, которая выведет на экран строчку «Hello, World!» и закончит своё выполнение. #include
Между фигурных скобок находится тело функции, в котором описана последовательность действий, производимых данной функцией — логика функции. Наша функция производит одно единственное действие: printf ("Hello, world!n"); Это действие, в свою очередь, есть вызов функции printf из библиотеки stdio. В результате выполнения этой функции, на экран печатается текст Hello, world!. Обратите внимание на комбинацию "n" — она задаёт специальный символ, который в действительности является командой текстовому терминалу: «перейти на следующую строку» . Таких специальных символов несколько, все они записываются с помощью символа (символ backslash)
Затем идёт команда return 0; которая завершает выполнение функции и возвращает значение 0. Функция main должна возвращать 0 (так как она целого типа int), если выполнение прошло успешно.