Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

Понятие, виды и типы переменной в программировании

Содержание:

ВВЕДЕНИЕ

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

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

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

Понятие переменной. Статическая и динамическая типизация переменных

Любая программа оперирует данными в процессе своего исполнения. Данные могут быть постоянными или изменяющимися, но вне зависимости от этого, их необходимо хранить. Для этого под данные отводятся адресованные пространства памяти. Именно благодаря механизму именования переменных, перед разработчиком не ставится задача прямой адресации области в памяти, в которой хранятся определенные данные. В этой задаче на помощь приходит переменная, которая как раз таки позволяет задать имя определенному пространству памяти. Приведем определение переменной.

Переменная — поименованная, либо адресуемая иным способом область памяти, адрес которой можно использовать для осуществления доступа к данным[1]. Переменные можно классифицировать по различным признакам, но в первую очередь – по типизации, т.е. к какому типу значений относится переменная.

Статическая типизация

Если тип данных определяется на этапе компиляции, имеет место статическая типизация, а если на этапе выполнения программы — динамическая. В последнем случае иногда говорят, что переменная не имеет типа, хотя данные, содержащиеся в ней, безусловно, относятся к определённому типу данных, но выясняется это уже во время выполнения программы.

В том случае, когда тип переменной задаётся при компиляции, имеет место статическая типизация. Это довольно широко используемый в программировании приём, который означает, что значение типа связывается с переменной в момент её объявления и не может быть изменён.

Статическая типизация имеет ряд преимуществ[2]:

  • ошибки, связанные с типами переменных, в большинстве случаев исключаются на этапе сборки;
  • статическая типизация предполагает наиболее простой машинный код;
  • в различных IDE для языков программирования с сильной типизацией реализован наиболее удобный и четкий механизм автодополнения, т.к. ненужные варианты отбрасываются при фильтрации по типу;
  • статическая типизация отлично проявляет себя при написании сложного кода.

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

Рассмотрим далее один из статически типизированных языков программирования - C#.

Типы и виды переменных в C#

C# - объектно-ориентированный язык программирования, который был разработан инженерами компании Microsoft в конце 1990-х годов и презентован в 2001-ом году. Первоначально C# задумывался как языковое средство разработки приложений для Microsoft .NET Framework[3].

Данный язык имеет C-подобный синтаксис и основан на статической типизации.

В C# существуют две категории типов: ссылочные типы и типы значений.

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

В C# типы значений подразделяются на несколько категорий. Рассмотрим каждую из них.

Простые типы. Простыми типами называют набор предопределенных типов структур, включающих ряд типов. Простые типы определяются при помощи ключевых слов, являющихся псевдонимами для предопределенных типов структур в пространстве имён System[4]. Главным отличием простых типов от структур является то, что простые типы допускают создание констант. Константы – это переменные, значения которых являются постоянными и не подразумевают изменения. Кроме создания констант, простые типы можно объявлять с помощью литералов, т.е. неявно. К примеру, запись ‘B’ будет являться переменной символьного типа, а запись 2003 - переменной целого типа. Типы переменных, относящихся к простым, представлены в таблице 1.

Таблица 1. Простые типы переменных в C#

Тип

Диапазон

Размер

sbyte

От -128 до 127

8-разрядное целое число со знаком

byte

От 0 до 255

8-разрядное целое число без знака

char

От U+0000 до U+ffff

Символ Юникода (16-разрядный)

short

От -32 768 до 32 767

16-разрядное целое число со знаком

ushort

От 0 до 65 535

16-разрядное целое число без знака

int

От -2 147 483 648 до 2 147 483 647

32-разрядное целое число со знаком

uint

От 0 до 4 294 967 295

32-разрядное целое число без знака

long

От -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807

64-разрядное целое число со знаком

ulong

От 0 до 18 446 744 073 709 551 615

64-разрядное целое число без знака

float

От ±1,5 x 10−45 до ±3,4 x 1038

6–9 цифр

double

от ±5,0 × 10−324 до ±1,7 × 10308

