Завдання для самоконтролю

1. Задано два символьних масиви із малих латинських літер та розділових знаків , і , . Розробити програму, яка друкує в алфавітному порядку літери першого масиву, що не належать другому, та літери другого масиву, що не належать першому.

2. Задано множину із цілих чисел з інтервалу , . Розробити програму, яка визначає, скільки серед базових елементів цієї множини є чисел Фібоначчі і друкує їх за зростанням. (Числа Фібоначчі визначаються за формулою: ).

3. Задано символьний масив із малих латинських літер, цифр і круглих дужок , . Розробити програму, яка знаходить групи символів, взятих у круглі дужки, і друкує в лексикографічному порядку символи, що містяться у всіх групах, і символи, що не входять у жодну групу. Вважається, що вкладених дужок немає.

4. Задано символьний масив із малих латинських літер, цифр і знаків арифметичних операцій , . Розробити програму, яка визначає і друкує всі літери, які входять в цей масив, всі цифри, що входять по одному разу, і всі знаки арифметичних операцій, що не входять жодного разу.

5. Задана матриця , та дві множини із номерів рядків і номерів стовпців (значення номерів не перевищують ). Розробити програму, яка знаходить максимальний елемент та його розташування серед елементів матриці з індексами, що є базовими елементами заданих множин.

6.Задано два символьних масиви з малих латинських літер та цифр , і , . Розробити програму, яка знаходить і друкує: літери, які є в обох масивах; літери, яких немає в обох масивах і цифри, які є в першому і другому масивах окремо.

7. Задано множину із цілих чисел з інтервалу . Розробити програму, яка визначає і друкує за зростанням усі парні, непарні і ті, що діляться на 3 базові елементи заданої множини.

8. Задано два символьних масиви із малих і великих латинських літер та цифр , і , . Розробити програму, яка визначає і друкує в алфавітному порядку літери, які є в обох масивах, літери, які є в обох масивах і повторюються по декілька разів і цифри першого масиву, яких немає в другому масиві.

9. Задано натуральне число . Розробити програму, яка друкує в зростаючому порядку всі цифри, які не входять у це число, і всі цифри, які входять більше одного разу.

10.Задано символьний масив із малих латинських літер, цифр і круглих дужок , . Розробити програму, яка визначає і друкує всі літери, які є, і всі цифри, яких немає між першою круглою дужкою, що відкривається, і останньою круглою дужкою, що закривається.

11. Задана символьна матриця , . Розробити програму, яка підраховує і друкує окремо, скільки в кожному рядку міститься великих латинських літер і цифр.

12. Задано символьний масив , . Розробити програму, яка визначає і друкує всі знаки арифметичних операцій і операцій відношення, які входять у заданий масив, і всі знаки арифметичних операцій і операцій відношення, які не входять у заданий масив.

13. Розробити програму, яка будує множину всіх цілих чисел, множину всіх простих чисел і множину складених чисел із діапазону від 2 до , та виводить за зростанням базові елементи кожної множини.

14.Задано символьний масив , . Розробити програму, яка визначає і друкує в лексикографічному порядку: усі великі латинські літери, які є в масиві ; усі великі латинські літери, яких немає в масиві ; усі цифри, які є в масиві ; усі цифри, які є в масиві і повторюються.

15. Задано символьний масив , . Розробити програму, яка будує, визначає і друкує в лексикографічному порядку: усі цифри, які є в масиві ; усі цифри, які повторюються; усі знаки арифметичних операцій, які є в масиві ; усі знаки арифметичних операцій, яких немає в масиві .

16. Задана символьна матриця , . Розробити програму, яка визначає і друкує за алфавітним порядком окремо приголосні та голосні малі літери латинського алфавіту, які є в кожному рядку.

17. Задано символьний масив , . Розробити програму, яка вилучає з цього масиву всі повторні входження цифр і знаків арифметичних операцій. Друкує перетворений масив по 35 символів у рядку.

18.Задано символьний масив , . Розробити програму, яка визначає і друкує за лексикографічним порядком усі малі, усі великі латинські літери, які є в заданому масиві, і всі цифри, яких немає у масиві.

