Операции отношения. Логические операции. Операторы 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Операции отношения. Логические операции. Операторы



Эти операции используются для сравнения операндов и обозначаются в языке С/C++ следующим образом:

 

== (равно);

!= (не равно);

< (меньше);

> (больше);

<= (меньше или равно);

>= (больше или равно).

Операндами операций отношения могут быть как арифметические выражения, так и строковые данные. Результатом операции отношения является значение логического типа TRUE(1) или FALSE(0). Приоритет операций отношения ниже приоритета арифметических операций, так что выражение вида k > n%i вычисляется как k > (n%i). Интересно, что операции = = (равно) и!= (не равно) имеют более низкий приоритет, чем остальные операции сравнения.

Пример.

 

#include

#include

#include

int main ()

{

int x=25, y=23; int z; // bool z;

cout<< "x = "<<x<<endl;

cout<< "y = "<<y<<endl;

z=x == y; cout<<"x == y? "<< z <<endl;

z=x > y; cout<<"x > y? "<< z <<endl;

z=x <= y; cout<<"x <= y? "<< z <<endl;

return 0;

}

 

Результат работы программы:

x = 25

y = 23

x == y? 0

x > y? 1

x <= y? 0

Л о г и ч е с к и е о п е р а ц и и.

Операндами логических операций могут быть выражения арифметического или логического типов. Преобразование типов в выражениях не производится. Каждый операнд оценивается с точки зрения его равенства нулю. Равный нулю операнд трактуется как FALSE (ЛОЖЬ), а ненулевой – как TRUE (ИСТИНА).

Символ! в языке С/С++ обозначает логическое отрицаниеНЕ. Эта унарная операция записывается непосредственно перед операндом и изменяет его логическое значение на противоположное. Будем использовать еще две логические операции: || означает логическое ИЛИ, а &&логическое И. Первая возвращает в качестве результата TRUE(1), если хоть один из операндов — TRUE(1); в противном случае результат операции — FALSE (0). Результат операции логическое И имеет значение TRUE(1), только если оба операнда — TRUE(1); в остальных случаях — FALSE (0).

 

Приоритет операции && выше, чем у ||, но обе логические операции выполняются после операций отношения и арифметических операций. В сомнительных случаях лучше расставлять скобки.

 

Пример. Известно, что квадратное уравнение

ax2 + bx +c=0

имеет два различных корня, если b2 – 4ac >0. Кроме того, ветви графика фунции

y= ax2 + bx +c

направлены вверх, если a > 0.

Ввести коэффициеты a, b, c и проверить, удовлетворяет ли сответсвующий квадратный трехчлен перечисленным выше требованиям?

 

 

#include

#include

#include

int main ()

{

float a, b, c; int z; // bool z;

clrscr(); //Очистка экрана

cout<< "a = "; cin>>a;

cout<< "b = "; cin>>b;

cout<< "c = "; cin>>c;

 

z = b*b-4*a*c > 0 && a > 0;

cout<<"Да - 1, нет - 0: "<< z <<endl;

 

return 0;

}

 

Протокол выполнения программы:

 

a = 1

b = -5

c = 6

Да - 1, нет - 0: 1

 

Операции отношения и логические операции используются преимущественно в операторах управления – ветвлениях и циклах (см. далее).

П о р а з р я д н ы е л о г и ч е с к и е о п е р а ц и и и с д в и г и предназначены для работы с отдельными битами целого числа или символа:

 

& поразрядное логическое И

^ поразрядное логическое исключающее ИЛИ

>> cдвиг вправо

| поразрядное логическое ИЛИ

<< сдвиг влево

~ инверсия

 

При поразрядных логических операциях (&, |, ^) сопоставляются соответствующие биты обоих операндов и над каждой парой битов выполняется логическая операция:

а) при операции & бит результата равен 1 тогда и только тогда, когда соответствующие биты обоих операндов равны 1; в противном случае результат операции — 0.

б) при операции | бит результата равен 1, если в соответствующих битах обоих операндов есть хоть одна 1; в противном случае результат операции — 0.

в) при операции ^ бит результата равен 1, если соответствующие биты обоих операндов имеют разные значения; в противном случае результат операции — 0.