15–17 цифр

decimal

от ±1,0 x 10-28 до ±7,9228 x 1028

28-29 знаков

bool

true, false

логический тип

Типы перечисления. Тип перечисления задается при помощи ключевого слова enum и по своей сути является списком констант, т.е. переменные типа перечислений могут иметь только одно из тех значений, которое входит в список, соответствующий данному именованному типу перечисления[5]. В качестве примера можно привести пользовательский перечислимый тип Days:

enum Days{ ‘Понедельник’, ‘Вторник’, ‘Среда’, ’Четверг’, ’Пятница’, ’Суббота’, ’Воскресенье’}.

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

Типы структур. Типы структур, как и классы, представляют способ создания собственных типов данных. По своей сути, структура схожа классу в ООП – может хранить состояние в виде переменных структуры и определять поведение при помощи методов структуры[6]. Помимо этого, структуры имеют конструкторы, однако для создания переменной данной структуры, конструктор вызывать необязательно. Приведем пример структуры:

struct man

{

public string sex;

public string fullName;

public int age;

}

В примере продемонстрирована структура man, имеющая переменные пол, ФИО и возраст, которые в свою очередь являются переменными простых типов. Однако нет ограничения на применение структур и классов, перечислимых типов в качестве вложенных в структуру переменных.

Nullable. Данный тип переменных является расширением для любого типа и представляют все значения базового типа и null. Такой тип прекрасно подходит для ситуаций, когда необходимо представить переменную базового типа, значение которой ещё не определено.

Ссылочные типы.

К ссылочным типам относятся те типы данных, которые хранят в себе ссылку на объект. Одним из наиболее часто используемых ссылочных типов является тип класса.

К типу классов относятся следующие подтипы.

  • string;
  • object;
  • class.

Тип string представляет последовательность, состоящую из нуля или более символов в кодировке Юникод. Строки неизменяемы, т. е. содержимое созданного строкового объекта изменить нельзя, хотя синтаксис выглядит так, будто это возможно. Например, при написании кода компилятор фактически создает новый строковый объект для хранения новой последовательности символов, а затем этот новый объект назначается b.

Тип object является базовым для всех остальных типов и его методы полностью унаследованы любым из типов переменных в языке C#.

Тип class - это обертка (шаблон), которая определяет форму объектов. Объекты, в свою очередь, — это экземпляры класса. Определяя класс, мы создаем данные. В данном случае данные — это переменные-экземпляры класса. Над данными должен выполняться определенный код. Реализация кода находится в методах класса.

Interface. Тип интерфейса. Интерфейс содержит только сигнатуры методов, свойств, событий или индексаторов. Класс или структура, реализующие интерфейс, должны реализовать члены интерфейса, заданные в определении интерфейса.

Массив представляет собой совокупность переменных одного типа с общим для обращения к ним именем. Это хороший пример ссылочного типа переменных. Массивы могут быть n-мерными. Массивы служат самым разным целям, поскольку они предоставляют удобные средства для объединения связанных вместе переменных. Тем не менее, у них имеется одна особенность: они реализованы в виде объектов.

Delegate. Тип делегатов представляет собой основу для событий. Экземпляры делегата могут создаваться путем его связывания с именованным или анонимным методом. Делегат должен быть создан при помощи метода или лямбда-выражения, имеющего совместимые возвращаемый тип и входные параметры.

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

Динамическая типизация и динамические структуры

Под динамической типизацией понимается приём, когда тип переменной определяется её значением в момент их связывания, т.е. присвоения переменной значения. Ввиду этого, переменная может принимать значения различных типов в разные моменты выполнения программы[7].

Этот прием широко используется, чаще всего он применяется в языках программирования, которые ориентированы на веб и мобильные платформы: Objective-C, PHP, JavaScript.

Механизм динамической типизации обладает рядом достоинств:

  • упрощение написания простых программ и скриптов;
  • упрощается работа с СУБД.

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

На рисунке 1 представлен пример кода на JavaScript, где показан пример динамической типизации.

