Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Рядковий тип даних



Розв’язуючи задачі нам доводиться виконувати не тільки математичні обчислення, а й опрацьовувати текстову інформацію: знаходити потрібне слово, виконувати електронний переклад, шифрувати або розшифровувати текст і т.д. Для роботи з текстами в Паскалі застосовується структурований тип даних String (рядок). Рядком називається послідовність певної довжини, що складається з символів.

Опис типу:

Var Str:string;

Найбільша довжина рядка не перевищує 255 символів і може бути вказана в його описі. Наприклад, рядкові змінні з найбільшою довжиною 10 символів описують так:

Var S,T:string[10];

Якщо найбільша довжина в описові не вказана, то вона становить 255 символів. Справжня довжина рядка залежить від присвоєного значення і не перевищує вказаної в описі. Для описаних вище змінних можливі такі присвоєння:

Str:='мир'; {справжня довжина 3 символи}

S:='я і ти';{справжня довжина 6 символів}

T:='';{справжня довжина 0 символів}

Як бачите, рядкові значення в програмі обмежуються апострофами. Якщо ж рядок теж містить апростроф, то в тексті програми цей символ слід подвоїти:

S:='Сім''я'; {присвоєне значення «Сім'я»}

Змінні типу String виводяться на екран з допомогою стандартних процедур Write і Writeln і вводяться за допомогою стандартних процедур Readln і Read. Тобто вводяться і виводяться не поелементно, як символи, а повністю.

Операції з рядками

У Паскалі є два основних способи опрацювання змінних типу String. Перший спосіб передбачає опрацювання всього рядка як єдиного цілого, тобто єдиного об’єкта. Також, можна розглядати рядок як складний об’єкт, що складається з окремих символів, тобто елементів типу Char, що під час опрацювання доступні кожний окремо. До кожного символу можна звернутися за його номером: Str[i] – це звернення до і -го символу рядка Str. Нумерація символів починається з 1.

1. Склеювання.

Під склеюванням розуміється послідовне об’єднання кількох рядків в один.

Приклад

Var Str1, Str2, Str3:string;

begin

Str1:='Я люблю';

Str2:='інформатику.';

Str3:=Str1+ ' ' +Str2;

...

Рядок Str3 набуває значення «Я люблю інформатику.».

2. Порівняння.

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

Приклад

'Balkon'<'balkon' (Ord('B')<Ord('b'));

'Кіт'='Кіт' (рівні за довжиною і збігаються посимвольно).

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

АЛГО надає у розпорядження цілу низку стандартних функцій і процедур мови Паскаль, призначених для опрацювання рядків. Розглянемо найважливіші з них. Назви функцій подані двома мовами.

1. Вилучення.

Для вилучення з рядка фрагмента використовується процедура Вилучити Delete(Str,n,m), що вирізає з рядка Str m символів, починаючи з n–го. Таким чином, після виклику процедури Delete рядок змінюється.

Приклад

Str1:=’ABCDEFGH’;

Delete (Str1,3,4);

Після виконання цих операторів із рядка будуть вилучені чотири символи (починаючи з третього), тобто рядок стане таким: Str1=‘ABGH’.

2. Вставка.

Для вставки одного рядка в інший використовується процедура Вставити Insert (Str1,Str2,n), що вставляє рядок Str1 у рядок Str2, починаючи з n–го символу. При цьому перший рядок не змінюється, а другий одержує нове значення.

Приклад

Str1:='ABCDEFGH';

Str2:='abcdefgh';

Insert(Str1, Str2, 3);

У результаті виконання даної процедури рядок стане таким: Str2= ‘abABCDEFGHcdefgh’. Таким самим буде результат виконання такої послідовності операторів:

Str2:='abcdefgh';

Insert ('ABCDEFGH',Str2,3);

3. Копіювання.

Функція Фрагмент Copy (Str,n,m) копіює m символів рядка str, починаючи з n-ого символу. При цьому рядок Str не змінюється.

Приклад

Str1:='ABCDEFGH';

Str2:='abcdefgh';

Str3:=Copy(Str1,4,3);

Writeln(Str3);

Writeln(copy(Str2,4,3));

Значення змінної Str3=’DEF’. А на екран будуть виведені такі рядки:

DEF

def

4. Довжина рядка.

Під довжиною рядка розуміють фактичну (а не найбільшу можливу) кількість символів у рядку. Її значення можна отримати за допомогою функції Довжина Length (Str). Результат її виклику – ціле число, що дорівнює кількості символів рядка Str.

Приклад

Str:='Я люблю інформатику.';

K:=Length(Str);

У результаті значення змінної K буде дорівнювати 20.

5. Пошук підрядка.

Функція Знайти Pos (Str1,Str2) визначає позицію підрядка в рядку. Її результат – ціле число. Воно визначає номер елемента, з якого починається перше входження підрядка Str1 у рядок Str2. Якщо Str1 не входить у Str2, то значення функції дорівнює 0.

Приклад

K:=Рos('ка', 'солодка карамелька')

У цьому випадку значення К дорівнює 6, тому що функція Рos повертає номер елемента, починаючи з якого підрядок зустрічається перший раз.

6. Числа і рядки.

Для роботи з числами й рядками застосовують дві процедури перетворення типів.

Текст Str(N,Str1) – переводить числове значення N у рядкове і присвоює результат рядку Str1, причому можна переводити як цілі числа, так і дійсні.

Приклад

Str(1234, Str1) – після виконання Str1='1234';

Str(452.567, Str1) – переводимо дійсне число, результат Str1='452.567';

Друга процедура виконує обернену дію.

Значення Val (Str, N, K) – переводить рядкове значення у числове. Якщо даний рядок є записом числа (цілого або дійсного), то значення К стане рівне 0, а N – шуканому числу. Якщо ж повністю перетворити рядок в число не вдалось, то K буде рівним номеру помилкового символу в рядку, а N – числу, записаному символами перед помилковим.

Наведемо програму, яка демонстує різні варіанти виклику процедури Значення:

Program ValDemo;

Var x, k:integer;

y:real;

Begin

Val('1234', x, k);

Write(k); If k=0 then WriteLn(' x=',x) else WriteLn;

Val('abc', x, k);

Write(k); If k=0 then WriteLn(' x=',x) else WriteLn;

Val('–1.3E–3', y, k);

Write(k); If k=0 then WriteLn(' y=',y) else WriteLn;

Val('–1.3E+0', y, k);

Write(k); If k=0 then WriteLn('y=',y:0:1) else WriteLn;

end.

Під час виконання програми виводиться така інформація:

0 x=1234

0 y= -1.300000E–003

0 y= -1.3

Приклад №1 Скільки разів у заданому рядку зустрічаються символ ‘а’?

Розв’язування

Складемо програму в якій будемо опрацьовувати рядок. Результат виконання – ціле число. Переглядаємо всі символи рядка (їх кількість дорівнює довжині рядка). Якщо символ дорівнює ‘а’, то збільшуємо лічильник.

Program Example;

Var st:String;

i,k:integer;

Begin

Write('Введіть рядок- ');

Readln (st);

k:=0;

For i:=1 to length (st) do

If st[i]='a' then k:=k+1;

Writeln('Кількість букв ''a'' - ',k)

End.

Приклад №2 Замінити всі включення підрядка ‘del’ на ‘insert’.

Розв’язування

Якщо такий підрядок є то необхідно знайти номер першого символу підрядка ‘del’, вилучити його і вставити ‘insert’. Так повторювати до того часу, поки Pos('del',st)<>0.

Program Example;

Var st:String;

k:integer;

Begin

Write('Введіть рядок - ');

Readln (st);

While Pos('del',st)<>0 do

Begin

K:=Pos('del',st);

Delete(st,k,length('del'));

Insert('insert',st,k)

End;

Writeln('Змінений рядок - ',st)

End.

Питання для самоконтролю

1. Що таке рядковий тип даних та для чого він використовується?

2. Які стандартні функції використовуються для роботи з рядко­вими величинами?

3. Вкажіть, яким вказівкам присвоєння з лівого стовпчика відповідають значення L з правого.

1) L: = Length ('Pascal'); ____ а) 9