Поразрядная логическая операция И (&) часто используется для выделения некоторой группы двоичных разрядов; например, n = n & 0177 «сбрасывает» в ноль все двоичные разряды числа n, кроме семи младших.

 

Операция ИЛИ (|) используется для установки отдельных двоичных разрядов в единицу. Например, операция m=m|0xF0F “включает” 11, 10, 9, 8, 3, 2, 1 и 0 биты числа m, сохраняя неизменными его остальные биты.

Следует иметь в виду, что поразрядные логические операции (&, |) и “ обычные” логические операции (&&, | |) – не одно и то же. Порой, будучи применёнными к одним и тем же наборам данных, они дают прямо противоположные результаты. Пусть, например, int x=1, y=2; Тогда x&y есть 0(FALSE), тогда как x&&y есть 1(TRUE).

 

Операции << и >> выполняют сдвиг первого (левого) операнда соответственно влево или вправо на заданное число двоичных разрядов, заданное вторым (правым) операндом. Например, m << 3 сдвигает значение m влево на три разряда, заполняя освобождающиеся младшие разряды нулями. Это, кстати, соответствует умножению числа на 8 (в общем случае на 2 в степени n, где n – число сдвигаемых разрядов). Аналогично выполняется и сдвиг вправо на n разрядов, что равносильно делению числа на 2 в n -й степени. Но при этом сдвиге высвобождающиеся разряды заполняются значением знакового бита для знаковых целых чисел и нулём – для беззнаковых (unsigned).

 

Пример.

 

#include

#include

int main()

{

short int n, m=-1; cout <<m<<endl; // -1

n=m>>3; cout <<n<<endl; // -1

 

unsigned short int n1, m1=65535;

n1=m1>>3; cout <<n1<<endl; // 8191

getch(); return 0;

}

 

Результат работы программы приведен в виде комментария к каждому из операторов вывода.

 

Унарная операция ~ выполняет инверсию двоичных разрядов числа (символа), т. е. преобразует каждый единичный бит в нулевой и наоборот.

 

 

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

#include

#include

#include

int main ()

{

int x=25,y=23,z;

z=x&y; cout<<"x&y="<<z<<endl;

z=x|y; cout<<"x|y="<<z<<endl;

z=x^y; cout<<"x^y="<<z<<endl;

x=2;

z=x<<2; cout<<"x<<2="<<z<<endl;

x=16;

z=x>>2; cout<<"x>>2="<<z<<endl;

return 0;

}

 

Протокол выполнения программы:

x&y=17

x|y=31

x^y=14

x<<2=8

x>>2=4

 

 

Операция «запятая». Несколько выражений, разделённых запятыми, вычисляются последовательно слева направо. В качестве результата сохраняются тип и значение самого правого выражения.

 

Пример.

 

float S, a, x, pi=3.14;

S = (a = pi, x = 0.5, sin(a*x));

cout << "a= ”<

 

Результат: a= 3.14 S= 1

 

 

О п е р а ц и и п р и с в а и в а н и я (=) и составного присваивания (+=, –=, *=, и т. д.) могут использоваться в качестве составной части выражения. Выражение вида i = i + b, где левая часть повторяется в правой части операции присваивания, могут быть записаны в сжатой форме: i += b. При этом используется операция присваивания вида +=, которая означает буквально " i увеличить на b ".

Для большинства бинарных операций допускается запись вида op=, где op — одна из рассмотренных ранее операций: +, –, *, /, %, |, ^, &, <<, >>. Если Е1 – переменная и Е2 — выражение, то Е1 op= Е2 эквивалентно Е1 = Е1 op (Е2). Обратите внимание на скобки вокруг Е2: присваивание x*=y+1 фактически означает x=x*(y+1), а не x=x*y+1.

 

У с л о в н а я (тернарная) о п е р а ц и я (?:). Фактически она представляет сокращенную форму оператора ifelse ( будет рассмотрен позже ), и в общем виде записывается так:

 

логическое_выражение1? выражение2: выражение3

 

