# 1. Типы данных, блок-схемы, системы счисления, двоичная арифметика.




## Переменные и типы данных.

Результат работы программиста - программный код, текст. Код состоит из инструкций компьютеру, что, как и в какой последовательности выполнить. Все эти инструкции следуют определенной цели, которую видит программист. Начальные, промежуточные и конечные данные каждого действия или комплекса действий сохраняют в переменных, у которых есть определенный тип данных. Для того, чтобы понимать весь этот процесс, мы наше знакомство с программированием начнем с нескольких терминов:

**Переменная** - данные, которые хранятся в оперативной памяти и имеют имя и тип. Проще ассоциировать с подписанным контейнером, в котором что-то лежит.

**Тип данных** - характеристика набора данных, которая определяет возможные значения этого набора, ряд допустимых операций, которые можно предпринимать с этими данными, и способ хранения этих данных в памяти.

*Пример из реальной жизни:*
>Коробки с фруктами, на которых написано "Фрукты". Они занимают определенное место, у нее есть название и все примерно ориентируются, что можно сделать с содержимым этой коробки. Коробки с фруктами содержат фрукты. Их можно открыть, фрукт можно съесть, можно разрезать, можно почистить, можно приготовить салат и так далее.
>Ящик с надписью "Посуда" при переезде. Ясно, что внутри хрупкое и бьющееся, ясно, как это транспортировать и когда распаковывать. 

В программировании типов данных много, и в различных языках они различаются. Тем не менее, рассмотрим их общие виды и характеристики. Разобравшись с этим, мы сможем классифицировать любой незнакомый нам тип данных.

![Не учи типы, дизайнер!](http://memesmix.net/media/created/1z591q.jpg)


**Примитивами** называют типы данных, которые состоят из одного элемента. Синонимы к этому определению - **скалярные**.

**Структурными** можно назвать типы данных, которые состоят из элементов других типов данных. Название - синоним: нескалярные, аггрегатные.

Говоря проще, примитивы - простейшие типы данных, которые неделимы, тогда как структурные состоят из набора структурных или примитивных типов.

### Скалярные типы данных или примитивы.

Во многих, если не во всех языках программирования высокого уровня встречаются следующие примитивы:

- **Булевы или логические данные.** Переменная этого типа может иметь только два значения - Правда и Ложь (**True, False**). Часто эти параметры интерпретируются соответственно как 1 и 0. Используется повсеместно для получения ответов на различные вопросы и дальнейшего выбора варианта действий.
- **Целые числа.** Переменные такого типа содержат целое число. В зависимости от языка программирования и выбранного подтипа целочисленных данных различаются диапазоном значений и воможностью работы с отрицательными числами.
- **Числа с плавающей точкой** или вещественные числа. Сюда входят как целые числа, у которых дробная часть есть, но считается пустой, так и дробные. В программном виде чаще всего такие числа записываются как `x = a * 10^b`, т.е. через дробное десятичное число **a**, умноженное на 10 в степени **b**. В математике это выглядит как `1.2*10^3`, в программировании степень числа 10 пишется через экспоненту, т.е. `1.2e3`. Например, расстояние от Земли до Солнца составляет 1.496 · 10 11 , или 1.496e11.
- **Комплексные числа** - числа вида `x + iy`, где `i` - корень из минус единицы. Необходимо для ряда математических действий и изысканий, обычному программисту может быть нужно довольно редко.
- **Отсутствие значения и типа** - особый тип данных, который означает ничего, пустое место. Отличается от нуля, пустой строки или пустого массива. В разных языках называется по-разному, например **null, none, nan**.
- **Строки** - Строки принято относить к примитивам, хотя они и состоят из символов.



### Структурные типы данных.

Структурные типы данных, которые можно встретить в различных языках:

- Массивы
- Кортежи
- Словари
- Множества
- Функциональные типы данных
- Записи

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

### Мутабельность (mutable)

Так же типы данных могут быть изменяемыми или **мутабельными**, и неизменяемыми (**иммутабельными**). Знакомясь с новыми типами данных конкретного языка разумно было бы выяснять, можно ли его менять, или он иммутабелен, т.е. значение его останется тем же, каким было создано, и можно либо работать с тем значением, что есть, либо создавать новое значение для него.

Те же строки, к примеру, могут быть неизменяемыми. Это значит, что в переменную можно записать строку, но изменить ее после этого будет невозможно. Однако, будет возможность записать в эту переменную другую строку, в том числе и измененную исходную строку.

## Типизация

**Статическая типизация** означает, что тип переменной определяется изначально и остается неизменным до конца программы. Если переменная изначально объявлена контейнером для целых чисел, в ней могут находиться только целые числа.

**Динамическая типизация** означает, что одну и ту же переменную можно сначала инициализировать строкой, потом числом, потом булевым значением, и так далее. Таким образом тип переменной определяется ее значением на текущий момент времени.

**Сильная (строгая) типизация** не позволяет языку программирования игнорировать разницу между типами данных операндов.

**Слабая (нестрогая) типизация** позволяет языку вольно интерпретировать тип переменных для их взаимодействия, язык сам меняет тип переменной в зависимости от ее использования. К примеру, если прибавить к числу строку, в которой записано число, язык автоматически прибавит число, находящееся в строке.

[Ликбез по типизации](https://habr.com/ru/post/161205/)

![Типизация, Карл](http://memesmix.net/media/created/tod6d6.jpg)

## Простейшие операции и блок-схемы

**Блок-схемой** называется графическое представление алгоритма. В блок-схеме шаг или последовательность шагов алгоритма представляется в виде блока, а между блоками устанавливаются связи.

Начало и конец алгоритма изображаются скругленными прямоугольниками, обычные действия - прямоугольниками, условия - ромбами, ввод и вывод данных - параллелограммами. Для более подробного ознакомления с блок-схемами читайте [википедию](https://ru.wikipedia.org/wiki/%D0%91%D0%BB%D0%BE%D0%BA-%D1%81%D1%85%D0%B5%D0%BC%D0%B0) на эту тему, и см. **правило 2**.

Для примера построим блок-схему алгоритма подбора преподавателя на курсы A-Level Ukraine :)

![](https://snag.gy/2uEFIz.jpg)


Рекомендуется использовать Google Drawings (для этого создаем почту gmail, заходим на google drive, new->more->google drawings document)

![решение котика](https://cs7.pikabu.ru/post_img/2018/04/23/6/1524471868135292777.jpg)
## Системы счисления

![Системы счисления](http://sc109.ru/content/distant/inform/6/6klass_kod_info/images/ss.png)

![](https://memegenerator.net/img/instances/21394990.jpg)

## Домашка

[Домашнее задание](hw1.md)
