Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Типы логических переменных




Т.Е. Мамонова

Лабораторная работа № 3

Логические операции в C++

Методические указания по выполнению лабораторных работ

по курсу «Информатика»

для студентов направлений 220000 – «Мехатроника и робототехника»,

220700 – «Автоматизация технологических процессов и производств».

 

 

Издательство

Томского политехнического университета

УДК 519.6

ББК 00000

А00

 

Мамонова Т.Е.

А00 Логические операции в C++. Методические указания по выполнению лабораторных работ по курсу «Информатика» для студентов I курса, обучающихся по направлениям 220000 – «Мехатроника и робототехника», 220700 – «Автоматизация технологических процессов и производств» / Т.Е. Мамонова. – Томск: Изд-во Томского политехнического университета, 2011. – 18 с.

УДК 519.6

ББК 00000

 

Методические указания рассмотрены и рекомендованы к изданию методическим семинаром кафедры интегрированных

компьютерных систем управления ИК

«1» сентября 2011 г.

 

Зав. кафедрой ИКСУ

доктор технических наук _________________ А.М. Малышенко

 

 

Председатель учебно-методической

комиссии _________________ В.Н. Шкляр

 

 

Рецензент

Доцент ИКСУ ИК НИ ТПУ кандидат технических наук

В.Н. Шкляр

 

© ГОУ ВПО «Томский политехнический

университет», 2011

© Мамонова Т.Е., 2011

© Оформление. Издательство Томского

политехнического университета, 2011

ЛАБОРАТОРНАЯ РАБОТА № 3

Логические операции в СИ

Цель работы. Приобретение навыков выполнения логических операций на языке C++ в программе Borland C++.

Теоретическая часть

Существует целый класс так называемых логических операторов. В отличие от арифметических, этот тип операторов многими не воспринимается как операторы.

Логические операторы бывают двух типов. Операторы И и ИЛИ называются простыми логическими операторами. Операторы второго типа, или б итовые операторы, уникальны, так как используются только в программировании. Этот тип операторов позволяет работать с любым битом в машинном представлении числа.

Использование простых логических операторов

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

Простые логические операторы приведены в табл. 1. Они могут возвращать два значения: true (истина) и false (ложь).

Таблица 1. Простые логические операторы

Оператор Значение
= = Равенство; истинно, когда значение левого аргумента совпадает со значением правого
!= Неравенство; противоположно равенству
>, < Больше, меньше; истинно, когда значение левого выражения больше (или меньше) значения правого
>=, <= Больше или равно, меньше или равно; истинно, если истиной является > или == (соответственно < или ==)
&& И; истинно, если аргументы и слева и справа являются истиной
|| ИЛИ; истинно, если или левый, или правый аргумент являются истиной
! НЕ; истинно, если его аргумент принимает ложное значение

 

Первые шесть операторов табл. 1 являются операторами сравнения. Оператор равенства используется для проверки равенства двух значений. Например, следующее выражение истинно, если значением n является 0, и ложно во всех других случаях:

n==0;

 

Примечание. Не перепутайте оператор равенства == с оператором присвоения =. Этаошибка очень распространена, к тому же компилятор C++, вообще говоря, не считает ее ошибкой, что делает ее вдвойне опасной!

Широко распространены в повседневной жизни операторы "больше" (>) и "меньше"(<).

Пример 1. Логическое выражение, возвращающее значение true.

int nl = l;

int n2 = 2;

nl < n2;

Операторы "больше" и "меньше" внешне очень похожи, и поэтому их легко перепутать. Чтобы этого не случилось, помните, что оператор-стрелочка принимает значение true в том случае, когда из двух сравниваемых значений он указывает на меньшее.

С помощью операторов > и < можно найти случаи, когда n1 больше или меньше n2, однако при этом игнорируется возможность равенства их значений. Операторы"больше или равно" (>=), "меньше или равно" (<=), в отличие от только что рассмотренных, учитывают и эту возможность.

Так же широко используются и операторы && (И) и | | (ИЛИ). Эти операторыобычно сочетаются с другими логическими операторами.

Пример 2. Сочетание логических операторов

(nl<n2) && (n2<nЗ); // истинно, если n2 больше n1

// и меньше n3

Примечание: оператор "больше или равно" можно определить какnl <= n2 эквивалентно (nl < n2)||(nl == n2).

Логические операции и действительные переменные

Переменные с плавающей точкой, как уже отмечалось, не могут использоваться для перечисления. Вы можете сказать: первый, второй, третий, четвертый и т.д., так как соотношения между 1, 2, 3 абсолютно точно известны.

Но нет никакого смысла говорить о номере 4.535887 в последовательности (такой способ нумерации возможен лишь как обозначение чего-то между четвертым и пятым, но не действительного значения номера, так как в любом сколь угодно малом отрезке их несчетное множество).

Тип float, представляющий в C++ действительные числа, не является перечислимым. Кроме того, в отличие от действительных чисел, числа с плавающей точкой имеют ограниченное количество разрядов, поэтому при использовании операторов сравнения с числами с плавающей точкой необходимо соблюдать осторожность.

Пример 3.

float f1=10.0;

float f2=f1/3;

fl ==(f2*3.0) // Равны ли эти значения?