Если "логическое_выражение1" истинно (не равно нулю), то результатом операции будет значение "выражения2", в противном случае – значение "выражения3". Условная операция, называемая иногда тернарной (она имеет три операнда), определяет обычное выражение, которое может, в частности, быть использовано в операторе присваивания. Таким образом, вместо оператора ветвления (см. далее)

if (x > y)

max=x;

Else

max=y;

достаточно написать:

max = (x > y)? x: y;

Скобки вокруг " логического_выражения1" ставить не обязательно, так как приоритет тернарной операции очень низкий, ниже он только у присваивания.

 

 

Операторы.

Операторы программы могут быть простыми и составными (структурными). Простые операторы не содержит в себе других операторов. К числу простейших относится пустой оператор (;). Он может появиться в программе всюду, где по правилам синтаксиса требуется оператор, но согласно алгоритму никаких действий предпринимать не надо. Пустой оператор, подобно любому другому оператору языка, может быть помечен меткой (см. далее).

Любое выражение, которое завершается точкой с запятой, представляет собой оператор, выполнение которого приводит к некоторой обработке данных. Это так называемый «оператор-выражение». Примеры:

 

k++;

a*x*x + b*x + c; // скорее всего, бесполезный оператор

 

Один оператор может занимать одну или более строк. Два или более операторов могут быть расположены на одной строке.

 

Оператор присваивания имеет вид: V= выражение;

 

Например, absZ = (Z < 0)? – Z: Z;

 

Этот оператор мы рассмотрели ранее достаточно подробно.

 

Метка оператора. Метка есть идентификатор, за которым следует двоеточие (:). Метка может стоять перед любым исполняемым оператором, чтобы на этот оператор можно было бы передавать управление с помощью оператора безусловного перехода. Областью действия метки является текущая функция.

 

Оператор перехода goto имеет вид: goto метка;

 

Управление безусловно передается на оператор с меткой метка. Используется для выхода из вложенных управляющих операторов. Область действия ограничена текущей функцией.

 

Пример.

 

m1: x:=x+1;

...

goto m1;

 

Оператор вызова функции имеет вид:

Имя_функции (аргумент1,..., аргументN);

Пример. setviewport (x1, y1, x2, y2, clip);

 

Оператор возврата return прекращает выполнение текущей функции и возвращает управление вызывающей программе с передачей ей, быть может, значения выражения:

 

return [ выражение ];

Составной оператор (блок) состоит из одного или большего числа операторов любого типа, заключенных в фигурные скобки ({ }). В начале составного оператора могут содержаться описания данных. Они служат для определения переменных, локализованных в данном блоке, либо для распространения на данный блок области действия глобальных объктов. Подобно другим операторам языка, любой оператор внутри составного оператора может быть помечен. Передача управления по метке внутрь составного оператора хотя и возможна, но требует соблюдения определённой осторожности. Ведь если блок содержит определение переменных с их инициализацией, то при входе в блок по метке эта инициализация не состоится и значения переменных будут непредсказуемы.

 

 

Элементарный ввод – вывод

Ввод-вывод в стиле языка С++. Для правильного использования операторов ввода/вывода в С++ следует включить в программу заголовочный файл либо файл. Этот файл содержит описание набора так называемых классов для управления вводом-выводом. Класс iostrem использует потоки (streams) для организации базового ввода и вывода, например, печати текста на экране или приёма данных пользователя с клавиатуры. В нём определены стандартные объекты – поток cin для приёма с консоли данных, вводимых пользователем и поток cout – для пересылки данных в стандартный выходной поток, отождествляемый с экраном монитора, а также операторы чтения (извлечения) из потока (>>) и вывода (включения) в поток (<<).

Оператор извлечения (>>), используемый для считывания данных из стандартного входного потока cin, имеет вид:

 

cin >> переменная;

 

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

 

Пример.

int a; char ch; float b, c, d;

cin >> a; cin>>ch;

cin >> b >> c >> d;

 

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

 

Внимание! При вводе строк символов извлечение продолжается до первого пробела.

 

С помощью оператора включения (<<) можно вывести данные любого базового типа языка С++. В общем случае для вывода данных на экран применяется следующая форма этого оператора:

 

cout << выражение;

 

