Материал из Википедии — свободной энциклопедии

Да́нные

(калька от англ. data[источник не указан 41 день]) — представление фактов и идей в формализованном виде, пригодном для передачи и обработки в некотороминформационном процессе.

Изначально — данные величины, то есть величины, заданные заранее, вместе с условием задачи. Противоположность — переменные величины.

В информатике данные — это результат фиксации, отображения информации на каком-либо материальном носителе, то есть зарегистрированное на носителе представление сведений независимо от того, дошли ли эти сведения до какого-нибудь приёмника и интересуют ли они его.[1]

Данные — это и текст книги или письма, и картина художника, и ДНК.

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

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

Информация, отображаемая данными, может быть непонятна приемнику (шифрованный текст, текст на неизвестном языке и пр.).

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

Контроль за доступом к данным в современных компьютерах осуществляется аппаратно.

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

Типы данных

Традиционно выделяют два типа данных — двоичные (бинарные) и текстовые.

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

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

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

Данные в объектно-ориентированном программировании

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

Данные в языках разметки

Имеют различное отображение в зависимости от выбранного способа представления.

Данные в XML

В теории множеств

В отличие от операций над элементами множества, представляют собой множество (название и элементы множества)

В лингвистике

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

Метаданные

Множество данных может иметь надмножество, называемое метаданными. Другими словами, метаданные — это данные о данных.

Операции с данными

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

1. ввод (сбор) данных — накопление данных с целью обеспечения достаточной полноты для принятия решений;

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

3. фильтрация данных — это отсеивание «лишних» данных, в которых нет необходимости для повышения достоверности и адекватности;

4. сортировка данных — это упорядочивание данных по заданному признаку с целью удобства их использования;

5. архивация — это организация хранения данных в удобной и легкодоступной форме;

6. защита данных — включает меры, направленные на предотвращение утраты, воспроизведения и модификации данных;

7. транспортировка данных — приём и передача данных между участниками информационного процесса;

8. преобразование данных — это перевод данных из одной формы в другую или из одной структуры в другую.

Тип данных

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

История

Ещё в 1960-х гг. Р. Хиндли (Roger Hindley) исследовал типизацию в комбинаторной логике. Его проблемной областью была типизация в языках, основанных на теориилямбда-исчисления. Позднее, в конце 1960-х годов, тот же учёный исследовал полиморфные системы типов. Позже, в 1970-х годах, Робин Милнер предложил практическую реализацию расширенной системы полиморфной типизации для языка функционального программирования ML.

Определение

Тип (сорт) — относительно устойчивая и независимая совокупность элементов, которую можно выделить во всём рассматриваемом множестве (предметной области).[1]

Полиморфный тип — представление набора типов как единственного типа.

Математически тип может быть определён двумя способами:

1. Множеством всех значений, принадлежащим типу.

2. Предикатной функцией, определяющей принадлежность объекта к данному типу

Необходимость использования типов данных

Типы данных различаются начиная с нижних уровней системы. Так, например, даже в Ассемблере х86 различаются типы «целое число» и «вещественное число». Это объясняется тем, что для чисел рассматриваемых типов отводятся различные объёмы памяти, используются различные регистры микропроцессора, а для операций с ними применяются различные команды Ассемблера и различные ядра микропроцессора.

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

Практическое применение

Как правило, типы в языках программирования не всегда строго соответствуют подобным типам в математике. Например, тип «целое число» большинства языков программирования не соответствует принятому в математике типу «целое число», так как в математике указанный тип не имеет ограничений ни сверху, ни снизу, а в языках программирования эти ограничения есть. Как правило, в языках и системах имеется множество целых типов, отличающихся допустимым диапазоном значений (определяемым объёмом занимаемой памяти). Стоит отметить, что в большинстве реализаций языков и систем выход за границу целого типа (переполнение) не приводит к исключительной ситуации.

Современные языки программирования (включая Ассемблер) поддерживают оба способа задания типа (см. Определение). Так, в С++ тип enum является примером задания типа через набор значений. Определение класса (если рассматривать класс как тип данных) фактически является определением предиката типа, причём возможна проверка предиката как на этапе компиляции (проверка соответствия типов), так и на этапе выполнения (полиморфизм очень тесно связано с полиморфными типами). Для базовых типов подобные предикаты заданы создателями языка изначально.

Языки без типов

Теоретически не может существовать языков, в которых отсутствуют типы (включая полиморфные). Это следует из того, что все языки основаны на машине Тьюринга или на лямбда-исчислении. И в том, и в другом случае необходимо оперировать как минимум одним типом данных — хранящимся на ленте (машина Тьюринга) или передаваемым и возвращаемым из функции (лямбда-исчисление).