Таким образом, переменная res может быть как строкой, так и числом.

Приведем обзор типизации в JavaScript. В этом языке любая переменная объявляется ключевым словом var, после которого следует название переменной. Это очень просто и удобно. Для объявления констант следует назвать переменную символами в верхнем регистре клавиатуры [8].

Стоит также рассмотреть некоторые динамические типы переменных. К ним относятся стек, куча и очередь.

Стек

Стек – тип данных, который по своей сути является списком элементов, организованных по принципу «последним пришёл – первым вышел»[9].

Зачастую стек реализуется в виде однонаправленного списка (каждый элемент в списке содержит помимо хранимой информации в стеке указатель на следующий элемент стека).

Но также часто стек располагается в одномерном массиве с упорядоченными адресами. Такая организация стека удобна, если элемент информации занимает в памяти фиксированное количество слов, например, 1 слово. При этом отпадает необходимость хранения в элементе стека явного указателя на следующий элемент стека, что экономит память. При этом указатель стека (Stack Pointer, — SP) обычно является регистром процессора и указывает на адрес головы стека.

Предположим для примера, что голова стека расположена по меньшему адресу, следующие элементы располагаются по нарастающим адресам. При каждом вталкивании слова в стек, SP сначала уменьшается на 1 и затем по адресу из SP производится запись в память. При каждом извлечении слова из стека (выталкивании) сначала производится чтение по текущему адресу из SP и последующее увеличение содержимого SP на 1.

При организации стека в виде однонаправленного списка значением переменной стека является указатель на его вершину — адрес вершины. Если стек пуст, то значение указателя равно NULL.

На рисунке 3 представлен пример стека на языке С.

Рисунок 3. Стек на С. Пример реализации.

Возможны три операции со стеком: добавление элемента (иначе проталкивание, push), удаление элемента (pop) и чтение головного элемента (peek)[5].

Во время операции push в стек добавляется новый элемент, который указывает на тот элемент, который до этого был головным. Сам элемент становится головным.

Операция удаления pop удаляет первый элемент стека, головным в свою очередь становится тот, на который указывал удаленный элемент. Значение убранного элемента возвращается[10].

Операция peek возвращает элемент, который в настоящее время является головным. Никаких модификаций стека не происходит.

На рисунке 4 приведен пример реализации операций со стеком на языке С.

Рисунок 4. Операции со стеком на С.

Стек в своем программном виде применяется при обходе структур данных: деревьев, графов. Аппаратный вид стека применяется при использовании рекурсивных функций. Кроме того, стек также используется при создании стековой машины, которая производит вычисления арифметических выражений в обратной польской записи.

Для отслеживания точек возврата из подпрограмм используется стек вызовов.

Арифметические сопроцессоры, программируемые микрокалькуляторы и язык Forth используют стековую модель вычислений.

Идея стека используется в стековой машине среди стековых языков программирования.

Куча

Куча (англ. heap) в информатике и программировании — название структуры данных, с помощью которой реализована динамически распределяемая память приложения[11].

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

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

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

Функция, выполняющая получение указателя на занятую область памяти в куче, выполняет следующие действия:

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

Функция, освобождающая память кучи, выполняет следующие процедуры:

  • просмотр списка областей памяти, принадлежащих куче, поиск свободной (занятой) области необходимого размера;
  • удаление найденной области из списка занятых областей;
  • добавление очищенной области в список свободных.

Программа может быть уверена в том, что между вызовами функций, для поиска области или очистки, область памяти, помеченная как занятая, не будет выделена повторно. После вызова функции для освобождения памяти, область памяти будет освобождена и в дальнейшем может использоваться повторно или может быть отдана ОС. Использование указателя на освобождённую область памяти будет приводить к сбоям или непредсказуемой работе программы.

В алгоритмическом смысле куча представляет собой непрерывную область памяти, поделённую на занятые и свободные области (блоки) различного размера.

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

