Паскаль - Стор 5
Алгоритм розв'язання задачі:
Створимо дві процедури заповнення одновимірного масиву цілими числами: одну з використанням функції random і одну, де користувач самостійно задає значення. Також створимо процедуру виведення масиву на екран. Потім викличемо в основній гілці програми ці процедури, передавши їм як аргументи змінні, пов'язані з масивами.
Програма мовою Паскаль:
miniarr = array [1.. n] of integer;
procedure arr_rand (k: integer; var arr: miniarr); var i: byte;
writeln ( 'Заповнення масиву випадковими числами.'); randomize;
for i := 1 to k do
arr [i]: = random (100);
procedure arr_user (k: integer; var arr: miniarr); var i: byte;
write ( 'Введіть', k, 'чисел через пропуск:'); for i := 1 to k do
procedure arr_out (k: integer; var arr: miniarr); var i: byte;
write ('Виведення масиву:'); for i := 1 to k do
write(arr[i]:4);
arr_rand (n, a); arr_out(n, a); writeln; arr_user (n, b); arr_out(n, b);
Рядки в Паскалі – це дані типу string. Вони використовуються для збереження послідовностей символів. У Паскалі довжина стандартного рядка обмежена 255 символами. Під кожен символ відводиться по одному байти, у якому зберігається код символу. Крім того, кожен рядок містить додатковий байт, в якому зберігається довжина рядка.
Якщо відомо, що довжина рядка буде менше 255 символів, то програміст може сам задати максимальну довжину рядка.
Приклади опису рядків:
str_type=string[12];
s2, s3: str_type;
s5, s6, s7: string [7];
Довжина рядка зберігається в першому її байті, індекс якого дорівнює 0.Оголошення типізованої константи для типу string здійснюється так:
s : string = 'FreePascal'
Існує поняття порожнього рядка, тобто. рядки, що не має елементів. Порожній рядок позначається двома апострофами, що стоять поруч (наприклад, st := '' ).
Операції над рядками
Рядки можна надавати один одному. Якщо максимальна довжина змінної зліва менше довжини рядка, що засвоюється, то зайві символи праворуч відкидаються.
s1 := 'this is text' ;
Рядки можна поєднувати за допомогою операції конкатенації, яка позначається знаком +.
Рядки можна порівнювати один з одним за допомогою операцій відносини. При порівнянні рядка розглядаються посимвольно ліворуч, при цьому порівнюються коди відповідних пар символів. Рядки рівні, якщо вони мають однакову довжину і посимвольно еквівалентні. У рядках різної довжини існуючий символ завжди більший за відповідний йому відсутній символ. Меншим буде той рядок, у якого менший код першого символу, що не збігається (незалежно від максимальних і поточних довжин порівнюваних рядків).
'abc' = 'abc' (true) 'abc'(s1); write(s1);
До окремого символу рядка можна звертатися як елемент масиву символів, наприклад s1 [ 3 ] . Символ рядка сумісний з типом char їх можна використовувати у виразах одночасно, наприклад:
writeln (s2 [3] + 'r');
Можна здійснювати корекцію будь-якого символу рядкової змінної, навіщо у відповідному операторі достатньо вказати ім'я змінної типу string , за яким у квадратних дужках задається номер її елемента (наприклад, str [ 3 ] := 'j' ).
Елементи рядка нумеруються з одиниці, т.к. у кожній рядковій змінній є елемент із номером 0, у якому у вигляді символузберігається довжина поточного рядка. Щоб дізнатися про поточну довжину, достатньо застосувати функцію ord до нульового елемента рядка. Наприклад:
writeln (ord (st [0]))
Нульовий елемент рядкової змінної можна коригувати. При цьому буде змінюватись поточна довжина рядка. Наприклад, вираз str [ 0 ] := # 50 встановлює поточну довжину 50.
Процедури та функції для роботи з рядками
Пн, 03/07/2011 - 23:37 — tech
Функція Concat (s1, s2, . sn) повертає рядок, що є злиттям рядків s1, s2, . sn.
Функція Copy (s, start, len) повертає підрядок довжиною len, що починається з позиції start рядка s.
Процедура Delete (s, start, len) видаляє з рядка s, починаючи з позиції start, підрядок довжиною len.
Процедура Insert (subs, s, start) вставляє в рядок s підрядок subs, починаючи з позиції start.
Функція Length (s) повертає фактичну довжину рядка s результат має тип byte.
Функція Pos (subs, s) шукає входження підрядки subs у рядок s і повертає номер першого символу subs у s або нуль, якщо subs не міститься в s.
Процедури перетворення типів
Процедура Str (x, s) перетворює числове значення x у рядок s, при цьому для x може бути заданий формат, як у процедурах виведення write та writeln. Наприклад:
Результат: s = '123'.
Процедура Val (s, x, errcode) перетворює рядок s значення числової змінної x, при цьому рядок s повинен містити символьне представлення числа. У разі успішного перетворення змінна errcode дорівнює нулю. Якщо ж виявлено помилку, то errcode міститиме номер позиції першого помилкового символу, а значення x не визначено.
Вказівники або посилання (Pointer)
Втр, 09/28/2010 - 00:48 - tech
Коли транслятораналізує розділи var у програмі (основна гілка, функції, процедури), він відводить кожної змінної відповідне число осередків пам'яті і закріплює їх за даної змінної весь час роботи блока. Такі змінні називають статичними. Вони не можуть бути використані системою під інші потреби, навіть якщо у процесі подальшої роботи програми ці змінні більше не знадобляться.
Дані можна надати в пам'яті комп'ютера Дані можна зберігати в певній області пам'яті, не позначаючи ім'ям змінної, а використовуючи посилання на цю область. Такий вид організації даних дозволяє динамічно захоплювати та звільняти пам'ять у процесі роботи блоку програми. Тому й самі змінні, які можуть створюватися та ліквідуватися за потребою, називають динамічними.
Динамічні змінні найчастіше реалізуються як пов'язані структури.
Приклад пов'язаної структури. У черзі на прийомі до лікаря кожен пацієнт запам'ятовує людину, за якою зайняв чергу. Всі пацієнти пов'язані в ланцюжок згідно з чергою, але в просторі вони
розміщені довільним чином: знову підійшов сідає будь-яке вільне місце, тобто. сусідні елементи черги можуть бути на довільній відстані у просторі.
Подібним чином будується структура пов'язаних даних, які можуть займати пам'ять не поспіль, а розміщуватись там, де є вільне місце. Кожен елемент такої структури має «знати», ким він «коштує», тобто. містити посилання на попередній елемент ланцюжка.
Щоб проілюструвати переваги динамічних змінних, продовжимо аналогію із чергою пацієнтів.
Нехай один із пацієнтів залишає чергу. Цей процес не вимагає переміщення в просторі решти пацієнтів: той, хто просто стоїть за минулим, тепер запам'ятовує іншоголюдини. Тобто виняток елемента з ланцюжка даних зводиться до зміни однієї посилання і не вимагає переміщення інших елементів, як це мало б місце для масиву.