19. Задано символьний масив , . Розробити програму, яка знаходить групи цифр, записаних підряд, і вилучає із них всі початкові нулі, крім останнього, якщо за ним знаходиться крапка. Друкує модифікований масив по сорок символів у рядку.

20. Задана матриця , та дві множини із номерів рядків і номерів стовпців (значення номерів не перевищують ). Розробити програму, яка обчислює суму елементів матриці з індексами, що є базовими для заданих множин і добуток елементів матриці з індексами, які не входять до заданих множин.

 

Тема 8. Символьні рядки

Для обробки текстів в Object Pascal використовуються символьні рядки таких типів:

 

· ShortString або String{N}, де N 255 – короткий рядок;

· String – довгий рядок;

· PChar – нуль-термінальний рядок,

· WideString – широкий рядок.

 

Приклади опису рядків у програмі:

 

Var Sk: ShortString; {короткий рядок максимальної} {довжини 255 символів}

Sks: String[5]; {короткий рядок}

{ довжиною до 5 символів}

Ss1, Ss2: String; {довгий рядок}

Sp: Pchar; {нуль-термінальний рядок}

Sw: WideString; {широкий рядок}

 

Довжина короткого рядка від 0 до 255 байтів, а довгого, нуль-термінального і широкого рядків від 0 до 2 Гбайтів.

Для описаного в програмі короткого рядка Sk компілятор виділить у статичній пам’яті 256 байтів з номерами від 0 до 255, а для Sks відповідно 6 байтів. У нульовому байті знаходиться поточна довжина рядка, а починаючи з першого байта розміщується ланцюжок символів. Так як у байт можна записати максимальне число 255, то довжина короткого рядка не може перевищувати 255.

При виконанні оператора

 

Sk:=’Рядок символів’;

 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

Р я д о к   с и м в о л і в

 

буде використано 15 байтів у нульовий байт буде записана довжина – 14, а з першого байта розміститься ланцюжок символів. Останні із виділених для рядка символів 256 байтів не використовуються, але пам’ять буде зайнятою.

Якщо довжина рядка символів перевищує описану довжину, то лишні символи втрачаються. Так, при виконанні оператора

Sks:=’Рядок символів’;

 

змінна Sks отримає значення – ’Рядок’

Описаний у програмі довгий рядок Ss1 буде розміщуватися у динамічній пам’яті. При цьому, компілятор виділить для змінної Ss1 у статичній пам’яті 4 байти, в які буде записуватися адреса виділеної динамічної пам’яті. Тобто, змінна Ss1 буде вказівником на цю пам’ять.

Динамічна пам’ять виділяється операційною системою під час виконання програми. Наприклад, при виконанні оператора

Ss1:=’Це рядок’;

 

Лічильник посилань

1 2 3 4 5 6 7 8 9 10 11 12 13

Ц е   Р я д о к #0      

 

буде виділена динамічна пам’ять такої структури: 1 ÷ 8 байти – символи рядка, 9 байт – #0 признак кінця рядка і чотири байти 10 ÷ 13 – лічильник посилань, в який буде записана одиниця.

Операційна система виділить у динамічній пам’яті 8+1+4=13 байтів і у змінну Ss1 помістить її адресу.

Лічильник посилань використовується для кешування пам’яті. Так, при виконанні оператора Ss2:=Ss1; пам’ять для розміщення змінної Ss2 не виділяється, а їй присвоюється значення вказівника Ss1 і лічильник посилань збільшується на одиницю. Отже, обидві змінні Ss1 і Ss2 будуть вказувати на одну і ту ж область пам’яті.

Якщо після цього змінюється значення змінної Ss1, наприклад, виконується оператор

 

Ss1:=Ss1+’ символів’;,

 

то лічильник посилань зменшиться на одиницю, а у динамічній пам’яті виділиться нова область із 17+1+4=22 байтів і у Ss1 поміститься її адреса.