Для увеличения размера кучи функция использует системный вызов, при этом происходит переключение контекста из пространства пользователя в пространство ядра операционной системы и обратно. Поиск по списку занятых/свободных областей кучи выполняется быстрее, чем переключение контекстов, поэтому выгоднее один раз использовать системный вызов для выделения большой области памяти под кучу, а в дальнейшем выделять программе области меньшего размера из имеющейся крупной области с ведением списка занятых/свободных областей.

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

Каждый элемент списка может хранить адрес области памяти, её размер, информацию о следующей (для поиска в прямом направлении) и/или предыдущей (для поиска в обратном направлении) области.

Очередь

Очередью называют абстрактный тип данных, построенный по принципу «первый вошел – первый вышел», т.е. противоположность стеку. Добавить элемент можно только в конец очереди, и чем больше элементов добавлено, тем дольше придется ожидать обработки последнего. Очередь может быть реализована посредством применения динамических переменных[12].

Рассмотрим пример реализации очереди с помощью одномерного массива и двух переменных. Структурная схема изображена на рисунке 5.

Рисунок 5. Реализация очереди при помощи массива и двух переменных.

Переменные используются для определения начала и конца очереди. Назовем их start и end соответственно. Start определяет начало очереди, а end – элемент, который будет заполнен когда в очередь войдет новый элемент. В процессе добавления элемента в очередь, в q[end] помещается новый элемент, а значение end уменьшается на 1. В том случае, если значение end становится равным 0, то массив обходится циклически и значение переменной становится равным n.

Для извлечения элемента производится похожая последовательность действий, только вместо переменной end производится декремент переменной start. Такой алгоритм имеет изъян: одна из ячеек всегда будет пуста.

Пример реализации очереди в виде класса приведен на рисунке 6.

Рисунок 6. Класс «Очередь» на языке C#.

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

Переменные и их области видимости

Под областью видимости в программировании понимается часть кода, в рамках которой переменная остается связанной с этой частью программы, т.е. позволяет обратиться к себе, совершить какие-либо операции с её использованием. Грубо говоря, переменная «видна» в какой-либо части кода – это и есть простое определение области видимости. По области видимости переменные разделяют на локальные и глобальные.

Локальные переменные

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

Благодаря использованию локальных переменных появляется возможность реализации рекурсивных процедур и функций. Применение локальных переменных также обусловлено принципом «разделяй и властвуй», что подразумевает использование своих переменных внутри сложных функций во избежание проблем, которые могут порождать глобальные переменные.

Среди локальных переменных следует выделить статические локальные переменные. Это специальная категория локальных переменных, которая реализована во многих популярных языках программирования. Особенность статической локальной переменной заключается в том, что она сохраняет свое значение в каждом вызове функции, и при каждом её повторном вызове будет иметь то значение, которое было ей присвоено по результатам предыдущего вызова.

В качестве примера для большего понимания локальных переменных представлен код на языке C (рисунок 7).

Рисунок 7. Локальные переменные в C. Пример.

Результатом выполнения программы выше будет последовательность ‘012’. Этот пример демонстрирует то, что глобальная переменная ‘a’ скрывается такой же переменной в локальных областях видимости.

Глобальные переменные

Глобальными переменными называют такие переменные, для которых область видимости распространяется на всю программу, кроме тех функций, где она может быть намеренно скрыта. Как правило, глобальные переменные используют как инструмент взаимодействия между различными функциями или в качестве способа возврата значений из них.

Глобальные переменные имеют ряд недостатков при использовании. В первую очередь, глобальная переменная при определенных условиях может быть изменена в любой функции или методе. Это может повлиять на работу всей программы, поэтому глобальные переменные, используемые для создания взаимосвязей и зависимостей, вносят дополнительную сложность в код. С другой стороны, глобальная переменная может найти своё применение во избежание использования множества локальных переменных внутри отдельных функций, по своей сути отождествленных. В то же время, глобальные переменные делают процесс внедрения модулей более сложным, так как ранее спроектированный и используемый код может иметь такие же названия переменных, которые имеются во встраиваемом модуле.

