Сторінка
2

Паскаль: масиви

2. Рядки Рядок у загальному значенні цього слова – скінченна послідовність символів. У програмуванні для подання рядків використовують масиви символів. У діалектах мови Паскаль означено спеціальні типи, в основі яких лежать масиви. Типи рядків мають свої специфічні операції, не означені над масивами символів, тобто рядки та символьні масиви є цілком різними типами. Змінна-рядок є масивом символів разом із додатковим компонентом. В означенні типу задається довжина n послідовності символьних компонентів, індексованих цілими 1,…,n. Додатковий компонент указує довжину послідовності символів, поданої в масиві. Ця довжина значення-рядка може змінюватися в процесі виконання програми від 0 до довжини масиву n. У мові Турбо Паскаль тип рядків задається виразом вигляду

string[n], де n – ціла стала з діапазону 1 255 (можливо, іменована). Наприклад, string[80]. Змінна такого типу є масивом символів із індексами від 0 до n. Значення-рядок подається змінними з індексами від 1 до n, змінна з індексом 0 подає довжину рядка. Точніше, якщо її значення c, то m=ord(c) розглядається як довжина значення-рядка. У процесі виконання програми вона може мінятися від 0 до n. Елементи масиву з індексами від m+1 до n недоступні; їх значення можна розглядати як "сміття". Спроба присвоїти щось цим елементам або взяти їх значення призведе до аварійного завершення програми. Оскільки невід'ємна довжина значення-рядка подається в одному байті, вона не може перевищувати 255. Звідси "маємо, те що маємо", тобто обмеження 255 на довжини рядків. Ім'я типу string еквівалентне виразові string[255]. Найпростішими виразами типу рядок є ім'я змінної-рядка, рядкова стала (літерал), або вираз типу char. Над рядками означена бінарна операція катенації (або дописування); її знаком є '+'. Результат одержується дописуванням правого операнда до лівого: значенням виразу '123'+'45' є '12345'. Ціла довжина рядка повертається з виклику функції length із аргументом-рядком: length('123') = 3. Рядки – єдиний нескалярний тип, змінні та вирази якого можуть бути аргументами стандартних процедур читання та запису. Особливості виконання цих процедур розглядаються в розділі 14. Рядки також можуть повертатися як значення функцій. Вираз типу "рядок" можна присвоїти змінній-рядку. Його символи присвоюються елементам змінної, починаючи з першого. Якщо довжина значення більша максимально можливої довжини n змінної, то присвоюються лише n перших символів. При цьому довжина значення (або n) неявно присвоюється додатковому компоненту змінної-рядка (як символ нульовому елементу масиву). Наприклад, нехай змінна s означена як string[3]. Після присвоювання s:='12345' чотири її компоненти з індексами 0, 1, 2, 3 матимуть значення chr(3), '1', '2', '3', а після s:='12' – chr(2), '1', '2', а останній компонент буде недоступним, і його значення буде "сміттям". За останнього значення змінної s виконання оператора s:=s+'9' надасть їй значення '129', а оператора s:='9'+s – значення '912'. В обох випадках s[0]=chr(3). Після присвоювання s:='' змінна s подає порожній рядок: s[0]=chr(0), а решта елементів недоступні. Змінити довжину значення можна явно, змінивши нульовий символ. Якщо після s:='' виконати s[0]:=2, то значення компонентів із індексами 1 і 2 зі "сміття" перетворяться на значення-рядок. Присвоювання іншим елементам рядка не змінює довжини його значення. У типах рядків означено операції порівняння =, <>, <, … . За означенням, рядки рівні, якщо мають ту саму довжину, і в її межах відповідні символи однакові. У противному разі вони не рівні. Упорядкування рядків залежить від системи програмування. У мові Турбо Паскаль, якщо length(s1)<length(s2), то рядок s1 менше рядка s2, тобто s1<s2 – істина. За рівних довжин рядки порівнюються в лексикографічному порядку, тобто s1<s2 тоді, коли існує таке i, що 1£ і£ length(s1), за якого s1[i]<s2[i], а всі відповідні елементи з меншими номерами рівні між собою. Як бачимо, упорядкування рядків у Турбо Паскаль відрізняється від лексикографічного. У системі програмування Турбо Паскаль означено також багато корисних підпрограм обробки рядків. Розглянемо лише чотири з них. Функція з заголовком function copy ( s : string; ind, cnt : byte ) : string задає повернення підрядка рядка s, що починається з s[ind] і має довжину cnt. Наприклад, copy('abcd', 2, 2)='bc'. Функція з заголовком function pos ( subs, s : string ) : byte задає повернення номера того елемента в рядку s, починаючи з якого subs входить у s як підрядок (якщо не входить, то повертається 0). Наприклад, pos('bc', 'abcd')=2, pos('aa', 'abcd')=0. Процедура з заголовком procedure val(s : string, var v; var ErrCode : integer) задає перетворення зображення числа в рядку s у числовий тип і присвоювання його змінній v. Якщо перетворення дійсно можливе, то значенням ErrCode буде 0. У противному разі її значенням буде позиція з символом у рядку, починаючи з якого перетворення неможливе. Тип аргументу, відповідного параметрові v, повинен мати тип, відповідний змісту рядка s. Так само зміст рядка повинен задавати число, представне в типі цього аргументу. Наприклад, за s='1.3' або s='1E2' другий аргумент повинен бути дійсного типу, а не цілого. Аналогічно за його типу integer у рядка не повинно бути значень, що подають числа, більші 32767 або менші -32768. Процедура з заголовком procedure delete(var s : string; start, len : integer) задає знищення len символів, починаючи з позиції start у рядку s. Наприклад, за s='abcdef' після виклику delete(s, 3, 3) рядок s матиме значення 'abf'. За start=0 або len=0 або start>length(s) рядок не змінюється. За start+len>length(s) з s вилучається підрядок до кінця рядка. Задачі 10.*Що друкується в результаті виконання програми: а) program strconc ( input, output ); var a: integer; c: char; s: string; begin s :=''; for a := 0 to 2 do begin c := chr ( ord ( '0' ) + a ); s := c + s + c; writeln ( s ) end end. б) program concstr ( input, output ); var a: integer; c: char; s: string; begin s :=''; c:= chr ( 47 ); while length ( s ) < 7 do begin c := succ ( c ); s := s + c + s; writeln ( s ) end end. 11. Застосовуючи операцію "+", функцію length та подання рядка масивом із додатковою змінною, що задає довжину рядка, написати модуль із такими підпрограмами обробки рядків: 1)* функції eq, ne, lt, le, gt, ge лексикографічного порівняння пари рядків відповідно на =, <>, <, <=, >, >=; 2) процедура addsym вставлення символу в указане місце рядка зі збільшенням його довжини на 1(якщо збільшення неможливе, то останній символ "витісняється"); 3)* процедура delsym вилучення символу з указаним номером із рядка зі зменшенням його довжини на 1; 4)* функція substr повернення підрядка даного рядка, що починається в ньому з заданого місця та має задану довжину; 5) процедура delete вилучення з рядка його підрядка, що починається в ньому з заданого місця та має задану довжину. 12. Натуральне число в десятковому вигляді подано рядком, довжина якого не більша 80. Написати функцію перевірки ознаки подільності числа на: а) 5; б) 4; в) 3; г) 11. 13. Номер із контрольним розрядом є зображенням числа, перша цифра якого 1, а остання є остачею від ділення на 10 суми значень цифр із другої до передостанньої включно (контрольний розряд). Написати модуль, в якому перша функція задає побудову відповідного номера з контрольним розрядом із 10 цифр за натуральним числом, а друга – перевірку, чи є послідовність із 10 цифр правильним номером із контрольним розрядом. 14. Нехай рядкове подання цілого невід'ємного числа в десятковій системі починається з будь-якої цифри, крім '0' (за винятком числа 0), у вісімковій – починається символом '0', у шістнадцятковій – символами '0x', у двійковій – символами '0b'. Далі записано цифри відповідної системи числення. У записі від'ємного числа знак '-' передує першій цифрі. Написати модуль із функціями перетворення рядкових зображень цілих чисел у стандартний тип і навпаки. 15. Написати модуль із функціями перетворення рядкових зображень натуральних чисел із римської системи запису в стандартний цілий тип і навпаки. 16. Написати модуль із функціями перетворення зображень цілих чисел зі стандартних типів у рядкове: а) у словесному вигляді; б) у словесному вигляді з урахуванням відмінка й навпаки. 17.* Непорожній рядок містить цілі числа, відокремлені пропусками в довільній кількості. Якщо в рядку 3 числа, то слід визначити, чи задають вони довжини сторін трикутника, і надрукувати повідомлення "трикутник" або "не трикутник". За іншої кількості чисел треба повідомити: "помилкові дані". 18. Написати функцію обчислення за двома рядками а) найбільшої довжини їхнього спільного підрядка; б) їхнього найдовшого спільного підрядка (якщо таких кілька, то повертається ближчий до початку першого рядка, наприклад, для рядків "тік" та "кіт" це рядок "т", а для рядків "кіт" та "тік" – "к"); в) найбільшої довжини їхньої спільної підпослідовності символів (наприклад, для рядків "слова" та "справи" підпослідовності "св" і "са" мають довжину 2); г) їхньої найдовшої спільної підпослідовності (якщо таких кілька, то повертається найбільш "притиснута" до початку першого рядка – для рядків "справи" та "слова" це "са", а не "св"). 19. Нехай над рядками означено дії двох видів: вставити та вилучити символ. Мінімальна довжина послідовності дій, необхідних для перетворення одного рядка в інший, називається відстанню між ними. Наприклад, відстань між рядками "кава" та "чай" дорівнює 5 (вилучити букви "к", "в", "а" та вставити "ч" та "й"). Написати функцію обчислення відстані між двома рядками.

Перейти на сторінку номер:
 1  2  3  4 


Інші реферати на тему «Інформатика»: