Закажите услуги фрилансеров для вашего проекта прямо сейчас!

Размещение заказа на фриланс бирже бесплатно.

Основи автоматичного проектування

Завдання        Розробити програму для підрахунку кожного з резервованих слів мови програмування Turbo Pascal в початковому файлі. Початковий файл повинен містити будь-яку коректно написану програму. Результуючий файл містить зарезервовані слова та їх кількість.


ОПИС ПРОГРАМИ

Призначення  програми
За допомогою створеної програми ReservSlova.exe можна підраховувати статистику заданих слів у будь-якому текстовому файлі. Слова записуються в текстовому файлі reserv.txt, який повинен знаходитися в тій самій папці, що й виконуваний файл. Кожне  слово в файлі записане окремим рядком. Набір спеціальних слів може бути довільним. В даній роботі використовувався набір зарезервованих слів мови Pascal для підрахунку  статистики по файлам *.pas  з текстом програми  на мові Pascal.
Зарезервовані слова Turbo Pascal

ABSOLUTE
AND
ARRAY
ASM
BEGIN
CASE
CONST
CONSTRUCTOR
DESTRUCTOR
DIV
DO
DOWNTO
ELSE
END
EXTERNAL
FILE
FOR
FORWARD
FUNCTION
GOTO
IF
IMPLEMENTATION
IN
INLINE
INTERFACE
INTERRUPT
LABEL
MOD
NIL
NOT
OBJECT
OF
OR
PACKED
PROCEDUREPROGRAM
RECORD
REPEAT
SET
SHL
SHR
STRING
THEN
TO
TYPE
UNTIL
UNTIL
USES
VAR
VIRTUAL
WHILE
WITH
XOR


Загальна блок-схема алгоритму
















                                                                                Обнулення лічильників
                                                                                зарезервованих слів










                                                                                Зчитування поточного
                                                                                рядка коду програми







Структура програми
Програма розроблена у середовищі Delphi 7 і використовує вбудовані підпрограми, призначені для обробки текстових файлів. Код Delphi 7 сумісний із більш сучасною версією Delphi 2007. Файл проекту називається ReservSlova.dpr.
Програма складається з однієї форми і одного модуля UMain.pas. Текст модуля наведений в Додатку 1.

Застосовані компоненти
Для виклику діалогу відкриття та збереження файлу використовуються невізуальні стандартні компоненти  OpenDialog і SaveDialog з закладки Dialogs палітри компонентів Delphi.
Для відображення аналізованого тексту і статистики по зарезервованим словам застосовується стандартний візуальний компонент Memo з закладки Standard палітри компонентів Delphi. Оскільки код мовою Pascal найкраще сприймається, якщо при відображенні всі символи коду мають однакову ширину, то у властивості Font обох компонентів Memo задамо моноширний шрифт Lucide Console розміром 10. Виконується це в Інспекторі об’єктів (Object Inspector) середовища Delphi.
Для відображення кнопок «Відкрити файл», «Зберегти статистику», «ВИХІД» застосовується стандартний візуальний компонент Button з закладки Standard палітри компонентів Delphi.

Для зображення надписів «Текст програми», «Кількість резервованих слів» застосований стандартний візуальний компонент Label з закладки Standard палітри компонентів Delphi.
Всі видимі написи на компонентах задаються в властивості Caption в Інспекторі об’єктів (Object Inspector) середовища Delphi. Назви компонентів задаються в властивості Name.



Рисунок 1. Вид вікна головної форми в режимі розробки
Після запуску програми при натисненні кнопки Відкрити файл відкривається звичайний діалог Windows відкриття файлів, в якому користувач вибирає потрібний файл з розширенням *.pas. Після цього у вікні Текст програми відображується код програми, який можна переглянути, застосовуючи стандартні засоби прокручування. У вікні Кількість резервованих слів наводиться результат обробки вихідного файлу. Цю інформацію можна зберегти у текстовий файл на диск, натиснувши кнопку Зберегти статистику. При цьому відкривається стандартний діалог Windows запису файлів, де користувач вказує назву файлу і обирає шлях до нього. Програма завершує свою роботу, якщо натиснути кнопку ВИХІД.



Рисунок 2. Вид вікна працюючої прикладної програми


Опис коду програми
При зчитуванні файлу, код з цього файлу, зберігається по рядках в списку List (тип змінної –  TStringList).
За допомогою процедури (точніше метода)
  MemoKod.Lines.LoadFromFile(OpenDialog.FileName)
вміст файлу відбивається в полі MemoKod. Назву вибраного в діалозі відкриття файлу отримуємо за допомогою процедури OpenDialog.FileName.
При зчитуванні файлу з списком зарезервованих слів, рядки цього файлу зберігаються в списку ListRS (тип змінної – TStringList). Звідси вимога до файлу з зарезервованими словами — кожне слово повинно бути в окремому рядку.
SetLength(MasRS,LineCounter)— тут вказується розмір динамічного масиву MasRS з цілих чисел. Цей розмір дорівнює числу рядків в файлі з зарезервованими словами (змінна LineCounter, що обчислюється раніше).
Обнуляємо всі елементи створеного масиву:
for i := 0 to LineCounter - 1 do
  MasRS := 0;
