- •Лабораторная работа №1 Линейные и разветвленные программы
- •Примеры использования арифметических операций
- •Примеры использования операций инкремента и декремента
- •Примеры использования операций отношения
- •Примеры использования поразрядных логических операций: Поразрядное логическое умножение:
- •Логический сдвиг:
- •Поразрядное логическое сложение:
- •Сложение по модулю 2 (исключающее или):
- •Примеры более сложного использования поразрядных логических операций:
- •Примеры записи логических выражений:
- •Алгебраические выражения
- •Пример вычисления значения выражения
- •Примеры использования преобразования типов
- •2. Особенности преобразования типов int и double:
- •6. Приведение типа в случае использования указателей:
- •7. Преобразование старшего типа к младшему удобно использовать для выделения отдельных частей переменной или константы:
- •9. Проанализируйте преобразование типов в операторах присваивания:
- •Особенности представления чисел по двоичному основанию
- •Особенности выполнения арифметических операций над вещественными числами
- •Операции умножения и деления
- •Ошибки округления
- •Переполнение (ошибка переполнения)
- •Потеря порядка (ошибка исчезновения порядка)
- •Катастрофическая потеря порядка (ошибка потери порядка)
- •Операции сложения и вычитания
- •Переполнение (ошибка переполнения)
- •Потеря значащих цифр
- •Особенности выполнения операций отношения (сравнения)
- •Правила работы с данными вещественных типов
- •Замечания по программированию алгебраических выражений
- •Условный оператор
- •Оператор switch Пример 1. Печать событий в зависимости от года
- •Пример 2. Распознавание вводимых символов
- •Пример 3. Печать сообщений о работе программы
- •Пример 4. Селектор перечислимого типа
Примеры использования операций отношения
#include <iostream.h>
#include <conio.h>
int main()
{
int numb;
cout << "Enter a number: ";
cin >> numb;
cout << "numb<10 is= " << (numb < 10) << endl;
cout << "numb>10 is = " << (numb > 10) << endl;
cout << "numb==10 is= " << (numb == 10) << endl;
_getch();
return 0;
}
Варианты запуска программы:
Enter a number: 1
numb<10 is 1
numb>10 is 0
numb==10 is 0
Enter a number: 10
numb<10 is 0
numb>10 is 0
numb==10 is 1
Примеры использования поразрядных логических операций: Поразрядное логическое умножение:
Пример 1.
12 & 22 = 4, так как:
1210 = С16 = 000011002 (для типа char)
&
2210 =1616 = 000101102
000001002 = 410
Пример 2.
char i, j, k; i=5;
j=3;
k= i & j;
k==1, т.к. в двоичной системе имеем: 00000101(i) & 00000011(j) = 00000001 (k).
Логический сдвиг:
Пример 3.
2 << 7 = 256, так как:
210 = 00000000 000000102 (для типа unsigned short)
сдвиг влево на 7 разрядов этого числа дает перенос 1 на 7 разрядов влево:
00000001 000000002 = 1 * 28 = 256;
Пример 4.
256 >> 6 = 4, так как:
25610 = 00000001 000000002 (для типа unsigned short)
сдвиг вправо на 6 разрядов этого числа дает перенос 1 на 6 разрядов вправо:
00000000 000001002 = 410;
Поразрядное логическое сложение:
Пример 5.
12 | 22 = 30, так как:
1210 = С16 = 000011002 (для типа char)
(поразрядное сложение - or) +
2210 =1616 = 000101102
__________
000111102 = 1* 24 +1*23+ 1*22+ 1* 21 =3010;
Сложение по модулю 2 (исключающее или):
Пример 6.
12 ^ 22 = 26, так как:
1210 = С16 = 000011002 (для типа char)
(операция ^)
2210 =1616 = 000101102
__________
000110102 = 1* 24 +1*23+ 1* 21 =2610;
Примеры более сложного использования поразрядных логических операций:
Пример 7. Вычислить и вывести на экран результат логического выражения для заданных значений логических переменных a, b, c:
#include <stdio.h>
#include <conio.h>
int main()
{bool a, b, c, d;
a = true; b=true; c = false;
d = a && (!(b &&(!c)));
printf (" %d\n", d); // 0
_getch();
return 0;
}
Пример 8. Вычислить и вывести на экран результат логического выражения для заданных значений целых переменных a, b, c:
a || b && c
#include <stdio.h>
#include <conio.h>
int main()
{bool a, b, c, d;
int ia, ib, ic;
printf (" input a, b, c:\n");
printf ("0 - true, 1 - false:\n");
scanf ("%i%i%i, ", &ia, &ib, &ic);
a = bool(ia); b=bool (ib); c = bool(ic);
d = a || b &&c;
printf ("d= %d\n", d);
_getch();
return 0;
}
Результат:
1 1 1
d= 1
Пример 9. Присвоить логической переменной b значение логического выражения, истинного при выполнении условия «целые n и k имеют одинаковую четность» и ложного в противном случае:.
#include <stdio.h>
#include <conio.h>
int main()
{int n, k;
bool b;
printf ("input n,k:\n");
scanf ("%i%i", &n, &k);
b = (n % 2 == k % 2);
printf ("b=%d\n", b);
_getch();
return 0;
}
Результат:
4 8
b=1
Пример 10.
С помощью поразрядной логической операции & легко найти остаток от деления на 2, 4 и т.д.:
unsigned ui, mask = 0x01; //(при делении на 2); 0x03 (на 4); 0x07 (на 8); 0x0f (на 16); 0x1f (на 32);
ui =7;
ui & mask; //- значение разряда, который «уходит» при делении на 2 последний раз
00000111 - это 7
00000001 - это 2
------------
00000001 - это 1 (результат операции 7 & 2)
Пример 11.
С помощью поразрядной логической операции & можно проверить наличие единицы в любом разряде:
проверить наличие единицы в бите №4 переменной х типа char поможет логическое выражение: (х & 16) == 16;
проверить наличие единицы в битах №4, №2, №1 переменной х типа char поможет логическое выражение: (х & 22) == 22;
Пример 12.
С помощью поразрядной логической операции & можно «выключить» значение любого бита:
выключить бит №2 переменной х типа char (при неизменном значении других битов) поможет логическое выражение: х & 251 (255 – это единицы во всех разрядах, логическое выражение (х & 255) – оставит без изменения значения всех битов, бит 2 имеет значение 4, х & (255-4) – обнулит только бит номер 2;
Пример 13.
С помощью поразрядной логической операции | можно «включить» значение любого бита:
включить бит №2 переменной х типа char (при неизменном значении других битов) поможет логическое выражение: х | 4;
включить биты №4, №2, №1, №0 переменной х типа char (при неизменном значении других битов) поможет логическое выражение: х | 23;
Пример 14.
int sx=-8;
unsigned ux = -8;
printf (”sx=%o\n”, sx); // 177770
printf (”ux=%o\n”, ux); // 177770
printf (”sx>>3=%o\n”, sx>>3); // 177777 или 017777
printf (”ux>>3=%o\n”, ux>>3); // 017777
printf (”sx>>3=%d\n”, sx>>3); // -1 или 8191
printf (”ux>>3=%d\n”, ux>>3); // 0177778 = 1FFF= 8191
Пример 15.
Операция Y = X & 15 или ее аналог Y = X & $F – выделяет 4 младших разряда переменной Х (типа char), т.к. $F = 15 = 00001111. Старшие разряды обнуляются независимо от их значения, младшие – сохраняются.
Пример 16.
От прибора в ЭВМ поступает 16-разрядный код (справа налево номера от 0 до 15). Допустим, в разрядах 0-4 находится информация от первого датчика, 5-11 – от датчика 2, с 12 по 14 – от датчика 3. Рассмотрим алгоритм выделения информации от каждого из датчиков:
int Х, XX, x1, x2, x3; {ХX – исходная интегрированная информация} {x1, x2, x3 – выделенная информация от датчиков} . . . . . X = XX; x1 = X & 31; {выделяются разряды с 0 по 4 –- 31 =0000 0000 0001 1111}
X = X / 32; {происходит сдвиг Х на 5 разрядов вправо,}
{ аналог – команда Х >> 5}
x2 = X & 127; {выделяются очередные 7 разрядов, бывшие разряды 5-11}
{127 = $7F = 0000 0000 0111 1111}
X = X / 128; {производится сдвиг вправо очередных 7-и разрядов}
x3 =X & 7; {выделяются младшие 3 разряда, бывшие 12 - 14}
Пример 17.
Состояние 3-х кнопок мыши возвращается в переменной Button (тип char) в такой последовательности: левая, правая, средняя в разряды 0 –2. Тогда для анализа состояния кнопок мыши можно использовать операторы:
LeftButton = (Button & 1) == 1;
RightButton = (Button & 2) == 2;
LeftRightButton = (Button & 3) == 3;
MiddleButton = (Button & 4) == 4;
LeftMiddleButton = (Button & 5) == 5;