
- •Г.В. Ваныкина, т.О. Сундукова
- •Часть 1. Введение в программирование Тула - 2009
- •Содержание
- •Предисловие
- •Лабораторная работа №1
- •Лабораторная работа №2 Типы данных. Стандартные потоки ввода-вывода данных
- •Лабораторная работа №3 Константы. Стандартные потоки ввода-вывода вещественных данных
- •Лабораторная работа №4 Форматированный ввод-вывод данных
- •Лабораторная работа №5 Присваивание. Арифметические операции
- •Лабораторная работа №6 Логические и поразрядные операции. Операции сравнения и определения размера
- •Лабораторная работа №7 Математические функции. Выражения
- •Математические функции – файл math.H
- •Лабораторная работа №8 Линейные программы. Преобразование типов
- •Лабораторная работа №9 Операторы выбора: оператор условия if
- •Лабораторная работа №10 Решение задач с использование оператора условия if
- •Лабораторная работа №11 Операторы перехода. Операторы выбора: оператор-переключатель switch
- •Лабораторная работа №12 Решение задач с использованием оператора-переключателя switch
- •Лабораторная работа №13 Операторы цикла: оператор цикла с параметром for
- •Лабораторная работа №14 Операторы цикла: оператор цикла с предусловие while
- •Лабораторная работа №15 Операторы цикла: оператор цикла с постусловием do … while
- •Лабораторная работа №16 Решение задач с использованием операторов цикла
- •Лабораторная работа №17 Функции пользователя
- •Лабораторная работа №18 Решение задач методом процедурной абстракции
- •Лабораторная работа №19 Рекурсивные функции
- •Индивидуальные задания Требования к оформлению индивидуальных заданий
- •Задание 1. Линейные программы
- •Задание 2. Задачи на составление логических выражений
- •Задание 3. Условный оператор
- •Задание 4. Цикл с параметром
- •Задание 5. Циклы с условиями
- •Задание 6. Числовые функции
- •Задание 7. Функции
- •Задание 8. Рекурсия
- •Литература
- •Часть 1. Введение в программирования
Лабораторная работа №6 Логические и поразрядные операции. Операции сравнения и определения размера
Цель работы: изучить выражения, построенные с помощью тернарной, логических и поразрядных операций, операций сравнения и определения размера в языке C++.
Теоретические сведения
Для формирования и последующего вычисления выражений в языке С++ используются операции. Знак операции воспринимается компилятором как отдельная лексема.
В языке С++ имеются следующие классы операций:
арифметические операции (аддитивные, мультипликативные, увеличения (increment) и уменьшения (decrement));
операции присваивания;
условие (тернарная операция);
логические операции;
операции сравнения (операции отношения, операции сравнения на равенство);
поразрядные (побитовые) операции (логические, операции сдвига).
Операция определения размера sizeof
Данная операция вычисляет размер памяти (в байтах) для объекта того типа, который имеет операнд. Разрешены два формата операции:
sizeof выражение
sizeof (тип)
sizeof не вычисляет значения выражения, а только определяет его тип, для которого затем вычисляется размер.
Результат операции – целое число, равное количеству байтов, которое необходимо для хранения в памяти заданной величины.
При этом выражение должно иметь смысл с точки зрения выполнимости. Например, при компиляции возникает ошибка, если указать sizeof 5/0; в силу недопустимости деления на ноль.
В качестве выражения может быть использован допустимый идентификатор, не относящийся к полю битов и не являющийся именем функции. В качестве типа недопустимо использование void.
Например:
sizeof f+a;
//количество байтов, занимаемых значением выражения
sizeof (long);
//количество байтов, занимаемых типом long
Условие (тернарная операция)
Операция |
Результат |
Ограничения |
Примеры выражений |
х? y: z |
y, если х не равно 0; z – иначе |
|
float s = 1.234; s > 2.15 ? 1: 0 (результат 0) |
Логические операции
Операция |
Результат |
Ограничения |
Примеры выражений |
х && у |
логическое И 1, если х и у не равны 0; 0 – иначе |
результат типа int |
3&&2 (результат =1) 3&&0 (результат =0)
|
х || у |
логическое ИЛИ 0, если х и у равны 0; 1 – иначе |
результат типа int |
3 || 2 (результат =1) 3 || 0 (результат =1) 0 || 0 (результат =0) |
!х |
логическое отрицание (НЕ) 1 – если х =0, иначе 0 |
результат типа int |
!0 (результат =1) !3 (результат =0) |
Операции сравнения
Операция |
Результат |
Ограничения |
Примеры выражений |
Отношения |
|||
х < у (x > y) |
1, если х меньше (больше) у; 0 – иначе |
результат типа int |
3 < 2 (результат 0) 3 > 2 (результат 1) |
х <= у (x >=y) |
1, если х меньше или равно (больше или равно) у; 0 – иначе |
результат типа int |
3 <= 2 (результат 0) 3 >= 2 (результат 1) 3 >= 3 (результат 1) |
Сравнение на равенство |
|||
х == у |
1, если х равно у; 0 – иначе |
результат типа int |
3 == 2 (результат 0) 3 == 3 (результат 1) |
х != у |
1, если х не равно у; 0 – иначе |
результат типа int |
3 != 3 (результат 0) 3 != 2 (результат 1) |
Поразрядные операции (побитовые)
Операция |
Результат |
Ограничения |
Примеры выражений |
Логические |
|||
х & у |
поразрядное логическое И соответствующий разряд результата 1, если оба разряда х и у равны 1; 0 – иначе |
х и у – целочисленные операнды типа char, short, int, long |
char c = '\325' (c=11010101) c & 3 (3=00000011) -> 00000001 |
х | у |
поразрядное логическое ИЛИ соответствующий разряд результата 0, если оба разряда х и у равны 0; 1 – иначе |
х и у – целочисленные операнды типа char, short, int, long |
char c = '\325' (c=11010101) c | 3 (3=00000011) -> 11010111 |
х ^ y |
поразрядное исключающее ИЛИ соответствующий разряд результата 1, если оба разряда х и у различны; 0 – если совпадают |
х и у – целочисленные операнды типа char, short, int, long |
char c = '\325' (c=11010101) c ^ 3 (3=00000011) -> 11010110 |
~ х |
дополнение до единицы бит со значением 1 обращается в 0 и наоборот |
х – операнд типа char, short, int, long |
char c = '\325' (c=11010101) ~ c -> 00101010 |
Сдвиг |
|||
х << у |
сдвиг влево на у разрядов; освобождающиеся младшие разряды заполняются нулями |
у положительно и меньше разрядности машины |
char c = '\325' (c=11010101) c << 3 -> 10101000 |
х >> у |
сдвиг вправо на у разрядов; освобождающиеся старшие разряды заполняются нулями для переменных типа unsigned или значением старшего (знакового) бита |
у положительно и меньше разрядности машины |
char c = '\325' (c=11010101) c >> 3 -> 11111010 |
Пример 1.
/*Программа демонстрирует работу с логическими и поразрядными операциями, операциями сравнения и определения размера*/
#include <stdio.h>
void main(){
int a=4, b=2, c=0, log_i, log_ili, log_ne,
bit_i, bit_ili, bit_il, bit_dop, bit_s,
sr_o, sr_op, sr_r, k1, k2, k3;
char s='\325';
printf("a=%d, b=%d, c=%d\n\n",a,b,c);
/*Логические операции*/
log_i=a&&b; /*Логическое И*/
printf("a&&b=%d\n",log_i);
log_i=a&&c; /*Логическое И*/
printf("a&&c=%d\n",log_i);
log_ili=a||b; /*Логическое ИЛИ*/
printf("\ta||b=%d\n",log_ili);
log_ili=a||c; /*Логическое ИЛИ*/
printf("\ta||c=%d\n",log_ili);
log_ili=0||c; /*Логическое ИЛИ*/
printf("\t0||c=%d\n",log_ili);
log_ne=!c; /*Логическое НЕ*/
printf("!c=%d\n",log_ne);
log_ne=!a; /*Логическое НЕ*/
printf("!a=%d\n\n",log_ne);
/*Поразрядные (побитовые) операции*/
//вывод происходит в шестнадцатеричной системе счисления
bit_i=s&3; /*поразрядное логическое И*/
printf("\ts&3=%x\n",bit_i);
bit_ili=s|3; /*поразрядное логическое ИЛИ*/
printf("\ts|3=%x\n",bit_ili);
bit_il=s^3; /*поразрядное исключающее ИЛИ*/
printf("\ts^3=%x\n",bit_il);
bit_dop=~s; /*дополнение до единицы*/
printf("\t~s=%x\n",bit_dop);
bit_s=s<<3; /*поразрядный сдвиг влево*/
printf("s<<3=%x\n",bit_s);
bit_s=s>>3; /*поразрядный сдвиг вправо*/
printf("s>>3=%x\n\n",bit_s);
/*Опеации сравнения*/
sr_o=a<b; /*а меньше b*/
printf("\ta<b=%d\n",sr_o);
sr_o=a>b; /*а больше b*/
printf("\ta>b=%d\n",sr_o);
sr_op=a<=b; /*а меньше или равно b*/
printf("a<=b=%d\n",sr_op);
sr_op=a>=b; /*а больше или равно b*/
printf("a>=b=%d\n",sr_op);
sr_op=a>=4; /*а больше или равно b*/
printf("a>=4=%d\n",sr_op);
sr_r=a==b; /*a равно b*/
printf("\ta==b=%d\n",sr_r);
sr_r=a==4; /*а равно 4*/
printf("\ta==4=%d\n",sr_r);
sr_r=a!=4; /*а не равно 4*/
printf("\ta!=4=%d\n",sr_r);
sr_r=a!=b; /*а не равно b*/
printf("\ta!=b=%d\n\n",sr_r);
/*Операция определения размера памяти (в байтах)*/
k1=sizeof(int);
/*число байтов, отводимое для объектов типа int*/
printf("sizeof(int)=%d\n",k1);
k2=sizeof(float);
/*число байтов, отводимое для объектов типа float*/
printf("sizeof(float)=%d\n",k2);
k3=sizeof 2*a; /*число байтов, отводимое для хранения
результата умножения 2*а*/
printf("sizeof 2*a =%d\n",k3);
}
Задания
Наберите код программы из Примера 1. Сохраните код в файл с именем log_srav.cpp. Выполните компиляцию и запуск программы.
Написать программу. Записать выражение, зависящее от координат точки x1 и y1, принимающее значение 1, если точка принадлежит заштрихованной области, и 0, если не принадлежит.
Напишите программы для вычисления следующих выражений и выведите в результате значения переменных a, b и j на экран. Полученные результаты обосновать в комментариях.
int j, b = 5, a =4;
j = b---a;
int j, b = 5, a =4;
j = (b--)-a;
int j, b = 5, a =4;
j = b-(--a);
Домашние задания
Напишите программы для вычисления следующих выражений и выведите в результате значения переменных a, b и j на экран. Полученные результаты обосновать в комментариях.
int j, b=5, a=4; j = --b-a--;
int j, b=5, a=4; j = -a++-++b;
int j, b=5, a=4; j = a-++b;
Индивидуальное задание. Номер варианта определяется по журналу. Написать программу. Записать выражение, зависящее от координат точки x1 и y1, принимающее значение 1, если точка принадлежит заштрихованной области, и 0, если не принадлежит.
Варианты индивидуального задания
№ |
Задание |
№ |
Задание |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|