0 a

advertisement
ФГОБУ ВПО "СибГУТИ"
Кафедра вычислительных систем
Дисциплины
"ЯЗЫКИ ПРОГРАММИРОВАНИЯ"
"ПРОГРАММИРОВАНИЕ"
Практическое занятие
ОПЕРАЦИИ
(арифметические, присваивание)
Преподаватель:
Доцент Кафедры ВС, к.т.н.
Поляков Артем Юрьевич
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
Арифметические операции
Класс
Унарная
Опер.
Описание
Пример
-
Изменение знака
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
xy
0
0
0
0
0
1
1
1
1
0
1
1
1
1
2
0
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
19
Свойство XOR
x
y
x+y
xy
y=xyx
x=xyy
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
xy
y
x = x ^ y
II
xy
xyy
y = x ^ y
II
xyx
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
Download