Символьні та рядкові типи даних
Символьні та рядкові типи даних
Отже, з числами ми розібралися. Настала черга тексту. Delphi дозволяє маніпулювати текстовими даними у вигляді окремих символів, а також у вигляді послідовностей символів - рядків.
Тут слід зробити невеличкий ліричний відступ з приводу викладу матеріалу. Справа в тому, що тема зберігання текстових даних надзвичайно велика як за кількістю, так і за складністю. Якщо відразу ж вивалити її на голову простого чайника у всій повноті, то він мало чого зрозуміє і, швидше за все, заплутається. Тому ми вчинимо, як роблять в школі на уроках фізики. Спочатку закони фізики пояснюються по-простому, у вигляді ньютонівської механіки, а вже потім, значно пізніше, починаємо розповідати релятивістські казки від казкаря Ейнштейна, і бачимо, що первісне світогляд виявляється всього лише спрощеним уявленням реальної картини світу. Так само зробимо і тут.
Тип даних Char
Базовий тип даних (тобто те на чому ґрунтуються всі інші текстові типи даних) - Char. Змінна типу Char може зберігати всього один символ, один з набору 256 символів. Кожен символ має свій код. На самій-то справі комп'ютер оперує не символами, (він не знає що це таке) а кодами символів. Наприклад, під час друку символу з певним кодом він шукає графічне зображення символу в таблиці зображень символів за певним номером, а потім виводить саме це графічне зображення на дисплей. Символи можна порівнювати між собою на рівність і на визначення, який більше або менше, тоді комп'ютер знову ж порівнює не власними символи, а їх коди.
Приблизно таблицю символів можна описати приблизно так. На початку йдуть різні службові символи, що управляють, які не мають графічного представлення. Наприклад, це символи табуляції, повернення каретки, переведення рядка і т.п. Потім йдуть знаки пунктуації '!', '?', '.' і т.п. Далі йдуть цифри "1", '2', '3' і т.д. Наступними йдуть літери англійського алфавіту 'A', 'B', 'C'. 'Z', 'a', 'b', 'c'. 'Z'. Завершують таблицю літери національного алфавіту: 'А', 'Б', 'В'. 'Я', 'а', 'б', 'в'. 'Я'.
Слід зауважити, що існує маса таких таблиць символів. Різні системи можуть по-різному інтерпретувати коди символів з тієї простої причини, що вони керуються різними таблицями символів. У цьому опусі ми будемо використовувати таблицю символів звану Windows Code Page тисячі двісті п'ятьдесят-один (Cyrillic). Це таблиця символів для кирилиці в системах Microsoft Windows. Це означає що в системі Windows кожен символ з певним кодом буде інтерпретуватися однаково для всіх програм, якщо вони звичайно не реалізують якусь свою, специфічну обробку символів.
Як ми вже говорили раніше, змінні символьних типів можуть містити тільки один символ, а не два і не три і т.д. Приклад використання типу Char:
Ця програма надає змінної типу Char значення символу 'Z' а потім виводить його на консоль.
А ось ця програма не буде скомпільована компілятором через помилки компіляції. Змінної A може бути присвоєно значення тільки одного символу.
Операції над рядками
Нижче перераховані основні, найбільш загальні операції які можуть проводитися з рядками. В основному всі операції реалізуються через функції стандартної бібліотеки.- присвоювання рядку значення іншого рядка або константи
- отримання значення рядка
- отримання довжини рядка (кількість символів в рядку)
- отримання значення конкретного символу (символу знаходиться в певній позиції рядка)
- зміна значення конкретного символу в рядку
- злиття (конкатенація) двох і більше рядків
- виділення підрядка з рядка
- вставка одного рядка всередину іншої
- видалення частини рядка
- визначення позиції входження одного рядка в іншу
- дає змогу змінювати регістр символів
- порівняння рядків на рівність або більше / менше
Забігаючи трохи наперед, слід вказати, що багато операцій над рядками виконуються за допомогою різних підпрограм. Підпрограма - шматочок програмного коду, який має ідентифікатор і може бути викликаний по ньому для виконання будь-якої задачі. Найчастіше підпрограма вимагає передати їй якісь параметри. Як параметри використовується або вираз, або ідентифікатор чого-небудь. Наприклад, ідентифікатор змінної або константи. Підпрограми поділяються на процедури і функції. Різниця між ними лише в наявності повертається результату. Функції повертають результат свого виконання, а процедури не повертають жодного результату, тільки виконують якусь дію. Наприклад, Sin - функція, яка обчислює значення синуса переданого їй параметра і повертає результат обчислення у вигляді речового значення. На противагу їй WriteLn є процедурою, яка ніяких значень не повертає, але виконує дію - висновок значень переданих їй параметрів на консоль. Процедури викликаються в такий спосіб:
Імя_процедури (параметр1, параметр2. ПараметрN);
Виклик функції може бути використаний всередині будь-якого виразу (для його обчислення). Також виклик функції може бути використаний в операторі присвоєння, щоб привласнити якийсь змінної результат виконання функції.
Ім'я_змінної: = імя_функциі (параметр1, параметр2. ПараметрN);
Присвоєння значення рядку, отримання вмісту рядка
Строкової змінної може бути присвоєно значення, як і будь-який інший змінної. Єдине обмеження полягає в тому, що тип значення має бути String або Char (що таке один символ що не рядок довжиною 1).
Як отримати та інсталювати окремого символу рядка
До символів рядка можна звертатися по їх індексу (позиції в рядку). Індекс першого символу рядка 1. Індекс ланцюжка довжиною буде дорівнює результату виклику функції Length, якою як параметр буде передана рядок. Зверніть увагу на те, що індекс першого символу 1, а не 0 як зазвичай робиться в різних структурах даних, які можуть містити багато елементів (взагалі-то більше одного). При спробі звернення до символу з індексом менше 0 або більше Length (ідентифікатор рядка) виникає помилка часу виконання.
Формат звернення до символу рядка:
S [I]
. де S - ідентифікатор строкової змінної, а I - індекс символу.
Вираз виду S [I], де S - ідентифікатор строкової змінної, повертає результат типу Char.
Приклад доступу до символу рядка за індексом:
Повинно вивестися наступне:
Злиття двох рядків (конкатенація)
Рядки можна складати як числові змінні, використовуючи оператор +. Результатом складання є більш довга рядок, що включає в себе вміст обох рядків в порядку їх вживання в операції додавання. Також існує функція Concat яка виконує в точності те ж дію що і +.
Формат операції конкатенації двох рядків. де A - ідентифікатор одного рядка або строкове вираження, а B - ідентифікатор іншого рядка або строкове вираження.
Результат виведення повинен бути наступним:
Виділення підрядка з рядка
На консоль має з'явитися таке:
Вставка одного рядка всередину іншої
Вставка рядка виконується процедурою Insert. Процедура отримує на вхід три параметра: рядок, яку потрібно вставити, рядок в яку повинна бути проведена вставка і позицію, в якій повинна бути проведена вставка. Формат виклику:
Insert (Source, Target, Position);- Source - рядок яка буде вставлена
- Target - ідентифікатор строкової змінної в яку вставляють вміст Source
- Position - позиція, починаючи з якої буде вставлено вміст Source в Target
Зверніть увагу, що це вже не функція, а процедура. Вона не повертає ніякого результату, а модифікує вміст Target. Ще одна особливість використання процедури, а не функції полягає в тому, що в якості Target можна передавати тільки ідентифікатор змінної, але не можна передавати вираз або ідентифікатор константи. Процедура Insert привласнює результат своєї роботи Target, а привласнити що-небудь константі або висловом неможливо за визначенням.
- Якщо Position менше 1, то процедура приймає його рівним 1.
- Якщо Position більше ніж Length (Target), то вміст Source додається до Target з кінця.
- Якщо Source є символом нового рядка, то Insert нічого не робить
В результаті виконання цієї програми повинна бути виведена рядок:
Частина рядка може бути вилучена за допомогою процедури Delete. Формат виклику процедури Delete:
Delete (Target, Index, Count);. де Target - ідентифікатор строкової змінної, з якої видаляються символи, Index - позиція, починаючи з якої проводиться видалення, Count - кількість видаляються символів.
- Якщо Index менше 1 або більше ніж Length (Target), то нічого з Target не видаляється.
- Якщо Count вказує більше символів ніж є починаючи з Index, то видаляються символи від Index і до кінця рядка. Якщо Count менше 1, то нічого не видаляється.
Результат виведення повинен бути: Hariends
Визначення позиції входження одного рядка в іншу
Іноді буває потрібно визначити чи міститься один рядок в інший, а також позиція з якої вміст рядків збігається. Для цього застосовується функція Pos. Формат виклику:
Pos (SubStr, Str). де Str - рядок, в якій проводиться пошук SubStr. Функція повертає позицію входження в якості результату. Якщо рядок SubStr не перебуває у Str, то результат виконання функції буде дорівнює 0. Функція розрізняє регістр букв - великий і маленький, тобто подстрока 'dancing' буде знайдена в 'We dancing in shadows', але не буде знайдена в 'We Dancing In Shadows'.
Приклад використання Pos: