WWW.REFERATCENTRAL.ORG.UA - Я ТУТ НАВЧАЮСЬ

... відкритий, безкоштовний архів рефератів, курсових, дипломних робіт

ГоловнаІнформатика, Компютерні науки → Особливості організації текстів - Реферат

Особливості організації текстів - Реферат

символ тексту. Функцію побудовано так, що за виконання її виклику читаються не тільки символи найближчого слова, а й символ, наступний за словом. Отже, після виконання виклику цей символ втрачається. Але, оскільки слова відокремлюються принаймні одним порожнім символом, можна на початку функції присвоїти пропуск змінній ch. Він замінює символ, втрачений за попереднього виклику.
Описана особливість функції getlex є скоріше її недоліком, ніж перевагою. Краще означити змінну ch як локальну в функції, але статичну, значення якої зберігалися б і після виконання виклику функції (див. підр. 8.6). В даному разі слід було б у функції getlex означити змінну ch як
const ch : char = ' '
та вилучити присвоювання ch:=' ' на початку тіла функції.
Написання програми з усіма означеннями та операторами залишаємо вправою.Р
Приклад 7. Текст із рядками необмеженої довжини містить слова в латинському алфавіті. Довжини слів не більше 255, вони відокремлюються пропусками в довільній кількості та з рядка на рядок не переносяться. Треба надрукувати слова тексту, що містять задане з клавіатури слово як підслово разом із номерами рядків, де вони розташовані.
Скористаємося алгоритмом і підпрограмами з попереднього прикладу, дещо їх змінивши. Влаштуємо в програмі "занудне" читання слова з клавіатури в змінну-рядок s1 із перевіркою, чи є воно непорожнім, і всі символи його - латинські літери. Цю перевірку повинна задавати функція isword.
Далі з тексту читаються слова в змінну-рядок s2 та за рівності їх із s1 друкуються разом із номером рядка тексту nlin. Це змінна програми з початковим значенням 1, яке збільшується за виконання вікликів функції getlex1.
repeat readln(s1); until isword(s1);
nlin:=1;
while getlex1(f, s2) do if pos(s1, s2)0 then writeln(s2, ' ', nlin);
Функція getlex1 відрізняється від getlex збільшенням глобальної у ній змінної nlin. Воно відбувається, коли читається символ, що задає кінець рядка. Ми "забудемо" про те, що цим символом у мові Турбо Паскаль є chr(13), і скористаємося функцією eoln. Зверніть увагу, що її виклик передує читанню символу, оскільки за його виконання аналізується доступний, ще не прочитаний, символ тексту:
function getlex1(var f:text; var lex:string):boolean;
const ch : char=' '; var isl : boolean;
begin
lex:=''; getlex1:=false;
while not eof(f) and not isletter(ch) do
begin
while eoln(f) and not eof(f) do
begin nlin:=nlin+1; readln(f) end;
read(f, ch);
end;
{eof(f) or isletter(ch)}
if isletter(ch) then
begin
getlex1:=true; lex:=lex+ch; isl:=true;
while not eof(f) and isl do
begin
if eoln(f) then exit;
read(f,ch);
if isletter(ch) then lex:=lex+ch
else isl:=false
end;
{eof(f) or not isl}
end;
end;
Написання повної програми також залишаємо вправою.
Приклад 8. Коментар - це послідовність символів, що починається символами '(*', закінчується символами '*)' і не містить '*)' усередині. Написати програму читання та копіювання тексту з вилученням коментарів.
У попередніх прикладах ми вже бачили, що обробка прочитаного символу залежить від його місця в тексті. Наприклад, у функції getlex порожні символи просто читалися, а символи слова дописувалися до рядка. Аналогічно й тут: символи зовні коментаря повинні копіюватися в інший текст, а символи самого коментаря - ні. Але коли прочитано дужку '(', то невідомо, чи є вона початком коментаря, чи ні. Якщо наступний за нею символ відмінний від '*', то дужку треба копіювати, а якщо це '*' - ні. Крім того, дужка всередині коментаря не копіюється. Так само, якщо читаються символи коментаря, то обробка закриваючої дужки ')' залежить від того, чи був попередній символ '*', чи ні.
Придивившися уважніше до текстів із коментарями, можна зрозуміти, що можливі чотири випадки, у кожному з яких останній прочитаний символ обробляється по-своєму.
1. Коментар ще не починався або вже закінчився. Тут символ, відмінний від '(', копіюється, а '(' може означати початок коментаря, тому її копіювати поки що зарано. Натомість треба запам' ятати, що прочитано дужку, після якої символи обробляються згідно наступного пункту.
2. Перед цим було прочитано '(', тобто коментар, можливо, починається. Нова така ж дужка означає, що попередня дужка була зовні коментаря і її треба скопіювати, а нову запам' ятати. Символ '*' означає, що ми вже потрапили в коментар, і попередню дужку копіювати не треба. За іншого символу попередня дужка разом із новим символом копіюється, і ми залишаємося зовні коментаря.
3. Якщо ми потрапили в коментар, то символ '*' може означати, але не обов' язково, "початок закінчення" коментаря (наступний випадок). Всі інші символи, в тому числі й ')', ніяк не обробляються.
4. Перед цим у коментарі була прочитана '*', тобто коментар, можливо, починає закінчуватися. Нова '*' означає новий "початок кінця" коментаря. Символ ')' означає, що коментар закінчено, а будь-який інший - що коментар продовжується.
ch
стан ( * ) інший
символ
out стан:=bgn; видати ch; видати ch; видати ch;
bgn видати (; стан:=incm; видати (;
видати ch;
стан:=out видати (;
видати ch;
стан:=out
incm стан:=bgend;
bgend стан:=incm; стан:=out; стан:=incm;
Введемо поняття "стан тексту після останнього прочитаного символу". У нашому випадку такими станами є "зовні коментаря", "початок коментаря", "всередині коментаря", та "початок кінця коментаря". Стан тексту цілком визначається тим станом, який був раніше, та останнім символом. Пункти 1-4 описують обробку символів, відповідну цим станам, а також зміни стану.
Позначимо вказані стани відповідно словами out (зовні), bgn (початок), incm (всередині коментаря), bgend (початок кінця). Значенням останнього прочитаного символу ch може бути '(', '*', ')' або інший символ. Подамо дії, описані в пунктах 1-4, у вигляді таблиці на рис.14.1. Стовпці відмічено символами, рядки - станами. У клітині на перетині рядка й стовпця вказано зміну стану та інші дії, відповідні цим стану й останньому символу. Зміна станів подається присвоюванням, відсутність якого означає, що стан не міняється.
Зміст таблиці подамо також у вигляді діаграми станів (рис.14.2). Стрілки показують зміну станів залежно від останнього прочитаного символу. Кожну стрілку відмічено дробом: угорі вказаносимвол, унизу - його обробку. Символ позначає довільний символ, відмінний від '(' , - відмінний від '(' та '*', - від '*' та ')'.
Початковим станом тексту природньо вважати out. Копіювання тексту з вилученням коментарів можна імітувати пересуванням по діаграмі та виконанням дій, указаних на стрілках. На кожному кроці імітації читається черговий символ тексту і згідно діаграми за ним та поточним станом визначаються дії та зміна стану.
За наведеними таблицею чи діаграмою неважко побудувати програму копіювання тексту з вилученням коментарів. У програмі переписано зміст таблиці за допомогою case-операторів. Нехай змінна ch зберігає останній прочитаний символ, а g є ім' ям тексту-копії. Означимо тип-перелік станів:
type
Loading...

 
 

Цікаве