2) L: = Length ('Фірма ІВМ'); ____ б) 0

3) L: = Length (''); ____ в) 8

4) L: = Length ('АЛГО'); ____ г) 6

5) L: = Length ('Програма'); ____ д) 4

4. Якими будуть значення змінних К1 і К2 після виконання заданого фрагменту програми?

Str1:= 'CDE'; Str2:='ABCDEFGH';

K1:= Pos(Str1, Str2);

K2:= Pos(Str2, Str1);

5. Дано: R:=’Kонстантинополь’;

Вкажіть, які значення з правого стовпчика отримає змінна R після виконання вказівки з лівого:

1) Delete(R,1,5); _______ а) 'антинополь'

2) Delete(R,5,8); _______ б) 'Констанополь'

3) Delete(R,8,3); _______ в) 'Консоль '

6. Дано: Const R =’Константинополь’;

Вкажіть, яким вказівкам присвоєння з лівого стовпчика відповідають значення S з правого стовпчика:

1) S:=Copy(R, 4, 4); ____ a) 'тин'

2) S:=Copy(R, 8, 3); ____ б) 'анти'

3) S:=Copy(R, 6, 4); ____ в) 'стан'

Задачі

1) Підрахуйте, скільки разів у даному рядку зустрічається введений з клавіатури символ.