Здесь выражение может быть произвольного допустимого в С++ типа. Оператор << записывает данные в выводной поток cout, которые при необходимости преобразуются к символьному виду.

Пример.

 

cout << " Всё пройдёт – и печаль, и радость ";

 

Посредством цепочки операторов включения текстовую строку можно записывать в поток по частям:

 

cout << " Всё пройдёт - " << " и печаль, " << " и радость";

 

С помощью оператора включения несложно записать в поток значения переменных и выражений. Для перехода на новую строку экрана можно использовать вывод символа ‘\n’, либо так называемый манипулятор endl.

 

Рассмотрим пример.

 

#include

#include

#define STR " Длина окружности = "

 

void main()

{

int r; double pi=3.14159;

clrscr();

cout << " Только верить надо, что \n";

cout << STR << "2*pi*R"<<endl;

cout << " Введи радиус ";

cin >> r;

cout << STR << 2*pi*r;

getch();

}

 

В результате выполнения этого кода на экране после ввода радиуса (r=2) появится:

 

Только верить надо, что

Длина окружности = 2*pi*R

Введи радиус 2

Длина окружности = 12.56636

 

Рассмотрим следующий пример.

 

Ввести катеты прямоугольного треугольника a, b. Вычислить его площадь и периметр.

 

Очевидно, что площадь S можно найти сразу же:

S = ab/2

Для вычисления периметра сперва найдем гипотенузу, а затем и сам периметр:

c =, p = a + b + c.

 

#include

#include

#include

void main()

{

float a,b,c,s,p;

cout<<"Введи через пробел a, b\n ";

cin >> a >> b; //либо cin>>a; cin>>b;

s = 0.5*a*b;

c = sqrt(a*a + b*b);

p = a + b + c;

cout<<"Площадь = "<<s<<endl;

cout<<"Периметр = "<<p<<endl;

}

 

Еще раз напомним, что в процессе ввода числовых данных последовательность символов, изображающих число, авто­матически преобразуется во внутреннее представление согласно типу переменной (здесь - вещественный тип). Для ввода нескольких величин в объекте cin используется цепочка опе­раций >>.

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

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

dec – вывод в 10 с/с, hex – вывод в 16 с/с, oct – вывод в 8 с/с.

 

Используя т. н. методы объекта cout, можно управлять выводом информации на экран:

 

cout.width(ширина поля вывода);

cout.precision(число цифр дробной части);

 

Рассмотрим пример.

 

#include

#include

void main()

{

int n=13;

clrscr(); //Очистка экрана

cout << n<<" "<<oct<<" "<<n<<hex<<" "<<n<<endl;

long x=12345678;

double y=12345.123456789;

cout.width(12); cout <<dec<< x <<endl;

cout.width(20); cout.precision(4);

cout << y <<endl;

getch();

}

 

 

При запуске программы на экране появится:

 

13 15 d

12345.1235

 

 

Форматированный ввод и вывод языка С осуществляется функциями стандартной библиотеки языка; подключение к программе описаний средств ввода-вывода осуществляет директива #include.

 

Вывод данных. Для вывода данных на экран используется функция printf(). Она преобразует данные из машинного представления в символьное и выводит полученные изображения результатов на экран. При этом программист имеет возможность гибко форматиировать выводимые данные.

Общий вид оператора вызова функции printf():

printf (форматная_строка, список_выражений);

Форматная_ строка ограничена двойными кавычками и может включать:

· обычный текст, который выводится на экран “как есть”;

· управляющие символы (‘\n’ – переход на новую строку, ‘\t’ – табуляция и др.), которые позволяют влиять на размещение выводимой информации на экране.

· спецификации преобразования, которые предназначены для управления формой внешнего представления значений из списка_ выражений.

Несколько упрощённый формат спецификации преобразования имеет вид:

 

%[флаги][ширина][.точность][модификатор] спецификатор

 

Среди элементов спецификации преобразования обязательными являются символы % и спецификатор. Каждому спецификатору соответствует тип выводимой с их помощью информации. Наиболее часто используются следующие спецификаторы.

 



Поделиться:


Последнее изменение этой страницы: 2016-12-16; просмотров: 409; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.219.236.62 (0.151 с.)