Чаще всего такие переменные используют для передачи информации между отдельными блоками кода, не принимающими участие в отношениях вызовов. Здесь возникает вопрос о потокобезопасности и возникновении исключений, т.к. переменные, используемые в многопоточном коде могут одновременно получать обращения из нескольких потоков, что не представляется возможным. Для решения данной проблемы применяются блокировки (мьютексы). В любом случае, рост числа переменных увеличивает вероятность возникновения блокировок.

На рисунке 8 представлен фрагмент кода на C, который можно привести в качестве примера использования глобальных переменных.

Рисунок 8. Глобальные переменные. Пример на С.

Вывод по разделу: классификация переменных на глобальные и локальные связана с необходимостью разделять их области видимости и ограничивать область существования локальных переменных. Локальные переменные используются в ограниченных секциях кода и не существуют за их пределами, глобальные – применяются для обмена данными между процедурами и функциями. Применение глобальных переменных может сопровождаться появлением блокировок в многопоточном коде.

Простые и сложные переменные

Ещё одна классификация – разбиение переменных на простые и сложные. Принадлежность к одной из этих групп определяется наличием внутренней структуры.

Простые переменные

К простым типам следует отнести те переменные, для которых характерно:

  • взаимодействие с переменной осуществляется с помощью конструкций языка программирования;
  • внутреннее представление значений переменных зависит от средств трансляции языка (компилятор, интерпретатор);
  • переменные не включают в себя конструкций из других объектов и сами служат в качестве базовых функциональных единиц[easy].

Переносимый код представляется возможным для создания в случае отсутствии интерпретации значений простых типов. К примеру, в рамках различных архитектур, числа могут отличаться разрядностью, системой счисления, форматом представления в целом. Если избегать интерпретации, то на различных платформах код будет работать одинаковым образом.

В целом, к простым типам относятся:

  • типы чисел с различной точностью;
  • символьные типы;
  • логические типы;
  • типы вещественных чисел.

Разумеется, в каждом языке программирования эти типы представляются по-разному. Простые типы позволяют достичь ряда целей:

  • упрощение жизни программистов путём предоставления стандартных контейнеров для размещения данных;
  • предотвращение логических ошибок (ошибок программиста), связанных с применением к данным несвойственных им команд;
  • предотвращение ошибок и неоднозначностей, связанных со случайным или преднамеренным доступом к внутреннему представлению значений простых типов.

Языки программирования содержат большое количество встроенных функций для работы с простыми типами:

  • функция для получения знака числа;
  • функция для получения модуля числа;
  • функция для проверки чётности/нечётности числа;
  • функции для получения целой и дробной частей вещественного числа;
  • функции для приведения типов с округлением или без.

Сложные типы

Сложный (составной) тип — тип данных, объекты (переменные или постоянные) которого имеют внутреннюю структуру, доступную программисту.

Список предопределенных сложных типов отличается от одного языка к другому. С другой стороны, есть критерии – однотипность элементов и способ доступа, позволяющие определить главных представителей сложных типов переменных. Для примера можно привести следующие:

  • массив;
  • запись;
  • файл.

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

Вывод по разделу: переменные подразделяются на простые и сложные. Простые типы переменных не содержат внутри себя других структур. Сложные типы переменных включают в себя простые типы в качестве полей и составных частей.

ЗАКЛЮЧЕНИЕ

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

СПИСОК ИСПОЛЬЗУЕМЫХ ИСТОНИКОВ

1.Казанский А.А. Объектно-ориентированное программирование на языке Microsoft Visual С# в среде разработки Microsoft Visual Studio 2008 и .NET Framework. 4.3 [Электронный ресурс]: учебное пособие и практикум/ Казанский А.А.— Электрон. текстовые данные.— М.: Московский государственный строительный университет, ЭБС АСВ, 2011.— 180 c.— Режим доступа: http://www.iprbookshop.ru/19258.html.— ЭБС «IPRbooks»