В циклі
for i := 0 to List.Count - 1 do
begin
   …
end; //i
проходимо по кожному рядку аналізованого коду.
За змінну S беремо черговий рядок аналізованого коду — S := List.Strings.

В циклі
// аналіз рядка
 for j := 1 to Length(S) do
    begin
    …
 end; //j
відбувається аналіз рядка, що записаний до змінної S. Цикл побудований від першого до останнього символу рядка.
За допомогою цих рядків коду
   if S in Bukva then
     slovo := slovo + S;
в змінну slovo додається символ, за умови, що символ входить до множини Symb, в якій записані всі символи, з яких можуть складатися слова і ідентифікатори в Turbo Pascal. Ця множина описана так:
const
  Symb : set of char =
Запис 'a'..'z' означає всі маленькі літери латинського алфавіту.
Запис 'A'..'Z' означає всі великі літери латинського алфавіту.
Запис '0'..'9' означає всі цифри.
Далі, якщо зчитаний j-ий символ рядка S не входить до множини Symb або є останнім  
 if not(S in Symb) or (j = Length(S)) then
вважаємо, що слово виділено в змінній slovo. Далі потрібно порівняти отримане слово зі словами з списку зарезервованих слів ListRS. Оскільки серед них немає жодного однобуквеного слова, то для прискорення роботи програми однобуквені слова не аналізуємо. Для їх відтину використовуємо умову  на основі перевірка довжини слова:
if Length(slovo) > 1 then .
Оскільки в мові Pascal не розрізняють верхній та нижній регістри, то для коректного порівняння слів, треба перетворити їх до одного регістру. Перетворюємо до верхнього регістру за допомогою функції AnsiUpperCase. Операцію порівняння виконуємо в циклі:
 while k
          begin
            if AnsiUpperCase(ListRS.Strings) = AnsiUpperCase(slovo) then
            begin
              MasRS := MasRS + 1;
              Break
            end;
            k := k + 1;
          end;
ListRS.Count — кількість рядкі в списку ListRS.
Якщо в списку  ListRS було знайдене слово, ідентичне тому, що містить змінна slovo, то значення, що зберігається в k-ом елементі масиву MasRS (знайдене слово знаходиться в k-ому рядку списку ListRS), збільшуємо на 1. Це лічильник кількості екземплярів k-го зарезервованого слова в аналізованому коді. І після вдалого виявлення достроково виходимо з циклу, застосувавши процедуру Break, оскільки в частині списку, що залишилася, гарантовано співпадання не буде — всі зарезервовані слова унікальні. Це дозволяє скоротити час виконання програми.  
Одразу після циклу  while  виконуємо очищення змінної slovo, оскільки її вміст вже був проаналізований:  slovo := '';  
Після аналізу останнього рядка коду виводимо результат в поле MemoRes. Спочатку очищаємо поле:  MemoRes.Clear
і далі в циклі
  for i := 0 to ListRS.Count - 1 do
  begin
    …
  end;
виводимо назву i-го виявленого зарезервованого слова і кількість його траплянь в аналізованому коді. При цьому підраховуємо загальну кількість виявлених зарезервованих слів в змінній k:
if MasRS > 0 then
    begin
      k := k + MasRS;
      MemoRes.Lines.Add(ListRS + ' - ' + IntToStr(MasRS));
    end; 
Функція IntToStr служить для перетворення змінної типу Integer в змінну рядкового типу.
По завершенні циклу в MemoRes робимо відступ в один рядок:
  MemoRes.Lines.Add('')
і виводимо загальну кількість зарезервованих слів:
 MemoRes.Lines.Add('Всього резервованих слів ' + IntToStr(k));
Статистику, що відобразилася в полі MemoRes, можна зберегти в текстовий файл на диску, натиснувши кнопку «Зберегти статистку». Код обробника натискання на цю кнопку:
procedure TForm1.BtnSaveFileClick(Sender: TObject);
begin
  if SaveDialog.Execute then
    MemoRes.Lines.SaveToFile(SaveDialog.FileName);
end.
За допомогою процедури SaveDialog.Execute викликається стандартне діалогове вікно збереження файлу. Якщо користувач натиснув в цьому вікні кнопку ОК  
if SaveDialog.Execute then,
то вміст поля  MemoRes записується у вказаний файл:
MemoRes.Lines.SaveToFile(SaveDialog.FileName).
Ім’я файла отримується за допомогою процедури SaveDialog.FileName.
При натисканні на кнопку Вихід програма завершує роботу. Код обробника натискання на цю кнопку:
procedure TForm1.BtnExitClick(Sender: TObject);
begin
  Application.Terminate;
end.


Додаток 1

Текст модуля UMain.pas.

unit UMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Buttons, StdCtrls;

type
  TForm1 = class(TForm)
    MemoKod: TMemo;
    MemoRes: TMemo;
    BtnExit: TButton;
    OpenDialog: TOpenDialog;...