1 Представление данных. 2 Суть объектно-ориентированного программирования заключается в том, что программист создает и совершенствует свои собственные.

Презентация:



Advertisements
Похожие презентации
Лекция 2 С => C++ => C# Большие и маленькие буквы различаются (main, Main, MAIN, mAin – разные имена) После каждого оператора ставится точка с запятой.
Advertisements

План-конспект урока (информатика и икт, 9 класс) по теме: Переменные:тип, имя, значение
Данные в программах и алгоритмах Программы и их алгоритмы пишутся для обработки данных. Чтобы реализовать алгоритм, программам необходимо работать с данными.
Тип, имя и значение переменной.. Переменные. В объектно-ориентированных языках программирования, и в частности в языке Visual Basic, переменные играют.
Переменные, величины Переменные, величины Типы, имена переменных Типы, имена переменных Хранение величин Хранение величин Переменные, величины Переменные,
Объектно-ориентированный язык программирования. Переменная - эта поименованная ячейка памяти, хранящая какое-либо одно значение (одно число, один фрагмент.
Введение в C++ Урок 1-2.
Практическое занятие 6. Функции. Большинство языков программирования используют понятия функции и процедуры. C++ формально не поддерживает понятие процедуры,
Основы алгоритмизации Алгоритмы. Типы алгоритмов. Алгоритмы. Типы алгоритмов. Блок-схемы. Вопросы и задания. Вопросы и задания.
Переменные : имя, значение, тип. Разработал учитель информатики МБОУ СОШ 50 г. Краснодара Ракута Елизавета Григорьевна « Сперва аз да буки, а потом науки.
МАССИВЫ 4 Определение 4 Описание 4 Обращение к элементам массива 4 Связь массивов с указателями 4 Примеры программ.
Лекция 4 Программирование на Паскале. Элементы языка Турбо Паскаль 7.0. Типы данных. Управляющие конструкции.
Представление чисел в компьютере. Числовые данные обрабатываются в компьютере в двоичной системе счисления. Числа хранятся в оперативной памяти в виде.
Тип, имя и значение переменной. В объектно-ориентированных языках программирования переменные играют такую же важную роль, как и в процедурных языках.
Системы счисления, используемые в компьютере. Борисов В.А. КАСК – филиал ФГБОУ ВПО РАНХ и ГС Красноармейск 2011 г.
Лекция 6. Способы адресации в микропроцессорных системах.
Тема урока Переменная. Тип данных. Ввод и вывод данных.
Pascal 1 Основы языка Паскаль Информатика и ИКТ Смирнов М.В. МКО ООШ п. Климковка Белохолуницкого района Кировской области.
Лекция 30. Преобразования типов в C++ Красс Александр СПбГУ ИТМО, 2009.
Познакомиться с основными понятиями языка Pascal 2.
Транксрипт:

1 Представление данных

2 Суть объектно-ориентированного программирования заключается в том, что программист создает и совершенствует свои собственные типы данных. Это означает создание такого типа данных, который бы лучше соответствовал требованиям конкретной задачи программирования. В случае корректного решения проблемы разработки новых типов работа с данными намного упрощается. Но прежде чем читатель сможет создавать свои собственные типы данных, необходимо изучить и понять типы, встроенные в язык C++, поскольку при создании программ используются именно они.

3 Представление данных В языке C++ имеется две группы встроенных типов данных: базовые (fundamental) и составные, или производные (compound). В настоящей лекции вы познакомитесь с базовыми типами данных, которые служат для представления целых чисел и чисел с плавающей точкой. Не следует, однако, считать, что все разнообразие базовых типов данных сводится только к двум перечисленным: ни один тип целочисленных данных и ни один тип данных с плавающей точкой по отдельности не смогут удовлетворить все потребности, возникающие при разработке программ на C++.

4 Представление данных Поэтому в языке C++ существует некоторое количество разновидностей обоих типов данных. В дальнейшем рассмотрим несколько типов данных, которые являются производными от базовых типов данных. К числу этих дополнительных типов относятся массивы, строки, указатели и структуры. Кроме того, программе, конечно же, необходимы средства для идентификации хранимых данных. Мы рассмотрим один из методов решения этой задачи применение переменных, а затем изучим, как в языке C++ выполняются арифметические действия. В завершение читатель ознакомится с преобразованием значений из одного типа в другой.

5 Простые переменные Для хранения в компьютере элемента информации программа должна отслеживать три его основных свойства; в частности, она определяет: где хранится информация какое значение там хранится вид хранящейся информации

6 Имена переменных В C++ существует несколько простых правил именования, которые обязательны для применения: В именах можно использовать только следующие символы: буквы алфавита, цифры и символ подчеркивания (_). Первый символ имени не может быть цифрой. Символы верхнего и нижнего регистров рассматриваются как разные. В качестве имен нельзя использовать ключевые слова языка C++. Имена, начинающиеся с двух символов подчеркивания или с символа подчеркивания и следующей за ним буквы в верхнем регистре, зарезервированы для использования реализацией языка. Имена, начинающиеся с одного символа подчеркивания, зарезервированы для использования реализацией языка в качестве глобальных идентификаторов. В языке C++ на длину имени не накладывается никаких ограничений, т.е. учитывается каждый символ имени.

7 Имена переменных Ниже приводится примеры допустимых и недопустимых имен C++:

8 Целочисленные типы данных Целые числа это числа без дробной части, например 2, 98, или 0. Целых чисел в природе существует очень много (точнее, бесконечное количество), поэтому чтобы вместить их все, не хватит никакой, даже самой большой оперативной памяти компьютера. Следовательно, в любом языке программирования может быть представлена только часть всех целых чисел. В некоторых языках, например Standard Pascal, существует только один тип целочисленных данных (один тип данных для представления всех целых чисел!), однако C++ включает несколько типов таких данных Базовые типы целочисленных данных языка C++ (в порядке возрастания размерности) именуются char, short, int и long. Каждый из этих типов данных подразделяется на две разновидности: со знаком и без знака. В результате программист имеет выбор из восьми различных типов целочисленных данных!

9 Типы данных short int и long Оперативная память компьютера состоит из элементов, называемых битами (разрядами) (см. примечание "Биты и байты"). Располагая различным числом разрядов для хранения значений, типы данных short, int и long могут представлять целые числа трех разных размерностей. В языке C++ предлагается гибкий стандарт с некоторыми гарантированными минимальными размерами: Размерность данных типа short не меньше 16 разрядов. Размерность данных типа int не меньше размерности данных типа short. Размерность данных типа long не меньше 32 разрядов и не меньше размерности данных типа int.

10 БИТЫ И БАЙТЫ Основным элементом памяти компьютера является бит. Бит можно наглядно представить себе в виде электронного переключателя, который можно либо включить, либо выключить. Выключенное состояние представляет значение 0, а включенное 1. Элемент памяти из 8 битов может принимать 256 различных значений. Число 256 получается так: каждый бит имеет два возможных значения, следовательно, общее число возможных значений для 8 битов равно 2 в степени 8, или 256. Таким образом, 8-разрядный элемент памяти может представлять значения в диапазоне от 0 до 255 или в диапазоне от -128 до 127. Каждый дополнительный разряд удваивает количество возможных значений. Таким образом, 16-разрядный элемент памяти может принимать различных значений, а 32-разрядный элемент различных значений.

11 БИТЫ И БАЙТЫ Байт это обычно 8-разрядный элемент памяти. В этом смысле байт является единицей измерения, описывающей объем памяти компьютера; при этом один килобайт равен 1024 байтам, а один мегабайт 1024 Кб. Однако в языке C++ байт определяется иначе. В C++ байт состоит из такого числа смежных битов, которого достаточно для того, чтобы вместить основной набор символов для данной реализации языка. Другими словами, число возможных значений должно быть равно числу возможных символов или превышать его. В США основными наборами символов являются, как правило, наборы символов ASCII или EBCDIC, для представления которых достаточно 8 разрядов. Поэтому в системах, где используются эти наборы символов, один байт языка C++ равен 8 разрядам. Однако при программировании для других стран могут потребоваться расширенные наборы символов, такие как Unicode, поэтому в некоторых реализациях могут использоваться 16-разрядные или даже 32-разрядные байты.

12 Типы данных short int и long В настоящее время во многих системах используются минимальные гарантированные размерности данных. При этом данные типа short имеют размерность 16 разрядов, а данные типа int и long 32 разряда. При объявлении переменных названия этих типов данных используются точно так же, как и обозначение int: short score; // создает целочисленную переменную типа short int temperature; // создает целочисленную переменную типа int long position; // создает целочисленную переменную типа long. Данные этих трех типов: int, sort и long являются данными со знаком. Диапазон их возможных значений разделяется приблизительно поровну между положительными и отрицательными величинами. Например, 16- разрядные данные типа int могут укладываться в диапазон от до

13 Типы данных short int и long Чтобы узнать размерность целых чисел в конкретной системе, следует воспользоваться программными средствами языка C++. Операция sizeof возвращает размерность данных какого-либо типа данных или переменной (в байтах). Операция это встроенный элемент языка, с помощью которого выполняются определенные действия над одним или несколькими элементами данных для получения некоторого результата. Например, операция сложения, представленная знаком +, осуществляет сложение двух чисел. Заголовочный файл climits (в более ранних реализациях limits.h) содержит информацию о предельных значениях целочисленных данных различных типов. В частности, в нем определены символические имена для представления различных предельных значений. Например, в этом файле определена константа int_max, которая является наибольшим возможным значением данных типа int.

14 Типы данных short int и long

15 Типы данных short int и long В результате выполнения программы в среде Microsoft Visual C++ 6,0 получились следующие результаты: int is 4 bytes, short is 2 bytes, long is 4 bytes. Maximum values: int: short: long: Minimum int value = Bits per byte = 8

16 Типы данных short int и long

17 Типы данных short int и long Инициализация представляет собой объединение присваивания значения с объявле­нием. Например, оператор int n_int = INT_MAX; объявляет переменную n_int и присваивает ей максимальное значение, возможное для типа данных int. Инициализировать переменную можно, присваивая ей значение другой переменной, при условии, что эта переменная была определена раньше. Можно даже инициализировать переменную значением выражения при условии, что все значения выражения известны к моменту, когда выполнение программы достигает операции объявления: int uncles =5; // инициализирует переменную uncles с // присвоением значения 5 int aunts = uncles; // инициализирует переменную aunts с // присвоением значения 5 int chairs = aunts + uncles + 4;// инициализирует переменную chairs // с присвоением значения 14

18 Типы данных short int и long Рассмотренный синтаксис операций инициализации унаследован от языка С. В язы­ке C++ применяется другой синтаксис, не используемый в языке С: int owls = 101; // традиционная для С инициализация int wrens(432); // альтернативный синтаксис C++, переменной // wrens присваивается значение 432 Если не инициализировать переменную, определяемую внутри функции, ее значение будет неопределенным. Это означает, что значением переменной будет то, что находилось в этой области памяти до объявления переменной.

19 Типы данных short int и long йте ее: ведь разделение операций объявления переменной и присвоения ей значения может вызвать кратковременную неопределенность:ной и присвоения ей значения может вызвать кратковременную неопределенность: short year;//какое значение может бить у этой переменной? year = 1492; // а-а, теперь ясно Кроме того, такой подход помогает не забыть инициализировать переменную вообще.

20 Типы данных без знака Каждый из трех только что рассмотренных типов данных имеет разновидность: тип данных без знака. Данные этих типов не могут принимать отрицательные значения. Преимущество беззнакового типа в том, что увеличивается максимально возможное значение данных. Например, тип данных short представляет данные, лежащие в диапа­зоне от до , тогда как беззнаковая разновидность этого типа данных мо­жет представлять величины в диапазоне от 0 до Чтобы создать разновидность целочисленной переменной без знака, достаточно модифицировать объявление с помощью ключевого слова unsigned: unsignedshort change;//переменная типа unsigned short unsignedint rovert;//переменная типа unsigned int unsignedquarterback;//также переменная типа unsigned int unsignedlong gone;//переменная типа unsigned long Обратите внимание: ключевое слово unsigned является сокращением от unsigned int.

21 Типы данных без знака

22 Типы данных без знака

23 Типы данных без знака

24 Типы данных без знака В этой программе переменной sam типа short и переменной sue типа unsigned short присваивается самое большое значение для данных типа short, которое в нашей системе равно Затем значение каждой переменной увеличивается на единицу. Для переменной sue это не вызывает никаких проблем, поскольку новое значение на­ много меньше максимально допустимого для целого числа без знака. Но значение пере­менной sam изменяется с на ! Аналогично этому вычитание 1 из 0 не вызывает никаких проблем в отношении переменной sam, но значение беззнаковой переменной sue изменяется с 0 на

25 Какой тип выбрать?

26 Какой тип выбрать?

27 Какой тип выбрать? Если известно, что переменная может принимать значения, превышающие 16-разрядное целое число, целесообразно использовать тип данных long. Так следует поступать даже в том случае, если в вашей системе размерность данных типа int составляет 32 разряда тогда при переносе программы в систему, где определены 16-разрядные данные типа int, она не преподнесет вам неприятных сюрпризов. Если тип данных short имеет меньшую размерность, чем тип int, то использование short позволит сэкономить память. Как правило, это важно только тогда, когда вы работаете с большими массивами целых чисел (массив структура данных, состоящая из нескольких значений одного типа, которые хранятся в памяти последовательно). Если экономия памяти имеет большое значение, то вместо данных типа int следует использовать данные типа short, даже если они имеют одну и ту же размерность.

28 Целочисленные константы Целочисленная константа это константа, записываемая явно, например 212 или В языке C++, так же как и в С, целочисленные константы могут записываться в трех системах счисления: десятичной (самая популярная система), восьмеричной (при­менялась в системах UNIX старого выпуска) и шестнадцатеричной (любимая система хакеров, стремящихся получить доступ к данным на аппаратном уровне).

29 Целочисленные константы Чтобы определить, к какой системе счисления относится числовая константа, в языке C++ анализируются одна или две первые цифры константы. Если первая цифра находится в диапазоне 19, то число является десятичным. Таким образом, число 93 десятичное. Если первая цифра равна 0, а вторая находится в диапазоне от 1 до 7, то число является восьмеричным. Таким образом, число 042 это восьмеричное число, эквивалентное десятичному числу 34. Если первые два символа Ох или 0Х, то речь идет о шестнадцатеричном числе. На­пример, число 0x42 это шестнадцатеричное число, эквивалентное десятичному числу 66. В шестнадцатеричных числах символы а-Г и A-F обозначают соответственно шестнадцатеричные цифры Шестнадцатеричное число OxF эквивалентно десятичному числу 15, а 0 хА5 десятичному числу 165.

30 Целочисленные константы

31 Целочисленные константы

32 Определение типа константы в языке C++ Из объявления переменной в программе компилятор C++ узнает тип целочисленной переменной. А как обстоит дело с константами? Предположим, что вы используете в программе константу (как число): cout « "Year = " « 1492 « "\n"; Как хранится число 1492 как тип данных int, long или как целочисленные данные какого-то другого типа? Ответ таков: в программах C++ целочисленные константы сохраняются как данные типа int, если нет каких-либо причин сделать иначе (например, если используется специальный суффикс, указывающий конкретный тип данных, или же если число слишком большое, чтобы определяться типом данных int).

33 Определение типа константы в языке C++ Сначала рассмотрим суффиксы. Это буквы, которые помещаются в конец числовой константы, чтобы указать тип данных. Суффикс l или L для целого числа означает, что оно является константой типа long, суффикс u или U указывает на константу типа unsigned int, а суффикс из двух букв, u и l (в любом порядке и для любого регистра, верхнего или нижнего), указывает на константу unsigned long. Например, в системе, в которой используется 16-разрядный тип int и 32-разрядный тип long, число сохраняется как 16-разрядное число типа int, а число 22022L как 32-разрядное число типа long. Аналогично этому числа 22022LU и 22022UL являются константами типа unsigned long.

34 Определение типа константы в языке C++ Теперь рассмотрим размерность чисел. В языке C++ десятичное целое число без суффикса будет представлено как тип данных int, long или unsigned long, а именно как тип данных, который имеет наименьшую, но достаточную величину для представления этого числа. В вычислительной системе с 16-разрядными данными типа int и 32-разрядными данными типа long число будет представлено типом данных int, типом long, a unsigned long.

35 Тип данных char: символы и малые целые числа char предназначен для представления символов, например букв и цифр. Для представления символов используется числовой код. Таким образом, тип данных char это еще один тип целочисленных данных. Гарантируется, что данные этого типа имеют достаточную размерность для представления всего диапазона основных символов всех букв, цифр, знаков препинания и т.п. вычислительной системы, для которой предназначена реализация языка.

36 Тип данных char: символы и малые целые числа На практике в большинстве систем основной набор символов содер- жит менее 256 символов, поэтому для его представления достаточно одного байта. Таким образом, хотя тип char чаще всего используется для представления символов, его также можно использовать для представления целых чисел, меньших, чем числа типа short. Наиболее распространенным набором символов в США является ASCII, описанный в приложении С. Символы этого набора представлены числовым кодом (ASCII- кодом). Например, 65 код символа А. Для удобства в примерах настоящей книги использует­ся ASCII-код. Однако в реализации C++ применяется любой код, который принят для данной вычислительной системы, например, код EBCDIC (произносится эб-се-дик) на больших ЭВМ фирмы IBM. Ни ASCII, ни EBCDIC не могут удовлетворить потребности программистов в мировом масштабе, поэтому в языке C++ имеется расширенный сим­вольный тип данных, который способен представлять больший диапазон значений, например, используемый многоязыковым набором символов Unicode. Этот тип данных (wchar_t) мы рассмотрим далее в настоящей главе.

37 Тип данных char: символы и малые целые числа

38 Тип данных char: символы и малые целые числа Отметим, что пользователь вводит символ м, а не соответствующий код символа 77. И программа также выводит символ М, а не код 77. Однако если "заглянуть" в память, то обнаружится, что в переменной ch хранится значение 77. Такое превращение связано не с данными типа char, а с объектами cin и cout. При вводе с клавиатуры символа м объект cin преобразует его в значение 77. При выводе данных объект cout преобразует значение 77 в отображаемый символ м. "Образ действий" объектов cin и cout, определяется типом переменной. Если то же значение 77 присвоить переменной типа int, то объект cout отобразит его как 77 (двумя символами 7). Этот момент иллюстрируется в программе из листинга 3.5. В ней также показано, как в языке C++ определяются символьные константы: символ заключается в одинарные кавычки, например 'м' (обратите внимание на то, что в этом примере программы не используются двойные кавычки. В C++ одинарные кавычки применяются для символов, а двойные кавычки для строк.

39 Тип данных char: символы и малые целые числа

40 Тип данных char: символы и малые целые числа

41 Функция-элемент: cout.put() Функция cout.put() первый в этой книге пример важного понятия объектно-ориентированного программирования функции- элемента. Класс, как мы уже знаем, определяет способ представления данных и операции, которые можно выполнять над этими данными. Функция-элемент принадлежит классу и описывает метод выполнения действий с данными этого класса. Например, класс ostream содержит функцию-элемент put(), предназначенную для вывода символов. Функции-элементы могут использоваться только отдельными объектами своего класса; в данном случае это объект cout. Чтобы использовать функцию-элемент класса при работе с таким объектом, как cout, имя объекта (cout) и имя функции (put()) объединяются с помощью точки. Эта точка называется оператором принадлежности. Запись cout. put () означает, что функция-элемент put () некоторого класса используется объектом cout () этого же класса.

42 Функция-элемент: cout.put()

43 Константы типа char

44 Коды управляющих последовательностей в языке C++

45 Коды управляющих последовательностей в языке C++

46 Типы данных signed char и unsigned char

Когда вам нужно больше возможностей: тип данных wchar_t Иногда программам приходится обрабатывать наборы символов, диапазон кодов которых не укладывается в 8-разрядный байт; например, японский набор символов (kanji). Справиться с такой ситуацией в языке C++ можно двумя способами. Во-первых, если большой набор символов является основным для данной реализации, то поставщик компилятора может определить для типа char размерность в 16 разрядов или больше. Во-вторых, реализация языка может допускать работу как с основным, так и с расширенным набором символов. Обычные 8-разрядные данные типа char могут использоваться для представления основного набора символов, а данные нового типа wchar_t (сокращение от wide character type расширенный символьный тип) для представления расширенного набора символов. Данные типа wchar_t являются целочисленными данными, имеющими достаточную величину для представления самого большого расширенного набора символов, используемого в данной системе. Данные этого типа имеют такую же величину и знак, что и данные одного из целочисленных типов, который называется базовым типом (underlying type). Выбор базового типа зависит от реализации, и в одной системе это может быть тип данных unsigned short, а в другой int или какой- нибудь другой тип.

Когда вам нужно больше возможностей: тип данных wchar_t Семейство объектов cin и cout может осуществлять ввод и вывод потоков данных типа char, поэтому они не пригодны для обработки типа wchar_t. В последней версии заголовочного файла iostream предлагаются параллельные программные конструкции в виде объектов wcin и wcout для обеспечения ввода и вывода потоков данных типа wchar_t. Кроме того, в C++ разрешается использовать расширенные символьные константы и строки. Эти конструкции задаются с помощью префикса L. wchar_t bob = L'P';// расширенная символьная константа wcout « L"tall" « endl; // вывод расширенной символьной строки Приведенные выше строки означают, что в системе с двухбайтовыми данными типа wchar_t каждый символ будет храниться в двухбайтовой ячейке памяти. В настоящей книге расширенные символьные данные не используются, но нужно иметь о них представление, так как, возможно, вам придется заниматься программированием с применением различных языков, либо использовать набор кодов Unicode или ISO

49 Новый тип данных bool Стандартом ANSI/ISO языка C++ вводится новый тип данных bool (т.е. новый для языка C++). Он назван в честь английского математика Джорджа Буля (George Boole), который разработал математическое представление законов логики. В программировании переменная Boolean это переменная, которая может принимать два значения: true (истина) или false (ложь). В прошлом в языке C++, так же как и в С, данные типа Boolean отсутствовали. Вместо этого в языке C++ ненулевые значения интерпретировались как значение true, а нулевые значения как значение false. Однако теперь для представления этих значений можно использовать тип данных bool и предопределенные литералы true и false. Другими словами, допустимы операторы, подобные следующему: bool is ready = true;

50 Квалификатор const Предположим, что необходимо создать символическую константу, обозначающую число месяцев в году. Можно ввести в программу следующую строку: const int MONTHS = 12; // MONTHS это символическая // константа, обозначающая число 12 При инициализации константы (такой, как months) последняя получает значение. После этого изменять значение константы months будет нельзя. Ключевое слово const называется квалификатором, так как оно квалифицирует смысл объявления.

51 Квалификатор const Обратите внимание: инициализация константы осуществляется вместе с ее объявлением. Следующая последовательность операторов некорректна: const int toes; // в этом операторе значение константы toes // не определено toes = 10; // слишком поздно! Если при объявлении константы ей не присвоить значение, то она так и останется неопределенной: ведь модифицировать ее после этого нельзя.

52 Числа с плавающей точкой Теперь приступим к обзору типов данных с плавающей точкой, которые составляют вторую большую группу базовых типов языка C++. Эти типы позволяют представлять числа с дробной частью.

53 Запись чисел с плавающей точкой Второй способ записи чисел с плавающей точкой называется экспоненциальной формой записи или просто экспоненциальной записью

54 Запись чисел с плавающей точкой

55 Запись чисел с плавающей точкой

56 Типы данных с плавающей точкой В языке C++, как и в стандарте ANSI С, предусмотрено три типа данных с плавающей точкой: float, double и long double. Данные этих типов характеризуются ко­личеством значащих цифр, которые они могут иметь, и допустимым диапазоном значе­ний экспоненты. Данные типа float имеют минимальную размерность 32 разряда, данные типа double - минимальную разрядность 48 разрядов (но при этом не меньшую, чем данные типа float). Данные типа long double имеют размерность, не меньшую, чем данные типа double. Как правило, размерность данных типа float составляет 32 разряда, данных типа double - 64 разряда, а данных типа long double 80, 96 или 128 разрядов. Кроме того, диапазон значений показателя для всех трех типов лежит в пределах от -37 до +37.

57 Типы данных с плавающей точкой

58 Константы с плавающей точкой

59 Преимущества и недостатки типов данных с плавающей точкой Типы данных с плавающей точкой имеют два преимущества по сравнению с целочисленными данными. Во-первых, дробные числа могут быть представлены только типами данных с плавающей точкой. Во-вторых, благодаря наличию экспоненты (порядка) типы данных с плавающей точкой имеют намного больший диапазон значений. С другой стороны, операции над типами данных с плавающей точкой выполняются медленнее, чем операции над целочисленными данными, по крайней мере, в компьютерах без математических сопроцессоров. Кроме того, возможна потеря точности. Последнее положение иллюстрируется в программе из листинга 3.8.

60 Преимущества и недостатки типов данных с плавающей точкой

61 Преимущества и недостатки типов данных с плавающей точкой

62 РЕЗЮМЕ Классификация базовых типов данных в языке C++ производится путем разделения их на несколько семейств, что привносит в язык некоторый порядок. Типы данных signed char, short, int и long называются целочисленными типами данных со знаком. Разновидности этих типов данных без знака называются целочисленными типами данных без знака. Типы bool, char, wchar__t, а также типы целочисленных данных со знаком и без знака все вместе называются целочисленными типами данных. Типы float, double и long double называются типами данных с плавающей точкой. Целочисленные типы данных и типы с плавающей точкой вместе называются арифметическими типами данных.

63 Арифметические операции языка C++ В языке C++ имеется пять основных арифметических операций: сложение, вычитание, умножение, деление и деление по модулю. В каждой из этих операций используются два числа (называемых операндами) для вычисления результата. Знак операции и два операнда составляют выражение. Рассмотрим пример int wheels = 4 + 2; Числа 4 и 2 являются операндами, знак "+" является операцией сложения, а запись представляет собой выражение, значение которого равно б. Ниже описаны пять основных арифметических операций языка C++: Операция + задает сложение двух операндов. Например, равно 24. Операция задает вычитание второго операнда из первого. Например, 12-3 равно 9. Операция * задает умножение операндов. Например, 28 * 4 равно 112. Операция / задает деление первого операнда на второй. Например, 1000 / 5 равно 200. Если оба операнда целые числа, результатом будет целая часть ча­стного. Например, 17/3 равно 5, дробная часть отбрасывается. Операция % задает нахождение модуля первого операнда по отношению ко вто­рому, т.е. результатом операции будет остаток от деления первого операнда на второй. Например, 19 % б равно 1, так как число 19 содержит три раза по б с остатком 1. Оба операнда должны быть целочисленными данными. Если один из операндов отрицателен, знак результата зависит от реализации языка.

64 Арифметические операции языка C++

65 Арифметические операции языка C++ В программе используется метод setf () класса ostream, рассматриваемый в главе 17. В данном случае вызов метода приводит к тому, что выходные данные имеют формат с фиксированной точкой, что лучше иллюстрирует заданную точность данных. При этом предотвращается вывод больших чисел в экспоненциальной записи и обеспечивается отображение шести цифр после десятичной точки. Аргументы ios_base::fixed и ios_base::floatfield являются константами, которые становятся доступными для программы в результате включения файла iostream.

66 Арифметические операции языка C++

67 Приоритет операций и ассоциативность Когда один операнд может участвовать более чем в одной операции, чтобы решить, какая операция должна выполняться первой, в языке C++ применяются правила приоритета операций. Для арифметических операций используется обычная алгебраическая приоритетность, в соответствии с которой умножение, деление и деление по модулю выполняются перед сложением и вычитанием.

68 Приоритет операций и ассоциативность Однако в некоторых случаях правил приоритетности недостаточно. Рассмотрим следующий оператор: float logs = 120 /4*5; // 150 или б? Число "4" снова является операндом двух операций. Однако операции /и * имеют одинаковый приоритет, поэтому одного приоритета здесь недостаточно, чтобы определить, что делать в первую очередь: делить 120 на 4 или умножать 4 на 5. А этот порядок имеет значение, так как в первом случае результат равен 150, а во втором 6. Когда две операции имеют одинаковый приоритет, порядок выполнения операций определяется тем, какую ассоциативность имеют эти операции: "слева направо" или "справа налево". Ассоциативность "слева направо" означает, что из двух операций, имеющих одинаковый приоритет, первой выполняется та, которая находится слева. При ассоциативности "справа налево" первой выполняется операция, которая находится справа. Информация об ассоциативности также приводится в приложении D. Из него можно узнать, что умножение и деление обладают ассоциативностью "слева направо". Это означает, что цифра "4" сначала участвует в операции, расположенной слева, т.е. 120 делится на 4, а затем полученный результат 30 умножается на 5. В результате получается 150.

69 Разновидности операции деления Мы еще не полностью рассмотрели операцию деления. То, как выполняется эта операция, зависит от типа операндов. Если оба операнда являются целыми числами, то выполняется операция деления целых чисел. Это означает, что любая дробная часть результата отбрасывается, и результат становится целым числом. Если оба операнда числа с плавающей точкой, то дробная часть результата сохраняется и результат будет числом с плавающей точкой.

70 Разновидности операции деления

71 Разновидности операции деления

72 Разновидности операции деления

73 Операция деления по модулю Большинство людей гораздо лучше знакомы со сложением, вычитанием, умножением и делением, чем с делением по модулю, поэтому давайте рассмотрим эту операцию в действии. Результатом деления по модулю является остаток отделения целых чисел. Операция деления по модулю совместно с операцией деления целых чисел особенно полезна в тех задачах, где некоторую величину требуется разделить на какие- либо целые числа, например, преобразовать дюймы в футы и дюймы.

74 Преобразования типов данных Когда имеется 11 типов целочисленных данных и три типа данных с плавающей точкой, компьютеру приходится обрабатывать множество различных случаев, особенно если в одной операции смешаны данные различных типов. Чтобы не допустить возможной путаницы, в языке C++ многие преобразования типов данных выполняются автоматически: Преобразование данных осуществляется, когда данные одного арифметического типа присваиваются переменной другого арифметического типа. Преобразование данных осуществляется, когда в выражении содержатся данные разных типов. Преобразование данных осуществляется при передаче аргументов в функции.

75 Преобразование в случае присвоения В C++ обеспечивается возможность достаточно свободно присваивать числовые данные одного типа переменной другого типа. При этом присваиваемые данные приводятся к типу переменной. Например, предположим, что имеется переменная so_long типа long и переменная thirty типа short, а в программе присутствует следующий оператор: so_long = thirty; // присваивание типа данных short // переменной типа long При выполнении этого присвоения программа берет значение переменной thirty (как правило, 16-разрядное число) и расширяет его до типа данных long (как правило, 32-разрядное число). Обратите внимание, что при расширении создается новое число, которое и присваивается переменной so_long; содержимое переменной thirty не изменяется.

76 Преобразование в случае присвоения

77 Преобразование в случае присвоения Нулевое значение, присваиваемое переменной типа bool, преобразуется в значение false, а ненулевое значение преобразуется в значение true. В случае присвоения значений с плавающей точкой целочисленным переменным возникает две проблемы. Во-первых, преобразование данных с плавающей точкой в целочисленные данные приводит к урезанию числа (отбрасыванию дробной части). Во-вторых, значение типа float может быть слишком большим, чтобы поместиться в переменной типа int, имеющей меньшую разрядность. В языке C++ не определено, каким должен быть результат в данном случае; это означает, что в разных реализациях результаты могут быть разными.

78 Преобразование в случае присвоения

79 Преобразование в случае присвоения

80 Преобразования данных в выражениях Теперь рассмотрим, что происходит, когда в одном выражении содержатся данные двух различных арифметических типов. В этом случае в языке C++ осуществляется два вида автоматических преобразований данных. Во-первых, некоторые типы данных в выражениях всегда преобразуются автоматически. Во- вторых, некоторые типы данных в выражениях преобразуются тогда, когда они комбинируются с другими типами дан­ных в выражении. Рассмотрим сначала первый вид автоматических преобразований. При вычислении выражений В языке C++ ТИПЫ данных bool, char, unsigned char, signed char и short преобразуются в типы данных int. В частности, значение true устанавливается равным 1, а значение false 0. Эти преобразования называются интегральными повы­шениями.

81 Преобразования данных в выражениях short chickens = 20; //строка 1 short ducks = 35; //строка 2 short fowl = chickens + ducks; //строка 3 При выполнении оператора в строке 3 значения переменных chickens и ducks преобразуются в данные типа int. Затем результат преобразуется опять в данные типа short, так как он присваивается переменной типа short.

82 Преобразования данных в выражениях

83 Преобразования данных в выражениях В более общем случае то, какие преобразования должны быть сделаны в арифметическом выражении, компилятор определяет с помощью определенного алгоритма. Ниже приведен этот алгоритм именно в такой последовательности компилятор выполняет преобразования: Если один из операндов имеет тип long double, другой операнд преобразуется также в тип long double. В противном случае, если один из операндов имеет тип double, другой операнд преобразуется также в тип double. В противном случае, если один из операндов имеет тип float, другой операнд преобразуется также в тип float. В противном случае операнды являются целочисленными данными и выполняются интегральные повышения. В этом случае, если один из операндов имеет тип unsigned long, другой операнд преобразуется также в тип unsigned long.

84 Преобразования данных в выражениях Если один из операндов имеет тип long int, а другой тип unsigned int, то преобразование зависит от соотношения размерностей этих двух типов. Если величины данных типа long достаточны для представления данных типа unsigned int, операнд типа unsigned int преобразуется в тип long. В противном случае оба операнда преобразуются в тип unsigned long. В противном случае, если один из операндов имеет тип long, другой преобразуется также в тип long. В противном случае, если один из операндов имеет тип unsigned int, другой преобразуется также в тип unsigned int. Если компилятор доходит до этого места в данном перечне, то оба операнда должны иметь тип int.

85 Преобразования данных при передаче аргументов В языке C++ контроль преобразования данных при передаче аргументов обычно осуществляется с помощью прототипов функций. Однако возможно, хотя, как правило, нецелесообразно, при передаче аргументов отказываться от контроля с помощью прототипов функций. В этом случае в языке C++ производится интегральное повышение типов данных char и short (как signed, так и unsigned).

86 Приведение типов С помощью механизма приведения типов в языке C++ можно явно преобразовывать данные одного типа в данные другого типа. (Язык C++ распознает необходимость в определенных свойствах типа, а также распознает необходимость замещения этих свойств при некоторых условиях.) Приведение типов осуществляется двумя способами. Например, чтобы преобразовать значение типа int, хранимое в переменной thorn, в тип long, можно использовать одно из следующих выражений: (long) thorn // преобразует значение переменной thorn в // данные типа long long (thorn) // преобразует значение переменной thorn в // данные типа long В более общем виде это записывается так: (имя Типа) значение // преобразует значение в данные типа имя Типа имя Типа (значение) // преобразует значение в данные типа имя Типа

87 Приведение типов

88 Приведение типов

89 Приведение типов В данной программе иллюстрируются две причины, по которым приходится применять метод приведения типов. Во-первых, в программе могут быть числа, которые хранятся как данные типа double, но используются для вычисления значений типа int. Например, можно привязывать позицию объекта к сетке или моделировать целые величины, такие как численность населения, используя числа с плавающей точкой. Иногда необходимо, чтобы при вычислениях эти числа трактовались как данные типа int. Приведение типов позволяет сделать это непосредственно. Обратите внимание, что, по крайней мере, для этих чисел получаются различные результаты в том случае, когда они сначала преобразуются их в данные типа int, а затем складываются, и в случае, когда сначала выполняется сложение, а затем преобразование в данные типа int.

90 Приведение типов Во второй части этой программы иллюстрируется наиболее распространенная причина использования приведения типов, возможность применять данные одного формата для различных целей. Например, в этой программе переменная ch типа char содержит код для буквы "Z". Объект cout, который выводит содержимое переменной ch, отображает на экране символ Z, так как объект cout обращает внимание главным образом на тот факт, что переменная ch имеет тип char. Однако в результате преобразования переменной ch в тип int с помощью метода приведения типов объект cout выводит ее содержимое как данные типа int и отображает на экране ASCII-код буквы.