У виділеній пам’яті, починаючи з першого байта, розміститься ланцюжок символів – ’Це рядок символів’, термінальний нуль – #0 і лічильник посилань із значенням – 1. Тепер змінні Ss1 і Ss2 вказують на різні області пам’яті, а лічильники посилань будуть містити по одиниці. Виділена для розміщення довгого рядка String область пам’яті звільняється, якщо лічильник посилань стає рівним нулю. Кешування економить використання пам’яті.

Подібно здійснюється робота з пам’яттю для нуль-термінальних рядків типу Pchar. Лічильник посилань тут не використовується, тому для кожного рядка виділяється окрема область пам’яті. Нуль-термінальні рядки використовуються при зверненні до API-функцій Windows (API – Application Program Interface – інтерфейс прикладних програм). Оскільки компоненти Delphi беруть на себе всі проблеми зв’язку з API-функціями, то програмісту рідко доводиться звертатися до нуль-термінальних рядків.

Однобайтові символи коду ASCII мають 256 можливих значень, достатніх для відображення будь-якої європейської мови, однак для мов народів світу цього недостатньо. Тому міжнародна комісія виробила код Unicode, символи якого займають у пам’яті два байти і мають 65536 можливих значень. Цей код дозволяє зображувати всі символи всіх мов світу. Символи Unicode описуються стандартним типом WideChar, а складені з них рядки – типом WideString. Усі програми, що використовують OLE-технологію обміну рядками, повинні використовувати символи Unicode.

Звернення до окремих символів рядка здійснюється за допомогою індекса. При виконанні операторів

Ss1:=’Рядок символів’; Ss1[4]:=’к’; Ss1[5]:=’и’;

змінна Ss1 отримає значення – ’Рядки символів’. Нумерація символів у коротких і довгих рядках починається з одиниці, а в нуль-термінальних з нуля.

Над символьними рядками можуть виконуватися операції:

· конкатенація (зчеплення рядків) – (+);

· відношення – (=, <>, <, >, <=, >=).

Наприклад, при виконанні оператора

 

Ss1:=’Це – ’ + ’Рядок’ + ’символів’;

 

змінна Ss1 отримає значення – ’Рядок символів’.

Операції відношення виконуються над двома рядками посимвольно, зліва направо з урахуванням внутрішнього кодування символів. Якщо один рядок коротший, то він доповнюється символами 0. Результат операції відношення бульового типу. Наприклад,

 

‘A’ < ‘B’ – true;

‘A’ < ‘1’ – false;

‘Object’ < ‘Object Pascal’ – true;

‘Пас’ > ‘Pascal’ – true.

 

Cтандартні процедури та функції:

 

1) Функція LENGTH

C:=LENGTH(str); Змінної буде присвоєно ціле значення, що вказує кількість символів у строкової змінної str .

 

2) Функція СОNCAТ - зчеплення рядків у порядку їх перерахування.

str:=CONCAT(st1,st2,...,stN);str-мінлива типу STRING, що складається з рядків st1,...,stN.

 

3) Функція POS

P:=POS (st1, st2); Р-ціле число, що показує номер позиції, з якої починається рядок st1 у рядку st2.

 

4) Функція COPY

S1:=COPY( str, I, J); Sl-символьний рядок, виділена з рядка str з позиції I, довжиною J символів.

 

5) Процедура DELETE(Str, I, J);

рядка str видаляється J символів, починаючи з I позиції.

 

6) Процедура INSERT(Str1, Str2, I);

пСтрока Str1 вставляється з I позиції в рядок Str2.

 

7) Процедура STR (V, S1);

Числове значення змінної V перетворюється в рядок символів і записується в рядок S1.

 

8) Процедура VAL (S1, V, C);

 

Строковий вираз S1 перетворюється в величину цілочисельного або речового типу і записується у змінній V . Якщо при цьому помилок не виявлено, то буде дорівнює 0 . В іншому випадку значення З одно буде номером позиції першого помилкового символу і V буде не визначено. Рядок S1 не повинна містити незначущих пробілів, мінлива V може бути цілою або речової, а змінна - тільки З цілою .