Реферат: Программирование на языках высокого уровня

--PAGE_BREAK--                                             Да

<img width=«53» height=«9» src=«ref-1_402417642-235.coolpic» v:shapes="_x0000_s1527"> <img width=«53» height=«9» src=«ref-1_402417877-235.coolpic» v:shapes="_x0000_s1543">


<img width=«2» height=«14» src=«ref-1_402418112-157.coolpic» v:shapes="_x0000_s1537">                          Нет

<img width=«127» height=«2» src=«ref-1_402418269-158.coolpic» v:shapes="_x0000_s1538"> <img width=«10» height=«27» src=«ref-1_402396521-267.coolpic» v:shapes="_x0000_s1546">   <img width=«240» height=«198» src=«ref-1_402418694-673.coolpic» v:shapes="_x0000_s1567 _x0000_s1568"> <img width=«10» height=«27» src=«ref-1_402396521-267.coolpic» v:shapes="_x0000_s1548"> <img width=«108» height=«55» src=«ref-1_402419634-1007.coolpic» alt=«Ромб: L<>nil» v:shapes="_x0000_s1547">


                                                        Нет

<img width=«265» height=«138» src=«ref-1_402420641-584.coolpic» v:shapes="_x0000_s1652 _x0000_s1653"> <img width=«242» height=«123» src=«ref-1_402421225-557.coolpic» v:shapes="_x0000_s1549 _x0000_s1551">


<img width=«10» height=«27» src=«ref-1_402396521-267.coolpic» v:shapes="_x0000_s1553">                                                                           Да

<img width=«128» height=«9» src=«ref-1_402422049-253.coolpic» v:shapes="_x0000_s1519"> <img width=«337» height=«55» src=«ref-1_402422302-1442.coolpic» alt=«Ромб: L^.s>Est^.s» v:shapes="_x0000_s1552">  


                                                                                                                  Да

  <img width=«28» height=«9» src=«ref-1_402401568-228.coolpic» v:shapes="_x0000_s1570"> <img width=«10» height=«27» src=«ref-1_402396521-267.coolpic» v:shapes="_x0000_s1557">


<img width=«2» height=«14» src=«ref-1_402363451-156.coolpic» v:shapes="_x0000_s1559"><img width=«115» height=«2» src=«ref-1_402361528-159.coolpic» v:shapes="_x0000_s1518"><img width=«28» height=«9» src=«ref-1_402414717-228.coolpic» v:shapes="_x0000_s1511">                                                                   Нет

  <img width=«9» height=«267» src=«ref-1_402424782-302.coolpic» v:shapes="_x0000_s1566"> <img width=«9» height=«363» src=«ref-1_402425084-313.coolpic» v:shapes="_x0000_s1651"> <img width=«2» height=«398» src=«ref-1_402425397-173.coolpic» v:shapes="_x0000_s1556"> <img width=«10» height=«27» src=«ref-1_402396521-267.coolpic» v:shapes="_x0000_s1560"> <img width=«108» height=«55» src=«ref-1_402425837-1022.coolpic» alt=«Ромб: Est=nil» v:shapes="_x0000_s1563"> <img width=«228» height=«9» src=«ref-1_402426859-271.coolpic» v:shapes="_x0000_s1558">


<img width=«78» height=«9» src=«ref-1_402427130-245.coolpic» v:shapes="_x0000_s1571">                                                                                      Да

<img width=«77» height=«9» src=«ref-1_402427375-244.coolpic» v:shapes="_x0000_s1574"> <img width=«10» height=«39» src=«ref-1_402427619-271.coolpic» v:shapes="_x0000_s1564">


<img width=«2» height=«27» src=«ref-1_402427890-155.coolpic» v:shapes="_x0000_s1572">                                                                   Нет

<img width=«178» height=«9» src=«ref-1_402428045-264.coolpic» v:shapes="_x0000_s1573"> <img width=«259» height=«79» src=«ref-1_402428309-2033.coolpic» alt=«Ромб: (L^.s<Est^.s) and (Est<>Fest)» v:shapes="_x0000_s1642">


                                                                                                          Да