В примере 3 сравнивая начальное и полученное значения, мы не обязательно получим равенство. Действительные переменные, с которыми работает компьютер, не могут содержать бесконечного числа значимых разрядов. Поэтому f2 равняется, например, 3.3333, а не 3 . В отличие от математики, в компьютере число троек после точки ограничено. Умножив 3.3333 на 3, вы, вероятно, получите не 10.0, а 9.9999. Такой маленькой разницей может пренебречь человек, но не компьютер. Эта машина понимает под равенством исключительно точное равенство значений.

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

Проблемы могут появиться и при совершенно простых вычислениях.

Пример 4.

float fl = 10.0;

float f2 = 120 % 11;

f1==f2; //истинно ли это выражение?

Здесь теоретически f1 и f2 должны быть равны. Ошибка округления возникнуть вроде бы не должна. Однако и в этом нельзя быть уверенным: вам ведь неизвестно, как именно представляются числа с плавающей точкой внутри компьютера.

Более безопасное сравнение имеет вид, представленный в примере 5.

Пример 5.

float fl=10.0;

float f2=fl/3;

float f3=f2*3.0;

(fl-f3)<0.0001 && (f3-fl)<0.0001;

Оно ИСТИННО В ТОМ случае, если разница между f1 и f2 меньше какого-то малого значения (в нашем случае – 0.0001); при этом небольшие погрешности вычислений на правильность сравнения не повлияют.

Сокращенные вычисления в C++

Рассмотрим следующую конструкцию:

условие1 && условие2

Если условие1 ложно, то результат не будет истинным, независимо от истинности выражения условие2. В схеме

условие1 || условие2

в случае истинности выражения условие1 неважно, какое значение принимает условие2, – результат будет истинным.

Для экономии времени C++ вычисляет первым условие1, и в случае, если оно ложно (для оператора &&) или истинно (для оператора | |), выражение условие2 не вычисляется и не анализируется.

Типы логических переменных

Поскольку > является оператором, то сравнение а >10 представляет собой выражение. Очевидно, что результатом такого выражения может быть или true (истина), или false (ложь).

В C++ для хранения логических значений используется тип int. При этом 0 обозначает false, а любое другое отличное от нуля значение является истиной (true). Выражения типа а >10 могут принимать значения 0 (false) или, например, 1 (true).

В новом стандарте ANSI C++ для работы с булевыми переменными определен тип bool, имеющий значения true и false.

Бинарные числа в C++

Переменные хранятся в компьютере в виде так называемых двоичных, или бинарных, чисел, т.е. представлены в виде последовательности битов, каждый из которых может содержать два значения: 0 или 1. Скорее всего, вам не придется оперировать с числами на битовом уровне, хотя существуют ситуации, когда обойтись без этого нельзя. Язык C++ снабжен несколькими операторами для подобных целей.

Вряд ли вам придется часто работать с переменными на битовом уровне, поэтому остальную часть главы следует рассматривать как техническое отступление от основного повествования.

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

Десятичная система счисления

Числа, которыми мы чаще всего пользуемся, называются десятичными, или числами по основанию 10. В основном программисты на C++ тоже используют десятичные переменные. Например, мы говорим, что значение переменной var равно 123.

Число 123 можно представить в виде 1*100+2*10+3*1. При этом каждое из чисел 100, 10, 1 является степенью 10.

123 = 1 * 100 + 2 * 10 + 3 * 1,

что эквивалентно следующему:

123 = 1 * 102 + 2 * 101 + 3 * 10°

Помните, что любое число в нулевой степени равняется 1.

Двоичная система счисления

У компьютеров, видимо, пальцев поменьше. Они предпочитают пользоваться двоичной системой счисления. Число 123 переводится в двоичную систему таким образом:

12310 = 0 * 128 + 1*64 + 1*32 + 1*16 + 1*8 + 0*4 + 1*2 + 1*1 = 011110112

Существует соглашение, которое гласит, что в записи двоичных чисел используются 4, 8, 16 или 32 (и т.д.) двоичных цифр, даже если старшие цифры – нули. Внутреннее представление числа в компьютере строится именно таким образом.

Понятие разряда применяется к числам, кратным десяти, двоичный же разряд называется битом. Восемь битов составляют байт, а слово представляется или двумя, или четырьмя байтами.

Поскольку основа двоичной системы счисления очень мала, для представления чисел необходимо использовать слишком большое количество битов. Для представления таких обычных чисел, как 12310, неудобно использовать выражения вида 011110112.

Поэтому программисты предпочитают представлять числа блоками из четырех битов.

С помощью одного четырёхбитового блока можно представить любое число от 0 до 15, и такая система счисления называется шестнадцатеричной (hexadecimal), т.е. системой по основанию 16. Часто употребляют ее сокращенное название hex.

В шестнадцатеричной системе обозначения цифр от 0 до 9 остаются теми же, а числа от 10 до 15 представляются с помощью первых шести букв алфавита: А вместо 10, B вместо 11 и т. д. Следовательно, 12310 – это 7B16.

123-7*161+В (т.е.11)*160 = 7B16.

Поскольку программисты предпочитают представлять числа с помощью 4, 8, 16 или 32 битов, шестнадцатеричные числа состоят соответственно из 1, 2, 4 или 8 шестнадцатеричных разрядов (даже если ведущие разряды равны 0).

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

Таким образом, 7В16 равно 0х7B. Следуя этому соглашению, 0х7В равно 123, тогда как 0x123 равно 291.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...