Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Розв’язуючи задачі нам доводиться виконувати не тільки математичні обчислення, а й опрацьовувати текстову інформацію: знаходити потрібне слово, виконувати електронний переклад, шифрувати або розшифровувати текст і т.д. Для роботи з текстами в Паскалі застосовується структурований тип даних 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 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!