МОСКОВСЬКИЙ Інститут радіотехніки, p>
ЕЛЕКТРОНІКИ І АВТОМАТИКИ p>
(технічний університет) p>
Курсова робота p>
Програмування на мовах В/У p>
Студент: p>
Група: p>
Москва 2003 p>
ЗМІСТ p>
1 ЗАВДАННЯ 3 p> < p> 2 БЛОК-СХЕМА ПРОГРАМИ 3 p>
3 ТЕКСТ ПРОГРАМИ 7 p>
4 ОПИС РОБОТИ ПРОГРАМИ 9 p>
5 КЕРІВНИЦТВО ОПЕРАТОРА 18 p>
1 ЗАВДАННЯ p>
Надрукувати в алфавітному порядку всі різні ідентифікатори програмина мові Pascal, вказавши для кожного число його входжень в тексті програми. p>
Програма знаходиться в текстовому файлі. Максимальна довжинаідентифікатора заздалегідь невідома. p>
2 БЛОК-СХЕМА ПРОГРАМИ p>
Ні p>
Так p>
Ні
Так p>
Ні p>
Так p>
Ні
Так p>
Ні p>
Так p>
Ні p>
Так p>
Так p>
Ні
Так p>
Ні p>
Так p>
Ні p>
Так p>
Ні p >
Так p>
Ні p>
Так p>
Ні p>
Ні Так p>
Так p>
Ні p>
Ні p>
Так p>
Так p>
Ні p>
Ні p>
Так p>
Так p>
Ні p>
Так p>
Ні p>
Так p>
Ні p>
Так p>
Ні p>
Так p>
Ні p>
3 ТЕКСТ ПРОГРАМИ p>
Program Project1; p>
($ APPTYPE CONSOLE) p>
Uses SysUtils; type spisok = ^ Recspisok; p>
Recspisok = record s: String; k: word; p: spisok; end; var a, b, c, e: boolean; ch: char; st: string; p>
L, Fst, FEst, PEst, Est, temp: spisok; f: text; label lb ; p>
BEGIN p>
Fst: = nil; p>
Write ( 'File>:'); ReadLn (st); p>
Assign (f, st); Reset (f); st :=''; p>
REPEAT p>
L: = Fst; a: = false; (a-ознака кінця слова) b : = false; (b-ознака наявності поточного слова в списку) p>
Read (f, ch); ch: = UpCase (ch); p>
(ВИДАЛЕННЯ СЛОВ, Друкуючі ПРОЦЕДУРОЮ WRITE ) if ch ='''' then begin p>
Repeat Read (f, ch); Until ch =''''; end; p>
(ВИДАЛЕННЯ КОМЕНТАРІ) if ch = ' ( 'then begin p>
Repeat Read (f, ch); Until ch ='}'; end; p>
(ПЕРЕВІРКА СИМВОЛУ НА ОЗНАКА КІНЦЯ СЛОВА) if (ch =' ') or (ch ='!') or (ch ='"') or (ch ='#') or (ch ='$') or (ch ='%')or p>
(ch ='&') or (ch ='*') or (ch ='+') or (ch =',') or (ch ='-') or (ch ='.') or p>
(ch ='/') or (ch =':') or (ch =';') or (ch ='') or p>
(ch ='@') or (ch ='[') or (ch =']') or (ch ='') or (ch ='^') or (ch ='`') or p>
(ch ='|') or (ch ='~') or (ch ='(') or (ch =')') or (ch = # 10) or (ch = # 13) or (ch ='}') then a: = true; p>
(ЯКЩО a = true, ТО СЛОВО сформована. ПЕРЕХОДИТЬ ДО ПЕРЕВІРКИ) if (a = true) THEN BEGIN p>
IF (ST = 'BEGIN') THEN begin c: = false; e: = false; end; p>
IF ( ST = 'TYPE') OR (ST = 'VAR') OR (ST = 'CONST') OR (ST = 'PROCEDURE') OR p>
(ST = 'FUNCTION') THEN begin c: = true; e: = false; ST :=''; end; p>
IF (ST = 'LABEL') THEN begin c: = true; e: = true; ST :=''; end; p>
(ВИДАЛЕННЯ зарезервованих слів) if (st = 'AND') or (st = 'XOR') or (st = 'NOT') or (st = 'OR') or (st = 'DIV ') or p>
(st =' MOD ') or (st =' SHL ') or (st =' SHR ') or (st =' NIL ') or (st =' OBJECT ') or p>
(st = 'ARRAY') or (st = 'FILE') or (st = 'OF') or (st = 'RECORD') or (st = 'SET') or p >
(st = 'BYTE') or (st = 'SHORTINT') or (st = 'WORD') or (st = 'INTEGER') or p>
(st = 'LONGINT') or (st = 'STRING') or (st = 'BOOLEAN') or (st = 'REAL') or p>
(st = 'DOUBLE') or (st = 'EXTENDED') or (st = 'COMP') or (st = 'CHAR') or (st = 'END') or (st = 'TEXT') then st :=''; p>
(- ВИДАЛЕННЯ ЦИФР В описі ЗМІННИХ -) if (e = false) and (c = true) and ((st [1] = '0 ') or (st [1] = '1') or (st [1] = '2 ') or p>
(st [1] = '3 ') or (st [1] = '4') or (st [1] = '5 ') or (st [1] = '6' ) or (st [1] = '7 ') or p>
(st [1] = '8') or (st [1] = '9 ')) then st :='';
(- ВИДАЛЕННЯ ЦИФР У ПРОГРАМІ -) if (e = false) and (c = false) and ((st [1] = '0 ') or (st [1] = '1' ) or (st [1] = '2 ') or p>
(st [1] = '3') or (st [1] = '4 ') or (st [1] = '5 ') or (st [1] = '6') or (st [1] = '7 ') or p>
(st [1] = '8') or (st [1] = ' 9 ')) and (ch': ') then st :=''; p>
(ЗБІЛЬШЕННЯ ЛІЧИЛЬНИКИ СЛОВА на одиницю. ЯКЩО ЦЕ СЛОВО ВЖЕ Є) while (Lnil) and (st'') do begin if L ^. S = st then begin L ^. K: = L ^. K +1; st :=''; b: = true ; L: = L ^. p; end else L: = L ^. p; end; p>
(доданих слів. ЯКЩО ЙОГО НІ В СПИСКУ) if (b = false) and (st'') and (c = true) then begin L: = Fst; p>
New (Fst); Fst ^. S: = st ; Fst ^. k: = 1; Fst ^. p: = L; L: = Fst; st :=''; end else st :=''; p>
END ELSE st: = st + ch; p>
UNTIL ch = # 26; p>
(ФОРМУВАННЯ Відсортувати СПИСКУ) p>
New (FEst); FEst ^. s: = L ^. s; FEst ^. k: = L ^. k; FEst ^. p: = nil; lb: L: = L ^. p; Est: = FEst; p>
While Lnil do BEGIN p> < p> IF L ^. s> Est ^. s THEN begin PEst: = Est; Est: = Est ^. p; end; p>
IF Est = nil THEN begin New (temp); temp ^. s: = L ^. s; temp ^. k: = L ^. k; temp ^. p: = nil; PEst ^. p: = temp; goto lb; end; p>
IF (L ^. s: ". Після цьогопотрібно ввести шлях до файлу, що містить текст програми, і його ім'я інатиснути клавішу "Enter". Цей шлях і ім'я файлу зчитуються в змінну st.
Далі файлова змінна f зв'язується з ім'ям файлу, що містяться взмінної st, в результаті звернення до стандартної процедури ASSIGN. Даліпрограма ініціює файл для читання за допомогою стандартної процедури RESET.
При виконанні цієї процедури дисковий файл готується до читанняінформації. У результаті спеціальна мінлива-покажчик, пов'язана з цимфайлом, f буде вказувати на початок файлу, тобто на компонент з порядковимномером 0. Після цього змінної st присвоюємо пустий рядок. P>
Далі організовується цикл за допомогою операторів REPEAT і UNTIL, якийвиконується до тих пір поки мінлива типу char СH не стане рівноюсимволу EOF (код # 26). У цьому циклі програма буде зчитувати символи зтекстового файлу і записувати їх в змінну ch. Якщо перед виконаннямчитання покажчик файлу досягне кінця черговий рядки, то результатомчитання буде символ CR (код # 13), а якщо досягнуто кінець файла, то - символ
EOF (код # 26). У результаті роботи цього циклу весь текстовий файл буделічений та сформовано список ідентифікаторів, а також число їх входжень втексті програми на мові Pascal. p>
Спочатку циклу покажчик L, який має адресу довільного елементасписку L, приймає значення покажчика Fst. Потім змінним а (ознакакінця слова) і b (Ознака наявності поточного слова в списку L) присвоюєтьсязначення false. Далі за допомогою стандартної процедури READ з файловоїзмінної f зчитується символ, на який вказує покажчик файлу, взмінну ch. У першому циклі це буде перший символ текстового файлу. Придопомогою стандартної процедури UPCASE програма з перетворює символилатинського алфавіту від "а" до "z" у великі літери. Якщо ж це прописнабуква або будь-який інший символ, то в результаті перетворення нічого незміниться. p>
Далі програма виключає слова, які стоять між двома одинарнимилапками. Найчастіше це текст, який друкується стандартною процедурою
WRITE. Перевіряється умова, якщо символ у змінній ch є символом "
' ", То тоді починається цикл, утворений операторами REPEAT і UNTIL. Уцьому циклі програма зчитує з файлу в змінну ch символи до тих пірпоки символ у змінній ch знову не буде дорівнює символу " '". Далі циклзавершується, і змінна ch буде містити символ " '". p>
Далі аналогічним способом програма виключає коментарі,зустрічаються в тексті програми, тобто текст що стоїть між двома фігурнимидужками. Перевіряється умова, якщо символ у змінній ch єсимволом "(", то тоді починається цикл, утворений операторами REPEAT і
UNTIL. У цьому циклі програма зчитує з файлу в змінну ch символи дотих пір, поки символ у змінній ch не стане дорівнює символу ")". Даліцикл завершується, і змінна ch буде містити символ ")". p>
Далі програма проводить перевірку символу в змінної ch і якщо віндорівнює одному з символів: "", '!', " '", "#", "$", "%", "&", "*", "+",< br>",", "-", ".", "/", ":", ";", "", "@", "[", "]," "," ^ ", "`",< br>"|", "~", "(", ")", Код символу # 10, код символу # 13, ")", то це означаєщо слово в тексті, якщо воно було перед цими символами закінчилося. Ізмінної a (ознака кінця слова) привласнюється значення true. Якщо жсимвол у змінній ch не дорівнює жодному з цих символів, це означає,що це значущий символ, то змінна a залишиться рівною false, іпрограма додасть цей символ в змінну st, що містить поточнесформований програмою слово. Слово це буде міститися у зміннійстрокового типу st. І якщо а буде дорівнює true, то тоді почнеться перевіркацього слова. Якщо це виявиться ідентифікатором, то воно запишеться в список
L, а якщо воно вже є в списку, то тоді число входжень цього слова впрограмі, яка міститься в цьому ж списку, збільшиться на 1. p>
Якщо а одно true, то починається блок програми, що перевіряє поточнезначення слова у змінній st. p>
1) Якщо мінлива st містить слово "BEGIN", то тоді змінним c
(ознака зчитування розділу програми, після зустрічі слів: TYPE, VAR,
CONST, PROCEDURE, FUNCTION) присвоюється значення false, e (ознаказчитування розділу програми, після зустрічі слова LABEL) присвоюєтьсязначення false. p>
2) Якщо змінна st містить одне з слів: "TYPE", "VAR", "CONST",
"PROCEDURE", "FUNCTION", то тоді змінним c (ознака зчитування розділупрограми, після зустрічі слів: TYPE, VAR, CONST, PROCEDURE, FUNCTION)присвоюється значення true, e (ознака зчитування розділу програми, післязустрічі слова LABEL) присвоюється значення false, і змінної stприсвоюється порожній рядок, тому що вона містила одне зі слів "TYPE",
"VAR", "CONST", "PROCEDURE", "FUNCTION", а вони не єідентифікаторами. p>
3) Якщо мінлива st містить слово "LABEL", то тоді змінним c
(ознака зчитування розділу програми, після зустрічі слів: TYPE, VAR,
CONST, PROCEDURE, FUNCTION) присвоюється значення false, e (ознаказчитування розділу програми, після зустрічі слова LABEL) присвоюєтьсязначення true, і змінної st присвоюється порожній рядок, тому що вонамістила слово "LABEL", а воно не є багаторазовим ідентифікатором. p>
4) Якщо змінна st містить одне з слів: "AND", "XOR", "NOT", "OR",
"DIV", "MOD", "SHL", "SHR", "NIL", "OBJECT", "ARRAY", "FILE", "OF",
"RECORD", "SET", "BYTE", "SHORTINT", "WORD", "INTEGER", "LONGINT",
"STRING", "BOOLEAN", "REAL", "DOUBLE", "EXTENDED", "COMP", "CHAR", "END",
"TEXT", то змінної st присвоюється порожній рядок, тому що вона містилаодне з цих слів, а воно не є ідентифікатором. p>
5) Якщо змінні з (ознака зчитування розділу програми, післязустрічі слів: TYPE, VAR, CONST, PROCEDURE, FUNCTION) дорівнює true, e (ознаказчитування розділу програми, після зустрічі слова LABEL) дорівнює false, щовідповідає розділу описової частини програми, і не розділу описуміток, і перший символ в рядку дорівнює цифрі, то тоді змінної stприсвоюється порожній рядок, тому що вона містить слово, що знаходиться вописовій частині програми і що починається з цифри, тобто цифру. А цифри вописової частини програми, якщо вони не є мітками, то й неє ідентифікаторами. p>
6) Якщо змінні з (ознака зчитування розділу програми, післязустрічі слів: TYPE, VAR, CONST, PROCEDURE, FUNCTION) дорівнює false, e
(ознака зчитування розділу програми, після зустрічі слова LABEL) одноfalse, що відповідає розділу програми що стоїть між словами BEGIN і
END, і перший символ в рядку дорівнює цифрі, а поточне значення змінної chне дорівнює символу ":", то тоді змінної st присвоюється порожній рядок,тому що вона містить слово, що знаходиться в частині програми, що стоїть міжсловами BEGIN END, і що починається з цифри, тобто цифру. А цифри в частиніпрограми, що стоїть між словами BEGIN END, після яких не стоїть символ "
: "Не є мітками і не є ідентифікаторами. P>
7) За допомогою оператора WHILE утворюється цикл: в той час як покажчик
L не дорівнює значенню nil, тобто список L вже містить якісь слова зтексту програми і число входжень кожного з цих слів, і мінлива st НЕдорівнює пустому рядку перевіряється умова. Якщо значення в полі sдинамічної змінної структури Recspisok, адреса якої міститься впокажчику L одно слову що міститься в змінній st, то виконуєтьсянаступні дії. Значення в полі k динамічної змінної структури
Recspisok, адреса якої міститься в покажчику L збільшується на одиницю
(k - тип word). Значення змінної st присвоюється значення порожнійрядки, змінної b (ознака наявності поточного слова в списку L)присвоюється значення true. Покажчик L приймає значення посиланнящо міститься в даному елементі списку, на який вказує покажчик L.
Інакше покажчик L приймає значення посилання що міститься в даному елементісписку, на який вказує покажчик L. І таким чином перевіряєтьсянаступний елемент списку L і т. д. весь список L, на утримання поточногослова в списку. Якщо воно вже існує в списку L, то число входженьцього слова в тексті програми збільшується на 1, якщо воно не міститься всписку, то тоді буде виконуватися наступна частина програми, утворенаоператорами IF і THEN. І це слово включається до списку L. p>
8) Перевіряється умова: якщо мінлива b (Ознака наявності поточногослова в списку L) дорівнює значенням false, що відповідає відсутності слова,що міститься в змінній st у списку L, і змінна st не дорівнює порожнійрядку, і змінна з (ознака зчитування розділу програми, після зустрічіслів: TYPE, VAR, CONST, PROCEDURE, FUNCTION) дорівнює значенням true, щовідповідає то виконується наступне. Покажчик L приймає значенняпокажчика Fst, що має адресу першого елемента списку L. Далі за допомогоюстандартної процедури NEW резервується пам'ять в ЕОМ під динамічнузмінну, адресу якої буде містити покажчик Fst. У полі sдинамічної змінної, адреса якої міститься в покажчику Fstприсвоюється значення слова, що міститься в змінної st. Кількістьвходжень цього слова в тексті програми, міститься в полі k динамічноїзмінної, на яку вказує покажчик Fst. У цьому полі записуєтьсязначення 1. І в поле посилання даної динамічної змінної, адреса якоїміститься в покажчику Fst записується значення адреси покажчика L,який мав значення адреси першого елемента списку L. А далі покажчик Lприймає значення адреси покажчика Fst. Змінній st присвоюєтьсязначення порожнього рядка. А інакше, якщо умова не виконується, то зміннійst присвоюється значення порожнього рядка. p>
На цьому частина перевірки слова закінчується. Вона починалася з перевіркизначення змінної a. І якщо а не дорівнює true, то тоді в кінець слова,що міститься в змінній st додається символ, що міститься у зміннійch. p>
Далі перевіряється умова: якщо символ у змінній ch дорівнює коду # 26,що відповідає кінця файлу, то відбувається вихід з циклу, утвореногооператорами REPEAT і UNTIL, якщо ж символ не дорівнює цьому коду, то тодіпрограма переходить до початку цього циклу. В результаті чого формуєтьсясписок L, що містить всі ідентифікатори програми і число їх входжень втексті програми. p>
Далі формується новий список (Est), який міститиме ці словав алфавітному порядку. p>
За допомогою процедури NEW в пам'яті ЕОМ резервується місце піддинамічну змінну, адресу якої буде міститися в покажчику FEst
(показник, що містить адресу першого елемента списку Est). У полі sдинамічної змінної, адреса якої міститься в покажчику Festприсвоюється значення поля s динамічної змінної, адреса якоїміститься в покажчику L. У полі k динамічної змінної, адреса якоїміститься в покажчику Fest присвоюється значення поля k динамічноїзмінної, адреса якої міститься в покажчику L. У полі p динамічноїзмінної, адреса якої міститься в покажчику Fest присвоюєтьсязначення nil. p>
Далі перед рядком стоїть позначка lb. p>
Покажчик L приймає значення, що міститься в полі р динамічноїзмінної, на яку посилається цей покажчик. Вказівником Est (покажчик,що містить адресу довільного елемента списку Est, який містить всіімена ідентифікаторів програми в алфавітному порядку, а також числівходжень ідентифікаторів в програмі) присвоюється значення покажчика
Fest. P>
Далі організовується цикл за допомогою оператора WHILE. У той час якпокажчик L має значення, відмінне від nil виконується наступні дії,розбиті на 4 пунктів. У результаті цих операцій буде сформовано список
Est, який буде містити ідентифікатори в алфавітному порядку, а такожчисло їх входжень в тексті програми. p>
1) Якщо слово, що міститься в полі s динамічної змінної, адресаякої знаходиться в покажчику L старше в алфавітному порядку слова,міститься в полі s динамічної змінної, адреса якої знаходиться впокажчику Est (показник, що містить адресу довільного елемента списку
Est), то виконується наступне. Це відповідає тому, що поточнийідентифікатор в списку L старше ідентифікатора в списку Est. Тому миповинні додати ідентифікатор зі списку L в клітинку, що стоїть післяідентифікатора в списку Est. Для цього вказівником PEst (покажчик,що містить адресу довільного елемента списку Est) присвоюється значенняпокажчика Est. Покажчик Est приймає значення міститься в поле р.динамічної змінної, на яку посилається цей покажчик. Таким чиному списку Est ми переходимо до наступного елементу. p>
2) Якщо в покажчик Est містить значення nil, то виконуєтьсянаступне. За допомогою процедури NEW в пам'яті ЕОМ резервується місце піддинамічну змінну, адресу якої буде міститися в покажчику temp
(допоміжний покажчик, для запису адреси допоміжного елементасписку). У полі s динамічної змінної, адреса якої знаходиться впокажчику temp записується значення поля s динамічної змінної, адресаякої знаходиться в покажчику L. У полі k динамічної змінної, адресаякої знаходиться в покажчику temp записується значення поля kдинамічної змінної, адреса якої знаходиться в покажчику L. Потім уполе р динамічної змінної, адреса якої знаходиться в покажчику tempзаписується значення nil. У полі р. динамічної змінної, адреса якоїзнаходиться в покажчику PEst записується значення адреси покажчика temp.
Далі здійснюється перехід по мітці lb. Таким чином відбуваєтьсядодавання елемента списку Est в його кінець. p>
3) Якщо слово, що міститься в полі s динамічної змінної, адресаякої знаходиться в покажчику L молодше в алфавітному порядку слова,міститься в полі s динамічної змінної, адреса якої знаходиться впокажчику Est (показник, що містить адресу довільного елемента списку
Est), і адреса покажчика Est не дорівнює адресою першого елемента списку Est, тоє адресою покажчика FEst, то виконується наступне. За допомогою процедури
NEW в пам'яті ЕОМ резервується місце під динамічну змінну, адресаякої буде утримувати?? я в покажчику temp (допоміжний покажчик, длязапису адреси допоміжного елемента списку). У полі s динамічноїзмінної, адреса якої знаходиться в покажчику temp записується значенняполя s динамічної змінної, адреса якої знаходиться в покажчику L. Уполе k динамічної змінної, адреса якої знаходиться в покажчику tempзаписується значення поля k динамічної змінної, адреса якоїзнаходиться в покажчику L. Потім у полі р. динамічної змінної, адресаякої знаходиться в покажчику temp записується адреса, що знаходиться впокажчику Est. У полі р. динамічної змінної, адреса якої знаходиться впокажчику PEst записується значення адреси покажчика temp. Даліздійснюється перехід по мітці lb. p>
4) Якщо слово, що міститься в полі s динамічної змінної, адресаякої знаходиться в покажчику L молодше в алфавітному порядку слова,міститься в полі s динамічної змінної, адреса якої знаходиться впокажчику Est (показник, що містить адресу довільного елемента списку
Est), і адреса покажчика Est дорівнює адресою першого елементу списку Est, тоє адресою покажчика FEst, то виконується наступне. За допомогою процедури
NEW в пам'яті ЕОМ резервується місце під динамічну змінну, адресаякій буде міститися в покажчику temp (допоміжний покажчик, длязапису адреси допоміжного елемента списку). У полі s динамічноїзмінної, адреса якої знаходиться в покажчику temp записується значенняполя s динамічної змінної, адреса якої знаходиться в покажчику L. Уполе k динамічної змінної, адреса якої знаходиться в покажчику tempзаписується значення поля k динамічної змінної, адреса якоїзнаходиться в покажчику L. Потім у полі р. динамічної змінної, адресаякої знаходиться в покажчику temp записується адреса, що знаходиться впокажчику FEst. У полі р. динамічної змінної, адреса якої знаходиться впокажчику FEst записується значення адреси покажчика temp. Даліздійснюється перехід по мітці lb. p>
У результаті цього циклу покажчик L буде переходити до наступнихосередкам і досягне значення nil. Коли це відбудеться в результаті циклубуде сформований відсортований список Est. Далі необхідно за умовоюзадачі роздрукувати цей список. Після виконання цього циклу програмаперейде до виконання рядки, що стоїть після позначки lb. Покажчик Est будемати адресу першого елемента відсортовані списку (FEst). p>
Для друку на екран списку Est організовується цикл за допомогоюоператора WHILE. У той час як покажчик Est не дорівнює значенню nil будевиконуватись наступне. За допомогою оператора WRITE роздруковується значення,міститься в полі s і k динамічної змінної, адреса якої міститьсяв покажчику Est. І значенням адреси покажчика присвоюється значення,міститься в полі р даної динамічної змінної, на яку посилаєтьсяцей покажчик. p>
Далі програма чекає натискання на клавішу "Enter" за допомогою процедури
READLN. Програма завершує роботу. P>
5 КЕРІВНИЦТВО ОПЕРАТОРА p>
Надрукувати в алфавітному порядку всі різні ідентифікатори програмина мові Pascal, вказавши для кожного число його входжень в тексті програми. p>
Програма знаходиться в текстовому файлі. Максимальна довжинаідентифікатора заздалегідь невідома. p>
Спочатку програма запитує ім'я текстового файлу, в якому знаходитьсяпрограма. Програма видає на екран рядок:
| File>: | p>
Далі потрібно ввести шлях до файлу, що містить текст програми, і йогоім'я і натиснути клавішу "Enter". p>
До прикладу візьмемо текст даної програми. Для цього необхідно ввестишлях до цього файлу і його ім'я. Наприклад, якщо файл має ім'я "kurs.pas" ізнаходиться в директорії "Programs" на логічному диску С, то для того, щобпрограма почала роботу з текстом цього файлу необхідно ввести наступнурядок: "C: Programskurs.pas". p>
Після цього програма починає зчитувати кожен символ тексту почерги, формує слова, виключає зарезервовані слова та іншісимволи, вибирає з цих слів ідентифікатори, вважає кількість входженькожного ідентифікатора в програмі і формує список. Потім програмасортує отриманий список за абеткою і виводить на екран в алфавітномупорядку всі ідентифікатори програми, вказуючи число входжень кожногоідентифікатора програми. p>
У даному прикладі список L можна представити у вигляді:
| LB | 5 | | p>
| F | 6 | | p>
| TEMP | 16 | | p>
| EST | 17 | | p> < p>. . . p>
| SPISOK | 3 | nil | p>
Далі програма складає новий список, що складається з елементів списку
L (імен ідентифікаторів програми, а також чисел їх входжень у текстіпрограми), впорядкованих за абеткою. p>
Спочатку список Est буде мати один елемент (перший елемент списку
L). Далі елементи зі списку L по черзі будуть додаватися до списку Est.
Список Est буде формуватися за алфавітом, тобто спочатку список Еstмістить один елемент:
| LB | 5 | nil | p>
Далі програма вибере зі списку L наступний елемент:
| F | 6 | | p>
Назва F молодше за алфавітом імені LB, відповідно список Est будеперетворений у наступний список:
| F | 6 | | p>
| LB | 5 | nil | p>
І так далі до тих пір, поки список L не скінчиться. Програма перевіряєстарше чи ім'я ідентифікатора елемента списку L імені ідентифікаторавід початку першого елементу списку Est. Якщо так, то програма переходить допорівнянні імені ідентифікатора елемента списку L з наступним ім'ямідентифікатор елемента списку Est. Як тільки список Est закінчується абож ім'я ідентифікатора списку L буде молодше імені ідентифікатора елементасписку Est, то програма вставляє елемент списку L після попередньогоелемента списку Est. p>
У підсумку програма роздрукує на екран зміст списку Est, що вданому прикладі буде виглядати наступним чином: p>
A = 4; B = 4; C = 7; CH = 44; E = 6; EST = 17; F = 6; FEST = 10; FST = 10; K = 14; L = 33;
LB = 5; P = 14; PEST = 4; RECSPISOK = 2; S = 19; SPISOK = 3; ST = 75; TEMP = 16; p>
Далі програма чекає натискання на клавішу "Enter". Після цього програмазавершує роботу.
-----------------------< br>ST :=''????????????????????????????????????????????? ?????????????????????????< br>?????????????????????????????????????????????????? ??????????????????????????< br>?????????????????????????????????????????????????? ??????????????????????????< br>????????????????????????????; p>
(st = 'AND') or (st = 'XOR' ) or (st = 'NOT') or (st = 'OR') or (st = 'DIV') or
(st = 'MOD') or (st = 'SHL') or (st = 'SHR ') or (st =' NIL ') or (st =' OBJECT ') or
(st =' ARRAY ') or (st =' FILE ') or (st =' OF ') or (st =' RECORD ') or (st =' SET ') or p>
(st =' BYTE ') or (st =' SHORTINT ') or (st =' WORD ') or (st =' INTEGER ') or p>
(st = 'LONGINT') or (st = 'STRING') or (st = 'BOOLEAN') or (st = 'REAL') or p>
(st = 'DOUBLE') or (st = 'EXTENDED') or (st = 'COMP') or (st = 'CHAR') or p>
(st = 'END') or (st = 'TEXT' ) p>
c: = true; e: = true; ST :=''; p>
ST = 'LABEL' p>
c: = true; e: = false; ST :='' p>
Fst: = nil; p>
Write ( 'File>:'); ReadLn (st); p>
Assign ( f, st); Reset (f); st :=''; p>
L: = L ^. p; p>
L ^. k: = L ^. k +1 ; st :=''; b: = true; L: = L ^. p; p>
L ^. s = st p>
Lnil p>
L: = L ^. p; Est: = FEst; p>
(Lnil) and (st'') p>
ST :=''; p>
New (FEst ); FEst ^. s: = L ^. s; FEst ^. k: = L ^. k; FEst ^. p: = nil; p>
st: = st + ch; p>
(e = false) and (c = false) and ((st [1] = '0 ') or (st [1] = '1') or (st [1] = '2 ') or < br> (st [1] = '3 ') or (st [1] = '4') or (st [1] = '5 ') or (st [1] = '6') or (st [1 ] = '7 ') or p>
(st [1] = '8') or (st [1] = '9 ')) and (ch':') p>
ST :=''; p>
L ^. s> Est ^. s p>
(e = false) and (c = true) and ((st [1] = '0 ') or (st [1] = '1') or (st [1] = '2 ') or
(st [1] = '3 ') or (st [1] = '4') or (st [1] = '5 ') or (st [1] = '6') or (st [1] = '7 ') or
(st [1] = '8 ') or (st [1] = '9')) p>
(b = false) and (st'') and (c = true) p>
ch = # 26 p>
st: = st + ch; p>
Початок програми p>
L: = Fst; New (Fst); Fst ^. s: = st; Fst ^. k: = 1; Fst ^. p: = L; L: = Fst; st :=''; p>
(ST = 'TYPE') OR (ST = 'VAR') OR (ST = 'CONST') OR (ST = 'PROCEDURE') OR p>
(ST = 'FUNCTION') p>
c: = false; e: = false; p>
ST = 'BEGIN' p>
a = true p>
a: = true; p>
(ch = '') or (ch ='!') or (ch ='"') or (ch ='#') or (ch ='$') or (ch ='%') or
(ch ='&') or (ch ='*') or (ch ='+') or (ch =',') or (ch ='-') or (ch ='.') or
(ch ='/') or (ch =':') or (ch =';') or (ch ='') or
(ch ='@') or (ch ='[') or (ch =']') or (ch ='') or (ch ='^') or (ch ='`') or
(ch ='|') or (ch ='~') or (ch ='(') or (ch =')') or (ch = # 10) or (ch = # 13) or
(ch ='}') p>
ch ='}' p>
Read (f, ch); p>
ch ='{' p> < p> ch ='''' p>
Read (f, ch); p>
ch ='''' p>
L: = Fst; a: = false; b: = false; p>
Read (f, ch); ch: = UpCase (ch); p>
Est = nil p>
New (temp) ; temp ^. s: = L ^. s; temp ^. k: = L ^. k; temp ^. p: = nil; PEst ^. p: = temp; p>
PEst: = Est ; Est: = Est ^. p; p>
New (temp); temp ^. s: = L ^. s; temp ^. k: = L ^. k; temp ^. p: = Est ; PEst ^. p: = temp; p>
(L ^. s p>