<img width=«28» height=«9» src=«ref-1_402360602-228.coolpic» v:shapes="_x0000_s1644">


<img width=«53» height=«9» src=«ref-1_402417642-235.coolpic» v:shapes="_x0000_s1646"><img width=«203» height=«9» src=«ref-1_402430805-265.coolpic» v:shapes="_x0000_s1580">                                                        Нет

<img width=«10» height=«51» src=«ref-1_402431070-275.coolpic» v:shapes="_x0000_s1604"> <img width=«2» height=«14» src=«ref-1_402363451-156.coolpic» v:shapes="_x0000_s1592"> <img width=«259» height=«79» src=«ref-1_402431501-2004.coolpic» alt=«Ромб: (L^.s<Est^.s) and (Est=FEst)» v:shapes="_x0000_s1615">


                                                                                                        Да

<img width=«153» height=«78» src=«ref-1_402433505-925.coolpic» v:shapes="_x0000_s1583 _x0000_s1648">


<img width=«2» height=«62» src=«ref-1_402434430-157.coolpic» v:shapes="_x0000_s1634"><img width=«28» height=«9» src=«ref-1_402360602-228.coolpic» v:shapes="_x0000_s1617">                                                                          Нет

<img width=«2» height=«15» src=«ref-1_402434815-155.coolpic» v:shapes="_x0000_s1619"> <img width=«203» height=«9» src=«ref-1_402430805-265.coolpic» v:shapes="_x0000_s1620"> <img width=«314» height=«2» src=«ref-1_402435235-164.coolpic» v:shapes="_x0000_s1650"> <img width=«81» height=«27» src=«ref-1_402435399-327.coolpic» v:shapes="_x0000_s1655 _x0000_s1656">


                                Да

<img width=«2» height=«62» src=«ref-1_402434430-157.coolpic» v:shapes="_x0000_s1661"><img width=«9» height=«51» src=«ref-1_402435883-273.coolpic» v:shapes="_x0000_s1659">                    Нет

<img width=«294» height=«55» src=«ref-1_402436156-1854.coolpic» v:shapes="_x0000_s1654 _x0000_s1657 _x0000_s1658"> <img width=«216» height=«102» src=«ref-1_402438010-1078.coolpic» v:shapes="_x0000_s1660 _x0000_s1662 _x0000_s1663 _x0000_s1664">



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

Program Project1;

{$APPTYPE CONSOLE}

Uses SysUtils;

typespisok=^Recspisok;

Recspisok=record

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

vara,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;

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

ifch='{' thenbegin

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='\')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;

UNTILch=#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).
    продолжение
--PAGE_BREAK--
ТАБЛИЦА ПЕРЕМЕННЫХ, ИСПОЛЬЗУЕМЫХ ПРОГРАММОЙ

Имя

Тип

Назначение

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.


Идентификаторы в языке Pascal– это имена констант, переменных, меток, типов, процедур, функций и полей в записях. Идентификаторы могут состоять максимум из 63 символов. Идентификатор всегда начинается буквой, за которой могут следовать буквы и цифры, а также символ подчеркивания. Пробелы и специальные символы алфавита не могут входить в идентификатор.

Специальные символы:

+ — * / = '.:; < > [ ] ( ) { } ^ @ $ #! ~ %

К специальным символам относятся также следующие пары символов:

<> <= >= := (* *) (. .)
Вначале программы указателю Fstприсваивается значение nil. Этот указатель, содержит адрес первого элемента списка L, который будет содержать все имена идентификаторов программы, а также число вхождений идентификаторов в программе.

Далее программа печатает на экран строку "File>: ". После этого требуется ввести путь к файлу, содержащего текст программы, и его имя и нажать клавишу "Enter". Этот путь и имя файла считываются в переменную st. Далее файловая переменная fсвязывается с именем файла, содержащимся в переменной st, в результате обращения к стандартной процедуре ASSIGN. Далее программа инициирует файл для чтения с помощью стандартной процедуры RESET. При выполнении этой процедуры дисковый файл подготавливается к чтению информации. В результате специальная переменная-указатель, связанная с этим файлом, fбудет указывать на начало файла, т. е. на компонент с порядковым номером 0. После этого переменной stприсваиваем пустую строку.

