Століттями людство накопичувало знання, навички роботи, відомості про навколишній світ, іншими словами - збирало інформацію. Спочатку інформація передавалася з покоління в покоління у вигляді переказів і усних оповідань.
Виникнення і розвиток книжкової справи дозволило передавати і зберігати інформацію в більш надійному письмовому вигляді. Відкриття в області електрики привели до появи телеграфу, телефону, радіо, телебачення - коштів, що дозволяють оперативно передавати і накопичувати інформацію. Розвиток прогресу зумовило різке зростання інформації, у зв'язку з чим питання про її збереження і переробки ставав рік від року гостріше. З появою обчислювальної техніки значно спростилися способи зберігання, а головне, обробки інформації. Розвиток обчислювальної техніки на базі мікропроцесорів призводить до вдосконалення комп'ютерів і програмного забезпечення. З'являються програми, здатні обробити великі потоки інформації. За допомогою таких програм створюються інформаційні системи. Метою будь-якої інформаційної системи є обробка даних про об'єкти і явищах реального світу і надання потрібної людині інформації про них.
Все вище сказане зумовило мету роботи: дослідити основні типи і структури даних різних мов програмування. Однак для цього необхідно зрозуміти, що таке програмування і що таке алгоритм.
Алгоритм - це точне розпорядження, яке задає певний процес, що починається з довільного вихідного даного (з деякою сукупності можливих для цього алгоритму вихідних даних) і спрямований на отримання повністю визначається цим вихідним даним результату.
Будь алгоритм являє собою опис деякої впорядкованої сукупності дій над певними об'єктами. Об'єктами дій для обчислювальних алгоритмів є дані - числа, слова, тексти, що зберігаються в пам'яті ЕОМ або надходять через пристрої введення-виведення інформації.
Алгоритмічна мова - це система позначень і правил для однакової і точного запису алгоритмів і їх виконання. Алгоритмічний мову, з одного боку близький до звичайної мови (алгоритми на цій мові можуть записуватися і читатися як звичайний текст), з іншого боку, алгоритмічний мову може включати в себе і математичну символіку: числа, позначення величин і функцій, знаки операцій та ін.
У загальному вигляді алгоритм на алгоритмічній мові записується так:
Прикладами обчислювальних алгоритмів служать стандартні методи рішення математичних, фізичних задач, задач теорії ймовірності та ін. Взагалі саме слово «алгоритм» походить від algorithmi - латинської форми написання імені великого математика IX століття аль-Хорезмі, який сформулював правила виконання арифметичних дій. Тому спочатку під алгоритмами розуміли тільки правила виконання чотирьох арифметичних дій над числами. Надалі це поняття стали використовувати для позначення дій, що призводять до вирішення поставленого завдання.
В алгоритмічній мові вживаються лінійні, розгалужуються і циклічні алгоритми.
Лінійними є алгоритми, що складаються з однієї серії простих команд.
Для запису розгалужуються і циклічних алгоритмів в алгоритмічній мові використовуються так звані складові команди розгалуження і повторення (циклу), аналогічні пропозицій російської мови. Кожна з цих двох команд відрізняється від простих тим, що в неї входить умова, залежно від якого виконуються або не виконуються команди з числа входять в складову.
При розробці алгоритмів необхідно дотримуватися певних вимог:
Під алгоритмізацією розуміють процес розробки алгоритму вирішення якої-небудь задачі. Як приклад може служити процес розробки алгоритму знаходження найбільшого спільного дільника.
Процес розробки алгоритму включає в себе наступні етапи:
Як виконавці обчислювальних алгоритмів виступають ЕОМ. Для того щоб алгоритм був виконаний на ЕОМ, він перш за все, повинен бути записаний за допомогою спеціальної мови - мови програмування. Процес запису алгоритму обраною мовою в формі, доступній для обробки на ЕОМ, називається програмуванням, а результат записи алгоритму на цій мові називається програмою. Іншими словами, програма це набір приписів (інструкцій) дл ЕОМ.
Програмування виникло задовго до появи комп'ютерів. Першим програмістом вважається дочка відомого поета лорда Байрона Ада Лавлейс - учениця англійського математика Чарльза Беббіджа, який розробив в XIX столітті проект обчислювальної машини. На честь Ади Лавлейс одна з мов програмування був названий на її маєтком, згодом широко застосовуваний в Міністерстві оборони Сполучених Штатів Америки.
Мова програмування - формальна знакова система, призначена для запису комп'ютерних програм. Мова програмування визначає набір лексичних, синтаксичних і семантичних правил, які задають зовнішній вигляд програми і дії, які виконає виконавець (комп'ютер) під її управлінням.
З часу створення перших програмованих машин людство придумало вже більш восьми з половиною тисяч мов програмування. Щороку їх кількість поповнюється новими. Деякими мовами вміє користуватися тільки невелике число їх власних розробників, інші стають відомі мільйонам людей. Професійні програмісти іноді застосовують у своїй роботі більш десятка різноманітних мов програмування.
Творці мов по-різному тлумачать поняття мову програмування. До найбільш поширених тверджень, визнаним більшістю розробників, відносяться наступні:
В даний час мов програмування кілька десятків, а то і сотень. Я розглянула лише деякі з них.
Як відомо, ЕОМ здатна виконувати програму, написану на машинній мові, який являє собою послідовність нулів і одиниць. Такі програми пишуться на мовах програмування низького рівня.
Мова програмування низького рівня - це мова програмування, структура команд якого визначається форматом команд і даних машинного мови, а також архітектурою ЕОМ.
Яскравим представником мови програмування низького рівня є Асемблер (Assembler), який був розроблений в 50-ті роки минулого століття і дозволяє писати програми з використанням спеціальних позначень машинних кодів - мнемоніки. Асемблер широко застосовується в програмах, де необхідно високу швидкодію.
Однак складати програми на такій мові - справа дуже клопітка і невдячна. Тому були створені мови програмування високого рівня.
Мова програмування високого рівня - це мова програмування, кошти якого допускають опис завдання в наочному, легко сприйманому вигляді.
Кожна мова високого рівня визначається системою запису і набором правил. Грубо кажучи, це набір слів (словник) і правил складання пропозицій.
Мови програмування високого рівня звільняють користувача від програмування в машинних кодах. Однак таку програму не розуміє ЕОМ, їй доступний тільки машинний мову. Тому для трансляції (перекладу) програм з мови високого рівня в машинні коди використовуються програми компіляції або інтерпретації. При цьому відмінність компілятора від інтерпретатора полягає в тому, що компілятор спочатку переводить всі команди вихідної програми, записаної на мові високого рівня, в машинні інструкції, а потім виконує її, а інтерпретатор здійснює по командного обробку і виконання вихідної програми.
Кожна мова програмування високого рівня має свій стиль, свої правила і свою область застосування. До основних мов високого рівня відносяться:
Ада (Ada) - названий на честь Августи Ади Байрон, графині Лавлейс, дочки лорда Байрона, яка була співробітницею Чарльза Беббіджа, винахідника аналітичної машини, і написала для неї практично закінчену програму обчислення коефіцієнтів Бернуллі. Крім того вона ввела багато понять (цикл, умовний оператор), які тепер складають базу програмування. Сама мова Ада є універсальною мовою програмування, що підтримує методології розробки від низу до верху і зверху вниз, роздільну компіляцію, настроюються пакети, абстрактні типи даних, паралельне програмування і роботу в реальному часі, засоби для низькорівневого програмування, контрольовану точність обчислень, можливість гнучкого налаштування на конкретну платформу і багато іншого. В даний час Ада є основною мовою програмування Міністерства оборони США.
Алгол (Algorithmic Language - алгоритмічний мову) - універсальна мова для програмування обчислювальних задач. Йому властива близькість до математичної символіки.
Бейсік (Beginer All-Purpose Symbolic Code - універсальний символічний код для початківців) - мова для створення програм і їх рішення ЕОМ в режимі діалогу. Він був розроблений в середині 60-х років професорами Дармутского коледжу Джоном Кемені і Томасом Курц. Бейсік є одним з найпростіших і розповсюджених у світі мов програмування. В середині 80-х років фірмою Microsoft був реалізований мову QuickBasic (остання версія 4.5). Це повністю компільований мову, з нормальними структурними конструкціями, призначеними для користувача типами даних, причому ще і сумісний зі старими версіями. З появою Windows і моди на візуальні засоби розробки змінився і Basic. Його нова версія, названа Visual Basic, була відмінно пристосована для написання нескладних програм з розвиненим призначеним для користувача інтерфейсом. Visual Basic на рівні з Visual C є досить популярним засобом розробки під Windows.
Делфі (Delphi) виявився одним з перших продуктів, який зробив процес програмування простим і зрозумілим навіть початківцям розробникам. Це було пов'язано з появою на початку 90-х операційних систем з вбудованим графічним інтерфейсом. Дійсно, процес розробки програми в Delphi гранично спрощений. В першу чергу це відноситься до створення інтерфейсу, на який йде 80% часу розробки програми. Ви просто ставите потрібні компоненти на поверхню Windows-вікна (в Delphi воно називається формою) і налаштовуєте їх властивості за допомогою спеціального інструменту (Object Inspector). З його допомогою можна пов'язати події цих компонентів (натискання на кнопку, вибір мишею елемента в списку і т.д.) з кодом його обробки - і просте додаток готове. При цьому розробник отримує в своє розпорядження потужні засоби налагодження (аж до покрокового виконання команд процесора), зручну контекстну довідкову систему, засоби колективної роботи над проектом і т.д. - всього не перелічити.
Паскаль (Philips Automatic Sequence Calculator). Ця мова був розроблений швейцарським вченим Ніклаус Віртом в 1969 році як навчальний мову, але через деякий час набув популярності як відмінний інструмент для вирішення серйозних завдань. Програмування на Паскалі забезпечує високу надійність програм. Програми на Паскалі зрозумілі будь-якому програмісту і в той же час вони легко транслюються в ефективні машинні коди. Паскаль, поряд з Бейсиком, вважається так само навчальним мовою; він прийнятий у багатьох навчальних закладах як базова мова для вивчення програмування. Так, в США з 1983 року Паскаль введений в навчальні курси всіх середніх шкіл для учнів, що спеціалізуються в галузі інформатики. У міру свого розвитку мова Паскаль постійно вдосконалювався і набував нових властивостей і зараз більш відома мова Турбо Паскаль, розроблений фірмою Borland.
Сі (C) - мова, спеціально розроблений для написання системних програм і перенесення запису програмного забезпечення з однієї ЕОМ на іншу. Ця мова була створена співробітником фірми Ball Labs Денисом Рітчі в 1972 році і став головним інструментом для створення операційних систем UNIX і MS-DOS. Як і всі мови, мова C поступово вдосконалювався. Вже на початку 80-х років Бйорн Страуструп в AT & T Bell Labs став розробляти розширення мови C під умовною назвою «C з класами», що дає можливість визначати і використовувати нові типи даних. Перший комерційний транслятор нової мови, який отримав назву C ++, з'явився в 1983 році. Він був препроцесором, який транслював програму в код на C. Однак фактично народженням мови можна вважати вихід в 1985 році книги Страуструпа «The C ++ Programming Language». Саме з цього моменту C ++ починає набирати усесвітню популярність.
Головною перевагою C ++ є можливість створення і використання в програмі своїх власних повноцінних типів даних, «налаштованих» на конкретну задачу. Наприклад, працюючи в середовищі Turbo C ++, програміст може використовувати такі концепції: вікно редактора або відладчика; текст в поточному вікні; меню команд; режим компіляції. Над ними можуть виконуватися, наприклад, такі дії: відкрити нове вікно або закрити непотрібне; вибрати інше поточне вікно; перемістити вікно або змінити його розмір; виконати вертикальний зсув тексту в вікні; упорядкувати розташування вікон на екрані; вибрати потрібну команду меню за допомогою миші; змінити режим компіляції; зберегти поточний режим компіляції.
Фортран (Formula Translator - перекладач формул) був розроблений в середині 50-х років програмістами фірми IBM. В основному він використовується для програм, що виконують природничі та математичні розрахунки.
Ява (Java) - мова для програмування Internet, що дозволяє створити безпечні, що переносяться, надійні, об'єктно-орієнтовані інтерактивні програми з паралельно виконуються препроцесорами. Мова Ява жорстко пов'язаний з Internet, тому що першою серйозною програмою, написаної на цій мові, був браузер Всесвітньої павутини.
Будь-які дані, тобто константи, змінні, властивості, значення функції або виразу характеризуються своїми типами. Тип визначає безліч допустимих значень, які може мати той чи інший об'єкт, а також безліч допустимих операцій, які застосовні до нього. Крім того, тип визначає також формат внутрішнього представлення даних в пам'яті ПК.
Необхідність використання типів даних
Типи даних розрізняються починаючи з нижніх рівнів системи. Так, наприклад, навіть в Асемблері х86 розрізняються типи «ціле число» і «дійсне число». Це пояснюється тим, що для чисел розглянутих типів відводяться різні обсяги пам'яті, використовуються різні регістри мікропроцесора, а для операцій з ними застосовуються різні команди Ассемблера і різні ядра мікропроцесора.
Концепція типу даних з'явилася в мовах програмування високого рівня як природним відбитком того факту, що оброблювані програмою дані можуть мати різні безлічі допустимих значень, зберігатися в пам'яті комп'ютера різним чином, займати різні обсяги пам'яті і оброблятися за допомогою різних команд процесора.
Практичне застосування
Як правило, типи мов програмування не завжди строго відповідають подібним математичним типам. Наприклад, тип «ціле число» більшості мов програмування не відповідає прийнятому в математиці типу «ціле число», так як в математиці вказаний тип не має обмежень ні зверху, ні знизу, а в мовах програмування ці обмеження є. Як правило, в мовах і системах є безліч цілих типів, що відрізняються допустимим діапазоном значень (визначеним обсягом займаної пам'яті). Варто відзначити, що в більшості реалізацій мов і систем вихід за кордон цілого типу (переповнення) не призводить до виняткової ситуації.
Мови без типів
Теоретично не може існувати мов, в яких відсутні типи. Це випливає з того, що всі мови засновані на машині Тьюринга або на лямбда-численні. І в тому, і в іншому випадку необхідно оперувати як мінімум одним типом даних - зберігаються на стрічці (машина Тьюринга) або переданим і повертається з функції (лямбда-числення). Нижче перераховані мови програмування за способом визначення типів даних:
На практиці мови програмування підтримують кілька моделей визначення типів одночасно.
Кожна мова програмування підтримує один або кілька вбудованих типів даних (базових типів) (див. Класифікацію типів даних), крім того, розвинені мови програмування надають програмісту можливість описувати власні типи даних, комбінуючи або розширюючи існуючі.
Переваги від використання типів даних
Типи даних бувають такі:
Розглянемо деякі з типів більш детально
Порядкові типи характеризуються тим, що кожен з них має кінцеве число можливих значень, серед яких встановлений лінійний порядок. З кожним із значень можна зіставити деяке ціле число - його порядковий номер.
Порядкові типи характеризуються тим, що кожен з них має кінцеве число можливих значень, серед яких встановлений лінійний порядок. З кожним із значень можна зіставити деяке ціле число - його порядковий номер.
Перерахований тип задається перерахуванням тих значень, які він може отримувати. Кожне значення іменується деяким ідентифікатор і розташовується в списку, обрамленим круглими дужками, наприклад:
Type
Colors = (red, white, blue);
Відповідність між значеннями перерахованого типу і порядковими номерами цих значень встановлюється черговістю перерахування: перше значення в списку отримує номер 0, друге - 1 і т.д. Максимальна потужність перерахованого типу становить 65536.
До даних перерахованого типу застосовні операції відносини.
Цілочисельні типи - позначають безлічі цілих чисел в різних діапазонах. Є п'ять цілочисельних типів, що розрізняються діапазоном допустимих значень і розміром займаної оперативної пам'яті. Цілочисельні типи позначаються ідентифікаторами: Byte, ShortInt, Word, Integer, LongInt; їх характеристики наведені в таблиці нижче.
Тип |
Діапазон |
Розмір в байтах |
Byte |
0 ... 255 |
1 |
ShortInt |
-128 ... 127 |
1 |
Word |
0 ... 65535 |
2 |
Integer |
-32768 ... 32767 |
2 |
LongInt |
-2147483648 ... 2147483647 |
4 |
Значення цілих типів записуються в програмі звичним способом:
123 4 -3 +345 -699
Наявність десяткового дробу в запису цілого числа неприпустимо. Буде помилкою записати ціле число в такий спосіб:
123.0
Крім привичной десяткової форми запису допускається запис цілих чисел в шістнадцятковому форматі, використовуючи префікс $, наприклад:
$ 01AF $ FF $ 1A $ F0A1B
Регістр букв A, B, ..., F значення не має.
Допустимі операції:
Логічний тип (Boolean) - складається всього з двох значень: False (хибність) і True (істинно). Слова False і True визначені в мові і є, по суті, логічними константами. Регістр букв в їх написанні є несуттєвим: FALSE = false. Значення цього типу є результатом обчислень умовних і логічних виразів і беруть участь у всіляких умовних операторах мови.
Допустимі операції:
- присвоювання;
- порівняння: <,>,> =, <=, <>, =;
- логічні операції: NOT, OR, AND, XOR
Символьний тип (Char) - це тип даних, що складаються з одного символу (знака, літери, коду). Значним типу Char може бути будь-який символ з набору ASCII (7-бітна кодування для представлення десяткових цифр, латинської та національного алфавітів, розділових знаків і керівничих символів). Якщо символ має графічне представлення, то в програмі він записується укладеним в поодинокі лапки (апострофи), наприклад:
'Ж' 's' '.' '*' '' - (пропуск)
Для уявлення самого апострофа його зображення подвоюється: '' ''. Якщо ж символ не має графічного представлення, наприклад, символ табуляції або символ повернення каретки, то можна скористатися еквівалентної формою записи символьного значення, що складається з префікса # і ASCII-коду символу:
# 9 # 32 # 13
Допустимі операції:
- присвоювання;
- порівняння: <,>,> =, <=, <>, =.
Великим вважається той символ, який має більший ASCII-номер.
Строковий тип (String, String [n]) - цей тип даних визначає послідовності символів - рядки. Параметр n визначає максимальну кількість символів в рядку. Якщо він не заданий, мається на увазі n = 255. Значення типу "рядок" в програмі пишеться як послідовність символів, укладених в поодинокі лапки (апострофи), наприклад
'Це текстова рядок' 'This is a string''1234' - це теж рядок, не число " '- порожній рядок
Допустимі операції:
наприклад, S: = 'Зима' + '' + 'прийшла!'
; - порівняння: <,>,> =, <=, <>, =.
Рядки вважаються рівними, якщо мають однакову довжину і посимвольний еквівалентні.
Речові типи - позначають безлічі дійсних чисел в різних діапазонах. Є п'ять речових типів, що розрізняються діапазоном допустимих значень і розміром займаної оперативної пам'яті. Речові типи позначаються ідентифікаторами: Real, Single, Double, Extended, Comp; їх характеристики наведені в таблиці нижче.
Тип |
Диапазон |
Размер в байтах |
Real |
2.9·10-39 ... 1.7·1038 |
6 |
Single |
1.5·10-45 ... 3.4·1038 |
4 |
Double |
5.0·10-324 ... 1.7·10308 |
8 |
Extended |
3.4·10-4932 ... 1.1·10-4932 |
10 |
Comp |
-2·1063 ... +2·1063-1 |
8 |
Тип Comp хоча і відноситься до речових типам, насправді є цілочисельним з дуже величезним діапазоном значень.
Значення речових типів можуть записуватися в програмі декількома способами:
1.456 |
0.000134 |
-120.0 |
65432 |
+345 |
0 |
-45 |
127E+12 |
-1.5E-5 |
-1.6E+12 |
5E4 |
0.002E-6 |
Буде помилкою записати дійсне число в такий спосіб:
.5 (правильно 0.5) 12. (Правильно 12.0 або 12)
Дійсне число в формі з плавучою крапкою (експоненціальна форма) записується як пара
<Мантиса> Е <порядок>
Таке позначення розуміється як "мантиса, помножена на десять в ступені, рівному порядку". наприклад,
-1.6E + 12 відповідає -1.6 • 1012
Допустимі операції: - присвоювання;
- все арифметичні: +,
-, *, /; - порівняння: <,>,> =, <=, <>, =.
При порівнянні дійсних чисел слід пам'ятати, що в наслідок неточності їх подання в пам'яті комп'ютера (на увазі неминучість округлення) варто уникати спроб визначення строгого рівності двох речових значень. Є шанс, що рівність виявиться помилковим, навіть якщо насправді це не так.
Діапазон або (обмежений тип) не є визначеним типом мови (таким як, наприклад, Integer або Char) і тому йому не відповідає ніякої ідентифікатор. Цей тип вводиться користувачем. Використовуючи його ми можемо визначити новий тип, який буде містити значення лише з обмеженого піддіапазонна якогось базового типу. Базовим типом може бути тільки цілочисельний тип, тип Char (символьний) і будь-який з введених програмістом перелічуваних типів.
Для введення нового типу - діапазону - потрібно в блоці опису типів TYPE вказати ім'я вводиться типу і межі діапазону через спеціальний символ діапазону ".." (дві точки поспіль):
TYPE Century = 1..21; {Піддіапазон ціло численного типу} CapsLetters = 'А' .. 'Я'; {Піддіапазон з типу Char}
Структура даних - програмна одиниця, що дозволяє зберігати і обробляти безліч однотипних і / або логічно пов'язаних даних в обчислювальній техніці. Для додавання, пошуку, зміни і видалення даних структура даних надає певний набір функцій, з яких складається інтерфейс. Структура даних часто є реалізацією будь-якого абстрактного типу даних.
При розробці програмного забезпечення велику роль відіграє проектування сховища даних і представлення всіх даних у вигляді безлічі пов'язаних структур даних.
Добре спроектована сховище даних оптимізує використання ресурсів (таких як час виконання операцій, який використовується обсяг оперативної пам'яті, число звернень до дискових накопичувачів), необхідних для виконання найбільш критичних операцій.
Структури даних формуються за допомогою типів даних, посилань і операцій над ними в обраною мовою програмування.
Різні види структур даних підходять для різних додатків; деякі з них мають вузьку спеціалізацію для певних завдань. Наприклад, B-дерева зазвичай підходять для створення баз даних, в той час як хеш-таблиці використовуються повсюдно для створення різного роду словників, наприклад, для відображення доменних імен в інтернет-адреси комп'ютерів.
При розробці програмного забезпечення складність реалізації і якість роботи програм істотно залежить від правильного вибору структур даних. Це розуміння дало початок формальним методам розробки та мов програмування, в яких саме структури даних, а не алгоритми, є наріжним архітектури програмного засобу. Велика частина таких мов володіє певним типом модульності, що дозволяє структурам даних безпечно пере використати в різних додатках. Об'єктно-орієнтовані мови, такі як Java, C # і C ++, є прикладами такого підходу.
Багато класичні структури даних представлені в стандартних бібліотеках мов програмування або безпосередньо вбудовані в мови програмування. Наприклад, структура даних хеш-таблиця вбудована в мови програмування Lua, Perl, Python, Ruby, Tcl і ін. Широко використовується стандартна бібліотека шаблонів STL як і мова програмування C ++.
Фундаментальними будівельними блоками для більшої частини структур даних є масиви, записи (див. Конструкцію struct в мові Сі і конструкцію record в мові Паскаль), розмічені об'єднання (див. Конструкцію union в мові Сі) і посилання. Наприклад, структура даних двозв'язний список, може бути побудована за допомогою записів і зануляють посилань, а саме, кожен запис буде надавати блок даних (вузол, node), що містить посилання на «лівий» і «правий» вузли, а також самі збережені дані.
Спроба класифікації деяких з них на підставі особливостей:
«Упорядкована» не означає - відсортована, тільки те, що вихідний порядок «збережений». Інші структури, такі як «зв'язний список» і «стек» не можуть легко бути визначені таким чином, тому що існують спеціальні операції асоціюються з ними.
Статичні структури відносяться до розряду непримітивних структур, які представляють собою структуроване безліч примітивних, базових, структур. Наприклад, вектор може бути представлений впорядкованим безліччю чисел. Оскільки за визначенням статичні структури відрізняються відсутністю мінливості, пам'ять для них виділяється автоматично - як правило, на етапі компіляції або при виконанні - в момент активізації того програмного блоку, в якому вони описані. Виділення пам'яті на етапі компіляції є таким зручним властивістю статичних структур, що в ряді завдань програмісти використовують їх для представлення об'єктів, що володіють мінливістю. Наприклад, коли розмір масиву невідомий заздалегідь, для нього резервується максимально можливий розмір.
Статичні структури в мовах програмування пов'язані зі структурованими типами. Структуровані типи в мовах програмування є тими засобами інтеграції, які дозволяють будувати структури даних як завгодно великої складності. До таких типів належать: масиви, записи (в деяких мовах - структури) і безлічі (цей тип реалізований не у всіх мовах).
Вектори. Вектор (одновимірний масив) - структура даних з фіксованим числом елементів одного і того ж типу. Кожен елемент вектора має унікальний в рамках заданого вектора номер. Звернення до елементу вектора виконується по імені вектора і номером необхідного елемента.
Масиви. Логічна структура: масив - така структура даних, яка характеризується: фіксованим набором елементів одного і того ж типу; кожен елемент має унікальний набір значень індексів; кількість індексів визначають рівномірність масиву (два індексу - двовимірний масив, три індексу - тривимірний масив, один індекс - одновимірний масив або вектор); звернення до елементу масиву виконується по імені масиву і значенням індексів для даного елемента. Іншими словами, масив - це вектор, кожен елемент якого - вектор.
Тип масив визначається конструкцією:
Array [діапазон] of ТіпЕлементов;
Діапазон в квадратних дужках вказує значення індексів першого і останнього елемента в Стурктура. Приклади оголошення типів і змінних:
TYPE Vector = array [1..10] of Real; VAR V1: Vector; V2: array [0..5] of
Byte;
Тут змінна V1 визначається з використанням описаного вище типу Vector; тип змінної V2 конструюється непостредственно на етапі її опису.
У качетве типу елементів масиву можна також указаивать масив, утворюючи тим самим багатовимірні структури. Наприклад, опис двовимірної структури (матриці) буде вигдядеть наступним чином:
VAR M1: array [1..3] of array [1..3] of Byte;
Це ж саме можна записати набагато компактніше:
VAR M2: array [1..3, 1..3] of Byte;
Тут масиви M1 і M2 мають абсолютно однакову структуру - квадратної матриці розміром 3x3.
Доступ до елемента масиву здійснюється шляхом зазначення його індексу, наприклад:
writeln (V1 [1]); {Висновок на екран першого елемента масиву V1} readln (
M2 [2,3]); {введення третього елемента другого рядка матриці М2}
Фізична структура - це розміщення елементів масиву в пам'яті ЕОМ. Багатовимірні масиви зберігаються в безперервній області пам'яті. Розмір слота визначається базовим типом елемента масиву. Кількість елементів масиву і розмір слота визначають розмір пам'яті для зберігання масиву. Принцип розподілу елементів масиву в пам'яті визначено мовою програмування. Так в FORTRAN елементи розподіляються по стовпцях - так, що швидше змінюється ліві індекси, в PASCAL - по рядках - зміна індексів виконується в напрямку справа наліво.
Спеціальні масиви. На практиці зустрічаються масиви, які в силу певних причин можуть записуватися в пам'ять не повністю, а частково. Це особливо актуально для масивів настільки великих розмірів, що для їх зберігання в повному обсязі пам'яті може бути недостатньо. До таких масивів відносяться симетричні і розріджені масиви.
Симетричні масиви. Двовимірний масив, в якому кількість рядків дорівнює кількості стовпців називається квадратною матрицею. Квадратна матриця, у якій елементи, розташовані симетрично щодо головної діагоналі, попарно рівні один одному, називається симетричною.
Розріджені масиви. Розріджений масив - масив, більшість елементів якого рівні між собою, так що зберігати в пам'яті досить лише невелике число значень відмінних від основного (фонового) значення інших елементів. Розрізняють два типи розріджених масивів:
Безлічі. Логічна структура: Безліч - така структура, яка представляє собою набір неповторюваних даних одного і того ж типу. Безліч може приймати всі значення базового типу. Базовий тип не повинен перевищувати 256 можливих значень. Тому базовим типом множини можуть бути byte, char і похідні від них типи.
Фізична структура: Безліч в пам'яті зберігається як масив бітів, в якому кожен біт вказує чи є елемент належить оголошеному безлічі чи ні. Т.ч. максимальне число елементів безлічі 256, а дані типу безліч можуть займати не більше 32-ох байт.
Числові множини. Стандартний числовий тип, який може бути базовим для формування безлічі - тип byte.
Символьні безлічі. Символьні безлічі зберігаються в пам'яті також як і числові множини. Різниця лише в тому, що зберігаються не числа, а коди ASCII символів.
Безліч з елементів перечисленого типу. Безліч, базовим типом якого є перелічувальний тип, зберігається також, як безліч, базовим типом якого є тип byte. Але, в пам'яті займає місце, яке залежить від кількості елементів в перелічуваних типі.
Безліч від інтервального типу. Безліч, базовим типом якого є інтервальний тип, зберігається також, як безліч, базовим типом якого є тип byte. У пам'яті займає місце, яке залежить від кількості елементів, що входять в оголошений інтервал.
Записи. Запис - кінцеве впорядкована множина полів, що характеризуються різним типом даних. Полями записи можуть бути інтегровані структури даних - вектори, масиви, інші записи. Записи є надзвичайно зручним засобом для подання програмних моделей реальних об'єктів предметної області, як правило, кожен такий об'єкт має набір властивостей, що характеризуються даними різних типів.
Таблиці. Таблиця - складна інтегрована структура. З фізичної точки зору таблиця являє собою вектор, елементами якого є записи. Логічної особливістю таблиць є те, що доступ до елементів таблиці проводиться не по номеру (індексу), а по ключу - за значенням одного з властивостей об'єкта, що описується записом-елементом таблиці. Ключ - це властивість, що ідентифікує даний запис в безлічі однотипних записів. Ключ може включатися до складу записи і бути одним з її полів, але може і не включатися в запис, а обчислюватися по положенню запису. Таблиця може мати один або кілька ключів. Основною операцією при роботі з таблицями є операція доступу до запису по ключу. Вона реалізується процедурою пошуку. Оскільки пошук може бути значно більш ефективним в таблицях, упорядкованих за значеннями ключів, досить часто над таблицями необхідно виконувати операції сортування.
Іноді розрізняють таблиці з фіксованою і змінною довжиною запису. Очевидно, що таблиці, які б поєднували записи абсолютно ідентичних типів, матимуть фіксовані довжини записів. Таблиці із записами змінної довжини обробляються тільки послідовно - в порядку зростання номерів записів.
Напівстатичні структури даних характеризуються такими ознаками: вони мають змінну довжину і прості процедури її зміни; зміна довжини структури відбувається в певних межах, не перевищуючи якогось максимального (граничного) значення.
Якщо полустатіческую структуру розглядати на логічному рівні, то про неї можна сказати, що це послідовність даних, пов'язана відносинами лінійного списку. Доступ до елементу може здійснюватися по його порядковому номеру. Фізичне представлення полустатіческіх структур даних в пам'яті це зазвичай послідовність слотів в пам'яті, де кожен наступний елемент розташований в пам'яті в наступному слоті (тобто вектор). Фізичне представлення може мати також вид односпрямованого зв'язного списку (ланцюжки), де кожен наступний елемент адресується покажчиком знаходиться в поточному елементі.
Стеки. Стек - такий послідовний список зі змінною довжиною, включення і виключення елементів з якого виконуються тільки з одного боку списку, званого вершиною стека. Застосовуються й інші назви стека - магазин і чергу, функціонує за принципом LIFO (Last - In - First- Out - "останнім прийшов - першим вийшов").
Основні операції над стеком - включення нового і виключення елемента з стека. Корисними можуть бути також допоміжні операції: визначення поточного числа елементів в стеку і очищення стека. Деякі автори розглядають також операції включення / виключення елементів для середини стека, однак структура, для якої можливі такі операції, не відповідає стеку за визначенням.
Для наочності розглянемо невеликий приклад, що демонструє принцип включення елементів в стек і виключення елементів з стека. На рис. 1.3. (А, б, с) зображені стану стека:
а) порожнього;
б, в, г) після послідовного включення в нього елементів з іменами 'A', 'B', 'C';
д, е) після послідовного видалення з стека елементів 'C' і 'B';
ж) після включення в стек елемента 'D'.
Малюнок 1.3 - Включення і виключення елементів із стека
Як видно з малюнку 1.3., Стек можна уявити, наприклад, у вигляді стопки книг (елементів), що лежить на столі. Дамо кожній книзі свою назву, наприклад A, B, C, D ... Тоді в момент часу, коли на столі книг немає, про стек аналогічно можна сказати, що він порожній, тобто не містить жодного елемента. Якщо ж ми почнемо послідовно класти книги одну на іншу, то отримаємо стопку книг (припустимо, з n книг), або отримаємо стек, в якому міститься n елементів, причому вершиною його буде елемент n + 1. Видалення елементів з стека здійснюється аналогічним чином т. Е. Віддаляється послідовно між окремими елементами починаючи з вершини, або по одній книзі з стопки.
Черги FIFO. Чергою FIFO (First - In - First- Out - "першим прийшов - першим вийшов") називається такий послідовний список зі змінною довжиною, в якому включення елементів виконується тільки з одного боку списку (цю сторону часто називають кінцем або хвостом черги), а виняток - з іншого боку (званої початком або головою черги). Основні операції над чергою - ті ж, що і над стеком - включення, виключення, визначення розміру, очищення, неруйнуюче читання.
Деки. Дек - особливий вид черги. Дек (від англ. Deq - double ended queue, тобто чергу з двома кінцями) - це такий послідовний список, в якому як включення, так і виключення елементів може здійснюватися з будь-якого з двох кінців списку. Окремий випадок дека - дек з обмеженим входом і дек з обмеженим виходом. Логічна і фізична структури дека аналогічні логічної і фізичної структури кільцевої FIFO-черзі. Однак, стосовно деку доцільно говорити не про початок і кінець, а про лівому та правому кінці. Операції над Деком: включення елемента праворуч, ліворуч; виключення елемента праворуч, ліворуч; визначення розміру; очистка.
Рядки. Рядок - це лінійно впорядкована послідовність символів, що належать кінцевому безлічі символів, званого алфавітом. Рядки мають наступні важливими властивостями: їх довжина, як правило, змінна, хоча алфавіт фіксований; зазвичай звернення до символів рядка йде з якогось одного кінця послідовності, тобто важлива впорядкованість цієї послідовності, а не її індексація; в зв'язку з цим властивістю рядка часто називають також ланцюжками; найчастіше метою доступу до рядка є не окремий її елемент (хоча це теж не виключається), а деяка ланцюжок символів в рядку.
Говорячи про рядках, зазвичай мають на увазі текстові рядки - рядки, що складаються з символів, що входять в алфавіт будь-якого обраного мови, чисел, знаків пунктуації та інших службових символів.
Базовими операціями над рядками є: визначення довжини рядка; присвоювання рядків; конкатенація (зчеплення) рядків; виділення підрядка; пошук входження.
Операція визначення довжини рядка має вигляд функції, що повертає значення якої - ціле число - поточне число символів в рядку. Операція присвоювання має таке ж значення, що і для інших типів даних.
Динамічні структури за визначенням характеризуються відсутністю фізичної суміжності елементів структури в пам'яті непостійністю і непередбачуваністю розміру (числа елементів) структури в процесі її обробки. Для встановлення зв'язку між елементами динамічної структури використовуються покажчики, через які встановлюються явні зв'язки між елементами. Таке уявлення даних в пам'яті називається зв'язковим. Елемент динамічної структури складається з двох полів:
Коли чіткий уявлення даних використовується для розв'язання прикладної задачі, для кінцевого користувача "видимим" робиться тільки вміст інформаційного поля, а поле зв'язок використовується тільки програмістом-розробником.
Переваги зв'язкового представлення даних: в можливості забезпечення значною мінливості структур; розмір структури обмежується тільки доступним об'ємом машинної пам'яті; при зміні логічної послідовності елементів структури потрібно не переміщення даних в пам'яті, а тільки корекція покажчиків.
Разом з тим чіткий уявлення не позбавлене і недоліків: робота з покажчиками вимагає, як правило, більш високої кваліфікації від програміста; на поля зв'язок споживання пам'ять; доступ до елементів зв'язної структури може бути менш ефективним за часом. Останній недолік є найбільш серйозним і саме їм обмежується можливість застосування зв'язкового представлення даних.
Зв'язкові лінійні списки. Списком називається впорядкована множина, що складається з змінного числа елементів, до яких застосовні операції включення, виключення. Список, що відображає відносини сусідства між елементами, називається лінійним. Якщо обмеження на довжину списку не допускаються, то список представляється в пам'яті у вигляді зв'язного структури. Лінійні зв'язні списки є найпростішими динамічними структурами даних. Графічно зв'язку в списках зручно зображувати за допомогою стрілок.
Різновидом розглянутих видів лінійних списків є кільцевої список, який може бути організований на основі як однозв'язного, так і двозв'язний списків. При цьому в однозв'язного списку покажчик останнього елемента повинен вказувати на перший елемент; в двозв'язний списку в першому і останньому елементах відповідні покажчики перевизначаються, як показано на рис.1.6. При роботі з такими списками кілька спрощуються деякі процедури, що виконуються над списком. Однак, при перегляді такого списку слід прийняти деяких запобіжних заходів, щоб не потрапити в нескінченний цикл.
Лінійні списки знаходять широке застосування в додатках, де непередбачувані вимоги на розмір пам'яті, необхідної для зберігання даних; велике число складних операцій над даними, особливо включень і виключень. На базі лінійних списків можуть будується стеки, черги і деки. Подання черзі за допомогою лінійного списку дозволяє досить просто забезпечити будь-які бажані дисципліни обслуговування черги. Особливо це зручно, коли число елементів в черзі важко передбачувано.
Нелінійним розгалуженим списком є список, елементами якого можуть бути теж списки. Якщо один з покажчиків кожного елемента списку задає порядок зворотний до порядку, що встановлюється іншим покажчиком, то такий двозв'язний список буде лінійним. Якщо ж один з покажчиків задає порядок довільного виду, який не є зворотним по відношенню до порядку, що встановлюється іншим покажчиком, то такий список буде нелінійним. В обробці нелінійний список визначається як будь-яка послідовність атомів і списків (підсписків), де в якості атома береться будь-який об'єкт, який при обробці відрізняється від списку тем, що він структурно неподільний.
Графи. Граф - це складна нелінійна багатозв'язна динамічна структура, яка відображає властивості і зв'язку складного об'єкта.
Багатозв'язна структура має такі властивості: на кожен елемент (вузол, вершину) може бути будь-яку кількість посилань; кожен елемент може мати зв'язок з будь-якою кількістю інших елементів; кожна зв'язка (ребро, дуга) може мати напрямок і вага.
У вузлах графа міститься інформація про елементи об'єкта. Зв'язки між вузлами задаються ребрами графа. Ребра графа можуть мати спрямованість, які будуть показані стрілками, тоді вони називаються орієнтованими, ребра без стрілок - неорієнтовані.
Граф, всі зв'язки якого орієнтовані, називається орієнтованим графом або Орграф; граф з усіма неорієнтованими зв'язками - неорієнтованим графом; граф зі зв'язками обох типів - змішаним графом.
Для орієнтованого графа число ребер, що входять у вузол, називається напів ступені заходу вузла, що виходять з вузла - напів ступені результату. Кількість вхідних і вихідних ребер може бути будь-яким, в тому числі і нульовим. Граф без ребер є нуль-графом. Якщо ребрам графа відповідають деякі значення, то граф і ребра називаються виваженими. Мультиграфом називається граф, що має паралельні (що з'єднують одні і ті ж вершини) ребра, в іншому випадку граф називається простим.
Шлях в графі - це послідовність вузлів, пов'язаних ребрами; елементарним називається шлях, у якому все ребра різні, простим називається шлях, у якому всі вершини різні. Шлях від вузла до самого себе називається циклом, а граф, що містить такі шляхи - циклічним.
Два вузла графа суміжні, якщо існує шлях від одного з них до іншого. Вузол називається інцидентним до ребру, якщо він є його вершиною, тобто ребро направлено до цього вузла.
Логічно структура-граф може бути представлена матрицею суміжності або матрицею інцидентності.
Дерева. Дерево - це граф, який характеризується наступними властивостями:
Назва "дерево" виникає з логічної еквівалентності дерево видної структури абстрактному дереву в теорії графів. Лінія зв'язку між парою вузлів дерева називається зазвичай гілкою. Ті вузли, які не посилаються на жодні інші вузли дерева, називаються листям або термінальними вершинами (рис. 1.8 .; 1.9. - b, k, l, h - листя). Вузол, який не є листом або коренем, вважається проміжним або вузлом розгалуження (нетермінальних або внутрішньої вершиною). Дерева потрібні для опису будь-якої структури з ієрархією. Традиційні приклади таких структур: генеалогічні дерева, десяткова класифікація книг в бібліотеках, ієрархія посад в організації і т. п.
Орієнтоване дерево - це такий ациклічний орграф (орієнтований граф), у якого одна вершина, яка називається коренем, має напів ступені заходу, що дорівнює 0, а інші - напів ступені заходу, рівні 1. орієнтоване дерево повинно мати, принаймні, одну вершину. Ізольована вершина також є орієнтоване дерево. Вершина орієнтованого дерева, напів ступені результату якої дорівнює нулю, називається кінцевий (висячої) вершиною або листом; всі інші вершини дерева називають вершинами розгалуження. Довжина шляху від кореня до деякої вершини називається рівнем (номером ярусу) цієї вершини. Рівень кореня орієнтованого дерева дорівнює нулю, а рівень будь-якої іншої вершини дорівнює відстані між цією вершиною і коренем.
Типи даних - це абстрактні структури або класи, які використовуються для організації даних і надають різні операції над цими даними.
У даній роботі були описані структури даних всіх класів пам'яті ЕОМ: простих, статичних, напів ступеневих, динамічних і нелінійних, а також, інформація про можливі операції над усіма перерахованими структурами. За допомогою операцій можна організовувати пошук, сортування та редагування даних.
Важливість правильного, логічного упорядкування структур даних впливає на ефективність алгоритмів. Вибір правильного уявлення даних служить ключем до успішного програмування і може більшою мірою позначатися на продуктивності програми, ніж деталі використовуваного алгоритму. Для визначення того, як структури даних впливають на продуктивність програм, потрібно розглянути, як можна строго проаналізувати різні операції, що виконуються структурами даних. Навряд чи коли-небудь з'явиться загальна теорія вибору структур даних.
Варто додати, що сукупність структур даних та операцій їх обробки складає модель даних, яка є ядром будь-якої бази даних. Модель даних являє собою безліч структур даних, обмежень цілісності і операцій маніпулювання даними. За допомогою моделі даних можуть бути представлені об'єкти предметної області та взаємозв'язку між ними. База даних ґрунтується на використанні ієрархічної, мережевої або реляційної моделі, на комбінації цих моделей або на деякій їх підмножині.