Программирование на языках высокого уровня
в указателе 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 динамическ
| | скачать работу |
Программирование на языках высокого уровня |