ФГОБУ ВПО "СибГУТИ" Кафедра вычислительных систем Дисциплины "ЯЗЫКИ ПРОГРАММИРОВАНИЯ" "ПРОГРАММИРОВАНИЕ" Практическое занятие ОПЕРАЦИИ (арифметические, присваивание) Преподаватель: Доцент Кафедры ВС, к.т.н. Поляков Артем Юрьевич © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» Арифметические операции Класс Унарная Опер. Описание Пример - Изменение знака int k = -z; + Изменение знака (исп. редко) - + - z = a + b; Аналогичны математическим операциям * z = a – b; z = a * b; / Деление char/short/int/long – целая часть от деления float/double/long double – арифметическое z = a / b; % остаток от деления (только целые: char/short/int/long) z = a % b; Бинарная © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 2 Целочисленная арифметика (на базе отрезков) a b (b / a), (b % a) (b / a) (b % a) (a / b), (a % b) (a % b) (a / b) = 0 a = (a / b)∙b + (a % b) © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 3 Задача №2.1. Вычисление целой и дробной части от деления #include <stdio.h> int main() { int a, b; printf("Input dividend: "); scanf("%d",&a); printf("Input divisor: "); scanf("%d",&b); printf("(%d/%d) = %d\n",a,b,a/b); printf("(%d%%%d) = %d\n",a,b,a%b); return 0; } © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 4 Задача №2.2. Определение четности числа Что является признаком четности числа? © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 5 Задача №2.2. Определение четности числа Что является признаком четности числа? Четное число делится на 2 без остатка! #include <stdio.h> parity int main() parity { parity int i; parity printf("Input integer: "); scanf("%d",&i); printf("parity of %d is: %d\n",i, i%2); return 0; } © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» of of of of 15 16 17 18 is: is: is: is: 1 0 1 0 6 Задача №2.3. Определить, является ли число четным Что является признаком четности числа? Четное число делится на 2 без остатка! #include <stdio.h> 15 is int main() 16 is { 17 is int i; 18 is printf("Input integer: "); scanf("%d",&i); printf("parity of %d is: %d\n",i, 1-i%2); return 0; } © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» even: even: even: even: 0 1 0 1 7 Задача №2.4. Распределение вариантов Преподаватель подготовил N вариантов заданий, их нужно распределить между M студентами. Если M ≤ N, то каждый студент получает уникальный вариант. Если M > N, то распределение производится следующим образом: 1. Первые N студентов получают задания, которые совпадают с их номерами. 2. Студент с номером (N+1) выполняет 1-е задание, с номером 2N – N-е задание и так далее. На вход программы поступает количество N вариантов и порядковый номер i студента в списке преподавателя. Определить вариант, который необходимо выполнить студенту. © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 8 Закономерности N=4 i Вариант i%N i % (N+1) 1 1 1 1 2 2 2 2 3 3 3 3 4 4 0 4 5 1 1 0 6 2 2 1 7 3 3 2 8 4 0 3 9 1 1 4 10 2 2 0 11 3 3 1 12 4 0 2 © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 9 Закономерности N=4 i Вариант i%N i % (N+1) 1 1 1 1 2 2 2 2 3 3 3 3 4 4 0 4 5 1 1 0 6 2 2 1 7 3 3 2 8 4 0 3 9 1 1 4 10 2 2 0 11 3 3 1 12 4 0 2 © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 10 Закономерности N=4 i Вариант i%N (i – 1) % N 1 1 1 0 2 2 2 1 3 3 3 2 4 4 0 3 5 1 1 0 6 2 2 1 7 3 3 2 8 4 0 3 9 1 1 0 10 2 2 1 11 3 3 2 12 4 0 3 © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 11 Закономерности N=4 i Вариант (i – 1) % N (i – 1) % N + 1 1 1 0 1 2 2 1 2 3 3 2 3 4 4 3 4 5 1 0 1 6 2 1 2 7 3 2 3 8 4 3 4 9 1 0 1 10 2 1 2 11 3 2 3 12 4 3 4 © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 12 Задача №2.4. Распределение вариантов (решение) #include <stdio.h> int main() { int N, M, i; printf("Input N, i: "); scanf("%d %d",&N, &i); printf("var = %d\n", (i-1) % N + 1); } © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 13 Операции присваивания Класс Опер. ++ Унарная -- = += -= Бинарная *= /= %= ... Описание Пример префиксный инкремент ++i; постфиксный инкремент i++; префиксный декремент --i; префиксный декремент i--; присваивание i = j; присваивание вида: a <OP>= b; трактуется как a = a <OP> b; например: a += b; эквив. a = a + b; © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» i += j; i -= j; i *= j; i /= j; i %= j; ... 14 Базовая операция '=' C AT&T assembly syntax movl movl movl movl leal addl movl ... int z = 4, y = 5, a; a = z + y + 1; ... y 5 I z 4 II III eax edx 5 4 + $4, -4(%ebp) $5, -8(%ebp) -8(%ebp), %eax -4(%ebp), %edx (%edx,%eax), %eax $1, %eax %eax, -12(%ebp) V const! 10 1 + a 10 5 4 9 9 eax edx eax eax © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» eax 15 Задача №2.5. Обмен значениями двух ячеек Данная задача является базовой в программировании. Она возникает при решении многих задач, например, сортировке данных. В классическом варианте для ее решения используется дополнительная переменная. Код обмена в этом случае выглядит так: int a, b; int t; a = b = ... t = a = b = 5; 6; a; b; t; I II III a b t 5 6 5 a b t 6 6 5 a b t 6 5 5 © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 16 Задача №2.5. Обмен значениями двух ячеек int a, b; int t; a = b = ... t = a = b = 5; 6; a; b; t; I II III a b t 5 6 5 a b t 6 6 5 a b t 6 5 5 Разработать программу, демонстрирующую работу данного алгоритма аналогично иллюстрации. © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 17 Задача №2.6. Обмен значениями двух ячеек (без использования вспомогательной) Существует два способа решения данной задачи: 1. На основе операции сложения. 2. На основе поразрядной операции XOR (сложение по модулю 2). Предложите свое решение на основе операции сложения! Разработать программы, демонстрирующие работу обоих алгоритмов обмена. © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 18 Операция XOR Исключающее ИЛИ ( XOR, , в языке СИ – ^ ) обеспечивает применение операции "сложение по модулю 2" к каждому разряду ячейки памяти. Например: char c1 = 20, c2 = 15, c3 = c1 ^ c2; 2010 = 0001 01002 1510 = 0000 11112 20 ^ 15 = 0001 0100 ^ 0000 1111 0001 1011 = 2710 Сложение по модулю 2 – остаток от деления полученной суммы на 2: z = (x + y) % 2 x y x+y xy 0 0 0 0 0 1 1 1 1 0 1 1 1 1 2 0 © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 19 Свойство XOR x y x+y xy y=xyx x=xyy 0 0 0 0 0 0 0 1 1 1 1 0 1 0 1 1 0 1 1 1 2 0 1 1 x y I xy y x = x ^ y II xy xyy y = x ^ y II xyx x x = x ^ y y x © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 20 Задания для самостоятельного решения 1 2 3 4 5 0 1 2 3 4 1 1 2 3 4 5 0 0 1 2 3 4 2 6 7 8 9 10 1 5 6 7 8 9 3 11 12 13 14 15 2 10 11 12 13 14 4 16 17 18 19 20 3 15 16 17 18 19 рис. 1 рис. 2 Форма отчетности: исходные коды и тестовые данные. На рис. 1 и 2 показана разметки двух серверных помещений, разбитых на прямоугольные фрагменты линиями на полу. Это сделано для упрощения поиска оборудования и инвентаризации. Каждая прямоугольная область имеет порядковый номер (указан внутри). Для упрощения их поиска введена двумерная нумерация, показанная на рисунках сбоку. П2.1. Разработать программу, которая по уникальному номеру прямоугольной области определяет ее двумерные координаты в обоих серверных помещениях. П2.2. Разработать программу, которая по двумерным координатам области определяет ее порядковый номер. © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 21 Преобразование типов данных Типы данных имеют различное представление в памяти При присваивании происходит преобразование типа данных rvalue к типу данных lvalue. rvalue 1) диапазон rv = lv - простое 1) отбрасывание дробной части: копирование: 1010 = 1010 18.546 2) диапазон rv < lv - добавление 2) если целая часть не незначащих нулей: 0001010 помещается в диапазон lvalue, 3) диапазон rv > lv - отбрасывание то результат не определен: старших разрядов: 1011010 float f = 1E20; Возможно отбрасывание младших 1) диапазон rv = lv - простое разрядов, не попадающих в копирование. мантиссу: 2) диапазон rv < lv - добавление i = 2147483582, f = 2147483520.0 незначащих нулей: 0001010 i = 2147483583, f = 2147483520.0 3) диапазон rv > lv возможно i = 2147483584, f = 2147483648.0 переполнение: +/-inf или обнуление. lvalue целый веществ. веществ. целый © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 22 Задача №2.7. Округление в меньшую сторону Входные данные: вещественное число x. Выходные данные: целое число y равное числу x, округленному в меньшую сторону: x = 5.1, y = 5 x = 9.9, y = 9 x = 7.01, y = 16 x = 70, y = 70 Рекомендации: Использовать стандартное преобразование вещественных чисел в целые, предусмотренное стандартом языка СИ. © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 23