2) Замінити всі символи Ch1 у рядку на Ch2 (значення змінних Ch1 іCh2 вво­дяться з клавіатури).

3) Замінити в рядку всі входження підрядка Str1 на підрядок Str2 (Str1 і Str2 вводяться з клавіатури).

4) Дано рядок, що складається з кількох слів, між словами один пропуск, у кінці рядка – крапка. Підрахувати кількість слів у рядку.

5) *Знайдіть довжину найдовшого та найкоротшого слів у заданому рядку. Слова відокремлені одиничними пропусками.

1.17. Підготовка до оцінювання з
теми «Типи даних»

1) Вкажіть правильні твердження: “Тип даних…

а) вказує на кількість значень у певній числовій множині“;

б) визначає скінчену множину числових значень “;

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

2) Які значення належать до типу Real:

а) 2 г) 2.5Е+2

б) 1.7 д) –5.37

в) ’37.5’ е) Sqr(3).

Вкажіть значення параметра ch після виконання оператора For:

3) For ch:= ‘a’ to ‘z’ do …

а) ‘a’; б) ‘z’; в) ‘b’; г) 64; д) не визначене.

4) For ch:= ‘d’ to ‘a’ do …

а) ‘d’; б) ‘a’; в) ‘c’; г) 64; д) не визначене.

5) Виправте помилки в наведених фрагментах програм:

i:= 1; for ch:= 'a'…'z' do begin writeln(i, ' ', ch); i:= i + 1; end; for ch:= 'a' to 'z' begin write(ch, ' ', Ord(ch)); end;

6) Яким буде значення змінної К після виконання такого фрагменту програми:

К: = Pos ('in', 'Interesting');?

7) Яким буде значення змінної S після виконання кожного з фрагментів програми:

а) S:='computer'; b) S:='program'; d) P:= 'Internet';

Delete (S, 3, 4); Insert ('no', S, 3); S:=Copy (P, 4, 3);

8) Заповніть пропуски так, щоб значення змінної S після вико­нання заданого фрагменту програми було рівним 'пост':

S: = 'постанова';

Delete (…,...,...);

9) Заповніть пропуски так, щоб значення змінної S після виконання заданого фрагменту програми було рівним 'форматування':

S:= 'формування';

Insert (...,...,...);

10) Заповніть пропуски так, щоб значення змінної S після виконання заданого фрагменту програми було рівним ‘ритм’:

P:= 'алгоритмізація';

S:= Copy (...,...,...);

Практичні завдання

11) Знайти площу кільця, якщо відомі довжини його радіусів.

12) Дано два рядки. Вивести символи, які зустрічаються як в першому, так і в другому рядках.

2. Елементи структуризації програми

2.1. Підпрограми-процедури

Часто у програмах зустрічаються повторювані або схожі фрагменти. В мові програмування Паскаль існує можливість оформляти такі фрагменти спеціальним чином – виділяти їх у підпрограми. Підпрограмі дається ім'я, за яким можна звертатися до неї (викликати підпрограму). Використання підпрограм не тільки покращує струк­туру та зовнішній вигляд програми, але й зменшує можливість виникнення помилок і полегшує відлагодження.

Є два види підпрограм – процедури і функції. Їх структура дуже схожа на структуру ос­новної програми.

У програмі процедури і функції описуються після розділу опису змінних програми, але до початку розділу операторів, тобто до Begin, що починає цей розділ.

Опис процедури

Опис процедури починається із заголовка, що є обов'язковим. Заголовок складається зі службового слова Рrосеdure, за яким слідують ім'я процедури й, можливо, список формальних параметрів у круглих дужках. Наприкінці заголовка ставиться крапка з комою. Після заголовка можуть розміщуватись ті ж розділи, що й у програмі: описи змінних, процедур функцій тощо. Загальний вигляд опису процедури (у квадратні дужки взято частину, якої може не бути):