Языки программирования по способу определения типов данных

Ниже перечислены языки программирования по способу определения типов данных:

1) Языки с полиморфным типом данных. Одни языки не связывают переменные, константы, формальные параметры и возвращаемые значения функций с определёнными типами, поддерживая единственный полиморфный тип данных. В чистом виде таких языков не встречается, но близкие примеры — MS Visual Basic,Delphi — тип variant, Пролог, Лисп — списки. В этих языках переменная может принимать значение любого типа, в параметры функции можно передавать значения любых типов, и вернуть функция также может значение любого типа. Сопоставление типов значений переменных и параметров с применяемыми к ним операциями производится непосредственно при выполнении этих операций. Например, выражение a+b, может трактоваться как сложение чисел, если a и b имеют числовые значения, какконкатенация строк, если a и b имеют строковые значения, и как недопустимая (ошибочная) операция, если типы значений a и b несовместимы. Такой порядок называют «динамической типизацией» (соответствует понятию полиморфизм в ООП, полиморфный тип в теории типов). Языки, поддерживающие только динамическую типизацию, называют иногда «бестиповыми». Это название не следует понимать как признак отсутствия понятия типов в языке — типы данных всё равно есть.

2) Языки с неявным определением типов. Казалось бы, BASIC является примером языка без типов. Однако это строго типизированый язык: в нём различаютсястроковые типы (добавляется символ $), массивы (добавляется []) и числовые типы (ничего не добавляется).

3) Языки с типом, определяемым пользователем. Также хорошо известны языки, в которых типы данных определяются автоматически, а не задаются пользователем. Каждой переменной, параметру, функции приписывается определённый тип данных. В этом случае для любого выражения возможность его выполнения и тип полученного значения могут быть определены без исполнения программы. Такой подход называют «статической типизацией». При этом правила обращения с переменными, выражениями и параметрами разных типов могут быть как очень строгими (С++), так и весьма либеральными (Си). Например, в классическом языке Си практически все типы данных совместимы — их можно применять совместно в любых выражениях, присваивать значение переменной одного типа переменной другого почти без ограничений. При таких операциях компилятор генерирует код, обеспечивающий преобразование типов, а логическая корректность такого преобразования остаётся на совести программиста. Подобные языки называют «языками со слабой типизацией». Противоположнось им — «языки с сильной типизацией», такие как Ада. В них каждая операция требует операндов строго заданных типов. Никакие автоматические преобразования типов не поддерживаются — их можно выполнить только явно, с помощью соответствующих функций и операций. Сильная типизация делает процесс программирования более сложным, но даёт в результате программы, содержащие заметно меньше труднообнаруживаемых ошибок.

На практике языки программирования поддерживают несколько моделей определения типов одновременно.

Базовые типы

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

Преимущества от использования типов данных

Надёжность. Типы данных защищают от трёх видов ошибок:

1. Некорректное присваивание. Пусть переменная объявлена как имеющая числовой тип. Тогда попытка присвоить ей символьное или какое-либо другое значение в случае статической типизации приведёт к ошибке компиляции и не даст такой программе запуститься. В случае динамической типизации интерпретатор программы перед выполнением потенциально опасного действия сравнит типы данных переменной и значения и также выдаст ошибку. Всё это позволяет избежать неправильной работы и «падения» программы.

2. Некорректная операция. Позволяет избежать попыток применения выражений вида «Hello world» + 1. Поскольку, как уже говорилось, все переменные в памяти хранятся как наборы битов, то при отсутствии типов подобная операция была выполнима (и могла дать результат вроде «ello worldǼ»). С использованием типов (см. далее «Контроль типов») такие ошибки отсекаются опять же на этапе компиляции.

3. Некорректная передача параметров. Если функция «синус» ожидает, что ей будет передан числовой аргумент, то передача ей в качестве параметра строки «Hello world» может иметь непредсказуемые последствия. При помощи контроля типов такие ошибки также отсекаются на этапе компиляции.

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

Документация. Использование того или другого типа данных объясняет намерения программиста. Например, enum и bool в языке не обязательны и вместо них может быть int — но оба они означают, что перед нами не целая величина, а одно из нескольких предопределённых значений.

Классификация типов данных[2][3]

Типы данных бывают следующие:

Простые.

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

Числовые. Хранятся числа. Могут применяться обычные арифметические операции.

Целочисленные: со знаком, то есть могут принимать как положительные, так и отрицательные значения; и без знака, то есть могут принимать только неотрицательные значения.