2.Васильев В.Н. Основы программирования на языке C+ [Электронный ресурс]: учебное пособие/ Васильев В.Н.— Электрон. текстовые данные.— Волгоград: Волгоградский институт бизнеса, Вузовское образование, 2010.— 72 c.— Режим доступа: http://www.iprbookshop.ru/11341.html.— ЭБС «IPRbooks»

3.Кирнос В.Н. Введение в вычислительную технику. Основы организации ЭВМ и программирование на Ассемблере [Электронный ресурс]: учебное пособие/ Кирнос В.Н.— Электрон. текстовые данные.— Томск: Томский государственный университет систем управления и радиоэлектроники, Эль Контент, 2011.— 172 c.— Режим доступа: http://www.iprbookshop.ru/13921.html.— ЭБС «IPRbooks»

4.Станевко Г.И. Информатика. Основы процедурного программирования на Паскале [Электронный ресурс]: учебное пособие/ Станевко Г.И., Колесникова Т.Г., Давыденко В.А.— Электрон. текстовые данные.— Кемерово: Кемеровский технологический институт пищевой промышленности, 2012.— 117 c.— Режим доступа: http://www.iprbookshop.ru/14366.html.— ЭБС «IPRbooks»

5.Устинов В.В. Основы алгоритмизации и программирования. Часть 1 [Электронный ресурс]: конспект лекций/ Устинов В.В.— Электрон. текстовые данные.— Новосибирск: Новосибирский государственный технический университет, 2010.— 40 c.— Режим доступа: http://www.iprbookshop.ru/44676.html.— ЭБС «IPRbooks»

6.Макаров А.В. Common Intermediate Language и системное программирование в Microsoft.NET [Электронный ресурс]/ Макаров А.В., Скоробогатов С.Ю., Чеповский А.М.— Электрон. текстовые данные.— М.: Интернет-Университет Информационных Технологий (ИНТУИТ), 2016.— 164 c.— Режим доступа: http://www.iprbookshop.ru/56316.html.— ЭБС «IPRbooks»

7.Зудилова Т.В. Web-программирование JavaScript [Электронный ресурс]/ Зудилова Т.В., Буркова М.Л.— Электрон. текстовые данные.— СПб.: Университет ИТМО, 2012.— 68 c.— Режим доступа: http://www.iprbookshop.ru/65749.html.— ЭБС «IPRbooks»

8.Туральчук К.А. Параллельное программирование с помощью языка C# [Электронный ресурс]/ Туральчук К.А.— Электрон. текстовые данные.— М.: Интернет-Университет Информационных Технологий (ИНТУИТ), Ай Пи Эр Медиа, 2019.— 189 c.— Режим доступа: http://www.iprbookshop.ru/79714.html.— ЭБС «IPRbooks»

9.Нечта И.В. Введение в информатику [Электронный ресурс]: учебно-методическое пособие/ Нечта И.В.— Электрон. текстовые данные.— Новосибирск: Сибирский государственный университет телекоммуникаций и информатики, 2016.— 31 c.— Режим доступа: http://www.iprbookshop.ru/55471.html.— ЭБС «IPRbooks»

10.Цветкова А.В. Информатика и информационные технологии [Электронный ресурс]: учебное пособие/ Цветкова А.В.— Электрон. текстовые данные.— Саратов: Научная книга, 2012.— 182 c.— Режим доступа: http://www.iprbookshop.ru/6276.html.— ЭБС «IPRbooks»

11. Балдин К.В. Математическое программирование [Электронный ресурс]: учебник/ Балдин К.В., Брызгалов Н.А., Рукосуев А.В.— Электрон. текстовые данные.— М.: Дашков и К, 2014.— 218 c.— Режим доступа: http://www.iprbookshop.ru/4558.html.— ЭБС «IPRbooks»

12. Смирнов А.А. Технологии программирования [Электронный ресурс]: учебное пособие/ Смирнов А.А., Хрипков Д.В.— Электрон. текстовые данные.— М.: Евразийский открытый институт, 2011.— 191 c.— Режим доступа: http://www.iprbookshop.ru/10900.html.— ЭБС «IPRbooks»