Під час виклику процедури її формальні пара­метри заміню­ються відповідними фактичними. Фактичні параметри – це пара­метри, що передаються процедурі під час її виклику. Кількість і типи формальних та фактичних параметрів повинні повністю збігатися.

Формальні параметри описуються у заголовку процедури й визначають тип і місце підстановки фактичних параметрів. Формальні параметри діляться на два види: параметри-змінні та параметри-значення.

Параметри-змінні відрізняються тим, що перед ними стоїть службове слово Vаr. Вони використо­вуються тоді, коли необхідно, щоб зміни в тілі про­цедури значень формальних параметрів призводи­ли до змін відповідних фактичних параметрів.

Параметри-значення відрізняються тим, що пе­ред ними слово Vаr не ставиться. У середині про­цедури можна робити будь-які дії з параметрами-значеннями, але всі зміни ніяк не відбиваються на значеннях відповідних фактичних параметрів, тоб­то якими вони були до виклику процедури, такими й залишаться після завершення її роботи.

Всі змінні програми діляться на глобальні й ло­кальні.

Глобальні змінні оголошуються у розділі описів головної програми.

Локальні змінні оголо­шуються у процедурах і функціях. Таким чином, локальні змінні «живуть» тільки під час роботи підпрограми.

Ознакою гарного стилю програмування є уникнення невиправданого використання глобальних змінних.

Приклад №1

Скласти програму для обчислення аn: цілі чис­ла а і n (п ≥0) вводяться з клавіатури.

Розв’язування

Складемо процедуру для обчислення степеня цілого числа:

Рrосеdure Step (х,у:Іnteger; Vаr st:integer);

Var i:Integer; {описова частина}

Begin {тіло процедури}

St:=1;

For i:=1 То у Dо st:=st*x

Еnd;

Перший рядок – це заголовок процеду­ри, що почина­ється зі слова Рrосеdure. Процеду­ра названа ім’ям Step. У дужках записаний спи­сок формальних параметрів, тобто перелічені змінні і вказаний їх тип. Ми використовуємо три параметри: перший – основа степеня, тобто чис­ло, яке потрібно піднести до степеня, другий – показник степеня, третій – змінна, в яку буде переданий результат.

Перші два формальні параметри – параметри-значення, третій – параметр-змінна, тому перед ним написане слово Var. Усі вони описані як цілі.

Після заголовка процедури йдуть розділи описів. У нашому прикладі описується одна змінна і (параметр циклу). Далі йде тіло процедури. Воно починається зі службового слова Begin і закінчується службовим словом Еnd, після якого стоїть крапка з комою. У тілі процедури обчислюється степінь числа х за допомогою циклу Fоr.

Вся програма для розв’язування задачі може мати такий вигляд (процедура виділена коментарями для кращого сприйняття):

Рrоgram Ехаmple;

Vаr а,n,s:Integеr;

{---------------------------------}

Рrосеdure Step(x,у:integеr; Vаr st:integer);

Vаr і:integеr;

Begin

st:=1;

Fоr і:=1 То у Dо st:=st*х;

End;

{-----------------------------------}

Begin

Write ('Введіть два числа – основу та по­казник степеня:');

Readln (а,n);

Step (а,n,s); {звернення до процедури}

Writeln ('Результат = ', s)

End.

Процедура викликається як оператор, що скла­дається з імені процедури. У круглих дужках запи­суються фактичні параметри. У нашому прикладі формальні параметри х, у і st набирають значення фактичних параметрів а, n і s відповідно. Після за­вершення роботи процедури змінні а і n збережуть ті самі значення, що мали під час виклику, а s одер­жить нове значення.

Приклад №2

Дано дві цілі змінні. Поміняти місцями їх зна­чення.

Розв’язування

Поміняти місцями значення двох змінних можна двома способами – через проміжну змінну або без неї. Напишемо процедуру, що реалізує перший спосіб.

Рrосеdure Swap (Vаr х, у:integеr);

Vаr z:integеr;

Begin

z:=x; x:=y; y:=z

End;

Процедура називається Swap. У неї є два фор­мальних параметри, що є параметрами-змінними, тому що необхідно поміняти значення змінних і запам’ятати зміни. Ці параметри є результатами ви­конання процедури. У процедурі описана змінна z, що використо­вується як проміжна. Вся програма має вигляд:





Дата публикования: 2014-11-04; Прочитано: 6078 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.022 с)...