Далее организуется цикл с помощью операторов REPEATи UNTIL, который выполняется до тех пор пока переменная типа charсhне станет равной символу EOF(код #26). В этом цикле программа будет считывать символы из текстового файла и записывать их в переменную ch. Если перед выполнением чтения указатель файла достигнет конца очередной строки, то результатом чтения будет символ CR(код #13), а если достигнут конец файла, то – символ EOF(код #26). В результате работы этого цикла весь текстовый файл будет считан и сформирован список идентификаторов, а также число их вхождений в тексте программы на языке Pascal.

Вначале цикла указатель L, который имеет адрес произвольного элемента списка L, принимает значение указателя Fst. Затем переменным а (признак конца слова) и b(Признак наличия текущего слова в списке L) присваивается значение false. Далее с помощью стандартной процедуры READиз файловой переменной fсчитывается символ, на который указывает указатель файла, в переменную ch. В первом цикле это будет первый символ текстового файла. При помощи стандартной процедуры UPCASEпрограмма из преобразует символы латинского алфавита от «а» до "z" в прописные буквы. Если же это прописная буква или любой другой символ, то в результате преобразования ничего не изменится.

Далее программа исключает слова, которые стоят между двумя одинарными кавычками. Чаще всего это текст, который печатается стандартной процедурой WRITE. Проверяется условие, если символ в переменной chявляется символом " ' ", то тогда начинается цикл, образованный операторами REPEATи UNTIL. В этом цикле программа считывает из файла в переменную chсимволы до тех пор пока символ в переменной chснова не будет равен символу " ' ". Далее цикл завершается, и переменная chбудет содержать символ " ' ".

Далее аналогичным способом программа исключает комментарии, встречающиеся в тексте программы, т. е. текст стоящий между двумя фигурными скобками. Проверяется условие, если символ в переменной chявляется символом " { ", то тогда начинается цикл, образованный операторами REPEATи UNTIL. В этом цикле программа считывает из файла в переменную chсимволы до тех пор пока символ в переменной chне станет равен символу " } ". Далее цикл завершается, и переменная chбудет содержать символ " } ".
Далее программа производит проверку символа в переменной chи если он равен одному из символов: " ", '!', " ' ", "#", "$", "%", "&", "*", "+", ",", "-", ".", "/", ":", ";", "<", "=", ">", "@", "[", "], "\", "^", "`", "|", "~", "(", ")", код символа #10, код символа #13, "}", то это означает что слово в тексте, если оно было перед этими символами закончилось. И переменной a(признак конца слова) присваивается значение true. Если же символ в переменной chне равен ни одному из этих символов, это означает, что это значащий символ, то переменная aостанется равной false, и программа добавит этот символ в переменную st, содержащую текущее сформированное программой слово. Слово это будет содержаться в переменной строкового типа st. И если а будет равно true, то тогда начнется проверка этого слова. Если это окажется идентификатором, то оно запишется в список L, а если оно уже есть в списке, то тогда число вхождений этого слова в программе, которое содержится в этом же списке, увеличится на 1.

Если а равно
true
, то начинается блок программы, проверяющий текущее значение слова в переменной st.

1) Если переменная stсодержит слово "BEGIN", то тогда переменным c(признак считывания раздела программы, после встречи слов: TYPE, VAR, CONST, PROCEDURE, FUNCTION) присваивается значение false, e(признак считывания раздела программы, после встречи слова LABEL) присваивается значение false.

2) Если переменная stсодержит одно из слов: "TYPE", "VAR", "CONST", "PROCEDURE", "FUNCTION", то тогда переменным c(признак считывания раздела программы, после встречи слов: TYPE, VAR, CONST, PROCEDURE, FUNCTION) присваивается значение true, e(признак считывания раздела программы, после встречи слова LABEL) присваивается значение false, и переменной stприсваивается пустая строка, т. к. она содержала одно из слов "TYPE", "VAR", "CONST", "PROCEDURE", "FUNCTION", а они не являются идентификаторами.

3) Если переменная stсодержит слово "LABEL", то тогда переменным c(признак считывания раздела программы, после встречи слов: TYPE, VAR, CONST, PROCEDURE, FUNCTION) присваивается значение false, e(признак считывания раздела программы, после встречи слова LABEL) присваивается значение true, и переменной stприсваивается пустая строка, т. к. она содержала слово "LABEL", а оно не являетя идентификатором.

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присваивается пустая строка, т. к. она содержала одно из этих слов, а оно не является идентификатором.

5) Если переменные с (признак считывания раздела программы, после встречи слов: TYPE, VAR, CONST, PROCEDURE, FUNCTION) равно true, e(признак считывания раздела программы, после встречи слова LABEL) равно false, что соответствует разделу описательной части программы, и не разделу описания меток, и первый символ в строке равен цифре, то тогда переменной stприсваивается пустая строка, т. к. она содержит слово, находящееся в описательной части программы и начинающееся с цифры, т. е. цифру. А цифры в описательной части программы, если они не являются метками, то и не являются идентификаторами.

6) Если переменные с (признак считывания раздела программы, после встречи слов: TYPE, VAR, CONST, PROCEDURE, FUNCTION) равно false, e(признак считывания раздела программы, после встречи слова LABEL) равно false, что соответствует разделу программы стоящей между словами BEGINи END, и первый символ в строке равен цифре, а текущее значение переменной chне равно символу ": ", то тогда переменной stприсваивается пустая строка, т. к. она содержит слово, находящееся в части программы, стоящей между словами BEGINEND, и начинающееся с цифры, т. е. цифру. А цифры в части программы, стоящей между словами BEGINEND, после которых не стоит символ ": " не являются метками и не являются идентификаторами.

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.

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присваивается значение пустой строки.
На этом часть проверки слова заканчивается. Она начиналась с проверки значения переменной a. И если а не равно true, то тогда в конец слова, содержащегося в переменной stдобавляется символ, содержащийся в переменной ch.
Далее проверяется условие: если символ в переменной chравен коду #26, что соответствует концу файла, то происходит выход из цикла, образованного операторами REPEATи UNTIL, если же символ не равен этому коду, то тогда программа переходит к началу этого цикла. В результате чего формируется список L, содержащий все идентификаторы программы и число их вхождений в тексте программы.
Далее формируется новый список (Est), который будет содержать эти слова в алфавитном порядке.

С помощью процедуры NEWв памяти ЭВМ резервируется место под динамическую переменную, адрес которой будет содержаться в указателе FEst(указатель, содержащий адрес первого элемента списка Est). В поле sдинамической переменной, адрес которой содержится в указателе Festприсваивается значение поля sдинамической переменной, адрес которой содержится в указателе L. В поле kдинамической переменной, адрес которой содержится в указателе Festприсваивается значение поля kдинамической переменной, адрес которой содержится в указателе L. В поле pдинамической переменной, адрес которой содержится в указателе Festприсваивается значение nil.

Далее перед строкой стоит метка lb.

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

Далее организуется цикл при помощи оператора WHILE. В то время как указатель Lимеет значение отличное от nilвыполняется следующие действия, разбитые на 4 пунктов. В результате этих операций будет сформирован список Est, который будет содержать идентификаторы в алфавитном порядке, а также число их вхождений в тексте программы.

1) Если слово, содержащееся в поле sдинамической переменной, адрес которой находится в указателе Lстарше в алфавитном порядке слова, содержащегося в поле sдинамической переменной, адрес которой находится в указателе Est(указатель, содержащий адрес произвольного элемента списка Est), то выполняется следующее. Это соответствует тому, что текущий идентификатор в списке Lстарше идентификатора в списке Est. Поэтому мы должны добавить идентификатор из списка Lв ячейку, стоящую после идентификатора в списке Est. Для этого указателю PEst(указатель, содержащий адрес произвольного элемента списка Est) присваивается значение указателя Est. Указатель Estпринимает значение содержащееся в поле р динамической переменной, на которую ссылается этот указатель. Таким образом в списке Estмы переходим к следующему элементу.

2) Если в указатель Estсодержит значение nil, то выполняется следующее. С помощью процедуры NEWв памяти ЭВМ резервируется место под динамическую переменную, адрес которой будет содержаться в указателе temp(вспомогательный указатель, для записи адреса вспомогательного элемента списка). В поле sдинамической переменной, адрес которой находится в указателе tempзаписывается значение поля sдинамической переменной, адрес которой находится в указателе L. В поле kдинамической переменной, адрес которой находится в указателе tempзаписывается значение поля kдинамической переменной, адрес которой находится в указателе L. Затем в поле р динамической переменной, адрес которой находится в указателе tempзаписывается значение nil. В поле р динамической переменной, адрес которой находится в указателе PEstзаписывается значение адреса указателя temp. Далее осуществляется переход по метке lb. Таким образом происходит добавление элемента списка Estв его конец.

3) Если слово, содержащееся в поле sдинамической переменной, адрес которой находится в указателе Lмладше в алфавитном порядке слова, содержащегося в поле sдинамической переменной, адрес которой находится в указателе Est(указатель, содержащий адрес произвольного элемента списка Est), и адрес указателя Estне равен адресу первого элемента списка Est, то есть адресу указателя FEst, то выполняется следующее. С помощью процедуры NEWв памяти ЭВМ резервируется место под динамическую переменную, адрес которой будет содержаться в указателе temp(вспомогательный указатель, для записи адреса вспомогательного элемента списка). В поле sдинамической переменной, адрес которой находится в указателе tempзаписывается значение поля sдинамической переменной, адрес которой находится в указателе L. В поле kдинамической переменной, адрес которой находится в указателе tempзаписывается значение поля kдинамической переменной, адрес которой находится в указателе L. Затем в поле р динамической переменной, адрес которой находится в указателе tempзаписывается адрес, находящийся в указателе Est. В поле р динамической переменной, адрес которой находится в указателе PEstзаписывается значение адреса указателя temp. Далее осуществляется переход по метке lb.

4) Если слово, содержащееся в поле sдинамической переменной, адрес которой находится в указателе Lмладше в алфавитном порядке слова, содержащегося в поле sдинамической переменной, адрес которой находится в указателе Est(указатель, содержащий адрес произвольного элемента списка Est), и адрес указателя Estравен адресу первого элемента списка Est, то есть адресу указателя FEst, то выполняется следующее. С помощью процедуры NEWв памяти ЭВМ резервируется место под динамическую переменную, адрес которой будет содержаться в указателе temp(вспомогательный указатель, для записи адреса вспомогательного элемента списка). В поле sдинамической переменной, адрес которой находится в указателе tempзаписывается значение поля sдинамической переменной, адрес которой находится в указателе L. В поле kдинамической переменной, адрес которой находится в указателе tempзаписывается значение поля kдинамической переменной, адрес которой находится в указателе L. Затем в поле р динамической переменной, адрес которой находится в указателе tempзаписывается адрес, находящийся в указателе FEst. В поле р динамической переменной, адрес которой находится в указателе FEstзаписывается значение адреса указателя temp. Далее осуществляется переход по метке lb.
В результате этого цикла указатель Lбудет переходить к следующим ячейкам и достигнет значения nil. Когда это произойдет в результате цикла будет сформирован отсортированный список Est. Далее необходимо по условию задачи распечатать этот список. После выполнения этого цикла программа перейдет к выполнению строки, стоящей после метки lb. Указатель Estбудет иметь адрес первого элемента отсортированного списка (FEst).

Для распечатки на экран списка Estорганизуется цикл с помощью оператора WHILE. В то время как указатель Estне равен значению nilбудет выполнятся следующее. С помощью оператора WRITEраспечатывается значение, содержащееся в поле sи kдинамической переменной, адрес которой содержится в указателе Est. И значению адреса указателя присваивается значение, содержащееся в поле р данной динамической переменной, на которую ссылается этот указатель.

Далее программа ждет нажатия на клавишу "Enter" при помощи процедуры READLN. Программа завершает работу.



    продолжение
--PAGE_BREAK--
еще рефераты
Еще работы по информатике