Сторінка
4
var c, c1 : char; i : integer; r : real; s, s1, s2 : string, пpи виконанні послідовності опеpатоpів read( f, c, i, r, s );
readln( f, s1 ); readln( f, s2 );
readln( f, c1 ), якщо текст, починаючи від доступного символу, містить послідовність символів:
eol |
1 |
2 |
. |
1 |
eol | l | e | s | s | o | n |
eol |
x |
eol |
y |
eol |
eol |
5. Читання тексту з рядками обмеженої довжини У багатьох текстах довжина рядків неоднакова, але обмежена, як правило, числом, що не перевищує 255 – максимальну довжину рядків типу string. Використання змінних цього типу дозволяє дуже просто описувати читання текстів. Алгоритми розв’ язання задач із обробки таких текстів часто мають загальний вигляд while not eof(f) do begin readln(f, s); {s має тип string} обробка рядка s; end. Приклад 5. Написати процедуру копіювання тексту за умови, що рядки тексту мають довжину не більше 80, а рядки порожні або такі, що містять лише пpопуски, не копіюються. Після читання чергового рядка початкового тексту треба визначити, чи є в ньому хоча б один символ, відмінний від пропусків. Тільки в цьому випадку він копіюється в текст g: procedure cpnonemp(var f, g : text); var s : string[80];
k : integer; emp : boolean; begin while not eof(f) do begin readln(f, s); k:=1; emp:=true; while (k<= length(s)) and emp do if s[k]<>' ' then emp:=false
else k:=k+1; if not emp then writeln(g, s) end end; Задача 9. На вхід програми подається послідовність груп рядків тексту. Групи відділяються рядком із першим символом '='. За останньою групою такого рядка може не бути. Група може бути порожньою. Рядки в групах непорожні й містять числа, відокремлені пропусками в довільній кількості. Всі рядки разом із наступними повідомленнями треба виводити в інший текст. Якщо в рядку 3 числа, то слід визначити, чи задають вони довжини сторін трикутника, і надрукувати повідомлення "трикутник" або "не трикутник". За іншої кількості чисел треба повідомити: "помилкові дані" (див. задачу 12.17). Для кожної групи слід надрукувати слова "кількість рядків: " і число її рядків, що задають трикутники, та рядок, яким група відокремлена від наступної. Для останньої групи такий рядок не друкується. Наприклад, за послідовності рядків 2 3 4 1 3 5 =123= = 1 1 2 3 4 = = = треба надрукувати в іншому тексті 2 3 4 трикутник 1 3 5 не трикутник кількість трикутників: 1 =123= кількість трикутників: 0 = 1 помилкові дані 1 2 3 4 помилкові дані кількість трикутників: 0
6. Посимвольне читання тексту Приклад 6. У тексті з рядками необмеженої довжини записано слова в латинському алфавіті, довжина яких не перевищує 255. Слова відокремлюються пропусками в довільній кількості та з рядка на рядок не переносяться. Треба визначити кількість повторень першого слова в подальшому тексті. Для розв’ язання задачі треба
прочитати перше слово (якщо воно взагалі є в тексті), а далі по одному читати слова й порівнювати їх із першим, за рівності збільшуючи значення лічильника. Слово є лексичною одиницею, або лексемою тексту, тобто такою послідовністю, що має самостійне значення, тому функцію читання слова з тексту назвемо getlex (взяти лексему). Ось її заголовок: function getlex(var f:text; var lex:string):boolean. З її виклику повертається ознака наявності слова в частині тексту, прочитаній за її виклику. Слово зберігається як значення параметра-змінної lex (лексема), а коли його в решті тексту немає, значенням стає порожній рядок. Отже, нехай s1, s2 – рядки, nrep – лічильник повторень у такому алгоритмі: nrep:=0; if getlex(f, s1) then begin while getlex(f, s2) do if s1=s2 then nrep:=nrep+1; writeln(nrep) end else writeln('у тексті немає слів'); Щоб прочитати слово, треба від поточного доступного символу прочитати пропуски та кінці рядків, що передують слову, та запам’ ятати його символи в рядковій змінній. Для визначення, чи є символ латинською літерою, скористаємося функцією isletter: function isletter(c : char) : boolean; begin
isletter := ('a'<c) and (c<'z') or ('A'<c) and (c<'Z')
end; Запишемо функцію getlex. Коли під час її виклику завершується виконання першого циклу, можуть бути істинними обидві умови, eof(f) та isletter(ch). Це можливо, якщо останній символ тексту є водночас першою літерою слова. У цьому разі символ дописується до порожнього слова. function getlex(var f : text; var lex : string) : boolean; var ch : char; isl : boolean; begin ch:=' '; lex:=''; getlex:=false; while not eof(f) and not isletter(ch) do read(f, ch); {eof(f) or isletter(ch)} if isletter(ch) then begin {створення рядка-лексеми} getlex:=true; lex:=lex+ch; isl:=true; while not eof(f) and isl do begin read(f,ch); if isletter(ch) then lex:=lex+ch else isl:=false end; {eof(f) or not isl} end; end; Тіло складеного оператора, що задає створення рядка-лексеми й виконується після того, як умова isletter(ch) стає істинною, можна записати за допомогою оператора repeat-until: