Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник ТРПП.doc
Скачиваний:
46
Добавлен:
23.04.2019
Размер:
7.83 Mб
Скачать

3. Типы и структуры данных

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

  1. Простые типы данных в ЭВМ. Статические и динамические данные.

2. Составные статические структуры данных. Одномерный массив.. Двумерный массив. Записи, таблицы, строки, множества.

3. Данные динамической структуры. Стеки. Очереди.

4. Линейные динамические списки. Односвязный линейный список. Двусвязный линейный список.

5. Разреженные матрицы. Диагональная схема хранения ленточных матриц. Профильная схема хранения симметричных матриц. Связные схемы разреженного хранения.

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

7. Графы

8. Файлы

9. Базы данных

«Переме́нная» в традиционных (императивных) языках программирования — поименованная либо адресуемая иным способом область памяти, имя или адрес которой можно использовать для осуществления доступа к данным, находящимся в переменной (по данному адресу). В некоторых языках программирования, таких как Пролог, РЕФАЛ или Scheme, понятие переменной оказывается при внешней схожести совершенно иным; в таких языках переменная однозначно определяется как имя, с которым может быть связано значение или даже (как в языке Scheme) место (location) для хранения значения.

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

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

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

Статические и динамические переменные

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

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

Локальные и глобальные переменные. Зоны видимости

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

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

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

По наличию внутренней структуры, переменные могут быть простыми или сложными (составными).

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

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

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

Соглашения об именовании переменных. Венгерская нотация

Венге́рская нота́ция (в программировании) — соглашение об именовании переменных, констант и прочих идентификаторов в коде программ. Своё название венгерская нотация получила благодаря программисту компании Майкрософт венгерского происхождения Чарльзу Симони (венг. Simonyi Károly), предложившего её ещё во времена разработки первых версий MS-DOS. Эта система стала внутренним стандартом Майкрософт.

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

Применяемая система префиксов зависит от многих факторов:

  1. языка программирования;

  2. стиля программирования (объектно-ориентированный код может вообще не требовать префиксов, в то время как в «монолитном» для разборчивости они зачастую нужны);

  3. предметной области (например, префиксы могут применяться для записи единиц измерения);

  4. доступных средств автоматизации (генератор документации, навигация по коду, предиктивный ввод текста и т.д.).

Примеры

Префикс

Сокращение от

Смысл

Пример

s

string

строка

sClientName

sz

zero-terminated string

строка, ограниченная нулевым символом

szClientName

n, i

int

целочисленная переменная

nSize, iSize

l

long

длинное целое

lAmount

b

boolean

булева переменная

bIsEmpty

a

array

массив

aDimensions

t, dt

time, datetime

время, дата и время

tDelivery, dtDelivery

p

pointer

указатель

pBox

lp

long pointer

двойной (дальний) указатель

lpBox

r

reference

ссылка

rBoxes

h

handle

дескриптор

hWindow

m_

member

переменная-член

m_sAddress

g_

global

глобальная переменная

g_nSpeed

C

class

класс

CString

T

type

тип

TObject

I

interface

интерфейс

IDispatch

Как видно в приведённом примере, префикс может быть и составным. Например, для именования строковой переменной-члена класса использована комбинация префиксов «m_» и «s» (m_sAddress).

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

Достоинства

  • Если встроенного механизма типизации не хватает, венгерская нотация позволяет записывать подтип переменной — например, int cPrice может означать, что переменная имеет не просто целый тип, а валютный (currency).

  • Венгерская нотация удобна для написания больших программ в неполнофункциональных (по современным меркам) редакторах без автоматизированной навигации по тексту. Скорее всего, именно поэтому она стала стандартным стилем кода в WinAPI.

  • Удобно при именовании объектов, для которых тип очевиден — например, кнопку «OK» можно назвать btnOk.

  • Две переменные разного типа, но объединённые логически, могут иметь имена, отличающиеся лишь префиксом. Например, поле ввода для поиска и кнопка «Поиск» могут именоваться как txtSearch и btnSearch.

Недостатки

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

  • Если известно имя переменной без префиксов, подчас трудно восстановить её префиксы.

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

  • Запись нескольких префиксов из-за частого использования заглавных букв и знаков подчёркивания может стать «пляской на кнопке Shift».

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

  • При изменении типа потребуется изменять имя переменной (большинство программистских редакторов не могут делать это автоматически).[4]

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