# 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) ## Домашнее задание 1. **Легкий уровень:** Составить и залить в свой google disk блок-схему приготовления чая из пакетика. В схеме должно быть не меньше одного условия и одного цикла. 2. **Базовый уровень:** Составить и залить в свой google disk блок-схему определения простого числа для любого числа. 2. **Продвинутый уровень:** Составить и залить в свой google disk блок-схему поиска первых десяти простых чисел.