Виключений елемент тепер можна звільнити від участі в роботі блоку і використовувати ним ділянку пам'яті для інших цілей.
За допомогою посилань легко вставити нову компоненту в ланцюжок даних. Для цього достатньо змінити два посилання.
Нова динамічна компонента може бути розміщена у будь-якому вільному місці пам'яті, відведеному під такі змінні. Сама динамічна змінна не позначається ідентифікатором. Динамічна змінна – це «невидимка» у програмі: ідентифікатором вона не позначається, транслятор їй місця у пам'яті не відводить. Пам'ять під таку змінну резервується та звільняється динамічно в процесі рахунку (за допомогою спеціальних процедур).
Під змінну транслятор відводить місце в пам'яті машини; ця змінна має ім'я і явно згадується у програмі. Посилальні змінні утворюють новий тип даних - "посилання" (покажчики).
Динамічні змінні, зазвичай, мають тип " запис " ( record ), т.к. повинні містити, крім значення (цілого, речового тощо), посилання на іншу динамічну змінну пов'язаної структури.
Позначимо тип посилальної змінної через point, а тип динамічної змінної через ct. Тоді цей факт описується так:
Кажуть, що тип point вказує (посилається) на компоненти типу ct або тип point пов'язаний з типом ct .
Посилувальну змінну R можна описати двома способами:
Змінна R вказує на компонент типу ct .
Щоб зв'язати динамічні змінні в ланцюжок, треба в кожному компоненті посилатися на попередню компоненту.
Наприклад, компоненти, що містять числа 5, 10, 15, 8, повинні мати інформацію про те, де знаходиться попередній елемент, т.к. це масив і компоненти розміщуються необов'язково поспіль.
Опишемо тип таких даних, позначивши його ct. Очевидно, цей тип є «запис» з двома полями: полем цілого значення (I) та полем посилання