Смекни!
smekni.com

Программирование на языках высокого уровня (стр. 2 из 5)


Да

Да


Нет

Да

Нет

Да

Нет

Да


Нет

Да

Нет

3 ТЕКСТ ПРОГРАММЫ

Program Project1;

{$APPTYPE CONSOLE}

Uses SysUtils;

type spisok=^Recspisok;

Recspisok=record

s:String; k:word; p:spisok; end;

var a,b,c,e:boolean; ch:char; st:string;

L,Fst,FEst,PEst,Est,temp:spisok; f:text;

label lb;

BEGIN

Fst:=nil;

Write('File >: '); ReadLn(st);

Assign(f,st); Reset(f); st:='';

REPEAT

L:=Fst;

a:=false; {a-признак конца слова}

b:=false; {b-признак наличия текущего слова в списке}

Read(f,ch);ch:=UpCase(ch);

{УДАЛЕНИЕ СЛОВ, ПЕЧАТАЕМЫХ ПРОЦЕДУРОЙ WRITE}

if ch='''' then begin

Repeat Read(f,ch); Until ch=''''; end;

{УДАЛЕНИЕ КОМЕНТАРИЕВ}

if ch='{' then begin

Repeat Read(f,ch); Until ch='}'; end;

{ПРОВЕРКА СИМВОЛА НА ПРИЗНАК КОНЦА СЛОВА}

if (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='&bsol;')or(ch='^')or(ch='`')or

(ch='|')or(ch='~')or(ch='(')or(ch=')')or(ch=#10)or(ch=#13)or(ch='}')

then a:=true;

{ЕСЛИ a=true, ТО СЛОВО СФОРМИРОВАНО. ПЕРЕХОДИМ К ПРОВЕРКЕ}

if (a=true) THEN BEGIN

IF (ST='BEGIN') THEN begin c:=false; e:=false; end;

IF (ST='TYPE') OR (ST='VAR') OR (ST='CONST') OR (ST='PROCEDURE') OR (ST='FUNCTION') THEN

begin c:=true; e:=false; ST:=''; end;

IF (ST='LABEL') THEN begin c:=true; e:=true; ST:=''; end;

{УДАЛЕНИЕ ЗАРЕЗЕРВИРОВАННЫХ СЛОВ}

if (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

(st='BYTE')or(st='SHORTINT')or(st='WORD')or(st='INTEGER')or

(st='LONGINT')or(st='STRING')or(st='BOOLEAN')or(st='REAL')or

(st='DOUBLE')or(st='EXTENDED')or(st='COMP')or(st='CHAR')or(st='END')

or(st='TEXT') then st:='';

{--УДАЛЕНИЕ ЦИФР В ОПИСАНИИ ПЕРЕМЕННЫХ--}

if (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')) then st:='';

{--УДАЛЕНИЕ ЦИФР В ПРОГРАММЕ--}

if (e=false) and (c=false) 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')) and (ch<>':') then st:='';

{УВЕЛИЧЕНИЕ СЧЕТЧИКА СЛОВА НА ЕДИНИЦУ. ЕСЛИ ЭТО СЛОВО УЖЕ ЕСТЬ}

while (L<>nil) 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;

{ДОБАВЛЕНИЕ СЛОВА. ЕСЛИ ЕГО НЕТ В СПИСКЕ}

if (b=false) and (st<>'') and (c=true) then begin L:=Fst;

New(Fst); Fst^.s:=st; Fst^.k:=1; Fst^.p:=L; L:=Fst; st:=''; end else st:='';

END ELSE st:=st+ch;

UNTIL ch=#26;

{ФОРМИРОВАНИЕ ОТСОРТИРОВАННОГО СПИСКА}

New(FEst); FEst^.s:=L^.s; FEst^.k:=L^.k; FEst^.p:=nil;

lb: L:=L^.p; Est:=FEst;

While L<>nil do BEGIN

IF L^.s>Est^.s THEN begin PEst:=Est; Est:=Est^.p; end;

IF Est=nil THEN begin New(temp); temp^.s:=L^.s; temp^.k:=L^.k;

temp^.p:=nil; PEst^.p:=temp; goto lb; end;

IF (L^.s<Est^.s) and (Est<>Fest) THEN begin

New(temp); temp^.s:=L^.s; temp^.k:=L^.k; temp^.p:=Est;

PEst^.p:=temp; goto lb; end;

IF (L^.s<Est^.s) and (Est=FEst) THEN begin

New(temp); temp^.s:=L^.s; temp^.k:=L^.k; temp^.p:=FEst;

FEst:=temp; goto lb; end;

END;

while Est<>nil do begin Write(Est^.s,'=',Est^.k,'; '); Est:=Est^.p; end;

ReadLn;

END.

END.


4 ОПИСАНИЕ РАБОТЫ ПРОГРАММЫ

ТАБЛИЦА ТИПОВ, ИСПОЛЬЗУЕМЫХ ПРОГРАММОЙ

Имя типа

Тип

Назначение

spisok

Динамическая переменная со структурой Recspisok

Recspisok

record

запись, содержащая переменную типа String (s) для хранения слова, переменную типа word (k) для хранения числа входов этого слова в тексте программы и ссылку (p).

ТАБЛИЦА ПЕРЕМЕННЫХ, ИСПОЛЬЗУЕМЫХ ПРОГРАММОЙ

Имя

Тип

Назначение

a

boolean

Признак конца слова

b

boolean

Признак наличия текущего слова в списке L

c

boolean

Признак считывания раздела программы, после встречи слов: TYPE, VAR, CONST, PROCEDURE, FUNCTION

e

boolean

Признак считывания раздела программы, после встречи слова LABEL

ch

char

Символы, которые считываются из текстового файла

st

string

Переменная содержащая отдельное слово из текстового файла

L

spisok

Указатель, содержащий адрес произвольного элемента списка L, который содержит все имена идентификаторов программы, а также число вхождений этих идентификаторов в программе

Fst

spisok

Указатель, содержащий адрес первого элемента списка L

Est

spisok

Указатель, содержащий адрес произвольного элемента списка Est, который содержит все имена идентификаторов программы в алфавитном порядке, а также числе вхождений идентификаторов в программе

FEst

spisok

Указатель, содержащий адрес первого элемента списка Est

PEst

spisok

Указатель, содержащий адрес произвольного элемента списка Est

temp

spisok

Вспомогательный указатель, для записи адреса вспомогательного элемента списка

f

text

Файловая переменная, содержащая текст программы

Также в программе используется метка lb.