Вещественные: с запятой (то есть хранятся знак и цифры целой и дробной частей) и с плавающей запятой (то есть число приводится к виду m*be, где m —мантисса, b — основание показательной функции, e — показатель степени (порядок) (в англоязычной литературе экспонента), причём в нормальной форме0<=m<b, а в нормализованной форме 1<=m<b, e — целое число и хранятся знак и числа m и e).

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

Символьный тип. Хранит один символ. Могут использоваться различные кодировки.

Логический тип. Имеет два значения: истина и ложь, при троичной логике может иметь и третье значение — «не определено» (или «неизвестно»). Могут применяться логические операции. Используется в операторах ветвления и циклах. В некоторых языках является подтипом числового типа, при этом ложь=0, истина=1.

Множество. В основном совпадает с обычным математическим понятием множества. Допустимы стандартные операции с множествами и проверка на принадлежность элемента множеству. В некоторых языках рассматривается как составной тип.

Составные (сложные).

Массив. Является индексированным набором элементов одного типа. Одномерный массив — вектор, двумерный массив — матрица.

Строковый тип. Хранит строку символов. Аналогом сложения в строковой алгебре является конкатенация (прибавление одной строки в конец другой строки). В языках, близких к бинарному представлению данных, чаще рассматривается как массив символов, в языках более высокой абстракции зачастую выделяется в качестве простого.

Запись (структура). Набор различных элементов (полей записи), хранимый как единое целое. Возможен доступ к отдельным полям записи. Например, struct в C или record в Pascal.

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

Класс.

Другие типы данных. Если описанные выше типы данных представляли какие-либо объекты реального мира, то рассматриваемые здесь типы данных представляют объекты компьютерного мира, то есть являются исключительно компьютерными терминами.

Указатель. Хранит адрес в памяти компьютера, указывающий на какую-либо информацию, как правило — указатель на переменную.

Контроль типов и системы типизации

Процесс проверки и накладывания ограничений типов — контроля типов, может выполняться во время компилирования (статическая проверка) или во время выполнения (динамическая проверка).

Статическая типизация — контроль типов осуществляется при компиляции.

Динамическая типизация — контроль типов осуществляется во время выполнения.

Контроль типов также может быть строгим и слабым.

Строгая типизация — совместимость типов автоматически контролируется транслятором:

Номинативная типизация (англ. nominative type system) — совместимость должна быть явно указана (наследована) при определении типа.

Структурная типизация (англ. structural type system) — совместимость определяется структурой самого типа (типами элементов, из которых построен составной тип).

Слабая типизация — совместимость типов никак транслятором не контролируется. В языках со слабой типизацией обычно используется подход под названием «утиная типизация» — когда совместимость определяется и реализуется общим интерфейсом доступа к данным типа.

Структура данных

Материал из Википедии — свободной энциклопедии

Материал из Википедии — свободной энциклопедии - student2.ru

Бинарное дерево, простой пример ветвящейся связной структуры данных.

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

Термин «структура данных» может иметь несколько близких, но тем не менее различных значения[1]:

§ Абстрактный тип данных;

§ Реализация какого-либо абстрактного типа данных;

§ Экземпляр типа данных, например, конкретный список;

§ В контексте функционального программирования — уникальная единица (англ. unique identity), сохранящаяся при изменениях. О ней неформально говорят как об одной структуре данных, несмотря на возможное наличие различных версий.

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

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

При разработке программного обеспечения сложность реализации и качество работы программ существенно зависит от правильного выбора структур данных. Это понимание дало начало формальным методам разработки и языкам программирования, в которых именно структуры данных, а не алгоритмы, ставятся во главу архитектуры программного средства. Большая часть таких языков обладает определённым типом модульности, позволяющим структурам данных безопаснопереиспользоваться в различных приложениях. Объектно-ориентированные языки, такие как Java, C# и C++, являются примерами такого подхода.

Многие классические структуры данных представлены в стандартных библиотеках языков программирования или непосредственно встроены в языки программирования. Например, структура данных хэш-таблица встроена в языки программирования Lua, Perl, Python, Ruby, Tcl и др. Широко используется стандартная библиотека шаблонов(STL) языка C++.

Фундаментальными строительными блоками для большей части структур данных являются массивы, записи (struct в Си и record в Паскале), размеченные объединения (union в Си) и ссылки. Например, двусвязный список может быть построен с помощью записей и ссылок, где каждая запись (узел) будет хранить данные и ссылки на «левый» и «правый» узлы.

Наши рекомендации